?? GreyFile — Mystic File Browser

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



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

?? Viewing: KrakenService.php

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

}


??

??