/** * Парсим реестр и генерируем счет-фактуры. * * @param type $filename */ public function parseFile($filename) { //@todo: это не красиво :( ini_set('max_execution_time', 300); //ini_set('memory_limit', '512M'); $uri = WDCPREFIX_LOCAL . $this->path . $filename; $list = array(); $ids = array(); $handle = fopen($uri, 'r'); while (($data = fgetcsv($handle, 1000, ';')) !== false) { if ($data[0] == 'order_id' || count($data) != 7) { continue; } //order_id;sf_num;sf_date;sf_summa;pp_num;pp_date;pp_type $res = array('id' => $this->getOrderId($data[0]), 'sf_num' => $data[1], 'sf_date' => $data[2], 'sf_summa' => $data[3], 'pp_num' => $data[4], 'pp_date' => $data[5], 'pp_type' => $data[6]); $ids[] = $res['id']; $list[] = $res; } fclose($handle); if ($list) { $reserveModel = ReservesModelFactory::getInstance(ReservesModelFactory::TYPE_TSERVICE_ORDER); $empData = $reserveModel->getEmpByReserveIds($ids); foreach ($list as $key => $data) { if (!isset($empData[$data['id']])) { continue; } $data['employer']['login'] = $empData[$data['id']]['login']; $data['employer']['uid'] = $empData[$data['id']]['uid']; $reserveModel->getReserve($ids[$key]); $data['employer']['reqv'] = $reserveModel->getEmpReqv(); try { $doc = new DocGenReserves($data); $doc->generateFactura(); } catch (Exception $e) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/log.php'; $log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', '%d.%m.%Y %H:%M:%S: '); $log->writeln(sprintf('Order Id = %s: %s', $data['id'], iconv('CP1251', 'UTF-8', $e->getMessage()))); } } } }
$results[] = 'Not isClosed'; continue; } deleteFiles($order_id, $doc_types); $exists_doc_types = array_diff($exists_doc_types, $doc_types); $base_doc_types = array(10, 20, 30, 40, 50, 60); if ($reserveInstance->isArbitrage()) { $base_doc_types = $reserveInstance->isStatusPayPayed() ? array(10, 20, 30, 40, 50, 60, 70) : array(20, 30, 40, 50, 60, 70); } //Если резерв по безналу то еще нужен и счет if (!$reserveInstance->isReserveByService()) { $base_doc_types[] = 5; } $needed_doc_types = array_diff($base_doc_types, $exists_doc_types); $history = new tservices_order_history($order_id); $doc = new DocGenReserves($orderData); if (!empty($_GET)) { foreach ($_GET as $key => $value) { $value = iconv("utf-8", "windows-1251", $value); $doc->setOverrideField($key, $value); } } foreach ($needed_doc_types as $needed_doc_type) { switch ($needed_doc_type) { case DocGenReserves::BANK_INVOICE_TYPE: $reserveBank = $reserveInstance->getReservesBank(); if ($reserveBank) { $reqv = $reserveBank->getCheckByReserveId($reserveInstance->getID()); if ($reqv) { $file_url = getFileUrl($reserveInstance->getReservesBank()->generateInvoice2($reqv)); } else {
<?php ini_set('display_errors', 1); error_reporting(E_ALL ^ E_NOTICE); ini_set('max_execution_time', 0); ini_set('memory_limit', '512M'); if (!isset($_SERVER['DOCUMENT_ROOT']) || !strlen($_SERVER['DOCUMENT_ROOT'])) { $_SERVER['DOCUMENT_ROOT'] = rtrim(realpath(pathinfo(__FILE__, PATHINFO_DIRNAME) . '/../../'), '/'); } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/stdf.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/DocGen/DocGenReserves.php"; try { $doc = new DocGenReserves(array('id' => 777, 'employer' => array('login' => 'employer33'))); $doc->setField('text5_info', '1111111 2222222 33333333'); $doc->generateActServiceEmp(); } catch (Exception $e) { print_r(iconv('CP1251', 'UTF-8', $e->getMessage())); } /* $data = array( 'price' => array( 'format' => 'price', 'option' => '', 'value' => 1000 ) ); */ /* try {
/** * Вынесение решения арбитром * @param array $form * @return \xajaxResponse */ function reservesArbitrageApply($form) { $objResponse = new xajaxResponse(); $order_id = @$form['order_id']; $price_pay = (int) @$form['price']; //Сумма для выплаты исполнителю $allow_fb_frl = (bool) @$form['allow_fb_frl']; $allow_fb_emp = (bool) @$form['allow_fb_emp']; $orderModel = TServiceOrderModel::model(); $orderModel->attributes(array('is_adm' => hasPermissions('tservices'))); $order = $orderModel->getCard((int) $order_id, get_uid(false)); if (!$order) { return $objResponse; } $reservesArbitrage = new ReservesArbitrage(); $reservesArbitrage->db()->start(); try { if ($price_pay > $order['reserve_data']['price']) { $price_pay = $order['reserve_data']['price']; } $price_back = $order['reserve_data']['price'] - $price_pay; //запоминаем суммы, которые надо выплатить сторонам, закрываем арбитраж и заказ $ok = $reservesArbitrage->closeArbitrage($order['reserve_data'], array('price_pay' => $price_pay, 'price_back' => $price_back, 'allow_fb_frl' => $allow_fb_frl, 'allow_fb_emp' => $allow_fb_emp)); if ($ok) { $is_emp = true; //Закрываем заказ от лица заказчика $orderModel->changeStatus($order_id, 'close', $is_emp); //Отправляем уведомления $reservesSmail = new ReservesSmail(); $reservesSmail->onApplyArbitrage($order, $price_pay); $order = $orderModel->getOrderData(); //Новый статус отображаем без перезагрузки $order['reserve_data']['arbitrage_price'] = $price_pay; $order['reserve_data']['arbitrage_date_close'] = date('Y-m-d H:i:s'); //Так как мы в статусах используем обьект то обновляем его данные $order['reserve']->setReserveData($order['reserve_data']); //$order['status'] = TServiceOrderModel::STATUS_EMPCLOSE; //Генерируем документы try { $doc = new DocGenReserves($order); if ($price_pay > 0) { $doc->generateActCompletedFrl(); } $doc->generateArbitrageReport(); } catch (Exception $e) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/log.php'; $log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S: "); $log->writeln(sprintf("Order Id = %s: %s", $order['id'], iconv('CP1251', 'UTF-8', $e->getMessage()))); } $tservicesOrderHistory = new tservices_order_history($order_id); $tservicesOrderHistory->reserveArbitrageDecide($price_pay, $price_back); $tserviceOrderStatusWidget = new TServiceOrderStatus(); $tserviceOrderStatusWidget->setIsOwner(false); $tserviceOrderStatusWidget->setOrder($order); $tserviceOrderStatusWidget->init(); ob_start(); $tserviceOrderStatusWidget->run(); $sHtml = ob_get_contents(); ob_end_clean(); $objResponse->assign('tservices_order_status_' . $order_id, 'innerHTML', $sHtml); } } catch (Exception $e) { $reservesArbitrage->db()->rollback(); $sHtml = tservices_helper::getMessage($e->getMessage(), 'error'); $objResponse->call('TServices_Order.showBeforeStatus', $order_id, $sHtml); return $objResponse; } $reservesArbitrage->db()->commit(); $objResponse->call('TServices_Order.hideBeforeStatus', $order_id); return $objResponse; }
$log->writeln('Not isStatusEmpClose'); continue; } $reserveInstance = $orderModel->getReserve(); if (!$reserveInstance->isClosed()) { $log->writeln('Not isClosed'); continue; } $doc_types = array_unique($doc_types); $base_doc_types = array(10, 20, 30, 40, 50, 60); if ($reserveInstance->isArbitrage()) { $base_doc_types = $reserveInstance->isStatusPayPayed() ? array(10, 20, 30, 40, 50, 60, 70) : array(20, 30, 40, 50, 60, 70); } $doc_types = array_diff($base_doc_types, $doc_types); $history = new tservices_order_history($order_id); $doc = new DocGenReserves($orderData); foreach ($doc_types as $doc_type) { switch ($doc_type) { case DocGenReserves::ACT_COMPLETED_FRL_TYPE: $file_url = getFileUrl($doc->generateActCompletedFrl()); $log->writeln(sprintf('generateActCompletedFrl = %s', $file_url)); break; case DocGenReserves::ACT_SERVICE_EMP_TYPE: $file_url = getFileUrl($doc->generateActServiceEmp()); $log->writeln(sprintf('generateActServiceEmp = %s', $file_url)); break; case DocGenReserves::AGENT_REPORT_TYPE: $file_url = getFileUrl($doc->generateAgentReport()); $log->writeln(sprintf('generateAgentReport = %s', $file_url)); break; case DocGenReserves::RESERVE_OFFER_CONTRACT_TYPE:
public function updateDocs($types = array(), $is_create = false, $override_data = array()) { ini_set('max_execution_time', 300); //ini_set('memory_limit', '512M'); if (empty($types)) { $is_create = true; } if (!$this->isReserveData()) { return false; } $orderModel = TServiceOrderModel::model(); $orderModel->attributes(array('is_adm' => true)); $orderData = $orderModel->getCard($this->getSrcId(), 0); if (!$orderData || !$orderModel->isReserve()) { return false; } $reserveInstance = $orderModel->getReserve(); if ($is_create) { //Если зарезервировали if ($reserveInstance->isStatusReserved()) { $base_doc_types[] = DocGenReserves::RESERVE_SPECIFICATION_TYPE; $base_doc_types[] = DocGenReserves::RESERVE_OFFER_CONTRACT_TYPE; $base_doc_types[] = DocGenReserves::RESERVE_OFFER_AGREEMENT_TYPE; } //Если резерв по безналу то нужен счет if (!$reserveInstance->isReserveByService()) { $base_doc_types[] = DocGenReserves::BANK_INVOICE_TYPE; } //Если сделка закрыта и исполнителю полагается выплата либо выплата в процессе if ($reserveInstance->isStatusPayInprogress() || $reserveInstance->isClosed() && (!$reserveInstance->isArbitrage() || $reserveInstance->isStatusPayPayed())) { $base_doc_types[] = DocGenReserves::ACT_COMPLETED_FRL_TYPE; } //Если сделка закрыта либо выплата в процессе if ($reserveInstance->isClosed() || $reserveInstance->isStatusPayInprogress()) { $base_doc_types[] = DocGenReserves::LETTER_FRL_TYPE; } //Если сделка закрыта if ($reserveInstance->isClosed()) { $base_doc_types[] = DocGenReserves::ACT_SERVICE_EMP_TYPE; $base_doc_types[] = DocGenReserves::AGENT_REPORT_TYPE; } //Если сделка закрыта по арбитражу if ($reserveInstance->isArbitrage() && $reserveInstance->isArbitrageClosed()) { $base_doc_types[] = DocGenReserves::ARBITRAGE_REPORT_TYPE; } $types = array_merge($types, $base_doc_types); } $types = array_unique($types); require_once ABS_PATH . '/classes/DocGen/DocGenReserves.php'; $this->getOrderHistory(); $doc = new DocGenReserves($orderData); $doc->deleteFiles($this->getSrcId(), $types); if (!empty($override_data)) { foreach ($override_data as $key => $value) { $doc->setOverrideField($key, $value); } } foreach ($types as $type) { switch ($type) { case DocGenReserves::BANK_INVOICE_TYPE: $reserveBank = $reserveInstance->getReservesBank(); if ($reserveBank) { $reqv = $reserveBank->getCheckByReserveId($reserveInstance->getID()); if ($reqv) { $reserveInstance->getReservesBank()->generateInvoice2($reqv); } } break; case DocGenReserves::ACT_COMPLETED_FRL_TYPE: $doc->generateActCompletedFrl(); break; case DocGenReserves::ACT_SERVICE_EMP_TYPE: $doc->generateActServiceEmp(); break; case DocGenReserves::AGENT_REPORT_TYPE: $doc->generateAgentReport(); break; case DocGenReserves::RESERVE_OFFER_CONTRACT_TYPE: //case DocGenReserves::RESERVE_OFFER_AGREEMENT_TYPE: $doc->generateOffers(); break; case DocGenReserves::RESERVE_SPECIFICATION_TYPE: $doc->generateSpecification(); break; case DocGenReserves::LETTER_FRL_TYPE: $doc->generateInformLetterFRL(); break; case DocGenReserves::ARBITRAGE_REPORT_TYPE: $doc->generateArbitrageReport(); break; } } return true; }
/** * Переопределяем события после изменения статуса * резерва оплаты для заказов ТУ * * @param type $new_status */ public function afterChangeStatus($new_status) { $success = false; $time = time(); switch ($new_status) { case self::STATUS_CANCEL: //Отмена заказа заказчиком то отменяем заказ если была попытка зарезервировать if ($_SESSION['uid'] == $this->reserve_data['emp_id']) { require_once ABS_PATH . "/classes/billing.php"; $billing = new billing($this->reserve_data['emp_id']); $billing->cancelReserveByOrder('reserves', $this->reserve_data['id']); } $success = true; break; case self::STATUS_ERR: $this->getOrderHistory()->reservePriceErr(); break; case self::STATUS_RESERVE: //После успешного резервирования средств //переводим заказ в статус начала работы $src_id = @$this->reserve_data['src_id']; $success = $this->db()->update($this->TABLE_TSERVICE_ORDER, array('status' => TServiceOrderModel::STATUS_ACCEPT, 'accept_date' => date('Y-m-d H:i:s', $time)), 'id = ?i', $src_id); if ($success) { $orderModel = TServiceOrderModel::model(); $order = $orderModel->getShortCard($src_id); if ($order) { //@todo: можно передать просто $this ? $reserveInstance = ReservesModelFactory::getInstance(ReservesModelFactory::TYPE_TSERVICE_ORDER); if ($reserveInstance) { $reserveInstance->setSrcObject($orderModel); $reserveInstance->setReserveData($this->reserve_data); $order['reserve'] = $reserveInstance; } $this->getOrderHistory()->reservePriceSuccess($this->reserve_data['price']); $order['reserve_data'] = $this->reserve_data; $reservesSmail = new ReservesSmail(); $reservesSmail->attributes(array('order' => $order)); $reservesSmail->onReserveOrder(); //Генерируем документы require_once ABS_PATH . '/classes/DocGen/DocGenReserves.php'; $doc = new DocGenReserves($order); $doc->generateSpecification(); } } break; case self::STATUS_PAYED: case self::STATUS_ARBITRAGE: //@todo: генерируем документ когда резерв закрыт после всех выплат $src_id = @$this->reserve_data['src_id']; $orderModel = TServiceOrderModel::model(); $order = $orderModel->getShortCard($src_id); if ($order) { $this->getOrderHistory(); require_once ABS_PATH . '/classes/DocGen/DocGenReserves.php'; $order['reserve_data'] = $this->reserve_data; $order['reserve'] = $this; $doc = new DocGenReserves($order); $doc->generateActServiceEmp(); $doc->generateAgentReport(); } default: $success = true; } return $success; }
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stdf.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/tu/models/TServiceOrderModel.php'; require_once ABS_PATH . '/classes/DocGen/DocGenReserves.php'; $order_id = __paramInit('int', 'order_id', null, 759); $user_id = __paramInit('int', 'uid', null, 239549); $orderModel = new TServiceOrderModel(); $order = $orderModel->getCard($order_id, $user_id); $doc = new DocGenReserves($order); echo $doc->generateSpecification();
/** * @deprecated Не использовать. Выплата делается в очереди PGQ там же и повторяется * * Крон переодического опроса API сервиса выплат * по сделкам в статусе ожидания выплаты * * @todo: документация API рекомендует опрашивать с интервалом мах 30 минут * @todo: возможно не лучшее место для этого? * * @param type $limit - количество сделок обрабатываемых за запуск * @return int - количество успешно обработанных сделок */ public function cron($limit = 10) { return false; $reservesModel = new ReservesModel(); $reserveDataList = $reservesModel->getReservesWithStatusPayByService(ReservesModel::SUBSTATUS_INPROGRESS, $limit); $cnt = 0; if ($reserveDataList) { $log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log', 'a', "%d.%m.%Y %H:%M:%S: "); foreach ($reserveDataList as $reserveData) { $reserveInstance = ReservesModelFactory::getInstance($reserveData['type']); $reserveInstance->setReserveData($reserveData); $status = $this->payout($reserveInstance, $reserveData['pay_type']); $is_done = $reserveInstance->changePayStatus($status); if ($is_done && $reserveInstance->isClosed()) { $cnt++; $orderData = array('id' => $reserveData['src_id'], 'reserve_data' => $reserveInstance->getReserveData(), 'reserve' => $reserveInstance, 'employer' => array('login' => $reserveData['emp_login'], 'email' => $reserveData['emp_email'])); try { $doc = new DocGenReserves($orderData); $doc->generateActServiceEmp(); $doc->generateAgentReport(); } catch (Exception $e) { $log->writeln(sprintf("Order Id = %s: %s", $orderData['id'], iconv('CP1251', 'UTF-8', $e->getMessage()))); } } } } return $cnt; }
$orderData = $orderModel->getCard($order_id, 0); if (!$orderData || !$orderModel->isStatusEmpClose() || !$orderModel->isReserve()) { continue; } $reserveInstance = $orderModel->getReserve(); if (!$reserveInstance->isClosed()) { continue; } $doc_types = array_unique($doc_types); $base_doc_types = array(10, 20, 30, 40, 50, 60); if ($reserveInstance->isArbitrage()) { $base_doc_types = $reserveInstance->isStatusPayPayed() ? array(10, 20, 30, 40, 50, 60, 70) : array(20, 30, 40, 50, 60, 70); } $doc_types = array_diff($base_doc_types, $doc_types); $history = new tservices_order_history($order_id); $doc = new DocGenReserves($orderData); foreach ($doc_types as $doc_type) { switch ($doc_type) { case DocGenReserves::ACT_COMPLETED_FRL_TYPE: getFileUrl($doc->generateActCompletedFrl()); break; case DocGenReserves::ACT_SERVICE_EMP_TYPE: getFileUrl($doc->generateActServiceEmp()); break; case DocGenReserves::AGENT_REPORT_TYPE: getFileUrl($doc->generateAgentReport()); break; case DocGenReserves::RESERVE_OFFER_CONTRACT_TYPE: case DocGenReserves::RESERVE_OFFER_AGREEMENT_TYPE: break; case DocGenReserves::LETTER_FRL_TYPE:
if (!$reserveInstance->isAllowPayout($orderData['frl_id']) || !$reserveInstance->isFrlAllowFinance()) { throw new Exception('Not isAllowPayout'); } $reservesPayout = new ReservesPayout(); $status = $reservesPayout->requestPayout($reserveInstance, $type); $results['status'] = (int) $status; $is_done = $reserveInstance->changePayStatus($status); $results['is_done'] = (int) $is_done; if ($is_done) { //@todo: передача данных устаревший способ но оставляем для поддержки пока //посностью не передем на обьекты $orderData['reserve_data'] = $reserveInstance->getReserveData(); //@todo: правильный способ - нужно оперировать обьектами $orderData['reserve'] = $reserveInstance; try { $doc = new DocGenReserves($orderData); //$doc->generateInformLetterFRL(); //@todo: генерируем документ когда резерв закрыт после всех выплат if ($reserveInstance->isClosed()) { $results['isClosed'] = (int) $reserveInstance->isClosed(); $doc->generateActServiceEmp(); $doc->generateAgentReport(); } } catch (Exception $e) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/log.php'; $log = new log('reserves_docs/' . SERVER . '-%d%m%Y.log'); $log->trace(sprintf('Order Id = %s: %s', $orderData['id'], $e->getMessage())); } } } catch (\Exception $e) { $results['Error Message'] = $e->getMessage();
$orderModel = TServiceOrderModel::model(); $orderModel->attributes(array('is_adm' => true)); $orderData = $orderModel->getCard($order_id, 0); if (!$orderData || !$orderModel->isStatusEmpClose() || !$orderModel->isReserve()) { throw new Exception('None'); } $reserveInstance = $orderModel->getReserve(); if (!$reserveInstance->isClosed()) { throw new Exception('Not isClosed'); } $types = explode(',', $doc_type); if (!count($types)) { throw new Exception('No type param'); } $history = new tservices_order_history($order_id); $doc = new DocGenReserves($orderData); foreach ($types as $type) { $type = trim($type); switch ($type) { case DocGenReserves::ACT_COMPLETED_FRL_TYPE: deleteFiles($order_id, $type); $results['generateActCompletedFrl'] = getFileUrl($doc->generateActCompletedFrl()); break; case DocGenReserves::ACT_SERVICE_EMP_TYPE: deleteFiles($order_id, $type); $results['generateActServiceEmp'] = getFileUrl($doc->generateActServiceEmp()); break; case DocGenReserves::AGENT_REPORT_TYPE: deleteFiles($order_id, $type); $results['generateAgentReport'] = getFileUrl($doc->generateAgentReport()); break;
/** * Аналог generateInvoice * использующий DocGenReserves класс для генерации дока. * * @param type $user_info * * @return bool */ public function generateInvoice2($user_info, $generate_now = false) { $user_info['form_type'] = sbr::FT_JURI; $file = new CFile(); $reserve_id = @$this->data['reserve_id']; $data = $this->getCheckByReserveId($reserve_id); if (isset($data['payed_date']) && !empty($data['payed_date'])) { return false; } if (isset($data['check_file_id']) && $data['check_file_id'] > 0) { $file->Delete($data['check_file_id']); } if (!$data) { $data = array(); } $this->data = array_merge($data, $this->data, $user_info); $login = @$_SESSION['login']; if (@$_SESSION['uid'] != $this->data['user_id']) { $emp = new employer(); $ret = $emp->GetName($this->data['user_id'], $error); if (!$ret) { return false; } $login = $ret['login']; } try { $doc = new DocGenReserves(array('id' => $this->options['src_id'], 'employer' => array('login' => $login))); $doc->setField('date_offer', $this->data['date_offer']); unset($this->data['date_offer']); if (!isset($this->data['date'])) { $this->data['date'] = date('Y-m-d H:i:s'); } $doc->setField('datetext_1', $this->data['date']); $doc->setField('num_bs', $this->options['src_id']); $doc->setField('fio_emp', $this->data); if (empty($user_info['phone'])) { $user_info['phone'] = $user_info['mob_phone']; } $doc->setField('phone', $user_info['phone']); $doc->setField('price_price', $this->data['price']); $doc->setField('nonds_commision', $this->data['tax_price']); $doc->setField('nondstotal_price', $this->data); $doc->setField('pricends_commision', $this->data['tax_price']); $doc->setField('price_reserve_price', $this->data['reserve_price']); $doc->setField('pricelong_reserve_price', $this->data['reserve_price']); $doc->setField('price_commision', $this->data['tax_price']); if ($generate_now) { $doc->disableQueue(); } $file = $doc->generateBankInvoice(); } catch (Exception $e) { return false; } $this->data['check_file_id'] = $file->id; if (!$this->addCheck()) { return false; } if ($generate_now) { Events::trigger('generateInvoice2'); } return $file; }