From f63e73bc0da5b8d13e37cfe72bad7c0a7cb6ea80 Mon Sep 17 00:00:00 2001 From: Dmitriy Shesterkin Date: Sat, 17 Jun 2017 17:34:52 +0300 Subject: [PATCH] add nds metod to akt rabot --- src/docs/utils.py | 20 +++++++++ src/docs/views/aktrabot.py | 10 +++-- src/docs/views/base_views.py | 86 ++++++++++++++++++++++-------------- 3 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/docs/utils.py b/src/docs/utils.py index 9725ba1..34fe153 100644 --- a/src/docs/utils.py +++ b/src/docs/utils.py @@ -36,3 +36,23 @@ def calc_total_nds(obj): def calc_full_total_price(obj): """Считает стоимость с налогом.""" return calc_total_nds(obj) + calc_clean_total_price(obj) + + +def get_total_nds(obj): + """Считает сумму налога.""" + total_price = obj.price * obj.qty + if obj.parent.nds_method: + nds_rate = get_nds(obj.parent.nds_value)/100 + total_nds = total_price * nds_rate + else: + nds_rate = get_nds(obj.parent.nds_value) / (100 + get_nds(obj.parent.nds_value)) + total_nds = total_price * nds_rate + return total_nds + + +def get_full_total_price(obj): + """Считает стоимость с налогом.""" + if obj.parent.nds_method: + return calc_total_nds(obj) + calc_clean_total_price(obj) + else: + return calc_clean_total_price(obj) diff --git a/src/docs/views/aktrabot.py b/src/docs/views/aktrabot.py index 8945c90..8e1aef6 100644 --- a/src/docs/views/aktrabot.py +++ b/src/docs/views/aktrabot.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from decimal import Decimal +from docs.consts import NDS_IN_AMOUNT from docs.models import AktRabot, AktRabotItem from docs.forms import AktRabotForm, AktRabotItemForm from docs.filters import AktRabotFilterSet @@ -69,8 +70,11 @@ class AktRabotViews(BaseItemsViews, AddByInvoiceMethodMixin): obj.sum_full_total_price = Decimal('0.00') for item in obj_items: obj.sum_total_price += item.total_price - obj.sum_total_nds += utils.calc_total_nds(item) - obj.sum_full_total_price += utils.calc_full_total_price(item) + obj.sum_total_nds += utils.get_total_nds(item) + obj.sum_full_total_price += utils.get_full_total_price(item) - s = u'Итого НДС (%s)' % obj.get_nds_value_display() + if obj.nds_method == NDS_IN_AMOUNT: + s = 'В том числе НДС(%s)' % obj.get_nds_value_display() + else: + s = 'Итого НДС (%s)' % obj.get_nds_value_display() obj.nds_itogo_text = s diff --git a/src/docs/views/base_views.py b/src/docs/views/base_views.py index b3937af..42e2590 100644 --- a/src/docs/views/base_views.py +++ b/src/docs/views/base_views.py @@ -59,20 +59,18 @@ class Ordering(object): class BaseViews(object): """Базовые views для простых документов (без табличной части).""" - - MODEL = None # модель документа - FORM_CLASS = None # форма документа - - EMAIL_FORM_CLASS = EmailForm # форма создания и отправки email - + # модель документа + MODEL = None + # форма документа + FORM_CLASS = None + # форма создания и отправки email + EMAIL_FORM_CLASS = EmailForm # поля, по которым можно сортировать список документов ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum',) - - FILTERSET_CLASS = None # фильтры - + # фильтры + FILTERSET_CLASS = None # префикс именованных урлов документов данного типа, для передачи в шаблон URL_PREFIX = '' - # именованные урлы операций URL_LIST = '' URL_EDIT = '' @@ -90,7 +88,8 @@ class BaseViews(object): TEMPLATE_EMAIL = 'docs/email/base_email.html' TEMPLATE_EMAIL_FORM = 'docs/email/base_email_form.html' - EMAIL_MSG_TEMPLATE = 'docs/email/email.txt' # шаблон письма + # шаблон письма + EMAIL_MSG_TEMPLATE = 'docs/email/email.txt' # для генерации pdf/xls PDF_TEMPLATE = '' @@ -127,12 +126,18 @@ class BaseViews(object): def asserts(self): """Проверить объект класса на типичные ошибки.""" - assert self.request is not None, (u"%s.request can't be None!" % self.__class__.__name__) - assert self.MODEL is not None, (u"%s.MODEL can't be None!" % self.__class__.__name__) - assert self.FORM_CLASS is not None, (u"%s.FORM_CLASS can't be None!" % self.__class__.__name__) - assert self.EMAIL_FORM_CLASS is not None, (u"%s.EMAIL_FORM_CLASS can't be None!" % self.__class__.__name__) - assert (isinstance(self.ORDER_FIELDS, tuple) or isinstance(self.ORDER_FIELDS, list)), (u"%s.ORDER_FIELDS should be of tuple or list type!" % self.__class__.__name__) - assert self.FILTERSET_CLASS is not None, (u"%s.FILTERSET_CLASS can't be None!" % self.__class__.__name__) + assert self.request is not None, \ + (u"%s.request can't be None!" % self.__class__.__name__) + assert self.MODEL is not None,\ + (u"%s.MODEL can't be None!" % self.__class__.__name__) + assert self.FORM_CLASS is not None, \ + (u"%s.FORM_CLASS can't be None!" % self.__class__.__name__) + assert self.EMAIL_FORM_CLASS is not None,\ + (u"%s.EMAIL_FORM_CLASS can't be None!" % self.__class__.__name__) + assert (isinstance(self.ORDER_FIELDS, tuple) or isinstance(self.ORDER_FIELDS, list)),\ + (u"%s.ORDER_FIELDS should be of tuple or list type!" % self.__class__.__name__) + assert self.FILTERSET_CLASS is not None, \ + (u"%s.FILTERSET_CLASS can't be None!" % self.__class__.__name__) def set_redirects(self): """Куда редиректить после операции.""" @@ -169,15 +174,18 @@ class BaseViews(object): def get_obj(self, id, only_form_fields=False): """Объект документа или ошибка 404, если его нет в базе. Поведение когда флаг only_form_fields=True: - если в форме редактирования документа задан атрибут Meta.fields, то запрашивает только поля, - перечисленные в нём. Иначе (как и по умолчанию) дампит вообще все поля, которые есть в модели. + если в форме редактирования документа задан атрибут Meta.fields, + то запрашивает только поля, + перечисленные в нём. Иначе (как и по умолчанию) дампит вообще все поля, + которые есть в модели. """ if only_form_fields: try: fields_list = self.FORM_CLASS.Meta.fields except AttributeError: fields_list = [] - return get_object_or_404(self.MODEL.objects.values(*fields_list), pk=id, user=self.request.user) + return get_object_or_404(self.MODEL.objects.values(*fields_list), + pk=id, user=self.request.user) else: return get_object_or_404(self.MODEL, pk=id, user=self.request.user) @@ -188,7 +196,10 @@ class BaseViews(object): return self.FILENAME % (obj.doc_num, client,) def update_list_dict(self, dictionary): - """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + """ + Здесь можно изменить словарь параметров перед передачей его в + шаблон вывода списка документов. + """ dictionary['clients_form'] = ClientsListForm(self.request.user) dictionary['invoices_form'] = InvoicesListForm(self.request.user) @@ -200,7 +211,8 @@ class BaseViews(object): # фильтрация списка filters = self.get_filters(obj_list) - obj_list_count_before_filtering = 0 # сколько записей было в списке до его фильтрации + # сколько записей было в списке до его фильтрации + obj_list_count_before_filtering = 0 if not filters.qs: obj_list_count_before_filtering = obj_list.count() obj_list = filters.qs @@ -245,8 +257,10 @@ class BaseViews(object): @method_decorator(license_required) @method_decorator(csrf_protect) def add(self, *args, **kwargs): - """Добавить документ. - Если при GET-запросе в kwargs передать initial, то создаст предзаполненный документ. + """ + Добавить документ. + Если при GET-запросе в kwargs передать initial, + то создаст предзаполненный документ. """ raise_if_no_profile(self.request) @@ -304,7 +318,8 @@ class BaseViews(object): obj = self.get_obj(kwargs['id']) if self.request.method == 'POST': - form = self.FORM_CLASS(self.request.user, data=self.request.POST, instance=obj) + form = self.FORM_CLASS(self.request.user, + data=self.request.POST, instance=obj) if form.is_valid(): new_obj = form.save() @@ -490,7 +505,8 @@ class BaseViews(object): attachments = [] for f in files: - attachments.append((smart_str(Header(f['filename'], 'cp1251')), f['content'], f['mimetype'])) + attachments.append((smart_str(Header(f['filename'], 'cp1251')), + f['content'], f['mimetype'])) email = EmailMessage(subject=subject, to=(to,), body=email_body, attachments=attachments) return email.send() @@ -615,8 +631,10 @@ class BaseItemsViews(BaseViews): def asserts(self): """Проверить объект класса на типичные ошибки.""" super(BaseItemsViews, self).asserts() - assert self.ITEM_MODEL is not None, (u"%s.ITEM_MODEL can't be None!" % self.__class__.__name__) - assert self.ITEM_FORM_CLASS is not None, (u"%s.ITEM_FORM_CLASS can't be None!" % self.__class__.__name__) + assert self.ITEM_MODEL is not None, \ + (u"%s.ITEM_MODEL can't be None!" % self.__class__.__name__) + assert self.ITEM_FORM_CLASS is not None, \ + (u"%s.ITEM_FORM_CLASS can't be None!" % self.__class__.__name__) def set_item_formset_class(self, extra_count=2): """Класс FormSet-а для табличной части документа.""" @@ -649,7 +667,8 @@ class BaseItemsViews(BaseViews): @method_decorator(csrf_protect) def add(self, *args, initial_items=None, initial=None, **kwargs): """Добавить документ. - Если при GET-запросе в kwargs передать initial и/или initial_items, то создаст предзаполненный документ. + Если при GET-запросе в kwargs передать initial и/или initial_items, + то создаст предзаполненный документ. """ raise_if_no_profile(self.request) @@ -664,7 +683,8 @@ class BaseItemsViews(BaseViews): if self.request.method == 'POST': form = self.FORM_CLASS(self.request.user, data=self.request.POST) - formset = self.ITEM_FORMSET_CLASS(self.request.POST or None, prefix=self.ITEM_FORM_PREFIX) + formset = self.ITEM_FORMSET_CLASS(self.request.POST or None, + prefix=self.ITEM_FORM_PREFIX) receiver_choice = form.data.get('receiver_group', None) sender_choice = form.data.get('sender_group', None) @@ -685,7 +705,8 @@ class BaseItemsViews(BaseViews): item.save() messages.success(self.request, "Документ успешно сохранен") except DatabaseError: - messages.error(self.request, "Ошибка базы данных. Пожалуйста, попробуйте снова") + messages.error(self.request, "Ошибка базы данных. " + "Пожалуйста, попробуйте снова") return redirect(self.REDIRECT_AFTER_ADD) else: initial = initial or self.init_form() @@ -770,7 +791,8 @@ class BaseItemsViews(BaseViews): else: receiver_choice = 'nobody' - formset = self.ITEM_FORMSET_CLASS(self.request.POST or None, prefix=self.ITEM_FORM_PREFIX, instance=obj) + formset = self.ITEM_FORMSET_CLASS(self.request.POST or None, + prefix=self.ITEM_FORM_PREFIX, instance=obj) form = self.FORM_CLASS(self.request.user, data=self.request.POST or None, instance=obj) if form.is_valid() and formset.is_valid():