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

<?php

namespace Application\Service\ExchangeService;

use Payward\KrakenAPI;

/**
 * Description of KrakenAPIService
 *
 * @author jimmy
 */
class KrakenAPIService 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.';

    public $arrayTransactions;

    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)
    {


        $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);
            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 getUser()
    {
        return $this->user;
    }

    public function getExchange()
    {
        return $this->exchange;
    }


    public function getLedgerKraken($dateEnd)
    {

        $res = $this->kraken->QueryPrivate('Ledgers', ['end' => $dateEnd, 'type' => 'trade']);

        if (empty($res['error'])) {
            $arrayLedgerRows = $res['result']['ledger'];
        } else {
            throw new \Exception($res['error']);
        }

        //$arrayTransactions = [];
        foreach ($arrayLedgerRows as $id => $arrayInfosLedger) {
            // debug ledger entry double
            $insertLedgerEntry = true;
//            LLXO3T-HQZXN-OOQTDA
            if ($id == 'LLXO3T-HQZXN-OOQTDA') {

            }
//            echo 'tutu';
            if (!empty($this->arrayTransactions[$arrayInfosLedger['refid']]) && count($this->arrayTransactions[$arrayInfosLedger['refid']]) >= 2) {

                foreach ($this->arrayTransactions[$arrayInfosLedger['refid']] as $key => $infos) {
                    if ($infos['ledgerId'] == $id) {

                        $insertLedgerEntry = false;
                    }

                }
            }

            if ($insertLedgerEntry == true) {

                $this->arrayTransactions[$arrayInfosLedger['refid']][] = ['ledgerId' => $id, 'data' => $arrayInfosLedger];

            }
        }

        if (count($arrayLedgerRows) < 50) {
            return false;
        } else {
            return $arrayInfosLedger['time'];
        }
    }

    public function __construct($data, $user, $exchange, \Doctrine\ORM\EntityManager $entityManager)
    {


//         require __DIR__ . '/vendor/ccxt/ccxt/ccxt.php';
        //$this->file = $file;
        //var_dump($user->getId()); exit;
        $this->user = $user;
        $this->exchange = $exchange;
        $this->entityManager = $entityManager;

        $exchange_id = strtolower($this->getExchange()->getName());

//         $exchange_class = "\\ccxt\\$exchange_id";

        $key = $data['public'];
        $secret = $data['private'];

// set which platform to use (currently only beta is operational, live available soon)
        $beta = false;
        $url = $beta ? 'https://api.beta.kraken.com' : 'https://api.kraken.com';
        $sslverify = $beta ? false : true;
        $version = 0;

        $this->kraken = new KrakenAPI($key, $secret, $url, $version, $sslverify);

        $mapperDeviseKraken = new \Application\Mapper\DeviseKrakenMapper($this->entityManager);
        $this->mapperDeviseKraken = $mapperDeviseKraken;
        $this->arrayMapperKraken = $mapperDeviseKraken->getArrayMapper();

// Query a public list of active assets and their properties:
        $dateEnd = time();
        $i = 0;
while($dateEnd !== false){
//        while ($dateEnd >= 1586353842.0904) {
            $dateEnd = $this->getLedgerKraken($dateEnd);
// var_dump($dateEnd);
//    echo '<pre>';
//    print_r($this->arrayTransactions);
//    echo '<pre>';

            sleep(7);
        }

//         echo '<pre>';
//         print_r($this->arrayTransactions);
//         echo '<pre>';
//exit;


//         $exchange = new $exchange_class (array (
//             'apiKey' => $data['public'],
//             'secret' => $data['private'],
//             'timeout' => 30000,
//             'enableRateLimit' => true,
//         ));
////         var_dump($exchange); exit;
//$this->api = $exchange;


//         $code = null, $since = null, $limit = null, $params = array ()
//         $ledgers = $exchange->fetch_ledger (null, '1514764800000', null, array ());
//var_dump($ledgers);
//exit;
//// get ledger ids
//         $ids = array_keys ($ledgers['result']['ledger']);
//
//         var_dump($ids);
//$tradeArray = [];
//         foreach($ids as $idLedger) {
//             $ledger_entries = $exchange->privatePostQueryLedgers (array (
//                 'id' =>  $idLedger,
//                 'ofs' => 1000
//             ));


//             foreach($ledger_entries['result'] as $id => $arrayInfosLedger) {
//                 if ($arrayInfosLedger['type'] == 'trade') {
//                    $tradeArray[$arrayInfosLedger['refid']][$id] = $arrayInfosLedger;
//                }
//             }

//         }

//         echo '<pre>';
//
//         var_dump ($tradeArray);
//         echo '</pre>';

        // on ajoute chaque entrée du tableau dans ledgio table

        $mapperImport = new \Application\Mapper\ImportMapper($this->getEntityManager());
        $importEntity = new \Application\Entity\Import(
            array(
                'user' => $user,
                'exchange' => $exchange,
                'sourceType' => 'api',
                'name' => 'API v1',
                'nombreTrade' => 0,
                'datetimeImport' => new \DateTime()
            ));
        $mapperImport->insert($importEntity);

        $mapperDevise = new \Application\Mapper\DeviseMapper($this->getEntityManager());
//            var_dump($exchange); exit;

        foreach ($this->arrayTransactions as $tradeId => $arrayLedgers) {
//             [ledgerId] => LN37HE-3FYPD-NRTQJJ
//             [data] => Array
//             (
//                 [refid] => TPWTHU-ZWXP5-3ZTJV5
//             [time] => 1589414967.0939
//                            [type] => trade
//             [aclass] => currency
//             [asset] => ZEUR
//             [amount] => 1849.3800
//                            [fee] => 4.8084
//                            [balance] => 16156.4997
//                        )

            if (count($arrayLedgers) == 2) {
                foreach ($arrayLedgers as $index => $legerInfosArray) {
                    //echo 'titi';
                    $legerInfos = $legerInfosArray['data'];


                    $pair = '';
                    //foreach ($arrayTransaction as $idLedger => $tradeInfos){


                    $datetimeTransaction = new \DateTime();
                    $datetimeTransaction->setTimestamp($legerInfos['time']);
//                         $commissionAsset = $tradeInfos['commissionAsset'];
//                         $commision = $tradeInfos['commission'];


                    if ($legerInfos['amount'] < 0) {
                        $tradedAmount = abs($legerInfos['amount']);
                        $tradedCurrency = $legerInfos['asset'];
                        //$pair .= $legerInfos['asset'];
                        if ($legerInfos['fee'] > 0) {
                            $fee = $legerInfos['fee'];
                            $feesCurrency = $legerInfos['asset'];
                            if (!empty($this->arrayMapperKraken[$feesCurrency])) {
                                $feesDevise = $this->arrayMapperKraken[$feesCurrency];
                            } else {

                                $feesDevise = $mapperDevise->findByCode($feesCurrency);

                            }
                        }

                        if (!empty($this->arrayMapperKraken[$tradedCurrency])) {
                            $tradedDevise = $this->arrayMapperKraken[$tradedCurrency];
                        } else {

                            $tradedDevise = $mapperDevise->findByCode($tradedCurrency);

                        }

                    } else {
                        $receivedAmount = $legerInfos['amount'];
                        $receivedCurrency = $legerInfos['asset'];
                        //$pair .= $legerInfos['asset'];

                        if (!empty($this->arrayMapperKraken[$receivedCurrency])) {
                            $receivedDevise = $this->arrayMapperKraken[$receivedCurrency];
                        } else {
                            $receivedDevise = $mapperDevise->findByCode($receivedCurrency);
                        }
                    }

                    if (!empty($tradedDevise)) {
                        if ($tradedDevise instanceof \Application\Entity\Devise) {
                            $ledgioTradedDevise = $tradedDevise;
                        } else {
                            $ledgioTradedDevise = $tradedDevise->getDevise();
                        }
                    }
                    if (!empty($receivedDevise)) {
                        if ($receivedDevise instanceof \Application\Entity\Devise) {
                            $ledgioReceivedDevise = $receivedDevise;
                        } else {
                            $ledgioReceivedDevise = $receivedDevise->getDevise();
                        }
                    }

                    if (!empty($feesDevise)) {
                        if ($feesDevise instanceof \Application\Entity\Devise) {
                            $ledgioFeesDevise = $feesDevise;
                        } else {
                            $ledgioFeesDevise = $feesDevise->getDevise();
                        }
                    }


                    if ($index == 1) {
                        $ledgio = new \Application\Entity\Ledgio(array(
                            'datetimeTransaction' => $datetimeTransaction,
                            'user' => $user,
                            'exchange' => $exchange,
                            'type' => 'BUY',
                            'pair' => $tradedCurrency . '-' . $receivedCurrency,
//                        'fees' => $this->getFee($arrayLine),
                            'fees' => !empty($fee) ? $fee : '',
                            'feesDevise' => !empty($ledgioFeesDevise) ? $ledgioFeesDevise : '',
                            'feesEUR' => '',
                            'tradedAmount' => $tradedAmount,
                            'tradedCurrency' => $tradedCurrency,
                            'tradedDevise' => $ledgioTradedDevise,
                            'receivedAmount' => $receivedAmount,
                            'receivedCurrency' => $receivedCurrency,
                            'receivedDevise' => $ledgioReceivedDevise,
                            'transactionId' => $legerInfos['refid'],
                            'import' => $importEntity
                        ));

                        $ledgio->setUser($this->getUser());

                        $this->getEntityManager()->persist($ledgio);
                        $this->getEntityManager()->flush();


                        $this->countLineRecorded++;
                    }
                }
            } else {
                echo 'erreur';
            }
            //var_dump($arrayLedgers);


        }
        $importEntity->setNombreTrade($this->countLineRecorded);
        $mapperImport->update($importEntity);

    }


    public function importTradesHistory()
    {

        // delete all trade
        $ledgioMapper = new \Application\Mapper\LedgioMapper($this->getEntityManager());

        $query = $this->getEntityManager()->createQuery("DELETE FROM Application\Entity\Ledgio l WHERE l.user = " . $this->getUser()->getId() . ' AND l.exchange = ' . $this->getExchange()->getId());


        $query->execute();

        $query2 = $this->getEntityManager()->createQuery("DELETE FROM Application\Entity\Import l WHERE l.user = " . $this->getUser()->getId() . ' AND l.exchange = ' . $this->getExchange()->getId());


        $query2->execute();
        $listOfPair = $this->api->QueryPublic('Assets');
        //$listOfPair = $exchangeInfos['symbols'];
        //echo '<pre>';
// Kraken interprete ledger
        // https://support.kraken.com/hc/en-us/articles/360001169383-How-to-interpret-Ledger-history-fields

        //https://github.com/ccxt/ccxt

        $trades = $this->api->fetchMyTrades();
        // get ledger entry
//        $ledgers = $exchange->privatePostLedgers ();
//
//// get ledger ids
//        $ids = array_keys ($ledgers['result']['ledger']);
//
//// get ledger entries for ledger id
//        $ledger_entries = $exchange->privatePostQueryLedgers (array (
//            'id' =>  $ids[0],
//        ));

        var_dump($trades);
        exit;


        var_dump($listOfPair);
        exit;
        $i = 0;
        $index = 0;
        $batchSize = 50;

        $mapperExchange = new \Application\Mapper\ExchangeMapper($this->getEntityManager());
        $exchange = $mapperExchange->findByName(strtolower($this->exchangeName));
        $importEntity = new \Application\Entity\Import(
            array(
                'user' => $this->getUser(),
                'exchange' => $exchange,
                'sourceType' => 'api',
                'name' => 'API ' . $exchange->getName(),
                'nombreTrade' => 0,
                'datetimeImport' => new \DateTime()
            ));
        $mapperImport = new \Application\Mapper\ImportMapper($this->getEntityManager());

        $mapperImport->insert($importEntity);
        foreach ($listOfPair as $pairInfo) {


//            var_dump($this->api->history($pairInfo['symbol']));
//            var_dump($pairInfo);
//            exit;
            file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND | LOCK_EX);
            file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', $pairInfo['symbol'] . PHP_EOL, FILE_APPEND | LOCK_EX);

            $arrayTrades = $this->api->history($pairInfo['symbol']);
            file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', print_r($arrayTrades) . PHP_EOL, FILE_APPEND | LOCK_EX);

            //file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', print_r($arrayTrades) . PHP_EOL, FILE_APPEND | LOCK_EX);


            if (!empty($arrayTrades)) {
                foreach ($arrayTrades as $tradeInfos) {
                    file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', 'trades:' . print_r($arrayTrades) . PHP_EOL, FILE_APPEND | LOCK_EX);

                    //$datetimeTransaction = \DateTime::createFromFormat('U', $tradeInfos['time']);
                    //var_dump($tradeInfos['time']); exit;
                    $datetimeTransaction = new \DateTime();
                    $datetimeTransaction->setTimestamp($tradeInfos['time'] / 1000);
                    $commissionAsset = $tradeInfos['commissionAsset'];
                    $commision = $tradeInfos['commission'];
                    $pair = $pairInfo['symbol'];

                    $tradedAmountNet = $tradeInfos['qty'];
                    $tradedCurrency = str_replace($commissionAsset, '', $pair);

                    $receivedAmountNet = $tradeInfos['quoteQty'] - $tradeInfos['commission'];
                    $receivedCurrency = $commissionAsset;
                    $txId = $tradeInfos['id'];


                    $ledgio = new \Application\Entity\Ledgio(array(
                        'datetimeTransaction' => $datetimeTransaction,
                        //'user' => $user,
                        'exchange' => $exchange,
                        'type' => 'test',
                        'pair' => 'test2',
                        'tradedAmount' => $tradedAmountNet ? $tradedAmountNet : 0,
                        'tradedCurrency' => $tradedCurrency,
                        'fees' => $commision,
                        'receivedAmount' => $receivedAmountNet,
                        'receivedCurrency' => $receivedCurrency,
                        'txId' => $txId,
                        'import' => $importEntity
                    ));

                    file_put_contents('/Users/jimmy/Sites/ledgio2/data/logjob.txt', print_r($tradeInfos) . PHP_EOL, FILE_APPEND | LOCK_EX);

                    //var_dump($ledgio);


                    $ledgio->setUser($this->getUser());
//                    var_dump($ledgio);
//                    exit;

                    $this->getEntityManager()->persist($ledgio);
                    $this->countLineRecorded++;
                    //$this->getEntityManager()->merge($this->getUser());

                    if (($index % $batchSize) == 0) {
                        $this->getEntityManager()->flush();
                        //$em->clear('\Application\Entity\Ledgio');
                    }
                }
            } else {
                echo 'pas de transaction' . $pairInfo['symbol'];
            }

//            "symbol": "BNBBTC",
//    "id": 28457,
//    "orderId": 100234,
//    "price": "4.00000100",
//    "qty": "12.00000000",
//    "quoteQty": "48.000012",
//    "commission": "10.10000000",
//    "commissionAsset": "BNB",
//    "time": 1499865549590,
//    "isBuyer": true,
//    "isMaker": false,
//    "isBestMatch": true
//            if ($i++ == 3) {
//                exit;
//            }


        }

        $this->getEntityManager()->flush();

        $importEntity->setNombreTrade($this->countLineRecorded);


        $mapperImport->update($importEntity);
        //$em->clear();
        //$em->clear('\Application\Entity\Ledgio');
        //$time_elapsed_secs = microtime(true) - $start;
    }



//    public function __construct($file, $user, \Doctrine\ORM\EntityManager $em) {
//        
//        // your api credentials
//$key = 'YOUR API KEY';
//$secret = 'YOUR API SECRET';
//// set which platform to use (currently only beta is operational, live available soon)
//$beta = true; 
//$url = $beta ? 'https://api.beta.kraken.com' : 'https://api.kraken.com';
//$sslverify = $beta ? false : true;
//$version = 0;
//$kraken = new KrakenAPI($key, $secret, $url, $version, $sslverify);
//// Query a public list of active assets and their properties: 
//$res = $kraken->QueryPublic('Assets');
//print_r($res);
//
//
//        $this->file = $file;
//        $this->user = $user;
//        $this->entityManager = $em;
//
//        // Mapper Devise
//        $mapperDeviseKraken = new \Application\Mapper\DeviseKrakenMapper($this->entityManager);
//        $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;
//                            //}
//                        }
//                        
//                        
//                    }
//                    
//                    
////                    $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);
//
//
//                    
//
//
//                    $ledgio = new \Application\Entity\Ledgio(array(
//                        'datetimeTransaction' => $datetimeTransaction,
//                        //'user' => $user,
//                        'exchange' => $exchange,
//                        'type' => $type,
//                        'pair' => implode('-', $pair),
//                        'fees' => $this->getFee($arrayLine),
//                        'feesDevise' => $feesDevise->getDevise(),
//                        //'tradedAmount' => $tradedAmount,
//                        'tradedCurrency' => $tradedCurrency,
//                        'tradedDevise' => $tradedDevise->getDevise(),
//                        //'receivedAmount' => $receivedAmount,
//                        '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();
//            //$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);
//        }
//    }

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

}


??

??