diff --git a/src/docs/forms/nakladn.py b/src/docs/forms/nakladn.py index 07971a9..ae8cda4 100644 --- a/src/docs/forms/nakladn.py +++ b/src/docs/forms/nakladn.py @@ -11,16 +11,22 @@ class NakladnForm(BaseModelForm): """Форма редактирования накладной.""" class Meta: model = Nakladn - fields = ('doc_num', 'doc_date', - 'bank_account', 'client', 'invoice', + fields = ( + 'doc_num', + 'doc_date', + 'bank_account', + 'client', + 'invoice', 'doc_reason', 'nds_value', + 'nds_method', 'doc_text', ) _radioselect = forms.RadioSelect _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) widgets = { 'doc_text': _textarea, + 'nds_method': forms.RadioSelect() } diff --git a/src/docs/utils.py b/src/docs/utils.py index 34fe153..dcfd423 100644 --- a/src/docs/utils.py +++ b/src/docs/utils.py @@ -38,6 +38,16 @@ def calc_full_total_price(obj): return calc_total_nds(obj) + calc_clean_total_price(obj) +def get_clean_total_price(obj): + """ + Считает стоимость без налога. + """ + if obj.parent.nds_method: + return calc_clean_price(obj) * obj.qty + else: + return calc_clean_price(obj) * obj.qty - get_total_nds(obj) + + def get_total_nds(obj): """Считает сумму налога.""" total_price = obj.price * obj.qty diff --git a/src/docs/views/nakladn.py b/src/docs/views/nakladn.py index b0c89c3..6d22bae 100644 --- a/src/docs/views/nakladn.py +++ b/src/docs/views/nakladn.py @@ -15,14 +15,20 @@ from .mixins import AddByInvoiceMethodMixin class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): """Views для накладных торг12.""" - MODEL = Nakladn # модель документа - FORM_CLASS = NakladnForm # форма документа + # модель документа + MODEL = Nakladn + # форма документа + FORM_CLASS = NakladnForm - ITEM_MODEL = NakladnItem # модель табличной части документа - ITEM_FORM_CLASS = NakladnItemForm # форма табличной части документа - ITEM_FORM_PREFIX = 'nakladn_items' # префикс формы табличной части + # модель табличной части документа + ITEM_MODEL = NakladnItem + # форма табличной части документа + ITEM_FORM_CLASS = NakladnItemForm + # префикс формы табличной части + ITEM_FORM_PREFIX = 'nakladn_items' - FILTERSET_CLASS = NakladnFilterSet # фильтры + # фильтры + FILTERSET_CLASS = NakladnFilterSet # по какому полю суммировать табличную часть документа при показе списком LIST_SUM_FIELD = 'nakladn_items__total_price' @@ -73,9 +79,9 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): # строки табличной части for item in obj_items: item.clean_price = utils.calc_clean_price(item) - item.clean_total_price = utils.calc_clean_total_price(item) - item.total_nds = utils.calc_total_nds(item) - item.full_total_price = utils.calc_full_total_price(item) + item.clean_total_price = utils.get_clean_total_price(item) + item.total_nds = utils.get_total_nds(item) + item.full_total_price = utils.get_full_total_price(item) # итого табличной части obj.sum_total_nds += item.total_nds obj.sum_full_total_price += item.full_total_price @@ -88,17 +94,21 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): page_rows = 42 # высота в строках + рамки и вертикальные отступы - doc_header_rows = 20 # TODO: рассчитывать! + # TODO: рассчитывать! + doc_header_rows = 20 doc_footer_rows = 26 - tbl_header_rows = 6 + 1 # шапка таблицы - tbl_page_footer_rows = 1 + 1 # подитог (итого по странице) таблицы - tbl_footer_rows = 1 + 1 # подвал таблицы + # шапка таблицы + tbl_header_rows = 6 + 1 + # подитог (итого по странице) таблицы + tbl_page_footer_rows = 1 + 1 + # подвал таблицы + tbl_footer_rows = 1 + 1 curr_rows = doc_header_rows + tbl_header_rows -# print '(start) curr_rows =', curr_rows # если шрифт не моноширный, то в строчках умещается разное количество символов! - chars_per_line = 38 # для наименования + # для наименования + chars_per_line = 38 last_page_item_idx = 0 @@ -118,9 +128,8 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): just_calc_itogo = False # сколько строк займет строка name = wrap(item.name, chars_per_line) - name_rows = max(1, len(name.split('\n'))) + 1 # + отступ/рамка -# print 'name_rows =', name_rows, -# print '(+%s)' % (tbl_page_footer_rows + tbl_footer_rows) + # + отступ/рамка + name_rows = max(1, len(name.split('\n'))) + 1 # строка, подитог и итог не помещаются на странице if (curr_rows + name_rows + tbl_page_footer_rows + tbl_footer_rows > page_rows): @@ -129,9 +138,7 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): prev_item = item else: prev_item = obj_items[idx-1] -# print '--- new page', \ -# curr_rows + name_rows + tbl_page_footer_rows + tbl_footer_rows, \ -# '>', page_rows + prev_item.pdf_pagebreak_after = True prev_item.pdf_page_footer = True calc_itogo(prev_item, last_page_item_idx, idx) @@ -141,7 +148,8 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): else: curr_rows += name_rows else: - if len(obj_items): # только если были записи в табличной части + # только если были записи в табличной части + if len(obj_items): if not just_calc_itogo: item.pdf_page_footer = True calc_itogo(item, last_page_item_idx, idx) @@ -149,4 +157,3 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): curr_rows += tbl_footer_rows if curr_rows + doc_footer_rows > page_rows: item.pdf_pagebreak_after = True -# print 'curr_rows =', curr_rows diff --git a/src/dokumentor/templates/docs/nakladn/form.html b/src/dokumentor/templates/docs/nakladn/form.html index 04d732c..c8c00b0 100644 --- a/src/dokumentor/templates/docs/nakladn/form.html +++ b/src/dokumentor/templates/docs/nakladn/form.html @@ -25,6 +25,7 @@