add nds metod to akt rabot

prod
Dmitriy Shesterkin 9 years ago
parent fc4f074b60
commit f63e73bc0d
  1. 20
      src/docs/utils.py
  2. 10
      src/docs/views/aktrabot.py
  3. 86
      src/docs/views/base_views.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)

@ -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

@ -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():

Loading…
Cancel
Save