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;
/**
* Description of KrakenService
*
* @author jimmy
*/
class KrakenService 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(
'time',
'type',
'pair',
'cost',
'vol',
'txid'
);
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['time'];
}
protected function getTypeIndex() {
return $this->columnCsvMapper['type'];
}
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);
}
// $arrayCurrencyKraken = array_keys($this->mapperCurrency);
//// liste code history https://support.kraken.com/hc/en-us/articles/360001185506-How-to-interpret-asset-codes
//// $arrayCurrencyKraken = array('ADA',
//// 'ATOM',
//// 'BCH',
//// 'BSV',
//// 'DASH',
//// 'DSH',
//// 'EOS',
//// 'GNO',
//// 'QTUM',
//// 'USDT',
//// 'XDAO',
//// 'XETC',
//// 'ETC',
//// 'XETH',
//// 'ETH',
//// 'XLTC',
//// 'LTC',
//// 'XMLN',
//// 'MLN',
//// 'XNMC',
//// 'XREP',
//// 'XXVN',
//// 'XICN',
//// 'XXBT',
//// 'XBT',
//// 'XXDG',
//// 'XDG',
//// 'XXLM',
//// 'XLM',
//// 'XXMR',
//// 'XMR',
//// 'XXTZ',
//// 'XTZ',
//// 'XXRP',
//// 'XRP',
//// 'XZEC',
//// 'ZEC',
//// 'ZCAD',
//// 'ZEUR',
//// 'EUR',
//// 'ZGBP',
//// 'ZJPY',
//// 'ZKRW',
//// 'ZUSD',
//// 'KFEE');
// //This array will hold the indexes of every
// //element that contains our substring.
//
//
// if (isset($pairStrKraken) && preg_match_all('(' . implode('|', $arrayCurrencyKraken) . ')', $pairStrKraken, $matches)) {
//// if (isset($pairStrKraken)) {
// //var_dump($matches[0]); exit;
// if (count($matches[0]) != 2) {
//// //var_dump($arrayCurrencyKraken);
////// var_dump($pairStrKraken);
////// var_dump($matches);
// throw new \Exception('Asset not found' . $pairStrKraken);
// }
//
// $newStr = implode('', $matches[0]);
// if ($newStr === $pairStrKraken) {
// $returnArray = $matches[0];
// } else {
// $returnArray = array_reverse($matches[0]);
// }
//
//// foreach ($returnArray as $i => $val) {
//// if (!empty($this->mapperCurrency[$val])) {
//// $returnArray[$i] = $this->mapperCurrency[$val];
//// }
////
//// }
//
//
//
// return $returnArray;
// } else {
//
//// preg_match_all('(' . implode('|', $arrayCurrencyKraken) . ')', $pairStrKraken, $matches);
//// preg_match_all('(' . implode('|', $arrayCurrencyKraken) . ')', 'ZUSDKFEE', $matches2);
//// var_dump($arrayCurrencyKraken);
//// var_dump(is_null($pairStrKraken));
//// var_dump($matches);
//// var_dump($matches2);
// //var_dump($devise1, $devise2);
// throw new \Exception('Asset not found : ' . $pairStrKraken);
// }
}
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 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, $type) {
if (strtolower($type) == 'buy') {
$tradedAmount = $arrayLine[$this->getCostIndex()];
} else {
$tradedAmount = $arrayLine[$this->getVolIndex()];
}
return $tradedAmount;
}
protected function getTradedCurrency($pair, $type) {
if (strtolower($type) == 'buy') {
return $pair[1];
} else {
return $pair[0];
}
}
protected function getReceivedAmount($arrayLine, $type) {
if (strtolower($type) == 'buy') {
$receivedAmount = $arrayLine[$this->getVolIndex()];
} else {
$receivedAmount = $arrayLine[$this->getCostIndex()];
}
return $receivedAmount;
}
protected function getReceivedCurrency($pair, $type) {
if (strtolower($type) == 'buy') {
return $pair[0];
} else {
return $pair[1];
}
}
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) {
$this->exchangeRateService = new \Application\Service\ExchangeRateService($em);
$this->file = $file;
$this->user = $user;
$this->entityManager = $em;
// Mapper Devise
$mapperDeviseKraken = new \Application\Mapper\DeviseKrakenMapper($this->entityManager);
$this->mapperDeviseKraken = $mapperDeviseKraken;
$this->arrayMapper = $mapperDeviseKraken->getArrayMapper();
// \Doctrine\Common\Util\Debug::dump($this->arrayMapper); exit;
$this->initColFromCsv();
$mapperExchange = new \Application\Mapper\ExchangeMapper($em);
$exchange = $mapperExchange->findByName('kraken');
//var_dump($exchange);
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),
'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);
$type = $this->getType($arrayLine);
$pair = $this->getPair($arrayLine);
$tradedAmount = $this->getTradedAmount($arrayLine, $type);
$tradedCurrency = $this->getTradedCurrency($pair, $type);
//var_dump($tradedCurrency); exit;
// $tradedDevise = $mapperDevise->findByCode($tradedCurrency);
if (!empty($this->arrayMapper[$tradedCurrency])) {
$tradedDevise = $this->arrayMapper[$tradedCurrency];
} else {
mail('jimmykurc@gmail.com', 'Devise Kraken non reconnue', 'Devise Kraken non reconnue : ' . $tradedCurrency);
}
//var_dump($tradedDevise); exit;
//var_dump($tradedCurrency, $tradedDevise); exit;
$receivedAmount = $this->getReceivedAmount($arrayLine, $type);
$receivedCurrency = $this->getReceivedCurrency($pair, $type);
if (!empty($this->arrayMapper[$receivedCurrency])) {
$receivedDevise = $this->arrayMapper[$receivedCurrency];
} else {
mail('jimmykurc@gmail.com', 'Devise Kraken non reconnue', 'Devise Kraken non reconnue : ' . $tradedCurrency);
}
// fee dans la monnaie echangée cf taker or maker fee
$fees = $this->getFee($arrayLine);
if ($tradedAmount == $arrayLine[$this->getCostIndex()]) {
if ($fees * 100 / $arrayLine[$this->getCostIndex()] > 0.26) {
mail('jimmykurc@gmail.com', 'Fee Kraken trop élevée', 'Fee Kraken trop élevée : ' . $fees);
} else {
//if ($tradedDevise->getCode() == 'ZEUR') {
$fees = $this->getFee($arrayLine);
$feesDevise = $tradedDevise;
//var_dump($fees, $feesDevise->getCode());
}
} else {
if ($fees * 100 / $receivedAmount > 0.26) {
mail('jimmykurc@gmail.com', 'Fee Kraken trop élevée', 'Fee Kraken trop élevée : ' . $fees);
} else {
//if ($receivedDevise->getCode() == 'ZEUR') {
$fees = $this->getFee($arrayLine);
$feesDevise = $receivedDevise;
// var_dump($fees, $feesDevise->getCode());
//exit;
//}
}
}
if ($feesDevise->getDevise()->getCode() === 'EUR') {
$feesEUR = $fees;
} else {
//var_dump($feesDevise->getDevise()); exit;
$priceFees = $this->getExchangeRateService()->getPrice($feesDevise->getDevise(), $datetimeTransaction);
$feesEUR = $fees * $priceFees;
}
// $receivedDevise = $mapperDevise->findByCode($receivedCurrency);
// var_dump($receivedCurrency);
//
// foreach($this->arrayMapper as $key => $obj){
// var_dump($key);
// }
if (!empty($this->arrayMapper[$receivedCurrency])) {
$receivedDevise = $this->arrayMapper[$receivedCurrency];
} else {
mail('jimmykurc@gmail.com', 'Devise Kraken non reconnue', 'Devise Kraken non reconnue : ' . $receivedCurrency);
}
//var_dump($receivedDevise); exit;
$txId = $this->getTxid($arrayLine);
//var_dump($datetimeTransaction);
//var_dump($tradedDevise->getDevise()->getId());
// if (is_null($tradedDevise->getDevise()->getId())) {
// echo 'titi';
// exit;
// }
$ledgio = new \Application\Entity\Ledgio(array(
'datetimeTransaction' => $datetimeTransaction,
//'user' => $user,
'exchange' => $exchange,
'type' => $type,
'pair' => implode('-', $pair),
'fees' => $this->getFee($arrayLine),
'feesDevise' => $feesDevise->getDevise(),
'feesEUR' => $feesEUR,
//'tradedAmount' => $tradedAmount,
'tradedCurrency' => $tradedCurrency,
'tradedDevise' => $tradedDevise->getDevise(),
//'receivedAmount' => $receivedAmount,
'receivedCurrency' => $receivedCurrency,
'receivedDevise' => $receivedDevise->getDevise(),
'transactionId' => $txId,
'import' => $importEntity
));
$ledgio->setUser($user);
$ledgio->setTradedAmount($tradedAmount);
$ledgio->setReceivedAmount($receivedAmount);
//
// var_dump('user',$em->contains($ledgio->user));
// var_dump('ledgio',$em->contains($ledgio));
$em->persist($ledgio);
$this->countLineRecorded++;
// if (is_null($ledgio->getTradedDevise()->getId())) {
// echo 'titi';
// \Doctrine\Common\Util\Debug::dump($ledgio->getTradedDevise());
// var_dump($ledgio->getTradedDevise()->getCode());
// var_dump($ledgio->getTradedCurrency());
// exit;
// }
//
// var_dump('user', $em->contains($ledgio->user));
// var_dump('ledgio',$em->contains($ledgio));
// exit;
if (($index % $batchSize) == 0) {
$em->flush();
//$em->clear('\Application\Entity\Ledgio');
}
// 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;
}
}