?? GreyFile — Mystic File Browser

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



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

?? Viewing: LedgioServicePrixSaveBeforeChangePrixAcquisition.php

<?php

namespace Application\Service;

use Application\Entity\CoursDevise;
use Application\Entity\Devise;
use Application\Entity\Ledgio;
use Application\Mapper\DeviseMapper;
use Application\Mapper\ImportMapper;
use Application\Mapper\LedgioMapper;
use Application\Service\ApiHistorical\CMCService;
use Application\Service\ApiHistorical\CoinAPIService;
use DateTime;
use Application\Tool\CurrencyTool;
use Laminas\Http\Header\Warning;
use function PHPUnit\Framework\throwException;

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

    /*
     * Tableau explication par ligne consolidée
     *
     */
    public $arrayExplicationLedgio;

    /*
     * 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 = [];

    /*
     * Utiliser dans le rapport d'erreur avril 2021
     */
    public $cumulQteManquanteArray = [];


    public $inputCsvDirectory = '';


    public $deviseEUR = null;
    public $exchangeInconnu = null;

    public $outputDir = '';

    public $firstTransactionDateTime = null;
    public $correctionWalletAddTransactionDateTime = null;

    public $nameFileToArrayLedgioCorrection = [];

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

        $this->entityManager = $entityManager;
        $this->mapperCoursDevise = new \Application\Mapper\CoursDeviseMapper($this->entityManager);
        $this->mapperDevise = new \Application\Mapper\DeviseMapper($this->entityManager);
        $this->mapperExchange = new \Application\Mapper\ExchangeMapper($this->entityManager);
        $this->mapperImport = new \Application\Mapper\ImportMapper($this->entityManager);
        $this->ledgioMapper = new LedgioMapper($this->entityManager);


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

        $this->exchangeRateService = new ExchangeRateService($entityManager, $this->mapperCoursDevise);


        // pour l'auto correction des warnings
        $this->deviseEUR = $this->mapperDevise->findByCode('EUR');
        $this->exchangeInconnu = $this->mapperExchange->findByName('inconnu');

        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 = !empty($config['anneeImposition']) ? $config['anneeImposition'] : (date('Y') - 1);
            $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 correctionAutomatique()
    {
        $this->generateRapportErreur(true);

//        $this->ledgioCollection = $this->ledgioMapper->getListByUser($this->user, array(), false);
//
//        $this->processLegioCalc();
//        $this->update(true);
    }


    /*
     * Foncion lancée quand on ajoute un fichier de transaction
     */
    public function update($autoCorrection = false)
    {
        $this->instantWallet = array();
        $warningLedgio = array();
        $collectionLedgio = $this->ledgioMapper->getListByUser($this->user, array(), false);
        $batchSize = 500;

        foreach ($collectionLedgio as $index => $ledgio) {
//echo $index;


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

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

            if (!empty($ledgio->getTradedDevise()->getId()) && !isset($this->instantWallet[$ledgio->getTradedDevise()->getId()])) {
                $this->instantWallet[$ledgio->getTradedDevise()->getId()] = ['devise' => $ledgio->getTradedDevise(), 'qty' => 0];
            }
            // debug wallet
            if (!empty($ledgio->getTradedDevise()->getId()) && !isset($this->instantWalletWithCode[$ledgio->getTradedDevise()->getId()])) {
                $this->instantWalletWithCode[$ledgio->getTradedDevise()->getId()] = ['code' => $ledgio->getTradedDevise()->getCode(), 'qty' => 0];
            }

            if (!empty($ledgio->getReceivedDevise()->getId()) && !isset($this->instantWallet[$ledgio->getReceivedDevise()->getId()])) {
                $this->instantWallet[$ledgio->getReceivedDevise()->getId()] = ['devise' => $ledgio->getReceivedDevise(), 'qty' => 0];
            }
            // debug wallet
            if (!empty($ledgio->getReceivedDevise()->getId()) && !isset($this->instantWalletWithCode[$ledgio->getReceivedDevise()->getId()])) {
                $this->instantWalletWithCode[$ledgio->getReceivedDevise()->getId()] = ['code' => $ledgio->getReceivedDevise()->getCode(), 'qty' => 0];
            }

            $this->instantWalletAvantCession = $this->instantWallet;

            // debug wallet
            $this->instantWalletWithCodeAvantCession = $this->instantWalletWithCode;
            $quantiteMonaieVenduDansPortefeuille = (isset($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]) && isset($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]['qty'])) ? $this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]['qty'] : 0;


            if (
                (!$this->isFiat($ledgio->getTradedDevise())) &&
//                ($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)) {
                (round($quantiteMonaieVenduDansPortefeuille - $ledgio->getTradedAmount(), 8) < -0.0000001)) {
//var_dump(round($quantiteMonaieVenduDansPortefeuille - $ledgio->getTradedAmount(), 8)); var_dump(round($quantiteMonaieVenduDansPortefeuille - $ledgio->getTradedAmount(), 8) < -0.0000001);echo 'tutu'; exit;
if ($quantiteMonaieVenduDansPortefeuille < 0 ){
    $ledgio->setQteManquanteWalletPourTraded($ledgio->getTradedAmount());
} else {
    $ledgio->setQteManquanteWalletPourTraded(abs($quantiteMonaieVenduDansPortefeuille - $ledgio->getTradedAmount()));
}

//                if ($ledgio->getTradedDevise()->getCode() == 'NXT') {
//                    echo ' qte avant echange NXT : ';
//                    //var_dump($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]);
//                    echo $quantiteMonaieVenduDansPortefeuille;
//
//                    echo ' qte tradé : ';
//                    echo $ledgio->getTradedAmount();
//                }

//                if ($ledgio->getTradedDevise()->getCode() == 'NEXO') {
//                    echo ' qte avant echange NEXO : ';
//                    //var_dump($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]);
//                    echo $quantiteMonaieVenduDansPortefeuille;
//
//                    echo ' qte tradé : ';
//                    echo $ledgio->getTradedAmount();
//                }
//                if ($ledgio->getTradedDevise()->getCode() == 'NXT' || $ledgio->getReceivedDevise()->getCode() == 'NXT') {
//                    echo 'warning';
//                    echo $quantiteMonaieVenduDansPortefeuille;
//                }
                //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;
            } else {
                $warningMessage = '';
            }

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

            // cumul avant cession
//            SELECT *  FROM `ledgio` WHERE `user_id`=41 AND (`tradedCurrency` LIKE 'LTC' OR `receivedCurrency` LIKE 'LTC') ORDER BY `datetimeTransaction`  ASC
//
            $ledgio->setCumulTraded($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]['qty']);
            // debug wallet
            $ledgio->setCumulTraded($this->instantWalletWithCodeAvantCession[$ledgio->getTradedDevise()->getId()]['qty']);


            $ledgio->setCumulReceived($this->instantWalletAvantCession[$ledgio->getReceivedDevise()->getId()]['qty']);

            // debug wallet
            $ledgio->setCumulReceived($this->instantWalletWithCodeAvantCession[$ledgio->getReceivedDevise()->getId()]['qty']);


            // wallet apres la cession
            $this->instantWallet[$ledgio->getTradedDevise()->getId()]['qty'] = $this->instantWallet[$ledgio->getTradedDevise()->getId()]['qty'] - $ledgio->getTradedAmount();
            $this->instantWallet[$ledgio->getReceivedDevise()->getId()]['qty'] = $this->instantWallet[$ledgio->getReceivedDevise()->getId()]['qty'] + $ledgio->getReceivedAmount();

            // debug wallet
            $this->instantWalletWithCode[$ledgio->getTradedDevise()->getId()]['qty'] = $this->instantWalletWithCode[$ledgio->getTradedDevise()->getId()]['qty'] - $ledgio->getTradedAmount();
            $this->instantWalletWithCode[$ledgio->getReceivedDevise()->getId()]['qty'] = $this->instantWalletWithCode[$ledgio->getReceivedDevise()->getId()]['qty'] + $ledgio->getReceivedAmount();

            //            if ($ledgio->getTradedDevise()->getCode() == 'NXT') {
//               var_dump($this->instantWallet[$ledgio->getTradedDevise()->getId()] );
//            }
//            if ($ledgio->getReceivedDevise()->getCode() == 'NXT') {
//               var_dump($this->instantWallet[$ledgio->getReceivedDevise()->getId()] );
//            }

            // 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));

            // debug wallet
            $ledgio->setInstantWallet(json_encode($this->instantWalletWithCodeAvantCession));


            $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();
            $deviseReceived = $ledgio->getReceivedDevise();
            $qtyReceived = $ledgio->getReceivedAmount();
            $assetOut = $ledgio->getTradedCurrency();
            $deviseTraded = $ledgio->getTradedDevise();
            $qtyTraded = $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($deviseReceived, abs($qtyReceived), $deviseTraded, abs($qtyTraded), $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->resetCorrectionImportFileLedgio();
        $this->processLegioCalc(false, true);

//        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);

    }

    protected function resetCorrectionImportFileLedgio()
    {
        $file = $this->inputCsvDirectory . '/historique-c.csv';
        if (!is_dir($this->ledgio_dir_base . $this->tokenLedgio . '/input/')) {
            mkdir($this->ledgio_dir_base . $this->tokenLedgio . '/input/', 0777, true);
        }
        if (is_file($this->inputCsvDirectory . '/historique-c.csv')) {
            unlink($this->inputCsvDirectory . '/historique-c.csv');

//            $query3 = $this->entityManager->createQuery("DELETE FROM Application\Entity\Import l WHERE l.user = " . $this->user->getId() . ' AND l.name = "historique-c.csv"');
//            $query3->execute();
        }


        $stringCsv = 'Date (UTC),Exchange,Monnaie tradée,Montant tradé,Monnaie reçue,Montant reçu,Monnaie frais,Montant frais';
        file_put_contents($this->inputCsvDirectory . '/exchange-generique/historique-c.csv', $stringCsv, FILE_APPEND | LOCK_EX);

        $mapperImport = new \Application\Mapper\ImportMapper($this->entityManager);

        $mapperExchange = new \Application\Mapper\ExchangeMapper($this->entityManager);
        $exchange = $mapperExchange->findByName('Exchange Générique');


        $importEntity = new \Application\Entity\Import(
            array(
                'user' => $this->user,
                'exchange' => $exchange,
                'sourceType' => 'csv',
                'name' => basename($file),
                'path' => $file,
                'nombreTrade' => 0,
                'datetimeImport' => new \DateTime()
            ));
        $mapperImport->insert($importEntity);

    }

    public function generateRapportErreur($autoCorrection = false)
    {
        if (is_file($this->outputDir . 'log-line-ledgio.txt')) {
            unlink($this->outputDir . 'log-line-ledgio.txt');
        }

        if (empty($this->ledgioCollection)) {
            $this->ledgioCollection = $this->ledgioMapper->getListByUser($this->user, array(), false);
            //$this->ledgioCollection = $this->ledgioMapper->getListByUserAndWarning($this->user, array(), false);
        }









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

            if (is_null($this->firstTransactionDateTime)) {
                $this->firstTransactionDateTime = $ledgio->getDatetimeTransaction();
                $this->correctionWalletAddTransactionDateTime = clone $this->firstTransactionDateTime;
                $this->correctionWalletAddTransactionDateTime->sub(new \DateInterval('P1D'));

            }
            //set_time_limit(0);

            $assetIn = $ledgio->getReceivedCurrency();
            $deviseReceived = $ledgio->getReceivedDevise();
            $qtyReceived = $ledgio->getReceivedAmount();
            $assetOut = $ledgio->getTradedCurrency();
            $deviseTraded = $ledgio->getTradedDevise();
            $qtyTraded = $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';
            }
//            var_dump($dateTime->format('Y-m-d H:i:s'));
//            var_dump($qtyTraded); exit;
            $this->processLineLedgioForRapporWarning($deviseReceived, abs($qtyReceived), $deviseTraded, abs($qtyTraded), $dateTime, $mvtType, $exchange, $tradeId, $fraisCessionEUR, $ledgio, $autoCorrection);
        }
//        echo 'cumul---------------';
//        var_dump($this->cumulQteManquanteArray);
//        exit;
        //var_dump($this->instantWallet);


        //
        if ($autoCorrection) {

// delete all ledgio entity with
            $listToDelete = $this->ledgioMapper->getListByUser($this->user,['warningMessage' => 'MONTANT_TRADE_SUP_WALLET_CORRECTION']);

            if (!empty($listToDelete)) {

                foreach($listToDelete as $ledgioToDelete) {
                    $this->ledgioMapper->delete($ledgioToDelete);
                }
            }

            if (!empty($this->cumulQteManquanteArray)) {

                $fileNameCorrection = 'echange-inconnu.csv';
                $filePathCorrection = $this->inputCsvDirectory . '/exchange-generique/' . $fileNameCorrection;

                $stringCsv = 'Date (UTC),Exchange,Monnaie tradée,Montant tradé,Monnaie reçue,Montant reçu,Monnaie frais,Montant frais' . PHP_EOL;
                file_put_contents($filePathCorrection, $stringCsv);

$nbTradeCorrection = 1;
                $arrayLedgioCorrection = [];
                foreach ($this->cumulQteManquanteArray as $idDevise => $qteManquanteArray) {

                    $ledgioCorrectionEntite = new Ledgio(array(
                    'datetimeTransaction' => $this->correctionWalletAddTransactionDateTime,
                    'user' => $this->user,
                    'exchange' => $this->exchangeInconnu,
                    'type' => 'BUY',
                    'pair' => 'EUR' . '-' . $qteManquanteArray['code'],
                    //                        'fees' => $this->getFee($arrayLine),
                    'feesAmount' => 0,
                    'feesDevise' => null,
                    'feesCurrency' => null,
                    'feesEUR' => 0,
                    'tradedAmount' => 0,
                    'tradedCurrency' => $this->deviseEUR->getCode(),
                    'tradedDevise' => $this->deviseEUR,
                    'receivedAmount' => $qteManquanteArray['qty'],
                    'receivedCurrency' => $qteManquanteArray['code'],
                    'receivedDevise' => $qteManquanteArray['devise'],
                    'transactionId' => '',
                    'import' => null
                ));
                    $ledgioCorrectionEntite->setWarningMessage('MONTANT_TRADE_SUP_WALLET_CORRECTION');
                    $ledgioCorrectionEntite->setUser($this->user);
                    $arrayLedgioCorrection[] = $ledgioCorrectionEntite;
                    $nbTradeCorrection++;
                    

                }


                $importCorrection = new \Application\Entity\Import(
                    array(
                        'user' => $this->user,
                        'exchange' => $this->exchangeInconnu,
                        'sourceType' => 'csv',
                        'name' => $fileNameCorrection,
                        'path' => $filePathCorrection,
                        'nombreTrade' => $nbTradeCorrection,
                        'datetimeImport' => new \DateTime()
                    ));
                $this->mapperImport->insert($importCorrection);


                foreach($arrayLedgioCorrection as $ledgioCorrection) {

                    $ledgioCorrection->setImport($importCorrection);
                    $stringCsv2 = $ledgioCorrection->getDatetimeTransaction()->format('Y-m-d H:i:s') . ',' . $ledgioCorrection->getExchange()->getName() . ',' . $ledgioCorrection->getTradedDevise()->getCode() . ','.$ledgioCorrection->getTradedAmount().',' . $ledgioCorrection->getReceivedDevise()->getCode() . ',' . $ledgioCorrection->getReceivedAmount() .',,'. PHP_EOL;
                    file_put_contents($filePathCorrection, $stringCsv2, FILE_APPEND | LOCK_EX);

                    $this->ledgioMapper->insert($ledgioCorrection);

//                    echo $ledgioCorrection->getDatetimeTransaction()->format('Y-m-d H:i:s');
//                    exit;

                }

                $this->update();


                

            }
            // delete old correction
//            if (!empty($this->nameFileToArrayLedgioCorrection)) {
//
//
//
//
//
//                foreach($this->nameFileToArrayLedgioCorrection as $nameFile => $arrayLedgioCorrection) {
//                    // on crée le fichier csv
//                    $fileNameCorrection = 'historique-c-' . $nameFile . '.csv';
//                    $filePathCorrection = $this->inputCsvDirectory . '/exchange-generique/'.$fileNameCorrection;
//                    $importCorrection = new \Application\Entity\Import(
//                        array(
//                            'user' => $this->user,
//                            'exchange' => $this->exchangeInconnu,
//                            'sourceType' => 'csv',
//                            'name' => $fileNameCorrection,
//                            'path' => $filePathCorrection,
//                            'nombreTrade' => count($arrayLedgioCorrection),
//                            'datetimeImport' => new \DateTime()
//                        ));
//                    $this->mapperImport->insert($importCorrection);
//
//                        //unlink($this->inputCsvDirectory . '/historique-c.csv');
//                        $stringCsv = 'Date (UTC),Exchange,Monnaie tradée,Montant tradé,Monnaie reçue,Montant reçu,Monnaie frais,Montant frais' . PHP_EOL;
//                        file_put_contents($filePathCorrection, $stringCsv);
//
//
//
//
//
//
//
//
//                    foreach($arrayLedgioCorrection as $ledgioCorrection) {
//                        $ledgioCorrection->setImport($importCorrection);
//                        $stringCsv2 = $ledgioCorrection->getDatetimeTransaction()->format('Y-m-d H:i:s') . ',' . $ledgioCorrection->getExchange()->getName() . ',' . $ledgioCorrection->getTradedDevise()->getCode() . ','.$ledgioCorrection->getTradedAmount().',' . $ledgioCorrection->getReceivedDevise()->getCode() . ',' . $ledgioCorrection->getReceivedAmount() . PHP_EOL;
//                        file_put_contents($filePathCorrection, $stringCsv2, FILE_APPEND | LOCK_EX);
//
//                        $this->entityManager->persist($ledgioCorrection);
//
//                    }
//                }
//
//            }

        }


    }


    /*
     * utilisé pour la génération du rapport
     */
    public function processLegioCalc($autoCorrection = false, $processForRapportFiscal = false)
    {

        if (is_file($this->outputDir . 'log-line-ledgio.txt')) {
            unlink($this->outputDir . 'log-line-ledgio.txt');
        }

        if (empty($this->ledgioCollection)) {
            $this->ledgioCollection = $this->ledgioMapper->getListByUser($this->user, array(), false);
        }

        set_time_limit(0);

        foreach ($this->ledgioCollection as $ledgio) {
            if (is_null($this->firstTransactionDateTime)) {
                $this->firstTransactionDateTime = $ledgio->getDatetimeTransaction();

            }



            $assetIn = $ledgio->getReceivedCurrency();
            $deviseReceived = $ledgio->getReceivedDevise();

            $qtyReceived = $ledgio->getReceivedAmount();
            $assetOut = $ledgio->getTradedCurrency();
            $deviseTraded = $ledgio->getTradedDevise();
            $qtyTraded = $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($deviseReceived) && $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($deviseReceived, abs($qtyReceived), $deviseTraded, abs($qtyTraded), $dateTime, $mvtType, $exchange, $tradeId, $fraisCessionEUR, $ledgio, $autoCorrection, $processForRapportFiscal);
        }
    }

    protected function isFiat(Devise $devise)
    {

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

    /*
     * Utilisé pour la génération du rapport
     */
    protected function processLineLedgioBefore2019Test($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection = false, $debug = false)
    {


        // acquisition de crypto avec du fiat ou une autre crypto
        if (!$this->isFiat($deviseReceived)) {
            file_put_contents($this->outputDir . 'log-line-ledgio.txt', 'acquisition de crypto avec du fiat ou une autre crypto' . PHP_EOL, FILE_APPEND);

            // achat de crypto avec du fiat
            if ($this->isFiat($deviseTraded)) {
                // Si on investit dans un autre fiat que EUR on calcule la valeur en EUR
                if ($deviseTraded->getCode() !== 'EUR') {
                    $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);
                    $arrayExplicationLineLedgio['priceFiat'] = $price;
                    $arrayExplicationLineLedgio['priceFiatComment'] = 'Prix unitaire du fiat non EUR tradé';

                    $prixEuro = $qtyTraded * $price;
                    $arrayExplicationLineLedgio['priceFiatEuroComment'] = 'qtytraded x price';

                } else {
                    $prixEuro = $qtyTraded;
                    $arrayExplicationLineLedgio['priceFiatEuroComment'] = 'qtytraded';
                }

                // on ajoute une ligne d'acquisition de la crypto
                //qte est la quantité recu et prixEuro est la valeur totale d'acquisition en EUR
                $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = ['qte' => $qtyReceived, 'prixEuro' => $prixEuro];
            } else {
                // echange de crypto crypto
                // On prend la valeur en EUR en cas d'echange de crypto (comme si la transaction avait été faite avec des euros)
                $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);
                $prixEuro = $qtyReceived * $price;

                // 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->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);

                $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = ['qte' => $qtyReceived, 'prixEuro' => $prixEuro];

            }
        } else {

            // on doit sortir la deviseOut du wallet par la methode FIFO
            if (!$this->isFiat($deviseTraded)) {
                file_put_contents($this->outputDir . 'log-line-ledgio.txt', 'vente de crypto contre du fiat ou une autre crypto' . PHP_EOL, FILE_APPEND);

                // cas de la crypto non trouvée on crée une entrée mais generera une erreur de portefeuille la qte vendue est sup a ce qu'il y a dans le portefeuille
                if (empty($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()])) {
                    $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()] = array();
                }

                $i = 0;
                $qtyTradedTmp = $qtyTraded;

                // Début méthode FIFO on parcours tous les achats de crypto et on soustrait la quantité sortie
                while ($i < count($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()]) && $qtyTradedTmp > 0) {
                    file_put_contents($this->outputDir . 'log-line-ledgio.txt', $i . PHP_EOL, FILE_APPEND);

                    $arrayBuyCrypto = $this->arrayAcquisitionBefore2019[$deviseTraded->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 ($qtyTradedTmp <= $arrayBuyCrypto['qte']) {
                        // calcul du nouveau montant total d'acquisiton en EUR
                        $newPrixEuro = $arrayBuyCrypto['prixEuro'] - ($qtyTradedTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);
                        $newQte = $arrayBuyCrypto['qte'] - $qtyTradedTmp;

                        $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i] = ['qte' => $newQte, 'prixEuro' => $newPrixEuro];

                        // on passe la qté restante à 0;
                        $qtyTradedTmp = 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->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i]['qte'] = 0;

                            // On déduit la quantité de la crypto en train d'etre sortie du portefeuille
                            $qtyTradedTmp = $qtyTradedTmp - $arrayBuyCrypto['qte'];
                        }
                        //$this->arrayAcquisitionBefore2019[$deviseTraded->getCode()] = array_values($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()]);
                    }
                    $i++;

                }
                // Fin méthode FIFO on parcours tous les achats de crypto et on soustrait la quantité sortie


            }
        }


    }

    protected function processLineLedgioBefore2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection = false, $debug = false)
    {


        // si c'est pas du fiat en in on l'ajoute au wallet acquisition avant 2019
        if (!$this->isFiat($deviseReceived)) {
            if (empty($this->arrayAcquisitionBefore2019[$deviseReceived->getCode()])) {
                $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()] = array();
            }
            if (empty($this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()])) {
                $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()] = 0;
            }
            if (empty($this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()])) {
                $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()] = 0;
            }

            // on traite la devise out
            // si c'est du fiat en out

            // achat de crypto avec du fiat
            if ($this->isFiat($deviseTraded)) {

                $arrayExplicationLineLedgio['commentaireType'] = 'Achat de crypto avec du fiat';


                // si pas EUR on calcule le fiat en EUR
                if ($deviseTraded->getCode() !== 'EUR') {
                    $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);
                    $arrayExplicationLineLedgio['priceFiat'] = $price;
                    $arrayExplicationLineLedgio['priceFiatComment'] = 'Prix unitaire du fiat non EUR tradé';

                    $prixEuro = $qtyTraded * $price;
                    $arrayExplicationLineLedgio['priceFiatEuroComment'] = 'qtytraded x price';

                } else {
                    $prixEuro = $qtyTraded;
                    $arrayExplicationLineLedgio['priceFiatEuroComment'] = 'qtytraded';
                }

                $arrayExplicationLineLedgio['priceFiatInEuro'] = $prixEuro;


                $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = ['qte' => $qtyReceived, 'prixEuro' => $prixEuro];

                $oldQuantite = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];
                $arrayExplicationLineLedgio['qtyCumulReceivedDeviseAvantCession'] = $oldQuantite;
                $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()] = $qtyReceived + $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];
                $arrayExplicationLineLedgio['qtyCumulReceivedDeviseApresCession'] = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];

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

//                if ($deviseReceived->getCode() == 'BTC') {
//                    var_dump($price);
//                    var_dump($deviseReceived->getCode());
//                    var_dump($dateTime->format('Y-m-d H:i:s'));
//                    exit;
//                }

                $this->explicationAcquisitionAvant2019[$deviseReceived->getCode()][$dateTime->format('Y-m-d H:i:s')][] = [
                    'dateTime' => $dateTime,
                    'oldQte' => $oldQuantite,
                    'qtyOutTmp' => '',
                    'qtyIn' => $qtyReceived,
                    'newQte' => $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()],
                    'monnaieFiatRecu' => $deviseTraded->getCode(),
                    'qtyFiatRecu' => $qtyTraded,
                    'conversionEur' => !empty($price) ? $price : 1,
                    'prixUnitaireIn' => $prixEuro / $qtyReceived,
                    'unitInPriceCryptoToEur' => $prixEuro / $qtyReceived, // test comparaison prix moyen entrée et sortie
                    // explication prix
                    'oldPrixEuro' => '',
                    'ratioPrixEuro' => '',
                    'newPrixEuro' => $prixEuro,
                    'cumulAcquisitionParCryptoEUR' => $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()],
                    'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange
                ];

            } else {

                // echange de crypto crypto
                $arrayExplicationLineLedgio['commentaireType'] = 'Echange crypto-crypto';
                if (empty($this->explicationValeurEchangeAvant2019[$deviseReceived->getCode()])) {
                    $this->explicationValeurEchangeAvant2019[$deviseReceived->getCode()] = [];
                }

                if (empty($this->explicationValeurEchangeAvant2019[$deviseReceived->getCode()][$dateTime->format('Y-m-d H:i:s')])) {
                    $this->explicationValeurEchangeAvant2019[$deviseReceived->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->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);

                $arrayExplicationLineLedgio['priceDeviseReceived'] = $price;
                // 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->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);
                $arrayExplicationLineLedgio['priceDeviseTraded'] = $priceOut;
                $prixEuro = $qtyReceived * $price;
                $arrayExplicationLineLedgio['valeurEURDeviseReceived'] = $prixEuro;
                $prixEuroOutTest = $qtyTraded * $priceOut;
                $arrayExplicationLineLedgio['valeurEURDeviseTraded'] = $prixEuroOutTest;


                $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = ['qte' => $qtyReceived, 'prixEuro' => $prixEuro];

                $oldQuantite = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];

                $arrayExplicationLineLedgio['qtyCumulReceivedDeviseAvantCession'] = $oldQuantite;


                $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()] = $qtyReceived + $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];

                $arrayExplicationLineLedgio['qtyCumulReceivedDeviseApresCession'] = $this->arrayCumulParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];

                $cumulAcquisitionParCryptoEURAvantEchange = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];


                $arrayExplicationLineLedgio['valeurEURCumulReceivedDeviseAvantCession'] = $cumulAcquisitionParCryptoEURAvantEchange;


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

                $arrayExplicationLineLedgio['valeurEURCumulReceivedDeviseAvantCession'] = $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()];

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

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


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

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

                ];
            }
        }

        // on doit sortir la deviseOut du wallet par la methode FIFO
        if (!$this->isFiat($deviseTraded)) {
            // initialisation des prix et qté à sortir
            //        $prixEurOut = 0;
            $i = 0;
            $qtyTradedTmp = $qtyTraded;

            // 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[$deviseTraded->getCode()])) {
                $this->logAcquisitionAvant2019('=> Devise Out non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()] = array();
            }

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

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

            if (empty($this->explicationAcquisitionAvant2019[$deviseTraded->getCode()]) || !is_array($this->explicationAcquisitionAvant2019[$deviseTraded->getCode()])) {
                $this->explicationAcquisitionAvant2019[$deviseTraded->getCode()] = [];
            }
            if (empty($this->explicationAcquisitionAvant2019[$deviseTraded->getCode()][$dateTime->format('Y-m-d H:i:s')]) || !is_array($this->explicationAcquisitionAvant2019[$deviseTraded->getCode()][$dateTime->format('Y-m-d H:i:s')])) {
                $this->explicationAcquisitionAvant2019[$deviseTraded->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
            while ($i < count($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()]) && $qtyTradedTmp > 0) {
                $arrayBuyCrypto = $this->arrayAcquisitionBefore2019[$deviseTraded->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 ($qtyTradedTmp <= $arrayBuyCrypto['qte']) {
                    // calcul du nouveau montant total d'acquisiton en EUR
                    $newPrixEuro = $arrayBuyCrypto['prixEuro'] - ($qtyTradedTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);
                    $newQte = $arrayBuyCrypto['qte'] - $qtyTradedTmp;

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

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

                    $arrayExplicationLineLedgio[''] =

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

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

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

                    // on passe la qté restante à 0;
                    $qtyTradedTmp = 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'] . ' ' . $deviseTraded->getCode() . ' de l\'acquisition ' . $i . PHP_EOL);
                        $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i]['qte'] = 0;
                        $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()], true));

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

                        $this->explicationAcquisitionAvant2019[$deviseTraded->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[$deviseTraded->getCode()],

                        ];


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


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

            }

            if ($qtyTradedTmp > 0) {
                $this->logAcquisitionAvant2019('Vous cherchez à vendre des crypto que vous n\'avez pas : ' . $qtyTradedTmp . ' ' . $deviseTraded->getCode() . PHP_EOL);
            }
        }
// fin sortir la deviseOut du wallet par la methode FIFO

    }

    /*
     * Utilisé pour la génération du rapport
     */
    protected function processLineLedgioAfterJanvier2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection = false, $debug = false)
    {


        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' => '-'

            ];
        }

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

                $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);

                if (empty($price)) {

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

            $cumulAcquisitionParCryptoEURAvantEchange = !empty($this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()]) ? $this->arrayCumulValeurTotaleAcquisitionParCryptoAcquisitionBefore2019[$deviseReceived->getCode()] : 0;

            $lastIndex = count($this->arrayExplicationAcquisitionEUR) - 1;
            $oldPrix = $this->arrayExplicationAcquisitionEUR[$lastIndex]['prixAcquisitionTotal'];
            $ancienPrixAcquisition = isset($this->arrayExplicationAcquisitionEUR[$lastIndex]) ? $this->arrayExplicationAcquisitionEUR[$lastIndex]['prixAcquisitionTotal'] : 0;

            $this->arrayExplicationAcquisitionEUR[] = [
                'dateTime' => $dateTime,
                'augmentationPrixAcquisition' => $prixEuro,
                'diminutionPrixAcquisition' => 0,
                'prixAcquisitionTotal' => $ancienPrixAcquisition + $prixEuro,
                'prixTotalAcquisitionNet' => $ancienPrixAcquisition + $prixEuro - $this->sommeFractionsInitialesCapital,
                'cumulAcquisitionParCryptoEURAvantEchange' => $cumulAcquisitionParCryptoEURAvantEchange,
                'oldPrix' => $ancienPrixAcquisition,
                'prixEuro' => '-',
                'totalValueCrypto' => '-'
            ];
        } else {

        }

        if ($this->isFiat($deviseReceived)) {
            // Génération de la ligne du rapport cession de crypto
            $this->arrayTransactionsCessionFiatAnneeImposition[] = [
                'deviseIn' => $deviseReceived,
                'qtyIn' => $qtyReceived,
                'deviseOut' => $deviseTraded,
                'qtyOut' => $qtyTraded,
                'datetime' => $dateTime,
                'type' => $mvtType,
                'exchangeName' => $exchangeName,
                'tradeId' => $tradeId,
                'fraisCession' => $fraisCessionEUR
            ];
            $this->generateReportLineAfter2019($qtyReceived, $dateTime, $exchangeName, $tradeId, $fraisCessionEUR, $deviseTraded, $qtyTraded);

            if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
                $arrayExplicationLineLedgio['lineReportAfter2019'] = $this->arrayRapportAnnexePrincipale[sizeof($this->arrayRapportAnnexePrincipale) - 1];
            }


            if ($deviseReceived->getCode() !== 'EUR') {

                $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);

                if (empty($price)) {

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


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


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

                        if ($arrayInfo['qty'] < 0) {
                            //$this->logAnnexe('!!!!! Certains achats de crypto n\'ont pas été enregistré !!!!');
                        } else {
                            $totalValueCryptoAvantCession = $totalValueCrypto;
                            $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;
//                }

            }

            if (!empty($totalValueCryptoAvantCession)) {
                $diminutionPrixAcquisition = $oldPrix * $prixEuro / $totalValueCryptoAvantCession;
            } else {
                $diminutionPrixAcquisition = 0;
            }

            $this->arrayExplicationAcquisitionEUR[] = [
//                    'dateTime' => $dateTime,
//                    'augmentationPrixAcquisition' => 0,
//                    'diminutionPrixAcquisition' => $diminutionPrixAcquisition,
//                    'sommeFractionsInitialesCapital' => $this->sommeFractionsInitialesCapital,
//                    'prixTotalAcquisitionNet' => $oldPrix - $this->sommeFractionsInitialesCapital,
//
//
//                    'prixAcquisitionTotal' => $oldPrix - $diminutionPrixAcquisition,
//                    'oldPrix' => $oldPrix,
//                    'prixEuro' => $prixEuro,
//                    'totalValueCrypto' => $totalValueCrypto,
//                    'totalValueCryptoAvantCession' => $totalValueCryptoAvantCession,


                'dateTime' => $dateTime,
                'augmentationPrixAcquisition' => 0,
                'diminutionPrixAcquisition' => $diminutionPrixAcquisition,
                'sommeFractionsInitialesCapital' => $this->sommeFractionsInitialesCapital,
                'prixTotalAcquisitionNet' => $oldPrix - $this->sommeFractionsInitialesCapital,


                'prixAcquisitionTotal' => $oldPrix - $diminutionPrixAcquisition,
                'oldPrix' => $oldPrix,
                'prixEuro' => $prixEuro,
                'totalValueCrypto' => $totalValueCrypto,
                'totalValueCryptoAvantCession' => $totalValueCryptoAvantCession,
            ];

        }

    }

    protected function processLineLedgioForRapporWarning($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, Ledgio $ledgio, $autoCorrection = false, $debug = false)
    {

if (!empty($ledgio->getQteManquanteWalletPourTraded())) {

    $wallet = json_decode($ledgio->getInstantWallet(), true);


    $quantiteMonaieVenduDansPortefeuille = !empty($wallet[$deviseTraded->getId()]['qty']) ? $wallet[$deviseTraded->getId()]['qty'] : 0;
    if (empty($this->cumulQteManquanteArray[$deviseTraded->getId()])) {
        $this->cumulQteManquanteArray[$deviseTraded->getId()] = ['qty' => 0, 'code' => $deviseTraded->getCode(), 'devise' => $deviseTraded];
    }
    $this->cumulQteManquanteArray[$deviseTraded->getId()]['qty'] = $this->cumulQteManquanteArray[$deviseTraded->getId()]['qty'] + $ledgio->getQteManquanteWalletPourTraded();


    $this->arrayWarningWalletQte[$deviseTraded->getCode()][] = [
        'dateTime' => $dateTime,
        'qteInWalletBeforeCession' => $quantiteMonaieVenduDansPortefeuille,
        'qteOut' => $qtyTraded,
        'qteManquante' => $ledgio->getQteManquanteWalletPourTraded(),
        'cumulQteManquante' => $this->cumulQteManquanteArray[$deviseTraded->getId()]['qty']
    ];
}



















//        file_put_contents($this->outputDir . 'log-line-ledgio.txt', $dateTime->format('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
//
//        if (!empty($ledgio->getTradedDevise()->getId()) && !isset($this->instantWallet[$ledgio->getTradedDevise()->getId()])) {
//            $this->instantWallet[$ledgio->getTradedDevise()->getId()] = ['devise' => $ledgio->getTradedDevise(), 'qty' => 0];
//        }
//
//        if (!empty($ledgio->getReceivedDevise()->getId()) && !isset($this->instantWallet[$ledgio->getReceivedDevise()->getId()])) {
//            $this->instantWallet[$ledgio->getReceivedDevise()->getId()] = ['devise' => $ledgio->getReceivedDevise(), 'qty' => 0];
//        }
//
//        $this->instantWalletAvantCession = $this->instantWallet;
//
//        $quantiteMonaieVenduDansPortefeuille = (isset($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]) && isset($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]['qty'])) ? $this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]['qty'] : 0;
//
////        if (strtoupper($ledgio->getTradedDevise()->getCode()) == 'NEXO' || $ledgio->getReceivedDevise()->getCode() == 'NEXO') {
////            echo 'qte avant echange';
////            //var_dump($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]);
////            echo $quantiteMonaieVenduDansPortefeuille;
////
////
////            file_put_contents($this->outputDir . 'processLineLedgioForRapporWarning.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteReceived : ' .  abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) . PHP_EOL, FILE_APPEND);
////
////        }
//
//
//
//        if (
//            (!$this->isFiat($ledgio->getTradedDevise())) &&
////                ($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)) {
//            (round($quantiteMonaieVenduDansPortefeuille - $ledgio->getTradedAmount(), 8) < -0.00000001)) {
//            //file_put_contents($this->outputDir . 'processLineLedgioForRapporWarning.txt', '----WARNING WALLET --------' . PHP_EOL, FILE_APPEND);
//
////            if ($ledgio->getWarningMessage() != 'MONTANT_TRADE_SUP_WALLET') {
//
////                // echo 'MONTANT_TRADE_SUP_WALLET non enregistré dans la table ledgio'; exit;
////                $ledgio->setWarningMessage('MONTANT_TRADE_SUP_WALLET_CORRIGE');
////                $this->entityManager->persist($ledgioEntity);
////                $this->entityManager->flush();
////            } else {
////                echo 'toto'; exit;
////            }
//
//            if (strtoupper($ledgio->getTradedDevise()->getCode()) == 'NEXO' || $ledgio->getReceivedDevise()->getCode() == 'NEXO') {
//                echo 'qte avant echange';
//                //var_dump($this->instantWalletAvantCession[$ledgio->getTradedDevise()->getId()]);
//                echo $quantiteMonaieVenduDansPortefeuille;
//
//
//                file_put_contents($this->outputDir . 'processLineLedgioForRapporWarning.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteReceived : ' .  abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) . PHP_EOL, FILE_APPEND);
//
//            }
//            file_put_contents($this->outputDir . 'log-erreur-wallet-ledgio-1.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteTraded : ' . $qtyTraded . PHP_EOL, FILE_APPEND);
//
//            if ($autoCorrection) {
//                if (strtoupper($ledgio->getTradedDevise()->getCode()) == 'NEXO') {
////                    echo 'titi';
////                    $dateTime->format('Y-m-d H:i:s');
////                    exit;
//
////                    var_dump($dateTime->format('Y-m-d H:i:s'));
////
////                    var_dump($deviseTraded->getCode());
////                    var_dump(round($quantiteMonaieVenduDansPortefeuille - $qtyTraded, 8));
//                    file_put_contents($this->outputDir . 'processLineLedgioForAutocorrection.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteReceived : ' .  abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) . PHP_EOL, FILE_APPEND);
//
//                }
//
//
//
//
//
//                $ledgioCorrection = new Ledgio(array(
//                    'datetimeTransaction' => $this->correctionWalletAddTransactionDateTime,
//                    'user' => $this->user,
//                    'exchange' => $this->exchangeInconnu,
//                    'type' => 'BUY',
//                    'pair' => 'EUR' . '-' . $deviseTraded->getCode(),
//                    //                        'fees' => $this->getFee($arrayLine),
//                    'feesAmount' => 0,
//                    'feesDevise' => null,
//                    'feesCurrency' => null,
//                    'feesEUR' => 0,
//                    'tradedAmount' => 0,
//                    'tradedCurrency' => $this->deviseEUR->getCode(),
//                    'tradedDevise' => $this->deviseEUR,
//                    'receivedAmount' => abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded),
//                    'receivedCurrency' => $deviseTraded->getCode(),
//                    'receivedDevise' => $deviseTraded,
//                    'transactionId' => '',
//                    'import' => null
//                ));
//                $ledgioCorrection->setUser($this->user);
//                $this->nameFileToArrayLedgioCorrection[$ledgio->getImport()->getName()][] = $ledgioCorrection;
//
//                file_put_contents($this->outputDir . 'processLineLedgioEntityInArray.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteReceived : ' .  abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) . PHP_EOL, FILE_APPEND);
//
//
//
//
//                //file_put_contents($this->outputDir . 'log-erreur-wallet-ledgio-2.txt', $dateTime->format('Y-m-d H:i:s') . 'code : '. $deviseTraded->getCode() .  ', qtewallet : ' . ' ' . $quantiteMonaieVenduDansPortefeuille . ', qteReceived : ' .  abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) . PHP_EOL, FILE_APPEND);
//
////                    var_dump(json_decode($ledgio->getMultiline()));
////                    echo '------------';
//
//
//                $ledgio->setWarningMessage('MONTANT_TRADE_SUP_WALLET_CORRIGE');
//                $this->entityManager->flush();
//            } else {
//                $ledgio->setWarningMessage('MONTANT_TRADE_SUP_WALLET');
//                $this->entityManager->flush();
////                exit;
////                if($ledgio->getWarningMessage() != 'MONTANT_TRADE_SUP_WALLET') {
////                    $ledgio->setWarningMessage('MONTANT_TRADE_SUP_WALLET');
////                    $this->entityManager->persist($ledgio);
////                    $this->entityManager->flush();
////                }
//                try {
//                    if (empty($this->arrayWarningWalletQte[$deviseTraded->getCode()])) {
//                        $this->arrayWarningWalletQte[$deviseTraded->getCode()] = [];
//                    }
//
//                    $lastValueQteManquante = !empty($this->arrayWarningWalletQte[$deviseTraded->getCode()]) ? end($this->arrayWarningWalletQte[$deviseTraded->getCode()])['qteManquante'] : 0;
////var_dump($lastValueQteManquante);
//                    $this->arrayWarningWalletQte[$deviseTraded->getCode()][] = [
//                        'dateTime' => $dateTime,
//                        'qteOut' => $qtyTraded,
//                        'cumulAvantTransaction' => $quantiteMonaieVenduDansPortefeuille,
//                        'cumulApresTransaction' => $quantiteMonaieVenduDansPortefeuille - $qtyTraded,
//                        'qteManquante' => abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded),
//                        'cumulQteManquante' => abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) + $lastValueQteManquante
//                    ];
//                } catch (\Exception $exception) {
//                    var_dump($quantiteMonaieVenduDansPortefeuille);
//                }
//            }
//        } else {
//                // echo 'MONTANT_TRADE_SUP_WALLET non enregistré dans la table ledgio'; exit;
//                $ledgio->setWarningMessage('');
//                $this->entityManager->persist($ledgio);
//                $this->entityManager->flush();
//        }
//        // Fin génération de la valeur de warning si on cherche à vendre des cryptos qu'on n'a pas
//
//
////        if ($dateTime < new DateTime('2019-01-01 00:00:00')) {
////            $this->processLineLedgioBefore2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
////        } else {
////            $this->processLineLedgioAfterJanvier2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
////        }
//        // Mise à jour du wallet
//        if (isset($this->instantWallet[$deviseReceived->getId()])) {
//            $this->instantWallet[$deviseReceived->getId()] = ['devise' => $deviseReceived, 'qty' => $qtyReceived + $this->instantWallet[$deviseReceived->getId()]['qty']];
//        } else {
//            $this->instantWallet[$deviseReceived->getId()] = ['devise' => $deviseReceived, 'qty' => $qtyReceived];
//        }


    }


    protected function processLineLedgio($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection = false, $processForRapportFiscal = false, $debug = false)
    {

        file_put_contents($this->outputDir . 'log-line-ledgio-debut.txt', $dateTime->format('Y-m-d H:i:s') . ' ' .$ledgioEntity->getId() .  PHP_EOL, FILE_APPEND);

        $quantiteMonaieVenduDansPortefeuille = (isset($this->instantWallet[$deviseTraded->getId()]) && isset($this->instantWallet[$deviseTraded->getId()]['qty'])) ? $this->instantWallet[$deviseTraded->getId()]['qty'] : 0;

        // Début génération de la valeur de warning si on cherche à vendre des cryptos qu'on n'a pas
        if (!$this->isFiat($deviseTraded) &&
            round($quantiteMonaieVenduDansPortefeuille - $qtyTraded, 8) < -0.0000001) {
//var_dump(round($quantiteMonaieVenduDansPortefeuille - $qtyTraded, 8) ); exit;
            if ($processForRapportFiscal == true) {
                var_dump($dateTime->format('Y-m-d H:i:s'));
                var_dump($this->isFiat($deviseTraded));
                var_dump($deviseTraded->getCode());
                var_dump(round($quantiteMonaieVenduDansPortefeuille - $qtyTraded, 8));
                exit;
                throw \Exception('Il y a des erreurs dans le wallet. Veuillez les corriger.');
            }

            if (empty($this->arrayWarningWalletQte[$deviseTraded->getCode()])) {
                $this->arrayWarningWalletQte[$deviseTraded->getCode()] = [];
            }

            $lastValueQteManquante = !empty($this->arrayWarningWalletQte[$deviseTraded->getCode()]) ? end($this->arrayWarningWalletQte[$deviseTraded->getCode()])['qteManquante'] : 0;
//var_dump($lastValueQteManquante);
            $this->arrayWarningWalletQte[$deviseTraded->getCode()][] = [
                'dateTime' => $dateTime,
                'qteOut' => $qtyTraded,
                'cumulAvantTransaction' => $quantiteMonaieVenduDansPortefeuille,
                'cumulApresTransaction' => $quantiteMonaieVenduDansPortefeuille - $qtyTraded,
                'qteManquante' => abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded),
                'cumulQteManquante' => abs($quantiteMonaieVenduDansPortefeuille - $qtyTraded) + $lastValueQteManquante
            ];


        }
        // Fin génération de la valeur de warning si on cherche à vendre des cryptos qu'on n'a pas

        if ($processForRapportFiscal) {
            // 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($deviseReceived, $qtyReceived, $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')) {
                $this->processLineLedgioBefore2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
            } else {
                $this->processLineLedgioAfterJanvier2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
            }
            if ($this->isFiat($deviseTraded)) {
                file_put_contents($this->outputDir . 'log-line-ledgio-debut-fiat.txt', $dateTime->format('Y-m-d H:i:s') . ' ' .$ledgioEntity->getId() .  PHP_EOL, FILE_APPEND);

                $this->updateInvestFiat($deviseTraded, $qtyTraded);
                if ($dateTime >= new DateTime('2019-01-01 00:00:00')) {
                    file_put_contents($this->outputDir . 'log-line-ledgio-milieu-invest-fiat.txt', $dateTime->format('Y-m-d H:i:s') . ' ' .$ledgioEntity->getId() .  PHP_EOL, FILE_APPEND);

                    $this->updateInvestFiatAfter2019($deviseTraded, $qtyTraded, $dateTime);

                    file_put_contents($this->outputDir . 'log-line-ledgio-after-invest.txt', $dateTime->format('Y-m-d H:i:s') . ' ' .$ledgioEntity->getId() .  PHP_EOL, FILE_APPEND);

                }
            }




            // Evolution du portefeuille dans le temps
            if (!$this->isFiat($deviseReceived)) {
                if (empty($this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()])) {
                    $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] = 0;
                }
                if (empty($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()])) {
                    $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()] = 0;
                }

                $cumulInAvantTransaction = !empty($this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()]) ? $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] : 0;
                $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] += $qtyReceived;
                $this->arrayExplicationWalletApres2019[$deviseReceived->getCode()][] = [
                    'dateTime' => $dateTime,
                    'qteIn' => $qtyReceived,
                    'cumulAvantTransaction' => $cumulInAvantTransaction,
                    'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()]
                ];
            }
            if (!$this->isFiat($deviseTraded)) {
                if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
                    $this->arrayExplicationWalletApres2019[$deviseReceived->getCode()] = [];
                }
                if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
                    $this->arrayExplicationWalletApres2019[$deviseTraded->getCode()] = [];
                }

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

                if (empty($this->arrayExplicationWalletCumulApres2019)) {
                    $this->arrayExplicationWalletApres2019 = [];
                }

                if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
                    $this->arrayExplicationWalletApres2019[$deviseTraded->getCode()] = [];
                }


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

        }
        // Mise à jour du wallet
        if (!$this->isFiat($deviseReceived)) {
            if (isset($this->instantWallet[$deviseReceived->getId()])) {
                $this->instantWallet[$deviseReceived->getId()] = ['devise' => $deviseReceived, 'qty' => $qtyReceived + $this->instantWallet[$deviseReceived->getId()]['qty']];
            } else {
                $this->instantWallet[$deviseReceived->getId()] = ['devise' => $deviseReceived, 'qty' => $qtyReceived];

            }
        }
        if (!$this->isFiat($deviseTraded)) {
            if (isset($this->instantWallet[$deviseTraded->getId()])) {
                $this->instantWallet[$deviseTraded->getId()] = ['devise' => $deviseTraded, 'qty' => $this->instantWallet[$deviseTraded->getId()]['qty']- $qtyTraded];
            } else {
                //throw new \Exception('erreur de wallet');

            }
        } else {

        }
        file_put_contents($this->outputDir . 'log-line-ledgio-fin.txt', $dateTime->format('Y-m-d H:i:s') . ' ' .$ledgioEntity->getId() .  PHP_EOL, FILE_APPEND);



    }

//    protected function processLineLedgioOld($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection = false, $debug = false)
//    {
//
//        file_put_contents($this->outputDir . 'log-line-ledgio.txt', $dateTime->format('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
//        // 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' => $deviseReceived,
//            'qtyReceived' => $qtyReceived,
//            'deviseTraded' => $deviseTraded,
//            'qtyTraded' => $qtyTraded,
//            'exchangeName' => $exchangeName,
//            'tradedId' => $tradeId];
//
//        $arrayExplicationLineLedgio = [
//            'dateTime' => $dateTime->format('Y-m-d H:i:s'),
//            'deviseReceived' => $deviseReceived->getCode(),
//            'qtyReceived' => $qtyReceived,
//            'deviseTraded' => $deviseTraded->getCode(),
//            'qtyTraded' => $qtyTraded,
//            'exchangeName' => $exchangeName,
//            'tradedId' => $tradeId];
//
//        // Cas des échanges avant 2019
//        if ($dateTime < new DateTime('2019-01-01 00:00:00')) {
//            $this->processLineLedgioBefore2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
//        } 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($deviseReceived, $qtyReceived, $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')) {
//            $this->processLineLedgioAfterJanvier2019($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $dateTime, $mvtType, $exchangeName, $tradeId, $fraisCessionEUR = 0, $ledgioEntity, $autoCorrection, $debug);
//
//        }
//
//
//        // Evolution du wallet
//        if (!$this->isFiat($deviseReceived)) {
//            if (empty($this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()])) {
//                $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] = 0;
//            }
//            if (empty($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()])) {
//                $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()] = 0;
//            }
//
//            $cumulInAvantTransaction = !empty($this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()]) ? $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] : 0;
//            $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()] += $qtyReceived;
//            $this->arrayExplicationWalletApres2019[$deviseReceived->getCode()][] = [
//                'dateTime' => $dateTime,
//                'qteIn' => $qtyReceived,
//                'cumulAvantTransaction' => $cumulInAvantTransaction,
//                'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseReceived->getCode()]
//            ];
//        }
//
//        if (!$this->isFiat($deviseTraded)) {
//            if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
//                $this->arrayExplicationWalletApres2019[$deviseReceived->getCode()] = [];
//            }
//            if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
//                $this->arrayExplicationWalletApres2019[$deviseTraded->getCode()] = [];
//            }
//
//            if (empty($this->arrayExplicationWalletCumulApres2019)) {
//                $this->arrayExplicationWalletCumulApres2019 = [];
//            }
//            if (empty($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()])) {
//                $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()] = 0;
//            }
//
//            if (empty($this->arrayExplicationWalletCumulApres2019)) {
//                $this->arrayExplicationWalletApres2019 = [];
//            }
//
//            if (empty($this->arrayExplicationWalletApres2019[$deviseTraded->getCode()])) {
//                $this->arrayExplicationWalletApres2019[$deviseTraded->getCode()] = [];
//            }
//
//
//            $cumulOutAvantTransaction = !empty($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()]) ? $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()] : 0;
//            $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()] -= $qtyTraded;
//            $this->arrayExplicationWalletApres2019[$deviseTraded->getCode()][] = [
//                'dateTime' => $dateTime,
//                'qteOut' => $qtyTraded,
//                'cumulAvantTransaction' => $cumulOutAvantTransaction,
//                'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()]
//            ];
//
//            if (round($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()], 8) < -0.00000001) {
//                if (empty($this->arrayWarningWalletQte[$deviseTraded->getCode()])) {
//                    $this->arrayWarningWalletQte[$deviseTraded->getCode()] = [];
//                }
//                $this->arrayWarningWalletQte[$deviseTraded->getCode()][] = [
//                    'deltaRound' => round($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()], 8),
//                    'delta' => $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()],
//                    'dateTime' => $dateTime,
//                    'qteOut' => $qtyTraded,
//                    'cumulAvantTransaction' => $cumulOutAvantTransaction,
//                    'cumulApresTransaction' => $this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()]
//                ];
//
//
//                if ($autoCorrection) {
//                    $tradedDeviseCorrection = $this->mapperDevise->findByCode('EUR');
//                    // correction automatique des cryptos manquantes
//                    $dateTimeCorrection = new DateTime($dateTime->format('Y-m-d H:') . '00:00');
//
//                    $exchange = $this->mapperExchange->findByName('inconnu');
//
//                    $mapperImport = new \Application\Mapper\ImportMapper($this->entityManager);
//
//                    $fileNameCorrection = 'historique-c-' . $ledgioEntity->getImport()->getName() . '.csv';
//                    $filePathCorrection = $this->inputCsvDirectory . '/exchange-generique/historique-c-' . $ledgioEntity->getImport()->getName() . '.csv';
//                    $importCorrection = $mapperImport->findByName($fileNameCorrection);
//                    if (count($importCorrection) == 0) {
//                        $importCorrection = new \Application\Entity\Import(
//                            array(
//                                'user' => $this->user,
//                                'exchange' => $exchange,
//                                'sourceType' => 'csv',
//                                'name' => $fileNameCorrection,
//                                'path' => $filePathCorrection,
//                                'nombreTrade' => 0,
//                                'datetimeImport' => new \DateTime()
//                            ));
//                        $mapperImport->insert($importCorrection);
//                    } else {
//                        $importCorrection = $importCorrection[0];
//                    }
//
//                    $importCorrection->setNombreTrade($importCorrection->getNombreTrade() + 1);
//                    $ledgioCorrection = new Ledgio(array(
//                        'datetimeTransaction' => $dateTimeCorrection,
//                        'user' => $this->user,
//                        'exchange' => $exchange,
//                        'type' => 'BUY',
//                        'pair' => 'EUR' . '-' . $deviseTraded->getCode(),
//                        //                        'fees' => $this->getFee($arrayLine),
//                        'feesAmount' => 0,
//                        'feesDevise' => null,
//                        'feesCurrency' => null,
//                        'feesEUR' => 0,
//                        'tradedAmount' => 0,
//                        'tradedCurrency' => $tradedDeviseCorrection->getCode(),
//                        'tradedDevise' => $tradedDeviseCorrection,
//                        'receivedAmount' => abs($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()]),
//                        'receivedCurrency' => $deviseTraded->getCode(),
//                        'receivedDevise' => $deviseTraded,
//                        'transactionId' => '',
//                        'import' => $importCorrection
//                    ));
//
//                    if (!is_file($this->inputCsvDirectory . '/exchange-generique/historique-c-' . $ledgioEntity->getImport()->getName() . '.csv')) {
//                        //unlink($this->inputCsvDirectory . '/historique-c.csv');
//                        $stringCsv = 'Date (UTC),Exchange,Monnaie tradée,Montant tradé,Monnaie reçue,Montant reçu,Monnaie frais,Montant frais' . PHP_EOL;
//                        file_put_contents($this->inputCsvDirectory . '/exchange-generique/historique-c-' . $ledgioEntity->getImport()->getName() . '.csv', $stringCsv);
//                    }
//
//                    $stringCsv2 = $dateTimeCorrection->format('Y-m-d H:i:s') . ',' . $exchange->getName() . ',' . $tradedDeviseCorrection->getCode() . ',0' . $deviseTraded->getCode() . ',' . abs($this->arrayExplicationWalletCumulApres2019[$deviseTraded->getCode()]) . PHP_EOL;
//                    // echo $this->inputCsvDirectory . '/exchange-generique/historique-c-' . $ledgioEntity->getImport()->getName().'.csv'; exit;
//
//
//                    file_put_contents($this->inputCsvDirectory . '/exchange-generique/historique-c-' . $ledgioEntity->getImport()->getName() . '.csv', $stringCsv2, FILE_APPEND | LOCK_EX);
////                    var_dump($ledgio); exit;
//
//                    $ledgioCorrection->setUser($this->user);
//                    $this->entityManager->persist($ledgioCorrection);
////                    var_dump(json_decode($ledgio->getMultiline()));
////                    echo '------------';
//
//
//                    $ledgioEntity->setWarningMessage('MONTANT_TRADE_SUP_WALLET_CORRIGE');
//                    $this->entityManager->flush();
//                }
//            }
//        }
//
//        if ($doScreenShot === true) {
//            $this->arrayTransactionsCessionFiatAnneeImposition[] = [
//                'deviseIn' => $deviseReceived,
//                'qtyIn' => $qtyReceived,
//                'deviseOut' => $deviseTraded,
//                'qtyOut' => $qtyTraded,
//                'datetime' => $dateTime,
//                'type' => $mvtType,
//                'exchangeName' => $exchangeName,
//                'tradeId' => $tradeId,
//                'fraisCession' => $fraisCessionEUR
//            ];
//            $this->generateReportLineAfter2019($qtyReceived, $dateTime, $exchangeName, $tradeId, $fraisCessionEUR, $deviseTraded);
//
//            if ($dateTime >= new DateTime($this->anneeImposition . '-01-01 00:00:00') && $dateTime <= new DateTime($this->anneeImposition . '-12-31 23:59:59')) {
//                $arrayExplicationLineLedgio['lineReportAfter2019'] = $this->arrayRapportAnnexePrincipale[sizeof($this->arrayRapportAnnexePrincipale) - 1];
//            }
//        }
//        $this->processOutLedgio($deviseTraded, abs($qtyTraded), $dateTime);
//
//
//        $this->arrayExplicationLedgio[] = $arrayExplicationLineLedgio;
//
//
//    }

    // Début processLineLedgio2048m
    protected function processLineLedgio2048m($deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $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'), $deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $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($deviseReceived)) {
                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[$deviseReceived->getCode()])) {
                    if ($debug) {
                        $this->logAcquisitionAvant2019('=> Devise In non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    }
                    $this->arrayAcquisitionBefore2019[$deviseReceived->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($deviseTraded)) {
                    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 ($deviseTraded->getCode() !== 'EUR') {
                        if ($debug) {
                            $this->logAcquisitionAvant2019('=> fiat out n\'est pas EUR' . PHP_EOL);
                        }

                        $price = $this->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);

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

                    $infosOld = [];
                    $infosOld[] = ['deviseReceived' => $deviseReceived, 'qteReceived' => $qtyReceived, 'deviseTraded' => $deviseTraded, 'qteTraded' => $qtyTraded, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];


                    $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = [
                        'qteAcquisition' => $qtyReceived,
                        'prixEURAcquisition' => $prixEuro,
                        'prixUnitaireEURAcquisition' => $prixEuro / $qtyReceived,
                        'datetimeAcquisition' => $dateTime,
                        'qte' => $qtyReceived,
                        'prixUnitaireEUR' => $prixEuro / $qtyReceived,
                        '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->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);
                    $prixEuro = $qtyReceived * $price;
                    $this->logAcquisitionAvant2019('ajout de ' . $qtyReceived . ' ' . $deviseReceived->getCode() . ' valorisés pour un total de ' . $prixEuro . 'EUR' . '(' . $qtyTraded . ' ' . $deviseTraded->getCode() . ')' . PHP_EOL);
                    $infosOld = [];
                    $infosOld[] = ['deviseReceived' => $deviseReceived, 'qteReceived' => $qtyReceived, 'deviseTraded' => $deviseTraded, 'qteTraded' => $qtyTraded, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];

                    $this->arrayAcquisitionBefore2019[$deviseReceived->getCode()][] = [
                        'qteAcquisition' => $qtyReceived,
                        'prixEURAcquisition' => $prixEuro,
                        'prixUnitaireEURAcquisition' => $prixEuro / $qtyReceived,
                        'datetimeAcquisition' => $dateTime,
                        'qte' => $qtyReceived,
                        'prixUnitaireEUR' => $prixEuro / $qtyReceived, '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($deviseTraded)) {
                if ($debug) {
                    $this->logAcquisitionAvant2019('=> Devise Out is not fiat ?' . PHP_EOL);
                }

                // initialisation des prix et qté à sortir
                //        $prixEurOut = 0;
                $i = 0;
                $qtyTradedTmp = $qtyTraded;

                // 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[$deviseTraded->getCode()])) {
                    if ($debug) {
                        $this->logAcquisitionAvant2019('=> Devise Out non trouvé dans le wallet on crée une clé dans le tableau' . PHP_EOL);
                    }
                    $this->arrayAcquisitionBefore2019[$deviseTraded->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 ($deviseReceived->getCode() != 'EUR') {
                    $txConversion = $this->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);
                    $priceEUR = $txConversion * $qtyReceived;
                } else {
                    $priceEUR = $qtyReceived;
                }

                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[$deviseTraded->getCode()]) && $qtyTradedTmp > 0) {

                    $arrayBuyCrypto = $this->arrayAcquisitionBefore2019[$deviseTraded->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 ($qtyTradedTmp <= $arrayBuyCrypto['qte']) {
                        // calcul du nouveau montant total d'acquisiton en EUR
                        $newPrixEuro = $arrayBuyCrypto['prixEuro'] - ($qtyTradedTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte']);
                        $newQte = $arrayBuyCrypto['qte'] - $qtyTradedTmp;

                        // 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' => $qtyTradedTmp,
                                'qteRestanteWallet' => $arrayBuyCrypto['qte'] - $qtyTradedTmp,
                                'qteRestanteACeder' => 0,
                                'prixUnitaireEUR' => $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'],
                                'infosAchatInit' => $arrayBuyCrypto['infosAchatInit'],
                                'diffDetention' => $dateTime->diff($arrayBuyCrypto['datetimeAcquisition']),
//                                'commentaire' => '3 ' . $arrayBuyCrypto['qte']
                            ];
//                            $totalEURAcquisitionFIFO += $qtyTradedTmp * $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'];
                            $totalEURAcquisitionFIFO += $qtyTradedTmp * $arrayBuyCrypto['prixUnitaireEURAcquisition'];
                        }
                        if ($debug) {
                            $this->logAcquisitionAvant2019('Mise à jour acquisition ' . $newQte . ' ' . $deviseTraded->getCode() . ' pour ' . $newPrixEuro . ' EUR' . PHP_EOL);
                        }
                        if (empty($infosOld = $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i]['infosAchatInit'])) {
                            $infosOld = [];
                        } else {
                            $infosOld = $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i]['infosAchatInit'];

                        }
                        $infosOld[] = ['deviseReceived' => $deviseReceived, 'qteReceived' => $qtyReceived, 'deviseTraded' => $deviseTraded, 'qteTraded' => $qtyTraded, 'datetime' => $dateTime, 'exchange' => $exchangeName, 'tradeId' => $tradeId, 'fraisCessionEUR' => $fraisCessionEUR];
                        $this->arrayAcquisitionBefore2019[$deviseTraded->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[$deviseTraded->getCode()], true));
                        }
                        // on passe la qté restante à 0;
                        $qtyTradedTmp = 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' => $qtyTradedTmp - $arrayBuyCrypto['qte'],
                                    'prixUnitaireEUR' => $arrayBuyCrypto['prixEuro'] / $arrayBuyCrypto['qte'],
                                    'infosAchatInit' => $arrayBuyCrypto['infosAchatInit'],
                                    'diffDetention' => $dateTime->diff($arrayBuyCrypto['datetimeAcquisition'])
//                                    'commentaire' => '5 ' . $arrayBuyCrypto['qte']
                                ];


//                                $totalEURAcquisitionFIFO += $qtyTradedTmp * $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'] . ' ' . $deviseTraded->getCode() . ' de l\'acquisition ' . $i . PHP_EOL);
                            }
                            $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()][$i]['qte'] = 0;
                            if ($debug) {
                                $this->logAcquisitionAvant2019(print_r($this->arrayAcquisitionBefore2019[$deviseTraded->getCode()], true));
                            }
                            $qtyTradedTmp = $qtyTradedTmp - $arrayBuyCrypto['qte'];
                            if ($debug) {
                                $this->logAcquisitionAvant2019('il reste ' . $qtyTradedTmp . ' ' . $deviseTraded->getCode() . ' à soustraire par la méthode FIFO' . PHP_EOL);
                            }
                        }
                        $this->arrayAcquisitionBefore2019[$deviseTraded->getCode()] = array_values($this->arrayAcquisitionBefore2019[$deviseTraded->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 ($qtyTradedTmp > 0) {
                        $this->logAcquisitionAvant2019('Vous cherchez à vendre des crypto que vous n\'avez pas : ' . $qtyTradedTmp . ' ' . $deviseTraded->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($deviseTraded)) {
            // on prend les transactions de plus de 5000 EUR
            //$price in EUR
            if ($deviseReceived->getCode() != 'EUR') {
                $txConversion = $this->exchangeRateService->getPriceInEuroFromDevise($deviseReceived, $dateTime);
                $priceEUR = $txConversion * $qtyReceived;
            } else {
                $priceEUR = $qtyReceived;
            }


            $txConversionOut = $this->exchangeRateService->getPriceInEuroFromDevise($deviseTraded, $dateTime);
            $priceEUROut = $txConversionOut * $qtyTraded;


            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' => $deviseReceived,
                    'qtyIn' => $qtyReceived,
                    'deviseOut' => $deviseTraded,
                    'qtyOut' => $qtyTraded,
                    'datetime' => $dateTime,
                    'type' => $mvtType,
                    'exchangeName' => $exchangeName,
                    'tradeId' => $tradeId,
                    'fraisCession' => $fraisCessionEUR,
                    'priceEUR' => $priceEUR,
                    'priceEUROut' => $priceEUROut,
                    'totalEURAcquisitionFIFO' => $totalEURAcquisitionFIFO,
                    'moyenneAnneeAquisition' => $moyenneAnneeAquisition
                ];
            }

        }

        $doScreenShot = $this->processInLedgio($deviseReceived, $qtyReceived, $dateTime);
        $this->processOutLedgio($deviseTraded, abs($qtyTraded), $dateTime);

        // si out n'est pas du fiat
    }

    // Fin processLineLedgio2048m

    protected function logDate($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-date', $str . PHP_EOL, FILE_APPEND | LOCK_EX);
    }

    protected function addLineConsolidationLedgio($date, $deviseReceived, $qtyReceived, $deviseTraded, $qtyTraded, $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 . '","' . $deviseReceived->getCode() . '","' . $qtyReceived . '","' . $deviseTraded->getCode() . '","' . $qtyTraded . '","' . $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;
        } else {
            file_put_contents($this->outputDir . 'log-prix-non-trouve-en-bdd.txt', $datetimeJour->format('Y-m-d') . ' ' .$devise->getCode() .  PHP_EOL, FILE_APPEND);
        }

        // Si pas en base getPrice via API cryptomarketcap

        try {
            if (!empty($devise->getIdCMC())) {
                return $this->CMCService->getPriceByIdCMC($devise->getIdCMC(), $datetimeJour, $devise);
            }
        } catch(\Exception $e) {
            file_put_contents($this->outputDir . 'log-prix-non-trouve-api-cmc.txt', $datetimeJour->format('Y-m-d') . ' ' .$devise->getCode() .  PHP_EOL, FILE_APPEND);

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

                    $price = $this->CoinAPIService->getPriceByCode($devise->getCode(), $datetimeJour);
                    return $price;
                }
            } catch(\Exception $e) {
                file_put_contents($this->outputDir . 'log-prix-non-trouve-api-coin.txt', $datetimeJour->format('Y-m-d') . ' ' .$devise->getCode() .  PHP_EOL, FILE_APPEND);

                throw new \Exception('prix non trouvé : ' . $devise->getCode() . ' le : '.$datetime->format('d-m-Y H:i:s'));
            }
        }
        throw new \Exception('prix non trouvé : ' . $devise->getCode() . ' le : '.$datetime->format('d-m-Y H:i:s'));
    }

    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($deviseReceived, $qtyReceived, $dateTime)
//    {
//        $dogenerateReportLineAfter2019 = false;
//        if (!$this->isFiat($deviseReceived)) {
////            var_dump($qtyReceived);
//            $this->updateWallet($deviseReceived, $qtyReceived, '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($deviseTraded, $qtyTraded, $dateTime)
//    {
//        if (!$this->isFiat($deviseTraded)) {
////            var_dump($qtyTraded);
//            $this->updateWallet($deviseTraded, $qtyTraded, 'out', $dateTime);
//        } else {
//            $this->updateInvestFiat($deviseTraded, $qtyTraded);
//            if ($dateTime >= new DateTime('2019-01-01 00:00:00')) {
//
//                $this->updateInvestFiatAfter2019($deviseTraded, $qtyTraded, $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, $qtyReceivedvest)
    {
        if (!array_key_exists($devise->getCode(), $this->investFiat)) {
            $this->investFiat[$devise->getCode()] = 0;
        }
        $this->investFiat[$devise->getCode()] = $this->investFiat[$devise->getCode()] + $qtyReceivedvest;
        //$this->logAnnexe('nouveau montant de fiat investi dans crypto suite à achat de crypto : ' . $this->investFiat['EUR'] . ' €' . PHP_EOL);
    }

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

        try {


        if ($devise->getCode() != 'EUR') {
            $taux = $this->getExchangeRates($devise->getCode(), $dateTime);
            $valueEUR = $qtyReceivedvest / $taux;
        } else {
            $valueEUR = $qtyReceivedvest;
        }
        if ($valueEUR > 0) {
            $this->investFiatAfter2019Detail[] = ['datetime' => $dateTime, 'code' => $devise->getCode(), 'qte' => $qtyReceivedvest, 'qteEUR' => $valueEUR];
        }
        } catch (\Exception $e) {

        }
        //$this->logAnnexe('nouveau montant de fiat investi dans crypto suite à achat de crypto : ' . $this->investFiat['EUR'] . ' €' . PHP_EOL);
    }

    public function getExchangeRates($currency, DateTime $dateTime)
    {

        $datetimeJour = clone $dateTime;
        //@todo call data market
        //$value = 0;
        // on récupère le prix approximatif de la journée

        $devise = $this->mapperDevise->findByCode($currency);
        //@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;
        }


        $urlApi = 'https://api.exchangeratesapi.io/';
        // asset fsym

        $urlApi .= $dateTime->format('Y-m-d');
        $urlApi .= '?access_key=2b5b64a252e695d681021df1b3698414';
        $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);

        //$coursDevise = $this->mapperCoursDevise->findByDeviseAndDate($devise, $datetimeclone->setTime(0, 0, 0));

        if (!isset($data['rates'][$currency])) {

            // api fixer
            $urlApiFixer = 'http://data.fixer.io/api/';
            $urlApiFixer .= $dateTime->format('Y-m-d');
            $urlApiFixer .= '?access_key=d9fcc73341933d19085b71f734f053a1';
            $urlApiFixer .= '&base=EUR';
            $urlApiFixer .= '&symbols='.$currency;
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $urlApiFixer);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            $rawData = curl_exec($curl);
            $data = json_decode($rawData, true);
            curl_close($curl);



            if (!isset($data['rates'][$currency])) {
                throw new \Exception('Taux de change non trouvé pour : ' . $currency . ' le : ' . $dateTime->format('Y-m-d') . '(' . $urlApi . ' ' . $urlApiFixer .')');
                $price = 0;
            }
        }
        if (empty($data['rates'][$currency])) {
            throw new \Exception('Taux de change non trouvé pour : ' . $currency . ' le : ' . $dateTime->format('Y-m-d') . '(' . $urlApi . ' ' . $urlApiFixer .')');

        }
        $newCoursDevise = new CoursDevise();
        $newCoursDevise->setDevise($devise);
        $newCoursDevise->setCoursEuro($data['rates'][$currency]);
        $newCoursDevise->setDateCours($datetimeJour);

        $this->mapperCoursDevise->insert($newCoursDevise);
        return $data['rates'][$currency];

    }
//$this->generateReportLineAfter2019($qtyReceived, $dateTime, $exchangeName, $tradeId, $fraisCessionEUR, $deviseTraded, $qtyTraded);

    protected function generateReportLineAfter2019($prixCessionBrut, $dateTime, $exchangeName, $tradeId, $fraisCession = 0, $deviseTraded,$qtyTraded)
    {

        // 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;

            file_put_contents($this->outputDir . 'log-generateReportLineAfter2019-debut.txt', date('H:i:s') . ' : ' . $dateTime->format('Y-m-d H:i:s') . ' count wallet : ' .count($this->instantWallet) .  PHP_EOL, FILE_APPEND);

            if (!empty($this->instantWallet && is_array($this->instantWallet))) {
                foreach ($this->instantWallet as $id => $arrayInfo) {
                    if (!empty($arrayInfo['qty'])) {
                        $price = $this->exchangeRateService->getPriceInEuroFromDevise($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() == $deviseTraded->getCode()) {
                                $price = ($prixCessionBrut - $fraisCession) / $qtyTraded;
                                $totalValueCrypto = $totalValueCrypto + $arrayInfo['qty'] * $price;

                            } 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' => ($deviseTraded->getCode() == $arrayInfo['devise']->getCode() ? $prixCessionBrut - $fraisCession : '')];
                            $arrayCessionWalletDetail['wallet'][] = ['datetime' => $dateTime, 'devise' => $arrayInfo['devise']->getCode(), 'qty' => $arrayInfo['qty'], 'unitPrice' => $price, 'total' => $arrayInfo['qty'] * $price, 'totalReel' => ($deviseTraded->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;
//                }

            }
            file_put_contents($this->outputDir . 'log-generateReportLineAfter2019-fin.txt', date('H:i:s') . ' : ' . $dateTime->format('Y-m-d H:i:s') . ' count wallet : ' .count($this->instantWallet) .  PHP_EOL, FILE_APPEND);


            $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->exchangeRateService->getPriceInEuroFromDevise($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
        // debug avril
//var_dump($this->investFiatAfter2019);
        $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;
            // debug avril
//var_dump($acquisitionFiatDepuisDerniereCession);
//            var_dump($this->sommePrixAcquites); exit;
            // 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);
// debug avril
            $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;

            $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
            ]);

        }

    }

    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);
    }
}


??

??