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 #}
+
+ | Форма по ОКУД |
+ 0330212 |
+
+ {# строка 3 #}
+
+ |
+ {{ 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 }} |
+
+ {# строка 4 #}
+
+ |
+ (организация-грузоотправитель, адрес, телефон, факс, банковские реквизиты)
+ |
+ |
+ |
+
+ {# строка 5 #}
+
+ | |
+
+ {# строка 6 #}
+
+ | (структурное подразделение) |
+ Вид деятельности по ОКДП |
+ |
+
+ {# строка 7 #}
+
+ |
+ Грузополучатель |
+
+ {{ 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 }} |
+
+ {# строка 8 #}
+
+ |
+ (организация, адрес, телефон, факс, банковские реквизиты) |
+ |
+ {{ profile.ip_kod_okpo }} |
+
+ {# строка 9 #}
+
+ |
+ Поставщик |
+
+ {{ 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 }}
+ |
+ по ОКПО |
+
+ {# строка 10 #}
+
+ |
+ (организация, адрес, телефон, факс, банковские реквизиты) |
+ |
+ {{ obj.client.kod_okpo }} |
+
+ {# строка 11 #}
+
+ |
+ Плательщик |
+
+ {{ 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 }}
+ |
+ по ОКПО |
+
+ {# строка 12 #}
+
+ |
+ (организация, адрес, телефон, факс, банковские реквизиты) |
+ номер |
+ |
+
+ {# строка 13 #}
+
+ |
+ Основание |
+ |
+
+ {# строка 14 #}
+
+ |
+ (договор, заказ-наряд) |
+ дата |
+ |
+
+ {# строка 15 #}
+
+ |
+
+ {# строка 16 #}
+
+ | Транспортная накладная |
+ номер |
+ |
+
+ {# строка 17 #}
+
+ |
+ Номер документа |
+ Дата составления |
+ |
+ дата |
+ |
+
+ {# строка 18 #}
+
+ |
+ ТОВАРНАЯ НАКЛАДНАЯ |
+ {{ 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 %}
+
+ {# данные #}
+
+ | {{ forloop.counter }} | {# 1 #}
+ {{ item.name|safe }} | {# 2 #}
+ | {# 3 #}
+ {{ item.units|safe }} | {# 4 #}
+ | {# 5 #}
+ | {# 6 #}
+ | {# 7 #}
+ | {# 8 #}
+ | {# 9 #}
+ {{ item.qty }} | {# 10 #}
+ {{ item.clean_price}} | {# 11 #}
+ {{ item.clean_total_price|floatformat:2 }} | {# 12 #}
+ {{ obj.get_nds_as_number }} | {# 13 #}
+ {{ item.total_nds|floatformat:2 }} | {# 14 #}
+ {{ item.full_total_price|floatformat:2 }} | {# 15 #}
+
+
+ {% if item.pdf_page_footer %} {# подитог #}
+
+ | {# 1-2 #}
+ | {# 3 #}
+ | {# 4 #}
+ | {# 5 #}
+ | {# 6 #}
+ Итого | {# 7 #}
+ | {# 8 #}
+ | {# 9 #}
+ {{ item.sum_qty|floatformat:3 }} | {# 10 #}
+ X | {# 11 #}
+ {{ item.sum_clean_total_price|floatformat:2 }} | {# 12 #}
+ X | {# 13 #}
+ {{ item.sum_total_nds|floatformat:2 }} | {# 14 #}
+ {{ item.sum_full_total_price|floatformat:2 }} | {# 15 #}
+
+ {% endif %}
+
+ {% if forloop.last %} {# всего по таблице, если последняя запись #}
+
+ | Всего по накладной | {# 1-7 #}
+ | {# 8 #}
+ | {# 9 #}
+ {{ obj.sum_qty|floatformat:3 }} | {# 10 #}
+ X | {# 11 #}
+ {{ obj.sum_clean_total_price|floatformat:2 }} | {# 12 #}
+ X | {# 13 #}
+ {{ obj.sum_total_nds|floatformat:2 }} | {# 14 #}
+ {{ obj.sum_full_total_price|floatformat:2 }} | {# 15 #}
+
+
+ {% 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 %}