Exemple #1
0
 /**
  * Вычисляет налог
  * 
  * @param  array $tax данные по налогу
  * @param  array $dvals реквизиты
  * @param  integer $outsys в какой валюте рассчитать сумму. NULL -- в валюте резерва.
  * @return float
  */
 function calcTax($tax, $dvals = array(), $outsys = NULL)
 {
     if (!is_numeric($tax['tax_id'])) {
         return 0;
     }
     $role = $tax['role'];
     $depends = $tax['depends'];
     $cost_coeff = $this->sbr->getCostSysCoeff($outsys);
     foreach (sbr_meta::$_taxDepends as $chr => $dt) {
         $dv = NULL;
         if (isset($dvals[$chr]) || stripos($depends, "#{$chr}") === false) {
             if ($dvals[$chr] === 'NULL') {
                 $dvals[$chr] = NULL;
             }
             continue;
         }
         switch ($chr) {
             case 'Ff':
                 if ($this->sbr->scheme_type != sbr::SCHEME_LC) {
                     $r = $this->sbr->getUserReqvHistory($this->id, $this->sbr->frl_id);
                     $reqv = $r['b'];
                 } else {
                     $reqv = $this->sbr->getFrlReqvs();
                 }
                 $dv = $reqv['form_type'];
                 break;
             case 'Re':
                 if ($this->sbr->scheme_type != sbr::SCHEME_LC) {
                     $r = $this->sbr->getUserReqvHistory($this->id, $this->sbr->emp_id);
                     $reqv = $r['b'];
                 } else {
                     $reqv = $this->sbr->getEmpReqvs();
                 }
                 $dv = $reqv['rez_type'];
                 break;
             case 'Rf':
                 if ($this->sbr->scheme_type != sbr::SCHEME_LC) {
                     $r = $this->sbr->getUserReqvHistory($this->id, $this->sbr->frl_id);
                     $reqv = $r['b'];
                 } else {
                     $reqv = $this->sbr->getFrlReqvs();
                 }
                 $dv = $reqv['rez_type'];
                 break;
             case 'P':
                 if ($this->status == sbr_stages::STATUS_COMPLETED || $this->status == sbr_stages::STATUS_ARBITRAGED) {
                     $user_id = $role == sbr::EMP ? $this->sbr->emp_id : $this->sbr->frl_id;
                     if (!$user_id) {
                         $user_id = $this->uid;
                     }
                     if (!$this->payouts[$user_id]) {
                         $this->getPayouts($user_id);
                     }
                     $dv = $this->payouts[$user_id]['credit_sys'];
                 }
                 if ($dv == null) {
                     // записи еще не было о выплате!
                     $dv = $this->type_payment;
                 }
                 if ($this->sbr->scheme_type == sbr::SCHEME_LC) {
                     $role = $role == sbr::EMP ? "emp" : "frl";
                     $dv = pskb::$exrates_map[$this->data['ps_' . $role]];
                 }
                 break;
             case 'A':
                 if ($this->status == sbr_stages::STATUS_ARBITRAGED) {
                     if ($this->arbitrage === false) {
                         $this->getArbitrage(false, false);
                     }
                     $dv = abs($role - $this->arbitrage['frl_percent']);
                 }
                 break;
             case 'nNP':
                 if ($this->status == sbr_stages::STATUS_COMPLETED || $this->status == sbr_stages::STATUS_ARBITRAGED) {
                     if ($act = $this->getActSums($this->sbr->frl_id)) {
                         $dv = $act['act_notnp'] == 't';
                     }
                 }
                 break;
         }
         $dvals[$chr] = $dv;
     }
     return sbr_meta::calcAnyTax($tax['tax_id'], $tax['scheme_id'], $this->cost * $cost_coeff, $dvals);
 }