factura started

remotes/origin/yandex
Bachurin Sergey 12 years ago
parent aa6ef5d4b6
commit 41572d646c
  1. 1
      project/docs/forms/__init__.py
  2. 52
      project/docs/forms/faktura.py
  3. 2
      project/docs/models/__init__.py
  4. 12
      project/docs/models/base_models.py
  5. 34
      project/docs/models/faktura.py
  6. 22
      project/docs/models/refs.py
  7. 3
      project/docs/urls.py
  8. 1
      project/docs/views/__init__.py
  9. 151
      project/docs/views/faktura.py
  10. 4
      project/templates/docs/docs.html
  11. 625
      project/templates/docs/faktura/as_pdf.html
  12. 40
      project/templates/docs/faktura/as_pdf_items_tbl_header.html
  13. 62
      project/templates/docs/faktura/form.html
  14. 39
      project/templates/docs/faktura/list.html

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

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

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

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

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

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

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

@ -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 @@
<br /><br />
{% if url_sfv_list %}<a href="{{ url_sfv_list }}">Счета-фактуры</a>{% else %}Счета-фактуры{% endif %}
{% if url_faktura_list %}<a href="{{ url_faktura_list }}">Счета-фактуры</a>{% else %}Счета-фактуры{% endif %}
<br /><br />

@ -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">&nbsp;</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 />&nbsp;</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">&nbsp;</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%">&nbsp;</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">&nbsp;</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">&nbsp;</td>
</tr>
<tr>
<td colspan="10" class="right_border">&nbsp;</td>
{# правая половина #}
<td></td>
<td colspan="10">&nbsp;</td>
</tr>
</table>
<table width="100%" class="left font_8">
<tr>
<td width="12%">&nbsp;</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%">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</td>
{# правая половина #}
<td colspan="9">&nbsp;</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,62 @@
{% extends "docs/_base/base_form.html" %}
{% load my_tags %}
{% block form_content %}
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 15px 0; margin-top: 0;">
{% 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" %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 5px 0;">
{% 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="Получатель" %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 5px 0;">
{% include 'docs/parts/form_field.html' with field=form.doc_reason id="doc_reason" classes="field" label="Основание" %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 15px 0;">
{% 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 %}
<br />
{% include 'docs/parts/form_tbl_items.html' %}
{% endif %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 10px 0;">
{% include 'docs/parts/form_field.html' with field=form.doc_text id="doc_text" classes="field" label="Дополнительные условия" %}
</div>
{% endblock %}
{% block js %}
{% comment %}<script type="text/javascript">
{% include 'docs/_common_js/add_line_handler.js' %}
{% include 'docs/_common_js/calc_summa.js' %}
{% include 'docs/_common_js/calc_itogo.js' %}
function set_events() {
$("#tbl_items tr.row td.qty input").blur(calc_summa);
$("#tbl_items tr.row td.price input").blur(calc_summa);
$("#tbl_items tr.row td.qty input").blur(calc_itogo);
$("#tbl_items tr.row td.price input").blur(calc_itogo);
$("#tbl_items tr.row td.total_price input").blur(calc_itogo);
}
$(document).ready(function() {
EnterToTab.init(document.getElementById('aktrabot'), true);
$("#id_doc_date").datepicker({dateFormat:'dd.mm.yy'});
set_events();
calc_itogo();
add_line_handler();
});
</script>{% endcomment %}
{% endblock %}

@ -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>&nbsp;
{% if ordering.order_field == 'doc_date' %}{% if ordering.order_type == 'asc' %}<span title="01-31">&uarr;</span>{% else %}<span title="31-01">&darr;</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>&nbsp;
{% if ordering.order_field == 'doc_num' %}{% if ordering.order_type == 'asc' %}<span title="1-9">&uarr;</span>{% else %}<span title="9-1">&darr;</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>&nbsp;
{% if ordering.order_field == 'invoice__doc_num' %}{% if ordering.order_type == 'asc' %}<span title="1-9">&uarr;</span>{% else %}<span title="9-1">&darr;</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>&nbsp;
{% if ordering.order_field == 'client__name' %}{% if ordering.order_type == 'asc' %}<span title="А-Я">&uarr;</span>{% else %}<span title="Я-А">&darr;</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>&nbsp;
{% if ordering.order_field == 'doc_sum' %}{% if ordering.order_type == 'asc' %}<span title="1-9">&uarr;</span>{% else %}<span title="9-1">&darr;</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…
Cancel
Save