Esempio n. 1
0
 public function actionIndex()
 {
     $waitedCriteria = new CDbCriteria();
     $waitedCriteria->addCondition('status = \'' . PayoutTask::STATUS_WAIT . '\'');
     $count = PayoutTask::model()->count($waitedCriteria);
     if ($count > 0) {
         $settings = new \YandexMoney\Settings();
         $settings->host = Yii::app()->params['yandexPayout']['host'];
         $settings->cert = Yii::app()->params['yandexPayout']['cert'];
         $settings->certPassword = Yii::app()->params['yandexPayout']['certPassword'];
         $settings->privateKey = Yii::app()->params['yandexPayout']['privateKey'];
         $settings->yaCert = Yii::app()->params['yandexPayout']['yaCert'];
         $provider = new PKCS7RequestProvider($settings);
         $api = new PayoutAPI($provider, Yii::app()->params['yandexPayout']['cardSynonimUrl']);
         /**
          * @var PayoutTask $task
          */
         while ($task = PayoutTask::model()->findByAttributes(array('status' => PayoutTask::STATUS_WAIT))) {
             try {
                 $task->status = PayoutTask::STATUS_IN_PROGRESS;
                 $task->save();
                 $csv = file_get_contents($task->filePath);
                 $inputEncoding = mb_detect_encoding($csv, mb_detect_order(), true);
                 if ($inputEncoding === false) {
                     $csv = iconv('Windows-1251', "UTF-8", $csv);
                 }
                 $depositionLines = explode(PHP_EOL, trim($csv, PHP_EOL));
                 $depositionLines = array_map(function ($x) {
                     return str_getcsv($x);
                 }, $depositionLines);
                 foreach ($depositionLines as $line) {
                     $deposition = new PayoutDeposition();
                     $deposition->payoutTaskId = $task->id;
                     $deposition->currency = Yii::app()->params['yandexPayout']['currency'];
                     $deposition->clientOrderId = $this->getNextClientOrderId();
                     if ($task->type == PayoutTask::TYPE_MOBILE) {
                         $deposition->type = PayoutDeposition::TYPE_MOBILE;
                         $deposition->dstAccount = DepositionRequestParams::getAccountByMobileOperator($line[0]);
                         $deposition->phoneOperatorCode = substr($line[1], 0, 3);
                         $deposition->phoneNumber = substr($line[1], 3);
                         $deposition->amount = floatval($line[2]);
                     } elseif ($task->type == PayoutTask::TYPE_BANK_CARD) {
                         $deposition->type = PayoutDeposition::TYPE_BANK_CARD;
                         $deposition->dstAccount = Yii::app()->params['yandexPayout']['cardDstAccount'];
                         //получить синоним и маску
                         $synonimRes = $api->getCardSynonim(preg_replace('/\\s/', '', $line[0]));
                         if ($synonimRes != null) {
                             $deposition->cardSynonim = $synonimRes['skr_destinationCardSynonim'];
                             $deposition->cardMask = $synonimRes['skr_destinationCardPanmask'];
                         }
                         $deposition->amount = floatval($line[1]);
                         $deposition->payerLastName = trim($line[2]);
                         $deposition->payerFirstName = trim($line[3]);
                         $deposition->payerMiddleName = trim($line[4]);
                         $deposition->payerBirthDate = date('Y-m-d', strtotime(trim($line[5])));
                         $deposition->payerBirthPlace = trim($line[6]);
                         $deposition->payerCountry = 643;
                         $deposition->payerPostcode = trim($line[7]);
                         $deposition->payerCity = trim($line[8]);
                         $deposition->payerAddress = trim($line[9]);
                         $deposition->payerDocNumber = trim($line[10]);
                         $deposition->payerDocIssueDate = date('Y-m-d', strtotime(trim($line[11])));
                         $deposition->payerDocIssuedBy = trim($line[12]);
                         $deposition->smsPhoneNumber = trim($line[13]);
                     }
                     if (!$deposition->save()) {
                         throw new Exception("Not valid CSV string: " . print_r($line, 1));
                     }
                 }
                 $task->refresh();
                 foreach ($task->payoutDepositions as $deposition) {
                     $deposition = $this->processDeposition($api, $task, $deposition);
                 }
             } catch (Exception $e) {
                 $task->status = PayoutTask::STATUS_FAILED;
                 $task->save();
                 throw $e;
             }
             $this->updateTaskStatus($task);
             unlink($task->filePath);
             $task->filePath = null;
             $task->fileSize = null;
             $task->fileType = null;
             $task->save();
         }
     }
 }