Current path: home/webdevt/cryptoimpot.fr/module/Application/src/Service/ExchangeService/
?? Go up: /home/webdevt/cryptoimpot.fr/module/Application/src/Service
<?php
namespace Application\Service\ExchangeService;
use Application\Entity\Ledgio;
use Application\Mapper\LedgioMapper;
use PHPUnit\Util\Exception;
/**
* Description of KrakenService
*
* @author jimmy
*/
class ExchangeGeneriqueService extends BaseService
{
const ERROR_TITLE_CSV_COL_REQUIRED = 'Le csv ne comporte pas les entêtes requis : [REQUIRED_COLUMN]';
const ERROR_MESSAGE_CSV_COL_REQUIRED = 'Vérifiez que vous êtes sur la bonne page d\'importation. Changez d\'onglet s\'il s\'agit d\'un fichier provenant d\'une autre platteforme que Kraken.';
protected $file;
protected $requiredColumn = array(
'Date (UTC)',
'Exchange',
'Montant tradé',
'Monnaie tradée',
'Montant reçu',
'Monnaie reçue',
'Montant frais',
'Monnaie frais'
);
protected $mapperCurrency = 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');
protected $columnCsv;
protected $errorMessage;
protected $contentFile;
protected $linesArray;
protected $ledgioMapper;
protected function getTimeIndex()
{
return $this->columnCsvMapper['Date (UTC)'];
}
protected function getExchangeIndex()
{
return $this->columnCsvMapper['Exchange'];
}
protected function getTradedAmountIndex()
{
return $this->columnCsvMapper['Montant tradé'];
}
protected function getTradedCurrencyIndex()
{
return $this->columnCsvMapper['Monnaie tradée'];
}
protected function getReceivedAmountIndex()
{
return $this->columnCsvMapper['Montant reçu'];
}
protected function getReceivedCurrencyIndex()
{
return $this->columnCsvMapper['Monnaie reçue'];
}
protected function getFeesAmountIndex()
{
return $this->columnCsvMapper['Montant frais'];
}
protected function getFeesCurrencyIndex()
{
return $this->columnCsvMapper['Monnaie frais'];
}
// protected function getPairIndex() {
// return $this->columnCsvMapper['pair'];
// }
// protected function getCostIndex() {
// return $this->columnCsvMapper['cost'];
// }
//
// protected function getFeeIndex() {
// return $this->columnCsvMapper['fee'];
// }
//
// protected function getVolIndex() {
// return $this->columnCsvMapper['vol'];
// }
//
// protected function getTxidIndex() {
// return $this->columnCsvMapper['txid'];
// }
// protected function getrarrayCurrencyFromStrKraken($pairStrKraken) {
//
//
// $i = 2;
// while ($i++ < strlen($pairStrKraken)) {
// $code1 = substr($pairStrKraken, 0, $i);
// //var_dump($code1);
// $devise1 = $this->mapperDeviseKraken->findByCode($code1);
// if ($devise1) {
// break;
// }
// }
//
// if (empty($devise1)) {
//
// $devise1 = $this->mapperDeviseKraken->findByCode(substr('Z' . $code1));
// }
//
// if (empty($devise1)) {
//
// $devise1 = $this->mapperDeviseKraken->findByCode(substr('X' . $code1));
// }
//
//// if (empty($devise1)) {
//// $i = 2;
//// while ($i++ < strlen($pairStrKraken)) {
//// $code1 = substr($pairStrKraken, 1, $i);
//// //var_dump($code1);
//// $devise1 = $this->mapperDeviseKraken->findByCode($code1);
//// if ($devise1) {
//// break;
//// }
//// }
//// }
//
// $code2 = substr($pairStrKraken, $i);
// $devise2 = $this->mapperDeviseKraken->findByCode($code2);
// if (empty($devise2)) {
//
// $devise2 = $this->mapperDeviseKraken->findByCode(substr('Z' . $code2, 0, strlen($code2)));
// }
//
// if (empty($devise2)) {
//
// $devise2 = $this->mapperDeviseKraken->findByCode(substr('X' . $code2, 0, strlen($code2)));
// }
// if ($code1 === 'IOT') {
// //\Doctrine\Common\Util\Debug::dump($devise1);
// var_dump($devise1->getId());
// echo 'toto';
// }
// if ($code2 === 'XZEC') {
// //\Doctrine\Common\Util\Debug::dump($devise1);
// var_dump($devise2->getId());
// echo 'toto';
// }
//var_dump($str2);
//var_dump($devise1->getDevise()->getCode()); exit;
// if ($devise1 && $devise2) {
// return [$devise1->getCode(), $devise2->getCode()];
// } else {
// $str = '';
// if (!$devise1) {
// $str .= $code1 . ' ';
// }
// if (!$devise2) {
// $str .= $code2;
// }
//
// throw new Exception('Devise inconnue : ' . $str);
// exit;
// var_dump($code2);
// var_dump($code1);
// }
// }
protected function getTimestamp($arrayLine)
{
$dateStr = $arrayLine[$this->getTimeIndex()];
$dateTime = new \DateTime($dateStr);
return $dateTime->getTimestamp();
}
protected function getDatetime($arrayLine)
{
$dateStr = $arrayLine[$this->getTimeIndex()];
$dateTime = new \DateTime($dateStr);
return $dateTime;
}
protected function getExchange($arrayLine)
{
return $arrayLine[$this->getExchangeIndex()];
}
// protected function getFee($arrayLine) {
// return $arrayLine[$this->getFeeIndex()];
// }
protected function getPair($arrayLine)
{
$pairStrKraken = $arrayLine[$this->getPairIndex()];
$arrayAsset = $this->getrarrayCurrencyFromStrKraken($pairStrKraken);
//var_dump($arrayAsset); exit;
return $arrayAsset;
}
protected function getType($arrayLine)
{
$type = $arrayLine[$this->getTypeIndex()];
return $type;
}
protected function getTradedAmount($arrayLine)
{
return $arrayLine[$this->getTradedAmountIndex()];
}
protected function getTradedCurrency($arrayLine)
{
return $arrayLine[$this->getTradedCurrencyIndex()];
}
protected function getReceivedAmount($arrayLine)
{
return $arrayLine[$this->getReceivedAmountIndex()];
}
protected function getReceivedCurrency($arrayLine)
{
return $arrayLine[$this->getReceivedCurrencyIndex()];
}
protected function getFeesAmount($arrayLine)
{
return $arrayLine[$this->getFeesAmountIndex()];
}
protected function getFeesCurrency($arrayLine)
{
return $arrayLine[$this->getFeesCurrencyIndex()];
}
protected function getTxid($arrayLine)
{
$txId = $arrayLine[$this->getTxidIndex()];
return $txId;
}
public function getEntityManager()
{
return $this->entityManager;
}
public function __construct($file, $user, \Doctrine\ORM\EntityManager $em)
{
$mapperCoursDevise =
//ini_set('memory_limit', '512M');
$this->exchangeRateService = new \Application\Service\ExchangeRateService($em);
$this->file = $file;
$this->user = $user;
$this->entityManager = $em;
$this->ledgioMapper = new LedgioMapper($em);
// Mapper Devise
$mapperDeviseKraken = new \Application\Mapper\DeviseKrakenMapper($this->entityManager);
$this->mapperDeviseKraken = $mapperDeviseKraken;
$this->arrayMapperKraken = $mapperDeviseKraken->getArrayMapper();
$mapperDeviseBittrex = new \Application\Mapper\DeviseBittrexMapper($this->entityManager);
$this->arrayMapperBittrex = $mapperDeviseBittrex->getArrayMapper();
$mapperDevise = new \Application\Mapper\DeviseMapper($this->entityManager);
$this->initColFromCsv();
$mapperExchange = new \Application\Mapper\ExchangeMapper($em);
$exchange = $mapperExchange->findByName('Exchange Générique');
if ($this->isValid()) {
$mapperImport = new \Application\Mapper\ImportMapper($this->getEntityManager());
$mapperDevise = new \Application\Mapper\DeviseMapper($this->getEntityManager());
$importEntity = new \Application\Entity\Import(
array(
'user' => $user,
'exchange' => $exchange,
'sourceType' => 'csv',
'name' => basename($file),
'path' => $file,
'nombreTrade' => 0,
'datetimeImport' => new \DateTime()
));
$mapperImport->insert($importEntity);
$this->ledgioMapper = new \Application\Mapper\LedgioMapper($em);
/* save */
$start = microtime(true);
$batchSize = 200;
//$user = $em->merge($user);
foreach ($this->linesArray as $index => $row) {
$row = trim($row);
if (empty($row)) {
continue;
}
//var_dump($row);
if ($index != 0) {
/* date */
$arrayLine = str_getcsv($row);
if (is_null($row)) {
continue;
}
$datetimeTransaction = $this->getDatetime($arrayLine);
if ($arrayLine[1] === 'toto') {
echo 'idex'; exit;
}
$exchange = $mapperExchange->findByName($this->getExchange($arrayLine));
if (empty($exchange)) {
echo 'echange';
var_dump($this->getExchange($arrayLine)); exit;
mail('jimmykurc@gmail.com', 'Exchange non reconnu', 'Exchange non reconnu : ' . $this->getExchange($arrayLine));
}
$tradedAmount = $this->getTradedAmount($arrayLine);
$tradedCurrency = $this->getTradedCurrency($arrayLine);
// $tradedDevise = $mapperDevise->findByCode($tradedCurrency);
if (!empty($this->arrayMapperKraken[$tradedCurrency])) {
$tradedDevise = $this->arrayMapperKraken[$tradedCurrency];
} elseif (!empty($this->arrayMapperBittrex[$tradedCurrency])) {
$tradedDevise = $this->arrayMapperBittrex[$tradedCurrency];
} else {
$tradedDevise = $mapperDevise->findByCode($tradedCurrency);
}
if (empty($tradedDevise)) {
var_dump($datetimeTransaction);
echo $tradedCurrency . 'traded devise';
var_dump($tradedCurrency);exit;
mail('jimmykurc@gmail.com', 'Devise Générique non reconnue', 'Devise Générique non reconnue : ' . $tradedCurrency);
}
$receivedAmount = $this->getReceivedAmount($arrayLine);
$receivedCurrency = $this->getReceivedCurrency($arrayLine);
if (!empty($this->arrayMapperKraken[$receivedCurrency])) {
$receivedDevise = $this->arrayMapperKraken[$receivedCurrency];
} elseif (!empty($this->arrayMapperBittrex[$receivedCurrency])) {
$receivedDevise = $this->arrayMapperBittrex[$receivedCurrency];
} else {
$receivedDevise = $mapperDevise->findByCode($receivedCurrency);
}
if (empty($receivedDevise)) {
echo 'empty received currency';
var_dump($receivedCurrency);exit;
mail('jimmykurc@gmail.com', 'Devise Générique non reconnue', 'Devise Générique non reconnue : ' . $receivedCurrency);
}
//fees
$feesAmount = $this->getFeesAmount($arrayLine);
$feesCurrency = $this->getFeesCurrency($arrayLine);
if (!empty($feesCurrency)) {
if (!empty($this->arrayMapperKraken[$feesCurrency])) {
$feesDevise = $this->arrayMapperKraken[$feesCurrency];
} elseif (!empty($this->arrayMapperBittrex[$feesCurrency])) {
$feesDevise = $this->arrayMapperBittrex[$feesCurrency];
} else {
$feesDevise = $mapperDevise->findByCode($feesCurrency);
}
} else {
$feesAmount = 0;
$feesDevise = null;
}
if ($tradedDevise instanceof \Application\Entity\Devise) {
$ledgioTradedDevise = $tradedDevise;
} else {
$ledgioTradedDevise = $tradedDevise->getDevise();
}
if ($receivedDevise instanceof \Application\Entity\Devise) {
$ledgioReceivedDevise = $receivedDevise;
} else {
$ledgioReceivedDevise = $receivedDevise->getDevise();
}
if ($ledgioReceivedDevise->getCode() === 'EUR') {
$receivedAmountInEUR = $receivedAmount;
} else {
$unitPriceReceivedInEUR = $this->getExchangeRateService()->getPriceInEuroFromDevise($ledgioReceivedDevise, $datetimeTransaction);
if ($unitPriceReceivedInEUR == 0) {
echo $datetimeTransaction->format('Y-m-d H:i:s');
echo $ledgioReceivedDevise->getId();
echo 'prix unitaire 0';
exit;
}
$receivedAmountInEUR = $receivedAmount * $unitPriceReceivedInEUR;
}
$ledgioFeesDevise = null;
$feesEUR = '';
if (!empty($feesDevise)) {
if ($feesDevise instanceof \Application\Entity\Devise) {
$ledgioFeesDevise = $feesDevise;
} else {
try {
$ledgioFeesDevise = $feesDevise->getDevise();
} catch (Exception $exception) {
var_dump($feesCurrency);
}
}
if (!empty($feesAmount)) {
if ($ledgioFeesDevise->getCode() === 'EUR') {
$feesEUR = $feesAmount;
} else {
$priceFees = $this->getExchangeRateService()->getPriceInEuroFromDevise($ledgioFeesDevise, $datetimeTransaction);
$feesEUR = $feesAmount * $priceFees;
}
} else {
$feesEUR = 0;
}
}
if (strpos(strtolower($feesAmount),'e') == true) {
//$feesAmount = $explode[0] * pow(10, $explode[1]);
$feesAmount = rtrim(number_format($feesAmount, 12),0);
//$feesAmount = rtrim(sprintf('%g',$feesAmount),'0');
}
if (strpos(strtolower($tradedAmount),'e') == true) {
$tradedAmount = rtrim(number_format($tradedAmount, 12),0);
}
if (strpos(strtolower($receivedAmount),'e') == true) {
$receivedAmount = rtrim(number_format($receivedAmount, 12),0);
}
$ledgio = new Ledgio(array(
'datetimeTransaction' => $datetimeTransaction,
'user' => $user,
'exchange' => $exchange,
'type' => 'BUY',
'pair' => $tradedCurrency . '-' . $receivedCurrency,
// 'fees' => $this->getFee($arrayLine),
'feesAmount' => (!empty($feesAmount) ? $feesAmount : 0),
'feesDevise' => (!empty($ledgioFeesDevise) ? $ledgioFeesDevise : null),
'feesCurrency' => (!empty($feesCurrency) ? $feesCurrency : null),
'feesEUR' => (!empty($feesEUR) ? $feesEUR : 0),
'tradedAmount' => $tradedAmount,
'tradedCurrency' => $tradedCurrency,
'tradedDevise' => $ledgioTradedDevise,
'receivedAmount' => $receivedAmount,
'receivedCurrency' => $receivedCurrency,
'receivedAmountInEUR' => $receivedAmountInEUR,
'receivedDevise' => $ledgioReceivedDevise,
'transactionId' => '',
'import' => $importEntity
));
$ledgio->setUser($user);
$ledgio->setTradedAmount($tradedAmount);
$ledgio->setReceivedAmount($receivedAmount);
// debug multi line with same datetime and same exchange and same assets traded
//echo 'toto';
// $findLedgioSameDatetimeAndAssetAndExchange = $this->ledgioMapper->findLedgioSameDatetimeAndAssetAndExchange($exchange, $user, $tradedCurrency, $receivedCurrency, $datetimeTransaction);
$findLedgioSameDatetimeAndAssetAndExchangeCollection = $this->ledgioMapper->findLedgioSameDatetimeAndAssetAndExchange($exchange, $user, $tradedCurrency, $receivedCurrency, $datetimeTransaction);
if ($findLedgioSameDatetimeAndAssetAndExchangeCollection) {
if (count($findLedgioSameDatetimeAndAssetAndExchangeCollection) > 1) {
throw new Exception('Une erreur est survenue. Plusieurs échanges avec la même date et les même crypto.');
}
//var_dump(count($findLedgioSameDatetimeAndAssetAndExchangeCollection));
$findLedgioSameDatetimeAndAssetAndExchange = $findLedgioSameDatetimeAndAssetAndExchangeCollection[0];
//echo 'toto';
// var_dump(array(
// 'datetimeTransaction' => $datetimeTransaction,
// 'user' => $user,
// 'exchange' => $exchange,
// 'type' => 'BUY',
// 'pair' => $tradedCurrency . '-' . $receivedCurrency,
//// 'fees' => $this->getFee($arrayLine),
// 'fees' => '',
// 'feesDevise' => '',
// 'feesEUR' => '',
// 'tradedAmount' => $tradedAmount,
// 'tradedCurrency' => $tradedCurrency,
// 'tradedDevise' => $ledgioTradedDevise,
// 'receivedAmount' => $receivedAmount,
// 'receivedCurrency' => $receivedCurrency,
// 'receivedDevise' => $ledgioReceivedDevise,
// 'transactionId' => '',
// 'import' => $importEntity
// ));
//echo $findLedgioSameDatetimeAndAssetAndExchange->getTradedCurrency();
// update valeur
$newTradedAmount = $findLedgioSameDatetimeAndAssetAndExchange->getTradedAmount() + $ledgio->getTradedAmount();
//var_dump($ledgio->getReceivedAmount());
//var_dump($findLedgioSameDatetimeAndAssetAndExchange->getReceivedAmount());
$newReceivedAmount = $findLedgioSameDatetimeAndAssetAndExchange->getReceivedAmount() + $ledgio->getReceivedAmount();
$newReceivedAmountInEUR = $findLedgioSameDatetimeAndAssetAndExchange->getReceivedAmountInEUR() + $ledgio->getReceivedAmountInEUR();
$newFeesAmount = $findLedgioSameDatetimeAndAssetAndExchange->getFeesAmount() + $ledgio->getFeesAmount();
$newFeesEUR = $findLedgioSameDatetimeAndAssetAndExchange->getFeesEUR() + $ledgio->getFeesEUR();
$findLedgioSameDatetimeAndAssetAndExchange->setTradedAmount($newTradedAmount);
$findLedgioSameDatetimeAndAssetAndExchange->setReceivedAmount($newReceivedAmount);
$findLedgioSameDatetimeAndAssetAndExchange->setReceivedAmountInEUR($newReceivedAmountInEUR);
$findLedgioSameDatetimeAndAssetAndExchange->setFeesAmount($newFeesAmount);
$findLedgioSameDatetimeAndAssetAndExchange->setFeesEUR($newFeesEUR);
$ledgio = $findLedgioSameDatetimeAndAssetAndExchange;
// $findLedgioSameDatetimeAndAssetAndExchange->setMultiline($multiline);
// $em->persist($findLedgioSameDatetimeAndAssetAndExchange);
//exit;
}
$multiline = $ledgio->getMultiline();
if (empty($multiline)) {
$multiline = [];
} else {
$multiline = json_decode($multiline);
}
$multiline[] = array(
'datetimeTransaction' => $datetimeTransaction,
'user' => $user,
'exchange' => $exchange,
'type' => 'BUY',
'pair' => $tradedCurrency . '-' . $receivedCurrency,
'feesAmount' => (!empty($feesAmount) ? $feesAmount : 0),
'feesDevise' => (!empty($ledgioFeesDevise) ? $ledgioFeesDevise : null),
'feesCurrency' => (!empty($feesCurrency) ? $feesCurrency : null),
'feesEUR' => (!empty($feesEUR) ? $feesEUR : 0),
'tradedAmount' => $tradedAmount,
'tradedCurrency' => $tradedCurrency,
'tradedDevise' => $ledgioTradedDevise,
'receivedAmount' => $receivedAmount,
'receivedCurrency' => $receivedCurrency,
'receivedAmountInEUR' => (!empty($receivedAmountInEUR) ? $receivedAmountInEUR : 0),
'receivedDevise' => $ledgioReceivedDevise,
'transactionId' => '',
'import' => $importEntity
);
// $multiline[] = 1;
$multiline = json_encode($multiline);
$ledgio->setMultiline($multiline);
// else {
$em->persist($ledgio);
// var_dump(json_decode($ledgio->getMultiline()));
// echo '------------';
$em->flush();
// }
$this->countLineRecorded++;
// if (($index % $batchSize) == 0) {
// $em->flush();
//
// }
// flush the remaining objects
// trop long !!!!!!!!
//$this->ledgioMapper->insert($entity);
// $newDate = new \DateTime();
// $newDate->setTimestamp($timestampTransaction);
//$newDate = \DateTime::createFromFormat('U', $timestampTransaction);
// echo $newDate->format('Y-m-d H:i:s');
// var_dump($timestampTransaction); exit;
// $dateTime = new \DateTime($dateStr);
//$ledgioEntity = new \Application\Entity\Ledgio();
}
}
$em->flush();
//$em->clear();
//$em->clear('\Application\Entity\Ledgio');
//$time_elapsed_secs = microtime(true) - $start;
// echo $time_elapsed_secs;
// exit;
$importEntity->setNombreTrade($this->countLineRecorded);
$mapperImport->update($importEntity);
// $collectionLedgio = $this->ledgioMapper->getListByUser($this->user, array(), false);
// foreach ($collectionLedgio as $index => $ledgio) {
// if (!$this->entityManager->contains($ledgio)) {
// \Doctrine\Common\Util\Debug::dump($ledgio->getTradedDevise());
// var_dump($ledgio->getTradedDevise()->getCode());
// var_dump($ledgio->getTradedCurrency());
// var_dump($ledgio->getTransactionId());
// \Doctrine\Common\Util\Debug::dump($ledgio->getImport());
// }
// }
// exit;
}
}
protected function initColFromCsv()
{
$this->contentFile = file_get_contents($this->file);
//var_dump($content);
$this->linesArray = explode("\n", $this->contentFile);
//var_dump($lines);
//$this->columnCsv = explode(',', $lines[0]);
$this->columnCsv = str_getcsv($this->linesArray[0]);
$this->columnCsvMapper = array_flip($this->columnCsv);
// var_dump($lines[0]);
// exit;
//echo $exchange;
// foreach ($lines as $nbLine => $line) {
// $csv_row = str_getcsv($line);
//
// if ($nbLine == 0) {
//
//
//
// foreach ($csv_row as $index => $nameCol) {
//
// //var_dump($nameCol);
// //var_dump($mapperFileExchange);
// if (in_array($nameCol, array_values($mapperFileExchange))) {
// $mapperFile[$nameCol] = $index;
// }
// }
// } else {
// //if (empty($csv_row[$mapperFile['asset']])) continue;
// if (!isset($mapperFile[$mapperFileExchange['time']])) {
//// @todo
// //echo $nbLine;
// //echo $exchange;
// //var_dump($csv_row);
// // exit;
// }
// //var_dump($mapperFile);
// //exit;
// if (empty($csv_row[$mapperFile[$mapperFileExchange['time']]]))
// continue;
//
//
// if (!array_key_exists($csv_row[$mapperFile[$mapperFileExchange['time']]], $ledgio))
// $ledgio[$csv_row[$mapperFile[$mapperFileExchange['time']]]] = [];
//
//
// $ledgio[$csv_row[$mapperFile[$mapperFileExchange['time']]]][] = array('data' => $csv_row, 'exchange' => $exchange, 'mapperFile' => $mapperFile);
// // exit;
// }
// //var_dump($mapperFile); exit;
// //save data into database
// //----
// }
}
protected function setErrorMessage($errorMessage)
{
$this->errorMessage = $errorMessage;
}
public function getErrorMessage()
{
return $this->errorMessage;
}
public function isValid()
{
//var_dump($this->requiredColumn);
//var_dump($this->columnCsv);
$arrayDiff = array_diff($this->requiredColumn, $this->columnCsv);
$colIsValid = !$arrayDiff;
if ($colIsValid === false) {
$this->setErrorMessage(array(
'header' => str_replace('[REQUIRED_COLUMN]', implode(', ', $arrayDiff), SELF::ERROR_TITLE_CSV_COL_REQUIRED),
'body' => SELF::ERROR_MESSAGE_CSV_COL_REQUIRED,
'footer' => '')
);
}
return $colIsValid;
}
}