function sbrCalc($frl_type, $rez_type, $scheme_type, $currency, $sbr_cost, $emp_cost, $frl_cost, $usr_type) { session_start(); $frl_type = intval($_POST['xjxargs']['frl_type']); $rez_type = intval($_POST['xjxargs']['residency']); $scheme_type = intval($_POST['xjxargs']['scheme_type']); $currency = intval($_POST['xjxargs']['currency']); $sbr_cost = $_POST['xjxargs']['sbr_cost']; $emp_cost = $_POST['xjxargs']['emp_cost']; $frl_cost = $_POST['xjxargs']['frl_cost']; $usr_type = $_POST['xjxargs']['usr_type']; $_POST['xjxargs'] = array('frl_type' => $frl_type, 'rez_type' => $rez_type, 'scheme_type' => $scheme_type, 'currency' => $currency, 'sbr_cost' => $sbr_cost, 'emp_cost' => $emp_cost, 'frl_cost' => $frl_cost, 'usr_type' => $usr_type); // Заплатка для того чтобы работала CSRF xajax $hash = ''; sbr::setSbrCalc($_POST['xjxargs'], $hash); $_POST = $_POST['xjxargs']; foreach ($_POST as $k => $v) { if (!in_array($k, array('sbr_cost', 'frl_cost', 'emp_cost'))) { continue; } $_POST[$k] = str_replace(',', '.', $v); } $sbr_cost = __paramInit('money', null, 'sbr_cost', 0.0, 10); $emp_cost = __paramInit('money', null, 'emp_cost', 0.0, 10); $frl_cost = __paramInit('money', null, 'frl_cost', 0.0, 10); $err = 0; if (!$frl_type || !$frl_type || !$scheme_type || !$currency) { $err = 1; } if ($sbr_cost + $emp_cost + $frl_cost <= 0) { $err = 1; } if ($sbr_cost && $sbr_cost < sbr_stages::MIN_COST_RUR) { $err = 1; $res['msg'] = iconv('CP1251', 'UTF8', 'Минимальный бюджет проекта - ' . sbr_stages::MIN_COST_RUR . ' руб.'); } if ($sbr_cost && $sbr_cost < sbr_stages::MIN_COST_RUR_PDRD && ($scheme_type == sbr::SCHEME_PDRD || $scheme_type == sbr::SCHEME_PDRD2)) { $err = 1; $res['msg'] = iconv('CP1251', 'UTF8', 'Минимальный бюджет проекта - ' . sbr_stages::MIN_COST_RUR_PDRD . ' руб.'); } if (!get_uid(false) || $err) { $res['success'] = false; echo json_encode($res); return; } $sbr_meta = sbr_meta::getInstance(); $sbr_meta->scheme_type = $scheme_type; $schemes = $sbr_meta->getSchemes(); $emp_total = $frl_total = 0; $emp_tax = $frl_tax = 0; $tcost = $sbr_cost; $sch = null; foreach ($schemes as $id => $scheme) { if ($scheme['type'] != $scheme_type) { continue; } $sch = $scheme; } $_taxes = $taxes = array(); $rrq = array('U' => 0, 'Ff' => $frl_type, 'P' => $currency, 'Rf' => $rez_type); $pct = 0; foreach ($sch['taxes'][0] as $id => $tax) { $cost = sbr_meta::calcAnyTax($tax['id'], $tax['scheme_id'], $tcost, $rrq); $pct = $cost / $tcost; if (!$pct) { continue; } $tax['pct'] = $pct; $_taxes['frl'][] = $tax; $frl_tax += $pct * 100; } $rrq = array('U' => 1, 'Ff' => $frl_type, 'P' => $currency, 'Rf' => $rez_type, 'C' => $tcost); foreach ($sch['taxes'][1] as $id => $tax) { $cost = sbr_meta::calcAnyTax($tax['id'], $tax['scheme_id'], $tcost, $rrq); $pct = $cost / $tcost; if (!$pct) { continue; } $tax['pct'] = $pct; $_taxes['emp'][] = $tax; $emp_tax += $pct * 100; } if ($sbr_cost) { $emp_cost = $sbr_cost + $sbr_cost * ($emp_tax / 100); $frl_cost = $sbr_cost - $sbr_cost * ($frl_tax / 100); } elseif ($emp_cost) { $sbr_cost = $emp_cost - $emp_cost / (100 + $emp_tax) * $emp_tax; $frl_cost = $sbr_cost - $sbr_cost * $frl_tax / 100; } elseif ($frl_cost) { $sbr_cost = $frl_cost + $frl_cost / (100 - $frl_tax) * $frl_tax; $emp_cost = $sbr_cost + $sbr_cost * ($emp_tax / 100); } if ($sbr_cost && $sbr_cost < sbr_stages::MIN_COST_RUR) { $err = 1; $res['msg'] = iconv('CP1251', 'UTF8', 'Минимальный бюджет проекта - ' . sbr_stages::MIN_COST_RUR . ' руб.'); $res['success'] = false; echo json_encode($res); return; } if ($rez_type == sbr::RT_UABYKZ && $sbr_cost && $sbr_cost > sbr::usd2rur(sbr::MAX_COST_USD)) { $err = 1; $sum = sbr_meta::view_cost(sbr::usd2rur(sbr::MAX_COST_USD), exrates::BANK); $sum = html_entity_decode($sum); $res['msg'] = iconv('CP1251', 'UTF8', 'Максимальный бюджет ' . $sum . ', поскольку исполнитель не является резидентом Российской Федерации'); $res['success'] = false; echo json_encode($res); return; } if ($_taxes['frl']) { foreach ($_taxes['frl'] as $k => $tax) { $cost = $sbr_cost * $tax['pct']; if ($tax['tax_id'] == $sbr_meta->getTaxByCode('TAX_NDFL') || $tax['tax_id'] == $sbr_meta->getTaxByCode('TAX_NDFL_NR')) { $cost = sbr_meta::ndfl_round($cost); } $taxes['frl'][] = array('id' => $tax['id'], 'scheme' => $scheme_type, 'cost' => sbr_meta::view_cost($cost, null, false)); $frl_total += $cost; } } foreach ($_taxes['emp'] as $k => $tax) { $cost = $sbr_cost * $tax['pct']; if ($tax['tax_id'] == $sbr_meta->getTaxByCode('TAX_NDFL') || $tax['tax_id'] == $sbr_meta->getTaxByCode('TAX_NDFL_NR')) { $cost = sbr_meta::ndfl_round($cost); } $taxes['emp'][] = array('id' => $tax['id'], 'scheme' => $scheme_type, 'cost' => sbr_meta::view_cost($cost, null, false)); $emp_total += $cost; } $res['usr_type'] = intval($_POST['usr_type']); $res['taxes'] = $taxes; $res['emp_total'] = sbr_meta::view_cost($emp_total, null, false); $res['frl_total'] = sbr_meta::view_cost($frl_total, null, false); $res['emp_cost'] = round($sbr_cost + $emp_total, 2); $res['frl_cost'] = round($sbr_cost - $frl_total, 2); $res['sbr_cost'] = round($sbr_cost, 2); $res['rating_get'] = sbr_meta::getSBRRating($res['sbr_cost']); $res['hash'] = $GLOBALS['host'] . '/' . sbr::NEW_TEMPLATE_SBR . '/?site=calc&hash=' . $hash; $res['success'] = true; echo json_encode($res); return; }
<?php $sbr_taxes = $ps_total_sum = $sbr_taxes_sum = array(); foreach ($sbr->scheme['taxes'][$sbr->isEmp() ? sbr::EMP : sbr::FRL] as $tid => $tax) { foreach (pskb::$psys[$sbr->isEmp() ? pskb::USER_EMP : pskb::USER_FRL] as $k => $v) { $t_sum = sbr_meta::calcAnyTax($tid, $sbr->scheme['id'], $sbr->cost, array('P' => pskb::$exrates_map[$k])); if ($t_sum == 0) { continue; } $sbr_taxes[$k][] = $tid; if (!isset($ps_total_sum[$k])) { $ps_total_sum[$k] = $sbr->cost; } if ($sbr->isEmp()) { $ps_total_sum[$k] += $t_sum; } else { $ps_total_sum[$k] -= $t_sum; } $sbr_taxes_sum[$tid][$k] = $t_sum; } } ?> <?php if (!$sbr->user_reqvs['rez_type']) { ?> <table cellspacing="0" cellpadding="0" border="0" class="b-layout__table"> <tbody> <tr class="b-layout__tr"> <td class="b-layout__left b-layout__left_width_160"> <div class="b-layout__txt">Резидентство</div>
/** * Устанавливает сделку в состояние зарезервированной после успешной операции резервирования на счете. * Добавляет к операции подробный комментарий. * * @see account::deposit(). * * @param int $reserved_id ид. операции резервирования (account_operations.id). * * @return bool успешно? */ public function reserve($reserved_id) { if (!$this->_openXact(true)) { return false; } $tax_emp = 0; $pskb = new pskb($this); $lc = $pskb->getLC(); $dvals = array('P' => pskb::$exrates_map[$lc['ps_emp']]); foreach ($this->scheme['taxes'][sbr::EMP] as $tax) { $tax_emp += sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $this->cost, $dvals); } $comments = sbr_meta::view_cost($this->getReserveSum(), $this->cost_sys) . ', ' . $this->getContractNum() . ', ' . round($tax_emp / $this->cost * 100) . '% за услугу сервиса СБР и Банка - ' . sbr_meta::view_cost($tax_emp, $this->cost_sys); $sql = "\n UPDATE sbr SET reserved_id = ?i WHERE id = ?i;\n UPDATE account_operations SET comments = '{$comments}' WHERE id = ?i;\n "; $sql = $this->db()->parse($sql, $reserved_id, $this->id, $reserved_id); if (!pg_query(self::connect(false), $sql)) { $this->_abortXact(); return false; } if ($this->scheme_type == sbr::SCHEME_AGNT) { if ($doc_file = $this->generateAgreement($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_ALL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER, 'subtype' => 2); $this->addDocR($doc); } if (!$err) { if ($doc_file = $this->generateContract($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_ALL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER, 'subtype' => 1); $this->addDocR($doc); } } } elseif ($this->scheme_type == sbr::SCHEME_PDRD || $this->scheme_type == sbr::SCHEME_PDRD2) { if ($doc_file = $this->genereteBailmentEmp($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_EMP, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER); $this->addDocR($doc); } if (!$err) { if ($doc_file = $this->genereteBailmentFrl($err)) { $doc = array('file_id' => $doc_file->id, 'status' => sbr::DOCS_STATUS_SIGN, 'access_role' => sbr::DOCS_ACCESS_FRL, 'owner_role' => 0, 'type' => sbr::DOCS_TYPE_OFFER); $this->addDocR($doc); } } } if ($err) { $this->error['fatal'] = $err; } if ($this->error) { $this->_abortXact(); return false; } $this->_commitXact(); if ($this->scheme_type == sbr::SCHEME_LC) { if ($XACT_ID = $this->_openXact(true)) { $result = sbr_notification::sbr_add_event($XACT_ID, $this->id, $this->stages[0]->id, 'sbr_stages.STARTED_WORK', $this->version, null, null); if (!$result) { $this->_abortXact(); } $this->_commitXact(); } } return true; }
/** * Генерируем отчет арбитража если * - когда Арбитраж выносит решение о 100% выплате Исполнителю * - когда Стороны приходят к соглашению о 100% выплате Исполнителю * * @param type $error Ошибка * @param type $rep_num * @return null|boolean */ public function generateArbReportFrl(&$error, &$rep_num) { require_once dirname(__FILE__) . '/num_to_word.php'; if (!$this->getArbitrage(false, false)) { return NULL; } if (!($act = $this->getActSums($this->sbr->frl_id))) { return false; } $eper = (1 - $this->arbitrage['frl_percent']) * 100; $fper = 100 - $eper; $result = html_entity_decode($this->arbitrage['result'], ENT_QUOTES, 'cp1251'); $init = html_entity_decode($this->arbitrage['init'], ENT_QUOTES, 'cp1251'); $reason = html_entity_decode($this->arbitrage['reason'], ENT_QUOTES, 'cp1251'); $is_frl_arb = strpos($reason, 'Согласно п. 8.5.') !== false; $is_emp_arb = strpos($reason, 'Согласно п. 8.3.') !== false; $is_vaan_arb = strpos($init, 'ООО Ваан обратилось в Арбитраж') !== false; if (strpos($init, 'Исполнитель обратился в Арбитраж') !== false) { $user_arb = 'Исполнитель'; } elseif (strpos($init, 'Заказчик обратился в Арбитраж') !== false) { $user_arb = 'Заказчик'; } elseif ($is_vaan_arb) { $user_arb = 'ООО "Ваан"'; } if ($fper == 100) { if (strpos($result, 'Соглашение сторон 100% Возврат Исполнителю') !== false || strpos($result, 'Соглашение сторон 100% Выплата Исполнителю') !== false) { $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/arb_frl_soglashenie.xml'; } elseif (strpos($result, 'Решение арбитража 100% Выплата Исполнителю') !== false) { $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/arb_frl_reshenie.xml'; } elseif (strpos($result, 'Решение арбитража') !== false) { // ПО ИДЕЕ НЕ МОЖЕТ БЫТЬ ТК ПРИ РЕШЕНИИ 100% исполнителю нужно выбирать пункт 7 $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/arb_act_reshenie.xml'; } else { return null; } } else { if ($fper >= 0) { if (strpos($result, 'Соглашение сторон') !== false) { $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/arb_act_soglashenie.xml'; } elseif (strpos($result, 'Решение арбитража') !== false) { $template = $_SERVER['DOCUMENT_ROOT'] . '/norisk2/xml/arb_act_reshenie.xml'; } else { return null; } } else { return null; } } $error = NULL; $sbr_num = $this->sbr->getContractStageNum(null, null, $this->num + 1); $this->sbr->getFrlReqvs(); $this->sbr->getEmpReqvs(); $this->sbr->setCheckEmpReqvs($this->id); $rep_num = $this->sbr->regArbReportNum(); $efio = sbr_meta::getFioFromReqvs($this->sbr->emp_reqvs); $ffio = sbr_meta::getFioFromReqvs($this->sbr->frl_reqvs); if (!$efio) { $error['emp'] = 'Для формирования Акта об оказании услуги заказчику<br/> необходимо заполнить реквизиты на странице "Финансы"'; } if ($error) { return false; } $dvals = array('P' => pskb::$exrates_map[$this->sbr->data['ps_frl']]); foreach ($this->sbr->scheme['taxes'][sbr::FRL] as $tax) { $tax_frl += sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $this->cost, $dvals); } $sum_emp = $this->getPayoutSum(sbr::EMP); $sum_frl = $this->getPayoutSum(sbr::FRL); $work_cost = $this->cost - $tax_frl; $work_time = intval($this->int_work_time) . ending(intval($this->int_work_time), ' день', ' дня', ' дней'); $work_type = count($this->sbr->stages) == 1 ? 'Стоимости Работы' : 'Промежуточной стоимости Работы'; $replace = array('$sbr_num' => $sbr_num, '$date_sbr' => date("d.m.Y", strtotime($this->getFirstTime())), '$efio' => $efio, '$ffio' => $ffio, '$sum_frl' => num2strEx($sum_frl, 'рублей Российской Федерации'), '$sum_emp' => num2strEx($sum_emp, 'рублей Российской Федерации'), '$tz_descr' => $this->descr, '$work_time' => $work_time, '$work_type' => $work_type, '$work_cost' => num2strEx($work_cost, 'рублей Российской Федерации'), '$is_arb_emp' => $is_emp_arb, '$is_arb_frl' => $is_frl_arb, '$is_arb_vaan' => $is_vaan_arb, '$is_not_arb_vaan' => !$is_vaan_arb, '$user_arb' => $user_arb); $pdf = sbr::xml2pdf($template, $replace); if (!($file = $this->sbr->_saveDocFile($pdf->Output(NULL, 'S')))) { $error['fatal'] = "Ошибка при формировании Акта об оказании услуги"; } return $file; }
/** * Возвращает сумму резервирования в соотвествии с выставленным бюджетом сделки и текущей схемой налогов. * * @param type $force пересчитать * @param type $ps ид платежной системы (см exrates) * @return float сумма резервирования. */ function getReserveSum($force = false, $ps = null, $round = true) { if (!$this->reserve_sum || $force) { if ($this->cost_sys) { // @todo #0020738 Правка основана на том что при округлении до 2 сотых по процентам резерва через ЯД не сходятся суммы // Сделано пока только для аккредитива, необходимо пересмотреть для всех сделок. if ($this->scheme_type == sbr::SCHEME_LC) { $round = false; } $csum = $this->getTotalCost(false); $tsum = 0; foreach ($this->scheme['taxes'][sbr::EMP] as $tax) { $dvals = array('A' => NULL); if ($ps) { $dvals['P'] = $ps; $tsum += sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $csum, $dvals); } else { $tsum += $this->getTotalTax($tax, 1, $dvals, $round); } } $this->reserve_sum = $round ? $csum + $tsum : round($csum + $tsum, 2); } } return $this->reserve_sum; }
/** * Возвращает коэффициенты для расчета налогов в виде JS строки. * * @param array $schemes * @param array $frl_reqvs СБР-реквизиты фрилансера * @param array $emp_reqvs СБР-реквизиты работодателя * @return string */ function jsSchemeTaxes(&$schemes, $frl_reqvs, $emp_reqvs, $usr = sbr::EMP, $psys_default = NULL, $intf = false) { $js = '{'; $j = 0; foreach ($schemes as &$sch) { if (!$sch['taxes'][$usr]) { continue; } $i = 0; $js .= ($j++ ? ',' : '') . $sch['type'] . ':{'; $ttper = 0; foreach ($sch['taxes'][$usr] as $id => $tax) { $tcost = 100000000.0; // Получаем коэффициенты для расчета налогов в JS при создании сделки. $tsum = sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $tcost, array('P' => $psys_default, 'U' => $usr, 'Ff' => $frl_reqvs['form_type'], 'Re' => $emp_reqvs['rez_type'], 'Rf' => $frl_reqvs['rez_type'])); $tper = $tsum / $tcost; if (!$tper) { continue; } $ttper += $tper; if ($sch['type'] == sbr::SCHEME_PDRD2) { $js .= ($i++ ? ',' : '') . "{$id}:[{$tper}," . (double) $tax['percent'] . ']'; } else { if ($sch['type'] == sbr::SCHEME_LC) { $tax_percent += $tax['percent']; $tax_tper += $tper; $tid = 100; } } } if ($sch['type'] == sbr::SCHEME_LC && $tid) { $js .= ($i++ ? ',' : '') . "{$tid}:[{$tax_tper}," . (double) $tax_percent . ']'; } $ttper += 1; $sch['taxes'][$usr]['t'] = array('name' => 'Итого к оплате', 'percent' => 0); $js .= ($i++ ? ',' : '') . "t:[{$ttper},0]"; $js .= '}'; } return $js . '}'; }