/** * Функция проверки статуса оплаченности этапа сделки. * * @param array $ids ИД этапов * @param int $cntIn Количество обрабатываемых запросов * @param int $cntOut Количество обработанных запросов * * @return bool */ public static function checkStagePayouts($ids = array(), &$cntIn = 0, &$cntOut = 0) { $db = new DB('master'); $sql = 'SELECT sp.*, ss.sbr_id, ss.num, pl.lc_id, u.role, s.emp_id, s.frl_id, pl.state as lc_state FROM sbr_stages_payouts sp INNER JOIN sbr_stages ss ON ss.id = sp.stage_id INNER JOIN sbr s ON s.id = ss.sbr_id INNER JOIN pskb_lc pl ON pl.sbr_id = s.id INNER JOIN users u ON u.uid = sp.user_id'; if ($ids) { $sql .= ' WHERE sp.stage_id IN (?l)'; $data = $db->rows($sql, $ids); } else { $sql .= " WHERE s.scheme_type = ?i \n AND sp.state = 'trans' \n AND ( sp.completed IS NULL OR (requested > NOW() - '" . self::PERIOD_BANK_CHECK . "'::interval AND credit_sys = ?i) )"; $data = $db->rows($sql, sbr::SCHEME_LC, exrates::BANK); } if (!$data) { return false; } $cntIn = count($data); $list = array(); foreach ($data as $lsrow) { $list[] = intval($lsrow['lc_id']); } $pskb = new self(); $resp = $pskb->_checks(json_encode(array('id' => $list))); foreach ($data as $row) { if (self::PSKB_SUPERCHECK) { $pskb_lc = $pskb->getSuperCheckLocal($row['lc_id'], sbr_stages::getOuterNum($row['sbr_id'], $row['num']), is_emp($row['role']) ? false : true); } else { $pskb_lc = $pskb->_historyLC($row['lc_id'], sbr_stages::getOuterNum($row['sbr_id'], $row['num']), is_emp($row['role']) ? false : true); } if (!$pskb_lc->id) { continue; } if ($pskb_lc->state == $row['state']) { continue; } // Если выплата уже прошла но они не обновили статус сделки в checks -- тогда спрашиваем еще раз позже в ПСКБ if (!isset($resp[$row['lc_id']])) { continue; } $lc = $resp[$row['lc_id']]; if (!$lc->id || $lc->state == $row['lc_state']) { continue; } switch ($pskb_lc->state) { case self::PAYOUT_END: // отправлено по реквизитам // отправлено по реквизитам case self::PAYOUT_ERR: // зачислено в ВК // выплачено $sbr = new sbr($row['emp_id']); $stage = $sbr->getStage($row['stage_id']); $stage->getArbitrage(false, false); if ($stage->arbitrage && $stage->arbitrage['resolved']) { $emp_percent = abs(sbr::EMP - $stage->arbitrage['frl_percent']); $frl_percent = abs(sbr::FRL - $stage->arbitrage['frl_percent']); } else { $frl_percent = 1; } $frl_payout = true; $emp_payout = true; if ($frl_percent > 0) { $frl_payout = !$stage->payoutAgnt($row['frl_id'], new self($stage->sbr->data['id']), $pskb_lc); } if ($emp_percent > 0) { $emp_payout = !$stage->payoutAgnt($row['emp_id'], new self($stage->sbr->data['id']), $pskb_lc); } if (!$frl_payout && !$emp_payout) { continue; } break; } switch ($lc->state) { case self::STATE_COVER: case self::STATE_END: if ($lc->state == self::STATE_END) { $up_data['ended'] = $pskb_lc->date; } break; case self::STATE_ERR: break; default: continue; } $up_data['state'] = $lc->state; $up_data['stateReason'] = $lc->stateReason; $pskb->upLC($up_data, $row['lc_id']); ++$cntOut; } }