From 41572d646c5e424c8135171bebc7afea1a1bddf3 Mon Sep 17 00:00:00 2001 From: Bachurin Sergey Date: Thu, 21 Nov 2013 00:03:09 +0200 Subject: [PATCH] factura started --- project/docs/forms/__init__.py | 1 + project/docs/forms/faktura.py | 52 ++ project/docs/models/__init__.py | 2 + project/docs/models/base_models.py | 12 + project/docs/models/faktura.py | 34 + project/docs/models/refs.py | 22 + project/docs/urls.py | 3 +- project/docs/views/__init__.py | 1 + project/docs/views/faktura.py | 151 +++++ project/templates/docs/docs.html | 4 +- project/templates/docs/faktura/as_pdf.html | 625 ++++++++++++++++++ .../docs/faktura/as_pdf_items_tbl_header.html | 40 ++ project/templates/docs/faktura/form.html | 62 ++ project/templates/docs/faktura/list.html | 39 ++ 14 files changed, 1045 insertions(+), 3 deletions(-) create mode 100644 project/docs/forms/faktura.py create mode 100644 project/docs/models/faktura.py create mode 100644 project/docs/models/refs.py create mode 100644 project/docs/views/faktura.py create mode 100644 project/templates/docs/faktura/as_pdf.html create mode 100644 project/templates/docs/faktura/as_pdf_items_tbl_header.html create mode 100644 project/templates/docs/faktura/form.html create mode 100644 project/templates/docs/faktura/list.html diff --git a/project/docs/forms/__init__.py b/project/docs/forms/__init__.py index 1b0822b..d7456d1 100644 --- a/project/docs/forms/__init__.py +++ b/project/docs/forms/__init__.py @@ -6,3 +6,4 @@ from .aktsverki import AktSverkiForm, AktSverkiAdminForm, AktSverkiItemForm, Akt from .dover import DoverForm, DoverAdminForm, DoverItemForm, DoverItemAdminForm from .platejka import PlatejkaForm, PlatejkaAdminForm from .nakladn import NakladnForm, NakladnAdminForm, NakladnItemForm, NakladnItemAdminForm +from .faktura import FakturaForm, FakturaAdminForm, FakturaItemForm, FakturaItemAdminForm diff --git a/project/docs/forms/faktura.py b/project/docs/forms/faktura.py new file mode 100644 index 0000000..8a13887 --- /dev/null +++ b/project/docs/forms/faktura.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import Faktura, FakturaItem + + +class FakturaForm(BaseModelForm): + """Форма редактирования фактуры.""" + class Meta: + model = Faktura + fields = ('doc_num', 'doc_date', + 'bank_account', 'client', 'invoice', + 'doc_reason', + 'nds_type', 'nds_value', + 'doc_text', 'fixes', 'avance', 'currency', 'sender', 'receiver', + ) + _radioselect = forms.RadioSelect + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'nds_type': _radioselect, + 'doc_text': _textarea, + } + + +class FakturaAdminForm(FakturaForm): + """Форма редактирования фактуры - для админки.""" + class Meta(FakturaForm.Meta): + fields = None + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'doc_text': _textarea, + } + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(FakturaAdminForm, self).__init__(None, *args, **kwargs) + + +class FakturaItemForm(MyBaseModelForm): + """Форма редактирования табличной части фактуры.""" + class Meta: + model = FakturaItem + exclude = ['parent'] + + +class FakturaItemAdminForm(FakturaItemForm): + """Форма редактирования табличной части фактуры - для админки.""" + class Meta(FakturaItemForm.Meta): + exclude = None diff --git a/project/docs/models/__init__.py b/project/docs/models/__init__.py index 4d82639..0c28ab7 100644 --- a/project/docs/models/__init__.py +++ b/project/docs/models/__init__.py @@ -1,6 +1,8 @@ +from .refs import Currency, Country, Measure from .invoice import Invoice, InvoiceItem from .aktrabot import AktRabot, AktRabotItem from .aktsverki import AktSverki, AktSverkiItem from .dover import Dover, DoverItem from .platejka import Platejka from .nakladn import Nakladn, NakladnItem +from .faktura import Faktura, FakturaItem diff --git a/project/docs/models/base_models.py b/project/docs/models/base_models.py index 21aa020..7c07c8b 100644 --- a/project/docs/models/base_models.py +++ b/project/docs/models/base_models.py @@ -98,3 +98,15 @@ class BaseItemInvoiceModel(BaseItemModel): def save(self, *args, **kwargs): self.total_price = self.price * self.qty # пересчитать сумму super(BaseItemInvoiceModel, self).save(*args, **kwargs) + + +class AbstractCatalog(models.Model): + code = models.CharField(u'Код', max_length=200) + name = models.CharField(u'Наименование', max_length=10) + + class Meta: + abstract = True + app_label="docs" + + def __unicode__(self): + return self.name diff --git a/project/docs/models/faktura.py b/project/docs/models/faktura.py new file mode 100644 index 0000000..c5485ec --- /dev/null +++ b/project/docs/models/faktura.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from project.customer.models import Client +from .base_models import BaseInvoiceModel, BaseItemInvoiceModel +from .refs import Currency, Country, Measure +from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin + + +class Faktura(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): + """Счёт-фактура""" + doc_reason = models.CharField(u'Основание', max_length=256, blank=True, default='') + fixes = models.BooleanField(u'Изменения', default=False) + avance = models.BooleanField(u'аванс', default=False) + currency = models.ForeignKey(Currency, verbose_name=u'валюта', null=True) + sender = models.ForeignKey(Client, related_name='sender_fakturas', blank=True, null=True, verbose_name=u'Отправитель') + receiver = models.ForeignKey(Client, related_name='receiver_fakturas', blank=True, null=True, verbose_name=u'Получатель') + + class Meta(BaseInvoiceModel.Meta): + verbose_name = u'Фактура' + verbose_name_plural = u'Фактуры' + app_label="docs" + + +class FakturaItem(BaseItemInvoiceModel): + """Табличная часть фактуры""" + parent = models.ForeignKey(Faktura, related_name='faktura_items') + country = models.ForeignKey(Country, related_name='c_faktura_items') + measure = models.ForeignKey(Measure, related_name='m_faktura_items') + + class Meta(BaseItemInvoiceModel.Meta): + verbose_name = u'Табл. часть фактуры' + verbose_name_plural = u'Табл. части фактур' + app_label="docs" diff --git a/project/docs/models/refs.py b/project/docs/models/refs.py new file mode 100644 index 0000000..4be08e1 --- /dev/null +++ b/project/docs/models/refs.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from .base_models import AbstractCatalog + +class Country(AbstractCatalog): + class Meta(AbstractCatalog.Meta): + verbose_name = u'Страна' + verbose_name_plural = u'Страны' + app_label="docs" + + +class Currency(AbstractCatalog): + class Meta(AbstractCatalog.Meta): + verbose_name = u'Валюта' + verbose_name_plural = u'Валюты' + app_label="docs" + + +class Measure(AbstractCatalog): + class Meta(AbstractCatalog.Meta): + verbose_name = u'Ед. измерения' + verbose_name_plural = u'Ед. измерения' + app_label="docs" diff --git a/project/docs/urls.py b/project/docs/urls.py index c656c02..3789bdc 100644 --- a/project/docs/urls.py +++ b/project/docs/urls.py @@ -1,7 +1,7 @@ # -*- coding: UTF-8 -*- from django.conf.urls import * -from .views import (InvoiceViews, AktRabotViews, AktSverkiViews, DoverViews, PlatejkaViews, NakladnViews) +from .views import (InvoiceViews, AktRabotViews, AktSverkiViews, DoverViews, PlatejkaViews, NakladnViews, FakturaViews) from .views import getview, index @@ -16,6 +16,7 @@ klasses = [ ('dover', DoverViews), ('platejka', PlatejkaViews), ('nakladn', NakladnViews), + ('faktura', FakturaViews), ] for name, klass in klasses: diff --git a/project/docs/views/__init__.py b/project/docs/views/__init__.py index d55424b..2c554d7 100644 --- a/project/docs/views/__init__.py +++ b/project/docs/views/__init__.py @@ -10,6 +10,7 @@ from .aktsverki import AktSverkiViews from .dover import DoverViews from .platejka import PlatejkaViews from .nakladn import NakladnViews +from .faktura import FakturaViews #from .sfv import SfvViews diff --git a/project/docs/views/faktura.py b/project/docs/views/faktura.py new file mode 100644 index 0000000..86fb17e --- /dev/null +++ b/project/docs/views/faktura.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from django.utils.text import wrap + +from ..models import Faktura, FakturaItem +from ..forms import FakturaForm, FakturaItemForm +from .. import utils + +from .base_views import BaseItemsViews +from .mixins import AddByInvoiceMethodMixin + + +class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin): + """Views для накладных торг12.""" + + MODEL = Faktura # модель документа + FORM_CLASS = FakturaForm # форма документа + + ITEM_MODEL = FakturaItem # модель табличной части документа + ITEM_FORM_CLASS = FakturaItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'faktura_items' # префикс формы табличной части + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',) + + # по какому полю суммировать табличную часть документа при показе списком + LIST_SUM_FIELD = 'faktura_items__total_price' + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_faktura_' + + # именованные урлы операций + URL_LIST = 'docs_faktura_list' + URL_EDIT = 'docs_faktura_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/faktura/list.html' + TEMPLATE_FORM = 'docs/faktura/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/faktura/as_pdf.html' + XLS_TEMPLATE = 'faktura.xls' + FILENAME = u'Накладная № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'фактура', # кто? что? + 'rodit': u'фактуры', # кого? чего? + 'dateln': u'фактуре', # кому? чему? + 'vinit': u'фактуру', # кого? что? + 'tvorit': u'фактурой', # кем? чем? + 'predlojn': u'фактуре', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'фактуры', # кто? что? + 'rodit': u'фактур', # кого? чего? + 'dateln': u'фактурам', # кому? чему? + 'vinit': u'фактуры', # кого? что? + 'tvorit': u'фактурами', # кем? чем? + 'predlojn': u'фактурах', # о ком? о чём? + } + + def prepare(self, obj, obj_items, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + obj.sum_total_nds = Decimal('0.00') + obj.sum_full_total_price = Decimal('0.00') + obj.sum_qty = Decimal('0.00') + obj.sum_clean_total_price = Decimal('0.00') + # строки табличной части + 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) + # итого табличной части + obj.sum_total_nds += item.total_nds + obj.sum_full_total_price += item.full_total_price + obj.sum_qty += item.qty + obj.sum_clean_total_price += item.clean_total_price + + # разбивка на страницы и итого по странице + # величины и размеры - приблизительные и подобраны опытным путем! + if export_to == 'pdf': + page_rows = 42 + + # высота в строках + рамки и вертикальные отступы + doc_header_rows = 20 # TODO: рассчитывать! + doc_footer_rows = 26 + 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 # для наименования + + last_page_item_idx = 0 + + def calc_itogo(item, start, stop): + # подитоги по странице + item.sum_qty = 0 + item.sum_clean_total_price = 0 + item.sum_total_nds = 0 + item.sum_full_total_price = 0 + for x in obj_items[start:stop]: + item.sum_qty += x.qty + item.sum_clean_total_price += x.clean_total_price + item.sum_total_nds += x.total_nds + item.sum_full_total_price += x.full_total_price + + for idx, item in enumerate(obj_items): + 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) + # строка, подитог и итог не помещаются на странице + if (curr_rows + name_rows + tbl_page_footer_rows + + tbl_footer_rows > page_rows): + if idx == 0: + item.pdf_pagebreak_before = True + 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) + just_calc_itogo = True + last_page_item_idx = idx + curr_rows = tbl_header_rows + name_rows + else: + curr_rows += name_rows + else: + if len(obj_items): # только если были записи в табличной части + if not just_calc_itogo: + item.pdf_page_footer = True + calc_itogo(item, last_page_item_idx, idx) + curr_rows += tbl_page_footer_rows + 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/project/templates/docs/docs.html b/project/templates/docs/docs.html index d7b7eed..d495646 100644 --- a/project/templates/docs/docs.html +++ b/project/templates/docs/docs.html @@ -1,5 +1,5 @@ {% url 'docs_invoice_list' as url_invoice_list %} -{% url 'docs_sfv_list' as url_sfv_list %} +{% url 'docs_faktura_list' as url_faktura_list %} {% url 'docs_nakladn_list' as url_nakladn_list %} {% url 'docs_aktrabot_list' as url_aktrabot_list %} {% url 'docs_platejka_list' as url_platejka_list %} @@ -10,7 +10,7 @@

-{% if url_sfv_list %}Счета-фактуры{% else %}Счета-фактуры{% endif %} +{% if url_faktura_list %}Счета-фактуры{% else %}Счета-фактуры{% endif %}

diff --git a/project/templates/docs/faktura/as_pdf.html b/project/templates/docs/faktura/as_pdf.html new file mode 100644 index 0000000..afe0e63 --- /dev/null +++ b/project/templates/docs/faktura/as_pdf.html @@ -0,0 +1,625 @@ +{% load my_tags pytils_numeral pytils_dt %} + + + + + + + + + +
+ Унифицированная форма № ТОРГ-12. Утверждена постановлением Госкомстата России от 25.12.98 № 132 +
+ +{# шапка документа #} +
+ + {# строка 1 #} + + + + + + + + + + + + + {# строка 2 #} + + + + + {# строка 3 #} + + + + + + {# строка 4 #} + + + + + + {# строка 5 #} + + + + {# строка 6 #} + + + + + + {# строка 7 #} + + + + + + + + {# строка 8 #} + + + + + + + {# строка 9 #} + + + + + + + {# строка 10 #} + + + + + + + {# строка 11 #} + + + + + + + {# строка 12 #} + + + + + + + {# строка 13 #} + + + + + + {# строка 14 #} + + + + + + + {# строка 15 #} + + + + {# строка 16 #} + + + + + + {# строка 17 #} + + + + + + + + + {# строка 18 #} + + + + + + + + +
Код
Форма по ОКУД0330212
+ {{ profile.get_company_name|safe }} , {{ profile.address|safe }} , + ИНН {{ profile.get_inn_and_kpp }} , тел. {{ profile.get_full_phone }} , + р/с {{ obj.bank_account.account }} в {{ obj.bank_account.name|safe }} , + {{ obj.bank_account.address|safe }} , БИК {{ obj.bank_account.bik }} , + корр/с {{ obj.bank_account.korr_account }} + по ОКПО{{ profile.ip_kod_okpo }}
+ (организация-грузоотправитель, адрес, телефон, факс, банковские реквизиты) +
 
(структурное подразделение)Вид деятельности по ОКДП
Грузополучатель + {{ obj.client.name|safe }} , {{ obj.client.address|safe }} , + ИНН {{ obj.client.get_inn_and_kpp }} , + тел. {{ obj.client.contact_phone }} , + р/с {{ obj.client.bank_account }} в {{ obj.client.bank_name|safe }} , + {{ obj.client.bank_address|safe }} , БИК {{ obj.client.bank_bik }} , + корр/с {{ obj.client.bank_korr_account }} + по ОКПО{{ obj.client.kod_okpo }}
(организация, адрес, телефон, факс, банковские реквизиты){{ profile.ip_kod_okpo }}
Поставщик + {{ profile.get_company_name|safe }} , {{ profile.address|safe }} , + ИНН {{ profile.get_inn_and_kpp }} , тел. {{ profile.get_full_phone }} , + р/с {{ obj.bank_account.account }} в {{ obj.bank_account.name|safe }} , + {{ obj.bank_account.address|safe }} , БИК {{ obj.bank_account.bik }} , + корр/с {{ obj.bank_account.korr_account }} + по ОКПО
(организация, адрес, телефон, факс, банковские реквизиты){{ obj.client.kod_okpo }}
Плательщик + {{ obj.client.name|safe }} , {{ obj.client.address|safe }} , + ИНН {{ obj.client.get_inn_and_kpp }} , + тел. {{ obj.client.contact_phone }} , + р/с {{ obj.client.bank_account }} в {{ obj.client.bank_name|safe }} , + {{ obj.client.bank_address|safe }} , БИК {{ obj.client.bank_bik }} , + корр/с {{ obj.client.bank_korr_account }} + по ОКПО
(организация, адрес, телефон, факс, банковские реквизиты)номер
Основание
(договор, заказ-наряд)дата
Транспортная накладнаяномер
Номер документаДата составлениядата
ТОВАРНАЯ НАКЛАДНАЯ{{ obj.doc_num }}{{ obj.doc_date|date:"d.m.Y" }}Вид операции
+
+ +
+ +
+ +{% for item in obj_items %} + {% if forloop.first %} {# шапка табл., если первая запись #} + {% if item.pdf_pagebreak_before %} {# разрыв страницы перед таблицей #} + + {% endif %} + + {% include "docs/nakladn/as_pdf_items_tbl_header.html" %} + {% endif %} + + {# данные #} + + {# 1 #} + {# 2 #} + {# 3 #} + {# 4 #} + {# 5 #} + {# 6 #} + {# 7 #} + {# 8 #} + {# 9 #} + {# 10 #} + {# 11 #} + {# 12 #} + {# 13 #} + {# 14 #} + {# 15 #} + + + {% if item.pdf_page_footer %} {# подитог #} + + {# 1-2 #} + {# 3 #} + {# 4 #} + {# 5 #} + {# 6 #} + {# 7 #} + {# 8 #} + {# 9 #} + {# 10 #} + {# 11 #} + {# 12 #} + {# 13 #} + {# 14 #} + {# 15 #} + + {% endif %} + + {% if forloop.last %} {# всего по таблице, если последняя запись #} + + {# 1-7 #} + {# 8 #} + {# 9 #} + {# 10 #} + {# 11 #} + {# 12 #} + {# 13 #} + {# 14 #} + {# 15 #} + +
{{ forloop.counter }}{{ item.name|safe }}{{ item.units|safe }}{{ item.qty }}{{ item.clean_price}}{{ item.clean_total_price|floatformat:2 }}{{ obj.get_nds_as_number }}{{ item.total_nds|floatformat:2 }}{{ item.full_total_price|floatformat:2 }}
Итого{{ item.sum_qty|floatformat:3 }}X{{ item.sum_clean_total_price|floatformat:2 }}X{{ item.sum_total_nds|floatformat:2 }}{{ item.sum_full_total_price|floatformat:2 }}
Всего по накладной{{ obj.sum_qty|floatformat:3 }}X{{ obj.sum_clean_total_price|floatformat:2 }}X{{ obj.sum_total_nds|floatformat:2 }}{{ obj.sum_full_total_price|floatformat:2 }}
+ {% if item.pdf_pagebreak_after %} {# разрыв страницы после всей таблицы #} + + {% endif %} + {% endif %} + + {% if not forloop.last %} + {% if item.pdf_pagebreak_after %} {# разрыв страницы после записи #} + + + {# перевывести шапку табл. #} + {% include "docs/nakladn/as_pdf_items_tbl_header.html" %} + {% endif %} + {% endif %} +{% endfor %} + + + +{# подвал документа #} + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Товарная накладная имеет приложение налистах
и содержит{{ obj_items|length|in_words }}порядковых номеров записей
(прописью)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

 
Масса груза (нетто)
(прописью) 
Всего местМасса груза (брутто)
(прописью)(прописью)
+ + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + {# правая половина #} + + + + + + + + + {# правая половина #} + + + + + + + + + + {# правая половина #} + + + + + + {# правая половина #} + + + +
 
Приложение (паспорта, сертификаты и т.п.) налистахПо доверенности №от «»года,
(прописью) 
Всего отпущено на суммувыданной
(прописью)(кем, кому (организация, должность, фамилия, и., о.))
руб.коп. 
  
+ + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + {# правая половина #} + + +
  
Отпуск груза разрешил{{ profile.get_boss_fio }} 
(должность)(подпись)(расшифровка подписи) 
Главный (старший) бухгалтер{{ profile.get_glavbuh_fio }}Груз принял
(подпись)(расшифровка подписи)(должность)(подпись)(расшифровка подписи)
Отпуск груза произвелГруз получил грузополучатель
(должность)(подпись)(расшифровка подписи)(должность)(подпись)(расшифровка подписи)
  
+ + + + + + + + + + + + + + {# правая половина #} + + + + + + + + + + + + +
М.П.«»годаМ.П.«»года
+
+ + + diff --git a/project/templates/docs/faktura/as_pdf_items_tbl_header.html b/project/templates/docs/faktura/as_pdf_items_tbl_header.html new file mode 100644 index 0000000..d9600ed --- /dev/null +++ b/project/templates/docs/faktura/as_pdf_items_tbl_header.html @@ -0,0 +1,40 @@ + + Но-
мер по по-
рядку + Товар + Единица измерения + Вид упаков-
ки + Количество + Масса брутто + Количест-
во (масса
нетто) + Цена,
руб. коп. + Сумма без учета НДС, руб. коп. + НДС + Сумма с
учетом НДС,
руб. коп. + + + наименование,
характеристика, сорт, артикул
товара + код + наиме-
нование + код по ОКЕИ + в одном месте + мест, штук + ставка, % + сумма,
руб. коп. + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + diff --git a/project/templates/docs/faktura/form.html b/project/templates/docs/faktura/form.html new file mode 100644 index 0000000..a898408 --- /dev/null +++ b/project/templates/docs/faktura/form.html @@ -0,0 +1,62 @@ +{% extends "docs/_base/base_form.html" %} + +{% load my_tags %} + +{% block form_content %} +
+ {% include 'docs/parts/form_field.html' with field=form.doc_num id="doc_num" classes="left" label="Номер" required="True" no_clear_after="True" %} + {% include 'docs/parts/form_field.html' with field=form.doc_date id="doc_date" classes="left" label="Дата создания" required="True" %} +
+ +
+ {% include 'docs/parts/form_field.html' with field=form.bank_account id="bank_account" classes="field" label="Расчётный счёт" %} + {% include 'docs/parts/form_field_client.html' with field=form.client required="True" is_ajax="True" %} + {% include 'docs/parts/form_field.html' with field=form.invoice id="invoice" classes="field" label="Создать накладную по счёту" %} + {% include 'docs/parts/form_field.html' with field=form.currency id="currency" classes="field" label="Валюта" %} + {% include 'docs/parts/form_field.html' with field=form.sender id="sender" classes="field" label="Отправитель" %} + {% include 'docs/parts/form_field.html' with field=form.receiver id="sender" classes="field" label="Получатель" %} +
+ +
+ {% include 'docs/parts/form_field.html' with field=form.doc_reason id="doc_reason" classes="field" label="Основание" %} +
+ +
+ {% include 'docs/parts/form_field.html' with field=form.nds_value id="nds_value" classes="left" label="НДС" no_clear_after="True" %} + {% include 'docs/parts/form_field.html' with field=form.nds_type id="nds_type" classes="left" label_inline="True" %} + + {% if formset %} +
+ {% include 'docs/parts/form_tbl_items.html' %} + {% endif %} +
+ +
+ {% include 'docs/parts/form_field.html' with field=form.doc_text id="doc_text" classes="field" label="Дополнительные условия" %} +
+{% endblock %} + +{% block js %} +{% comment %}{% endcomment %} +{% endblock %} diff --git a/project/templates/docs/faktura/list.html b/project/templates/docs/faktura/list.html new file mode 100644 index 0000000..2ace6cf --- /dev/null +++ b/project/templates/docs/faktura/list.html @@ -0,0 +1,39 @@ +{% extends "docs/_base/base_list.html" %} + +{% block table_header %} + Дата  + {% if ordering.order_field == 'doc_date' %}{% if ordering.order_type == 'asc' %}{% else %}{% endif %}{% endif %} + + Номер  + {% if ordering.order_field == 'doc_num' %}{% if ordering.order_type == 'asc' %}{% else %}{% endif %}{% endif %} + + По счёту  + {% if ordering.order_field == 'invoice__doc_num' %}{% if ordering.order_type == 'asc' %}{% else %}{% endif %}{% endif %} + + Контрагент  + {% if ordering.order_field == 'client__name' %}{% if ordering.order_type == 'asc' %}{% else %}{% endif %}{% endif %} + + Сумма  + {% if ordering.order_field == 'doc_sum' %}{% if ordering.order_type == 'asc' %}{% else %}{% endif %}{% endif %} + + Подписана? +{% endblock %} + +{% block table_obj_cells %} + {{ obj.doc_date|date:"d.m.Y" }} + {{ obj.doc_num }} + {{ obj.invoice.doc_num }} + {{ obj.client.name }} + {{ obj.doc_sum|default:"---" }} + {{ obj.get_signed_status_display }} +{% endblock %} + +{% block no-docs-create-new %} + Вы ещё не создали ни одной {{ padeji.rodit }}. Создать. +{% endblock %} + +{% block panel_copy_extra %} + {% comment %}Счёт-фактуру +
{% endcomment %} + Счёт-фактуру
+{% endblock %}