Exemplo n.º 1
0
 /**
  * Генерирует акт работодателя об оказании услуги или отчет агента в PDF после выбора валюты выплаты.
  * 
  * @param array $error   вернет массив с ошибками.
  * @param integer $act_num   порядковый номер акта @deprecated.
  * @param integer $agent_rep_num   порядковый номер отчета агента. Если указан -1, то будет сформирован отчет агента и в эту переменную возвращен номер.
  * @return CFile   загруженный документ.
  */
 function generateEmpAct(&$error, &$act_num, &$agent_rep_num)
 {
     require_once dirname(__FILE__) . '/fpdf/fpdf.php';
     define('FPDF_FONTPATH', dirname(__FILE__) . '/fpdf/font/');
     require_once dirname(__FILE__) . '/num_to_word.php';
     $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/act_emp.xml';
     if ($agent_rep_num === -1) {
         $agent_rep_num = $this->sbr->regAgentRepNum();
         $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/agent_rep_emp.xml';
     }
     if (!$agent_rep_num) {
         return false;
     }
     $error = NULL;
     if (!($act_frl = $this->getActSums($this->sbr->frl_id))) {
         return false;
     }
     if (!($act_emp = $this->getActSums($this->sbr->emp_id))) {
         return false;
     }
     $cnum = $this->sbr->getContractNum();
     $this->sbr->getFrlReqvs(true);
     $this->sbr->getEmpReqvs(true);
     $this->sbr->setCheckEmpReqvs($this->id);
     if (!$this->sbr->checkUserReqvs($this->sbr->emp_reqvs)) {
         if ($this->login != $this->sbr->frl_login) {
             $flogin = $this->sbr->emp_login ? $this->sbr->emp_login : $this->sbr->login;
             $error['frl'] = 'Для формирования Акта об оказании услуги заказчику<br/> необходимо заполнить реквизиты на странице <a href="/users/' . $flogin . '/setup/finance/" class="blue" target="_blank">Финансы</a>';
         } else {
             $error['frl'] = 'Для формирования Акта об оказании услуги заказчику<br/> необходимо заполнить реквизиты на странице "Финансы"';
         }
     }
     $efio = sbr_meta::getFioFromReqvs($this->sbr->emp_reqvs);
     $ffio = sbr_meta::getFioFromReqvs($this->sbr->frl_reqvs);
     if ($ffio) {
         $ffio = "«{$ffio}»";
         // ФИО -- #0018645 (Akt_rabotodatel_12072012.docx)
     } else {
         $ffio = 'Исполнитель';
     }
     // Это костыль, на самом деле для старых сделок. Если он был юрик, но резервировал по ЯД и ВМР, то в актах нужно было указывать "физическое лицо".
     if ($this->sbr->emp_reqvs['form_type'] == sbr::FT_JURI && ($this->sbr->cost_sys == exrates::WMR || $this->sbr->cost_sys == exrates::YM)) {
         $efio = "«{$efio} – физическое лицо»";
     } else {
         $efio = "«{$efio}»";
         // ФИО или название организации в кавычки -- #0018645 (Akt_rabotodatel_12072012.docx)
     }
     if (!$efio) {
         $error['emp'] = 'Для формирования Акта об оказании услуги заказчику<br/> необходимо заполнить реквизиты на странице "Финансы"';
     }
     if ($error) {
         return false;
     }
     $act_num = $this->sbr->regActNum();
     // с 07.2012 не используется, но пусть крутится на всякий.
     $act_ssum = $act_frl['act_sum'];
     $act_snds = 18 * $act_frl['act_sum'] / 118;
     $frl_sum = $this->getPayoutSum(sbr::FRL, exrates::BANK) + $act_frl['act_lndfl'] + $act_frl['act_lnds'] + $act_frl['act_sum'];
     $rq = $this->sbr->emp_reqvs[$this->sbr->emp_reqvs['form_type']];
     $side_b = sbr_meta::getReqvsStr($this->sbr->emp_reqvs, $bossname);
     if ((int) $frl_sum == 0 && $this->sbr->emp_reqvs['form_type'] == sbr::FT_PHYS) {
         $side_b .= "Реквизиты перевода:\r\n" . sbr_meta::getPayoutReqvsStr($this->sbr->emp_reqvs, $this->sbr->cost_sys);
     }
     $ntax_s = '';
     $frl_nds = '';
     if ($this->sbr->frl_reqvs['form_type'] == sbr::FT_PHYS) {
         if ($act_frl['act_lndfl'] != 0) {
             $ndfl_tax_id = $this->sbr->frl_reqvs['rez_type'] == sbr::RT_RU ? $this->sbr->getTaxByCode('TAX_NDFL') : $this->sbr->getTaxByCode('TAX_NDFL_NR');
             $ntax_per = (int) ($this->sbr->scheme['taxes'][sbr::FRL][$ndfl_tax_id]['percent'] * 100);
             $ndfl_text = "– удержано {$ntax_per}% НДФЛ с " . num2strEx($frl_sum) . " в размере " . num2strEx($act_frl['act_lndfl']) . ", \r\n";
             $act_ndfl_note = " за вычетом {$ntax_per}% НДФЛ и стоимости услуг ООО «Ваан», то есть " . num2strEx($frl_sum - $act_frl['act_lndfl'] - $act_ssum) . ';';
         } else {
             $act_ndfl_note = " за вычетом стоимости услуг ООО «Ваан», то есть " . num2strEx($frl_sum - $act_ssum) . ';';
         }
     } else {
         $act_nds_note = " в том числе НДС 18% ";
         $act_ndfl_note = " за вычетом стоимости услуг ООО «Ваан», то есть " . num2strEx($act_ssum) . ", в том числе НДС 18%;";
     }
     $vaan_text = "- удержана стоимость услуг ООО «Ваан» в соответствии с п. 10.3 Договора – " . num2strEx($act_ssum) . ", в том числе НДС 18% – " . num2strEx($act_snds);
     if ($this->sbr->frl_reqvs['rez_type'] != sbr::RT_RU) {
         if ($this->sbr->frl_reqvs['form_type'] == sbr::FT_JURI) {
             $add2_text = floatval($act_frl['act_lnds']) ? 'удержан НДС (к перечислению налоговым агентом в бюджет РФ) – 18 процентов с Исполнителя: ' . num2strEx(floatval($act_frl['act_lnds'])) . '.' : '';
         }
     } else {
         if ($this->sbr->frl_reqvs['form_type'] == sbr::FT_JURI) {
             $frl_nds = ', в том числе НДС – 18%: ' . num2strEx(18 * $frl_sum / 118);
         }
     }
     if ($this->arbitrage === false) {
         $this->getArbitrage(false, false);
     }
     if (!$this->arbitrage) {
         $reason = "Согласно п. 6.1.1. Договора Заказчик сообщил Агенту о надлежащем выполнении Работы Исполнителем, в связи с этим";
     } else {
         $arb_report_num = $this->tmp_doc_arb['num'];
         $arb_report_date = date('d.m.Y', strtotime($this->tmp_doc_arb['publ_time']));
         $reason = str_replace(array('$arb_report_num', '$arb_report_date'), array($arb_report_num, $arb_report_date), $this->arbitrage['reason']);
         $emp_sum = $this->getPayoutSum(sbr::EMP, exrates::BANK);
         $reason = html_entity_decode($reason, ENT_QUOTES, 'cp1251');
         if (!isset($this->tmp_doc_arb)) {
             $this->tmp_doc_arb = $this->sbr->getLastPublishedDocByType(sbr::DOCS_TYPE_ARB_REP, $this->id);
         }
     }
     if (strpos($reason, '6.1.3') !== false) {
         $reason_add = 'Согласно п. 7.1.3. Договора Заказчик и Исполнитель заключили соглашение об Осуществлении возврата Стоимости работы Заказчику, в связи с этим';
     }
     $agent_nds_reward = $this->sbr->getTotalTax($this->sbr->scheme['taxes'][sbr::EMP][sbr::TAX_EMP_COM], 18 / 118, array('A' => 'NULL'));
     $reserved_sum = $this->sbr->getReserveSum(true);
     $pr['$adr_act'] = "129223, Москва, а/я 33";
     if ($this->sbr->emp_reqvs['rez_type'] == sbr::RT_RU) {
         $pr['$adr_act'] .= ";\r\n";
         $pr['$adr_act'] .= "190031, Санкт-Петербург, Сенная пл., д.13 / 52, а/я 427;\r\n";
         $pr['$adr_act'] .= "420032, Казань, а/я 624;\r\n";
         $pr['$adr_act'] .= "454014, Челябинск-14, а/я 2710.\r\n";
     } else {
         $pr['$adr_act'] .= ".\r\n";
     }
     if ($this->sbr->stages_cnt > 1) {
         $sum_stage = num2strEx($this->sbr->stages[$this->num]->data['cost']);
         $stage_num_str = 'по ' . $this->getNumStage4Docs() . ' этапу';
         $stage_add_info = " (суммарно " . numStringName($this->sbr->stages_cnt) . " этапам) из них {$sum_stage} {$stage_num_str}";
     } else {
         $stage_add_info = "";
     }
     $repl = array('$yd_wm' => '', '$vaan_text' => $vaan_text, '$act_num' => $act_num, '$cnum' => $cnum, '$ssnum' => $this->getOuterNum4Docs(), '$employer_title' => $efio, '$freelancer_title' => $ffio, '$act_sum' => num2strEx($this->cost), '$act_nds' => num2strEx($this->cost * 18 / 118), '$act_nds_note' => $act_nds_note, '$emp_sum' => num2strEx($emp_sum), '$emp_sum_ex' => !!$emp_sum, '$emp_reward' => num2strEx($act_emp['act_sum']), '$emp_nds_reward' => num2strEx(18 * $act_emp['act_sum'] / 118), '$frl_reward' => num2strEx($act_ssum), '$frl_nds_reward' => num2strEx($act_snds), '$ndfl_text' => $ndfl_text, '$act_ndfl_note' => $act_ndfl_note, '$add2_text' => $add2_text, '$frl_sum' => num2strEx($frl_sum), '$frl_nds' => $frl_nds, '$frl_sum_ex' => !!$frl_sum, '$sbr_begin' => date('d.m.Y', strtotime($this->getFirstTime())), '$sbr_end' => date('d.m.Y', strtotime($this->closed_time)), '$now_date' => date('d.m.Y'), '$side_b' => $side_b, '$bossname' => $bossname, '$reserved_sum' => num2strEx($reserved_sum), '$reserved_nds_sum' => num2strEx(18 * $reserved_sum / 118), '$agent_nds_reward' => num2strEx($agent_nds_reward), '$arb_report_num' => $this->tmp_doc_arb['num'], '$arb_report_date' => date('d.m.Y', strtotime($this->tmp_doc_arb['publ_time'])), '$adr_act' => $pr['$adr_act'], '$reason' => $reason, '$reason_add' => $reason_add, '$stage_num_str' => $stage_num_str, '$stages_additional_information' => $stage_add_info, '$agent_rep_num' => $agent_rep_num, '$is_emp100' => $frl_sum == 0);
     $pdf = sbr::xml2pdf($template, $repl);
     if (!($file = $this->sbr->_saveDocFile($pdf->Output(NULL, 'S')))) {
         $error['fatal'] = "Ошибка при формировании Акта об оказании услуги";
     }
     return $file;
 }