/** * Функция для пересоздания документа. * * @param int $doc_id ИД текущего документа * @param int $uid ИД Пользователя * * @return \xajaxResponse */ function aRecreateDocLC($doc_id, $uid, $stage_id, $action = 'create', $interface = 'admin') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pskb.php'; $objResponse = new xajaxResponse(); if (!hasPermissions('sbr')) { return $objResponse; } $doc_id = intval($doc_id); $uid = intval($uid); $stage_id = intval($stage_id); if (!$doc_id) { $objResponse->alert('Не корректный документ.'); return $objResponse; } if (!$uid) { $objResponse->alert('Не корректный пользователь.'); return $objResponse; } $sbr = sbr_meta::getInstanceLocal($uid); if (!$sbr) { $objResponse->alert('Ошибка запроса.'); return $objResponse; } $stage = $sbr->initFromStage($stage_id); if (!$stage) { $objResponse->alert('Этап не найден.'); return $objResponse; } if ($stage->status == sbr_stages::STATUS_ARBITRAGED) { $stage->getArbitrage(false, false); } $doc = $sbr->getDoc($doc_id, true, true); $gen = $stage->recreateDoc($doc, $action); if ($gen) { if ($interface == 'admin') { $doc_act = $sbr->getDocs(null, null, true, $stage_id, true); ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/sbr/admin/tpl.lc-docinfo.php'; $out = ob_get_clean(); $objResponse->assign("doc_content_{$stage_id}", 'innerHTML', $out); } else { $stage->getAllFiles(); ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/sbr/tpl.stage-files.php'; $out = ob_get_clean(); $objResponse->assign('doc_content', 'innerHTML', $out); } } else { $objResponse->alert('Ошибка генерации документа.'); } return $objResponse; }
/** * Формирование актов и счет-фактур по данным из pskb_invoice_raw * Загрузка документов в сделку. * * @param type $data массив с данными - строка результата запроса из sbr_adm::processInvoiceData * @param type $error * * @return bool */ public static function addInvoice($data, &$error = '') { $row = $data; if (!$row) { $error = 'Не найден аккредитив'; return false; } if (!trim($row['addr'])) { $error = 'Не указан юрадрес'; // return false; } $sbr = sbr_meta::getInstanceLocal($row['emp_id']); $sbr->initFromId($row['sbr_id'], false, false, false); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/odt2pdf.php'; require_once dirname(__FILE__) . '/num_to_word.php'; /* * Акт на сумму комиссии ВААН */ $replace = array('USER_NAME' => $row['name'], 'ACT_SUM' => number_format($row['sum'], 2, ',', ''), 'NDS_SUM' => number_format($row['sum'] - $row['sum'] / 1.18, 2, ',', ''), 'NO_NDS_SUM' => number_format($row['sum'] / 1.18, 2, ',', ''), 'ACT_NUM' => intval($row['actnum']), 'DOC_NUM' => $sbr->getContractNum(), 'SUM_STR' => num2strEx(floatval($row['sum'])), 'ACT_DATE' => date('d.m.Y', strtotime($row['actdate']))); $tpl = 'pskb_close_act.ods'; $pdf = new odt2pdf($tpl); $pdf->convert($replace); if (!($file = $sbr->_saveDocFile($pdf->Output(null, 'S')))) { $error = 'Ошибка при формировании Акта'; return false; } $docs[] = array('file_id' => $file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => $row['is_emp'] ? sbr::DOCS_ACCESS_EMP : sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_PSKB_ACT); /* * Счет-фактура */ $replace = array('USER_NAME' => $row['name'], 'USER_ADDR' => $row['addr'], 'USER_INN' => $row['inn'] . ($row['kpp'] ? '/' . $row['kpp'] : ''), 'INV_SUM' => number_format($row['sum'], 2, ',', ''), 'NDS_SUM' => number_format($row['sum'] - $row['sum'] / 1.18, 2, ',', ''), 'NO_NDS_SUM' => number_format($row['sum'] / 1.18, 2, ',', ''), 'INV_NUM' => intval($row['invnum']), 'DOC_NUM' => $sbr->getContractNum(), 'INV_DATE' => date('d.m.Y', strtotime($row['invdate']))); $tpl = 'pskb_close_invoice.ods'; $pdf = new odt2pdf($tpl); $pdf->convert($replace); if (!($file = $sbr->_saveDocFile($pdf->Output(null, 'S')))) { $error = 'Ошибка при формировании счета-фактуры'; return false; } $docs[] = array('file_id' => $file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => $row['is_emp'] ? sbr::DOCS_ACCESS_EMP : sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_FACTURA); foreach ($docs as $doc) { $ok = $sbr->addDocR($doc); } return true; }
/** * Совершает выплату юзеру по данному этапу СБР. * Выплата -- это отметка, что деньги реально выплачены. * * @param integer $user_id ид. юзера, которому предназначается выплата. * @return boolean успешно? */ function payoutAgnt($user_id, pskb $pskb, pskb_lc $pskb_lc) { setlocale(LC_ALL, 'en_US.UTF-8'); if (!$this->getPayouts($user_id)) { return false; } if ($this->payouts[$user_id]['completed']) { return false; } $account = new account(); $account->GetInfo($user_id); $credit_sys = $this->payouts[$user_id]['credit_sys']; $lc = $pskb->getLC(true); $acc = $user_id == $this->sbr->emp_id ? $lc['accCust'] : $lc['accPerf']; switch ($credit_sys) { case exrates::BANK: $descr = "Безнал на счет: {$acc}"; break; case exrates::YM: $descr = "Яндекс.Деньги на кошелек: {$acc}"; break; case exrates::WMR: $descr = "WMR на кошелек: {$acc}"; break; case exrates::WEBM: $descr = "Вывод на Веб-кошелек"; break; case exrates::CARD: $descr = "Безнал на счет пластиковой карты"; break; default: return !($this->error = 'Неверная валюта'); } $this->sbr->getScheme(); $percent = 1; if ($this->payouts[$user_id]['is_arbitrage'] == 't') { $this->getArbitrage(); $percent = abs((int) ($user_id == $this->sbr->emp_id) - $this->arbitrage['frl_percent']); } $iex = $credit_sys . $this->sbr->cost_sys; if (!$this->exrates) { $this->sbr->getExrates(); } $credit_sum = $this->payouts[$user_id]['credit_sum']; $debit_sum = round($credit_sum * $this->sbr->exrates[$iex], 2); $d_descr = 'Списание ' . ($percent == 1 ? '' : 100 * $percent . '% (арбитраж) ') . "резерва «Безопасной Сделки» (этап #{$this->id})"; $sbr = sbr_meta::getInstanceLocal($user_id); $sbr->initFromId($this->data['sbr_id'], false, false); $comments = sbr_meta::view_cost($credit_sum, $credit_sys) . ', ' . $sbr->getContractNum(); $d_comments = sbr_meta::view_cost($debit_sum, $this->sbr->cost_sys) . ', ' . $sbr->getContractNum(); if (($debit_id = $account->CommitReserved($sbr->emp_id, $this->sbr->reserved_id, $d_descr, sbr::OP_DEBIT, $debit_sum, $d_comments)) && ($credit_id = $account->TransferReserved($user_id, $credit_sum, $credit_sys - 1, $descr, $errors, sbr::OP_CREDIT, $comments))) { $sql = "\n UPDATE sbr_stages_payouts\n SET debit_id = {$debit_id},\n credit_id = {$credit_id},\n completed = now(),\n state = '{$pskb_lc->state}',\n \"stateReason\" = '{$pskb_lc->stateReason}',\n bank_completed = '{$pskb_lc->date}'\n WHERE stage_id = {$this->id}\n AND user_id = {$user_id}\n\n AND completed IS NULL\n RETURNING *\n "; if ($res = pg_query(self::connect(), $sql)) { $this->payoutUpdateState($pskb_lc); $docs = array(); $is_emp_arb = $this->status == sbr_stages::STATUS_ARBITRAGED && $this->arbitrage['resolved'] && floatval($this->arbitrage['frl_percent']) == 0; if ($this->sbr->scheme_type == sbr::SCHEME_LC && !$is_emp_arb) { if ($doc_file = $this->generateEmpAgentReport($doc_err, $rep_num)) { // отчет агента. $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'num' => $rep_num, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_AGENT_REP); if ($doc_file = $this->generateEmpAct($doc_err, $doc_num, $rep_num)) { // акт работодателя по агентской схеме (он же отчет об арбитраже, если был арбитраж). $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'num' => $doc_num, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_ACT); } } } elseif (($this->sbr->scheme_type == sbr::SCHEME_PDRD || $this->sbr->scheme_type == sbr::SCHEME_PDRD2) && !$is_emp_arb) { if ($doc_file = $this->generateArbReportPdrdEmp($doc_err)) { // отчет арбитража по договору подряда для работодателя. $docs[] = array('stage_id' => $this->id, 'file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_ARB_REP); } } if (count($docs)) { foreach ($docs as $doc) { $ok = $this->sbr->addDocR($doc); } } $this->payouts[$user_id] = pg_fetch_assoc($res); return true; } } if ($debit_id && !$credit_id) { $account->Del($user_id, $debit_id); } return false; }
/** * Уведомление о том, что загружен новый документ в СБР. * Отправляется участнику СБР, если он заинтересован в этом документе (см. статусы и доступы к документам) * * @param array $events информация по событиям (если событий нескольлко, то содержит несколько элементов). */ function SbrAddDoc($events) { $ev0 = $events[0]; $url = $GLOBALS['host'] . '/' . sbr::NEW_TEMPLATE_SBR . '/'; $sbr_name = sbr_meta::getNameForMail($ev0, 'sbr'); $sbr_link_e = " «<a href='{$url}?id={$ev0['sbr_id']}{$this->_addUrlParams('e', '&')}'>{$sbr_name}</a>»"; $sbr_link_f = " «<a href='{$url}?id={$ev0['sbr_id']}{$this->_addUrlParams('f', '&')}'>{$sbr_name}</a>»"; if (!($doc = sbr_meta::getDoc($ev0['new_val'], false))) { return 0; } if ($doc['owner_role'] != 0) { return 0; } // только если админ загружал. $doc_link_e = " «<a href='{$url}?site=Stage&id={$ev0['stage_id']}&doc={$ev0['new_val']}{$this->_addUrlParams('e', '&')}'>{$doc['name']}</a>»"; $doc_link_f = " «<a href='{$url}?site=Stage&id={$ev0['stage_id']}&doc={$ev0['new_val']}{$this->_addUrlParams('f', '&')}'>{$doc['name']}</a>»"; $this->subject = "Загружен новый документ по Безопасной Сделке (проект {$ev0['sbr_name']})"; $e = 'e_'; $f = 'f_'; //$msg[$e] = "Менеджер сервиса «Безопасная Сделка» загрузил документ {$doc_link_e} в проект {$sbr_link_e}. $msg[$e] = "В Сделку {$sbr_link_e} загружен документ {$doc_link_e}.\n Вы можете ознакомиться с общим <a href='https://feedback.fl.ru/{$this->_addUrlParams('e', '?')}'>порядком проведения Безопасной Сделки</a>."; //$msg[$f] = "Менеджер сервиса «Безопасная Сделка» загрузил документ {$doc_link_f} в проект {$sbr_link_f}. $msg[$f] = "В Сделку {$sbr_link_f} загружен документ {$doc_link_f}.\n Вы можете ознакомиться с общим <a href='https://feedback.fl.ru/{$this->_addUrlParams('f', '?')}'>порядком проведения Безопасной Сделки</a>."; $footer = 'norisk_robot'; if ($doc['type'] == sbr::DOCS_TYPE_ACT) { $sbr = sbr_meta::getInstanceLocal($ev0['e_uid']); $sbr->initFromId($ev0['sbr_id']); if ($sbr->isNewVersionSbr()) { $this->subject = "Завершается Безопасная Сделка {$sbr_name}"; if ($sbr->scheme_type == sbr::SCHEME_LC) { $message = "Безопасная Сделка {$sbr_link_e} находится на завершающем этапе. В систему комментариев к сделке и подраздел «Файлы по этапу» был загружен {$doc_link_e}.<br/><br/>"; $message .= "<i>Обратите внимание</i>: отправлять документы по почте не требуется. Все налоги и сборы вам необходимо оплатить самостоятельно.<br/><br/>"; $message .= "Подробная информация по порядку завершения Безопасной Сделки находится в соответствующем <a href='https://feedback.fl.ru/' target='_blank'>разделе помощи</a>."; $msg[$e] = $message; $msg[$f] = $message; } elseif ($sbr->scheme_type == sbr::SCHEME_PDRD2) { //@todo: был не корректный вызов метода sbr::getContractNum($ev0['sbr_id'], $ev0['scheme_type'], $ev0['posted']) который валил всю функцию и возможно консьюмер $doc_tz = " «<a href='{$url}?site=Stage&id={$ev0['stage_id']}&doc=" . ($ev0['new_val'] + 1) . "{$this->_addUrlParams('e', '&')}'>Техническое задание по договору {$sbr_name}</a>»"; $message = "Безопасная Сделка {$sbr_link_e} находится на завершающем этапе. В комментарии к сделке и подраздел «Файлы по этапу» был загружен {$doc_link_e} и {$doc_tz}.<br/><br/>"; $message .= "Для того чтобы получить гонорар за выполненную работу, вам необходимо распечатать данные документы в 2-х экземплярах, подписать и отправить на адрес компании FL.ru: 129223, г. Москва, а/я 33, ООО «Ваан»."; $msg[$e] = $message; $msg[$f] = $message; } } else { $this->subject = "Документы для завершения Безопасной Сделки по проекту «{$ev0['sbr_name']}»"; $msg[$e] = "\n Ваша Безопасная Сделка по проекту {$sbr_link_e} находится на завершающем этапе. В раздел «Документы проекта» был загружен {$doc_link_e}.\n <br/><br/>\n Для того чтобы деньги были переведены исполнителю, вам необходимо распечатать данный документ в 2-х экземплярах,\n подписать и отправить на адрес компании FL.ru: 129223, г. Москва, а/я 33, ООО «Ваан».\n <br/><br/>\n Пожалуйста, обратите внимание на то, что деньги будут переведены исполнителю только после получения нами оригиналов документов. Выплаты производятся еженедельно в среду и четверг.\n "; if (!empty($events[1])) { $ev1 = $events[1]; $_doc = sbr_meta::getDoc($ev1['new_val'], false); if ($_doc['type'] == sbr::DOCS_TYPE_WM_APPL || $_doc['type'] == sbr::DOCS_TYPE_YM_APPL) { $_doc_link_f = " «<a href='{$url}?site=Stage&id={$ev1['stage_id']}&doc={$ev1['new_val']}{$this->_addUrlParams('f', '&')}'>{$_doc['name']}</a>»"; } } if ($doc_link_f && $_doc_link_f) { $doc_string_f = "были загружены {$doc_link_f} и {$_doc_link_f}"; $print_info_f = "Заявление в одном экземпляре, Акт – в двух"; } else { $doc_string_f = "был загружен {$doc_link_f}"; $print_info_f = "данный документ в 2-х экземплярах"; } $msg[$f] = "\n Безопасная Сделка по проекту {$sbr_link_f} находится на завершающем этапе. В раздел «Документы проекта» {$doc_string_f}.\n <br/><br/>\n Для того чтобы вам были перечислены ваши деньги, вам необходимо распечатать {$print_info_f},\n подписать и отправить на адрес компании FL.ru: 129223, г. Москва, а/я 33, ООО «Ваан».\n <br/><br/>\n Пожалуйста, обратите внимание на то, что деньги будут переведены вам только после получения нами оригиналов документов. Выплаты производятся еженедельно в среду и четверг.\n "; $footer = 'norisk_robot'; } } if ($ev0['foronly_role'] === NULL || ((int) $ev0['foronly_role'] & sbr::EVROLE_FRL) == sbr::EVROLE_FRL) { $rs[] = $f; } if ($ev0['foronly_role'] === NULL || ((int) $ev0['foronly_role'] & sbr::EVROLE_EMP) == sbr::EVROLE_EMP) { $rs[] = $e; } if ($rs) { foreach ($rs as $r) { $this->message = $this->splitMessage($this->GetHtml($ev0[$r . 'uname'], $msg[$r], array('header' => 'simple', 'footer' => $footer))); $this->recipient = $ev0[$r . 'uname'] . " " . $ev0[$r . 'usurname'] . " [" . $ev0[$r . 'login'] . "] <" . $ev0[$r . 'email'] . ">"; $this->SmtpMail('text/html'); } } }
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/stdf.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/num_to_word.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pskb.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/odt2pdf.php'; echo '<pre>'; $UID = 237958; $STAGE_ID = 3524; $DATE = '27.09.2012'; $sbr = sbr_meta::getInstanceLocal($UID); $error = ''; $stage = $sbr->initFromStage($STAGE_ID); $doc_file = $stage->generateFrlActPdrd($error, $DATE); $doc = array('stage_id' => $stage->id, 'file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_ACT); $stage->sbr->addDocR($doc); $doc_file = $stage->generateTzPdrd($error, $DATE); $doc = array('stage_id' => $stage->id, 'file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_PUBL, 'access_role' => sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_TZ_PDRD); $stage->sbr->addDocR($doc); exit;
/** * Заказчику о резерве (должно отсылатся в момент когда Заказчик нажимает на Зарезервировать деньги) -- только для аккредитива. * * @param type $sbr_id ИД сделки * @param type $user_id ИД пользователя * * @return type */ public function SbrReservedMoney($sbr_id, $user_id) { session_start(); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr.php'; $sbr = sbr_meta::getInstanceLocal($user_id); $sbr->initFromId($sbr_id, false); $sbr_num = $sbr->getContractNum(); $t_user = new users(); $t_user->GetUserByUID($user_id); $url_sbr = "{$GLOBALS['host']}/" . sbr::NEW_TEMPLATE_SBR . '/'; $this->subject = "Резервирование денежных средств по «Безопасной Сделке» № {$sbr_num}"; $message = "Вам необходимо перечислить денежные средства по «Безопасной Сделке» <a href='{$url_sbr}?id={$sbr->id}'>№ {$sbr_num}</a> в течение " . pskb::PERIOD_RESERVED . ' рабочих дней с момента нажатия на кнопку «Зарезервировать средства». В противном случае сделка будет отменена.'; $this->recipient = "{$t_user->uname} {$t_user->usurname} [{$t_user->login}] <" . $t_user->email . '>'; $this->message = $this->GetHtml($t_user->uname, $message, array('header' => 'default', 'footer' => 'norisk_robot')); return $this->send('text/html'); }