?? GreyFile — Mystic File Browser

Current path: home/webdevt/cryptoimpot.fr/module/Application/src/Service/



?? Go up: /home/webdevt/cryptoimpot.fr/module/Application/src

?? Viewing: LedgioService2.php

<?php

namespace Application\Service;

use Application\Mapper\ImportMapper;
use Application\Mapper\LedgioMapper;
use DateTime;
use Application\Tool\CurrencyTool;
use Laminas\Http\Header\Warning;

/**
 * Description of LedgioService
 *
 * @author jimmy
 */
class LedgioService
{
    /*
     * Tableeau regroupant les transactions d'une même crypto effectuées au même moment
     */
    public $arrayConsolidation = [];



    /*
     * Prix total d'acquisition 220
     * Détail des prix d'acquisition par crypto
     */
    public $arrayAcquisitionBefore2019 = [];


    /*
     * Cumul qte par crypto par crypto
     */
    public $arrayCumulParCryptoAcquisitionBefore2019 = [];

    /*
        * Cumul valeur total acquisition par crypto par crypto après échange
        */
    public $arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019 = [];





    const MONTANT_TRADE_SUP_WALLET = 'MONTANT_TRADE_SUP_WALLET';
    public $countLineRecorded = 0;
    public $sommePrixAcquites = 0;
    // debug montant acquisition
    public $sommePrixAcquitesEntre2019etJanvierAnneeImposition = 0;
    public $sommeFractionsInitialesCapital = 0;
    // debug montant acquisition
    public $sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition = 0;

    public $totalPrixAcquisitionBefore2019 = 0;
    // debug montant acquisition
    public $totalPrixAcquisitionPremierJanvierAnneeImposition = 0;
    public $generatedAcquisitionAvant2019 = false;
    public $useGeneratedAcquisitionAvant2019 = false;
    public $arrayValuesWalletEUR = [];
    protected $annexe_dir_base;
    protected $ledgio_dir_base;
    protected $tokenLedgio;
    protected $arrayCsvTrade;
    protected $arrayCryptosComplementaryInfos;
    protected $arrayCryptosComplementaryInfosFull;
    protected $anneeImposition;
    protected $ledgioCollection;
    protected $arrayRapportAnnexePrincipale = [];
    // debug montant acquisition
    protected $arrayRapportAnnexePrincipaleEntre2019etJanvierAnneeImposition = [];
    protected $plusValue = 0;
    // debug montant acquisition
    protected $plusValueEntre2019etJanvierAnneeImposition = 0;
    protected $investFiatConvertedInEUR = 0;
    protected $valeurNominale = 0;
    protected $acquisitionFiatDepuisDerniereCession = 0;
    protected $prixAcquisition = 0;
    public $explicationAcquisitionAvant2019 = [];
    public $explicationValeurEchangeAvant2019 = [];
    public $explanationPrixTotalAcquisition = [];
    protected $arrayDetailFusionLigneMemeDateMemeAsset = [];
    /**
     *
     * @var type
     * array of asset with quantity
     */
    protected $instantWallet = array();
    protected $instantWalletAvantCession = array();
    // debug montant acquisition
    protected $instantWalletEntre2019EtJanvierImposition = array();
    protected $CMCService;

    #,PAIR,AMOUNT,PRICE,FEE,FEE CURRENCY,DATE,ORDER ID
    protected $mapperFileInfosComplementaires = array(
        'time' => "Date",
        'type' => 'Type (optionnel)',
        'codeIn' => "Symbole acquisition",
        'qtyIn' => "Quantite acquisition",
        'codeOut' => "Symbole cession",
        'qtyOut' => "Quantite cession",
        'exchange' => "Nom echange (optionnel)",
        'tradeId' => "ID transaction (optionnel)",
        'comment' => 'Commentaire (optionnel)'
    );
    protected $mapperAsset = array(
        'XDAO' => 'DAO',
        'XETC' => 'ETC',
        'XETH' => 'ETH',
        'XLTC' => 'LTC',
        'XMLN' => 'MLN',
        'XNMC' => 'NMC',
        'XREP' => 'REP',
        'XXVN' => 'XVN',
        'XICN' => 'ICN',
        'XXBT' => 'BTC',
        'XXDG' => 'XDG',
        'XXLM' => 'XLM',
        'XXMR' => 'XMR',
        'XXTZ' => 'XTZ',
        'XXRP' => 'XRP',
        'XZEC' => 'ZEC',
        'ZCAD' => 'CAD',
        'ZEUR' => 'EUR',
        'ZGBP' => 'GBP',
        'ZJPY' => 'JPY',
        'ZKRW' => 'KRW',
        'ZUSD' => 'USD',
        'KFEE' => 'FEE');

    /**
     *
     * @var type
     * array containing fiat quantity invest
     */
    protected $investFiat = ['EUR' => 0];
    protected $investFiatAfter2019 = ['EUR' => 0];
    protected $investFiatAfter2019Detail = [];

    protected $arrayTransactionsCessionFiatAnneeImposition = [];

    protected $arrayTransactionsImposable2048m = [];
    protected $alldetailAchatParCession2048m = [];

    /*
     * Contient un tableau en cle la date de cession et en value le montant total de crypto acheté en EUR depuis la dernière cession
     */
    protected $arrayAcquisitionFiatAvantDateCession = [];
    // debug montant acquisition
    protected $arrayAcquisitionFiatAvantDateCessionEntre2019etJanvierAnneeImposition = [];

    public $arrayExplicationAcquisitionEUR = [];
    public $detailArrayAcquisitionFiatDepuisDerniereCession = [];
    public $arrayValuesWalletEURAcquisitionAvantAnneeImposition = [];


    public $arrayExplicationWalletCumulApres2019 = [];
    public $arrayExplicationWalletApres2019 = [];
    public $arrayWarningWalletQte = [];

    function __construct($user, $entityManager, $config = '')
    {

        $this->entityManager = $entityManager;
        $this->mapperCoursDevise = new \Application\Mapper\CoursDeviseMapper($this->entityManager);
        $this->ledgioMapper = new LedgioMapper($this->entityManager);


        $this->user = $user;
        $this->CMCService = new CMCService();
        $this->CoinAPIService = new CoinAPIService();

        if (!empty($config)) {
            $this->annexe_dir_base = $config['path-app'] . '/data/annexe/';
            $this->ledgio_dir_base = $config['path-app'] . '/data/io/';
            $this->tokenLedgio = $this->user->getId();
            $this->inputCsvDirectory = $this->ledgio_dir_base . $this->tokenLedgio . '/input/';
            $this->anneeImposition = $config['anneeImposition'];
            $this->inputDir = $this->ledgio_dir_base . $this->tokenLedgio . '/input/';
            $this->outputDir = $this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->anneeImposition . '/';
            // debug montant acquisition
            if (!is_dir($this->outputDir)) {
                mkdir($this->outputDir, 0777, true);
            }
            $this->initLogDate();
            $this->initLogAcquisitionAvant2019();


        }
    }

    protected function initLogDate()
    {
        $file = $this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-log-date';
        if (is_file($file)) {
            unlink($file);
        }
    }

    protected function initLogAcquisitionAvant2019()
    {
        $file = $this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-log-acquisition-avant-2019';
        if (is_file($file)) {
            unlink($file);
        }
    }


    /**
     * @return array
     */
    public function getArrayTransactionsImposable2048m()
    {
        return $this->arrayTransactionsImposable2048m;
    }

    /**
     * @return array
     */
    public function getArrayTransactionsCessionFiatAnneeImposition()
    {
        return $this->arrayTransactionsCessionFiatAnneeImposition;
    }

    /**
     * @return array
     */
    public function getAlldetailAchatParCession2048m()
    {
        return $this->alldetailAchatParCession2048m;
    }

    /**
     * @return array
     */
    public function getArrayDetailFusionLigneMemeDateMemeAsset()
    {
        return $this->arrayDetailFusionLigneMemeDateMemeAsset;
    }

    public function getArrayRapportAnnexePrincipale()
    {
        return $this->arrayRapportAnnexePrincipale;
    }

    // debug montant acquisition
    public function getArrayRapportAnnexePrincipaleEntre2019etJanvierAnneeImposition()
    {
        return $this->arrayRapportAnnexePrincipaleEntre2019etJanvierAnneeImposition;
    }

    public function getInvestFiatAfter2019Detail()
    {
        return $this->investFiatAfter2019Detail;
    }

    public function getarrayAcquisitionBefore2019()
    {
        return $this->arrayAcquisitionBefore2019;
    }

    public function getBrouillonArrayRapportAnnexePrincipale()
    {
        if (empty($this->arrayRapportAnnexePrincipale)) {
            return null;
        }
        $size = sizeof($this->arrayRapportAnnexePrincipale);

        for ($i = 0; $i < 100; $i++) {
            $returnArray[$i] = $this->arrayRapportAnnexePrincipale[0];
        }
        $num = (int)floor($size / 3);
        $num = ($num === 0) ? 1 : $num;
        return $returnArray;
    }

    public function update()
    {
        $this->instantWallet = array();
        $warningLedgio = array();
        $collectionLedgio = $this->ledgioMapper->getListByUser($this->user, array(), false);
        $this->instantWallet = array();
        $batchSize = 500;

        foreach ($collectionLedgio as $index => $ledgio) {
            if (!$this->entityManager->contains($ledgio)) {
                echo 'false';
                exit;
            }
            $i = 0;

            $warningMessage = '';
            /* @var $ledgio \Application\Entity\ledgio */

            if (!empty($ledgio->getTradedDevise()->getId()) && !array_key_exists($ledgio->getTradedDevise()->getId(), $this->instantWallet)) {
                $this->instantWallet[$ledgio->getTradedDevise()->getId()] = 0;
            }
            if (!empty($ledgio->getReceivedDevise()->getId()) && !array_key_exists($ledgio->getReceivedDevise()->getId(), $this->instantWallet)) {
                $this->instantWallet[$ledgio->getReceivedDevise()->getId()] = 0;
            }

            if (!empty($ledgio->getTradedDevise()->getId()) && !array_key_exists($ledgio->getTradedDevise()->getId(), $this->instantWalletAvantCession)) {
                $this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()] = 0;
            }
            if (!empty($ledgio->getReceivedDevise()->getId()) && !array_key_exists($ledgio->getReceivedDevise()->getId(), $this->instantWalletAvantCession)) {
                $this->instantWalletAvantCession[$ledgio->getReceivedDevise()->getId()] = 0;
            }

            if (
                (CurrencyTool::isFiat($ledgio->getTradedDevise()->getCode()) !== true) &&
//                ($this->instantWallet[$ledgio->getTradedDevise()->getId()] < $ledgio->getTradedAmount())) {
//                (bccomp($ledgio->getTradedAmount(), $this->instantWallet[$ledgio->getTradedDevise()->getId()]) === 1)) {
//                ($ledgio->getTradedAmount() - $this->instantWallet[$ledgio->getTradedDevise()->getId()] > 0)) {
                (bccomp(round($ledgio->getTradedAmount(),10), round($this->instantWallet[$ledgio->getTradedDevise()->getId()],10)) === 1 )) {



                //var_dump($ledgio->getTradedDevise()->getId());
//                var_dump($ledgio->getTradedAmount());
//                var_dump($this->instantWallet[$ledgio->getTradedDevise()->getId()]);
//                var_dump($this->instantWallet[$ledgio->getTradedDevise()->getId()] < $ledgio->getTradedAmount());
//
//                var_dump(bccomp($this->instantWallet[$ledgio->getTradedDevise()->getId()], $ledgio->getTradedAmount()));
//                exit;
//                $warningMessage = 'Le montant tradé est supérieur à ce que vous possédez dans votre portefeuille au moment de l\'opération.';
                $warningMessage = 'MONTANT_TRADE_SUP_WALLET';
                $this->instantWalletAvantCession = $this->instantWallet;
            }

//var_dump($this->instantWallet[$ledgio->getTradedDevise()->getId()]);

            $ledgio->setCumulTraded($this->instantWallet[$ledgio->getTradedDevise()->getId()]);
            $ledgio->setCumulReceived($this->instantWallet[$ledgio->getReceivedDevise()->getId()]);

            $this->instantWallet[$ledgio->getTradedDevise()->getId()] = $this->instantWallet[$ledgio->getTradedDevise()->getId()] - $ledgio->getTradedAmount();
            $this->instantWallet[$ledgio->getReceivedDevise()->getId()] = $this->instantWallet[$ledgio->getReceivedDevise()->getId()] + $ledgio->getReceivedAmount();


            // a supprimer
//            if ($this->instantWallet[$ledgio->getTradedDevise()->getId()] < 0) {
//                unset($this->instantWallet[$ledgio->getTradedDevise()->getId()]);
//            }
            // a supprimer

//            $ledgio->setInstantWallet(json_encode($this->instantWallet));
            $ledgio->setInstantWallet(json_encode($this->instantWalletAvantCession));
            $ledgio->setWarningMessage($warningMessage);

            if (!$this->entityManager->contains($ledgio->getTradedDevise())) {
                $tradedDevise = $this->entityManager->find('\Application\Entity\Devise', $ledgio->getTradedDevise()->getId());

                if ($tradedDevise) {
                    $ledgio->setTradedDevise($tradedDevise);
                }
            }

            if (!$this->entityManager->contains($ledgio->getReceivedDevise())) {
                $receivedDevise = $this->entityManager->find('\Application\Entity\Devise', $ledgio->getReceivedDevise()->getId());

                if ($receivedDevise) {
                    $ledgio->setReceivedDevise($receivedDevise);
                }
            }

            if (!$this->entityManager->contains($ledgio->getUser())) {

                $userFind = $this->entityManager->find('\User\Entity\User', $ledgio->getUser()->getId());

                if ($userFind) {
                    $ledgio->setUser($userFind);
                }
            }

            if (!$this->entityManager->contains($ledgio->getExchange())) {

                $exchangeFind = '';
                if ($ledgio->getExchange() instanceof \Application\Entity\Exchange) {
                    $exchangeFind = $this->entityManager->find('\Application\Entity\Exchange', $ledgio->getExchange()->getId());
                }

                if ($exchangeFind) {
                    $ledgio->setExchange($exchangeFind);
                }
            }

            $this->entityManager->merge($ledgio);
            $collectionLedgio[$index] = $ledgio;
            $this->countLineRecorded++;
        }


        $this->entityManager->flush();
        $this->entityManager->clear();
    }

    public function hasReceivedFiat($ledgio)
    {

        $arrayFiat = array(
            'CAD',
            'EUR',
            'GBP',
            'JPY',
            'KRW',
            'USD');
        return in_array($ledgio->getReceivedCurrency(), $arrayFiat);
    }

    public function hasTradedFiat($ledgio)
    {
        $arrayFiat = array(
            'CAD',
            'EUR',
            'GBP',
            'JPY',
            'KRW',
            'USD');
        return in_array($ledgio->getTradedCurrency(), $arrayFiat);
    }

    public function getArrayImport()
    {
        $mapperImport = new ImportMapper($this->entityManager);
        $collectionImport = $mapperImport->findByUser($this->user);


        return $collectionImport;

    }

    public function getArrayAcquisitionFiatAvantDateCession()
    {
        return $this->arrayAcquisitionFiatAvantDateCession;
    }

    // debug montant acquisition
    public function getArrayAcquisitionFiatAvantDateCessionEntre2019etJanvierAnneeImposition()
    {
        return $this->arrayAcquisitionFiatAvantDateCessionEntre2019etJanvierAnneeImposition;
    }

    public function getTotalPrixAcquisitionBefore2019()
    {
        return $this->totalPrixAcquisitionBefore2019;
    }

    public function reportByYear()
    {
        //avant 2019
        if ($this->anneeImposition < 2019) {
            $this->report2048m();
        } else {
            $this->report();
        }

    }

    public function report2048m()
    {
        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-annexe-1-plus-value')) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-annexe-1-plus-value');
        }

        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-plus-value')) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-plus-value');
        }

        $this->ledgioCollection = $this->ledgioMapper->getListByUser($this->user, array(), false);

        $this->resetConsolidationLedgio();

        foreach ($this->ledgioCollection as $ledgio) {

            set_time_limit(0);

            $assetIn = $ledgio->getReceivedCurrency();
            $deviseIn = $ledgio->getReceivedDevise();
            $qtyIn = $ledgio->getReceivedAmount();
            $assetOut = $ledgio->getTradedCurrency();
            $deviseOut = $ledgio->getTradedDevise();
            $qtyOut = $ledgio->getTradedAmount();
            $mvtType = '';
            $tradeId = $ledgio->getId();
            $fraisCessionEUR = $ledgio->getFeesEUR();
            $dateTime = $ledgio->getDatetimeTransaction();
            if ($ledgio->getExchange() instanceof \Application\Entity\Exchange) {
                $exchange = $ledgio->getExchange()->getName();
            } else {
                $exchange = 'inconnu';
            }
            if ($this->isFiat($assetIn) && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                if (!empty($ledgio->getMultiline())) {
                    $this->arrayDetailFusionLigneMemeDateMemeAsset[] = json_decode($ledgio->getMultiline());
                } else {
                    $this->arrayDetailFusionLigneMemeDateMemeAsset[] = null;
                }
            }
            $this->processLineLedgio2048m($deviseIn, abs($qtyIn), $deviseOut, abs($qtyOut), $dateTime, $mvtType, $exchange, $tradeId, $fraisCessionEUR);
        }


        if (empty($this->getArrayCryptosComplementaryInfosFull())) {

            $this->genererPlusValueReport();
        }
    }

    public function report()
    {
        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-annexe-1-plus-value')) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-annexe-1-plus-value');
        }

        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-plus-value')) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-plus-value');
        }

        $this->ledgioCollection = $this->ledgioMapper->getListByUser($this->user, array(), false);

        $this->resetConsolidationLedgio();

        $this->processLegioCalc();

        if (empty($this->getArrayCryptosComplementaryInfosFull())) {

            $this->genererPlusValueReport();
        }
    }

    protected function resetConsolidationLedgio()
    {
        if (!is_dir($this->ledgio_dir_base . $this->tokenLedgio . '/output/')) {
            mkdir($this->ledgio_dir_base . $this->tokenLedgio . '/output/', 0777, true);
        }
        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-consolidation')) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-consolidation');
        }

        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-consolidation', implode(",", array_values($this->mapperFileInfosComplementaires)) . PHP_EOL, FILE_APPEND | LOCK_EX);
    }

    public function processLegioCalc()
    {

        foreach ($this->ledgioCollection as $ledgio) {

            set_time_limit(0);

            $assetIn = $ledgio->getReceivedCurrency();
            $deviseIn = $ledgio->getReceivedDevise();
            $qtyIn = $ledgio->getReceivedAmount();
            $assetOut = $ledgio->getTradedCurrency();
            $deviseOut = $ledgio->getTradedDevise();
            $qtyOut = $ledgio->getTradedAmount();
            $mvtType = '';
            $tradeId = $ledgio->getId();
            $fraisCessionEUR = $ledgio->getFeesEUR();
            $dateTime = $ledgio->getDatetimeTransaction();
            if ($ledgio->getExchange() instanceof \Application\Entity\Exchange) {
                $exchange = $ledgio->getExchange()->getName();
            } else {
                $exchange = 'inconnu';
            }
            if ($this->isFiat($assetIn) && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                if (!empty($ledgio->getMultiline())) {
                    $this->arrayDetailFusionLigneMemeDateMemeAsset[] = json_decode($ledgio->getMultiline());
                } else {
                    $this->arrayDetailFusionLigneMemeDateMemeAsset[] = null;
                }
            }
            $this->processLineLedgio($deviseIn, abs($qtyIn), $deviseOut, abs($qtyOut), $dateTime, $mvtType, $exchange, $tradeId, $fraisCessionEUR);
        }
    }

    protected function isFiat($code)
    {
        $arrayFiat = array(
            'CAD',
            'EUR',
            'GBP',
            'JPY',
            'KRW',
            'USD');
        return in_array($code, $arrayFiat);
    }

    protected function processLineLedgio($deviseIn, $qtyIn, $deviseOut, $qtyOut, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $debug=false)
    {
        $this->logDate($dateTime->format('Y-m-d'));
        if ($debug) {
            $this->addLineConsolidationLedgio($dateTime->format('Y-m-d H:i:s'), $deviseIn, $qtyIn, $deviseOut, $qtyOut, $exchangeName, $tradeId);
        }

        // Tableau de consolidation affiché dans le rapport principal (ce tableau regroupe les trades au meême moment avec la même crypto)
        $this->arrayConsolidation[] = [
            'dateTime' => $dateTime->format('Y-m-d H:i:s'),
            'deviseReceived' => $deviseIn,
            'qtyReceived' => $qtyIn,
            'deviseTraded' => $deviseOut,
            'qtyTraded' => $qtyOut,
            'exchangeName' => $exchangeName,
            'trdedId' => $tradeId];


// ???????
        if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && empty($this->wallet[$this->anneeImposition . '-01-01'])) {
            $this->saveWalletDebutAnneeImposable();
        }

        if ($debug) {
            $this->logAcquisitionAvant2019('Test - avant ou après 01-01-2019 00:00:00 ?' . PHP_EOL);
        }

        // Cas des échanges avant 2019
        if ($dateTime < new DateTime('2019-01-01 00:00:00')) {
            if ($debug) {
                $this->logAcquisitionAvant2019('=> avant 01-01-2019 00:00:00' . PHP_EOL);
                $this->logAcquisitionAvant2019('Test - Devise In is fiat ? on l\'ajoute au wallet avant 2019' . PHP_EOL);
            }
            // si c'est pas du fiat en in on l'ajoute au wallet acquisition avant 2019
            if (!$this->isFiat($deviseIn->getCode())) {
                if ($debug) {
                    $this->logAcquisitionAvant2019('=> Devise In n\'est pas du fiat' . PHP_EOL);
                    // si on n'a pas d'index correspondant à la devise on crée un tableau vide
                    $this->logAcquisitionAvant2019('Test - Devise In dans le wallet avant 2019 ?' . PHP_EOL);
                }

                if (empty($this->arrayAcquisitionBefore2019[$deviseIn->getCode()])) {
                    $this->logAcquisitionAvant2019('=> Devise In non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()] = array();
                }
                if (empty($this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()])) {
                    $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()] = 0;
                }


                if (empty($this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()])) {
                    $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()] = 0;
                }

                // on traite la devise out
                // si c'est du fiat en out
                $this->logAcquisitionAvant2019('Test - out is fiat ?' . PHP_EOL);
                if ($this->isFiat($deviseOut->getCode())) {
                    $this->logAcquisitionAvant2019('=> out is fiat' . PHP_EOL);

                    // si EUR sinon on calcule le fiat en EUR
                    $this->logAcquisitionAvant2019('Test - Is fiat out is EUR' . PHP_EOL);

                    if ($deviseOut->getCode() !== 'EUR') {
                        $this->logAcquisitionAvant2019('=> fiat out n\'est pas EUR' . PHP_EOL);

                        $price = $this->getPrice($deviseOut, $dateTime);

                        if (empty($price)) {
                            $this->logAcquisitionAvant2019('WARNING : prix non trouvé pour ' . $deviseOut->getCode() . ' le ' . $dateTime->format('d-m-Y') . PHP_EOL);

                            $this->logAcquisitionAvant2019($_SERVER['SERVER_NAME'] . PHP_EOL);

                            if ($_SERVER['SERVER_NAME'] == 'ledgio.fr') {
                                $this->logAcquisitionAvant2019('WARNING:' . $dateTime->format('d-m-Y') . ' : ' . $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé' . PHP_EOL);
                                //mail('jimmykurc@gmail.com', $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé');
                            }
                        }
                        $prixEuro = $qtyOut * $price;
                    } else {
                        $this->logAcquisitionAvant2019('=> fiat out est EUR' . PHP_EOL);
                        $prixEuro = $qtyOut;
                    }

                    $this->logAcquisitionAvant2019('ajout de ' . $qtyIn . ' ' . $deviseIn->getCode() . ' acquis pour un total de ' . $prixEuro . 'EUR' . PHP_EOL);
                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()][] = ['qte' => $qtyIn, 'prixEuro' => $prixEuro];
                    $oldQuantite = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()];
                    $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()] = $qtyIn + $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()];

                    // cumul prix acquisition de la crypto en cours
                    $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()];
                    $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()] = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()] + $prixEuro;

                    $this->explicationAcquisitionAvant2019[$deviseIn->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                        'dateTime' => $dateTime,
                        'oldQte' => $oldQuantite,
                        'qtyOutTmp' => '',
                        'qtyIn' => $qtyIn,
                        'newQte' => $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()],
                        'monnaieFiatRecu' => $deviseOut->getCode(),
                        'qtyFiatRecu' => $qtyOut,
                        'conversionEur' => !empty($price) ? $price : 1,
                        'prixUnitaireIn' => $prixEuro / $qtyIn,
                        // explication prix
                        'oldPrixEuro' => '',
                        'ratioPrixEuro' => '',
                        'newPrixEuro' => $prixEuro,
                        'cumulAcquisitionParCryptoEUR' => $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()],
                        'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange
                    ];

                } else {
                    $this->logAcquisitionAvant2019('=> out is crypto' . PHP_EOL);
if (empty($this->explicationValeurEchangeAvant2019[$deviseIn->getCode()])) {
    $this->explicationValeurEchangeAvant2019[$deviseIn->getCode()] = [];
}

                    if (empty($this->explicationValeurEchangeAvant2019[$deviseIn->getCode()][$dateTime->format('Y-m-d H:i:s')])) {
                        $this->explicationValeurEchangeAvant2019[$deviseIn->getCode()][$dateTime->format('Y-m-d H:i:s')] = [];
                    }


                    // On prend la valeur en EUR en cas d'echange de crypto (comme si la transaction avait été faite avec des euros)
                    $price = $this->getPrice($deviseIn, $dateTime);
                    // on recupére aussi le prix de la crypto qu'on cede pour voir si le prix en EUR equivaut a celui trouvé pour celui qu'on recoit
                    $priceOut = $this->getPrice($deviseOut, $dateTime);
                    $prixEuro = $qtyIn * $price;
                    $prixEuroOutTest = $qtyOut * $priceOut;
                    $this->logAcquisitionAvant2019('ajout de ' . $qtyIn . ' ' . $deviseIn->getCode() . ' valorisés pour un total de ' . $prixEuro . 'EUR' . '(' . $qtyOut . ' ' . $deviseOut->getCode() . ')' . PHP_EOL);
                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()][] = ['qte' => $qtyIn, 'prixEuro' => $prixEuro];

                    $oldQuantite = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()];
                    $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()] = $qtyIn + $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()];

                    $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()];
                    $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()] += $prixEuro;

                    $this->explicationAcquisitionAvant2019[$deviseIn->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                        'dateTime' => $dateTime,
                        'oldQte' => $oldQuantite,
                        'qtyOutTmp' => '',
                        'qtyIn' => $qtyIn,
                        'newQte' => $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseIn->getCode()],
                        'prixUnitaireIn' => $price,
                        'unitInPriceCryptoToEur' => $price,
                        'unitOutPriceCryptoToEur' => $priceOut,
                        'inPriceCryptoToEur' => $prixEuro,
                        'outPriceCryptoToEur' => $prixEuroOutTest,

                        // explication prix
                        'oldPrixEuro' => '',
                        'ratioPrixEuro' => '',


                        'newPrixEuro' => $prixEuro,
                        'cumulAcquisitionParCryptoEUR' => $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()],
                        'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange
                    ];

                    $this->explicationValeurEchangeAvant2019[$deviseIn->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                        'dateTime' => $dateTime,
                        'qtyIn' => $qtyIn,
                        'deviseIn' => $deviseIn->getCode(),
                        'qtyOut' => $qtyOut,
                        'deviseOut' => $deviseOut->getCode(),
                        'prixUnitaireIn' => $price,
                        'newPrixEuro' => $prixEuro

                    ];



                }
                // on ajoute la qte de crypto recu
            }

            $this->logAcquisitionAvant2019('Test - Devise Out is fiat ?' . PHP_EOL);
            // on doit sortir la deviseOut du wallet par la methode FIFO


            if (!$this->isFiat($deviseOut->getCode())) {
                $this->logAcquisitionAvant2019('=> Devise Out is not fiat ?' . PHP_EOL);

                // initialisation des prix et qté à sortir
                //        $prixEurOut = 0;
                $i = 0;
                $qtyOutTmp = $qtyOut;

                // si on n'a pas d'index correspondant à la devise on crée un tableau vide
                $this->logAcquisitionAvant2019('Test - Devise Out dans le wallet avant 2019 ?' . PHP_EOL);
                if (empty($this->arrayAcquisitionBefore2019[$deviseOut->getCode()])) {
                    $this->logAcquisitionAvant2019('=> Devise Out non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    $this->arrayAcquisitionBefore2019[$deviseOut->getCode()] = array();
                }

                if (empty($this->arrayCumulParCryptoAcquisitionBefore2019[$deviseOut->getCode()])) {
                    $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseOut->getCode()] = 0;
                }

                if (empty($this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()])) {
                    $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()] = 0;
                }

                if (empty($this->explicationAcquisitionAvant2019[$deviseOut->getCode()]) || !is_array($this->explicationAcquisitionAvant2019[$deviseOut->getCode()])) {
                    $this->explicationAcquisitionAvant2019[$deviseOut->getCode()] = [];
                }
                if (empty($this->explicationAcquisitionAvant2019[$deviseOut->getCode()][$dateTime->format('Y-m-d H:i:s')]) || !is_array($this->explicationAcquisitionAvant2019[$deviseOut->getCode()][$dateTime->format('Y-m-d H:i:s')])) {
                    $this->explicationAcquisitionAvant2019[$deviseOut->getCode()][$dateTime->format('Y-m-d H:i:s')] = [];
                }



                // Méthode FIFO on parcours tous les achats de crypto et on soustrait la quantité sortie
                $this->logAcquisitionAvant2019('WHILE - FIFO on parcours les achats de crypto et on enlève la qté sortie' . PHP_EOL);
                while ($i < count($this->arrayAcquisitionBefore2019[$deviseOut->getCode()]) && $qtyOutTmp > 0) {

                    $arrayBuyCrypto = $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i];

                    // si la qté sortie est inférieur à la qté d'un achat à un instant T
                    // on la soustrait et on s'arrete
                    if ($qtyOutTmp <= $arrayBuyCrypto['qte']) {
                        // calcul du nouveau montant total d'acquisiton en EUR
                        $newPrixEuro = $arrayBuyCrypto['prixEuro'] - ($qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);
                        $newQte = $arrayBuyCrypto['qte'] - $qtyOutTmp;

$oldQuantite = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseOut->getCode()];
                        $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i] = ['qte' => $newQte, 'prixEuro' => $newPrixEuro];
                        $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseOut->getCode()] = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseOut->getCode()] - $qtyOutTmp;

                        $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()];
                        $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()] = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()] - ($qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);

                        $this->explicationAcquisitionAvant2019[$deviseOut->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                            'dateTime' => $dateTime,
                            'oldQte' => $oldQuantite,
                            'qtyOutTmp' => $qtyOutTmp,
                            'qtyIn' => '',
                            'newQte' => $newQte,
                            'prixUnitaireIn' => '',
                            // explication prix
                            'oldQtePourCalculRatio' => $arrayBuyCrypto['qte'],
                            'oldPrixEuro' => $arrayBuyCrypto['prixEuro'],
                            'ratioPrixEuro' => $qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'],
                            'newPrixEuro' => $newPrixEuro,
                            'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange,
                            'cumulAcquisitionParCryptoEUR' => $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()]
                        ];

                        $this->logAcquisitionAvant2019('Mise à jour acquisition ' . $newQte . ' ' . $deviseOut->getCode() . ' pour ' . $newPrixEuro . ' EUR' . PHP_EOL);

                        $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseOut->getCode()], true));

                        // on passe la qté restante à 0;
                        $qtyOutTmp = 0;

                    } else {
                        // cas la qté restante est supérieur à la ligne d'acquisition en cours
                        // on soustrait du tableau la qte
                        if (!empty($arrayBuyCrypto['qte'])) {
                            //$prixEurOut = $prixEurOut + $arrayBuyCrypto['prixEuro'];


                            // on remet à 0 la qté du 1er achat entré
                            $this->logAcquisitionAvant2019('Suppression de ' . $arrayBuyCrypto['qte'] . ' ' . $deviseOut->getCode() . ' de l\'acquisition ' . $i . PHP_EOL);
                            $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i]['qte'] = 0;
                            $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseOut->getCode()], true));

                            // cumul prix acquisition par crypto
                            $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()];
                            $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()] = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()] - $arrayBuyCrypto['prixEuro'];

                            $this->explicationAcquisitionAvant2019[$deviseOut->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                                'dateTime' => $dateTime,
                                'oldQte' => $arrayBuyCrypto['qte'],
                                'qtyOutTmp' => $arrayBuyCrypto['qte'],
                                'qtyIn' => '',
                                'newQte' => 0,
                                'prixUnitaireIn' => '',
                                // explication prix
                                'oldPrixEuro' => $arrayBuyCrypto['prixEuro'],
                                'ratioPrixEuro' => $arrayBuyCrypto['prixEuro'],
                                'newPrixEuro' => 0,
                                'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange,
                                'cumulAcquisitionParCryptoEUR' => $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseOut->getCode()],

                            ];


                            $qtyOutTmp = $qtyOutTmp - $arrayBuyCrypto['qte'];


                            $this->logAcquisitionAvant2019('il reste ' . $qtyOutTmp . ' ' . $deviseOut->getCode() . ' à soustraire par la méthode FIFO' . PHP_EOL);
                        }
                        $this->arrayAcquisitionBefore2019[$deviseOut->getCode()] = array_values($this->arrayAcquisitionBefore2019[$deviseOut->getCode()]);
                    }
                    $i++;

                }

                if ($qtyOutTmp > 0) {
                    $this->logAcquisitionAvant2019('Vous cherchez à vendre des crypto que vous n\'avez pas : ' . $qtyOutTmp . ' ' . $deviseOut->getCode() . PHP_EOL);
                }
            }
// fin sortir la deviseOut du wallet par la methode FIFO
        } else {
            $this->logAcquisitionAvant2019('=> après 01-01-2019 00:00:00' . PHP_EOL);
        }

        // generer prix acquisition avant 1er janvier 2019
        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && empty($this->generatedAcquisitionAvant2019)) {
            $this->generateAcquisitionAvant2019();
        }

        $doScreenShot = $this->processInLedgio($deviseIn, $qtyIn, $dateTime);

        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && empty($this->useGeneratedAcquisitionAvant2019)) {
            $this->sommePrixAcquites = $this->totalPrixAcquisitionBefore2019;
            $this->useGeneratedAcquisitionAvant2019 = true;


        }

        if ($dateTime >= new DateTime('2019-01-01 00:00:00')) {
            if (empty($this->arrayExplicationAcquisitionEUR)) {
                $this->arrayExplicationAcquisitionEUR[] = [
                    'dateTime' => new DateTime('2019-01-01 00:00:00'),
                    'augmentationPrixAcquisition' => 0,
                    'diminutionPrixAcquisition' => 0,
                    'prixAcquisitionTotal' => $this->totalPrixAcquisitionBefore2019,
                    'oldPrix' => '-',
                    'prixEuro' => '-',
                    'totalValueCrypto' => '-'

                ];
            }




//            echo 'toto'; echo $deviseOut->getCode();
            if ($this->isFiat($deviseOut->getCode())) {
//echo 'titi';
                if ($deviseOut->getCode() !== 'EUR') {

                    $price = $this->getPrice($deviseOut, $dateTime);

                    if (empty($price)) {

                        if ($_SERVER['SERVER_NAME'] == 'ledgio.fr') {
                            $this->logAcquisitionAvant2019('WARNING:' . $dateTime->format('d-m-Y') . ' : ' . $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé' . PHP_EOL);
                            //mail('jimmykurc@gmail.com', $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé');
                        }
                    }
                    $prixEuro = $qtyOut * $price;
                } else {
                    $prixEuro = $qtyOut;
                }

//                echo 'toto';
                $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseIn->getCode()];

                $lastIndex = count($this->arrayExplicationAcquisitionEUR) - 1;
                $oldPrix = $this->arrayExplicationAcquisitionEUR[$lastIndex]['prixAcquisitionTotal'];
                $this->arrayExplicationAcquisitionEUR[] = [
                    'dateTime' => $dateTime,
                    'augmentationPrixAcquisition' => $prixEuro,
                    'diminutionPrixAcquisition' => 0,
                    'prixAcquisitionTotal' => $oldPrix + $prixEuro,
                    'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange,
                    'oldPrix' => $oldPrix,
                    'prixEuro' => '-',
                    'totalValueCrypto' => '-'
                ];
            }

            if ($this->isFiat($deviseIn->getCode())) {
                if ($deviseIn->getCode() !== 'EUR') {

                    $price = $this->getPrice($deviseIn, $dateTime);

                    if (empty($price)) {

                        if ($_SERVER['SERVER_NAME'] == 'ledgio.fr') {
                            $this->logAcquisitionAvant2019('WARNING:' . $dateTime->format('d-m-Y') . ' : ' . $deviseIn->getCode() . ' : prix EUR non trouvé', $deviseIn->getCode() . ' : prix EUR non trouvé' . PHP_EOL);
                            //mail('jimmykurc@gmail.com', $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé');
                        }
                    }
                    $prixEuro = $qtyIn * $price;
                } else {
                    $prixEuro = $qtyIn;
                }



                $lastIndex = count($this->arrayExplicationAcquisitionEUR) - 1;
                $oldPrix = $this->arrayExplicationAcquisitionEUR[$lastIndex]['prixAcquisitionTotal'];


                // valeur wallet
//var_dump($this->instantWallet); exit;
                $totalValueCrypto = 0;
                if (!empty($this->instantWallet && is_array($this->instantWallet))) {
                    foreach ($this->instantWallet as $id => $arrayInfo) {
                        if (!empty($arrayInfo['qty'])) {
                            $price = $this->getPrice($arrayInfo['devise'], $dateTime);

                            if ($arrayInfo['qty'] < 0) {
                                $this->logAnnexe('!!!!! Certains achats de crypto n\'ont pas été enregistré !!!!');
                            } else {
                                $totalValueCrypto = $totalValueCrypto + $arrayInfo['qty'] * $price;

//                         $this->arrayValuesWalletEUR[$dateTime->format('Y-m-d H:i:s')][$arrayInfo['devise']->getCode()] = ['devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price];
                                $arrayCessionWalletDetail['wallet'][] = ['datetime' => $dateTime, 'devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price];
                            }
                        }
                    }
                    if (!empty($arrayCessionWalletDetail)) {
                        $this->arrayValuesWalletEURAcquisitionAvantAnneeImposition[] = $arrayCessionWalletDetail;
                    }


//                if ($dateTime >= new DateTime('2019-04-08 10:20:01')) {
//                    var_dump($this->arrayValuesWalletEUR); exit;
//                }

                }


                $diminutionPrixAcquisition = $oldPrix * $prixEuro / $totalValueCrypto;


                $this->arrayExplicationAcquisitionEUR[] = [
                    'dateTime' => $dateTime,
                    'augmentationPrixAcquisition' => 0,
                    'diminutionPrixAcquisition' => $diminutionPrixAcquisition,
                    'prixAcquisitionTotal' => $oldPrix - $diminutionPrixAcquisition,
                    'oldPrix' => $oldPrix,
                    'prixEuro' => $prixEuro,
                    'totalValueCrypto' => $totalValueCrypto
                ];

            }
        }


        // Evolution du wallet
        if (!$this->isFiat($deviseIn->getCode())) {
            if (empty($this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()])) {
                $this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()] = 0;
            }
            if (empty($this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()])) {
                $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()] = 0;
            }

            $cumulInAvantTransaction = !empty($this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()]) ? $this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()]: 0;
            $this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()] += $qtyIn;
            $this->arrayExplicationWalletApres2019[$deviseIn->getCode()][]= [
                'dateTime' => $dateTime,
                'qteIn' => $qtyIn,
                'cumulAvantTransaction' => $cumulInAvantTransaction,
                'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseIn->getCode()]
            ];
        }

        if (!$this->isFiat($deviseOut->getCode())) {
            if (empty($this->arrayExplicationWalletApres2019[$deviseOut->getCode()])) {
                $this->arrayExplicationWalletApres2019[$deviseIn->getCode()] = [];
            }
            if (empty($this->arrayExplicationWalletApres2019[$deviseOut->getCode()])) {
                $this->arrayExplicationWalletApres2019[$deviseOut->getCode()] = [];
            }

            $cumulOutAvantTransaction = !empty($this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()]) ? $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()] : 0;
            $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()] -= $qtyOut;
            $this->arrayExplicationWalletApres2019[$deviseOut->getCode()][]= [
                'dateTime' => $dateTime,
                'qteOut' => $qtyOut,
                'cumulAvantTransaction' => $cumulOutAvantTransaction,
                'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()]
            ];

            if (round($this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()],8) < -0.00000001) {
                if (empty($this->arrayWarningWalletQte[$deviseOut->getCode()])) {
                    $this->arrayWarningWalletQte[$deviseOut->getCode()] = [];
                }
                $this->arrayWarningWalletQte[$deviseOut->getCode()][]= [
                    'deltaRound' => round($this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()],8),
                    'delta' => $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()],
                    'dateTime' => $dateTime,
                    'qteOut' => $qtyOut,
                    'cumulAvantTransaction' => $cumulOutAvantTransaction,
                    'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseOut->getCode()]
                ];
            }
        }














        if ($dateTime->format('Y-m-d H:i:s') == '2019-10-25 14:56:00') {
//            echo 'toto';
//            echo $qtyIn;
//            echo $qtyOut;
//            var_dump($this->isFiat($deviseOut->getCode()));
//            exit;
        }

        if ($doScreenShot === true) {
            $this->arrayTransactionsCessionFiatAnneeImposition[] = [
                'deviseIn' => $deviseIn,
                'qtyIn' => $qtyIn,
                'deviseOut' => $deviseOut,
                'qtyOut' => $qtyOut,
                'datetime' => $dateTime,
                'type' => $mvtType,
                'exchangeName' => $exchangeName,
                'tradeId' => $tradeId,
                'fraisCession' => $fraisCessionEUR
            ];
            $this->generateReportLineAfter2019($qtyIn, $dateTime, $exchangeName, $tradeId, $fraisCessionEUR, $deviseOut);
        }
        $this->processOutLedgio($deviseOut, abs($qtyOut), $dateTime);

    }

    // Début processLineLedgio2048m
    protected function processLineLedgio2048m($deviseIn, $qtyIn, $deviseOut, $qtyOut, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $debug = false)
    {
        $this->logDate($dateTime->format('Y-m-d'));
        $this->addLineConsolidationLedgio($dateTime->format('Y-m-d H:i:s'), $deviseIn, $qtyIn, $deviseOut, $qtyOut, $exchangeName, $tradeId);

        if($debug) {
            if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && empty($this->wallet[$this->anneeImposition . '-01-01'])) {
                $this->saveWalletDebutAnneeImposable();
            }
            $this->logAcquisitionAvant2019('Test - avant ou après 01-01-2019 00:00:00 ?' . PHP_EOL);
        }

        // Traitement avant le 1er janvier 2019
        if ($dateTime < new DateTime('2019-01-01 00:00:00')) {
            if($debug) {
                $this->logAcquisitionAvant2019('=> avant 01-01-2019 00:00:00' . PHP_EOL);
                $this->logAcquisitionAvant2019('Test - Devise In is fiat ? on l\'ajoute au wallet avant 2019' . PHP_EOL);
            }
            // si c'est pas du fiat en in on l'ajoute au wallet acquisition avant 2019
            if (!$this->isFiat($deviseIn->getCode())) {
                if($debug) {
                    $this->logAcquisitionAvant2019('=> Devise In n\'est pas du fiat' . PHP_EOL);
                    // si on n'a pas d'index correspondant à la devise on crée un tableau vide
                    $this->logAcquisitionAvant2019('Test - Devise In dans le wallet avant 2019 ?' . PHP_EOL);
                }
                if (empty($this->arrayAcquisitionBefore2019[$deviseIn->getCode()])) {
                    if($debug) {
                        $this->logAcquisitionAvant2019('=> Devise In non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    }
                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()] = array();
                }

                // on traite la devise out
                // si c'est du fiat en out (achat de crypto contre du fiat)
                $this->logAcquisitionAvant2019('Test - out is fiat ?' . PHP_EOL);
                if ($this->isFiat($deviseOut->getCode())) {
                    if($debug) {
                        $this->logAcquisitionAvant2019('=> out is fiat' . PHP_EOL);

                        // si EUR sinon on calcule le fiat en EUR
                        $this->logAcquisitionAvant2019('Test - Is fiat out is EUR' . PHP_EOL);
                    }

                    // si on n'a pas de l'euro on convertit le fiat en euro
                    if ($deviseOut->getCode() !== 'EUR') {
                        if($debug) {
                            $this->logAcquisitionAvant2019('=> fiat out n\'est pas EUR' . PHP_EOL);
                        }

                        $price = $this->getPrice($deviseOut, $dateTime);

                        if (empty($price)) {
                            if($debug) {
                                $this->logAcquisitionAvant2019('WARNING : prix non trouvé pour ' . $deviseOut->getCode() . ' le ' . $dateTime->format('d-m-Y') . PHP_EOL);
                                $this->logAcquisitionAvant2019($_SERVER['SERVER_NAME'] . PHP_EOL);
                                $this->logAcquisitionAvant2019('WARNING:' . $dateTime->format('d-m-Y') . ' : ' . $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé' . PHP_EOL);
                                //mail('jimmykurc@gmail.com', $deviseOut->getCode() . ' : prix EUR non trouvé', $deviseOut->getCode() . ' : prix EUR non trouvé');
                            }
                        }
                        $prixEuro = $qtyOut * $price;
                    } else {
                        if($debug) {
                            $this->logAcquisitionAvant2019('=> fiat out est EUR' . PHP_EOL);
                        }
                        $prixEuro = $qtyOut;
                    }
                    if($debug) {
                        $this->logAcquisitionAvant2019('ajout de ' . $qtyIn . ' ' . $deviseIn->getCode() . ' acquis pour un total de ' . $prixEuro . 'EUR' . PHP_EOL);
                    }

                    $infosOld = [];
                    $infosOld[] = ['deviseReceived' => $deviseIn, 'qteReceived' => $qtyIn, 'deviseTraded' => $deviseOut, 'qteTraded' => $qtyOut, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];


                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()][] = [
                        'qteAcquisition' => $qtyIn,
                        'prixEURAcquisition' => $prixEuro,
                        'prixUnitaireEURAcquisition' => $prixEuro / $qtyIn,
                        'datetimeAcquisition' => $dateTime,
                        'qte' => $qtyIn,
                        'prixUnitaireEUR' => $prixEuro / $qtyIn,
                        'prixEuro' => $prixEuro,
                        'infosAchatInit' => $infosOld,
                        'commentaire' => '1'
                    ];
                } else {
                    // cas de l'echange contre crypto
                    if($debug) {
                        $this->logAcquisitionAvant2019('=> out is crypto' . PHP_EOL);
                    }

                    // Avant 2019 On prend la valeur en EUR en cas d'echange de crypto (comme si la transaction avait été faite avec des euros)
                    $price = $this->getPrice($deviseIn, $dateTime);
                    $prixEuro = $qtyIn * $price;
                    $this->logAcquisitionAvant2019('ajout de ' . $qtyIn . ' ' . $deviseIn->getCode() . ' valorisés pour un total de ' . $prixEuro . 'EUR' . '(' . $qtyOut . ' ' . $deviseOut->getCode() . ')' . PHP_EOL);
                    $infosOld = [];
                    $infosOld[] = ['deviseReceived' => $deviseIn, 'qteReceived' => $qtyIn, 'deviseTraded' => $deviseOut, 'qteTraded' => $qtyOut, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];

                    $this->arrayAcquisitionBefore2019[$deviseIn->getCode()][] = [
                        'qteAcquisition' => $qtyIn,
                        'prixEURAcquisition' => $prixEuro,
                        'prixUnitaireEURAcquisition' => $prixEuro / $qtyIn,
                        'datetimeAcquisition' => $dateTime,
                        'qte' => $qtyIn,
                        'prixUnitaireEUR' => $prixEuro / $qtyIn, 'prixEuro' => $prixEuro,
                        'infosAchatInit' => $infosOld,
                        'commentaire' => '2'
                    ];
                }
                // on ajoute la qte de crypto recu
            }
            if($debug) {
                $this->logAcquisitionAvant2019('Test - Devise Out is fiat ?' . PHP_EOL);

            }
            // on doit sortir la deviseOut du wallet par la methode FIFO
            if (!$this->isFiat($deviseOut->getCode())) {
                if($debug) {
                    $this->logAcquisitionAvant2019('=> Devise Out is not fiat ?' . PHP_EOL);
                }

                // initialisation des prix et qté à sortir
                //        $prixEurOut = 0;
                $i = 0;
                $qtyOutTmp = $qtyOut;

                // si on n'a pas d'index correspondant à la devise on crée un tableau vide
                if($debug) {
                    $this->logAcquisitionAvant2019('Test - Devise Out dans le wallet avant 2019 ?' . PHP_EOL);
                }
                if (empty($this->arrayAcquisitionBefore2019[$deviseOut->getCode()])) {
                    if($debug) {
                        $this->logAcquisitionAvant2019('=> Devise Out non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    }
                    $this->arrayAcquisitionBefore2019[$deviseOut->getCode()] = array();
                }

                // Méthode FIFO on parcours tous les achats de crypto et on soustrait la quantité sortie
                if($debug) {
                    $this->logAcquisitionAvant2019('WHILE - FIFO on parcours les achats de crypto et on enlève la qté sortie' . PHP_EOL);
                }
                //
                if ($deviseIn->getCode() != 'EUR') {
                    $txConversion = $this->getPrice($deviseIn, $dateTime);
                    $priceEUR = $txConversion * $qtyIn;
                } else {
                    $priceEUR = $qtyIn;
                }

                if ($priceEUR >= 5000 && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                    $arrayDetailPrixAchat = [];
                }

                $totalEURAcquisitionFIFO = 0;
                while ($i < count($this->arrayAcquisitionBefore2019[$deviseOut->getCode()]) && $qtyOutTmp > 0) {

                    $arrayBuyCrypto = $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i];


                    // si la qté sortie est inférieur à la qté d'un achat à un instant T
                    // on la soustrait et on s'arrete

                    if ($qtyOutTmp <= $arrayBuyCrypto['qte']) {
                        // calcul du nouveau montant total d'acquisiton en EUR
                        $newPrixEuro = $arrayBuyCrypto['prixEuro'] - ($qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);
                        $newQte = $arrayBuyCrypto['qte'] - $qtyOutTmp;

                        // detail des prix pour calculer le prix d'achat
                        if ($priceEUR >= 5000 && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {

                            $arrayDetailPrixAchat[] = [
                                'qteAcquisition' => !empty($arrayBuyCrypto['qteAcquisition']) ? $arrayBuyCrypto['qteAcquisition'] : null,
                                'prixEURAcquisition' => !empty($arrayBuyCrypto['prixEURAcquisition']) ? $arrayBuyCrypto['prixEURAcquisition'] : null,
                                'prixUnitaireEURAcquisition' => !empty($arrayBuyCrypto['prixUnitaireEURAcquisition']) ? $arrayBuyCrypto['prixUnitaireEURAcquisition'] : null,
                                'datetimeAcquisition' => !empty($arrayBuyCrypto['datetimeAcquisition']) ? $arrayBuyCrypto['datetimeAcquisition'] : null,
                                'qteCessionPartielle' => $qtyOutTmp,
                                'qteRestanteWallet' => $arrayBuyCrypto['qte'] - $qtyOutTmp,
                                'qteRestanteACeder' => 0,
                                'prixUnitaireEUR' => $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'],
                                'infosAchatInit' => $arrayBuyCrypto['infosAchatInit'],
                                'diffDetention' => $dateTime->diff($arrayBuyCrypto['datetimeAcquisition']),
//                                'commentaire' => '3 ' . $arrayBuyCrypto['qte']
                            ];
//                            $totalEURAcquisitionFIFO += $qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'];
                            $totalEURAcquisitionFIFO += $qtyOutTmp * $arrayBuyCrypto['prixUnitaireEURAcquisition'];
                        }
                        if($debug) {
                            $this->logAcquisitionAvant2019('Mise à jour acquisition ' . $newQte . ' ' . $deviseOut->getCode() . ' pour ' . $newPrixEuro . ' EUR' . PHP_EOL);
                        }
                        if (empty($infosOld = $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i]['infosAchatInit'])) {
                            $infosOld = [];
                        } else {
                            $infosOld = $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i]['infosAchatInit'];

                        }
                        $infosOld[] = ['deviseReceived' => $deviseIn, 'qteReceived' => $qtyIn, 'deviseTraded' => $deviseOut, 'qteTraded' => $qtyOut, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];
                        $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i] = [
                            'qteAcquisition' => !empty($arrayBuyCrypto['qteAcquisition']) ? $arrayBuyCrypto['qteAcquisition'] : null,
                            'prixEURAcquisition' => !empty($arrayBuyCrypto['prixEURAcquisition']) ? $arrayBuyCrypto['prixEURAcquisition'] : null,
                            'prixUnitaireEURAcquisition' => !empty($arrayBuyCrypto['prixUnitaireEURAcquisition']) ? $arrayBuyCrypto['prixUnitaireEURAcquisition'] : null,
                            'datetimeAcquisition' => !empty($arrayBuyCrypto['datetimeAcquisition']) ? $arrayBuyCrypto['datetimeAcquisition'] : null,
                            'qte' => $newQte,
                            'prixEuro' => $newPrixEuro,
                            'infosAchatInit' => $infosOld,
                            'commentaire' => '4'
                        ];
                        if($debug) {
                            $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseOut->getCode()], true));
                        }
                        // on passe la qté restante à 0;
                        $qtyOutTmp = 0;

                    } else {
                        // cas la qté restante est supérieur à la ligne d'acquisition en cours
                        // on soustrait du tableau la qte
                        if (!empty($arrayBuyCrypto['qte'])) {
                            //$prixEurOut = $prixEurOut + $arrayBuyCrypto['prixEuro'];

                            // detail des prix pour calculer le prix d'achat
                            if ($priceEUR >= 5000 && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {

                                $arrayDetailPrixAchat[] = [
                                    'qteAcquisition' => !empty($arrayBuyCrypto['qteAcquisition']) ? $arrayBuyCrypto['qteAcquisition'] : null,
                                    'prixEURAcquisition' => !empty($arrayBuyCrypto['prixEURAcquisition']) ? $arrayBuyCrypto['prixEURAcquisition'] : null,
                                    'prixUnitaireEURAcquisition' => !empty($arrayBuyCrypto['prixUnitaireEURAcquisition']) ? $arrayBuyCrypto['prixUnitaireEURAcquisition'] : null,
                                    'datetimeAcquisition' => !empty($arrayBuyCrypto['datetimeAcquisition']) ? $arrayBuyCrypto['datetimeAcquisition'] : null,
                                    'qteCessionPartielle' => $arrayBuyCrypto['qte'],
                                    'qteRestanteWallet' => 0,
                                    'qteRestanteACeder' => $qtyOutTmp - $arrayBuyCrypto['qte'],
                                    'prixUnitaireEUR' => $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'],
                                    'infosAchatInit' => $arrayBuyCrypto['infosAchatInit'],
                                    'diffDetention' => $dateTime->diff($arrayBuyCrypto['datetimeAcquisition'])
//                                    'commentaire' => '5 ' . $arrayBuyCrypto['qte']
                                ];


//                                $totalEURAcquisitionFIFO += $qtyOutTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'];
                                $totalEURAcquisitionFIFO += $arrayBuyCrypto['qte'] * $arrayBuyCrypto['prixUnitaireEURAcquisition'];
                            }
                            // on remet à 0 la qté du 1er achat entré
                            if($debug) {
                                $this->logAcquisitionAvant2019('Suppression de ' . $arrayBuyCrypto['qte'] . ' ' . $deviseOut->getCode() . ' de l\'acquisition ' . $i . PHP_EOL);
                            }
                            $this->arrayAcquisitionBefore2019[$deviseOut->getCode()][$i]['qte'] = 0;
                            if($debug) {
                                $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseOut->getCode()], true));
                            }
                            $qtyOutTmp = $qtyOutTmp - $arrayBuyCrypto['qte'];
                            if($debug) {
                                $this->logAcquisitionAvant2019('il reste ' . $qtyOutTmp . ' ' . $deviseOut->getCode() . ' à soustraire par la méthode FIFO' . PHP_EOL);
                            }
                        }
                        $this->arrayAcquisitionBefore2019[$deviseOut->getCode()] = array_values($this->arrayAcquisitionBefore2019[$deviseOut->getCode()]);
                    }
                    $i++;

                }
                if ($priceEUR >= 5000 && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                    $this->alldetailAchatParCession2048m[] = ['infosAchat' => $arrayDetailPrixAchat, 'dateCession' => $dateTime];
                }

                if($debug) {
                    if ($qtyOutTmp > 0) {
                        $this->logAcquisitionAvant2019('Vous cherchez à vendre des crypto que vous n\'avez pas : ' . $qtyOutTmp . ' ' . $deviseOut->getCode() . PHP_EOL);
                    }
                }
            }
// fin sortir la deviseOut du wallet par la methode FIFO
        } else {
            if($debug) {
                $this->logAcquisitionAvant2019('=> après 01-01-2019 00:00:00' . PHP_EOL);
            }
        }


        if (!$this->isFiat($deviseOut->getCode())) {
            // on prend les transactions de plus de 5000 EUR
            //$price in EUR
            if ($deviseIn->getCode() != 'EUR') {
                $txConversion = $this->getPrice($deviseIn, $dateTime);
                $priceEUR = $txConversion * $qtyIn;
            } else {
                $priceEUR = $qtyIn;
            }


            $txConversionOut = $this->getPrice($deviseOut, $dateTime);
            $priceEUROut = $txConversionOut * $qtyOut;


            if (($priceEUROut >= 5000 || $priceEUR >= 5000) && $dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                // calcul la moyenne des années de détention
                $nbAnneeCumul = 0;
                $qteCessionPartielleCumule = 0;
                if (!empty($arrayDetailPrixAchat)) {
                    foreach ($arrayDetailPrixAchat as $ligneDetail) {
                        $nbAnneeCumul += $ligneDetail['diffDetention']->y * $ligneDetail['qteCessionPartielle'];
                        $qteCessionPartielleCumule += $ligneDetail['qteCessionPartielle'];
                    }
                }
                $moyenneAnneeAquisition = 0;
                if (!empty($qteCessionPartielleCumule)) {
                    $moyenneAnneeAquisition = $nbAnneeCumul / $qteCessionPartielleCumule;
                }

                $this->arrayTransactionsImposable2048m[] = [
                    'deviseIn' => $deviseIn,
                    'qtyIn' => $qtyIn,
                    'deviseOut' => $deviseOut,
                    'qtyOut' => $qtyOut,
                    'datetime' => $dateTime,
                    'type' => $mvtType,
                    'exchangeName' => $exchangeName,
                    'tradeId' => $tradeId,
                    'fraisCession' => $fraisCessionEUR,
                    'priceEUR' => $priceEUR,
                    'priceEUROut' => $priceEUROut,
                    'totalEURAcquisitionFIFO' => $totalEURAcquisitionFIFO,
                    'moyenneAnneeAquisition' => $moyenneAnneeAquisition
                ];
            }

        }

        $doScreenShot = $this->processInLedgio($deviseIn, $qtyIn, $dateTime);
        $this->processOutLedgio($deviseOut, abs($qtyOut), $dateTime);

        // si out n'est pas du fiat
    }
    // Fin processLineLedgio2048m

    protected function logDate($str)
    {
        if (!is_dir($this->ledgio_dir_base))
            if (!mkdir($concurrentDirectory = $this->ledgio_dir_base, 0777, true) && !is_dir($concurrentDirectory)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
            }
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-log-date', $str . PHP_EOL, FILE_APPEND | LOCK_EX);
    }

    protected function addLineConsolidationLedgio($date, $deviseIn, $qtyIn, $deviseOut, $qtyOut, $exchangeName, $tradeId)
    {
        if (!is_dir($this->annexe_dir_base))
            if (!mkdir($concurrentDirectory = $this->annexe_dir_base, 0777, true) && !is_dir($concurrentDirectory)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
            }
        $str = '"' . $date . '","' . $deviseIn->getCode() . '","' . $qtyIn . '","' . $deviseOut->getCode() . '","' . $qtyOut . '","' . $exchangeName . '","' . $tradeId . '"' . PHP_EOL;
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-consolidation', $str, FILE_APPEND | LOCK_EX);
    }

    public function saveWalletDebutAnneeImposable()
    {
        if (is_file($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-wallet-debut-annee-' . $this->anneeImposition)) {
            unlink($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-wallet-debut-annee-' . $this->anneeImposition);
        }
        $this->wallet[$this->anneeImposition . '-01-01'] = $this->instantWallet;
        $this->logWalletDebutAnneeImposable('Wallet au 1er janvier ' . $this->anneeImposition . ' : ' . PHP_EOL);
        foreach ($this->instantWallet as $id => $arrayWallet) {
            $this->logWalletDebutAnneeImposable($arrayWallet['devise']->getCode() . ' : ' . $arrayWallet['qty'] . PHP_EOL);
        }
    }

    protected function logWalletDebutAnneeImposable($str, $debug=false)
    {
        if (!$debug) {
            return false;
        }
        if (!is_dir($this->ledgio_dir_base))
            if (!mkdir($concurrentDirectory = $this->ledgio_dir_base, 0777, true) && !is_dir($concurrentDirectory)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
            }
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-wallet-debut-annee-' . $this->anneeImposition, $str, FILE_APPEND | LOCK_EX);
    }

    protected function logAcquisitionAvant2019($str, $debug=false)
    {
        if (!$debug) {
            return false;
        }
        if (!is_dir($this->ledgio_dir_base)) {
            if (!mkdir($concurrentDirectory = $this->ledgio_dir_base, 0777, true) && !is_dir($concurrentDirectory)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
            }
        }
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-log-acquisition-avant-2019', $str, FILE_APPEND | LOCK_EX);
    }

    public function getPrice($devise, DateTime $datetime)
    {

        $datetimeJour = clone $datetime;
        //@todo call data market
        //$value = 0;
        // on récupère le prix approximatif de la journée
        //@todo récupérer le prix à l'heure précise
        $coursDevise = $this->mapperCoursDevise->findByDeviseAndDate($devise, $datetimeJour->setTime(0, 0, 0));
        //echo 'cours';
        if (!empty($coursDevise)) {
            return $coursDevise->coursEuro;
        }

        // Si pas en base getPrice via API cryptomarketcap
        if (!empty($devise->getIdCMC())) {
            return $this->CMCService->getPriceByIdCMC($devise->getIdCMC(), $datetimeJour);
        }

        if (!empty($devise->getCode())) {

            $price = $this->CoinAPIService->getPriceByCode($devise->getCode(), $datetimeJour);
            return $price;
        }

        return false;
    }

    protected function generateAcquisitionAvant2019()
    {
        //Etape 1 : détermination de la composition du portefeuille global au 1er janvier 2019
        foreach ($this->arrayAcquisitionBefore2019 as $code => $arrayAcquisitionDevise) {
            $qtyTmp = 0;
            $valueTotaleEurTmp = 0;

            if (count($this->arrayAcquisitionBefore2019[$code]) == 0) {
                unset($this->arrayAcquisitionBefore2019[$code]);
            }
            foreach ($arrayAcquisitionDevise as $key => $acquisitionDevise) {

                if ($acquisitionDevise['qte'] > 0) {
                    $qtyTmp = $qtyTmp + $acquisitionDevise['qte'];
                    $valueTotaleEurTmp = $valueTotaleEurTmp + $acquisitionDevise['prixEuro'];

                } else {
                    unset($this->arrayAcquisitionBefore2019[$code][$key]);
                    if (count($this->arrayAcquisitionBefore2019[$code]) == 0) {
                        unset($this->arrayAcquisitionBefore2019[$code]);
                    }
                }
            }
            $this->totalPrixAcquisitionBefore2019 += $valueTotaleEurTmp;
        }
        $this->generatedAcquisitionAvant2019 = true;
    }

    protected function processInLedgio($deviseIn, $qtyIn, $dateTime)
    {
        $dogenerateReportLineAfter2019 = false;
        if (!$this->isFiat($deviseIn->getCode())) {
//            var_dump($qtyIn);
            $this->updateWallet($deviseIn, $qtyIn, 'in', $dateTime);
        } else {
            $dogenerateReportLineAfter2019 = true;
        }


        return $dogenerateReportLineAfter2019 === true;
    }

    protected function updateWallet($devise, $qty, $mvtType, $dateTime)
    {
        if (!array_key_exists($devise->getId(), $this->instantWallet))
            $this->instantWallet[$devise->getId()] = ['devise' => $devise, 'qty' => 0];
        if ($mvtType === 'in') {
            $this->instantWallet[$devise->getId()]['qty'] = $this->instantWallet[$devise->getId()]['qty'] + $qty;
        } else {
            if ($this->instantWallet[$devise->getId()]['qty'] < $qty) {
                $this->arrayCryptosComplementaryInfosFull[$devise->getId()][] = array('date' => $dateTime->format('Y-m-d'), 'qty' => abs($qty));
            }
            $this->instantWallet[$devise->getId()]['qty'] = $this->instantWallet[$devise->getId()]['qty'] - $qty;
        }
    }

    protected function processOutLedgio($deviseOut, $qtyOut, $dateTime)
    {
        if (!$this->isFiat($deviseOut->getCode())) {
//            var_dump($qtyOut);
            $this->updateWallet($deviseOut, $qtyOut, 'out', $dateTime);
        } else {
            $this->updateInvestFiat($deviseOut, $qtyOut);
            if ($dateTime >= new DateTime('2019-01-01 00:00:00')) {

                $this->updateInvestFiatAfter2019($deviseOut, $qtyOut, $dateTime);
            }
        }
    }

    /*
     * prix de cession net c1 - (prix d'acquisition du portefeuille c1 * prix de cession brut c1 / valeur du portefeuille juste avant c1)
     * 06/09/2019 : Plus ou moins value brute = Prix de cession - (Prix total d'acquisition x Prix de cession / Valeur globale du portefeuille)
     * Prix de cession = Prix cession net
     *      
     */

    protected function updateInvestFiat($devise, $qtyInvest)
    {
        if (!array_key_exists($devise->getCode(), $this->investFiat)) {
            $this->investFiat[$devise->getCode()] = 0;
        }
        $this->investFiat[$devise->getCode()] = $this->investFiat[$devise->getCode()] + $qtyInvest;
        //$this->logAnnexe('nouveau montant de fiat investi dans crypto suite à achat de crypto : ' . $this->investFiat['EUR'] . ' €' . PHP_EOL);
    }

    protected function updateInvestFiatAfter2019($devise, $qtyInvest, $dateTime)
    {
        if (!array_key_exists($devise->getCode(), $this->investFiatAfter2019)) {
            $this->investFiatAfter2019[$devise->getCode()] = 0;
        }
        $this->investFiatAfter2019[$devise->getCode()] = $this->investFiatAfter2019[$devise->getCode()] + $qtyInvest;

        if ($devise->getCode() != 'EUR') {
            $taux = $this->getExchangeRates($devise->getCode(), $dateTime);
            $valueEUR = $qtyInvest / $taux;
        } else {
            $valueEUR = $qtyInvest;
        }
        if ($valueEUR > 0) {
            $this->investFiatAfter2019Detail[] = ['datetime' => $dateTime, 'code' => $devise->getCode(), 'qte' => $qtyInvest, 'qteEUR' => $valueEUR];
        }
        //$this->logAnnexe('nouveau montant de fiat investi dans crypto suite à achat de crypto : ' . $this->investFiat['EUR'] . ' €' . PHP_EOL);
    }

    public function getExchangeRates($currency, DateTime $dateTime)
    {
        $urlApi = 'https://api.exchangeratesapi.io/';
        // asset fsym

        $urlApi .= $dateTime->format('Y-m-d');
        $urlApi .= '?base=EUR';
        $urlApi .= '&symbols=' . $currency;

        // fetch data
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $urlApi);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $rawData = curl_exec($curl);
        curl_close($curl);

        $data = json_decode($rawData, true);
        if (!isset($data['rates'][$currency])) {
            throw new \Exception('Taux de change non trouvé.');
            $price = 0;
        } else {
            return $data['rates'][$currency];
        }
    }

    protected function generateReportLineAfter2019($prixCessionBrut, $dateTime, $exchangeName, $tradeId, $fraisCession = 0, $deviseOut)
    {
        // calcul plus value
        $totalValueCrypto = 0;
        // debug montant acquisition
        $totalValueCryptoEntre2019EtJanvierImposition = 0;
        $valeurWallet = 0;
        // debug montant acquisition
        $valeurWalletEntre2019etJanvierAnneeImposition = 0;
        $arrayCessionWalletDetail = [];
        // debug montant acquisition
        $arrayCessionWalletDetailEntre2019EtJanvierImposition = [];
        $arrayCessionWalletDetail['datetime'] = $dateTime;
        // debug montant acquisition
        $arrayCessionWalletDetailEntre2019EtJanvierImposition['datetime'] = $dateTime;
//        if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
//var_dump($this->instantWallet); exit;
            if (!empty($this->instantWallet && is_array($this->instantWallet))) {
                foreach ($this->instantWallet as $id => $arrayInfo) {
                    if (!empty($arrayInfo['qty'])) {
                        $price = $this->getPrice($arrayInfo['devise'], $dateTime);

                        if ($arrayInfo['qty'] < 0) {
                            $this->logAnnexe('!!!!! Certains achats de crypto n\'ont pas été enregistré !!!!');
                        } else {

                            // on prend la valeur de l'api (valeur moyenne) @todo prendre le prix à l'heure près
                            // si c'est la crypto vendu on prend la valeur de cession net
                            if ($arrayInfo['devise']->getCode() == $deviseOut->getCode()) {
                                $totalValueCrypto = $totalValueCrypto + ($prixCessionBrut-$fraisCession);
                            } else {
                                $totalValueCrypto = $totalValueCrypto + $arrayInfo['qty'] * $price;
                            }


//                         $this->arrayValuesWalletEUR[$dateTime->format('Y-m-d H:i:s')][$arrayInfo['devise']->getCode()] = ['devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price];
                            $arrayCessionWalletDetail['wallet'][] = ['datetime' => $dateTime, 'devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price, 'totalReel' => ($deviseOut->getCode() == $arrayInfo['devise']->getCode() ? $prixCessionBrut-$fraisCession : '')];
                        }
                    }
                }
                if (!empty($arrayCessionWalletDetail)) {
                    $this->arrayValuesWalletEUR[] = $arrayCessionWalletDetail;
                }


//                if ($dateTime >= new DateTime('2019-04-08 10:20:01')) {
//                    var_dump($this->arrayValuesWalletEUR); exit;
//                }

            }

            $valeurWallet = $totalValueCrypto;

        }

        // debug montant acquisition debut
//        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime < new DateTime($this->anneeImposition . '-01-01 00:00:00')) {
//
//            if (!empty($this->instantWalletEntre2019EtJanvierImposition && is_array($this->instantWalletEntre2019EtJanvierImposition))) {
//                foreach ($this->instantWalletEntre2019EtJanvierImposition as $id => $arrayInfoEntre2019EtJanvierImposition) {
//                    if (!empty($arrayInfoEntre2019EtJanvierImposition['qty'])) {
//                        $priceEntre2019EtJanvierImposition = $this->getPrice($arrayInfoEntre2019EtJanvierImposition['devise'], $dateTime);
//
//                        if ($arrayInfoEntre2019EtJanvierImposition['qty'] < 0) {
//                            $this->logAnnexe('!!!!! Certains achats de crypto n\'ont pas été enregistré !!!!');
//                        } else {
//                            $totalValueCryptoEntre2019EtJanvierImposition = $totalValueCryptoEntre2019EtJanvierImposition + $arrayInfoEntre2019EtJanvierImposition['qty'] * $priceEntre2019EtJanvierImposition;
//
////                         $this->arrayValuesWalletEUR[$dateTime->format('Y-m-d H:i:s')][$arrayInfo['devise']->getCode()] = ['devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price];
//                            $arrayCessionWalletDetailEntre2019EtJanvierImposition['wallet'][] = ['datetime' => $dateTime, 'devise' => $arrayInfoEntre2019EtJanvierImposition['devise']->getCode(), 'qty' => $arrayInfoEntre2019EtJanvierImposition['qty'], 'unitPrice' => $priceEntre2019EtJanvierImposition, 'total' => $arrayInfoEntre2019EtJanvierImposition['qty'] * $priceEntre2019EtJanvierImposition];
//                        }
//                    }
//                }
//                if (!empty($arrayCessionWalletDetail)) {
//                    $this->arrayValuesWalletEUREntre2019EtJanvierImposition[] = $arrayCessionWalletDetailEntre2019EtJanvierImposition;
//                }
//
//            }
//
//
//            $valeurWalletEntre2019etJanvierAnneeImposition = $totalValueCryptoEntre2019EtJanvierImposition;
//
//        }

        // debug montant acquisition fin

        $acquisitionFiatDepuisDerniereCession = 0;
        // debug montant acquisition
        $acquisitionFiatDepuisDerniereCessionEntre2019etJanvierAnneeImposition = 0;
        /* Calcul investissement en EUR */
        if (!empty($this->investFiatAfter2019)) {
            $detailArrayAcquisitionFiatDepuisDerniereCession = [];
            foreach ($this->investFiatAfter2019 as $code => $qte) {
                if ($code != 'EUR') {
                    $taux = $this->getExchangeRates($code, $dateTime);
                    $acquisitionFiatDepuisDerniereCession += $qte / $taux;
                    $detailArrayAcquisitionFiatDepuisDerniereCession[] = [
                        'dateTime' => $dateTime,
                        'code' => $code,
                        'qte' => $qte,
                        'fiat' => $qte / $taux,
                        'cumulFiat' => $acquisitionFiatDepuisDerniereCession
                    ];
                    // debug montant acquisition
                    $acquisitionFiatDepuisDerniereCessionEntre2019etJanvierAnneeImposition += $qte / $taux;
                } else {
                    $acquisitionFiatDepuisDerniereCession += $qte;
                    $detailArrayAcquisitionFiatDepuisDerniereCession[] = [
                        'dateTime' => $dateTime,
                        'code' => $code,
                        'qte' => $qte,
                        'fiat' => $qte,
                        'cumulFiat' => $acquisitionFiatDepuisDerniereCession
                    ];
                    // debug montant acquisition
                    $acquisitionFiatDepuisDerniereCessionEntre2019etJanvierAnneeImposition += $qte;
                }

                $this->investFiat[$code] = 0;
                // debug montant acquisition
                $this->investFiatEntre2019etJanvierAnneeImposition[$code] = 0;
                $this->investFiatAfter2019[$code] = 0;
            }
            if (!empty($detailArrayAcquisitionFiatDepuisDerniereCession) && sizeof($detailArrayAcquisitionFiatDepuisDerniereCession) > 0) {

                $this->detailArrayAcquisitionFiatDepuisDerniereCession[$dateTime->format('Y-m-d H:i:s')] = $detailArrayAcquisitionFiatDepuisDerniereCession;

            }
        }

        // on initialise sommePrixAcquites pour le 1er janvier 2019
        if ($dateTime > new DateTime('2019-01-01 00:00:00') && empty($this->useGeneratedAcquisitionAvant2019)) {
            $this->sommePrixAcquites = $this->totalPrixAcquisitionBefore2019;
            // debug montant acquisition
            $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition = $this->totalPrixAcquisitionBefore2019;

            echo 'sommePrixAcquites  : ' . $this->sommePrixAcquites;
            echo 'sommePrixAcquitesEntre2019etJanvierAnneeImposition  : ' . $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition;
            $this->useGeneratedAcquisitionAvant2019 = true;
        }

//        if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
            $this->arrayAcquisitionFiatAvantDateCession[$dateTime->format('d-m-Y H:i:s')][] = ['totalEUR' => $acquisitionFiatDepuisDerniereCession, 'datetime' => $dateTime];
            $oldSommePrixAcquites = $this->sommePrixAcquites;
            $this->sommePrixAcquites = $this->sommePrixAcquites + $acquisitionFiatDepuisDerniereCession;


            // Prix de cession BOFIP est le prix de cession net
            $prixCession = $prixCessionBrut - $fraisCession;


            $sommeFractionsInitialesCapital = $this->sommeFractionsInitialesCapital;
            $prixTotalAcquisition = $this->sommePrixAcquites - $sommeFractionsInitialesCapital;





//            echo $dateTime->format('Y-m-d');
//            var_dump($this->sommePrixAcquites);
//            var_dump($sommeFractionsInitialesCapital);
//            var_dump($prixTotalAcquisition);
//
//            echo '-------';
            $plusOuMoinsValue = $this->calculPlusValueCession($prixCession, $prixTotalAcquisition, $prixCessionBrut, $valeurWallet);


            $this->explanationPrixTotalAcquisition[] = [
                'dateTime' => $dateTime,
                'oldSommePrixAcquites' => $oldSommePrixAcquites,
                'acquisitionFiatDepuisDerniereCession' => $acquisitionFiatDepuisDerniereCession,
                'sommePrixAcquites' => $this->sommePrixAcquites,
                'sommeFractionsInitialesCapital' => $sommeFractionsInitialesCapital,
                'plusOuMoinsValue' => $plusOuMoinsValue,
                'prixCession' => $prixCession,
                'prixTotalAcquisition' => $prixTotalAcquisition
            ];


            $this->sommeFractionsInitialesCapital = $this->sommeFractionsInitialesCapital + $prixCession - $plusOuMoinsValue;
            $this->investFiat = [];
            $this->investFiatAfter2019 = [];

        }

        // debug montant acquisition debut
//        if($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
//
//
//            $this->arrayAcquisitionFiatAvantDateCessionEntre2019etJanvierAnneeImposition[$dateTime->format('d-m-Y H:i:s')][] = ['totalEUR' => $acquisitionFiatDepuisDerniereCessionEntre2019etJanvierAnneeImposition, 'datetime' => $dateTime];
//            $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition = $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition + $acquisitionFiatDepuisDerniereCessionEntre2019etJanvierAnneeImposition;
//
//            $prixCessionBrutEntre2019etJanvierAnneeImposition = $prixCessionBrut;
//            $fraisCessionEntre2019etJanvierAnneeImposition = $fraisCession;
//            // Prix de cession BOFIP est le prix de cession net
//            $prixCessionEntre2019etJanvierAnneeImposition = $prixCessionBrutEntre2019etJanvierAnneeImposition - $fraisCessionEntre2019etJanvierAnneeImposition;
//            $sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition = $this->sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition;
//            $prixTotalAcquisitionEntre2019etJanvierAnneeImposition = $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition - $sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition;
//            $plusOuMoinsValueEntre2019etJanvierAnneeImposition = $this->calculPlusValueCession($prixCessionEntre2019etJanvierAnneeImposition, $prixTotalAcquisitionEntre2019etJanvierAnneeImposition, $prixCessionBrutEntre2019etJanvierAnneeImposition, $valeurWalletEntre2019etJanvierAnneeImposition);
//            $this->sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition = $this->sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition + $prixCessionEntre2019etJanvierAnneeImposition - $plusOuMoinsValueEntre2019etJanvierAnneeImposition;
//            $this->investFiatEntre2019etJanvierAnneeImposition = [];
//            $this->investFiatAfter2019Entre2019etJanvierAnneeImposition = [];
//
//
//        }

// debug montant acquisition fin


        // calcul prix acquisition entre 2019 et le 1er janvier de l'année d'imposition
//        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-01-01 00:00:00')) {
//            $prixCessionBrutEntre2019EtJanvierImposition = $prixCessionBrut;
//
//            $this->arrayAcquisitionFiatEntre2019EtJanvierImposition[$dateTime->format('d-m-Y H:i:s')][] = ['totalEUR' => $acquisitionFiatDepuisDerniereCessionEntre2019EtJanvierAnneeImposition, 'datetime' => $dateTime];
//            $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition = $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition + $acquisitionFiatDepuisDerniereCessionEntre2019EtJanvierAnneeImposition;
//
//
//            // Prix de cession BOFIP est le prix de cession net
//            $prixCessionEntre2019EtJanvierImposition = $prixCessionBrut - $fraisCession;
//            $sommeFractionsInitialesCapitalEntre2019EtJanvierAnneeImposition = $this->sommeFractionsInitialesCapitalEntre2019EtJanvierAnneeImposition;
//            $prixTotalAcquisitionEntre2019EtJanvierImposition = $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition - $sommeFractionsInitialesCapitalEntre2019EtJanvierAnneeImposition;
//            $plusOuMoinsValueEntre2019EtJanvierImposition = $this->calculPlusValueCession($prixCessionEntre2019EtJanvierImposition, $prixTotalAcquisitionEntre2019EtJanvierImposition, $prixCessionBrutEntre2019EtJanvierImposition, $valeurWalletEntre2019EtJanvierImposition);
//            $this->sommeFractionsInitialesCapitalEntre2019EtJanvierAnneeImposition = $this->sommeFractionsInitialesCapitalEntre2019EtJanvierAnneeImposition + $prixCessionEntre2019EtJanvierImposition - $plusOuMoinsValueEntre2019EtJanvierImposition;
//            $this->investFiatEntre2019EtJanvierImposition = [];
//            $this->investFiatAfter2019Entre2019EtJanvierImposition = [];
//
//        }

        /*
          // plusoumoinsvalue = prix de cession net - (prix d'acquisition du portefeuille * prix de cession brut / valeur du portefeuille)

          // prix de cession net - (prix d'acquisition du portefeuille * prix de cession brut / valeur du portefeuille)
          // prix d'acquisition du portefeuille se revalorise à chaque vente
          // lors de cession n° 2 = prix d'acquisition du portefeuille cession 1 + acquisitions fiat posterieur à cession - valeur nominale incluse dans la cession 1
          // valeur nominale incluse dans cession 1 = prix de cession net c1 - plusvalue c1


          Cession 2 :
          plusoumoinsvalue c2 = prix de cession net c2 - (prix d'acquisition du portefeuille c2 * prix de cession brute c2 / valeur du portefeuille juste avant c2)
          prix d'acquisition du portefeuille c2 = prix d'acquisition du portefeuille c1 + acquisition fiat apres c1 - valeure nominale de la cession c1
          valeure nominale de la cession c1 = prix cession net c1 - plusoumoinvalue c1
          // 07-04-2019

          Example

          cession 1 : 07-04-2019
          plusoumoinsvalue c1 = prix de cession net c1 - (prix d'acquisition du portefeuille c1 * prix de cession brut c1 / valeur du portefeuille juste avant c1)
          4800 - 10 - (prix d'acquisition du portefeuille c1 * 4800) / 9600)
          plusoumoinsvalue  = 4800 - 10 - (7100 * 4800) / 9600)
          = 4790 - 3550 = 1240

          prix d'acquisition du portefeuille c1 = prix d'acquisition du portefeuille 01/01/2019 + acquisition fiat post au 1 janvier - valeur nominale 1 janvier

          0                          +               7100                -    0

          cession 2 : 10-05-2019
          plusoumoinsvalue c2 = prix de cession net c2 - (prix d'acquisition du portefeuille c2 * prix de cession brut c2 / valeur du portefeuille juste avant c2)
          7500 - 10 - (prix d'acquisition du portefeuille c2 * 7500) / 7500)
          plusoumoinsvalue  =         7490        - (3550 * 7500) / 7500)
          =         7490        -   3550
          =                 3940

          prix d'acquisition du portefeuille c2 = prix d'acquisition du portefeuille c1 + acquisition fiat depuis c1 - valeur nominale c1

          prix d'acquisition du portefeuille c2 =       7100                           +       0                  -  (prix cession net c1 - plusoumoinvalue c1)
          (4790     -     1240)
          (3550)
          prix d'acquisition du portefeuille c2 =  3550




          Colonnes du tableau :
          Date de la cession fiat
          Prix de cession brut
          Frais de cession
          Prix d'acquisition c-1
          Acquisition fiat depuis c-1
          Valeur nominale c-1
          Valeur du portefeuille juste avant c
          Plus ou moins value
         */

        if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
            //if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
            $this->plusValue = $this->plusValue + $plusOuMoinsValue;
//            echo 'total';


            $this->arrayRapportAnnexePrincipale[] = new \Application\Entity\RowReport([
                'dateCession' => $dateTime,
                'prixCessionBrut' => $prixCessionBrut,
                'fraisCession' => $fraisCession,
                'prixCession' => $prixCessionBrut - $fraisCession,
                'sommePrixAcquites' => $this->sommePrixAcquites,
                'sommeFractionsInitialesCapital' => $sommeFractionsInitialesCapital,
                'prixTotalAcquisition' => $prixTotalAcquisition,
                //'prixAcquisitionDerniereCession' => $prixAcquisitionDerniereCession,
                //'acquisitionFiatDepuisDerniereCession' => $acquisitionFiatDepuisDerniereCession,
                //'valeurNominaleDerniereCession' => $valeurNominaleDerniereCession,
                'valeurPortefeuille' => $valeurWallet,
                'plusOuMoinsValue' => $plusOuMoinsValue
            ]);

        }

        // debug montant acquisition debut
//        if ($dateTime >= new DateTime('2019-01-01 00:00:00') && $dateTime < new DateTime($this->anneeImposition . '-01-01 00:00:00')) {
//
//
//            $this->plusValueEntre2019etJanvierAnneeImposition = $this->plusValueEntre2019etJanvierAnneeImposition + $plusOuMoinsValueEntre2019etJanvierAnneeImposition;
//
//            $this->arrayRapportAnnexePrincipaleEntre2019etJanvierAnneeImposition[] = new \Application\Entity\RowReport([
//                'dateCession' => $dateTime,
//                'prixCessionBrut' => $prixCessionBrutEntre2019etJanvierAnneeImposition,
//                'fraisCession' => $fraisCessionEntre2019etJanvierAnneeImposition,
//                'prixCession' => $prixCessionBrutEntre2019etJanvierAnneeImposition - $fraisCessionEntre2019etJanvierAnneeImposition,
//                'sommePrixAcquites' => $this->sommePrixAcquitesEntre2019etJanvierAnneeImposition,
//                'sommeFractionsInitialesCapital' => $sommeFractionsInitialesCapitalEntre2019etJanvierAnneeImposition,
//                'prixTotalAcquisition' => $prixTotalAcquisitionEntre2019etJanvierAnneeImposition,
//                //'prixAcquisitionDerniereCession' => $prixAcquisitionDerniereCession,
//                //'acquisitionFiatDepuisDerniereCession' => $acquisitionFiatDepuisDerniereCession,
//                //'valeurNominaleDerniereCession' => $valeurNominaleDerniereCession,
//                'valeurPortefeuille' => $valeurWalletEntre2019etJanvierAnneeImposition,
//                'plusOuMoinsValue' => $plusOuMoinsValueEntre2019etJanvierAnneeImposition
//            ]);
//
//
//
//        }

//            if {
//            // calcul du prix d'acquisition
//            // si prix acquisition
//        }

        // recupération de la dernière valeur du total d'acquisition de l'année
//        if ($dateTime <= new DateTime($this->anneeImposition . '-01-01 00:00:00')) {
//            $this->totalPrixAcquisitionPremierJanvierAnneeImposition = $prixTotalAcquisition;
//        }

        // debug montant acquisition fin

    }

    protected function logAnnexe($str)
    {
        if (!is_dir($this->annexe_dir_base)) {
            if (!mkdir($concurrentDirectory = $this->annexe_dir_base, 0777, true) && !is_dir($concurrentDirectory)) {
                throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
            }
        }
        file_put_contents($this->annexe_dir_base . $this->tokenLedgio, $str, FILE_APPEND | LOCK_EX);
    }

    protected function calculPlusValueCession($prixCession, $prixAcquisition, $prixCessionBrut, $valeurWallet)
    {

        if ($valeurWallet != 0) {
            return $prixCession - ($prixAcquisition * $prixCessionBrut / $valeurWallet);
        }
    }

    public function getArrayCryptosComplementaryInfosFull()
    {
        return $this->arrayCryptosComplementaryInfosFull;
    }

    public function genererPlusValueReport()
    {
        $this->logPlusValueReport('_____________________________________________________________________________' . PHP_EOL);
        $this->logPlusValueReport('Résumé : ' . PHP_EOL);
        $this->logPlusValueReport('Plus value totale à déclarer : ' . $this->plusValue . PHP_EOL);
        $this->logPlusValueReport('Wallet actuel : ' . print_r($this->instantWallet, true) . PHP_EOL);
        //$this->logPlusValueReport('Montant investi : ' . $this->investFiat['EUR'] . PHP_EOL);
        $this->logPlusValueReport('____________________________________________________________________________' . PHP_EOL);
    }

    protected function logPlusValueReport($str)
    {
        if (!is_dir($this->ledgio_dir_base))
            mkdir($this->ledgio_dir_base, 0777, true);
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-plus-value', $str, FILE_APPEND | LOCK_EX);
    }

    protected function logAnnexe1PlusValueReport($str)
    {
        if (!is_dir($this->ledgio_dir_base))
            mkdir($this->ledgio_dir_base, 0777, true);
        file_put_contents($this->ledgio_dir_base . $this->tokenLedgio . '/output/' . $this->tokenLedgio . '-annexe-1-plus-value', $str, FILE_APPEND | LOCK_EX);
    }
}


??

??