?? 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: BittrexService.php

<?php

namespace Application\Service\ExchangeService;

/**
 * Description of BittrexService
 *
 * @author jimmy
 */
class BittrexService 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 [EXCHANGE].';

    protected $file;
    protected $exchangeName = 'Bittrex';
    protected $requiredColumn = array(
        'Uuid',
        'Exchange',
        'TimeStamp',
        'OrderType',
        'Limit',
        'Quantity',
        'QuantityRemaining',
        'Commission',
        'Price',
        'PricePerUnit',
        'IsConditional',
        'Condition',
        'ConditionTarget',
        'ImmediateOrCancel',
        'Closed'
    );
    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 getTimeStampIndex() {
        return $this->columnCsvMapper['TimeStamp'];
    }

    protected function getDatetime($arrayLine) {
        $dateStr = $arrayLine[$this->getTimeStampIndex()];
        $dateTime = \DateTime::createFromFormat('m/d/Y H:i:s a', $dateStr);
        return $dateTime;
    }

    protected function getPairIndex() {
        return $this->columnCsvMapper['Exchange'];
    }

    protected function getPair($arrayLine) {
        $pairStr = $arrayLine[$this->getPairIndex()];
        $arrayAsset = explode('-', $pairStr);
        return $arrayAsset;
    }

    protected function getOrderTypeIndex() {
        return $this->columnCsvMapper['OrderType'];
    }

    protected function getType($arrayLine) {
        $orderType = $arrayLine[$this->getOrderTypeIndex()];

        if ($orderType == 'LIMIT_SELL') {
            $type = 'sell';
        } else if ($orderType == 'LIMIT_BUY') {
            $type = 'buy';
        }

        return $type;
    }

    protected function getAmountIndex() {
        return $this->columnCsvMapper['Quantity'];
    }

    protected function getTradedAmount($arrayLine, $type) {


        if (strtolower($type) == 'buy') {
            $tradedAmount = $arrayLine[$this->getPriceIndex()];
            //var_dump($price, $tradedAmount); exit;
        } else {
            $tradedAmount = $arrayLine[$this->getAmountIndex()];
            //var_dump($tradedAmount, $amount);
        }
        return $tradedAmount;
    }

    protected function getPriceIndex() {
        return $this->columnCsvMapper['Price'];
    }

    protected function getFeesIndex() {
        return $this->columnCsvMapper['Commission'];
    }

    protected function getTxidIndex() {
        return $this->columnCsvMapper['Uuid'];
    }

    //https://api.bitfinex.com/v1/symbols recupere les paires autorisées
    // Bittrex date




    protected function getFees($arrayLine) {
        $fees = $arrayLine[$this->getFeesIndex()];


        return $fees;
    }

    protected function getTradedCurrency($pair, $type) {
        if (strtolower($type) == 'buy') {
            return $pair[0];
        } else {
            return $pair[1];
        }
    }

    protected function getReceivedAmount($arrayLine, $type) {
        if (strtolower($type) == 'buy') {
            $receivedAmount = $arrayLine[$this->getAmountIndex()];
            //var_dump($price, $tradedAmount); exit;
        } else {
            $receivedAmount = $arrayLine[$this->getPriceIndex()];
            //var_dump($tradedAmount, $amount);
        }



        return $receivedAmount;
    }

    protected function getReceivedCurrency($pair, $type) {
        if (strtolower($type) == 'buy') {
            return $pair[1];
        } else {
            return $pair[0];
        }
    }

    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->file = $file;
        $this->user = $user;
        $this->entityManager = $em;

        // Mapper Devise
        $mapperDeviseBittrex = new \Application\Mapper\DeviseBittrexMapper($this->entityManager);
        $this->arrayMapper = $mapperDeviseBittrex->getArrayMapper();

        $this->initColFromCsv();
        $mapperExchange = new \Application\Mapper\ExchangeMapper($em);
        $exchange = $mapperExchange->findByName(strtolower($this->exchangeName));



        //var_dump($exchange);
        if ($this->isValid()) {
            $mapperImport = new \Application\Mapper\ImportMapper($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) {
                if (empty($row)) {
                    continue;
                }
                //var_dump($row);
                if ($index != 0) {

                    /* date */
                    $arrayLine = str_getcsv($row);
                    $datetimeTransaction = $this->getDatetime($arrayLine);

                    $type = $this->getType($arrayLine);

                    $pair = $this->getPair($arrayLine);
                    $fees = $this->getFees($arrayLine);
                    $tradedAmount = $this->getTradedAmount($arrayLine, $type);



                    $tradedCurrency = $this->getTradedCurrency($pair, $type);

                    if (!empty($this->arrayMapper[$tradedCurrency])) {
                        $tradedDevise = $this->arrayMapper[$tradedCurrency];
                    } else {
                        mail('jimmykurc@gmail.com', 'Devise Bittrex non reconnue : ' . $tradedCurrency, 'Devise Bittrex non reconnue : ' . $tradedCurrency);
                    }



                    $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 Bittrex non reconnue: ' . $receivedCurrency, 'Devise Bittrex non reconnue : ' . $receivedCurrency);
                    }


                    $txId = $this->getTxid($arrayLine);

//                    var_dump($datetimeTransaction, $type, $pair, $fees, $tradedAmount, $tradedCurrency, $receivedAmount, $receivedCurrency);
//                    exit;
                    //var_dump($feesCurrency, $tradedCurrency);
                    //if ($feesCurrency == $tradedCurrency) {
                    //echo 'buy fees trade trade';
                    $tradedAmountNet = $tradedAmount;
                    $receivedAmountNet = $receivedAmount - $fees;

                    //($tradedAmount, $tradedAmountNet, $receivedAmount, $receivedAmountNet, $fees); exit;
//                    } else {
//                        if (strtolower($type) == 'buy') {
//                            //echo 'buy fees received';
//                            $tradedAmountNet = $tradedAmount;
//                            $receivedAmountNet = $receivedAmount - abs($fees);
//                        } else {
//                            //echo 'sell trade';
//                            $tradedAmountNet = $tradedAmount;
//                            $receivedAmountNet = $receivedAmount - abs($fees);
//                        }
//
//                        //$tradedAmountNet = $tradedAmount;
//                        // var_dump($tradedAmount, $tradedAmountNet, $receivedAmount, $receivedAmountNet, $fees); exit;
//                    }
//var_dump($tradedAmount);
//var_dump($tradedAmountNet);
//                    var_dump($receivedAmount);
//                    var_dump($receivedAmountNet);




                    $ledgio = new \Application\Entity\Ledgio(array(
                        'datetimeTransaction' => $datetimeTransaction,
                        //'user' => $user,
                        'exchange' => $exchange,
                        'type' => $type,
                        'pair' => implode('-', $pair),
                        'tradedAmount' => $tradedAmountNet,
                        'tradedCurrency' => $tradedCurrency,
                        'tradedDevise' => $tradedDevise->getDevise(),
                        'fees' => $fees,
                        'receivedAmount' => $receivedAmountNet,
                        'receivedCurrency' => $receivedCurrency,
                        'receivedDevise' => $receivedDevise->getDevise(),
                        'txId' => $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++;

//                    
//                     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();
            $importEntity->setNombreTrade($this->countLineRecorded);



            $mapperImport->update($importEntity);
            //$em->clear();
            //$em->clear('\Application\Entity\Ledgio');
//            $time_elapsed_secs = microtime(true) - $start;
//            echo $time_elapsed_secs;
//            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' => str_replace('[EXCHANGE]', $this->exchangeName, SELF::ERROR_MESSAGE_CSV_COL_REQUIRED),
                'footer' => '')
            );
        }
        return $colIsValid;
    }

}


??

??