You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.4 KiB
45 lines
1.4 KiB
# -*- coding: utf-8 -*-
|
|
from decimal import Decimal
|
|
|
|
from . import consts
|
|
|
|
|
|
def get_nds(key):
|
|
"""Берет значение НДС по ключу key."""
|
|
return consts.NDS_VALUE_NUMERIC.get(key, Decimal(0))
|
|
|
|
|
|
def extract_nds(obj):
|
|
"""Если НДС содержится в цене, извлекает и возвращает его."""
|
|
nds = Decimal('0.00')
|
|
if obj.parent.nds_type == consts.NDS_TYPE_IN: # ндс в сумме, извлечь его
|
|
nds_rate = get_nds(obj.parent.nds_value)/100
|
|
nds = obj.price * (1 - 1/(1+nds_rate))
|
|
return nds
|
|
|
|
|
|
def calc_clean_price(obj):
|
|
"""Считает цену без НДС."""
|
|
return obj.price - extract_nds(obj)
|
|
|
|
|
|
def calc_clean_total_price(obj):
|
|
"""Считает стоимость без налога."""
|
|
return calc_clean_price(obj) * obj.qty
|
|
|
|
|
|
def calc_total_nds(obj):
|
|
"""Считает сумму налога."""
|
|
total_nds = Decimal('0.00')
|
|
if obj.parent.nds_type == consts.NDS_TYPE_IN: # ндс в сумме
|
|
total_nds = extract_nds(obj) * obj.qty
|
|
elif obj.parent.nds_type == consts.NDS_TYPE_OUT: # ндс сверх суммы
|
|
total_price = obj.price * obj.qty
|
|
nds_rate = get_nds(obj.parent.nds_value)/100
|
|
total_nds = total_price * nds_rate
|
|
return total_nds
|
|
|
|
|
|
def calc_full_total_price(obj):
|
|
"""Считает стоимость с налогом."""
|
|
return calc_total_nds(obj) + calc_clean_total_price(obj)
|
|
|