Current path: home/webdevt/cryptoimpot.fr/module/Application/src/Service/
?? Go up: /home/webdevt/cryptoimpot.fr/module/Application/src
<?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);
}
}