type = $type; if ($rubles) { $this->setSum($rubles); } } /** * Устанавливает размер НДС от суммы в копейках * * @param string $type Тип ставки НДС * @param int $kopeks Копейки * @return float|int * @see https://nalog-nalog.ru/nds/nalogovaya_baza_nds/kak-schitat-nds-pravilno-vychislyaem-20-ot-summy-primer-algoritm/ * @see https://glavkniga.ru/situations/k500734 * @see https://www.b-kontur.ru/nds-kalkuljator-online */ protected static function calculator(string $type, int $kopeks) { switch ($type) { case VatTypes::NONE: case VatTypes::VAT0: return 0; case VatTypes::VAT10: return $kopeks * 10 / 100; case VatTypes::VAT110: return $kopeks * 10 / 110; case VatTypes::VAT18: return $kopeks * 18 / 100; case VatTypes::VAT118: return $kopeks * 18 / 118; case VatTypes::VAT20: return $kopeks * 20 / 100; case VatTypes::VAT120: return $kopeks * 20 / 120; } } /** * Возвращает тип ставки НДС. Тег ФФД - 1199, 1105, 1104, 1103, 1102, 1107, 1106. * * @return string */ public function getType(): string { return $this->type; } /** * Устанавливает тип ставки НДС. Тег ФФД - 1199, 1105, 1104, 1103, 1102, 1107, 1106. * Автоматически пересчитывает итоговый размер НДС от исходной суммы. * * @param string $type Тип ставки НДС * @return $this */ public function setType(string $type) { $this->type = $type; $this->setFinal(); return $this; } /** * Возвращает расчитанный итоговый размер ставки НДС в рублях. Тег ФФД - 1200. * * @return float */ public function getFinalSum() { return self::toRub($this->sum_final); } /** * Устанавливает исходную сумму, от которой будет расчитываться итоговый размер НДС. * Автоматически пересчитывает итоговый размер НДС от исходной суммы. * * @param float $rubles Сумма в рублях за предмет расчёта, из которой высчитывается размер НДС * @return $this */ public function setSum(float $rubles) { $this->sum_original = self::toKop($rubles); $this->setFinal(); return $this; } /** * Возвращает исходную сумму, от которой расчитывается размер налога * * @return float */ public function getSum(): float { return self::toRub($this->sum_original); } /** * Прибавляет указанную сумму к общей исходной сумме. * Автоматически пересчитывает итоговый размер НДС от новой исходной суммы. * * @param float $rubles * @return $this */ public function addSum(float $rubles) { $this->sum_original += self::toKop($rubles); $this->setFinal(); return $this; } /** * Расчитывает и возвращает размер НДС от указанной суммы в рублях. * Не изменяет итоговый размер НДС. * * @param float|null $rubles * @return float */ public function calc(float $rubles): float { return self::toRub(self::calculator($this->type, self::toKop($rubles))); } /** * @inheritDoc */ public function jsonSerialize() { return [ 'type' => $this->getType(), 'sum' => $this->getFinalSum(), ]; } /** * Расчитывает и устанавливает итоговый размер ставки от исходной суммы в копейках */ protected function setFinal() { $this->sum_final = self::calculator($this->type, $this->sum_original); return $this; } }