Beispiel #1
0
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;
}
Beispiel #2
0
<?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>
Beispiel #3
0
 /**
  * Устанавливает сделку в состояние зарезервированной после успешной операции резервирования на счете.
  * Добавляет к операции подробный комментарий.
  *
  * @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;
 }
Beispiel #4
0
 /**
  * Генерируем отчет арбитража если
  * - когда Арбитраж выносит решение о 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;
 }
Beispiel #5
0
 /**
  * Возвращает сумму резервирования в соотвествии с выставленным бюджетом сделки и текущей схемой налогов.
  * 
  * @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;
 }
Beispiel #6
0
 /**
  * Возвращает коэффициенты для расчета налогов в виде 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 . '}';
 }