/** * Вычисляет налог * * @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); }