parent
aa6ef5d4b6
commit
41572d646c
14 changed files with 1045 additions and 3 deletions
@ -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 |
||||
@ -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 |
||||
|
||||
@ -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" |
||||
@ -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" |
||||
@ -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 |
||||
@ -0,0 +1,625 @@ |
||||
{% load my_tags pytils_numeral pytils_dt %} |
||||
|
||||
<html> |
||||
<head> |
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
||||
|
||||
<style type="text/css"> |
||||
@page { size: a4 landscape; margin-left: 1.5cm; margin-right: 0.6cm; margin-top: 1cm; margin-bottom: 1cm; } |
||||
@font-face { font-family: Arial; src: url("{% fonts_root %}arial.ttf"); } |
||||
@font-face { font-family: Arial; src: url("{% fonts_root %}arialbd.ttf"); font-weight: bold; } |
||||
|
||||
body { font-family: Arial; font-size: 9pt; line-height: 120%; } |
||||
|
||||
table { border-collapse: collapse; padding-top: 0.3ex; line-height: 120%; -pdf-keep-in-frame-mode: truncate; /*shrink*/ } |
||||
table tr th { font-weight: normal; } |
||||
table tr { padding-left: 0.3ex; padding-right: 0.3ex; } |
||||
table tr td { vertical-align: middle; } |
||||
table .row { text-align: right; } |
||||
|
||||
.center { text-align: center; } |
||||
.left { text-align: left; } |
||||
.right { text-align: right; } |
||||
.top { vertical-align: top; } |
||||
.bottom { vertical-align: bottom; } |
||||
.bold { font-weight: bold; } |
||||
|
||||
.font_6 { font-size: 6pt; } |
||||
.font_7 { font-size: 7pt; } |
||||
.font_8 { font-size: 8pt; } |
||||
.font_9 { font-size: 9pt; } |
||||
.font_10 { font-size: 10pt; } |
||||
.font_12 { font-size: 12pt; } |
||||
.font_14 { font-size: 14pt; } |
||||
|
||||
.borders { border-style: solid; border-width: 1px; border-color: black; } |
||||
.top_border { border-top-style: solid; border-top-width: 1px; border-top-color: black; } |
||||
.top_border_2 { border-top-style: solid; border-top-width: 2px; border-top-color: black; } |
||||
.bottom_border { border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: black; } |
||||
.bottom_border_2 { border-bottom-style: solid; border-bottom-width: 2px; border-bottom-color: black; } |
||||
.left_border { border-left-style: solid; border-left-width: 1px; border-left-color: black; } |
||||
.left_border_2 { border-left-style: solid; border-left-width: 2px; border-left-color: black; } |
||||
.right_border { border-right-style: solid; border-right-width: 1px; border-right-color: black; } |
||||
.right_border_2 { border-right-style: solid; border-right-width: 2px; border-right-color: black; } |
||||
</style> |
||||
|
||||
<body> |
||||
|
||||
<div class="right font_7"> |
||||
Унифицированная форма № ТОРГ-12. Утверждена постановлением Госкомстата России от 25.12.98 № 132 |
||||
</div> |
||||
|
||||
{# шапка документа #} |
||||
<div style="margin-top:1ex;"> |
||||
<table width="100%" class="left font_8"> |
||||
{# строка 1 #} |
||||
<tr> |
||||
<td width="1%"></td> |
||||
<td width="8%"></td> |
||||
<td width="3%"></td> |
||||
<td width="25%"></td> |
||||
<td width="12%"></td> |
||||
<td width="12%"></td> |
||||
<td width="10%"></td> |
||||
<td width="10%"></td> |
||||
<td width="6%"></td> |
||||
<td width="13%" class="center top_border left_border right_border bottom_border_2">Код</td> |
||||
</tr> |
||||
{# строка 2 #} |
||||
<tr> |
||||
<td colspan="9" class="right">Форма по ОКУД</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border">0330212</td> |
||||
</tr> |
||||
{# строка 3 #} |
||||
<tr> |
||||
<td colspan="8" class="bottom bottom_border"> |
||||
{{ 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 }} |
||||
</td> |
||||
<td class="right bottom">по ОКПО</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border">{{ profile.ip_kod_okpo }}</td> |
||||
</tr> |
||||
{# строка 4 #} |
||||
<tr> |
||||
<td colspan="7" class="center font_7 top"> |
||||
(организация-грузоотправитель, адрес, телефон, факс, банковские реквизиты) |
||||
</td> |
||||
<td colspan="2" class="right bottom"></td> |
||||
<td rowspan="2" class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 5 #} |
||||
<tr> |
||||
<td colspan="9" class="font_6 bottom_border"> </td> |
||||
</tr> |
||||
{# строка 6 #} |
||||
<tr> |
||||
<td colspan="7" class="center font_7 top">(структурное подразделение)</td> |
||||
<td colspan="2" class="right bottom">Вид деятельности по ОКДП</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 7 #} |
||||
<tr> |
||||
<td></td> |
||||
<td colspan="2" class="bottom">Грузополучатель</td> |
||||
<td colspan="5" class="bottom bottom_border"> |
||||
{{ 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 }} |
||||
</td> |
||||
<td class="right bottom">по ОКПО</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border">{{ obj.client.kod_okpo }}</td> |
||||
</tr> |
||||
{# строка 8 #} |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td colspan="5" class="center font_7 top">(организация, адрес, телефон, факс, банковские реквизиты)</td> |
||||
<td></td> |
||||
<td rowspan="2" class="center left_border_2 right_border_2 bottom_border">{{ profile.ip_kod_okpo }}</td> |
||||
</tr> |
||||
{# строка 9 #} |
||||
<tr> |
||||
<td></td> |
||||
<td class="bottom">Поставщик</td> |
||||
<td colspan="6" class="bottom bottom_border"> |
||||
{{ 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 }} |
||||
</td> |
||||
<td class="right bottom">по ОКПО</td> |
||||
</tr> |
||||
{# строка 10 #} |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td colspan="5" class="center font_7 top">(организация, адрес, телефон, факс, банковские реквизиты)</td> |
||||
<td></td> |
||||
<td rowspan="2" class="center left_border_2 right_border_2 bottom_border">{{ obj.client.kod_okpo }}</td> |
||||
</tr> |
||||
{# строка 11 #} |
||||
<tr> |
||||
<td></td> |
||||
<td class="bottom">Плательщик</td> |
||||
<td colspan="6" class="bottom bottom_border"> |
||||
{{ 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 }} |
||||
</td> |
||||
<td class="right bottom bottom_border">по ОКПО</td> |
||||
</tr> |
||||
{# строка 12 #} |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td colspan="5" class="center font_7 top">(организация, адрес, телефон, факс, банковские реквизиты)</td> |
||||
<td rowspan="2" class="right bottom left_border bottom_border">номер</td> |
||||
<td rowspan="2" class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 13 #} |
||||
<tr> |
||||
<td></td> |
||||
<td class="bottom">Основание</td> |
||||
<td colspan="6" class="bottom bottom_border"></td> |
||||
</tr> |
||||
{# строка 14 #} |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td colspan="5" class="center font_7 top">(договор, заказ-наряд)</td> |
||||
<td rowspan="2" class="right bottom left_border bottom_border">дата</td> |
||||
<td rowspan="2" class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 15 #} |
||||
<tr> |
||||
<td colspan="8" class="font_6"></td> |
||||
</tr> |
||||
{# строка 16 #} |
||||
<tr> |
||||
<td colspan="8" class="right bottom">Транспортная накладная</td> |
||||
<td class="right bottom left_border bottom_border">номер</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 17 #} |
||||
<tr> |
||||
<td colspan="4"></td> |
||||
<td class="font_9 center left_border top_border bottom_border_2">Номер документа</td> |
||||
<td class="font_9 center left_border top_border right_border bottom_border_2">Дата составления</td> |
||||
<td colspan="2"></td> |
||||
<td class="right bottom left_border bottom_border">дата</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border"></td> |
||||
</tr> |
||||
{# строка 18 #} |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td class="font_10 bold right">ТОВАРНАЯ НАКЛАДНАЯ</td> |
||||
<td class="font_9 center left_border_2 bottom_border_2">{{ obj.doc_num }}</td> |
||||
<td class="font_9 center left_border right_border_2 bottom_border_2">{{ obj.doc_date|date:"d.m.Y" }}</td> |
||||
<td colspan="3" class="right">Вид операции</td> |
||||
<td class="center left_border_2 right_border_2 bottom_border_2"></td> |
||||
</tr> |
||||
</table> |
||||
</div> |
||||
|
||||
<br /> |
||||
|
||||
<div> |
||||
|
||||
{% for item in obj_items %} |
||||
{% if forloop.first %} {# шапка табл., если первая запись #} |
||||
{% if item.pdf_pagebreak_before %} {# разрыв страницы перед таблицей #} |
||||
<pdf:nextpage /> |
||||
{% endif %} |
||||
<table repeat="3" width="100%" class="right font_8"> |
||||
{% include "docs/nakladn/as_pdf_items_tbl_header.html" %} |
||||
{% endif %} |
||||
|
||||
{# данные #} |
||||
<tr class="bottom_border left_border"> |
||||
<td class="center right_border">{{ forloop.counter }}</td>{# 1 #} |
||||
<td class="left right_border_2">{{ item.name|safe }}</td>{# 2 #} |
||||
<td class="right_border_2"></td>{# 3 #} |
||||
<td class="center right_border_2">{{ item.units|safe }}</td>{# 4 #} |
||||
<td class="right_border"></td>{# 5 #} |
||||
<td class="right_border"></td>{# 6 #} |
||||
<td class="right_border"></td>{# 7 #} |
||||
<td class="right_border"></td>{# 8 #} |
||||
<td class="right_border"></td>{# 9 #} |
||||
<td class="right_border">{{ item.qty }}</td>{# 10 #} |
||||
<td class="right_border">{{ item.clean_price}}</td>{# 11 #} |
||||
<td class="right_border_2">{{ item.clean_total_price|floatformat:2 }}</td>{# 12 #} |
||||
<td class="center right_border_2">{{ obj.get_nds_as_number }}</td>{# 13 #} |
||||
<td class="right_border">{{ item.total_nds|floatformat:2 }}</td>{# 14 #} |
||||
<td class="right_border_2">{{ item.full_total_price|floatformat:2 }}</td>{# 15 #} |
||||
</tr> |
||||
|
||||
{% if item.pdf_page_footer %} {# подитог #} |
||||
<tr> |
||||
<td colspan="2"></td>{# 1-2 #} |
||||
<td class="top_border_2"></td>{# 3 #} |
||||
<td></td>{# 4 #} |
||||
<td class="top_border_2"></td>{# 5 #} |
||||
<td class="top_border_2"></td>{# 6 #} |
||||
<td class="top_border_2">Итого</td>{# 7 #} |
||||
<td class="left_border right_border top_border_2 bottom_border"></td>{# 8 #} |
||||
<td class="center left_border right_border top_border_2 bottom_border"></td>{# 9 #} |
||||
<td class="left_border right_border top_border_2 bottom_border">{{ item.sum_qty|floatformat:3 }}</td>{# 10 #} |
||||
<td class="center left_border right_border top_border_2 bottom_border">X</td>{# 11 #} |
||||
<td class="left_border right_border top_border_2 bottom_border">{{ item.sum_clean_total_price|floatformat:2 }}</td>{# 12 #} |
||||
<td class="center left_border right_border bottom_border">X</td>{# 13 #} |
||||
<td class="left_border right_border top_border_2 bottom_border">{{ item.sum_total_nds|floatformat:2 }}</td>{# 14 #} |
||||
<td class="left_border right_border top_border_2 bottom_border">{{ item.sum_full_total_price|floatformat:2 }}</td>{# 15 #} |
||||
</tr> |
||||
{% endif %} |
||||
|
||||
{% if forloop.last %} {# всего по таблице, если последняя запись #} |
||||
<tr> |
||||
<td colspan="7">Всего по накладной</td>{# 1-7 #} |
||||
<td class="left_border right_border bottom_border"></td>{# 8 #} |
||||
<td class="center left_border right_border bottom_border"></td>{# 9 #} |
||||
<td class="left_border right_border bottom_border">{{ obj.sum_qty|floatformat:3 }}</td>{# 10 #} |
||||
<td class="center left_border right_border bottom_border">X</td>{# 11 #} |
||||
<td class="left_border right_border bottom_border">{{ obj.sum_clean_total_price|floatformat:2 }}</td>{# 12 #} |
||||
<td class="center left_border right_border bottom_border">X</td>{# 13 #} |
||||
<td class="left_border right_border bottom_border">{{ obj.sum_total_nds|floatformat:2 }}</td>{# 14 #} |
||||
<td class="left_border right_border bottom_border">{{ obj.sum_full_total_price|floatformat:2 }}</td>{# 15 #} |
||||
</tr> |
||||
</table> |
||||
{% if item.pdf_pagebreak_after %} {# разрыв страницы после всей таблицы #} |
||||
<pdf:nextpage /> |
||||
{% endif %} |
||||
{% endif %} |
||||
|
||||
{% if not forloop.last %} |
||||
{% if item.pdf_pagebreak_after %} {# разрыв страницы после записи #} |
||||
</table> |
||||
<pdf:nextpage /> |
||||
<table repeat="3" width="100%" class="right font_8"> {# перевывести шапку табл. #} |
||||
{% include "docs/nakladn/as_pdf_items_tbl_header.html" %} |
||||
{% endif %} |
||||
{% endif %} |
||||
{% endfor %} |
||||
|
||||
</div> |
||||
|
||||
{# подвал документа #} |
||||
|
||||
<br /> |
||||
|
||||
<div class="left bottom"> |
||||
<table width="100%" class="left font_8"> |
||||
<tr> |
||||
<td width="3%"></td> |
||||
<td width="7%"></td> |
||||
<td width="1%"></td> |
||||
<td width="14%"></td> |
||||
<td width="1%"></td> |
||||
<td width="44%"></td> |
||||
<td width="1%"></td> |
||||
<td width="29%"></td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td colspan="3">Товарная накладная имеет приложение на</td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td>листах</td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td>и содержит</td> |
||||
<td></td> |
||||
<td colspan="3" class="bottom_border">{{ obj_items|length|in_words }}</td> |
||||
<td></td> |
||||
<td>порядковых номеров записей</td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td colspan="3" class="center font_7 top">(прописью)</td> |
||||
<td colspan="2"></td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<table width="100%" class="left font_8"> |
||||
<tr> |
||||
<td width="3%"></td> |
||||
<td width="6%"></td> |
||||
<td width="1%"></td> |
||||
<td width="25%"></td> |
||||
<td width="1%"></td> |
||||
<td width="11%"></td> |
||||
<td width="1%"></td> |
||||
<td width="33%"></td> |
||||
<td width="1%"></td> |
||||
<td width="17%" rowspan="2" class="left_border_2 right_border_2 top_border_2 bottom_border"><br /> </td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td>Масса груза (нетто)</td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
</tr> |
||||
<tr class="center font_7 top"> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td>(прописью)</td> |
||||
<td></td> |
||||
<td rowspan="2" class="left_border_2 right_border_2 bottom_border_2"> </td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td>Всего мест</td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td>Масса груза (брутто)</td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
</tr> |
||||
<tr class="center font_7 top"> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td>(прописью)</td> |
||||
<td></td> |
||||
<td></td> |
||||
<td></td> |
||||
<td>(прописью)</td> |
||||
<td></td> |
||||
<td></td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<table width="100%" class="left font_8"> |
||||
<tr> |
||||
<td width="13%"> </td> |
||||
<td width="1%"></td> |
||||
<td width="9%"></td> |
||||
<td width="1%"></td> |
||||
<td width="12%"></td> |
||||
<td width="3%"></td> |
||||
<td width="5%"></td> |
||||
<td width="1%"></td> |
||||
<td width="1%"></td> |
||||
<td width="4%"></td> |
||||
{# правая половина #} |
||||
<td width="1%"></td> |
||||
<td width="6%"></td> |
||||
<td width="5%"></td> |
||||
<td width="15%"></td> |
||||
<td width="3%"></td> |
||||
<td width="2%"></td> |
||||
<td width="2%"></td> |
||||
<td width="8%"></td> |
||||
<td width="1%"></td> |
||||
<td width="3%"></td> |
||||
<td width="3%"></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="3">Приложение (паспорта, сертификаты и т.п.) на</td> |
||||
<td></td> |
||||
<td colspan="3" class="bottom_border"></td> |
||||
<td></td> |
||||
<td colspan="2" class="right_border">листах</td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="2">По доверенности №</td> |
||||
<td class="bottom_border"></td> |
||||
<td class="right">от «</td> |
||||
<td class="bottom_border"></td> |
||||
<td>»</td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td>года,</td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="4"></td> |
||||
<td colspan="3" class="center font_7 top">(прописью)</td> |
||||
<td colspan="3" class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="10"> </td> |
||||
</tr> |
||||
<tr> |
||||
<td>Всего отпущено на сумму</td> |
||||
<td></td> |
||||
<td colspan="7" class="bottom_border"></td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td>выданной</td> |
||||
<td colspan="9" class="bottom_border"></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="2"></td> |
||||
<td colspan="7" class="center font_7 top">(прописью)</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td></td> |
||||
<td colspan="9" class="center font_7 top">(кем, кому (организация, должность, фамилия, и., о.))</td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="5" class="bottom_border"></td> |
||||
<td>руб.</td> |
||||
<td colspan="3" class="bottom_border"></td> |
||||
<td class="right_border">коп.</td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="10" class="bottom_border"> </td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="10" class="right_border"> </td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="10"> </td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<table width="100%" class="left font_8"> |
||||
<tr> |
||||
<td width="12%"> </td> |
||||
<td width="4%"></td> |
||||
<td width="5%"></td> |
||||
<td width="1%"></td> |
||||
<td width="11%"></td> |
||||
<td width="1%"></td> |
||||
<td width="15%"></td> |
||||
<td width="1%" class="right_border"></td> |
||||
{# правая половина #} |
||||
<td width="1%"> </td> |
||||
<td width="7%"></td> |
||||
<td width="9%"></td> |
||||
<td width="1%"></td> |
||||
<td width="9%"></td> |
||||
<td width="1%"></td> |
||||
<td width="6%"></td> |
||||
<td width="1%"></td> |
||||
<td width="14%"></td> |
||||
</tr> |
||||
<tr> |
||||
<td>Отпуск груза разрешил</td> |
||||
<td colspan="2" class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="center bottom_border">{{ profile.get_boss_fio }}</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="8" class="bottom_border"> </td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td colspan="2" class="center font_7 top">(должность)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(подпись)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(расшифровка подписи)</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="8"> </td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="3">Главный (старший) бухгалтер</td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="center bottom_border">{{ profile.get_glavbuh_fio }}</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td>Груз принял</td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td colspan="3" class="bottom_border"></td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="3"></td> |
||||
<td></td> |
||||
<td class="center font_7 top">(подпись)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(расшифровка подписи)</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td></td> |
||||
<td class="center font_7 top">(должность)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(подпись)</td> |
||||
<td></td> |
||||
<td colspan="3" class="center font_7 top">(расшифровка подписи)</td> |
||||
</tr> |
||||
<tr> |
||||
<td>Отпуск груза произвел</td> |
||||
<td colspan="2" class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="2">Груз получил грузополучатель</td> |
||||
<td colspan="2" class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
<td></td> |
||||
<td class="bottom_border"></td> |
||||
</tr> |
||||
<tr> |
||||
<td></td> |
||||
<td colspan="2" class="center font_7 top">(должность)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(подпись)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(расшифровка подписи)</td> |
||||
<td class="right_border"></td> |
||||
{# правая половина #} |
||||
<td></td> |
||||
<td colspan="2"></td> |
||||
<td colspan="2" class="center font_7 top">(должность)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(подпись)</td> |
||||
<td></td> |
||||
<td class="center font_7 top">(расшифровка подписи)</td> |
||||
</tr> |
||||
<tr> |
||||
<td colspan="8" class="right_border"> </td> |
||||
{# правая половина #} |
||||
<td colspan="9"> </td> |
||||
</tr> |
||||
</table> |
||||
|
||||
<table width="100%" class="left font_8"> |
||||
<tr> |
||||
<td width="10%" class="font_10 right">М.П.</td> |
||||
<td width="3%"></td> |
||||
<td width="1%" class="right">«</td> |
||||
<td width="2%" class="bottom_border"></td> |
||||
<td width="1%">»</td> |
||||
<td width="1%"></td> |
||||
<td width="13%" class="bottom_border"></td> |
||||
<td width="1%"></td> |
||||
<td width="5%" class="bottom_border"></td> |
||||
<td width="14%" class="right_border">года</td> |
||||
{# правая половина #} |
||||
<td width="1%"></td> |
||||
<td width="10%" class="font_10 right">М.П.</td> |
||||
<td width="3%"></td> |
||||
<td width="1%" class="right">«</td> |
||||
<td width="2%" class="bottom_border"></td> |
||||
<td width="1%">»</td> |
||||
<td width="1%"></td> |
||||
<td width="13%" class="bottom_border"></td> |
||||
<td width="1%"></td> |
||||
<td width="5%" class="bottom_border"></td> |
||||
<td width="13%">года</td> |
||||
</tr> |
||||
</table> |
||||
</div> |
||||
|
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,40 @@ |
||||
<tr class="top_border bottom_border left_border right_border"> |
||||
<th rowspan="2">Но-<br />мер по по-<br />рядку</th> |
||||
<th colspan="2">Товар</th> |
||||
<th colspan="2">Единица измерения</th> |
||||
<th rowspan="2">Вид упаков-<br />ки</th> |
||||
<th colspan="2">Количество</th> |
||||
<th rowspan="2">Масса брутто</th> |
||||
<th rowspan="2">Количест-<br />во (масса<br />нетто)</th> |
||||
<th rowspan="2">Цена,<br />руб. коп.</th> |
||||
<th rowspan="2">Сумма без учета НДС, руб. коп.</th> |
||||
<th colspan="2">НДС</th> |
||||
<th rowspan="2">Сумма с<br />учетом НДС,<br />руб. коп.</th> |
||||
</tr> |
||||
<tr class="bottom_border left_border right_border"> |
||||
<th>наименование,<br />характеристика, сорт, артикул<br />товара</th> |
||||
<th>код</th> |
||||
<th>наиме-<br />нование</th> |
||||
<th>код по ОКЕИ</th> |
||||
<th>в одном месте</th> |
||||
<th>мест, штук</th> |
||||
<th>ставка, %</th> |
||||
<th>сумма,<br />руб. коп.</th> |
||||
</tr> |
||||
<tr class="bottom_border left_border"> |
||||
<th width="3%" class="right_border">1</th> |
||||
<th width="21%" class="right_border">2</th> |
||||
<th width="4%" class="right_border bottom_border_2">3</th> |
||||
<th width="5%" class="right_border">4</th> |
||||
<th width="5%" class="right_border bottom_border_2">5</th> |
||||
<th width="5%" class="right_border bottom_border_2">6</th> |
||||
<th width="5%" class="right_border bottom_border_2">7</th> |
||||
<th width="5%" class="right_border bottom_border_2">8</th> |
||||
<th width="5%" class="right_border bottom_border_2">9</th> |
||||
<th width="6%" class="right_border bottom_border_2">10</th> |
||||
<th width="9%" class="right_border bottom_border_2">11</th> |
||||
<th width="7%" class="right_border bottom_border_2">12</th> |
||||
<th width="4%" class="right_border">13</th> |
||||
<th width="7%" class="right_border bottom_border_2">14</th> |
||||
<th width="9%" class="right_border bottom_border_2">15</th> |
||||
</tr> |
||||
@ -0,0 +1,39 @@ |
||||
{% extends "docs/_base/base_list.html" %} |
||||
|
||||
{% block table_header %} |
||||
<th><a href="?{{ ordering.order_var }}=doc_date&{{ ordering.order_type_var }}={% if ordering.order_field == 'doc_date' %}{% if ordering.order_type == 'asc' %}desc{% else %}asc{% endif %}{% else %}asc{% endif %}">Дата</a> |
||||
{% if ordering.order_field == 'doc_date' %}{% if ordering.order_type == 'asc' %}<span title="01-31">↑</span>{% else %}<span title="31-01">↓</span>{% endif %}{% endif %}</th> |
||||
|
||||
<th><a href="?{{ ordering.order_var }}=doc_num&{{ ordering.order_type_var }}={% if ordering.order_field == 'doc_num' %}{% if ordering.order_type == 'asc' %}desc{% else %}asc{% endif %}{% else %}asc{% endif %}">Номер</a> |
||||
{% if ordering.order_field == 'doc_num' %}{% if ordering.order_type == 'asc' %}<span title="1-9">↑</span>{% else %}<span title="9-1">↓</span>{% endif %}{% endif %}</th> |
||||
|
||||
<th><a href="?{{ ordering.order_var }}=invoice__doc_num&{{ ordering.order_type_var }}={% if ordering.order_field == 'invoice__doc_num' %}{% if ordering.order_type == 'asc' %}desc{% else %}asc{% endif %}{% else %}asc{% endif %}">По счёту</a> |
||||
{% if ordering.order_field == 'invoice__doc_num' %}{% if ordering.order_type == 'asc' %}<span title="1-9">↑</span>{% else %}<span title="9-1">↓</span>{% endif %}{% endif %}</th> |
||||
|
||||
<th><a href="?{{ ordering.order_var }}=client__name&{{ ordering.order_type_var }}={% if ordering.order_field == 'client__name' %}{% if ordering.order_type == 'asc' %}desc{% else %}asc{% endif %}{% else %}asc{% endif %}">Контрагент</a> |
||||
{% if ordering.order_field == 'client__name' %}{% if ordering.order_type == 'asc' %}<span title="А-Я">↑</span>{% else %}<span title="Я-А">↓</span>{% endif %}{% endif %}</th> |
||||
|
||||
<th><a href="?{{ ordering.order_var }}=doc_sum&{{ ordering.order_type_var }}={% if ordering.order_field == 'doc_sum' %}{% if ordering.order_type == 'asc' %}desc{% else %}asc{% endif %}{% else %}asc{% endif %}">Сумма</a> |
||||
{% if ordering.order_field == 'doc_sum' %}{% if ordering.order_type == 'asc' %}<span title="1-9">↑</span>{% else %}<span title="9-1">↓</span>{% endif %}{% endif %}</th> |
||||
|
||||
<th>Подписана?</th> |
||||
{% endblock %} |
||||
|
||||
{% block table_obj_cells %} |
||||
<td><a href="{{ url_edit }}">{{ obj.doc_date|date:"d.m.Y" }}</a></td> |
||||
<td>{{ obj.doc_num }}</td> |
||||
<td>{{ obj.invoice.doc_num }}</td> |
||||
<td>{{ obj.client.name }}</td> |
||||
<td>{{ obj.doc_sum|default:"---" }}</td> |
||||
<td>{{ obj.get_signed_status_display }}</td> |
||||
{% endblock %} |
||||
|
||||
{% block no-docs-create-new %} |
||||
Вы ещё не создали ни одной {{ padeji.rodit }}. <a id="add-new" href="{{ url_add }}">Создать</a>. |
||||
{% endblock %} |
||||
|
||||
{% block panel_copy_extra %} |
||||
{% comment %}<a href="{{ url_sfv_by_invoice }}" title="Счёт-фактуру">Счёт-фактуру</a> |
||||
<br />{% endcomment %} |
||||
<span style="color:#666">Счёт-фактуру</span><br /> |
||||
{% endblock %} |
||||
Loading…
Reference in new issue