Российская локализация для v17
This commit is contained in:
parent
f27293b640
commit
f0659575dd
14
l10n_ru_act_rev/README.md
Normal file
14
l10n_ru_act_rev/README.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Российская локализация - Акт сверки
|
||||||
|
name: l10n_ru_act_rev
|
||||||
|
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Добавление печатной формы акт сверки из контактов, с помощью которой можно легко отслеживать дебеторские и кредиторские проводки с клиентами.
|
||||||
|
|
||||||
|
### Для печати:
|
||||||
|
1. Выбираем меню Контакты - карточку конкретного партнера - Действия - "Печать акт сверки";
|
||||||
|
2. В визарде выбираем:
|
||||||
|
2.1. Компанию (для которой нужна сверка с выбранным контактом);
|
||||||
|
2.2. Период сверки;
|
||||||
|
2.3. Цель (один из режимом: все проведенные проводки или все проводки, включая черновики);
|
||||||
|
3. Кнопка "Печать"
|
4
l10n_ru_act_rev/__init__.py
Normal file
4
l10n_ru_act_rev/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from . import models
|
||||||
|
from . import report
|
||||||
|
from . import wizard
|
||||||
|
from . import controllers
|
45
l10n_ru_act_rev/__manifest__.py
Normal file
45
l10n_ru_act_rev/__manifest__.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Российская локализация - Акт сверки",
|
||||||
|
|
||||||
|
'summary': """
|
||||||
|
Добавление отчета акт сверки""",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
Добавление формы акт сверки, находящегося в контактах, с помощью которого можно легко отслеживать дебеторские и кредиторские проводки с клиентами.
|
||||||
|
|
||||||
|
Для печати:
|
||||||
|
1. Выбираем меню Контакты - конкретного партнера - Действия - "Печать акт сверки";
|
||||||
|
2. В визарде выбираем:
|
||||||
|
2.1. Компанию (для которой нужна сверка с выбранным контактом);
|
||||||
|
2.2. Период сверки;
|
||||||
|
2.3. Цель (один из режимом: все проведенные проводки или все проводки, включая черновики);
|
||||||
|
3. Кнопка "Печать"
|
||||||
|
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "MK.Lab",
|
||||||
|
'website': "https://www.inf-centre.ru/",
|
||||||
|
|
||||||
|
'category': 'Uncategorized',
|
||||||
|
'version': '0.1',
|
||||||
|
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
"depends": ["account", "portal", "website", 'contacts', "l10n_ru_doc", 'l10n_ru_contract', 'l10n_ru_base'],
|
||||||
|
"data": [
|
||||||
|
"security/ir.model.access.csv",
|
||||||
|
"wizard/general_ledger_wizard_view.xml",
|
||||||
|
"report/layouts.xml",
|
||||||
|
"report/general_ledger.xml",
|
||||||
|
"views/account_account_views.xml",
|
||||||
|
"views/report_general_ledger.xml",
|
||||||
|
"views/portal_templates.xml",
|
||||||
|
],
|
||||||
|
"installable": True,
|
||||||
|
"application": True,
|
||||||
|
"auto_install": False,
|
||||||
|
# only loaded in demonstration mode
|
||||||
|
'demo': [
|
||||||
|
'demo/demo.xml',
|
||||||
|
],
|
||||||
|
}
|
3
l10n_ru_act_rev/controllers/__init__.py
Normal file
3
l10n_ru_act_rev/controllers/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import controllers
|
89
l10n_ru_act_rev/controllers/controllers.py
Normal file
89
l10n_ru_act_rev/controllers/controllers.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
from odoo import http
|
||||||
|
from odoo.http import request
|
||||||
|
from datetime import datetime, date
|
||||||
|
|
||||||
|
|
||||||
|
class ActRevise(http.Controller):
|
||||||
|
|
||||||
|
@http.route(['/my/act_revise/<string:act>'], type='http', auth="public", website=True)
|
||||||
|
def print_report(self):
|
||||||
|
partner = request.env.user.partner_id.parent_id.id
|
||||||
|
partner_name = request.env.user.partner_id.parent_id.name
|
||||||
|
if not partner:
|
||||||
|
partner = request.env.user.partner_id.id
|
||||||
|
partner_name = request.env.user.partner_id.name
|
||||||
|
company = request.env.user.company_id.id
|
||||||
|
company_name = request.env.user.company_id.name
|
||||||
|
today = date.today()
|
||||||
|
d1 = today.strftime("%d.%m.%y")
|
||||||
|
|
||||||
|
wizard_data = {
|
||||||
|
"target_move": "posted",
|
||||||
|
"hide_account_at_0": True,
|
||||||
|
"foreign_currency": True,
|
||||||
|
"company_id": company,
|
||||||
|
"partner_ids": [partner],
|
||||||
|
"show_cost_center": True,
|
||||||
|
"centralize": True
|
||||||
|
}
|
||||||
|
wizard_record = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data)
|
||||||
|
|
||||||
|
action = request.env.ref('l10n_ru_act_rev.action_general_ledger_wizard').read()[0]
|
||||||
|
action['res_id'] = wizard_record.id
|
||||||
|
action['context'] = dict(request.env.context)
|
||||||
|
return request.redirect('/web#action=' + str(action['id']) + '&id=' + str(wizard_record.id) + '&view_type=form')
|
||||||
|
|
||||||
|
# @http.route(['/my/act_revise/<string:act>'], type='http', auth="public", website=True)
|
||||||
|
# def print_report(self):
|
||||||
|
# partner = request.env.user.partner_id.parent_id.id
|
||||||
|
# partner_name = request.env.user.partner_id.parent_id.name
|
||||||
|
# if not partner:
|
||||||
|
# partner = request.env.user.partner_id.id
|
||||||
|
# partner_name = request.env.user.partner_id.name
|
||||||
|
# company = request.env.user.company_id.id
|
||||||
|
# company_name = request.env.user.company_id.name
|
||||||
|
# today = date.today()
|
||||||
|
# d1 = today.strftime("%d.%m.%y")
|
||||||
|
# # new_url = str('Акт Сверки ' + d1 + ' ' + company_name + '_' + partner_name)
|
||||||
|
# # new_url=str('AC ' + company +' - ' + partner + ' ' + d1)
|
||||||
|
# # if request.httprequest.full_path == '/my/act_revise/a?':
|
||||||
|
# # return werkzeug.utils.redirect('/my/act_revise/%s' % new_url)
|
||||||
|
# wizard_data = {"target_move": "posted",
|
||||||
|
# "hide_account_at_0": True,
|
||||||
|
# "foreign_currency": True,
|
||||||
|
# #"show_analytic_tags": True,
|
||||||
|
# "company_id": company,
|
||||||
|
# "partner_ids": [partner],
|
||||||
|
# #"show_partner_details": True,
|
||||||
|
# "show_cost_center": True,
|
||||||
|
# "centralize": True}
|
||||||
|
# t = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data)
|
||||||
|
# data = t._prepare_report_general_ledger()
|
||||||
|
# name = t.get_report_filename()
|
||||||
|
# report_name = name.encode('cp1251')
|
||||||
|
# pdf, _ = request.env['ir.actions.report']._render_qweb_pdf(
|
||||||
|
# 'act_revise.action_print_report_general_ledger_qweb', res_ids=t.id, data=data)
|
||||||
|
# pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)), ]
|
||||||
|
# return request.make_response(pdf, headers=pdfhttpheaders)
|
||||||
|
|
||||||
|
@http.route(['/my/act_revise_contact/<string:act>'], type='http', auth="public", website=True)
|
||||||
|
def print_report_contact(self, date_to, date_from, target_move, company, partner):
|
||||||
|
partner_id = int(partner) or 'default_partner_value'
|
||||||
|
company_id = int(company)
|
||||||
|
wizard_data = {"date_to": date_to,
|
||||||
|
"date_from": date_from,
|
||||||
|
"target_move": target_move,
|
||||||
|
"hide_account_at_0": True,
|
||||||
|
"foreign_currency": True,
|
||||||
|
#"show_analytic_tags": True,
|
||||||
|
"company_id": company_id,
|
||||||
|
"partner_ids": [partner_id],
|
||||||
|
#"show_partner_details": True,
|
||||||
|
"show_cost_center": True,
|
||||||
|
"centralize": True}
|
||||||
|
t = request.env['general.ledger.act_revise.wizard'].sudo().create(wizard_data)
|
||||||
|
data = t._prepare_report_general_ledger()
|
||||||
|
pdf, _ = request.env['ir.actions.report']._render_qweb_pdf(
|
||||||
|
'l10n_ru_act_rev.action_print_report_general_ledger_qweb', res_ids=t.id, data=data)
|
||||||
|
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)), ]
|
||||||
|
return request.make_response(pdf, headers=pdfhttpheaders)
|
30
l10n_ru_act_rev/demo/demo.xml
Normal file
30
l10n_ru_act_rev/demo/demo.xml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!--
|
||||||
|
<record id="object0" model="act_revise.act_revise">
|
||||||
|
<field name="name">Object 0</field>
|
||||||
|
<field name="value">0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object1" model="act_revise.act_revise">
|
||||||
|
<field name="name">Object 1</field>
|
||||||
|
<field name="value">10</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object2" model="act_revise.act_revise">
|
||||||
|
<field name="name">Object 2</field>
|
||||||
|
<field name="value">20</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object3" model="act_revise.act_revise">
|
||||||
|
<field name="name">Object 3</field>
|
||||||
|
<field name="value">30</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object4" model="act_revise.act_revise">
|
||||||
|
<field name="name">Object 4</field>
|
||||||
|
<field name="value">40</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
2
l10n_ru_act_rev/models/__init__.py
Normal file
2
l10n_ru_act_rev/models/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import account_account
|
||||||
|
from . import ir_actions_report
|
7
l10n_ru_act_rev/models/account_account.py
Normal file
7
l10n_ru_act_rev/models/account_account.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from odoo import fields, models, _
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAccount(models.Model):
|
||||||
|
_inherit = "account.account"
|
||||||
|
|
||||||
|
centralized = fields.Boolean(_("Централизованно"))
|
10
l10n_ru_act_rev/models/ir_actions_report.py
Normal file
10
l10n_ru_act_rev/models/ir_actions_report.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
|
class IrActionsReport(models.Model):
|
||||||
|
_inherit = "ir.actions.report"
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _prepare_account_financial_report_context(self, data):
|
||||||
|
lang = data and data.get("account_financial_report_lang") or ""
|
||||||
|
return dict(self.env.context or {}, lang=lang) if lang else False
|
2
l10n_ru_act_rev/report/__init__.py
Normal file
2
l10n_ru_act_rev/report/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import general_ledger
|
||||||
|
|
1045
l10n_ru_act_rev/report/general_ledger.py
Normal file
1045
l10n_ru_act_rev/report/general_ledger.py
Normal file
File diff suppressed because it is too large
Load Diff
286
l10n_ru_act_rev/report/general_ledger.xml
Normal file
286
l10n_ru_act_rev/report/general_ledger.xml
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<template id="l10n_ru_act_rev.general_ledger">
|
||||||
|
<t t-call="l10n_ru_act_rev.html_container">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-call="l10n_ru_act_rev.internal_layout">
|
||||||
|
<t t-call="l10n_ru_act_rev.report_general_ledger_base" />
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
<template id="l10n_ru_act_rev.report_general_ledger_base">
|
||||||
|
<t t-set="foreign_currency" t-value="foreign_currency" />
|
||||||
|
<t t-set="filter_partner_ids" t-value="filter_partner_ids" />
|
||||||
|
<div class="page">
|
||||||
|
<style type="text/css">
|
||||||
|
body { background: #ffffff; margin: 0; font-family: Arial; font-size: 10pt; font-style: normal; text-align: center;}
|
||||||
|
tbody, table, tr, td, th { border: none;}
|
||||||
|
tr.R0{ height: 15px; border: border: none; }
|
||||||
|
tr.R0 td.R0t{text-align: center; font-family: Tahoma; font-size: 14pt; font-weight: bold;}
|
||||||
|
tr.R0 td.R0j{text-align: justify }
|
||||||
|
tr.R0 td.R0l{text-align: left}
|
||||||
|
tr.R0 td.R0lb{font-weight: bold; text-align: left}
|
||||||
|
tr.R0 td.R0lbt{font-weight: bold; text-align: left; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0lbox{text-align: left; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid; vertical-align: middle;}
|
||||||
|
tr.R0 td.R0cbox{text-align: center; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid; vertical-align: middle;}
|
||||||
|
tr.R0 td.R0lbbox{font-weight: bold; text-align: left; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid; vertical-align: middle;}
|
||||||
|
tr.R0 td.R0rbox{text-align: right; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0rbbox{font-weight: bold; text-align: right; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.Rcbox{text-align: center; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0cbbox{font-weight: bold; text-align: center; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0lboxf{background: #FFFFCC;text-align: left; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0lbboxf{background: #FFFFCC;font-weight: bold; text-align: left; border-left: #000000 1px
|
||||||
|
solid; border-top: #000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px
|
||||||
|
solid;}
|
||||||
|
tr.R0 td.R0rboxf{background: #FFFFCC;text-align: right; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0rbboxf{background: #FFFFCC;font-weight: bold; text-align: right; border-left: #000000 1px
|
||||||
|
solid; border-top: #000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px
|
||||||
|
solid;}
|
||||||
|
tr.R0 td.Rcboxf{background: #FFFFCC;text-align: center; border-left: #000000 1px solid; border-top:
|
||||||
|
#000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0cbboxf{background: #FFFFCC;font-weight: bold; text-align: center; border-left: #000000 1px
|
||||||
|
solid; border-top: #000000 1px solid; border-right: #000000 1px solid; border-bottom: #000000 1px
|
||||||
|
solid; vertical-align: middle;}
|
||||||
|
tr.R0 td.R0print span img { position: absolute; width: 140px; top: -80px; left: -350px; }
|
||||||
|
tr.R0 td.R0print { overflow: visible; }
|
||||||
|
tr.R0 td.R0print span { position: relative; }
|
||||||
|
tr.R0 td.R0print{ text-align: left; }
|
||||||
|
tr.R0 td.R0fas { font-family: Arial; font-size: 7pt; font-style: normal; text-align: right; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R0fas { overflow: visible; }
|
||||||
|
tr.R0 td.R0fas span { position: relative; }
|
||||||
|
tr.R0 td.R0fas span img { position: absolute; width: 100px; top: -25px; left: 200px;}
|
||||||
|
</style>
|
||||||
|
<t t-set="lines" t-value='[]' />
|
||||||
|
<t t-set="total_debit_init_all" t-value='0.0'/>
|
||||||
|
<t t-set="total_credit_init_all" t-value='0.0'/>
|
||||||
|
|
||||||
|
<t t-foreach="general_ledger" t-as="account">
|
||||||
|
<t t-if="'list_grouped' in account">
|
||||||
|
<t t-foreach="account['list_grouped']" t-as="group_item">
|
||||||
|
|
||||||
|
<t
|
||||||
|
t-set="misc_domain"
|
||||||
|
t-value="[('account_id', '=', account['id']),('date', '<', date_from)]"
|
||||||
|
/>
|
||||||
|
<t
|
||||||
|
t-set="misc_grouped_domain"
|
||||||
|
t-value="[('partner_id', '=', group_item['id'])]"
|
||||||
|
t-if="'partners' in account"
|
||||||
|
/>
|
||||||
|
<t t-set="misc_grouped_domain" t-value="[]" t-else="" />
|
||||||
|
<t t-set="debit_domain" t-value="[('debit', '<>', 0)]" />
|
||||||
|
<span
|
||||||
|
t-att-domain="misc_domain+debit_domain+misc_grouped_domain"
|
||||||
|
res-model="account.move.line"
|
||||||
|
>
|
||||||
|
<t t-set="total_debit_init" t-value="group_item['init_bal']['debit']" />
|
||||||
|
<t t-set="total_debit_init_all" t-value='total_debit_init_all+total_debit_init'/>
|
||||||
|
</span>
|
||||||
|
<t t-set="credit_domain" t-value="[('credit', '<>', 0)]" />
|
||||||
|
<span
|
||||||
|
t-att-domain="misc_domain+credit_domain+misc_grouped_domain"
|
||||||
|
res-model="account.move.line"
|
||||||
|
>
|
||||||
|
<t t-set="total_credit_init" t-value="group_item['init_bal']['credit']" />
|
||||||
|
<t t-set="total_credit_init_all" t-value='total_credit_init_all+total_credit_init'/>
|
||||||
|
</span>
|
||||||
|
<t t-set="lines" t-value='lines+group_item["move_lines"]' />
|
||||||
|
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
<t t-set="lines" t-value='o.sorted_lines(lines)'/>
|
||||||
|
<t t-set="total_debit" t-value='0.0' />
|
||||||
|
<t t-set="total_credit" t-value='0.0' />
|
||||||
|
<TABLE CELLSPACING="0">
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<COL WIDTH="14%"/>
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<COL WIDTH="14%"/>
|
||||||
|
<COL WIDTH="12%"/>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0t">Акт сверки</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8">взаимных расчетов за период: <t t-esc="o.get_data_format(date_from) or ''"/> - <t t-esc="o.get_data_format(date_to) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<t t-set="pid" t-value="o.partner_ids[0].parent_id or o.partner_ids[0]"/>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8">между: <t t-esc="company_name"/> и <t t-esc="pid.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8"><t t-if="o.get_contract()">по договору №<t t-esc="o.get_contract().name"/> от <t t-esc="o.get_contract().date_start"/></t></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0j">Мы, нижеподписавшиеся, <t t-esc="company_name"/> с одной стороны, и <t t-esc="pid.name"/>, с другой стороны, составили данный акт сверки в том, что, состояние взаимных расчетов по данным учета следующее:</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="4" CLASS="R0lbox">По данным <t t-esc="company_name"/>, руб</td>
|
||||||
|
<td colspan="4" CLASS="R0lbox">По данным <t t-esc="pid.name"/>, руб</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td CLASS="R0cbbox">Дата</td>
|
||||||
|
<td CLASS="R0cbbox">Документ</td>
|
||||||
|
<td CLASS="R0cbbox">Дебет</td>
|
||||||
|
<td CLASS="R0cbbox">Кредит</td>
|
||||||
|
<td CLASS="R0cbbox">Дата</td>
|
||||||
|
<td CLASS="R0cbbox">Документ</td>
|
||||||
|
<td CLASS="R0cbbox">Дебет</td>
|
||||||
|
<td CLASS="R0cbbox">Кредит</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<t
|
||||||
|
t-set="misc_domain"
|
||||||
|
t-value="[('account_id', '=', account['id']),('date', '<', date_from)]"
|
||||||
|
/>
|
||||||
|
<t
|
||||||
|
t-set="misc_grouped_domain"
|
||||||
|
t-value="[('partner_id', '=', group_item['id'])]"
|
||||||
|
t-if="'partners' in account"
|
||||||
|
/>
|
||||||
|
<t t-set="misc_grouped_domain" t-value="[]" t-else="" />
|
||||||
|
<td colspan="2" CLASS="R0lbox">Сальдо начальное</td>
|
||||||
|
<td CLASS="R0cbox"><span t-esc="'%0.2f'%(total_debit_init_all)"/></td>
|
||||||
|
<td CLASS="R0cbox"><span t-esc="'%0.2f'%(total_credit_init_all)"/></td>
|
||||||
|
<td colspan="2" CLASS="R0lbox">Сальдо начальное</td>
|
||||||
|
<td CLASS="R0cbox"></td>
|
||||||
|
<td CLASS="R0cbox"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0" t-foreach="lines" t-as="line">
|
||||||
|
<t t-set="total_debit" t-value="total_debit+line['debit']" />
|
||||||
|
<t t-set="total_credit" t-value="total_credit+line['credit']" />
|
||||||
|
<td CLASS="R0cbox"><t t-esc="o.get_data_format(line['date']) or ''"/></td>
|
||||||
|
<td CLASS="R0lbox"><t t-raw="line['entry']"/></td>
|
||||||
|
<td CLASS="R0cbox"><t t-raw="'%0.2f'%(line['debit'])"/></td>
|
||||||
|
<td CLASS="R0cbox"><t t-raw="'%0.2f'%(line['credit'])"/></td>
|
||||||
|
<td CLASS="R0cbox"></td>
|
||||||
|
<td CLASS="R0lbox"></td>
|
||||||
|
<td CLASS="R0cbox"></td>
|
||||||
|
<td CLASS="R0cbox"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="2" CLASS="R0lbbox">Обороты за период</td>
|
||||||
|
<td CLASS="R0cbbox"><t t-raw="'%0.2f'%(total_debit)"/>
|
||||||
|
</td>
|
||||||
|
<td CLASS="R0cbbox"><t t-raw="'%0.2f'%(total_credit)"/>
|
||||||
|
</td>
|
||||||
|
<td colspan="2" CLASS="R0lbbox">Обороты за период</td>
|
||||||
|
<td CLASS="R0cbbox"></td>
|
||||||
|
<td CLASS="R0cbbox"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="2" CLASS="R0lbbox">Сальдо конечное</td>
|
||||||
|
<td CLASS="R0cbbox"><t t-raw="'%0.2f'%(total_debit_init_all+total_debit)"/></td>
|
||||||
|
<td CLASS="R0cbbox"><t t-raw="'%0.2f'%(total_credit_init_all+total_credit)"/></td>
|
||||||
|
<td colspan="2" CLASS="R0lbbox">Сальдо конечное</td>
|
||||||
|
<td CLASS="R0cbbox"></td>
|
||||||
|
<td CLASS="R0cbbox"></td>
|
||||||
|
</tr>
|
||||||
|
<t t-set="total_balance_fin" t-value='(total_debit_init_all+total_debit)-(total_credit_init_all+total_credit)'/>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="4" CLASS="R0l">По данным <t t-esc="company_name"/></td>
|
||||||
|
<td colspan="4" CLASS="R0l">По данным <t t-esc="pid.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="4" CLASS="R0lb">на <t t-esc="o.get_data_format(date_to) or ''"/> задолженность в пользу <t t-if="total_balance_fin>=0"><t t-esc="company_name"/></t><t t-else=""><t t-esc="pid.name"/></t> <t t-esc="'%0.2f'%(abs(total_balance_fin))"/> руб. (<t t-esc="o.rubles(abs(total_balance_fin)) or ''"/>)"
|
||||||
|
</td>
|
||||||
|
<td colspan="4" CLASS="R0lb">на <t t-esc="o.get_data_format(date_to) or ''"/> задолженность в пользу <t t-if="total_balance_fin>=0"><t t-esc="company_name"/></t><t t-else=""><t t-esc="pid.name"/></t> <t t-esc="'%0.2f'%(abs(total_balance_fin))"/> руб. (<t t-esc="o.rubles(abs(total_balance_fin)) or ''"/>)"
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="4" CLASS="R0l">От <t t-esc="company_name"/></td>
|
||||||
|
<td colspan="4" CLASS="R0l">От <t t-esc="pid.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="4" CLASS="R0lb"><t t-esc="o.company_id.chief_id.function or ''"/></td>
|
||||||
|
<td colspan="4" CLASS="R0lb">Директор</td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="8" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="2" CLASS="R0fas"><SPAN><t t-raw="o.company_id.print_facsimile and o.img(o.company_id.chief_id.facsimile) or ''"/></SPAN></td>
|
||||||
|
<td colspan="2" CLASS="R0lb"><t t-esc="o.initials(o.company_id.chief_id.name) or ''"/></td>
|
||||||
|
<td colspan="2" CLASS="R0lb"></td>
|
||||||
|
<td colspan="2" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
<tr CLASS="R0">
|
||||||
|
<td colspan="2" CLASS="R0lbt">М.П.</td>
|
||||||
|
<td colspan="2" CLASS="R0print"><SPAN><t t-raw="o.company_id.print_stamp and (o.company_id.print_anywhere or context.get('mark_invoice_as_sent', False)) and o.img(o.company_id.stamp) or ''"/></SPAN></td>
|
||||||
|
<td colspan="2" CLASS="R0lbt">М.П.</td>
|
||||||
|
<td colspan="2" CLASS="R0lb"></td>
|
||||||
|
</tr>
|
||||||
|
</TABLE>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- <report-->
|
||||||
|
<!-- id="action_print_report_general_ledger_qweb"-->
|
||||||
|
<!-- model="general.ledger.report.wizard"-->
|
||||||
|
<!-- string="Акт сверки"-->
|
||||||
|
<!-- report_type="qweb-pdf"-->
|
||||||
|
<!-- menu="False"-->
|
||||||
|
<!-- name="act_revise.general_ledger"-->
|
||||||
|
<!-- file="act_revise.general_ledger"-->
|
||||||
|
<!-- print_report_name=" 'Акт сверки - %s' %s (object.get_report_filename()) or ''"-->
|
||||||
|
<!-- />-->
|
||||||
|
<record id="action_print_report_general_ledger_qweb" model="ir.actions.report">
|
||||||
|
<field name="name">Акт сверки</field>
|
||||||
|
<field name="model">general.ledger.act_revise.wizard</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_act_rev.general_ledger</field>
|
||||||
|
<field name="report_file">l10n_ru_act_rev.general_ledger</field>
|
||||||
|
<field name="print_report_name">'Акт сверки - %s' % (object.get_report_filename() or '')</field>
|
||||||
|
<field name="binding_model_id" ref="model_general_ledger_act_revise_wizard"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="report_qweb_paperformat" model="report.paperformat">
|
||||||
|
<field name="name">Account financial report qweb paperformat</field>
|
||||||
|
<field name="default" eval="True" />
|
||||||
|
<field name="format">custom</field>
|
||||||
|
<field name="page_height">297</field>
|
||||||
|
<field name="page_width">210</field>
|
||||||
|
<field name="orientation">Landscape</field>
|
||||||
|
<field name="margin_top">12</field>
|
||||||
|
<field name="margin_bottom">8</field>
|
||||||
|
<field name="margin_left">5</field>
|
||||||
|
<field name="margin_right">5</field>
|
||||||
|
<field name="header_line" eval="False" />
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">110</field>
|
||||||
|
</record>
|
||||||
|
<record id="action_print_report_general_ledger_qweb" model="ir.actions.report">
|
||||||
|
<field name="paperformat_id" ref="report_qweb_paperformat" />
|
||||||
|
</record>
|
||||||
|
</odoo>
|
34
l10n_ru_act_rev/report/layouts.xml
Normal file
34
l10n_ru_act_rev/report/layouts.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<template id="l10n_ru_act_rev.html_container">
|
||||||
|
<t t-set="body_classname" t-value="'container'" />
|
||||||
|
<t t-call="web.report_layout">
|
||||||
|
<t t-out="0" />
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
<template id="l10n_ru_act_rev.internal_layout">
|
||||||
|
<div class="article o_account_financial_reports_page">
|
||||||
|
<t t-out="0" />
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6 custom_footer">
|
||||||
|
<span
|
||||||
|
t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 text-right custom_footer">
|
||||||
|
<ul class="list-inline">
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="page" />
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">/</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="topage" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</odoo>
|
2
l10n_ru_act_rev/security/ir.model.access.csv
Normal file
2
l10n_ru_act_rev/security/ir.model.access.csv
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_general_ledger_act_revise_wizard,general.ledger.act_revise.wizard,model_general_ledger_act_revise_wizard,base.group_user,1,1,1,1
|
|
14
l10n_ru_act_rev/views/account_account_views.xml
Normal file
14
l10n_ru_act_rev/views/account_account_views.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_account_form" model="ir.ui.view">
|
||||||
|
<field name="name">account.account.form.inherit</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_form" />
|
||||||
|
<field name="model">account.account</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="deprecated" position="after">
|
||||||
|
<field name="centralized" />
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
12
l10n_ru_act_rev/views/portal_templates.xml
Normal file
12
l10n_ru_act_rev/views/portal_templates.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="portal_my_home_act_revise" name="Portal My Home : act revise" inherit_id="portal.portal_my_home" priority="40">
|
||||||
|
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
|
||||||
|
<a t-attf-href="/my/act_revise/a">
|
||||||
|
<button type="button" class="btn btn-primary btn-md o_website_form_send">Печатать акт сверки</button>
|
||||||
|
</a>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
9
l10n_ru_act_rev/views/report_general_ledger.xml
Normal file
9
l10n_ru_act_rev/views/report_general_ledger.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<template id="report_general_ledger">
|
||||||
|
<div class="o_act_revise_page">
|
||||||
|
<t t-call="l10n_ru_act_rev.report_buttons" />
|
||||||
|
<t t-call="l10n_ru_act_rev.report_general_ledger_base" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</odoo>
|
2
l10n_ru_act_rev/wizard/__init__.py
Normal file
2
l10n_ru_act_rev/wizard/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import abstract_wizard
|
||||||
|
from . import general_ledger_wizard
|
38
l10n_ru_act_rev/wizard/abstract_wizard.py
Normal file
38
l10n_ru_act_rev/wizard/abstract_wizard.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
from odoo import models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractWizard(models.AbstractModel):
|
||||||
|
_name = "act_revise.abstract_wizard"
|
||||||
|
_description = "Abstract Wizard"
|
||||||
|
|
||||||
|
def _get_partner_ids_domain(self):
|
||||||
|
return [
|
||||||
|
"&",
|
||||||
|
"|",
|
||||||
|
("company_id", "=", self.company_id.id),
|
||||||
|
("company_id", "=", False),
|
||||||
|
"|",
|
||||||
|
("parent_id", "=", False),
|
||||||
|
("is_company", "=", True),
|
||||||
|
]
|
||||||
|
|
||||||
|
def _default_partners(self):
|
||||||
|
context = self.env.context
|
||||||
|
if context.get("active_ids") and context.get("active_model") == "res.partner":
|
||||||
|
partners = self.env["res.partner"].browse(context["active_ids"])
|
||||||
|
corp_partners = partners.filtered("parent_id")
|
||||||
|
partners -= corp_partners
|
||||||
|
partners |= corp_partners.mapped("commercial_partner_id")
|
||||||
|
return partners.ids
|
||||||
|
|
||||||
|
company_id = fields.Many2one(
|
||||||
|
comodel_name="res.company",
|
||||||
|
default=lambda self: self.env.company.id,
|
||||||
|
required=False,
|
||||||
|
string="Компания",
|
||||||
|
)
|
||||||
|
|
||||||
|
def button_export_pdf(self):
|
||||||
|
self.ensure_one()
|
||||||
|
report_type = "qweb-pdf"
|
||||||
|
return self._export(report_type)
|
898
l10n_ru_act_rev/wizard/general_ledger_wizard.py
Normal file
898
l10n_ru_act_rev/wizard/general_ledger_wizard.py
Normal file
@ -0,0 +1,898 @@
|
|||||||
|
import logging
|
||||||
|
import time
|
||||||
|
from ast import literal_eval
|
||||||
|
from odoo import _, api, fields, models
|
||||||
|
from odoo.tools import date_utils,pycompat
|
||||||
|
from pytils import dt,numeral
|
||||||
|
from datetime import datetime, date
|
||||||
|
import re
|
||||||
|
import urllib
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
class GeneralLedgerReportWizard(models.TransientModel):
|
||||||
|
"""General ledger report wizard."""
|
||||||
|
|
||||||
|
_name = "general.ledger.act_revise.wizard"
|
||||||
|
_description = "General Ledger Report Wizard"
|
||||||
|
_inherit = "act_revise.abstract_wizard"
|
||||||
|
|
||||||
|
# date_range_id = fields.Many2one(comodel_name="date.range", string="Date range")
|
||||||
|
date_from = fields.Date(string="Начало даты", required=True, default=lambda self: self._init_date_from())
|
||||||
|
date_to = fields.Date(string="Конец даты", required=True, default=fields.Date.context_today)
|
||||||
|
fy_start_date = fields.Date(compute="_compute_fy_start_date")
|
||||||
|
target_move = fields.Selection(
|
||||||
|
[("posted", "Все проведенные проводки"), ("all", "Все проводки")],
|
||||||
|
string="Цель операции",
|
||||||
|
required=True,
|
||||||
|
default="posted",
|
||||||
|
)
|
||||||
|
account_ids = fields.Many2many(
|
||||||
|
comodel_name="account.account", string=_("Filter accounts")
|
||||||
|
)
|
||||||
|
centralize = fields.Boolean(string=_("Activate centralization"), default=True)
|
||||||
|
hide_account_at_0 = fields.Boolean(
|
||||||
|
string=_("Hide account ending balance at 0"),
|
||||||
|
help=_("Use this filter to hide an account or a partner "
|
||||||
|
"with an ending balance at 0. "
|
||||||
|
"If partners are filtered, "
|
||||||
|
"debits and credits totals will not match the trial balance."),
|
||||||
|
)
|
||||||
|
receivable_accounts_only = fields.Boolean()
|
||||||
|
payable_accounts_only = fields.Boolean()
|
||||||
|
partner_ids = fields.Many2many(
|
||||||
|
comodel_name="res.partner",
|
||||||
|
string=_("Filter partners"),
|
||||||
|
default=lambda self: self._default_partners(),
|
||||||
|
)
|
||||||
|
account_journal_ids = fields.Many2many(
|
||||||
|
comodel_name="account.journal", string=_("Filter journals")
|
||||||
|
)
|
||||||
|
cost_center_ids = fields.Many2many(
|
||||||
|
comodel_name="account.analytic.account", string=_("Filter cost centers")
|
||||||
|
)
|
||||||
|
|
||||||
|
not_only_one_unaffected_earnings_account = fields.Boolean(readonly=True)
|
||||||
|
foreign_currency = fields.Boolean(
|
||||||
|
string=_("Show foreign currency"),
|
||||||
|
help=_("Display foreign currency for move lines, unless "
|
||||||
|
"account currency is not setup through chart of accounts "
|
||||||
|
"will display initial and final balance in that currency."),
|
||||||
|
default=lambda self: self._default_foreign_currency(),
|
||||||
|
)
|
||||||
|
account_code_from = fields.Many2one(
|
||||||
|
comodel_name="account.account",
|
||||||
|
help="Starting account in a range",
|
||||||
|
)
|
||||||
|
account_code_to = fields.Many2one(
|
||||||
|
comodel_name="account.account",
|
||||||
|
help="Ending account in a range",
|
||||||
|
)
|
||||||
|
grouped_by = fields.Selection(
|
||||||
|
selection=[("", "None"), ("partners", "Partners"), ("taxes", "Taxes")],
|
||||||
|
default="partners",
|
||||||
|
)
|
||||||
|
show_cost_center = fields.Boolean(
|
||||||
|
string="Show Analytic Account",
|
||||||
|
default=True,
|
||||||
|
)
|
||||||
|
domain = fields.Char(
|
||||||
|
string="Journal Items Domain",
|
||||||
|
default=[],
|
||||||
|
help="This domain will be used to select specific domain for Journal " "Items",
|
||||||
|
)
|
||||||
|
|
||||||
|
# def _print_report(self, report_type):
|
||||||
|
# self.ensure_one()
|
||||||
|
# data = self._prepare_report_general_ledger()
|
||||||
|
# report = self.env["ir.actions.report"].search(
|
||||||
|
# [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, )
|
||||||
|
# if self.partner_ids[0].parent_id:
|
||||||
|
# partner = int(self.partner_ids[0].parent_id.id)
|
||||||
|
# else:
|
||||||
|
# partner = int(self.partner_ids[0].id)
|
||||||
|
# return {
|
||||||
|
# 'type': 'ir.actions.act_url',
|
||||||
|
# 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % (
|
||||||
|
# urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move,
|
||||||
|
# self.company_id.id, partner),
|
||||||
|
# 'target': 'new',
|
||||||
|
# }
|
||||||
|
|
||||||
|
def _get_account_move_lines_domain(self):
|
||||||
|
domain = literal_eval(self.domain) if self.domain else []
|
||||||
|
return domain
|
||||||
|
|
||||||
|
@api.onchange("account_code_from", "account_code_to")
|
||||||
|
def on_change_account_range(self):
|
||||||
|
if (
|
||||||
|
self.account_code_from
|
||||||
|
and self.account_code_from.code.isdigit()
|
||||||
|
and self.account_code_to
|
||||||
|
and self.account_code_to.code.isdigit()
|
||||||
|
):
|
||||||
|
start_range = self.account_code_from.code
|
||||||
|
end_range = self.account_code_to.code
|
||||||
|
self.account_ids = self.env["account.account"].search(
|
||||||
|
[("code", ">=", start_range), ("code", "<=", end_range)]
|
||||||
|
)
|
||||||
|
if self.company_id:
|
||||||
|
self.account_ids = self.account_ids.filtered(
|
||||||
|
lambda a: a.company_id == self.company_id
|
||||||
|
)
|
||||||
|
|
||||||
|
def _init_date_from(self):
|
||||||
|
"""set start date to begin of current year if fiscal year running"""
|
||||||
|
today = fields.Date.context_today(self)
|
||||||
|
company = self.company_id or self.env.company
|
||||||
|
last_fsc_month = company.fiscalyear_last_month
|
||||||
|
last_fsc_day = company.fiscalyear_last_day
|
||||||
|
|
||||||
|
if (
|
||||||
|
today.month < int(last_fsc_month)
|
||||||
|
or today.month == int(last_fsc_month)
|
||||||
|
and today.day <= last_fsc_day
|
||||||
|
):
|
||||||
|
return time.strftime("%Y-01-01")
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _default_foreign_currency(self):
|
||||||
|
return self.env.user.has_group("base.group_multi_currency")
|
||||||
|
|
||||||
|
@api.depends("date_from")
|
||||||
|
def _compute_fy_start_date(self):
|
||||||
|
for wiz in self:
|
||||||
|
if wiz.date_from:
|
||||||
|
date_from, date_to = date_utils.get_fiscal_year(
|
||||||
|
wiz.date_from,
|
||||||
|
day=self.company_id.fiscalyear_last_day,
|
||||||
|
month=int(self.company_id.fiscalyear_last_month),
|
||||||
|
)
|
||||||
|
wiz.fy_start_date = date_from
|
||||||
|
else:
|
||||||
|
wiz.fy_start_date = False
|
||||||
|
|
||||||
|
@api.onchange("company_id")
|
||||||
|
def onchange_company_id(self):
|
||||||
|
"""Handle company change."""
|
||||||
|
count = self.env["account.account"].search_count(
|
||||||
|
[
|
||||||
|
("account_type", "=", "equity_unaffected"),
|
||||||
|
("company_id", "=", self.company_id.id),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
self.not_only_one_unaffected_earnings_account = count != 1
|
||||||
|
# if (
|
||||||
|
# self.company_id
|
||||||
|
# and self.date_range_id.company_id
|
||||||
|
# and self.date_range_id.company_id != self.company_id
|
||||||
|
# ):
|
||||||
|
# self.date_range_id = False
|
||||||
|
if self.company_id and self.account_journal_ids:
|
||||||
|
self.account_journal_ids = self.account_journal_ids.filtered(
|
||||||
|
lambda p: p.company_id == self.company_id or not p.company_id
|
||||||
|
)
|
||||||
|
if self.company_id and self.partner_ids:
|
||||||
|
self.partner_ids = self.partner_ids.filtered(
|
||||||
|
lambda p: p.company_id == self.company_id or not p.company_id
|
||||||
|
)
|
||||||
|
if self.company_id and self.account_ids:
|
||||||
|
if self.receivable_accounts_only or self.payable_accounts_only:
|
||||||
|
self.onchange_type_accounts_only()
|
||||||
|
else:
|
||||||
|
self.account_ids = self.account_ids.filtered(
|
||||||
|
lambda a: a.company_id == self.company_id
|
||||||
|
)
|
||||||
|
if self.company_id and self.cost_center_ids:
|
||||||
|
self.cost_center_ids = self.cost_center_ids.filtered(
|
||||||
|
lambda c: c.company_id == self.company_id
|
||||||
|
)
|
||||||
|
res = {
|
||||||
|
"domain": {
|
||||||
|
"account_ids": [],
|
||||||
|
"partner_ids": [],
|
||||||
|
"account_journal_ids": [],
|
||||||
|
"cost_center_ids": [],
|
||||||
|
# "date_range_id": [],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if not self.company_id:
|
||||||
|
return res
|
||||||
|
else:
|
||||||
|
res["domain"]["account_ids"] += [("company_id", "=", self.company_id.id)]
|
||||||
|
res["domain"]["account_journal_ids"] += [
|
||||||
|
("company_id", "=", self.company_id.id)
|
||||||
|
]
|
||||||
|
res["domain"]["partner_ids"] += self._get_partner_ids_domain()
|
||||||
|
res["domain"]["cost_center_ids"] += [
|
||||||
|
("company_id", "=", self.company_id.id)
|
||||||
|
]
|
||||||
|
# res["domain"]["date_range_id"] += [
|
||||||
|
# "|",
|
||||||
|
# ("company_id", "=", self.company_id.id),
|
||||||
|
# ("company_id", "=", False),
|
||||||
|
# ]
|
||||||
|
return res
|
||||||
|
|
||||||
|
# @api.onchange("date_range_id")
|
||||||
|
# def onchange_date_range_id(self):
|
||||||
|
# """Handle date range change."""
|
||||||
|
# if self.date_range_id:
|
||||||
|
# self.date_from = self.date_range_id.date_start
|
||||||
|
# self.date_to = self.date_range_id.date_end
|
||||||
|
|
||||||
|
# @api.constrains("company_id", "date_range_id")
|
||||||
|
# def _check_company_id_date_range_id(self):
|
||||||
|
# for rec in self.sudo():
|
||||||
|
# if (
|
||||||
|
# rec.company_id
|
||||||
|
# and rec.date_range_id.company_id
|
||||||
|
# and rec.company_id != rec.date_range_id.company_id
|
||||||
|
# ):
|
||||||
|
# raise ValidationError(
|
||||||
|
# _(
|
||||||
|
# "The Company in the General Ledger Report Wizard and in "
|
||||||
|
# "Date Range must be the same."
|
||||||
|
# )
|
||||||
|
# )
|
||||||
|
|
||||||
|
@api.onchange("receivable_accounts_only", "payable_accounts_only")
|
||||||
|
def onchange_type_accounts_only(self):
|
||||||
|
"""Handle receivable/payable accounts only change."""
|
||||||
|
if self.receivable_accounts_only or self.payable_accounts_only:
|
||||||
|
domain = [("company_id", "=", self.company_id.id)]
|
||||||
|
if self.receivable_accounts_only and self.payable_accounts_only:
|
||||||
|
domain += [
|
||||||
|
("account_type", "in", ("asset_receivable", "liability_payable"))
|
||||||
|
]
|
||||||
|
elif self.receivable_accounts_only:
|
||||||
|
domain += [("account_type", "=", "asset_receivable")]
|
||||||
|
elif self.payable_accounts_only:
|
||||||
|
domain += [("account_type", "=", "liability_payable")]
|
||||||
|
self.account_ids = self.env["account.account"].search(domain)
|
||||||
|
else:
|
||||||
|
self.account_ids = None
|
||||||
|
|
||||||
|
@api.onchange("partner_ids")
|
||||||
|
def onchange_partner_ids(self):
|
||||||
|
"""Handle partners change."""
|
||||||
|
if self.partner_ids:
|
||||||
|
self.receivable_accounts_only = self.payable_accounts_only = True
|
||||||
|
else:
|
||||||
|
self.receivable_accounts_only = self.payable_accounts_only = False
|
||||||
|
|
||||||
|
@api.depends("company_id")
|
||||||
|
def _compute_unaffected_earnings_account(self):
|
||||||
|
for record in self:
|
||||||
|
record.unaffected_earnings_account = self.env["account.account"].search(
|
||||||
|
[
|
||||||
|
("account_type", "=", "equity_unaffected"),
|
||||||
|
("company_id", "=", record.company_id.id),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
unaffected_earnings_account = fields.Many2one(
|
||||||
|
comodel_name="account.account",
|
||||||
|
compute="_compute_unaffected_earnings_account",
|
||||||
|
store=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# def _print_report(self, report_type):
|
||||||
|
# self.ensure_one()
|
||||||
|
# data = self._prepare_report_general_ledger()
|
||||||
|
# report_name = "act_revise.general_ledger"
|
||||||
|
# return (
|
||||||
|
# self.env["ir.actions.report"]
|
||||||
|
# .search(
|
||||||
|
# [("report_name", "=", report_name), ("report_type", "=", report_type)],
|
||||||
|
# limit=1,
|
||||||
|
# )
|
||||||
|
# .report_action(self, data=data)
|
||||||
|
# )
|
||||||
|
def _print_report(self, report_type):
|
||||||
|
self.ensure_one()
|
||||||
|
data = self._prepare_report_general_ledger()
|
||||||
|
report = self.env["ir.actions.report"].search(
|
||||||
|
[("report_name", "=", "l10n_ru_act_rev.general_ledger"), ("report_type", "=", report_type)], limit=1, )
|
||||||
|
|
||||||
|
if self.partner_ids[0].parent_id:
|
||||||
|
partner = int(self.partner_ids[0].parent_id.id)
|
||||||
|
else:
|
||||||
|
partner = int(self.partner_ids[0].id)
|
||||||
|
account_data = self.env['account.move.line'].sudo().search([
|
||||||
|
('partner_id', '=', partner),
|
||||||
|
('account_id.account_type', 'in', ('liability_payable', 'asset_receivable')),
|
||||||
|
('account_id.non_trade', '=', False),
|
||||||
|
('date', '<=', self.date_to),
|
||||||
|
('date', '>=', self.date_from)
|
||||||
|
])
|
||||||
|
logging.warning(f'account_data {account_data}')
|
||||||
|
if self.target_move == 'posted' and not account_data.filtered(lambda p: p.parent_state == 'posted') or not account_data:
|
||||||
|
raise UserError(f'Проводок для формирования акта по введенным условиям не найдено.')
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_url',
|
||||||
|
'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % (
|
||||||
|
urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move,
|
||||||
|
self.company_id.id, partner),
|
||||||
|
'target': 'new',
|
||||||
|
}
|
||||||
|
|
||||||
|
def _prepare_report_general_ledger(self):
|
||||||
|
self.ensure_one()
|
||||||
|
return {
|
||||||
|
"wizard_id": self.id,
|
||||||
|
"date_from": self.date_from,
|
||||||
|
"date_to": self.date_to,
|
||||||
|
"only_posted_moves": self.target_move == "posted",
|
||||||
|
"hide_account_at_0": self.hide_account_at_0,
|
||||||
|
"foreign_currency": self.foreign_currency,
|
||||||
|
"company_id": self.company_id.id,
|
||||||
|
"account_ids": self.account_ids.ids,
|
||||||
|
"partner_ids": self.partner_ids.ids,
|
||||||
|
"grouped_by": self.grouped_by,
|
||||||
|
"cost_center_ids": self.cost_center_ids.ids,
|
||||||
|
"show_cost_center": self.show_cost_center,
|
||||||
|
"journal_ids": self.account_journal_ids.ids,
|
||||||
|
"centralize": self.centralize,
|
||||||
|
"fy_start_date": self.fy_start_date,
|
||||||
|
"unaffected_earnings_account": self.unaffected_earnings_account.id,
|
||||||
|
"account_financial_report_lang": self.env.lang,
|
||||||
|
"domain": self._get_account_move_lines_domain(),
|
||||||
|
}
|
||||||
|
|
||||||
|
def _export(self, report_type):
|
||||||
|
"""Default export is PDF."""
|
||||||
|
return self._print_report(report_type)
|
||||||
|
|
||||||
|
def _get_atr_from_dict(self, obj_id, data, key):
|
||||||
|
try:
|
||||||
|
return data[obj_id][key]
|
||||||
|
except KeyError:
|
||||||
|
return data[str(obj_id)][key]
|
||||||
|
|
||||||
|
def numer(self, name):
|
||||||
|
if name:
|
||||||
|
numeration = re.findall('\d+$', name)
|
||||||
|
if numeration: return numeration[0]
|
||||||
|
return name
|
||||||
|
|
||||||
|
def get_data_format(self, date):
|
||||||
|
if date and date != 'False':
|
||||||
|
return dt.ru_strftime(u'%d.%m.%Y г.', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True)
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def initials(self, fio):
|
||||||
|
if fio:
|
||||||
|
return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip()
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def rubles(self, sum):
|
||||||
|
"Transform sum number in rubles to text"
|
||||||
|
text_rubles = numeral.rubles(int(sum))
|
||||||
|
copeck = round((sum - int(sum)) * 100)
|
||||||
|
text_copeck = numeral.choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек"))
|
||||||
|
return ("%s %02d %s") % (text_rubles, copeck, text_copeck)
|
||||||
|
|
||||||
|
def img(self, img, type='png', width=0, height=0):
|
||||||
|
if width:
|
||||||
|
width = "width='%spx'" % (width)
|
||||||
|
else:
|
||||||
|
width = " "
|
||||||
|
if height:
|
||||||
|
height = "height='%spx'" % (height)
|
||||||
|
else:
|
||||||
|
height = " "
|
||||||
|
toreturn = "<img %s %s src='data:image/%s;base64,%s' />" % (
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
type,
|
||||||
|
str(pycompat.to_text(img)))
|
||||||
|
return toreturn
|
||||||
|
|
||||||
|
def get_contract(self):
|
||||||
|
partner = int(self.partner_ids[0].id)
|
||||||
|
contract = self.env['partner.contract.customer'].search(
|
||||||
|
[('partner_id', '=', partner), ('state', '=', 'signed')], limit=1)
|
||||||
|
if contract:
|
||||||
|
return contract
|
||||||
|
|
||||||
|
def get_function_partner(self, partner):
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.function:
|
||||||
|
return director.function or 'отсутствует'
|
||||||
|
|
||||||
|
def get_name_partner(self, partner):
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
if director:
|
||||||
|
return director.name or 'отсутствует'
|
||||||
|
|
||||||
|
def get_report_filename(self):
|
||||||
|
today = date.today()
|
||||||
|
d1 = today.strftime("%d-%m-%Y")
|
||||||
|
if self.partner_ids[0].parent_id:
|
||||||
|
p = ''.join(self.partner_ids[0].parent_id.name)
|
||||||
|
else:
|
||||||
|
p = ''.join(self.partner_ids[0].name)
|
||||||
|
# return 'Акт Сверки '+ d1 + ' ' + self.company_id.name+'_'+p
|
||||||
|
return str(self.company_id.id) + ' - ' + ' ' + d1
|
||||||
|
|
||||||
|
def sorted_lines(self, list):
|
||||||
|
list = sorted(list, key=lambda k: k.get('date'), reverse=False)
|
||||||
|
return list
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# import time
|
||||||
|
# from ast import literal_eval
|
||||||
|
# from odoo import _, api, fields, models
|
||||||
|
# from odoo.tools import date_utils,pycompat
|
||||||
|
# from pytils import dt,numeral
|
||||||
|
# from datetime import datetime, date
|
||||||
|
# import re
|
||||||
|
# import urllib
|
||||||
|
#
|
||||||
|
# class GeneralLedgerReportWizard(models.TransientModel):
|
||||||
|
# """General ledger report wizard."""
|
||||||
|
#
|
||||||
|
# _name = "general.ledger.act_revise.wizard"
|
||||||
|
# _description = "General Ledger Report Wizard"
|
||||||
|
# _inherit = "act_revise.abstract_wizard"
|
||||||
|
#
|
||||||
|
# # date_range_id = fields.Many2one(comodel_name="date.range", string="Date range")
|
||||||
|
# date_from = fields.Date(string="Начало даты", required=True, default=lambda self: self._init_date_from())
|
||||||
|
# date_to = fields.Date(string="Конец даты", required=True, default=fields.Date.context_today)
|
||||||
|
# fy_start_date = fields.Date(compute="_compute_fy_start_date")
|
||||||
|
# target_move = fields.Selection(
|
||||||
|
# [("posted", "Все проведенные проводки"), ("all", "Все проводки")],
|
||||||
|
# string="Цель операции",
|
||||||
|
# required=True,
|
||||||
|
# default="posted",
|
||||||
|
# )
|
||||||
|
# account_ids = fields.Many2many(
|
||||||
|
# comodel_name="account.account", string=_("Filter accounts")
|
||||||
|
# )
|
||||||
|
# centralize = fields.Boolean(string=_("Activate centralization"), default=True)
|
||||||
|
# hide_account_at_0 = fields.Boolean(
|
||||||
|
# string=_("Hide account ending balance at 0"),
|
||||||
|
# help=_("Use this filter to hide an account or a partner "
|
||||||
|
# "with an ending balance at 0. "
|
||||||
|
# "If partners are filtered, "
|
||||||
|
# "debits and credits totals will not match the trial balance."),
|
||||||
|
# )
|
||||||
|
# receivable_accounts_only = fields.Boolean()
|
||||||
|
# payable_accounts_only = fields.Boolean()
|
||||||
|
# partner_ids = fields.Many2many(
|
||||||
|
# comodel_name="res.partner",
|
||||||
|
# string=_("Filter partners"),
|
||||||
|
# default=lambda self: self._default_partners(),
|
||||||
|
# )
|
||||||
|
# account_journal_ids = fields.Many2many(
|
||||||
|
# comodel_name="account.journal", string=_("Filter journals")
|
||||||
|
# )
|
||||||
|
# cost_center_ids = fields.Many2many(
|
||||||
|
# comodel_name="account.analytic.account", string=_("Filter cost centers")
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# not_only_one_unaffected_earnings_account = fields.Boolean(readonly=True)
|
||||||
|
# foreign_currency = fields.Boolean(
|
||||||
|
# string=_("Show foreign currency"),
|
||||||
|
# help=_("Display foreign currency for move lines, unless "
|
||||||
|
# "account currency is not setup through chart of accounts "
|
||||||
|
# "will display initial and final balance in that currency."),
|
||||||
|
# default=lambda self: self._default_foreign_currency(),
|
||||||
|
# )
|
||||||
|
# account_code_from = fields.Many2one(
|
||||||
|
# comodel_name="account.account",
|
||||||
|
# help="Starting account in a range",
|
||||||
|
# )
|
||||||
|
# account_code_to = fields.Many2one(
|
||||||
|
# comodel_name="account.account",
|
||||||
|
# help="Ending account in a range",
|
||||||
|
# )
|
||||||
|
# grouped_by = fields.Selection(
|
||||||
|
# selection=[("", "None"), ("partners", "Partners"), ("taxes", "Taxes")],
|
||||||
|
# default="partners",
|
||||||
|
# )
|
||||||
|
# show_cost_center = fields.Boolean(
|
||||||
|
# string="Show Analytic Account",
|
||||||
|
# default=True,
|
||||||
|
# )
|
||||||
|
# domain = fields.Char(
|
||||||
|
# string="Journal Items Domain",
|
||||||
|
# default=[],
|
||||||
|
# help="This domain will be used to select specific domain for Journal " "Items",
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# # def _print_report(self, report_type):
|
||||||
|
# # self.ensure_one()
|
||||||
|
# # data = self._prepare_report_general_ledger()
|
||||||
|
# # report = self.env["ir.actions.report"].search(
|
||||||
|
# # [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, )
|
||||||
|
# # if self.partner_ids[0].parent_id:
|
||||||
|
# # partner = int(self.partner_ids[0].parent_id.id)
|
||||||
|
# # else:
|
||||||
|
# # partner = int(self.partner_ids[0].id)
|
||||||
|
# # return {
|
||||||
|
# # 'type': 'ir.actions.act_url',
|
||||||
|
# # 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % (
|
||||||
|
# # urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move,
|
||||||
|
# # self.company_id.id, partner),
|
||||||
|
# # 'target': 'new',
|
||||||
|
# # }
|
||||||
|
#
|
||||||
|
# def _get_account_move_lines_domain(self):
|
||||||
|
# domain = literal_eval(self.domain) if self.domain else []
|
||||||
|
# return domain
|
||||||
|
#
|
||||||
|
# @api.onchange("account_code_from", "account_code_to")
|
||||||
|
# def on_change_account_range(self):
|
||||||
|
# if (
|
||||||
|
# self.account_code_from
|
||||||
|
# and self.account_code_from.code.isdigit()
|
||||||
|
# and self.account_code_to
|
||||||
|
# and self.account_code_to.code.isdigit()
|
||||||
|
# ):
|
||||||
|
# start_range = self.account_code_from.code
|
||||||
|
# end_range = self.account_code_to.code
|
||||||
|
# self.account_ids = self.env["account.account"].search(
|
||||||
|
# [("code", ">=", start_range), ("code", "<=", end_range)]
|
||||||
|
# )
|
||||||
|
# if self.company_id:
|
||||||
|
# self.account_ids = self.account_ids.filtered(
|
||||||
|
# lambda a: a.company_id == self.company_id
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# def _init_date_from(self):
|
||||||
|
# """set start date to begin of current year if fiscal year running"""
|
||||||
|
# today = fields.Date.context_today(self)
|
||||||
|
# company = self.company_id or self.env.company
|
||||||
|
# last_fsc_month = company.fiscalyear_last_month
|
||||||
|
# last_fsc_day = company.fiscalyear_last_day
|
||||||
|
#
|
||||||
|
# if (
|
||||||
|
# today.month < int(last_fsc_month)
|
||||||
|
# or today.month == int(last_fsc_month)
|
||||||
|
# and today.day <= last_fsc_day
|
||||||
|
# ):
|
||||||
|
# return time.strftime("%Y-01-01")
|
||||||
|
# else:
|
||||||
|
# return False
|
||||||
|
#
|
||||||
|
# def _default_foreign_currency(self):
|
||||||
|
# return self.env.user.has_group("base.group_multi_currency")
|
||||||
|
#
|
||||||
|
# @api.depends("date_from")
|
||||||
|
# def _compute_fy_start_date(self):
|
||||||
|
# for wiz in self:
|
||||||
|
# if wiz.date_from:
|
||||||
|
# date_from, date_to = date_utils.get_fiscal_year(
|
||||||
|
# wiz.date_from,
|
||||||
|
# day=self.company_id.fiscalyear_last_day,
|
||||||
|
# month=int(self.company_id.fiscalyear_last_month),
|
||||||
|
# )
|
||||||
|
# wiz.fy_start_date = date_from
|
||||||
|
# else:
|
||||||
|
# wiz.fy_start_date = False
|
||||||
|
#
|
||||||
|
# @api.onchange("company_id")
|
||||||
|
# def onchange_company_id(self):
|
||||||
|
# """Handle company change."""
|
||||||
|
# count = self.env["account.account"].search_count(
|
||||||
|
# [
|
||||||
|
# ("account_type", "=", "equity_unaffected"),
|
||||||
|
# ("company_id", "=", self.company_id.id),
|
||||||
|
# ]
|
||||||
|
# )
|
||||||
|
# self.not_only_one_unaffected_earnings_account = count != 1
|
||||||
|
# # if (
|
||||||
|
# # self.company_id
|
||||||
|
# # and self.date_range_id.company_id
|
||||||
|
# # and self.date_range_id.company_id != self.company_id
|
||||||
|
# # ):
|
||||||
|
# # self.date_range_id = False
|
||||||
|
# if self.company_id and self.account_journal_ids:
|
||||||
|
# self.account_journal_ids = self.account_journal_ids.filtered(
|
||||||
|
# lambda p: p.company_id == self.company_id or not p.company_id
|
||||||
|
# )
|
||||||
|
# if self.company_id and self.partner_ids:
|
||||||
|
# self.partner_ids = self.partner_ids.filtered(
|
||||||
|
# lambda p: p.company_id == self.company_id or not p.company_id
|
||||||
|
# )
|
||||||
|
# if self.company_id and self.account_ids:
|
||||||
|
# if self.receivable_accounts_only or self.payable_accounts_only:
|
||||||
|
# self.onchange_type_accounts_only()
|
||||||
|
# else:
|
||||||
|
# self.account_ids = self.account_ids.filtered(
|
||||||
|
# lambda a: a.company_id == self.company_id
|
||||||
|
# )
|
||||||
|
# if self.company_id and self.cost_center_ids:
|
||||||
|
# self.cost_center_ids = self.cost_center_ids.filtered(
|
||||||
|
# lambda c: c.company_id == self.company_id
|
||||||
|
# )
|
||||||
|
# res = {
|
||||||
|
# "domain": {
|
||||||
|
# "account_ids": [],
|
||||||
|
# "partner_ids": [],
|
||||||
|
# "account_journal_ids": [],
|
||||||
|
# "cost_center_ids": [],
|
||||||
|
# # "date_range_id": [],
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# if not self.company_id:
|
||||||
|
# return res
|
||||||
|
# else:
|
||||||
|
# res["domain"]["account_ids"] += [("company_id", "=", self.company_id.id)]
|
||||||
|
# res["domain"]["account_journal_ids"] += [
|
||||||
|
# ("company_id", "=", self.company_id.id)
|
||||||
|
# ]
|
||||||
|
# res["domain"]["partner_ids"] += self._get_partner_ids_domain()
|
||||||
|
# res["domain"]["cost_center_ids"] += [
|
||||||
|
# ("company_id", "=", self.company_id.id)
|
||||||
|
# ]
|
||||||
|
# # res["domain"]["date_range_id"] += [
|
||||||
|
# # "|",
|
||||||
|
# # ("company_id", "=", self.company_id.id),
|
||||||
|
# # ("company_id", "=", False),
|
||||||
|
# # ]
|
||||||
|
# return res
|
||||||
|
#
|
||||||
|
# # @api.onchange("date_range_id")
|
||||||
|
# # def onchange_date_range_id(self):
|
||||||
|
# # """Handle date range change."""
|
||||||
|
# # if self.date_range_id:
|
||||||
|
# # self.date_from = self.date_range_id.date_start
|
||||||
|
# # self.date_to = self.date_range_id.date_end
|
||||||
|
#
|
||||||
|
# # @api.constrains("company_id", "date_range_id")
|
||||||
|
# # def _check_company_id_date_range_id(self):
|
||||||
|
# # for rec in self.sudo():
|
||||||
|
# # if (
|
||||||
|
# # rec.company_id
|
||||||
|
# # and rec.date_range_id.company_id
|
||||||
|
# # and rec.company_id != rec.date_range_id.company_id
|
||||||
|
# # ):
|
||||||
|
# # raise ValidationError(
|
||||||
|
# # _(
|
||||||
|
# # "The Company in the General Ledger Report Wizard and in "
|
||||||
|
# # "Date Range must be the same."
|
||||||
|
# # )
|
||||||
|
# # )
|
||||||
|
#
|
||||||
|
# @api.onchange("receivable_accounts_only", "payable_accounts_only")
|
||||||
|
# def onchange_type_accounts_only(self):
|
||||||
|
# """Handle receivable/payable accounts only change."""
|
||||||
|
# if self.receivable_accounts_only or self.payable_accounts_only:
|
||||||
|
# domain = [("company_id", "=", self.company_id.id)]
|
||||||
|
# if self.receivable_accounts_only and self.payable_accounts_only:
|
||||||
|
# domain += [
|
||||||
|
# ("account_type", "in", ("asset_receivable", "liability_payable"))
|
||||||
|
# ]
|
||||||
|
# elif self.receivable_accounts_only:
|
||||||
|
# domain += [("account_type", "=", "asset_receivable")]
|
||||||
|
# elif self.payable_accounts_only:
|
||||||
|
# domain += [("account_type", "=", "liability_payable")]
|
||||||
|
# self.account_ids = self.env["account.account"].search(domain)
|
||||||
|
# else:
|
||||||
|
# self.account_ids = None
|
||||||
|
#
|
||||||
|
# @api.onchange("partner_ids")
|
||||||
|
# def onchange_partner_ids(self):
|
||||||
|
# """Handle partners change."""
|
||||||
|
# if self.partner_ids:
|
||||||
|
# self.receivable_accounts_only = self.payable_accounts_only = True
|
||||||
|
# else:
|
||||||
|
# self.receivable_accounts_only = self.payable_accounts_only = False
|
||||||
|
#
|
||||||
|
# @api.depends("company_id")
|
||||||
|
# def _compute_unaffected_earnings_account(self):
|
||||||
|
# for record in self:
|
||||||
|
# record.unaffected_earnings_account = self.env["account.account"].search(
|
||||||
|
# [
|
||||||
|
# ("account_type", "=", "equity_unaffected"),
|
||||||
|
# ("company_id", "=", record.company_id.id),
|
||||||
|
# ]
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# unaffected_earnings_account = fields.Many2one(
|
||||||
|
# comodel_name="account.account",
|
||||||
|
# compute="_compute_unaffected_earnings_account",
|
||||||
|
# store=True,
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# # def _print_report(self, report_type):
|
||||||
|
# # self.ensure_one()
|
||||||
|
# # data = self._prepare_report_general_ledger()
|
||||||
|
# # report_name = "act_revise.general_ledger"
|
||||||
|
# # return (
|
||||||
|
# # self.env["ir.actions.report"]
|
||||||
|
# # .search(
|
||||||
|
# # [("report_name", "=", report_name), ("report_type", "=", report_type)],
|
||||||
|
# # limit=1,
|
||||||
|
# # )
|
||||||
|
# # .report_action(self, data=data)
|
||||||
|
# # )
|
||||||
|
# def _print_report(self, report_type):
|
||||||
|
# self.ensure_one()
|
||||||
|
# data = self._prepare_report_general_ledger()
|
||||||
|
# report = self.env["ir.actions.report"].search(
|
||||||
|
# [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)], limit=1, )
|
||||||
|
# # report.report_name='Test'
|
||||||
|
# # report.headers.add('Content-Disposition', 'attachment; filename="Test.pdf";')
|
||||||
|
# # pdf, _ = request.env.ref('act_revise.action_print_report_general_ledger_qweb').sudo().render_qweb_pdf(self,data=data)
|
||||||
|
# # pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf)),('Content-Disposition', 'attachment; filename="%s";' % report_name),]
|
||||||
|
# # return request.make_response(pdf, headers=pdfhttpheaders)
|
||||||
|
# # return (
|
||||||
|
# # self.env["ir.actions.report"]
|
||||||
|
# # .search(
|
||||||
|
# # [("report_name", "=", "act_revise.general_ledger"), ("report_type", "=", report_type)],
|
||||||
|
# # limit=1,
|
||||||
|
# # )
|
||||||
|
# # report.report_action(self, data=data)
|
||||||
|
# # )
|
||||||
|
# # name='Test'
|
||||||
|
# if self.partner_ids[0].parent_id:
|
||||||
|
# partner = int(self.partner_ids[0].parent_id.id)
|
||||||
|
# else:
|
||||||
|
# partner = int(self.partner_ids[0].id)
|
||||||
|
# account_data = self.env['account.move.line'].sudo().search([
|
||||||
|
# ('partner_id', '=', partner.id),
|
||||||
|
# ('account_id.account_type', 'in', ('liability_payable', 'asset_receivable')),
|
||||||
|
# ('account_id.non_trade', '=', False),
|
||||||
|
# ('date', '<=', self.date_to),
|
||||||
|
# ('date', '>=', self.date_from)
|
||||||
|
# ])
|
||||||
|
# if not account_data:
|
||||||
|
# raise UserError(f'Проводок для формирования акта по введенным условиям не найдено.')
|
||||||
|
# return {
|
||||||
|
# 'type': 'ir.actions.act_url',
|
||||||
|
# 'url': '/my/act_revise_contact/%s?date_to=%s&date_from=%s&target_move=%s&company=%s&partner=%s' % (
|
||||||
|
# urllib.parse.quote(self.get_report_filename()), self.date_to, self.date_from, self.target_move,
|
||||||
|
# self.company_id.id, partner),
|
||||||
|
# 'target': 'new',
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# def _prepare_report_general_ledger(self):
|
||||||
|
# self.ensure_one()
|
||||||
|
# return {
|
||||||
|
# "wizard_id": self.id,
|
||||||
|
# "date_from": self.date_from,
|
||||||
|
# "date_to": self.date_to,
|
||||||
|
# "only_posted_moves": self.target_move == "posted",
|
||||||
|
# "hide_account_at_0": self.hide_account_at_0,
|
||||||
|
# "foreign_currency": self.foreign_currency,
|
||||||
|
# "company_id": self.company_id.id,
|
||||||
|
# "account_ids": self.account_ids.ids,
|
||||||
|
# "partner_ids": self.partner_ids.ids,
|
||||||
|
# "grouped_by": self.grouped_by,
|
||||||
|
# "cost_center_ids": self.cost_center_ids.ids,
|
||||||
|
# "show_cost_center": self.show_cost_center,
|
||||||
|
# "journal_ids": self.account_journal_ids.ids,
|
||||||
|
# "centralize": self.centralize,
|
||||||
|
# "fy_start_date": self.fy_start_date,
|
||||||
|
# "unaffected_earnings_account": self.unaffected_earnings_account.id,
|
||||||
|
# "account_financial_report_lang": self.env.lang,
|
||||||
|
# "domain": self._get_account_move_lines_domain(),
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# def _export(self, report_type):
|
||||||
|
# """Default export is PDF."""
|
||||||
|
# return self._print_report(report_type)
|
||||||
|
#
|
||||||
|
# def _get_atr_from_dict(self, obj_id, data, key):
|
||||||
|
# try:
|
||||||
|
# return data[obj_id][key]
|
||||||
|
# except KeyError:
|
||||||
|
# return data[str(obj_id)][key]
|
||||||
|
#
|
||||||
|
# def numer(self, name):
|
||||||
|
# if name:
|
||||||
|
# numeration = re.findall('\d+$', name)
|
||||||
|
# if numeration: return numeration[0]
|
||||||
|
# return name
|
||||||
|
#
|
||||||
|
# def get_data_format(self, date):
|
||||||
|
# if date and date != 'False':
|
||||||
|
# return dt.ru_strftime(u'%d.%m.%Y Рі.', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True)
|
||||||
|
# return ''
|
||||||
|
#
|
||||||
|
# def initials(self, fio):
|
||||||
|
# if fio:
|
||||||
|
# return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip()
|
||||||
|
# return ''
|
||||||
|
#
|
||||||
|
# def rubles(self, sum):
|
||||||
|
# "Transform sum number in rubles to text"
|
||||||
|
# text_rubles = numeral.rubles(int(sum))
|
||||||
|
# copeck = round((sum - int(sum)) * 100)
|
||||||
|
# text_copeck = numeral.choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек"))
|
||||||
|
# return ("%s %02d %s") % (text_rubles, copeck, text_copeck)
|
||||||
|
#
|
||||||
|
# def img(self, img, type='png', width=0, height=0):
|
||||||
|
# if width:
|
||||||
|
# width = "width='%spx'" % (width)
|
||||||
|
# else:
|
||||||
|
# width = " "
|
||||||
|
# if height:
|
||||||
|
# height = "height='%spx'" % (height)
|
||||||
|
# else:
|
||||||
|
# height = " "
|
||||||
|
# toreturn = "<img %s %s src='data:image/%s;base64,%s' />" % (
|
||||||
|
# width,
|
||||||
|
# height,
|
||||||
|
# type,
|
||||||
|
# str(pycompat.to_text(img)))
|
||||||
|
# return toreturn
|
||||||
|
#
|
||||||
|
# def get_contract(self):
|
||||||
|
# partner = int(self.partner_ids[0].id)
|
||||||
|
# contract = self.env['partner.contract.customer'].search(
|
||||||
|
# [('partner_id', '=', partner), ('state', '=', 'signed')], limit=1)
|
||||||
|
# if contract:
|
||||||
|
# return contract
|
||||||
|
#
|
||||||
|
# def get_function_partner(self, partner):
|
||||||
|
# director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
# if director:
|
||||||
|
# if director.function:
|
||||||
|
# return director.function or 'отсутствует'
|
||||||
|
#
|
||||||
|
# def get_name_partner(self, partner):
|
||||||
|
# director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
# if director:
|
||||||
|
# return director.name or 'отсутствует'
|
||||||
|
#
|
||||||
|
# def get_report_filename(self):
|
||||||
|
# today = date.today()
|
||||||
|
# d1 = today.strftime("%d-%m-%Y")
|
||||||
|
# if self.partner_ids[0].parent_id:
|
||||||
|
# p = ''.join(self.partner_ids[0].parent_id.name)
|
||||||
|
# else:
|
||||||
|
# p = ''.join(self.partner_ids[0].name)
|
||||||
|
# # return 'Акт Сверки '+ d1 + ' ' + self.company_id.name+'_'+p
|
||||||
|
# return str(self.company_id.id) + ' - ' + ' ' + d1
|
||||||
|
#
|
||||||
|
# def sorted_lines(self, list):
|
||||||
|
# list = sorted(list, key=lambda k: k.get('date'), reverse=False)
|
||||||
|
# return list
|
167
l10n_ru_act_rev/wizard/general_ledger_wizard_view.xml
Normal file
167
l10n_ru_act_rev/wizard/general_ledger_wizard_view.xml
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<!-- GENERAL LEDGER -->
|
||||||
|
<record id="general_ledger_wizard" model="ir.ui.view">
|
||||||
|
<field name="name">Акт сверки</field>
|
||||||
|
<field name="model">general.ledger.act_revise.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<group name="main_info">
|
||||||
|
<field
|
||||||
|
name="company_id"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
groups="base.group_multi_company"
|
||||||
|
/>
|
||||||
|
</group>
|
||||||
|
<div invisible= "not_only_one_unaffected_earnings_account==True" >
|
||||||
|
<group name="filters">
|
||||||
|
<group name="date_range">
|
||||||
|
<!-- <field name="date_range_id" />-->
|
||||||
|
<field name="date_from" />
|
||||||
|
<field name="date_to" />
|
||||||
|
<field name="fy_start_date" invisible="1" />
|
||||||
|
<field name="target_move" widget="radio" />
|
||||||
|
</group>
|
||||||
|
<group name="other_filters" invisible="1">
|
||||||
|
<field name="grouped_by" />
|
||||||
|
<field name="centralize" />
|
||||||
|
<field name="hide_account_at_0" />
|
||||||
|
<field name="foreign_currency" />
|
||||||
|
<field name="show_cost_center" />
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<notebook invisible="1">
|
||||||
|
<page string="Filter accounts">
|
||||||
|
<group name="account_filter" col="4">
|
||||||
|
<label for="account_ids" colspan="4" />
|
||||||
|
<field name="receivable_accounts_only" />
|
||||||
|
<field name="payable_accounts_only" />
|
||||||
|
<label for="account_code_from" string="From Code" />
|
||||||
|
<div>
|
||||||
|
<div class="o_row">
|
||||||
|
<field
|
||||||
|
name="account_code_from"
|
||||||
|
class="oe_inline"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
/>
|
||||||
|
<span class="oe_inline">To</span>
|
||||||
|
<field
|
||||||
|
name="account_code_to"
|
||||||
|
class="oe_inline"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<field
|
||||||
|
name="account_ids"
|
||||||
|
nolabel="1"
|
||||||
|
widget="many2many_tags"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
colspan="4"
|
||||||
|
/>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
<page string="Filter partners">
|
||||||
|
<field
|
||||||
|
name="partner_ids"
|
||||||
|
nolabel="1"
|
||||||
|
widget="many2many_tags"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
/>
|
||||||
|
</page>
|
||||||
|
<page
|
||||||
|
string="Filter analytic accounts"
|
||||||
|
groups="analytic.group_analytic_accounting"
|
||||||
|
>
|
||||||
|
<field
|
||||||
|
name="cost_center_ids"
|
||||||
|
nolabel="1"
|
||||||
|
widget="many2many_tags"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
/>
|
||||||
|
</page>
|
||||||
|
<page string="Additional Filtering">
|
||||||
|
<style>
|
||||||
|
.o_domain_show_selection_button {display: none}
|
||||||
|
</style>
|
||||||
|
<field
|
||||||
|
name="domain"
|
||||||
|
widget="domain"
|
||||||
|
options="{'model': 'account.move.line', 'in_dialog': True}"
|
||||||
|
context="{'skip_search_count': 1}"
|
||||||
|
/>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
</div>
|
||||||
|
<div invisible= "not_only_one_unaffected_earnings_account==False" >
|
||||||
|
<field
|
||||||
|
name="not_only_one_unaffected_earnings_account"
|
||||||
|
invisible="1"
|
||||||
|
/>
|
||||||
|
<group />
|
||||||
|
<h4>
|
||||||
|
General Ledger can be computed only if selected company have
|
||||||
|
only one unaffected earnings account.
|
||||||
|
</h4>
|
||||||
|
<group />
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<div invisible= "not_only_one_unaffected_earnings_account==True">
|
||||||
|
<button
|
||||||
|
name="button_export_pdf"
|
||||||
|
string="Печать"
|
||||||
|
type="object"
|
||||||
|
/>
|
||||||
|
<button string="Отмена" class="oe_link" special="cancel" />
|
||||||
|
</div>
|
||||||
|
<div invisible= "not_only_one_unaffected_earnings_account==False" >
|
||||||
|
<button string="Отмена" class="oe_link" special="cancel" />
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<!-- <act_window-->
|
||||||
|
<!-- id="action_general_ledger_wizard"-->
|
||||||
|
<!-- name="Акт сверки"-->
|
||||||
|
<!-- res_model="general.ledger.act_revise.wizard"-->
|
||||||
|
<!-- view_mode="form"-->
|
||||||
|
<!-- view_id="general_ledger_wizard"-->
|
||||||
|
<!-- target="new"-->
|
||||||
|
<!-- />-->
|
||||||
|
<!-- <!–Add to res.partner action–>-->
|
||||||
|
<!-- <act_window-->
|
||||||
|
<!-- id="act_action_general_ledger_wizard_partner_relation"-->
|
||||||
|
<!-- name="Печатать акт сверки"-->
|
||||||
|
<!-- res_model="general.ledger.act_revise.wizard"-->
|
||||||
|
<!-- binding_model="res.partner"-->
|
||||||
|
<!-- view_mode="form"-->
|
||||||
|
<!-- context="{-->
|
||||||
|
<!-- 'default_receivable_accounts_only':1,-->
|
||||||
|
<!-- 'default_payable_accounts_only':1,-->
|
||||||
|
<!-- }"-->
|
||||||
|
<!-- groups="account.group_account_manager"-->
|
||||||
|
<!-- target="new"-->
|
||||||
|
<!-- />-->
|
||||||
|
|
||||||
|
<record id="action_general_ledger_wizard" model="ir.actions.act_window">
|
||||||
|
<field name="name">Акт сверки</field>
|
||||||
|
<field name="res_model">general.ledger.act_revise.wizard</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="general_ledger_wizard"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="act_action_general_ledger_wizard_partner_relation" model="ir.actions.act_window">
|
||||||
|
<field name="name">Печатать акт сверки</field>
|
||||||
|
<field name="res_model">general.ledger.act_revise.wizard</field>
|
||||||
|
<field name="binding_model_id" ref="base.model_res_partner"/>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="context">{'default_receivable_accounts_only': 1, 'default_payable_accounts_only': 1}</field>
|
||||||
|
<field name="groups_id" eval="[(6, 0, [ref('account.group_account_manager')])]"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
21
l10n_ru_attorney/README.md
Normal file
21
l10n_ru_attorney/README.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Российская локализация - Доверенность
|
||||||
|
name: l10n_ru_attorney
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Создание списка доверенностей на получение ТМЦ и их печать.
|
||||||
|
|
||||||
|
###Создание доверенности:
|
||||||
|
1. Меню Покупки - Доверенности - кнопка "Создать";
|
||||||
|
2. На форме указываем:
|
||||||
|
|
||||||
|
2.1. Контрагент - поставщик;
|
||||||
|
|
||||||
|
2.2. Заказ на закупку;
|
||||||
|
|
||||||
|
2.3. Даты действия доверенности ("дата выдачи" и "действительно по").
|
||||||
|
|
||||||
|
|
||||||
|
###Для печати:
|
||||||
|
1. Меню Настройки - Техническое - Отчеты;
|
||||||
|
2. Находим в списке l10n_ru_attorney и добавляем в меню "Печать";
|
||||||
|
3. Открываем созданную запись доверенности - Действие - "Доверенность".
|
3
l10n_ru_attorney/__init__.py
Normal file
3
l10n_ru_attorney/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
42
l10n_ru_attorney/__manifest__.py
Normal file
42
l10n_ru_attorney/__manifest__.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Российская локализация - Доверенность",
|
||||||
|
|
||||||
|
'summary': """
|
||||||
|
Печать доверенности на получение ТМЦ
|
||||||
|
""",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
Создание списка доверенностей на получение ТМЦ и их печать.
|
||||||
|
|
||||||
|
Создание доверенности:
|
||||||
|
1. Меню Покупки - Доверенности - кнопка "Создать";
|
||||||
|
2. На форме указываем:
|
||||||
|
2.1. Контрагент - поставщик;
|
||||||
|
2.2. Заказ на закупку;
|
||||||
|
2.3. Даты действия доверенности ("дата выдачи" и "действительно по").
|
||||||
|
|
||||||
|
Для печати:
|
||||||
|
1. Меню Настройки - Техническое - Отчеты;
|
||||||
|
2. Находим в списке l10n_ru_attorney и добавляем в меню "Печать";
|
||||||
|
3. Открываем созданную запись доверенности - Действие - "Доверенность".
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "MK.Lab",
|
||||||
|
'website': "https://www.inf-centre.ru/",
|
||||||
|
|
||||||
|
'category': 'Uncategorized',
|
||||||
|
'version': '0.1',
|
||||||
|
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
'depends': ['base', 'account', 'sale', 'purchase', 'hr', 'l10n_ru_base'],
|
||||||
|
|
||||||
|
# always loaded
|
||||||
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/base_consent_views.xml',
|
||||||
|
'views/hr_employee_views.xml',
|
||||||
|
'views/purchase_order_views.xml',
|
||||||
|
'report/consent_report.xml',
|
||||||
|
],
|
||||||
|
}
|
5
l10n_ru_attorney/models/__init__.py
Normal file
5
l10n_ru_attorney/models/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import base_consent
|
||||||
|
from . import hr_employee
|
||||||
|
from . import purchase_order
|
46
l10n_ru_attorney/models/base_consent.py
Normal file
46
l10n_ru_attorney/models/base_consent.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
|
||||||
|
class BaseConsent(models.Model):
|
||||||
|
_name = 'base.consent'
|
||||||
|
_inherit = ['mail.thread', 'utm.mixin']
|
||||||
|
_description = 'Consent'
|
||||||
|
_order = 'date_from desc'
|
||||||
|
|
||||||
|
name = fields.Char(string=_('Номер'))
|
||||||
|
date_from = fields.Date(string=_('Дата выдачи'), default=lambda self: fields.Datetime.now())
|
||||||
|
date_to = fields.Date(string=_('Действительна по'), default=lambda self: datetime.today() + timedelta(days=180))
|
||||||
|
partner_id = fields.Many2one('res.partner', string=_('Контрагент'), required=1)
|
||||||
|
employee_id = fields.Many2one('hr.employee', string=_('Сотрудник'), required=1)
|
||||||
|
purchaseorder_id = fields.Many2one('purchase.order', _('Заказ на закупку'), domain="[('partner_id','=',partner_id)]",
|
||||||
|
required=1)
|
||||||
|
company_id = fields.Many2one('res.company', string=_('Компания'),
|
||||||
|
default=lambda self: self.env['res.company']._company_default_get('base.consent'),
|
||||||
|
required=1)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, val):
|
||||||
|
name = self.env['ir.sequence'].next_by_code('base.consent')
|
||||||
|
if name:
|
||||||
|
if 'name' in val:
|
||||||
|
if val['name'] == False:
|
||||||
|
val.update({
|
||||||
|
'name': name,
|
||||||
|
})
|
||||||
|
|
||||||
|
result = super(BaseConsent, self).create(val)
|
||||||
|
return result
|
||||||
|
|
||||||
|
@api.onchange('purchaseorder_id')
|
||||||
|
def set_partner(self):
|
||||||
|
if self.purchaseorder_id:
|
||||||
|
self.partner_id = self.purchaseorder_id.partner_id
|
||||||
|
|
||||||
|
@api.constrains('purchaseorder_id')
|
||||||
|
def fill_order(self):
|
||||||
|
p_orders = self.env['purchase.order'].sudo().browse(self.purchaseorder_id.id)
|
||||||
|
for order in p_orders:
|
||||||
|
order.consent_id = self.id
|
11
l10n_ru_attorney/models/hr_employee.py
Normal file
11
l10n_ru_attorney/models/hr_employee.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, _
|
||||||
|
|
||||||
|
|
||||||
|
class HrEmployee(models.Model):
|
||||||
|
_inherit = 'hr.employee'
|
||||||
|
|
||||||
|
inn = fields.Char(string=_("ИНН"))
|
||||||
|
pass_kem = fields.Char(string=_("Кем выдан паспорт"))
|
||||||
|
pass_date = fields.Date(string=_('Дата выдачи паспорта'))
|
9
l10n_ru_attorney/models/purchase_order.py
Normal file
9
l10n_ru_attorney/models/purchase_order.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, _
|
||||||
|
|
||||||
|
|
||||||
|
class PurchaseOrder(models.Model):
|
||||||
|
_inherit = 'purchase.order'
|
||||||
|
|
||||||
|
consent_id = fields.Many2one('base.consent', string=_('Доверенность'))
|
560
l10n_ru_attorney/report/consent_report.xml
Normal file
560
l10n_ru_attorney/report/consent_report.xml
Normal file
@ -0,0 +1,560 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<report
|
||||||
|
string="Доверенность"
|
||||||
|
id="action_report_consent"
|
||||||
|
model="base.consent"
|
||||||
|
report_type="qweb-html"
|
||||||
|
name="l10n_ru_attorney.report_consent"
|
||||||
|
file="l10n_ru_attorney.report_consent"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<record model="ir.actions.report" id="l10n_ru_attorney.action_report_consent">
|
||||||
|
<field name="name">Доверенность</field>
|
||||||
|
<field name="model">base.consent</field>
|
||||||
|
<field name="print_report_name">(u'Доверенность - %s.pdf' % (object.name))</field>
|
||||||
|
<field name="report_type">qweb-html</field>
|
||||||
|
<field name="report_name">l10n_ru_attorney.report_consent</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="paperformat_a4new" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">15</field>
|
||||||
|
<field name="margin_bottom">15</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">90</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<template id="l10n_ru_attorney.report_consent">
|
||||||
|
<t t-call="web.html_container">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<div class="page">
|
||||||
|
<style type="text/css">
|
||||||
|
/*----------------Invoice classes-------------------*/
|
||||||
|
p {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.tb-numbers {
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
.tb-numbers td {
|
||||||
|
padding: 4px 10px;
|
||||||
|
}
|
||||||
|
.tb-numbers label {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 4px 0px 0px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.tb-numbers input {
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
.company-info {
|
||||||
|
width: 100%;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
.company-info td {
|
||||||
|
padding: 5px 2px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.approver-info {
|
||||||
|
width: 100%;
|
||||||
|
margin: 20px auto;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
.approver-info .director {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.approver-info .title {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
.approver-info .signature {
|
||||||
|
font-size: 11px;
|
||||||
|
padding-top: 40px;
|
||||||
|
}
|
||||||
|
.actDate {
|
||||||
|
float: right
|
||||||
|
}
|
||||||
|
.actDescription {
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 30px
|
||||||
|
}
|
||||||
|
.act-info p {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.buyer-box {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.buyer-box table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.buyer-box .tb-info {
|
||||||
|
width: 310px;
|
||||||
|
}
|
||||||
|
.buyer-box .tb-info td {
|
||||||
|
padding: 2px 5px;
|
||||||
|
}
|
||||||
|
.buyer-box .tb-info td.lbl {
|
||||||
|
text-align: right;
|
||||||
|
font-weight: bold;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
.tb-invoice {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
.tb-invoice td {
|
||||||
|
padding: 2px 4px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-size: 11px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.tb-invoice td input {
|
||||||
|
border: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.tb-invoice .head td {
|
||||||
|
background: #f3f3f3;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.deleteRow {
|
||||||
|
color: Red;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.tb-act {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
clear: both;
|
||||||
|
margin: 20px 0px 10px 0px;
|
||||||
|
}
|
||||||
|
.tb-act td {
|
||||||
|
padding: 2px 4px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-size: 13px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.tb-act td input {
|
||||||
|
border: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.tb-act .head td {
|
||||||
|
background: #f3f3f3;
|
||||||
|
}
|
||||||
|
.tb-act td .deleteActRow {
|
||||||
|
color: Red;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: justify;
|
||||||
|
text-indent: 1.5em;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
.tb-total {
|
||||||
|
width: 405px;
|
||||||
|
margin: 30px 0px 20px auto;
|
||||||
|
}
|
||||||
|
.tb-total td {
|
||||||
|
padding: 2px 5px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.tb-total td.lbl {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.tb-total td.val {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
min-width: 50px;
|
||||||
|
}
|
||||||
|
.tb-total td input {
|
||||||
|
padding: 1px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
.act-link-addrow-container {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
.link-addrow,
|
||||||
|
.act-link-addrow {
|
||||||
|
text-decoration: none !important;
|
||||||
|
border-bottom: 1px dashed #777;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.btn-box {
|
||||||
|
margin: 10px 0px;
|
||||||
|
}
|
||||||
|
.signer-box {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
.buyer-box .tb-info {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
.btn-box a {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
.podpis-box {
|
||||||
|
clear: both;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 11px;
|
||||||
|
margin: 20px auto 30px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.tb-podpis {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.podpis-box .box1 {
|
||||||
|
float: left;
|
||||||
|
width: 48%;
|
||||||
|
}
|
||||||
|
/*SIGNATURES PLACE BEGIN*/
|
||||||
|
.signatures-box {
|
||||||
|
clear: both;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 11px;
|
||||||
|
margin: 20px auto 30px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.signatures-box .box1 {
|
||||||
|
float: left;
|
||||||
|
width: 35%;
|
||||||
|
}
|
||||||
|
.signatures-box .box2 {
|
||||||
|
float: right;
|
||||||
|
width: 35%;
|
||||||
|
}
|
||||||
|
.signatures-box .box1 table,
|
||||||
|
.signatures-box .box2 table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.signatures-box table td {
|
||||||
|
padding: 3px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
/*SIGNATURES PLACE END*/
|
||||||
|
.podpis-box .box2 {
|
||||||
|
float: right;
|
||||||
|
width: 48%;
|
||||||
|
}
|
||||||
|
.podpis-box .box1 table,
|
||||||
|
.podpis-box .box2 table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.podpis-box table td {
|
||||||
|
padding: 3px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.special-line {
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
display: block;
|
||||||
|
line-height: 22px !important;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.w120 {
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
.w130 {
|
||||||
|
width: 130px;
|
||||||
|
}
|
||||||
|
.note {
|
||||||
|
font-size: 11px !important;
|
||||||
|
}
|
||||||
|
.l {
|
||||||
|
text-align: left !important;
|
||||||
|
}
|
||||||
|
.r {
|
||||||
|
text-align: right !important;
|
||||||
|
}
|
||||||
|
.c {
|
||||||
|
text-align: center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<div>
|
||||||
|
<h4 style="text-align:center; margin:10px 5px 5px;">
|
||||||
|
|
||||||
|
|
||||||
|
Доверенность №
|
||||||
|
<span t-field="o.name"/>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<table style="width:55%">
|
||||||
|
<tr>
|
||||||
|
<td>Дата выдачи:</td>
|
||||||
|
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<span t-field="o.date_from" t-options="{"widget": "date"}"/>
|
||||||
|
г.
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Доверенность действительна по:</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="o.date_from" t-options="{"widget": "date"}"/>
|
||||||
|
г.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="special-line" style="width:100%;margin-top:15px;text-align:center">
|
||||||
|
<b>
|
||||||
|
<span t-field="o.company_id.name"/>, адрес:<span t-field="o.company_id.street"/>, ИНН
|
||||||
|
<span t-field="o.company_id.vat"/>,
|
||||||
|
|
||||||
|
</b>
|
||||||
|
</div>
|
||||||
|
<div style="margin:0 auto;text-align:center;">наименование предприятия и его адрес</div>
|
||||||
|
<table style="width:100%;margin-top:10px">
|
||||||
|
<tr>
|
||||||
|
<td style="width:30%">
|
||||||
|
|
||||||
|
|
||||||
|
Доверенность выдана
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width:100%;text-align:center;">
|
||||||
|
<span style="border-bottom:1px solid;display:block;clear:both;text-align:center;">
|
||||||
|
<span t-field="o.employee_id"/>,<span t-field="o.employee_id.job_id.name"/>, ИНН
|
||||||
|
<span t-field="o.employee_id.inn"/>
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
<span style="">
|
||||||
|
|
||||||
|
|
||||||
|
должность и Ф.И.О.
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<td>Паспорт серия и №
|
||||||
|
|
||||||
|
|
||||||
|
<span style="padding:0 5px 0 5px;margin-left:12px;margin-right:12px;display:inline-table;"
|
||||||
|
class="special-line">
|
||||||
|
|
||||||
|
<span t-field="o.employee_id.passport_id"/>
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Кем выдан
|
||||||
|
|
||||||
|
|
||||||
|
<span style="padding:0 5px 0 5px;margin-left:12px;margin-right:12px;display:inline-table;"
|
||||||
|
class="special-line">
|
||||||
|
<span t-field="o.employee_id.pass_kem"/>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Дата выдачи
|
||||||
|
|
||||||
|
|
||||||
|
<span style="padding:0 5px 0 5px;margin-left:12px;margin-right:12px;display:inline-table;"
|
||||||
|
class="special-line">
|
||||||
|
|
||||||
|
<span t-field="o.employee_id.pass_date"/>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<td style="width:25%">
|
||||||
|
|
||||||
|
|
||||||
|
На получение от
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width:75%;text-align:center;">
|
||||||
|
<span style="border-bottom:1px solid;display:block;clear:both;">
|
||||||
|
|
||||||
|
|
||||||
|
<span t-field="o.partner_id"/>
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
<span style="">
|
||||||
|
|
||||||
|
|
||||||
|
наименование поставщика
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width:25%">
|
||||||
|
|
||||||
|
|
||||||
|
Материальных ценностей по
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width:75%;text-align:center;">
|
||||||
|
<span style="border-bottom:1px solid;display:block;clear:both;">
|
||||||
|
|
||||||
|
|
||||||
|
Заказу на закупку №
|
||||||
|
<span t-field="o.purchaseorder_id.name"/>
|
||||||
|
от
|
||||||
|
<span t-field="o.purchaseorder_id.date_order"
|
||||||
|
t-options="{"widget": "date"}"/>
|
||||||
|
г.
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
<span style="">
|
||||||
|
|
||||||
|
|
||||||
|
наименование, номер и дата документа
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h4 style="text-align:center; margin:15px 5px 15px;">
|
||||||
|
|
||||||
|
|
||||||
|
Перечень материальных ценностей,
|
||||||
|
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
подлежащих получению
|
||||||
|
|
||||||
|
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="tb-invoice">
|
||||||
|
<tr class="head">
|
||||||
|
<td></td>
|
||||||
|
<td style="min-width:200px;">Наименование товаров (работ, услуг)</td>
|
||||||
|
<td>Ед. изм.</td>
|
||||||
|
<td>Количество</td>
|
||||||
|
</tr>
|
||||||
|
<t t-set="num" t-value="1"/>
|
||||||
|
<t t-foreach="o.purchaseorder_id.order_line" t-as="line">
|
||||||
|
<tr class="data-row">
|
||||||
|
<td>
|
||||||
|
<t t-esc="num"/>
|
||||||
|
</td>
|
||||||
|
<td class="l" style="white-space: pre-wrap;">
|
||||||
|
<span t-field="line.name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.product_uom"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span t-field="line.product_qty"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<t t-set="num" t-value="num+1"/>
|
||||||
|
</t>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="clear h100"></div>
|
||||||
|
<div>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
<p>Подпись лица, получившего доверенность ___________________ удостоверяем</p>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="podpis-box">
|
||||||
|
<table style="width:50%;">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 13%;">Руководитель предприятия</td>
|
||||||
|
<td style="width: 19%; vertical-align: bottom;">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="special-line"></span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="note">(подпись)</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width: 16%; vertical-align: bottom;">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="special-line"></span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="note">(Ф.И.О)</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width: 16%; vertical-align: bottom;"></td>
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 13%;">Гл. бухгалтер:</td>
|
||||||
|
<td style="width: 19%; vertical-align: bottom;">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="special-line"></span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="note">(подпись)</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td style="width: 16%; vertical-align: bottom;">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="special-line"></span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="note">(Ф.И.О)</span>
|
||||||
|
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
2
l10n_ru_attorney/security/ir.model.access.csv
Normal file
2
l10n_ru_attorney/security/ir.model.access.csv
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_base_consent,base.consent,model_base_consent,base.group_user,1,1,1,1
|
|
65
l10n_ru_attorney/views/base_consent_views.xml
Normal file
65
l10n_ru_attorney/views/base_consent_views.xml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="base_consent_tree" model="ir.ui.view">
|
||||||
|
<field name="name">Consents</field>
|
||||||
|
<field name="model">base.consent</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="employee_id"/>
|
||||||
|
<field name="date_from"/>
|
||||||
|
<field name="date_to"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="base_consent_form" model="ir.ui.view">
|
||||||
|
<field name="name">consent.form</field>
|
||||||
|
<field name="model">base.consent</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<header></header>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="name" placeholder="Для автонумерации оставьте пустым"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="employee_id"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="date_from"/>
|
||||||
|
<field name="date_to"/>
|
||||||
|
<field name="purchaseorder_id"/>
|
||||||
|
<field name="company_id"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids" widget="mail_followers"/>
|
||||||
|
<field name="message_ids" widget="mail_thread"/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="l10n_ru_attorney.action_consent" model="ir.actions.act_window">
|
||||||
|
<field name="name">Доверенности</field>
|
||||||
|
<field name="res_model">base.consent</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="l10n_ru_attorney.menu_1" name="Consents" parent="purchase.menu_purchase_root"
|
||||||
|
action="l10n_ru_attorney.action_consent"/>
|
||||||
|
|
||||||
|
<record id="seq_consent" model="ir.sequence">
|
||||||
|
<field name="name">Consents</field>
|
||||||
|
<field name="code">base.consent</field>
|
||||||
|
<field name="prefix">CON</field>
|
||||||
|
<field name="padding">5</field>
|
||||||
|
<field name="company_id" eval="False"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
19
l10n_ru_attorney/views/hr_employee_views.xml
Normal file
19
l10n_ru_attorney/views/hr_employee_views.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="view_employee_form" model="ir.ui.view">
|
||||||
|
<field name="name">view_employee_form.inherit</field>
|
||||||
|
<field name="model">hr.employee</field>
|
||||||
|
<field name="inherit_id" ref="hr.view_employee_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='bank_account_id']" position="after">
|
||||||
|
<field name="inn"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='passport_id']" position="after">
|
||||||
|
<field name="pass_kem"/>
|
||||||
|
<field name="pass_date"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
16
l10n_ru_attorney/views/purchase_order_views.xml
Normal file
16
l10n_ru_attorney/views/purchase_order_views.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="purchase_order_form" model="ir.ui.view">
|
||||||
|
<field name="name">purchase.order.form.inherit</field>
|
||||||
|
<field name="model">purchase.order</field>
|
||||||
|
<field name="inherit_id" ref="purchase.purchase_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='incoterm_id']" position="after">
|
||||||
|
<field name="consent_id" context="{'default_partner_id':partner_id,'default_purchaseorder_id':id}"
|
||||||
|
domain="[('purchaseorder_id','=',id)]"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
16
l10n_ru_base/README.md
Normal file
16
l10n_ru_base/README.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Российская локализация - Базовый
|
||||||
|
name: l10n_ru_base
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Российская локализация: основные отчеты и печатные формы. Это базовый модуль для работы с модулями локализации.
|
||||||
|
|
||||||
|
###Для включения модулей:
|
||||||
|
1. Меню Настройки - в боковом меню "Российская локализация";
|
||||||
|
2. Выбирается нужный блок для подключения дополнительных возможностей по локализации.
|
||||||
|
|
||||||
|
###Перечень модулей локализации:
|
||||||
|
1. Российская локализация - Акт сверки (l10n_ru_act_rev)
|
||||||
|
2. Российская локализация - Доверенность (l10n_ru_attorney)
|
||||||
|
3. Российская локализация - Договоры (l10n_ru_contract)
|
||||||
|
4. Российская локализация - Документы (l10n_ru_doc)
|
||||||
|
5. Российская локализация - УПД в xml-формате (l10n_ru_upd_xml)
|
2
l10n_ru_base/__init__.py
Normal file
2
l10n_ru_base/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
|
28
l10n_ru_base/__manifest__.py
Normal file
28
l10n_ru_base/__manifest__.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Российская локализация - Базовый>",
|
||||||
|
'summary': """
|
||||||
|
Российская локализация: основные отчеты и печатные формы.
|
||||||
|
""",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
Российская локализация: основные отчеты и печатные формы.
|
||||||
|
|
||||||
|
Для включения модулей:
|
||||||
|
1. Меню Настройки - в боковом меню "Российская локализация"
|
||||||
|
2. Выбирается нужный блок.
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "MK.Lab",
|
||||||
|
'website': "https://www.inf-centre.ru/",
|
||||||
|
|
||||||
|
'version': '17.0.1.0.0',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'category': 'Uncategorized',
|
||||||
|
|
||||||
|
'depends': [],
|
||||||
|
|
||||||
|
'data': [
|
||||||
|
'views/res_config_settings_views.xml',
|
||||||
|
],
|
||||||
|
}
|
109
l10n_ru_base/i18n/ru_RU.po
Normal file
109
l10n_ru_base/i18n/ru_RU.po
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * base_russian_localization
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 17.0+e-20240904\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-10-29 07:45+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-10-29 07:45+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/base_russian_localization/models/res_config_settings.py:0
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_act_revise
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
#, python-format
|
||||||
|
msgid "Act revise"
|
||||||
|
msgstr "Акт сверки"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__company_status_rf
|
||||||
|
msgid "Company Status Rf"
|
||||||
|
msgstr "Статус компании"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model:ir.model,name:base_russian_localization.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "Параметры конфигурации"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/base_russian_localization/models/res_config_settings.py:0
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_fehu_base_consent
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
#, python-format
|
||||||
|
msgid "Consent"
|
||||||
|
msgstr "Доверенность"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/base_russian_localization/models/res_config_settings.py:0
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_contract
|
||||||
|
#, python-format
|
||||||
|
msgid "Contract"
|
||||||
|
msgstr "Договор"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Contracts"
|
||||||
|
msgstr "Договоры"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Powers of attorney"
|
||||||
|
msgstr "Доверенность на получение ТМЦ"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/base_russian_localization/models/res_config_settings.py:0
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_l10n_ru_doc
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
#, python-format
|
||||||
|
msgid "Print forms"
|
||||||
|
msgstr "Печатные формы"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Report act revise"
|
||||||
|
msgstr "Отчет Акт сверки"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Report contract"
|
||||||
|
msgstr "Договоры"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Report report_xml"
|
||||||
|
msgstr "УПД в формате xml для ЭДО"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#. odoo-python
|
||||||
|
#: code:addons/base_russian_localization/models/res_config_settings.py:0
|
||||||
|
#: model:ir.model.fields,field_description:base_russian_localization.field_res_config_settings__module_report_xml
|
||||||
|
#, python-format
|
||||||
|
msgid "Report_xml"
|
||||||
|
msgstr "Универсальный передаточный документ (УПД) в формате xml для ЭДО"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "Russian Localization"
|
||||||
|
msgstr "Российская локализация"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "UPD xml"
|
||||||
|
msgstr "УПД в формате xml для ЭДО"
|
||||||
|
|
||||||
|
#. module: base_russian_localization
|
||||||
|
#: model_terms:ir.ui.view,arch_db:base_russian_localization.res_config_settings_view_form
|
||||||
|
msgid "print_forms"
|
||||||
|
msgstr "Печатные формы документов"
|
4
l10n_ru_base/models/__init__.py
Normal file
4
l10n_ru_base/models/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from . import res_config_settings
|
||||||
|
|
||||||
|
|
||||||
|
|
41
l10n_ru_base/models/res_config_settings.py
Normal file
41
l10n_ru_base/models/res_config_settings.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from odoo import _, api, fields, models
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
_FIELDS_MODUL = [
|
||||||
|
'module_l10n_ru_act_rev',
|
||||||
|
'module_l10n_ru_contract',
|
||||||
|
'module_l10n_ru_upd_xml',
|
||||||
|
'module_l10n_ru_doc',
|
||||||
|
'module_l10n_ru_attorney'
|
||||||
|
]
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
module_l10n_ru_act_rev = fields.Boolean(_("Act revise"))
|
||||||
|
module_l10n_ru_contract = fields.Boolean(_("Contract"))
|
||||||
|
module_l10n_ru_upd_xml = fields.Boolean(_("Report_xml"))
|
||||||
|
module_l10n_ru_doc = fields.Boolean(_("Print forms"))
|
||||||
|
module_l10n_ru_attorney = fields.Boolean(_("Consent"))
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def write(self, values):
|
||||||
|
company = self.env.company
|
||||||
|
if company.country_id.code != 'RU':
|
||||||
|
raise UserError("Признак Российской компании не обнаружен!")
|
||||||
|
if _FIELDS_MODUL:
|
||||||
|
missing_modules = set()
|
||||||
|
for field in _FIELDS_MODUL:
|
||||||
|
if self.mapped(field)[0]:
|
||||||
|
module_name = field[7:]
|
||||||
|
module_installed = self.env['ir.module.module'].search([('name', '=', module_name)], limit=1)
|
||||||
|
if not module_installed:
|
||||||
|
missing_modules.add(module_name)
|
||||||
|
if missing_modules:
|
||||||
|
message = "Обратитесь в тех.поддержку для получения лицензии для следующих модулей:\n" + \
|
||||||
|
"\n".join(missing_modules)
|
||||||
|
raise UserError(message)
|
||||||
|
return super(ResConfigSettings, self).write(values)
|
BIN
l10n_ru_base/static/description/icon.png
Normal file
BIN
l10n_ru_base/static/description/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
42
l10n_ru_base/views/res_config_settings_views.xml
Normal file
42
l10n_ru_base/views/res_config_settings_views.xml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.view.form.inherit.russian.localization</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="priority" eval="5"/>
|
||||||
|
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//form" position="inside">
|
||||||
|
<app data-string="Russian Localization" string="Russian Localization" name="base_russian_localization" img="l10n_ru_base/static/description/icon.png">
|
||||||
|
<block title="Act revise" name="act_revise_setting_container">
|
||||||
|
<setting id="act_revise" string="Act revise" help="Report act revise">
|
||||||
|
<field name="module_l10n_ru_act_rev"/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
<block title="Contracts" name="contract_setting_container">
|
||||||
|
<setting id="contract" string="Contracts" help="Report contract">
|
||||||
|
<field name="module_l10n_ru_contract"/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
<block title="UPD xml" name="upd_xml_setting_container">
|
||||||
|
<setting id="report_xml" string="UPD xml" help="Report report_xml">
|
||||||
|
<field name="module_l10n_ru_upd_xml"/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
<block title="Print forms" name="print_forms_setting_container">
|
||||||
|
<setting id="print_forms" string="Print forms" help="print_forms">
|
||||||
|
<field name="module_l10n_ru_doc"/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
<block title="Consent" name="powers_attorney_setting_container">
|
||||||
|
<setting id="powers_attorney" string="Consent" help="Powers of attorney">
|
||||||
|
<field name="module_l10n_ru_attorney"/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
</app>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
3
l10n_ru_contract/__init__.py
Normal file
3
l10n_ru_contract/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import models
|
||||||
|
from . import report
|
25
l10n_ru_contract/__manifest__.py
Normal file
25
l10n_ru_contract/__manifest__.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': 'Контракты клиентов',
|
||||||
|
'version': '17.0.2024.02.02',
|
||||||
|
'sequence': 0,
|
||||||
|
'author': 'StarlingSoft',
|
||||||
|
'website': 'https://inf-centre.ru',
|
||||||
|
'depends': [
|
||||||
|
'base',
|
||||||
|
'mail',
|
||||||
|
'account', 'sale', 'sale_management', 'purchase'
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'data/data.xml',
|
||||||
|
'views/contract_customer_view.xml',
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'report/report_contract.xml',
|
||||||
|
'report/report_contract_order.xml',
|
||||||
|
'report/report_contract_order1.xml',
|
||||||
|
'report/report_contract_invoce.xml',
|
||||||
|
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'auto_install': False,
|
||||||
|
}
|
21
l10n_ru_contract/data/data.xml
Normal file
21
l10n_ru_contract/data/data.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="contract_customer_sequence" model="ir.sequence">
|
||||||
|
<field name="name">Договор последовательность клиент</field>
|
||||||
|
<field name="code">partner.contract.customer.sequence</field>
|
||||||
|
<field eval="1" name="number_next"/>
|
||||||
|
<field eval="1" name="number_increment"/>
|
||||||
|
<field eval="True" name="use_date_range"/>
|
||||||
|
<field name="padding">5</field>
|
||||||
|
</record>
|
||||||
|
<record id="contract_supplier_sequence" model="ir.sequence">
|
||||||
|
<field name="name">Договор последовательность поставщик</field>
|
||||||
|
<field name="code">partner.contract.supplier.sequence</field>
|
||||||
|
<field eval="1" name="number_next"/>
|
||||||
|
<field eval="1" name="number_increment"/>
|
||||||
|
<field eval="True" name="use_date_range"/>
|
||||||
|
<field name="padding">5</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
2
l10n_ru_contract/models/__init__.py
Normal file
2
l10n_ru_contract/models/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import contract_customer, invoice_saleorder, dop_field, crutch_fields_header
|
334
l10n_ru_contract/models/contract_customer.py
Normal file
334
l10n_ru_contract/models/contract_customer.py
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import api, fields, models, exceptions, tools
|
||||||
|
import pymorphy2
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
from .crutch_fields_header import IP_CONTACT_HEADER, ENTITY_CONTRACT_HEADER, INDIVIDUAL_CONTRACT_HEADER
|
||||||
|
|
||||||
|
|
||||||
|
class PartnerContractCustomer(models.Model):
|
||||||
|
_name = 'partner.contract.customer'
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin', 'mail.render.mixin']
|
||||||
|
|
||||||
|
def get_dateend(self):
|
||||||
|
if self.date_start:
|
||||||
|
six_months = fields.Datetime.from_string(self.date_start) + relativedelta(months=+11)
|
||||||
|
else:
|
||||||
|
six_months = datetime.today() + relativedelta(months=+11)
|
||||||
|
return fields.Datetime.to_string(six_months)
|
||||||
|
|
||||||
|
name = fields.Char(string='Номер')
|
||||||
|
date_start = fields.Date(string='Дата договора', required=True, default=fields.Datetime.now())
|
||||||
|
partner_id = fields.Many2one('res.partner', string='Контрагент', required=True)
|
||||||
|
sec_partner_id = fields.Many2one('res.partner', string='Контрагент как в заказе')
|
||||||
|
company_id = fields.Many2one('res.company', string='Компания', required=True)
|
||||||
|
name_print = fields.Char(string='Имя для печати', compute='_get_name_print')
|
||||||
|
name_print1 = fields.Char(string='Имя для печати, И.П.', compute='_get_name_printip')
|
||||||
|
date_end = fields.Date(string='Дата окончания', required=True, default=get_dateend)
|
||||||
|
name_dirprint = fields.Char(string='Имя нашего директора для печати')
|
||||||
|
name_dirprint1 = fields.Char(string='Имя нашего директора для печати И.П.')
|
||||||
|
lines = fields.One2many('contract.line', 'contract_id', string='Договорные цены')
|
||||||
|
type = fields.Selection(
|
||||||
|
[('customer', 'С покупателем'),
|
||||||
|
('supplier', 'С поставщиком'),
|
||||||
|
('other', 'Прочие расчеты'),
|
||||||
|
|
||||||
|
],
|
||||||
|
string='Тип договора', default='customer', required=True)
|
||||||
|
saleorder_id = fields.Many2one('sale.order', string='Заказ/Сделка')
|
||||||
|
stamp = fields.Boolean(string='Печать и подпись')
|
||||||
|
signed = fields.Boolean(string='Договор подписан')
|
||||||
|
state = fields.Selection(
|
||||||
|
[('draft', 'Черновик'),
|
||||||
|
('progress', 'На согласовании'),
|
||||||
|
('signed', 'Подписан, действует'),
|
||||||
|
('closed', 'Истёк'),
|
||||||
|
],
|
||||||
|
string='Статус', default='draft', group_expand='_expand_states', index=True
|
||||||
|
)
|
||||||
|
is_template = fields.Boolean('Это шаблон')
|
||||||
|
copy_from = fields.Many2one('partner.contract.customer', string='Копировать из этого шаблона')
|
||||||
|
profile_id = fields.Many2one('contract.profile', string='Вид договора', required=True)
|
||||||
|
credit_limit = fields.Float(string='Лимит кредита')
|
||||||
|
guid_1s = fields.Char('Код договора из 1С')
|
||||||
|
buh_code = fields.Char('Код договора из бухгалтерии')
|
||||||
|
payment_term_id = fields.Many2one('account.payment.term', string='Условие оплаты')
|
||||||
|
manager_id = fields.Many2one('res.users', string='Менеджер по продажам')
|
||||||
|
accountant_id = fields.Many2one('res.users', string='Бухгалтер по взаиморасчетам')
|
||||||
|
time_to_delivery_from = fields.Datetime('Время доставки от')
|
||||||
|
time_to_delivery_to = fields.Datetime('Время доставки до')
|
||||||
|
day_of_delivery = fields.Float('Дни доставки')
|
||||||
|
day_of_otgruzki = fields.Float('Дни отгрузки')
|
||||||
|
|
||||||
|
channel_id = fields.Many2one('saleorder.channel', string='Канал продаж')
|
||||||
|
team_id = fields.Many2one('crm.team', string='Команда продаж')
|
||||||
|
order_days_ids = fields.Many2many(comodel_name='contract.day', relation='orderdays', string='Дни доставки',
|
||||||
|
column1='contract_id', column2='day_id')
|
||||||
|
shipment_days_ids = fields.Many2many(comodel_name='contract.day', relation='shipmentdays', string='Дни отгрузки',
|
||||||
|
column1='contract_id',
|
||||||
|
column2='day_id')
|
||||||
|
# Доработка хедера договора
|
||||||
|
partner_type = fields.Selection(string='Тип контрагента', selection=[
|
||||||
|
('person', 'Физ. лицо'),
|
||||||
|
('company_ip', 'ИП'),
|
||||||
|
('company', 'Юр. лицо')
|
||||||
|
], required=True)
|
||||||
|
contract_header = fields.Html('Шапка договора')
|
||||||
|
|
||||||
|
@api.onchange('partner_type')
|
||||||
|
def generate_contract_header(self):
|
||||||
|
self.ensure_one()
|
||||||
|
self.render_model = 'partner.contract.customer'
|
||||||
|
if self.partner_type == 'company_ip':
|
||||||
|
self.contract_header = IP_CONTACT_HEADER
|
||||||
|
elif self.partner_type == 'person':
|
||||||
|
self.contract_header = INDIVIDUAL_CONTRACT_HEADER
|
||||||
|
else:
|
||||||
|
self.contract_header = ENTITY_CONTRACT_HEADER
|
||||||
|
# # Рендер Jinja выражение типа {{object.field}}
|
||||||
|
result = self._render_template(self.contract_header, self.render_model, res_ids=[self.id])
|
||||||
|
result = tools.html_sanitize(result[self.id])
|
||||||
|
self.contract_header = result
|
||||||
|
|
||||||
|
@api.onchange('sec_partner_id')
|
||||||
|
def set_pid(self):
|
||||||
|
self.partner_id = self.sec_partner_id.parent_id if self.sec_partner_id.parent_id else self.sec_partner_id
|
||||||
|
|
||||||
|
def _expand_states(self, states, domain, order):
|
||||||
|
return [key for key, val in type(self).state.selection]
|
||||||
|
|
||||||
|
def copy_it(self):
|
||||||
|
if self.copy_from:
|
||||||
|
for line in self.copy_from.lines:
|
||||||
|
line.copy({'contract_id': self.id})
|
||||||
|
|
||||||
|
def _get_name_print(self):
|
||||||
|
morph = pymorphy2.MorphAnalyzer()
|
||||||
|
self.name_print = False
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', self.partner_id.id), ('type', '=', 'director')],
|
||||||
|
limit=1)
|
||||||
|
if director:
|
||||||
|
if len(director.name.split(' ')) == 3:
|
||||||
|
lastname_old, firstname_old, middlename_old = director.name.split(' ')
|
||||||
|
|
||||||
|
if lastname_old:
|
||||||
|
lastname_n = morph.parse(lastname_old)[0]
|
||||||
|
if lastname_n.inflect({'gent'}):
|
||||||
|
lastname_n = lastname_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
lastname_n = lastname_old
|
||||||
|
else:
|
||||||
|
lastname_n = ''
|
||||||
|
|
||||||
|
if firstname_old:
|
||||||
|
firstname_n = morph.parse(firstname_old)[0]
|
||||||
|
firstname_n = firstname_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
firstname_n = ''
|
||||||
|
|
||||||
|
if middlename_old:
|
||||||
|
middlename_n = morph.parse(middlename_old)[0]
|
||||||
|
middlename_n = middlename_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
middlename_n = ''
|
||||||
|
|
||||||
|
name_print = lastname_n + ' ' + firstname_n + ' ' + middlename_n
|
||||||
|
|
||||||
|
self.name_print = name_print.title()
|
||||||
|
|
||||||
|
def _get_name_print1(self):
|
||||||
|
# morph = pymorphy2.MorphAnalyzer()
|
||||||
|
director = self.company_id.chief_id.partner_id if self.company_id.chief_id else False
|
||||||
|
# raise exceptions.UserError(str(director))
|
||||||
|
self.name_dirprint = False
|
||||||
|
if director:
|
||||||
|
if len(director.name.split(' ')) == 3:
|
||||||
|
lastname_old, firstname_old, middlename_old = director.name.split(' ')
|
||||||
|
|
||||||
|
if lastname_old:
|
||||||
|
lastname_n = morph.parse(lastname_old)[0]
|
||||||
|
lastname_n = lastname_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
lastname_n = ''
|
||||||
|
|
||||||
|
if firstname_old:
|
||||||
|
firstname_n = morph.parse(firstname_old)[0]
|
||||||
|
firstname_n = firstname_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
firstname_n = ''
|
||||||
|
|
||||||
|
if middlename_old:
|
||||||
|
middlename_n = morph.parse(middlename_old)[0]
|
||||||
|
middlename_n = middlename_n.inflect({'gent'}).word
|
||||||
|
else:
|
||||||
|
middlename_n = ''
|
||||||
|
|
||||||
|
name_print = lastname_n + ' ' + firstname_n + ' ' + middlename_n
|
||||||
|
|
||||||
|
self.name_dirprint = name_print.title()
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, values):
|
||||||
|
res = super(PartnerContractCustomer, self).create(values)
|
||||||
|
|
||||||
|
if values.get('is_template'):
|
||||||
|
return res
|
||||||
|
|
||||||
|
if values.get('type') == 'customer':
|
||||||
|
sequence_code = 'partner.contract.customer.sequence'
|
||||||
|
elif values.get('type') == 'supplier':
|
||||||
|
sequence_code = 'partner.contract.supplier.sequence'
|
||||||
|
else:
|
||||||
|
return res
|
||||||
|
|
||||||
|
name = self.env['ir.sequence'].next_by_code(sequence_code)
|
||||||
|
|
||||||
|
res.update({
|
||||||
|
'name': name,
|
||||||
|
})
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
# @api.model
|
||||||
|
def write(self, values):
|
||||||
|
|
||||||
|
if 'state' in values:
|
||||||
|
if self.state != values['state']:
|
||||||
|
msg = 'Статус: ' + dict(self._fields['state'].selection).get(self.state) + ' -> ' + dict(
|
||||||
|
self._fields['state'].selection).get(values['state'])
|
||||||
|
self.message_post(body=msg)
|
||||||
|
res = super(PartnerContractCustomer, self).write(values)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _get_name_print1ip(self):
|
||||||
|
self.name_dirprint1 = self.company_id.chief_id.partner_id.name if self.company_id.chief_id else False
|
||||||
|
|
||||||
|
def _get_name_printip(self):
|
||||||
|
self.name_print1 = False
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', self.partner_id.id), ('type', '=', 'director')],
|
||||||
|
limit=1)
|
||||||
|
if director:
|
||||||
|
self.name_print1 = director.name
|
||||||
|
|
||||||
|
def print_supp(self):
|
||||||
|
# self.filtered(lambda s: s.state == 'draft').write({'state': 'sent'})
|
||||||
|
return self.env['report'].get_action(self, 'mta_base.action_mtacontractsupp_report')
|
||||||
|
|
||||||
|
def print_contract_cust(self):
|
||||||
|
if self.saleorder_id:
|
||||||
|
return self.saleorder_id.print_contract()
|
||||||
|
else:
|
||||||
|
raise exceptions.UserError(
|
||||||
|
'Вы не можете напечатать договор с Клиентом, потому что нет связи с Заказом. Нужно зайти в Заказ и привязать этот договор.')
|
||||||
|
|
||||||
|
def contract_action_confirm(self):
|
||||||
|
if self.state == 'draft':
|
||||||
|
self.state = 'progress'
|
||||||
|
elif self.state == 'progress':
|
||||||
|
self.state = 'signed'
|
||||||
|
|
||||||
|
def contract_in_draft(self):
|
||||||
|
self.state = 'draft'
|
||||||
|
|
||||||
|
@api.onchange('name')
|
||||||
|
def set_comp_and_partn(self):
|
||||||
|
context = self._context
|
||||||
|
order_id = context.get('sale_order_id')
|
||||||
|
if order_id:
|
||||||
|
sale_order = self.env['sale.order'].browse(order_id)
|
||||||
|
|
||||||
|
self.company_id = sale_order.company_id
|
||||||
|
self.partner_id = sale_order.partner_id
|
||||||
|
|
||||||
|
@api.onchange('profile_id')
|
||||||
|
def set_payment(self):
|
||||||
|
if self.profile_id.payment_term_id:
|
||||||
|
self.payment_term_id = self.profile_id.payment_term_id
|
||||||
|
|
||||||
|
# @api.constrains('name')
|
||||||
|
def check_name(self):
|
||||||
|
obj = self.search([('name', '=', self.name), ('id', '!=', self.id), ('state', '!=', 'closed')])
|
||||||
|
if obj:
|
||||||
|
raise exceptions.ValidationError('Договор с таким номером уже существует')
|
||||||
|
|
||||||
|
"""
|
||||||
|
@api.constrains('profile_id')
|
||||||
|
def check_profile_id(self):
|
||||||
|
contracts = self.search([('partner_id', '=', self.partner_id.id), ('id', '!=', self.id)])
|
||||||
|
if contracts:
|
||||||
|
profiles_in_contracts = contracts.profile_id
|
||||||
|
# raise exceptions.ValidationError(profiles_in_contracts.ids)
|
||||||
|
if profiles_in_contracts:
|
||||||
|
ads = self.env['contract.allowed.profiles'].search(
|
||||||
|
[('allowed_profiles', 'in', profiles_in_contracts.ids)])
|
||||||
|
if ads:
|
||||||
|
raise exceptions.ValidationError((self.profile_id.name, ads.name))
|
||||||
|
# raise exceptions.ValidationError(contracts)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class Partner(models.Model):
|
||||||
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
|
contract_count = fields.Integer(string='Договоры', compute='get_count_contract')
|
||||||
|
pol = fields.Selection(string="Пол", selection=[('m', 'Муж.'), ('j', 'Жен'), ], required=False)
|
||||||
|
type = fields.Selection(selection_add=[('director', 'Директор')])
|
||||||
|
|
||||||
|
def get_count_contract(self):
|
||||||
|
contract = self.env['partner.contract.customer']
|
||||||
|
self.contract_count = contract.search_count([('partner_id', '=', self.id)])
|
||||||
|
|
||||||
|
def action_view_contract(self):
|
||||||
|
action = self.env.ref('contract.contract_customer_action').read()[0]
|
||||||
|
|
||||||
|
action['domain'] = [('partner_id', '=', self.id)]
|
||||||
|
|
||||||
|
return action
|
||||||
|
|
||||||
|
|
||||||
|
class ContractLine(models.Model):
|
||||||
|
_name = 'contract.line'
|
||||||
|
contract_id = fields.Many2one('partner.contract.customer', string='Order Reference', required=True,
|
||||||
|
ondelete='cascade', index=True, copy=False)
|
||||||
|
_order = "sequence desc"
|
||||||
|
# name = fields.Text(string='Название для договора')
|
||||||
|
# price_unit = fields.Float('Цена', default=0.0)
|
||||||
|
# product_uom = fields.Many2one('uom.uom', string='Единица измерения')
|
||||||
|
# product_id = fields.Many2one('product.product', string='Услуга', domain=[('sale_ok', '=', True)], change_default=True, ondelete='restrict')
|
||||||
|
sequence = fields.Integer('Порядок')
|
||||||
|
name = fields.Char('Номер пункта')
|
||||||
|
punct = fields.Html('Текст пункта')
|
||||||
|
|
||||||
|
@api.onchange('product_id')
|
||||||
|
def set_name(self):
|
||||||
|
self.name = self.product_id.name
|
||||||
|
|
||||||
|
|
||||||
|
class AllowedProfiles(models.Model):
|
||||||
|
_name = 'contract.allowed.profiles'
|
||||||
|
name = fields.Char(string='Одновременно включены следующие виды договоров:')
|
||||||
|
allowed_profiles = fields.Many2many('contract.profile', string='Виды договоров', required=True)
|
||||||
|
|
||||||
|
@api.onchange('allowed_profiles')
|
||||||
|
def set_name(self):
|
||||||
|
self.name = ''
|
||||||
|
for profile in self.allowed_profiles:
|
||||||
|
self.name += profile.name + ' + '
|
||||||
|
if self.name:
|
||||||
|
if self.name[-2] == '+':
|
||||||
|
self.name = self.name[:-2]
|
||||||
|
|
||||||
|
|
||||||
|
class ContractProfile(models.Model):
|
||||||
|
_name = 'contract.profile'
|
||||||
|
name = fields.Char(string='Вид договора', required=True)
|
||||||
|
payable_account_id = fields.Many2one('account.account', string='Счет кредиторской задолженности', required=True)
|
||||||
|
receivable_account_id = fields.Many2one('account.account', string='Счет дебиторской задолженности', required=True)
|
||||||
|
max_receivable_id = fields.Float(string='Максимальная деб. задолженность', required=True)
|
||||||
|
payment_term_id = fields.Many2one('account.payment.term', string='Условие оплаты', required=True)
|
||||||
|
journal_id = fields.Many2one('account.journal', string='Журнал', required=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ContractDay(models.Model):
|
||||||
|
_name = 'contract.day'
|
||||||
|
name = fields.Char('День')
|
33
l10n_ru_contract/models/crutch_fields_header.py
Normal file
33
l10n_ru_contract/models/crutch_fields_header.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
ENTITY_CONTRACT_HEADER = """
|
||||||
|
<b>{{object.company_id.partner_id.name}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Поставщик»</b>, в лице
|
||||||
|
{{(object.company_id.chief_id.partner_id.function or '').lower()}}
|
||||||
|
{{(object.name_dirprint1 or '').title()}},
|
||||||
|
действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и <b>{{object.partner_id.name or ''}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Покупатель»</b>, в лице
|
||||||
|
{{(object.get_function_partner1(object.partner_id.id) or '').lower()}}
|
||||||
|
{{(object.name_print1 or '').title()}}, действующего на основании устава общества, с другой стороны, вместе именуемые в дальнейшем <b>«Стороны»</b> заключили
|
||||||
|
настоящий Договор о нижеследующем:
|
||||||
|
"""
|
||||||
|
IP_CONTACT_HEADER = """
|
||||||
|
<b>{{object.company_id.partner_id.name}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Поставщик»</b>, в лице
|
||||||
|
{{(object.company_id.chief_id.partner_id.function or '').lower()}}
|
||||||
|
{{(object.name_dirprint1 or '').title()}},
|
||||||
|
действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и <b>{{object.partner_id.name or ''}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Покупатель»</b>, в лице
|
||||||
|
{{(object.get_function_partner1(object.partner_id.id) or '').lower()}}
|
||||||
|
{{(object.name_print1 or '').title()}}, действующего на основании ОГРНИП №{{object.partner_id.ogrn or ''}},
|
||||||
|
с другой стороны, вместе именуемые в дальнейшем <b>«Стороны»</b> заключили
|
||||||
|
настоящий Договор о нижеследующем:
|
||||||
|
"""
|
||||||
|
|
||||||
|
INDIVIDUAL_CONTRACT_HEADER = """
|
||||||
|
<b>{{object.company_id.partner_id.name}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Поставщик»</b>, в лице
|
||||||
|
{{(object.company_id.chief_id.partner_id.function or '').lower()}}
|
||||||
|
{{(object.name_dirprint1 or '').title()}},
|
||||||
|
действующего на основании ОГРНИП № {{object.company_id.company_registry or ''}}, с одной стороны, и <b>{{object.partner_id.name or ''}}</b>,
|
||||||
|
именуемое в дальнейшем <b>«Покупатель»</b>, вместе именуемые в дальнейшем <b>«Стороны»</b> заключили
|
||||||
|
настоящий Договор о нижеследующем:
|
||||||
|
"""
|
353
l10n_ru_contract/models/dop_field.py
Normal file
353
l10n_ru_contract/models/dop_field.py
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
from odoo import api, fields, models, exceptions
|
||||||
|
from datetime import datetime
|
||||||
|
import re
|
||||||
|
import pymorphy2
|
||||||
|
from odoo.tools import pycompat
|
||||||
|
|
||||||
|
FRACTIONS = (
|
||||||
|
(u"десятая", u"десятых", u"десятых"),
|
||||||
|
(u"сотая", u"сотых", u"сотых"),
|
||||||
|
(u"тысячная", u"тысячных", u"тысячных"),
|
||||||
|
(u"десятитысячная", u"десятитысячных", u"десятитысячных"),
|
||||||
|
(u"стотысячная", u"стотысячных", u"стотысячных"),
|
||||||
|
(u"миллионная", u"милллионных", u"милллионных"),
|
||||||
|
(u"десятимиллионная", u"десятимилллионных", u"десятимиллионных"),
|
||||||
|
(u"стомиллионная", u"стомилллионных", u"стомиллионных"),
|
||||||
|
(u"миллиардная", u"миллиардных", u"миллиардных"),
|
||||||
|
)
|
||||||
|
|
||||||
|
ONES = {
|
||||||
|
0: (u"", u"", u""),
|
||||||
|
1: (u"один", u"одна", u"одно"),
|
||||||
|
2: (u"два", u"две", u"два"),
|
||||||
|
3: (u"три", u"три", u"три"),
|
||||||
|
4: (u"четыре", u"четыре", u"четыре"),
|
||||||
|
5: (u"пять", u"пять", u"пять"),
|
||||||
|
6: (u"шесть", u"шесть", u"шесть"),
|
||||||
|
7: (u"семь", u"семь", u"семь"),
|
||||||
|
8: (u"восемь", u"восемь", u"восемь"),
|
||||||
|
9: (u"девять", u"девять", u"девять"),
|
||||||
|
}
|
||||||
|
|
||||||
|
TENS = {
|
||||||
|
0: u"",
|
||||||
|
10: u"десять",
|
||||||
|
11: u"одиннадцать",
|
||||||
|
12: u"двенадцать",
|
||||||
|
13: u"тринадцать",
|
||||||
|
14: u"четырнадцать",
|
||||||
|
15: u"пятнадцать",
|
||||||
|
16: u"шестнадцать",
|
||||||
|
17: u"семнадцать",
|
||||||
|
18: u"восемнадцать",
|
||||||
|
19: u"девятнадцать",
|
||||||
|
2: u"двадцать",
|
||||||
|
3: u"тридцать",
|
||||||
|
4: u"сорок",
|
||||||
|
5: u"пятьдесят",
|
||||||
|
6: u"шестьдесят",
|
||||||
|
7: u"семьдесят",
|
||||||
|
8: u"восемьдесят",
|
||||||
|
9: u"девяносто",
|
||||||
|
}
|
||||||
|
|
||||||
|
HUNDREDS = {
|
||||||
|
0: u"",
|
||||||
|
1: u"сто",
|
||||||
|
2: u"двести",
|
||||||
|
3: u"триста",
|
||||||
|
4: u"четыреста",
|
||||||
|
5: u"пятьсот",
|
||||||
|
6: u"шестьсот",
|
||||||
|
7: u"семьсот",
|
||||||
|
8: u"восемьсот",
|
||||||
|
9: u"девятьсот",
|
||||||
|
}
|
||||||
|
|
||||||
|
MALE = 1
|
||||||
|
FEMALE = 2
|
||||||
|
|
||||||
|
import operator
|
||||||
|
import sys
|
||||||
|
import types
|
||||||
|
|
||||||
|
PY2 = sys.version_info[0] == 2
|
||||||
|
PY3 = sys.version_info[0] == 3
|
||||||
|
|
||||||
|
if PY3:
|
||||||
|
string_types = str,
|
||||||
|
integer_types = int,
|
||||||
|
class_types = type,
|
||||||
|
text_type = str
|
||||||
|
binary_type = bytes
|
||||||
|
|
||||||
|
MAXSIZE = sys.maxsize
|
||||||
|
else:
|
||||||
|
string_types = basestring,
|
||||||
|
integer_types = (int, long)
|
||||||
|
class_types = (type, types.ClassType)
|
||||||
|
text_type = unicode
|
||||||
|
binary_type = str
|
||||||
|
|
||||||
|
|
||||||
|
class Partner_Bank(models.Model):
|
||||||
|
_inherit = 'res.partner.bank'
|
||||||
|
bank_corr_acc = fields.Char('Кор.счет')
|
||||||
|
|
||||||
|
|
||||||
|
# class Bank(models.Model):
|
||||||
|
# _inherit = 'res.bank'
|
||||||
|
|
||||||
|
# corr_acc = fields.Char('Corresponding account', size=64)
|
||||||
|
|
||||||
|
# class Users(models.Model):
|
||||||
|
# _inherit = 'res.users'
|
||||||
|
|
||||||
|
# facsimile = fields.Binary("Facsimile")
|
||||||
|
|
||||||
|
class Company(models.Model):
|
||||||
|
_inherit = 'res.company'
|
||||||
|
|
||||||
|
inn = fields.Char(related='partner_id.inn', readonly=False)
|
||||||
|
kpp = fields.Char(related='partner_id.kpp', readonly=False)
|
||||||
|
okpo = fields.Char(related='partner_id.okpo', readonly=False)
|
||||||
|
chief_id = fields.Many2one('res.users', 'Имя директора')
|
||||||
|
stamp = fields.Binary("Stamp")
|
||||||
|
|
||||||
|
|
||||||
|
class Partner(models.Model):
|
||||||
|
_inherit = 'res.partner'
|
||||||
|
ogrn = fields.Char('ОГРН')
|
||||||
|
okpo = fields.Char('ОКПО')
|
||||||
|
inn = fields.Char('ИНН')
|
||||||
|
kpp = fields.Char('KPP')
|
||||||
|
passport = fields.Char('Паспорт')
|
||||||
|
|
||||||
|
|
||||||
|
class Report_contract_customer(models.Model):
|
||||||
|
_inherit = 'partner.contract.customer'
|
||||||
|
|
||||||
|
def img(self, img, type='png', width=0, height=0):
|
||||||
|
if width:
|
||||||
|
width = "width='%spx'" % (width)
|
||||||
|
else:
|
||||||
|
width = " "
|
||||||
|
if height:
|
||||||
|
height = "height='%spx'" % (height)
|
||||||
|
else:
|
||||||
|
height = " "
|
||||||
|
toreturn = "<img %s %s src='data:image/%s;base64,%s' />" % (
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
type,
|
||||||
|
str(pycompat.to_text(img)))
|
||||||
|
return toreturn
|
||||||
|
|
||||||
|
def numer(self, name):
|
||||||
|
if name:
|
||||||
|
numeration = re.findall('\d+$', name)
|
||||||
|
if numeration: return numeration[0]
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def ru_date(self, date):
|
||||||
|
if date and date != 'False':
|
||||||
|
return dt.ru_strftime(u'"%d" %B %Y года', date=datetime.strptime(str(date), "%Y-%m-%d"), inflected=True)
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def ru_date2(self, date):
|
||||||
|
if date and date != 'False':
|
||||||
|
return dt.ru_strftime(u'%d %B %Y г.', date=datetime.strptime(str(date), "%Y-%m-%d %H:%M:%S"),
|
||||||
|
inflected=True)
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def in_words(self, number):
|
||||||
|
return numeral.in_words(number)
|
||||||
|
|
||||||
|
def rubles(self, sum):
|
||||||
|
"Transform sum number in rubles to text"
|
||||||
|
text_rubles = self.numeral_rubles(int(sum))
|
||||||
|
copeck = round((sum - int(sum)) * 100)
|
||||||
|
text_copeck = self.numeral_choose_plural(int(copeck), (u"копейка", u"копейки", u"копеек"))
|
||||||
|
return ("%s %02d %s") % (text_rubles, copeck, text_copeck)
|
||||||
|
|
||||||
|
def numeral_rubles(self, amount, zero_for_kopeck=False):
|
||||||
|
self.check_positive(amount)
|
||||||
|
pts = []
|
||||||
|
amount = round(amount, 2)
|
||||||
|
pts.append(self.sum_string(int(amount), 1, (u"рубль", u"рубля", u"рублей")))
|
||||||
|
remainder = self._get_float_remainder(amount, 2)
|
||||||
|
iremainder = int(remainder)
|
||||||
|
|
||||||
|
if iremainder != 0 or zero_for_kopeck:
|
||||||
|
if iremainder < 10 and len(remainder) == 1:
|
||||||
|
iremainder *= 10
|
||||||
|
pts.append(self.sum_string(iremainder, 2,
|
||||||
|
(u"копейка", u"копейки", u"копеек")))
|
||||||
|
return u" ".join(pts)
|
||||||
|
|
||||||
|
def _get_float_remainder(self, fvalue, signs=9):
|
||||||
|
self.check_positive(fvalue)
|
||||||
|
if isinstance(fvalue, integer_types):
|
||||||
|
return "0"
|
||||||
|
if isinstance(fvalue, Decimal) and fvalue.as_tuple()[2] == 0:
|
||||||
|
return "0"
|
||||||
|
|
||||||
|
def sum_string(self, amount, gender, items=None):
|
||||||
|
if isinstance(items, text_type):
|
||||||
|
items = split_values(items)
|
||||||
|
if items is None:
|
||||||
|
items = (u"", u"", u"")
|
||||||
|
try:
|
||||||
|
one_item, two_items, five_items = items
|
||||||
|
except ValueError:
|
||||||
|
raise ValueError("Items must be 3-element sequence")
|
||||||
|
self.check_positive(amount)
|
||||||
|
if amount == 0:
|
||||||
|
return u"ноль %s" % five_items
|
||||||
|
into = u''
|
||||||
|
tmp_val = amount
|
||||||
|
into, tmp_val = self._sum_string_fn(into, tmp_val, gender, items)
|
||||||
|
into, tmp_val = self._sum_string_fn(into, tmp_val, FEMALE,
|
||||||
|
(u"тысяча", u"тысячи", u"тысяч"))
|
||||||
|
into, tmp_val = self._sum_string_fn(into, tmp_val, MALE,
|
||||||
|
(u"миллион", u"миллиона", u"миллионов"))
|
||||||
|
into, tmp_val = self._sum_string_fn(into, tmp_val, MALE,
|
||||||
|
(u"миллиард", u"миллиарда", u"миллиардов"))
|
||||||
|
if tmp_val == 0:
|
||||||
|
return into
|
||||||
|
else:
|
||||||
|
raise ValueError("Cannot operand with numbers bigger than 10**11")
|
||||||
|
|
||||||
|
def _sum_string_fn(self, into, tmp_val, gender, items=None):
|
||||||
|
if items is None:
|
||||||
|
items = (u"", u"", u"")
|
||||||
|
one_item, two_items, five_items = items
|
||||||
|
self.check_positive(tmp_val)
|
||||||
|
if tmp_val == 0:
|
||||||
|
return into, tmp_val
|
||||||
|
words = []
|
||||||
|
rest = tmp_val % 1000
|
||||||
|
tmp_val = tmp_val // 1000
|
||||||
|
if rest == 0:
|
||||||
|
if into == u"":
|
||||||
|
into = u"%s " % five_items
|
||||||
|
return into, tmp_val
|
||||||
|
end_word = five_items
|
||||||
|
words.append(HUNDREDS[rest // 100])
|
||||||
|
rest = rest % 100
|
||||||
|
rest1 = rest // 10
|
||||||
|
tens = rest1 == 1 and TENS[rest] or TENS[rest1]
|
||||||
|
words.append(tens)
|
||||||
|
if rest1 < 1 or rest1 > 1:
|
||||||
|
amount = rest % 10
|
||||||
|
end_word = self.numeral_choose_plural(amount, items)
|
||||||
|
words.append(ONES[amount][gender - 1])
|
||||||
|
words.append(end_word)
|
||||||
|
words.append(into)
|
||||||
|
words = filter(lambda x: len(x) > 0, words)
|
||||||
|
return u" ".join(words).strip(), tmp_val
|
||||||
|
|
||||||
|
def check_positive(self, value, strict=False):
|
||||||
|
if not strict and value < 0:
|
||||||
|
raise ValueError("Value must be positive or zero, not %s" % str(value))
|
||||||
|
if strict and value <= 0:
|
||||||
|
raise ValueError("Value must be positive, not %s" % str(value))
|
||||||
|
|
||||||
|
def numeral_choose_plural(self, amount, variants):
|
||||||
|
if isinstance(variants, text_type):
|
||||||
|
variants = split_values(variants)
|
||||||
|
self.check_length(variants, 3)
|
||||||
|
amount = abs(amount)
|
||||||
|
if amount % 10 == 1 and amount % 100 != 11:
|
||||||
|
variant = 0
|
||||||
|
elif amount % 10 >= 2 and amount % 10 <= 4 and \
|
||||||
|
(amount % 100 < 10 or amount % 100 >= 20):
|
||||||
|
variant = 1
|
||||||
|
else:
|
||||||
|
variant = 2
|
||||||
|
return variants[variant]
|
||||||
|
|
||||||
|
def check_length(self, value, length):
|
||||||
|
_length = len(value)
|
||||||
|
if _length != length:
|
||||||
|
raise ValueError("length must be %d, not %d" % \
|
||||||
|
(length, _length))
|
||||||
|
|
||||||
|
def initials(self, fio):
|
||||||
|
if fio:
|
||||||
|
return (fio.split()[0] + ' ' + ''.join([fio[0:1] + '.' for fio in fio.split()[1:]])).strip()
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def address(self, partner):
|
||||||
|
repr = []
|
||||||
|
if partner.zip: repr.append(partner.zip)
|
||||||
|
if partner.city: repr.append(partner.city)
|
||||||
|
if partner.street: repr.append(partner.street)
|
||||||
|
if partner.street2: repr.append(partner.street2)
|
||||||
|
return ', '.join(repr)
|
||||||
|
|
||||||
|
def address_delivery(self, partner):
|
||||||
|
if partner:
|
||||||
|
addr = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'delivery')], limit=1)
|
||||||
|
repr = []
|
||||||
|
if addr:
|
||||||
|
if addr.zip: repr.append(addr.zip)
|
||||||
|
if addr.city: repr.append(addr.city)
|
||||||
|
if addr.street: repr.append(addr.street)
|
||||||
|
if addr.street2: repr.append(addr.street2)
|
||||||
|
return ', '.join(repr)
|
||||||
|
|
||||||
|
def get_function_print(self, function):
|
||||||
|
morph = pymorphy2.MorphAnalyzer()
|
||||||
|
if function:
|
||||||
|
f = morph.parse(function)[0]
|
||||||
|
f = f.inflect({'gent'}).word
|
||||||
|
return f.title()
|
||||||
|
|
||||||
|
def get_function_partnerip(self, partner):
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.function:
|
||||||
|
return director.function
|
||||||
|
|
||||||
|
def get_function_partner(self, partner):
|
||||||
|
res = []
|
||||||
|
morph = pymorphy2.MorphAnalyzer()
|
||||||
|
if partner:
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.function:
|
||||||
|
list_f = str(director.function).split(' ')
|
||||||
|
for func in list_f:
|
||||||
|
f = morph.parse(func)[0]
|
||||||
|
f = f.inflect({'gent'}).word
|
||||||
|
res.append(f)
|
||||||
|
return ' '.join(res)
|
||||||
|
|
||||||
|
def get_function_partner1(self, partner):
|
||||||
|
if partner:
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner), ('type', '=', 'director')], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.function:
|
||||||
|
return director.function
|
||||||
|
|
||||||
|
def get_date_text(self, date):
|
||||||
|
month_list = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября',
|
||||||
|
'ноября', 'декабря']
|
||||||
|
if date:
|
||||||
|
date_list = str(date).split('-')
|
||||||
|
if date_list[0] and date_list[1] and date_list[2]:
|
||||||
|
return ('"' + date_list[2] + '" ' + month_list[int(date_list[1]) - 1] + ' ' + date_list[0] + ' г.')
|
||||||
|
|
||||||
|
def get_bank(self, partner):
|
||||||
|
repr = []
|
||||||
|
bank = None
|
||||||
|
if partner.bank_ids:
|
||||||
|
bank = partner.bank_ids[0]
|
||||||
|
elif partner.parent_id.bank_ids:
|
||||||
|
bank = partner.parent_id.bank_ids[0]
|
||||||
|
if bank and bank.bank_name: repr.append(bank.bank_name)
|
||||||
|
if bank and bank.acc_number: repr.append(u"Р/счет " + bank.acc_number)
|
||||||
|
if bank and bank.bank_bic: repr.append(u"БИК " + bank.bank_bic)
|
||||||
|
if bank and bank.bank_corr_acc: repr.append(u"к/с " + bank.bank_corr_acc)
|
||||||
|
return '<br/>'.join(repr)
|
128
l10n_ru_contract/models/invoice_saleorder.py
Normal file
128
l10n_ru_contract/models/invoice_saleorder.py
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
from odoo import api, fields, models, exceptions
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
class contract_sale_order(models.Model):
|
||||||
|
_inherit = 'sale.order'
|
||||||
|
mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора')
|
||||||
|
sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid')
|
||||||
|
stamp = fields.Boolean(string='Печать и подпись', related='mt_contractid.stamp')
|
||||||
|
|
||||||
|
@api.depends('partner_id')
|
||||||
|
def get_pid(self):
|
||||||
|
for s in self:
|
||||||
|
s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id
|
||||||
|
|
||||||
|
@api.onchange('mt_contractid')
|
||||||
|
def set_ons(self):
|
||||||
|
if self.mt_contractid:
|
||||||
|
self.payment_term_id = self.mt_contractid.payment_term_id
|
||||||
|
|
||||||
|
@api.constrains('state')
|
||||||
|
def late_payment_check(self):
|
||||||
|
if self.mt_contractid:
|
||||||
|
if self.state == 'sale':
|
||||||
|
late_invoices_count = 0
|
||||||
|
max_receivable = self.mt_contractid.profile_id.max_receivable_id # макс. деб. задолженность в договоре
|
||||||
|
# ищу просроченные инвойсы контрагента указанного в заказе со стейтом "Подтверждено"
|
||||||
|
invoices_obj = self.env['account.move'].search([('partner_id', '=', self.partner_id.id),
|
||||||
|
('state', '=', 'posted'),
|
||||||
|
('invoice_date_due', '<', datetime.now().date())])
|
||||||
|
|
||||||
|
for invoice in invoices_obj:
|
||||||
|
late_invoices_count += invoice.amount_residual # складываю деб. задолженность по просроченным инвойсам
|
||||||
|
|
||||||
|
if late_invoices_count > max_receivable:
|
||||||
|
raise exceptions.ValidationError(
|
||||||
|
f'Нельзя подтвердить заказ, так как у контрагента {self.sec_partner_id.name} нарушено '
|
||||||
|
f'условие по дебиторской задолженности.\n\n'
|
||||||
|
f'Контрагент {self.sec_partner_id.name} должен {late_invoices_count}руб.\n'
|
||||||
|
f'Максимальная дебиторская задолженность указанная в '
|
||||||
|
f'договоре №{self.mt_contractid.name} - {max_receivable}руб.\n\n'
|
||||||
|
f'Проверьте следующие неоплаченные счета контрагента:\n'
|
||||||
|
f'{", ".join([invoice.name for invoice in invoices_obj])}')
|
||||||
|
|
||||||
|
# при выбора счета "Обычный счет"
|
||||||
|
@api.model
|
||||||
|
def _create_invoices(self, grouped=False, final=False, date=None):
|
||||||
|
res = super(contract_sale_order, self)._create_invoices(grouped, final, date)
|
||||||
|
if self.mt_contractid:
|
||||||
|
res.write({'mt_contractid': self.mt_contractid,
|
||||||
|
'journal_id': self.mt_contractid.profile_id.journal_id})
|
||||||
|
# 'invoice_payment_term_id': self.mt_contractid.profile_id.payment_term_id
|
||||||
|
# 'line_ids': [(0, 0, {
|
||||||
|
# 'account_id': self.mt_contractid.profile_id.receivable_account_id.id})]
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class ContractCreateInvoice(models.TransientModel):
|
||||||
|
_inherit = 'sale.advance.payment.inv'
|
||||||
|
|
||||||
|
# при выбора счета "Авансовый платеж"
|
||||||
|
@api.model
|
||||||
|
def _create_invoice(self, order, so_line, amount):
|
||||||
|
res = super(ContractCreateInvoice, self)._create_invoice(order, so_line, amount)
|
||||||
|
if order.mt_contractid:
|
||||||
|
res.write({'mt_contractid': order.mt_contractid,
|
||||||
|
'journal_id': order.mt_contractid.profile_id.journal_id, })
|
||||||
|
# 'invoice_payment_term_id': order.mt_contractid.profile_id.payment_term_id
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class contract_invoice(models.Model):
|
||||||
|
_inherit = 'account.move'
|
||||||
|
mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора')
|
||||||
|
sf_number = fields.Char(string='Номер с/ф')
|
||||||
|
osnovanie = fields.Char(string='Основание')
|
||||||
|
sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid')
|
||||||
|
stamp = fields.Boolean(string='Печать и подпись', related='mt_contractid.stamp')
|
||||||
|
|
||||||
|
@api.depends('partner_id')
|
||||||
|
def get_pid(self):
|
||||||
|
for s in self:
|
||||||
|
s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id
|
||||||
|
|
||||||
|
@api.onchange('mt_contractid')
|
||||||
|
def set_ons(self):
|
||||||
|
if self.mt_contractid:
|
||||||
|
self.osnovanie = 'Договор № ' + self.mt_contractid.name + ' от ' + fields.Datetime.from_string(
|
||||||
|
self.mt_contractid.date_start).strftime("%d.%m.%Y")
|
||||||
|
|
||||||
|
@api.constrains('state')
|
||||||
|
def invoice_fields_check(self):
|
||||||
|
for s in self:
|
||||||
|
if s.state == 'posted':
|
||||||
|
if s.mt_contractid:
|
||||||
|
errors_list = []
|
||||||
|
journal_in_contract = s.mt_contractid.profile_id.journal_id
|
||||||
|
payment_term_in_contract = s.mt_contractid.profile_id.payment_term_id
|
||||||
|
receivable_in_contract = s.mt_contractid.profile_id.receivable_account_id
|
||||||
|
|
||||||
|
if journal_in_contract != s.journal_id:
|
||||||
|
errors_list.append(f'Отличается Журнал - [{s.journal_id.name}] '
|
||||||
|
f'и указанный в договоре №{s.mt_contractid.name} '
|
||||||
|
f'Журнал - [{journal_in_contract.name}]\n\n')
|
||||||
|
|
||||||
|
if payment_term_in_contract != s.invoice_payment_term_id:
|
||||||
|
errors_list.append(f'Отличается поле "Условие оплаты" в инвойсе '
|
||||||
|
f'[Условие оплаты - {s.invoice_payment_term_id.name}] '
|
||||||
|
f'и указанный в договоре №{s.mt_contractid.name} '
|
||||||
|
f'[Условие оплаты - {payment_term_in_contract.name}]\n\n')
|
||||||
|
|
||||||
|
if receivable_in_contract not in s.line_ids.account_id:
|
||||||
|
errors_list.append(f'Отличается поле "Счет дебиторской задолженности" в инвойсе '
|
||||||
|
f'и указанный в договоре №{s.mt_contractid.name}')
|
||||||
|
|
||||||
|
if errors_list:
|
||||||
|
raise exceptions.ValidationError(''.join(errors_list))
|
||||||
|
|
||||||
|
|
||||||
|
class contact_purchase_order(models.Model):
|
||||||
|
_inherit = 'purchase.order'
|
||||||
|
mt_contractid = fields.Many2one('partner.contract.customer', string='Номер договора')
|
||||||
|
sec_partner_id = fields.Many2one('res.partner', string='Контрагент', store=True, compute='get_pid')
|
||||||
|
|
||||||
|
@api.depends('partner_id')
|
||||||
|
def get_pid(self):
|
||||||
|
for s in self:
|
||||||
|
s.sec_partner_id = s.partner_id.parent_id if s.partner_id.parent_id else s.partner_id
|
2
l10n_ru_contract/report/__init__.py
Normal file
2
l10n_ru_contract/report/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import report_contract,report_contract_order,report_contract_invoce
|
14
l10n_ru_contract/report/report_contract.py
Normal file
14
l10n_ru_contract/report/report_contract.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
class ContractCustomerReport(models.AbstractModel):
|
||||||
|
_name = 'contract.customer.report'
|
||||||
|
|
||||||
|
|
||||||
|
def get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['partner.contract.customer'].browse(docids)
|
||||||
|
return {
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'partner.contract.customer',
|
||||||
|
'docs': docs,
|
||||||
|
}
|
398
l10n_ru_contract/report/report_contract.xml
Normal file
398
l10n_ru_contract/report/report_contract.xml
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<template id="report_contract_customer">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"/>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"/>
|
||||||
|
<div class="header">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0">
|
||||||
|
<t t-esc="o.company_id.name or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C1">Договор
|
||||||
|
<t t-esc="o.name or ''"/>
|
||||||
|
от
|
||||||
|
<t
|
||||||
|
t-esc="o.date_start or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="page">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: center; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C2{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C3{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium; margin: 40px;}
|
||||||
|
p.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align: center;
|
||||||
|
vertical-align: medium; font-weight: bold;}
|
||||||
|
div.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C6rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-top: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid; border-right:
|
||||||
|
#000000 1px solid}
|
||||||
|
tr.R0 td.R0C6r{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-right: #000000 1px solid}
|
||||||
|
tr.R0 td.R0C6l{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
text-align: left; vertical-align: medium; border-left: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6b{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6t{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -30px; left: 80px; }
|
||||||
|
tr.R0 td.R0C6tS { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tS span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tS span img { position: absolute; width: 140px; top: -40px; left: -200px; }
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: auto;">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">Договор №
|
||||||
|
<t t-esc="o.name"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">на поставку продукции</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1">
|
||||||
|
<t t-esc="company.partner_id.city"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C2">
|
||||||
|
<t t-esc="o.get_date_text(o.date_start)"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="2">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
</tr>
|
||||||
|
<!--t t-foreach="o.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="2"><t t-esc="line.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"><span><t t-raw="line.punct"/></span></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"></td>
|
||||||
|
</tr>
|
||||||
|
</t-->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<t t-foreach="o.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<p class="R0C4">
|
||||||
|
<t t-esc="line.name or ''"/>
|
||||||
|
</p>
|
||||||
|
<div class="R0C5">
|
||||||
|
<span>
|
||||||
|
<t t-raw="line.punct or ''"/>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">
|
||||||
|
<t t-esc="o.company_id.name or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">
|
||||||
|
<t t-esc="o.partner_id.name or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН
|
||||||
|
<t t-esc="o.partner_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<!-- <tr class="R0">-->
|
||||||
|
<!-- <td class="R0C6rl" colspan="3">Расчетный счет:</td>-->
|
||||||
|
<!-- <td class="R0C6rl" colspan="3">Расчетный счет:</td>-->
|
||||||
|
<!-- </tr>-->
|
||||||
|
<!-- <tr class="R0">-->
|
||||||
|
<!-- <td class="R0C6l" colspan="3">-->
|
||||||
|
<!-- <t t-raw="o.get_bank(o.company_id.partner_id) or ''"/>-->
|
||||||
|
<!-- </td>-->
|
||||||
|
<!-- <td class="R0C7rl" colspan="3">-->
|
||||||
|
<!-- <t t-raw="o.get_bank(o.partner_id) or ''"/>-->
|
||||||
|
<!-- </td>-->
|
||||||
|
<!-- </tr>-->
|
||||||
|
<!-- <td class="R0C6tI">-->
|
||||||
|
<!-- <SPAN>-->
|
||||||
|
<!-- <t-->
|
||||||
|
<!-- t-raw="o.stamp and o.img(company.chief_id.facsimile) or ''"/>-->
|
||||||
|
<!-- </SPAN>-->
|
||||||
|
<!-- </td>-->
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 30px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: right; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: top; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -5px; left: 5px;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0">Подпись Исполнителя</td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t
|
||||||
|
t-raw="o.stamp and o.img(company.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C0"></td>
|
||||||
|
<td class="R0C1">Подпись Заказчика</td>
|
||||||
|
<td class="R0C6tI"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 pull-right">
|
||||||
|
<small style="font-size:18px;">
|
||||||
|
<span>Страница</span>
|
||||||
|
<span class="page"/>
|
||||||
|
из
|
||||||
|
<span class="topage"/>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<record id="paperformat_a4" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">15</field>
|
||||||
|
<field name="margin_bottom">30</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">90</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_contract_customer" model="ir.actions.report">
|
||||||
|
<field name="name">Договор</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">contract.report_contract_customer</field>
|
||||||
|
<field name="report_file">contract.report_contract_customer</field>
|
||||||
|
<field name="print_report_name">'Договор - %s' % (object.name)</field>
|
||||||
|
<field name="binding_model_id" ref="contract.model_partner_contract_customer" />
|
||||||
|
<field name="paperformat_id" ref="paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
15
l10n_ru_contract/report/report_contract_invoce.py
Normal file
15
l10n_ru_contract/report/report_contract_invoce.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
|
class ContractCustomerReportOrder(models.AbstractModel):
|
||||||
|
_name = 'contract.customer.report_invoce'
|
||||||
|
|
||||||
|
|
||||||
|
def get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['account.move'].browse(docids)
|
||||||
|
return {
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'account.move',
|
||||||
|
'docs': docs,
|
||||||
|
}
|
592
l10n_ru_contract/report/report_contract_invoce.xml
Normal file
592
l10n_ru_contract/report/report_contract_invoce.xml
Normal file
@ -0,0 +1,592 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<template id="report_contract_customer_invoce">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"/>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"/>
|
||||||
|
<div class="header">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C1">Договор <t t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.date_start or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="page">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: center; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C2{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C3{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium; margin: 40px;}
|
||||||
|
tr.R0 td.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
start; vertical-align: medium;}
|
||||||
|
p.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align: center;
|
||||||
|
vertical-align: medium; font-weight: bold;}
|
||||||
|
div.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C6rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-top: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid; border-right:
|
||||||
|
#000000 1px solid}
|
||||||
|
tr.R0 td.R0C6r{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-right: #000000 1px solid}
|
||||||
|
tr.R0 td.R0C6l{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
text-align: left; vertical-align: medium; border-left: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6b{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6t{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -30px; left: 80px; }
|
||||||
|
tr.R0 td.R0C6tS { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tS span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tS span img { position: absolute; width: 140px; top: -40px; left: -200px; }
|
||||||
|
tr.R0 td.R0C8{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C9box{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid; border-top: #000000 1px solid;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: auto;">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">Договор № <t t-esc="o.mt_contractid.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">на поставку продукции</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"><t t-esc="o.mt_contractid.company_id.partner_id.city or ''"/></td>
|
||||||
|
<td class="R0C2"><t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="2">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.mt_contractid.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
</tr>
|
||||||
|
<!--t t-foreach="o.mt_contractid.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="2"><t t-esc="line.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"><t t-raw="line.punct"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"></td>
|
||||||
|
</tr>
|
||||||
|
</t-->
|
||||||
|
<!--tr class="R0">
|
||||||
|
<td class="R0C4" colspan="2">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr-->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<t t-foreach="o.mt_contractid.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<p class="R0C4"><t t-esc="line.name or ''"/></p>
|
||||||
|
<div class="R0C5"><span><t t-raw="line.punct or ''"/></span></div>
|
||||||
|
</t>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.partner_id.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.mt_contractid.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.inn or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.mt_contractid.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.mt_contractid.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p style="page-break-before:always;"></p>
|
||||||
|
<!--p style="page-break-after:always"></p>
|
||||||
|
<div style="page-break-after: auto;"><span style="display: none;"> </span></div>
|
||||||
|
<p style="page-break-inside: avoid">
|
||||||
|
<div style="page-break-inside: auto"></div-->
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C8" colspan="8">Приложение<br/>к договору № <t
|
||||||
|
t-esc="o.mt_contractid.name"/><br/>на поставку продукции<br/>от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8">Спецификация № 1</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.company_id.partner_id.city or ''"/></td>
|
||||||
|
<td class="R0C2" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="8">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.mt_contractid.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="8">1. По договору на поставку продукции <t
|
||||||
|
t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/>.
|
||||||
|
Поставщик обязуется поставить, а Покупатель оплатить в полном объеме следующее:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C9box">Номенклатура</td>
|
||||||
|
<!-- <td class="R0C9box">*ГОСТ</td>-->
|
||||||
|
<td class="R0C9box">Ед.изм.</td>
|
||||||
|
<td class="R0C9box">Кол-во</td>
|
||||||
|
<td class="R0C9box">Цена/руб.<br/>без НДС</td>
|
||||||
|
<td class="R0C9box">Стоимость/руб.<br/>без НДС</td>
|
||||||
|
<!-- <td class="R0C9box">НДС</td>-->
|
||||||
|
<!-- <td class="R0C9box">Стоимость/руб.<br/>c НДС</td>-->
|
||||||
|
</tr>
|
||||||
|
<t t-set="invoice_line_ids" t-value="o.invoice_line_ids.filtered(lambda s: 'аванс' not in s.name.lower() and 'депозит' not in s.name.lower())"/>
|
||||||
|
|
||||||
|
<t t-set="quantity" t-value="sum([line.quantity for line in invoice_line_ids])"/>
|
||||||
|
<t t-set="sum_full"
|
||||||
|
t-value="sum([line.quantity*line.price_unit for line in invoice_line_ids])"/>
|
||||||
|
<t t-set="sum_nds"
|
||||||
|
t-value="sum([line.quantity*line.price_unit*1.2 for line in invoice_line_ids])"/>
|
||||||
|
<tr class="R0" t-foreach="invoice_line_ids" t-as="line">
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.name or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box"><!–ГОСТ–></td>-->
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.uom_id.name or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.quantity or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit*line.quantity or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">20%</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="line.price_unit*line.quantity*1.2 or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td></td>
|
||||||
|
<!-- <td></td>-->
|
||||||
|
<td>ИТОГО</td>
|
||||||
|
<td class="R0C9box"><t t-esc="quantity or ''"/></td>
|
||||||
|
<td class="R0C9box">x</td>
|
||||||
|
<td class="R0C9box"><t t-esc="sum_full or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">x</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="sum_nds or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="8">Итого: <t t-esc="sum_full or ''"/> рублей (<t
|
||||||
|
t-esc="o.mt_contractid.rubles(sum_full) or ''"/>). В стоимость продукции входит стоимость
|
||||||
|
тары и стоимость транспортных расходов, связанных с доставкой продукции до станции
|
||||||
|
назначения.<br/>
|
||||||
|
2. Базис поставки (пункт назначения) по отгрузочным реквизитам:<br/>
|
||||||
|
<t t-esc="o.mt_contractid.address_delivery(o.mt_contractid.partner_id.id) or ''"/><br/>
|
||||||
|
Грузополучатель: <t t-esc="o.mt_contractid.partner_id.name or ''"/>, код <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.id or ''"/>, ОКПО <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.okpo or ''"/>.<br/>
|
||||||
|
3. Условия оплаты: <t t-esc="o.invoice_payment_term_id.name or ''"/> согласно
|
||||||
|
выставленному счету Поставщика.<br/>
|
||||||
|
4. Срок отгрузки: <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_end) or ''"/><br/>
|
||||||
|
5. Срок действия настоящей спецификации ограничен и равен сроку отгрузки по условиям
|
||||||
|
данной спецификации.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.partner_id.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.mt_contractid.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.inn or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.mt_contractid.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.mt_contractid.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 30px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: right; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: top; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -5px; left: 5px;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0">Подпись Исполнителя</td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t
|
||||||
|
t-raw="o.stamp and o.mt_contractid.img(company.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C0"></td>
|
||||||
|
<td class="R0C1">Подпись Заказчика</td>
|
||||||
|
<td class="R0C6tI"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 pull-right">
|
||||||
|
<small style="font-size:18px;">
|
||||||
|
<span>Страница</span>
|
||||||
|
<span class="page"/>
|
||||||
|
из
|
||||||
|
<span class="topage"/>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<record id="paperformat_a4" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">15</field>
|
||||||
|
<field name="margin_bottom">30</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">90</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_contract_customer_invoce" model="ir.actions.report">
|
||||||
|
<field name="name">Договор со спецификацией</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">contract.report_contract_customer_invoce</field>
|
||||||
|
<field name="report_file">contract.report_contract_customer_invoce</field>
|
||||||
|
<field name="print_report_name">'Договор со спецификацией - %s' % (object.name)</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
18
l10n_ru_contract/report/report_contract_order.py
Normal file
18
l10n_ru_contract/report/report_contract_order.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
|
class ContractCustomerReportOrder(models.AbstractModel):
|
||||||
|
_name = 'contract.customer.report_order'
|
||||||
|
|
||||||
|
|
||||||
|
def get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['sale.order'].browse(docids)
|
||||||
|
return {
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'sale.order',
|
||||||
|
'docs': docs,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
594
l10n_ru_contract/report/report_contract_order.xml
Normal file
594
l10n_ru_contract/report/report_contract_order.xml
Normal file
@ -0,0 +1,594 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<template id="report_contract_customer_order">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"/>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"/>
|
||||||
|
<div class="header">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C1">Договор <t t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.date_start or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="page">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: center; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C2{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C3{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium; margin: 40px;}
|
||||||
|
tr.R0 td.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
start; vertical-align: medium;}
|
||||||
|
p.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align: center;
|
||||||
|
vertical-align: medium; font-weight: bold;}
|
||||||
|
div.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C6rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-top: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid; border-right:
|
||||||
|
#000000 1px solid}
|
||||||
|
tr.R0 td.R0C6r{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-right: #000000 1px solid}
|
||||||
|
tr.R0 td.R0C6l{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
text-align: left; vertical-align: medium; border-left: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6b{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6t{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -30px; left: 80px; }
|
||||||
|
tr.R0 td.R0C6tS { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tS span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tS span img { position: absolute; width: 140px; top: -40px; left: -200px; }
|
||||||
|
tr.R0 td.R0C8{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C9box{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid; border-top: #000000 1px solid;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">Договор № <t t-esc="o.mt_contractid.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="2">на поставку продукции</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"><t t-esc="o.mt_contractid.company_id.partner_id.city or ''"/></td>
|
||||||
|
<td class="R0C2"><t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="2">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.mt_contractid.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr>
|
||||||
|
</tr>
|
||||||
|
<!--t t-foreach="o.mt_contractid.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="2"><t t-esc="line.name"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"><t t-raw="line.punct"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="2"></td>
|
||||||
|
</tr>
|
||||||
|
</t-->
|
||||||
|
<!--tr class="R0">
|
||||||
|
<td class="R0C4" colspan="2">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1"></td>
|
||||||
|
<td class="R0C2"></td>
|
||||||
|
</tr-->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<t t-foreach="o.mt_contractid.lines.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||||
|
<p class="R0C4"><t t-esc="line.name or ''"/></p>
|
||||||
|
<div class="R0C5"><span><t t-raw="line.punct or ''"/></span></div>
|
||||||
|
</t>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.partner_id.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.mt_contractid.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.inn or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.mt_contractid.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.mt_contractid.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p style="page-break-before:always;"></p>
|
||||||
|
<!--p style="page-break-after:always"></p>
|
||||||
|
<div style="page-break-after: auto;"><span style="display: none;"> </span></div>
|
||||||
|
<p style="page-break-inside: avoid">
|
||||||
|
<div style="page-break-inside: auto"></div-->
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C8" colspan="8">Приложение<br/>к договору № <t
|
||||||
|
t-esc="o.mt_contractid.name"/><br/>на поставку продукции<br/>от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8">Спецификация № 1</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.company_id.partner_id.city or ''"/></td>
|
||||||
|
<td class="R0C2" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="8">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.mt_contractid.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="8">1. По договору на поставку продукции <t
|
||||||
|
t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/>.
|
||||||
|
Поставщик обязуется поставить, а Покупатель оплатить в полном объеме следующее:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C9box">Номенклатура</td>
|
||||||
|
<!-- <td class="R0C9box">*ГОСТ</td>-->
|
||||||
|
<td class="R0C9box">Ед.изм.</td>
|
||||||
|
<td class="R0C9box">Кол-во</td>
|
||||||
|
<td class="R0C9box">Цена/руб.<br/>без НДС</td>
|
||||||
|
<td class="R0C9box">Стоимость/руб.<br/>без НДС</td>
|
||||||
|
<!-- <td class="R0C9box">НДС</td>-->
|
||||||
|
<!-- <td class="R0C9box">Стоимость/руб.<br/>c НДС</td>-->
|
||||||
|
</tr>
|
||||||
|
<t t-set="order_line" t-value="o.order_line.filtered(lambda s: 'аванс' not in s.name.lower() and 'депозит' not in s.name.lower())"/>
|
||||||
|
<t t-set="quantity" t-value="sum([line.product_uom_qty for line in order_line])"/>
|
||||||
|
<t t-set="sum_full"
|
||||||
|
t-value="sum([line.product_uom_qty*line.price_unit for line in order_line])"/>
|
||||||
|
<t t-set="sum_nds"
|
||||||
|
t-value="sum([line.product_uom_qty*line.price_unit*1.2 for line in order_line])"/>
|
||||||
|
<tr class="R0" t-foreach="order_line" t-as="line">
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.name or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box"><!–ГОСТ–></td>-->
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.uom_id.name or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_uom_qty or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit*line.product_uom_qty or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">20%</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="line.price_unit*line.product_uom_qty*1.2 or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td></td>
|
||||||
|
<!-- <td></td>-->
|
||||||
|
<td>ИТОГО</td>
|
||||||
|
<td class="R0C9box"><t t-esc="quantity or ''"/></td>
|
||||||
|
<td class="R0C9box">x</td>
|
||||||
|
<td class="R0C9box"><t t-esc="sum_full or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">x</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="sum_nds or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="9">Итого: <t t-esc="sum_full or ''"/> рублей (<t
|
||||||
|
t-esc="o.mt_contractid.rubles(sum_full) or ''"/>). В стоимость продукции входит
|
||||||
|
стоимость
|
||||||
|
тары и стоимость транспортных расходов, связанных с доставкой продукции до станции
|
||||||
|
назначения.<br/>
|
||||||
|
2. Базис поставки (пункт назначения) по отгрузочным реквизитам:<br/>
|
||||||
|
<t t-esc="o.mt_contractid.address_delivery(o.mt_contractid.partner_id.id) or ''"/><br/>
|
||||||
|
Грузополучатель: <t t-esc="o.mt_contractid.partner_id.name or ''"/>, код <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.id or ''"/>, ОКПО <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.okpo or ''"/>.<br/>
|
||||||
|
3. Условия оплаты: <t t-esc="o.payment_term_id.name or ''"/> согласно выставленному
|
||||||
|
счету
|
||||||
|
Поставщика.<br/>
|
||||||
|
4. Срок отгрузки: <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_end) or ''"/>
|
||||||
|
<br/>
|
||||||
|
5. Срок действия настоящей спецификации ограничен и равен сроку отгрузки по
|
||||||
|
условиям данной спецификации.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.partner_id.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.mt_contractid.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.inn or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.mt_contractid.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.mt_contractid.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 30px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: right; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: top; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -5px; left: 5px;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0">Подпись Исполнителя</td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t
|
||||||
|
t-raw="o.stamp and o.mt_contractid.img(company.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C0"></td>
|
||||||
|
<td class="R0C1">Подпись Заказчика</td>
|
||||||
|
<td class="R0C6tI"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 pull-right">
|
||||||
|
<small style="font-size:18px;">
|
||||||
|
<span>Страница</span>
|
||||||
|
<span class="page"/>
|
||||||
|
из
|
||||||
|
<span class="topage"/>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<record id="paperformat_a4" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">15</field>
|
||||||
|
<field name="margin_bottom">30</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">90</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_contract_customer_order" model="ir.actions.report">
|
||||||
|
<field name="name">Договор со спецификацией</field>
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">contract.report_contract_customer_order</field>
|
||||||
|
<field name="report_file">contract.report_contract_customer_order</field>
|
||||||
|
<field name="print_report_name">'Договор со спецификацией - %s' % (object.name)</field>
|
||||||
|
<field name="binding_model_id" ref="sale.model_sale_order" />
|
||||||
|
<field name="paperformat_id" ref="paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
406
l10n_ru_contract/report/report_contract_order1.xml
Normal file
406
l10n_ru_contract/report/report_contract_order1.xml
Normal file
@ -0,0 +1,406 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<template id="report_contract_customer_order1">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"/>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"/>
|
||||||
|
<div class="header">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C1">Договор <t t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.date_start or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="page">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 15px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: center; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C2{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C3{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium; margin: 40px;}
|
||||||
|
tr.R0 td.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
start; vertical-align: medium;}
|
||||||
|
p.R0C4{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align: center;
|
||||||
|
vertical-align: medium; font-weight: bold;}
|
||||||
|
div.R0C5{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
justify; vertical-align: medium;}
|
||||||
|
tr.R0 td.R0C6rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-top: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid; border-right:
|
||||||
|
#000000 1px solid}
|
||||||
|
tr.R0 td.R0C6r{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-right: #000000 1px solid}
|
||||||
|
tr.R0 td.R0C6l{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
text-align: left; vertical-align: medium; border-left: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6b{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6t{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-top: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal;
|
||||||
|
font-weight: bold; text-align: left; vertical-align: medium; border-left: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rtl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid;
|
||||||
|
border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C7rbl{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
left; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: medium; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -30px; left: 80px; }
|
||||||
|
tr.R0 td.R0C6tS { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tS span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tS span img { position: absolute; width: 140px; top: -40px; left: -200px; }
|
||||||
|
tr.R0 td.R0C8{ font-family: Times new roman; font-size: 11pt; font-style: normal; text-align:
|
||||||
|
right; vertical-align: medium; font-weight: bold;}
|
||||||
|
tr.R0 td.R0C9box{ font-family: Times new roman; font-size: 12pt; font-style: normal; text-align:
|
||||||
|
center; vertical-align: medium; border-left: #000000 1px solid; border-right: #000000 1px solid;
|
||||||
|
border-bottom: #000000 1px solid; border-top: #000000 1px solid;}
|
||||||
|
</STYLE>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C8" colspan="8">Приложение<br/>к договору № <t
|
||||||
|
t-esc="o.mt_contractid.name"/><br/>на поставку продукции<br/>от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8">Спецификация № 1</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.company_id.partner_id.city or ''"/></td>
|
||||||
|
<td class="R0C2" colspan="4"><t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C3" colspan="8">
|
||||||
|
<span>
|
||||||
|
<t t-raw="o.mt_contractid.contract_header or ''"/>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="8">1. По договору на поставку продукции <t
|
||||||
|
t-esc="o.mt_contractid.name or ''"/> от <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_start) or ''"/>.
|
||||||
|
Поставщик обязуется поставить, а Покупатель оплатить в полном объеме следующее:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C9box">Номенклатура</td>
|
||||||
|
<!-- <td class="R0C9box">*ГОСТ</td>-->
|
||||||
|
<td class="R0C9box">Ед.изм.</td>
|
||||||
|
<td class="R0C9box">Кол-во</td>
|
||||||
|
<td class="R0C9box">Цена/руб.<br/>без НДС</td>
|
||||||
|
<td class="R0C9box">Стоимость/руб.<br/>без НДС</td>
|
||||||
|
<!-- <td class="R0C9box">НДС</td>-->
|
||||||
|
<!-- <td class="R0C9box">Стоимость/руб.<br/>c НДС</td>-->
|
||||||
|
</tr>
|
||||||
|
<t t-set="order_line" t-value="o.order_line.filtered(lambda s: 'аванс' not in s.name.lower() and 'депозит' not in s.name.lower())"/>
|
||||||
|
<t t-set="quantity" t-value="sum([line.product_uom_qty for line in order_line])"/>
|
||||||
|
<t t-set="sum_full"
|
||||||
|
t-value="sum([line.product_uom_qty*line.price_unit for line in order_line])"/>
|
||||||
|
<t t-set="sum_nds"
|
||||||
|
t-value="sum([line.product_uom_qty*line.price_unit*1.2 for line in order_line])"/>
|
||||||
|
<tr class="R0" t-foreach="order_line" t-as="line">
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.name or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box"><!–ГОСТ–></td>-->
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_id.uom_id.name or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.product_uom_qty or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit or ''"/></td>
|
||||||
|
<td class="R0C9box"><t t-esc="line.price_unit*line.product_uom_qty or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">20%</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="line.price_unit*line.product_uom_qty*1.2 or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td></td>
|
||||||
|
<!-- <td></td>-->
|
||||||
|
<td>ИТОГО</td>
|
||||||
|
<td class="R0C9box"><t t-esc="quantity or ''"/></td>
|
||||||
|
<td class="R0C9box">x</td>
|
||||||
|
<td class="R0C9box"><t t-esc="sum_full or ''"/></td>
|
||||||
|
<!-- <td class="R0C9box">x</td>-->
|
||||||
|
<!-- <td class="R0C9box"><t t-esc="sum_nds or ''"/></td>-->
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C5" colspan="8">Итого: <t t-esc="sum_full or ''"/> рублей (<t
|
||||||
|
t-esc="o.mt_contractid.rubles(sum_full) or ''"/>). В стоимость продукции входит стоимость
|
||||||
|
тары и стоимость транспортных расходов, связанных с доставкой продукции до станции
|
||||||
|
назначения.<br/>
|
||||||
|
2. Базис поставки (пункт назначения) по отгрузочным реквизитам:<br/>
|
||||||
|
<t t-esc="o.mt_contractid.address_delivery(o.mt_contractid.partner_id.id) or ''"/><br/>
|
||||||
|
Грузополучатель: <t t-esc="o.mt_contractid.partner_id.name or ''"/>, код <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.id or ''"/>, ОКПО <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.okpo or ''"/>.<br/>
|
||||||
|
3. Условия оплаты: <t t-esc="o.payment_term_id.name or ''"/> согласно выставленному счету
|
||||||
|
Поставщика.<br/>
|
||||||
|
4. Срок отгрузки: <t
|
||||||
|
t-esc="o.mt_contractid.get_date_text(o.mt_contractid.date_end) or ''"/><br/>
|
||||||
|
5. Срок действия настоящей спецификации ограничен и равен сроку отгрузки по условиям
|
||||||
|
данной спецификации.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0" colspan="8"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%; page-break-inside: avoid;">
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="30%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C4" colspan="6">Реквизиты и подписи сторон.</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C1" colspan="6"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rtl" colspan="3">Поставщик:</td>
|
||||||
|
<td class="R0C6rtl" colspan="3">Покупатель:</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.company_id.name or ''"/></td>
|
||||||
|
<td class="R0C6rl" colspan="3"><t t-esc="o.mt_contractid.partner_id.name or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">ИНН
|
||||||
|
<t t-esc="o.mt_contractid.company_id.inn or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">ИНН <t
|
||||||
|
t-esc="o.mt_contractid.partner_id.inn or ''"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="2">ОГРН
|
||||||
|
<t t-esc="o.company_id.company_registry or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6r" rowspan="2">
|
||||||
|
<t t-esc="o.mt_contractid.name_dirprint1 or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type in ['company', 'company_ip']">
|
||||||
|
<td class="R0C7rl" colspan="3">ОГРН
|
||||||
|
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3">Паспорт
|
||||||
|
<t t-esc="o.partner_id.passport or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">КПП
|
||||||
|
<t t-esc="o.mt_contractid.company_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
<t t-if="o.mt_contractid.partner_type == 'company'">
|
||||||
|
<td class="R0C7rl" colspan="3">КПП
|
||||||
|
<t t-esc="o.partner_id.kpp or ''"/>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
<t t-else="">
|
||||||
|
<td class="R0C7rl" colspan="3"></td>
|
||||||
|
</t>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3">Юридический адрес:
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.company_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
<td class="R0C7rl" colspan="3">
|
||||||
|
<t t-esc="o.mt_contractid.address(o.partner_id) or ''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6tS">
|
||||||
|
<SPAN>
|
||||||
|
<t t-raw="o.stamp and o.mt_contractid.img(o.company_id.stamp) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6l"></td>
|
||||||
|
<td class="R0C6b"></td>
|
||||||
|
<td class="R0C6r">
|
||||||
|
<t t-esc="''"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
<td class="R0C6rl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
<td class="R0C6rbl" colspan="3"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body {background: #ffffff; margin: 0; font-family: Times new roman; font-size: 12pt; font-style:
|
||||||
|
normal;}
|
||||||
|
tr.R0{height: 30px;}
|
||||||
|
tr.R0 td.R0C0{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C1{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: right; vertical-align: bottom;}
|
||||||
|
tr.R0 td.R0C6tI{ font-family: Times new roman; font-size: 11pt; font-style: normal; font-weight:
|
||||||
|
bold; text-align: left; vertical-align: top; border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R0C6tI { overflow: visible; }
|
||||||
|
tr.R0 td.R0C6tI span { position: relative; }
|
||||||
|
tr.R0 td.R0C6tI span img { position: absolute; width: 100px; top: -5px; left: 5px;}
|
||||||
|
</STYLE>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" style="width:100%">
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<COL WIDTH="20%"/>
|
||||||
|
<tbody>
|
||||||
|
<tr class="R0">
|
||||||
|
<td class="R0C0">Подпись Исполнителя</td>
|
||||||
|
<td class="R0C6tI">
|
||||||
|
<SPAN>
|
||||||
|
<t
|
||||||
|
t-raw="o.stamp and o.mt_contractid.img(company.chief_id.facsimile) or ''"/>
|
||||||
|
</SPAN>
|
||||||
|
</td>
|
||||||
|
<td class="R0C0"></td>
|
||||||
|
<td class="R0C1">Подпись Заказчика</td>
|
||||||
|
<td class="R0C6tI"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-3 pull-right">
|
||||||
|
<small style="font-size:18px;">
|
||||||
|
<span>Страница</span>
|
||||||
|
<span class="page"/>
|
||||||
|
из
|
||||||
|
<span class="topage"/>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<record id="paperformat_a4" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">15</field>
|
||||||
|
<field name="margin_bottom">30</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">10</field>
|
||||||
|
<field name="dpi">90</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_report_contract_customer_order1" model="ir.actions.report">
|
||||||
|
<field name="name">Спецификация</field>
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">contract.report_contract_customer_order1</field>
|
||||||
|
<field name="report_file">contract.report_contract_customer_order1</field>
|
||||||
|
<field name="print_report_name">'Спецификация - %s' % (object.name)</field>
|
||||||
|
<field name="binding_model_id" ref="sale.model_sale_order" />
|
||||||
|
<field name="paperformat_id" ref="paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
6
l10n_ru_contract/security/ir.model.access.csv
Normal file
6
l10n_ru_contract/security/ir.model.access.csv
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_partner_contract_customer,access_partner_contract_customer,model_partner_contract_customer,,1,1,1,1
|
||||||
|
access_contract_profile,access_contract_profile,model_contract_profile,,1,1,1,1
|
||||||
|
access_contract_day,access_contract_day,model_contract_day,,1,1,1,1
|
||||||
|
access_contract_allowed_profiles,access_contract_allowed_profiles,model_contract_allowed_profiles,,1,1,1,1
|
||||||
|
access_partner_contract_customerline,access_partner_contract_customerline,model_contract_line,,1,1,1,1
|
|
358
l10n_ru_contract/views/contract_customer_view.xml
Normal file
358
l10n_ru_contract/views/contract_customer_view.xml
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<record id="contract_customer_form" model="ir.ui.view">
|
||||||
|
<field name="name">Договор</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Договор">
|
||||||
|
<header>
|
||||||
|
<field name="state" widget="statusbar" nolabel="1" clickable="True"/>
|
||||||
|
<button name="contract_action_confirm" string="На согласовании" type="object"
|
||||||
|
invisible="state!='draft'"/>
|
||||||
|
<button name="contract_action_confirm" class="btn-primary" string="Подтвердить" type="object"
|
||||||
|
invisible="state!='progress'"/>
|
||||||
|
<button name="contract_in_draft" string="В черновик" type="object"
|
||||||
|
invisible="state!='signed' and state!='progress'"/>
|
||||||
|
<button name="generate_contract_header" string="Генерация шапки документа"
|
||||||
|
type="object"/>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
<sheet>
|
||||||
|
<h1>
|
||||||
|
<label for="name"/>
|
||||||
|
<field name="name" readonly="state!='draft'"/>
|
||||||
|
</h1>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="date_start" readonly="state!='draft'"/>
|
||||||
|
<field name="date_end" readonly="state!='draft'"/>
|
||||||
|
<field name="type" readonly="state!='draft'"/>
|
||||||
|
<field name="profile_id" readonly="state!='draft'"/>
|
||||||
|
<field name="saleorder_id" areadonly="state!='draft'"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="partner_id" readonly="state!='draft'"/>
|
||||||
|
<field name="partner_type" readonly="state!='draft'"/>
|
||||||
|
<!-- <field name="name_print"/>-->
|
||||||
|
<field name="sec_partner_id" invisible="1"/>
|
||||||
|
<field name="company_id" readonly="state!='draft'"/>
|
||||||
|
<!--<field name="name_dirprint"/>-->
|
||||||
|
<field name="stamp"/>
|
||||||
|
<field name="signed"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="payment_term_id" invisible="1"/>
|
||||||
|
<field name="manager_id"/>
|
||||||
|
<field name="team_id"/>
|
||||||
|
|
||||||
|
<field name="accountant_id"/>
|
||||||
|
<field name="buh_code"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="is_template"/>
|
||||||
|
<field name="copy_from" domain="[('is_template','=',True)]"/>
|
||||||
|
<button name="copy_it" type="object" string="Скопировать пункты из шаблона"
|
||||||
|
invisible="copy_from==False"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
|
||||||
|
<field name="order_days_ids"/>
|
||||||
|
<field name="shipment_days_ids"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="time_to_delivery_from" class="oe_inline" widget="daterange"
|
||||||
|
title="Интервал" options="{'related_end_date': 'time_to_delivery_to'}"/>
|
||||||
|
<field name="time_to_delivery_to" class="oe_inline" widget="daterange"
|
||||||
|
title="Интервал" options="{'related_end_date': 'time_to_delivery_from'}"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page string="Пункты договора" name="contract_lines">
|
||||||
|
<field name="lines">
|
||||||
|
<tree editable="bottom">
|
||||||
|
<field name='sequence' widget='handle'/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="punct"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
<page string="Шапка договора" name="contract_header">
|
||||||
|
<field name="contract_header"/>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
|
||||||
|
|
||||||
|
</sheet>
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids" widget="mail_followers"/>
|
||||||
|
<field name="activity_ids" widget="mail_activity"/>
|
||||||
|
<field name="message_ids" widget="mail_thread"/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<record id="view_sale_calendar_inherit" model="ir.ui.view">
|
||||||
|
<field name="name">calendar.contract</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="inherit_id" ref="contract.contract_customer_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='team_id']" position="after">
|
||||||
|
<calendar string="Movings" date_start="time_to_delivery_from" date_stop="time_to_delivery_to">
|
||||||
|
<field name="time_to_delivery_from"/>
|
||||||
|
<field name="time_to_delivery_to"/>
|
||||||
|
</calendar>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>-->
|
||||||
|
|
||||||
|
<record id="contract_customer_tree" model="ir.ui.view">
|
||||||
|
<field name="name">Договор</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Договоры">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="date_start"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="contract_customer_search" model="ir.ui.view">
|
||||||
|
<field name="name">Поиск в договорах</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search>
|
||||||
|
<field name="partner_id" string="Номер или клиент"
|
||||||
|
filter_domain="['|',('partner_id','ilike',self),('name','ilike',self)]"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="company_id"/>
|
||||||
|
<field name="date_start"/>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_customer_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Договоры</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">partner.contract.customer</field>
|
||||||
|
<field name="view_mode">kanban,tree,form</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
<p class="oe_view_nocontent_create">
|
||||||
|
Нет созданных контрактов
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="contract_customer_action1" model="ir.actions.act_window">
|
||||||
|
<field name="name">Договоры</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">partner.contract.customer</field>
|
||||||
|
<field name="view_mode">kanban,tree,form</field>
|
||||||
|
<field name="domain">[('type', '=', 'supplier')]</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
|
||||||
|
<p class="oe_view_nocontent_create">
|
||||||
|
Нет созданных контрактов
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="contract_customer_action2" model="ir.actions.act_window">
|
||||||
|
<field name="name">Договоры</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">partner.contract.customer</field>
|
||||||
|
<field name="view_mode">kanban,tree,form</field>
|
||||||
|
<field name="domain">[('type', '=', 'customer')]</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
|
||||||
|
<p class="oe_view_nocontent_create">
|
||||||
|
Нет созданных контрактов
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="contract_allowed_profiles_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Настройка одновременно включенных договоров</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">contract.allowed.profiles</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_profile_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Виды договоров</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">contract.profile</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_profile_view" model="ir.ui.view">
|
||||||
|
<field name="name">view_profile_form</field>
|
||||||
|
<field name="model">contract.profile</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Профиль договора">
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="receivable_account_id" domain="[('account_type', '=', 'asset_receivable')]"/>
|
||||||
|
<field name="max_receivable_id"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="payable_account_id" domain="[('account_type', '=', 'liability_payable')]"/>
|
||||||
|
<field name="payment_term_id"/>
|
||||||
|
<field name="journal_id"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="view_partner_form" model="ir.ui.view">
|
||||||
|
<field name="name">view_partner_form</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//div[@name='button_box']" position="inside">
|
||||||
|
<button name="action_view_contract" type="object" class="oe_stat_button" icon="fa-pencil-square-o"
|
||||||
|
context="{'view':'contract_customer_action', 'search_default_open': 1}">
|
||||||
|
<field name="contract_count" widget="statinfo" string="Договоры"/>
|
||||||
|
</button>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='category_id']" position="after">
|
||||||
|
<field name="passport" invisible="is_company==True"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="view_saleorder_form" model="ir.ui.view">
|
||||||
|
<field name="name">view_saleorder_form</field>
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='partner_id']" position="after">
|
||||||
|
<field name="mt_contractid"
|
||||||
|
domain="[('partner_id','=',sec_partner_id),('company_id','=',company_id)]"
|
||||||
|
context="{'default_sec_partner_id':partner_id,'default_company_id':company_id,'default_type':'customer'}"/>
|
||||||
|
<field name="sec_partner_id" invisible="1"/>
|
||||||
|
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_purchaseorder_formcontr" model="ir.ui.view">
|
||||||
|
<field name="name">view_purchaseorder_formcontr</field>
|
||||||
|
<field name="model">purchase.order</field>
|
||||||
|
<field name="inherit_id" ref="purchase.purchase_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='origin']" position="after">
|
||||||
|
|
||||||
|
<field name="mt_contractid"
|
||||||
|
domain="[('partner_id','=',sec_partner_id),('company_id','=',company_id)]"
|
||||||
|
context="{'default_sec_partner_id':partner_id,'default_company_id':company_id,'default_type':'supplier'}"/>
|
||||||
|
<field name="sec_partner_id" invisible="1"/>
|
||||||
|
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_invoice_form" model="ir.ui.view">
|
||||||
|
<field name="name">view_invoice_form</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="inherit_id" ref="account.view_move_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='payment_reference']" position="after">
|
||||||
|
|
||||||
|
<field name="mt_contractid"
|
||||||
|
domain="[('partner_id','=',sec_partner_id),('company_id','=',company_id)]"
|
||||||
|
context="{'default_sec_partner_id':partner_id,'default_company_id':company_id,'default_type':'customer'}"/>
|
||||||
|
<field name="sec_partner_id" invisible="1"/>
|
||||||
|
<field name="sf_number"/>
|
||||||
|
<field name="osnovanie" invisible="1"/>
|
||||||
|
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="contract_customer_kanban" model="ir.ui.view">
|
||||||
|
<field name="name">Договор</field>
|
||||||
|
<field name="model">partner.contract.customer</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<kanban default_group_by="state">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="profile_id"/>
|
||||||
|
<field name="company_id"/>
|
||||||
|
<field name="type"/>
|
||||||
|
<templates>
|
||||||
|
<t t-name="kanban-box">
|
||||||
|
<div t-attf-class="oe_kanban_global_click">
|
||||||
|
<div class="oe_kanban_content">
|
||||||
|
<div>
|
||||||
|
<strong class="o_kanban_record_title">Номер: <b><field
|
||||||
|
name="name"/></b></strong>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
Контрагент: <b><field name="partner_id"/></b> <br/>
|
||||||
|
Тип: <b><field name="type"/></b> <br/>
|
||||||
|
Вид договора: <b><field name="profile_id"/></b>
|
||||||
|
</div>
|
||||||
|
<div class="o_kanban_record_bottom">
|
||||||
|
Наша компания: <b><field name="company_id"/></b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</templates>
|
||||||
|
</kanban>
|
||||||
|
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<menuitem name="Договоры" id="contract.main" parent="sale.sale_menu_root"/>
|
||||||
|
<menuitem name="Договоры" id="contract.contracts" parent="contract.main"
|
||||||
|
action="contract.contract_customer_action2"/>
|
||||||
|
|
||||||
|
<menuitem name="Договоры" id="contract.main1" parent="purchase.menu_purchase_root"/>
|
||||||
|
<menuitem name="Договоры" id="contract.contracts1" parent="contract.main1"
|
||||||
|
action="contract.contract_customer_action1"/>
|
||||||
|
|
||||||
|
<menuitem name="Настройка" id="separator" parent="contract.main"/>
|
||||||
|
<menuitem name="Виды договоров" id="contract_profiles" parent="separator"
|
||||||
|
action="contract.contract_profile_action"/>
|
||||||
|
<menuitem name="Включенные договора" id="contract_profile_setting" parent="separator"
|
||||||
|
action="contract.contract_allowed_profiles_action"/>
|
||||||
|
|
||||||
|
|
||||||
|
<menuitem name="Настройка" id="separator1" parent="contract.main1"/>
|
||||||
|
<menuitem name="Виды договоров" id="contract_profiles1" parent="separator1"
|
||||||
|
action="contract.contract_profile_action"/>
|
||||||
|
<menuitem name="Включенные договора" id="contract_profile_setting1" parent="separator1"
|
||||||
|
action="contract.contract_allowed_profiles_action"/>
|
||||||
|
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
5
l10n_ru_doc/__init__.py
Normal file
5
l10n_ru_doc/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
from . import report_helper
|
||||||
|
from . import report
|
51
l10n_ru_doc/__manifest__.py
Normal file
51
l10n_ru_doc/__manifest__.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Russia - Documents",
|
||||||
|
|
||||||
|
'summary': "Первичные документы",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
The module for print documents in accordance laws of Russia.
|
||||||
|
============================================================
|
||||||
|
Возможности:
|
||||||
|
* Товарная накладная (ТОРГ-12)
|
||||||
|
* Счет на оплату
|
||||||
|
* Счет-фактура
|
||||||
|
* Акт выполненных работ
|
||||||
|
* Вывод подписей и печати
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "CodUP and MKLab",
|
||||||
|
'website': "https://inf-centre.ru",
|
||||||
|
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'category': 'Localization',
|
||||||
|
'version': '17.0.2024.06.28',
|
||||||
|
|
||||||
|
'depends': ['base','sale','account','sale_stock','uom'],
|
||||||
|
|
||||||
|
'external_dependencies': {'python' : ['pytils']},
|
||||||
|
|
||||||
|
'data': [
|
||||||
|
'views/account_invoice_view.xml',
|
||||||
|
'views/res_partner_view.xml',
|
||||||
|
'views/res_company_view.xml',
|
||||||
|
'views/res_users_view.xml',
|
||||||
|
'views/res_bank_view.xml',
|
||||||
|
'views/uom.xml',
|
||||||
|
'views/tax.xml',
|
||||||
|
'views/product.xml',
|
||||||
|
'views/l10n_ru_doc_data.xml',
|
||||||
|
'report/l10n_ru_doc_report.xml',
|
||||||
|
'report/report_order.xml',
|
||||||
|
'report/report_invoice.xml',
|
||||||
|
'report/report_bill.xml',
|
||||||
|
'report/report_act.xml',
|
||||||
|
'report/report_upd.xml',
|
||||||
|
'report/report_updn.xml',
|
||||||
|
],
|
||||||
|
|
||||||
|
'demo': [
|
||||||
|
'demo/l10n_ru_doc_demo.xml',
|
||||||
|
],
|
||||||
|
}
|
BIN
l10n_ru_doc/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/__pycache__/report_helper.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/__pycache__/report_helper.cpython-310.pyc
Normal file
Binary file not shown.
63
l10n_ru_doc/demo/l10n_ru_doc_demo.xml
Normal file
63
l10n_ru_doc/demo/l10n_ru_doc_demo.xml
Normal file
File diff suppressed because one or more lines are too long
116
l10n_ru_doc/i18n/ru.po
Normal file
116
l10n_ru_doc/i18n/ru.po
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * l10n_ru_doc
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 13.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2020-08-19 09:27+0000\n"
|
||||||
|
"PO-Revision-Date: 2020-08-19 09:27+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_act
|
||||||
|
msgid "Act"
|
||||||
|
msgstr "Акт об оказании услуг"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_bill
|
||||||
|
msgid "Bill"
|
||||||
|
msgstr "Товарная накладная (ТОРГ-12)"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_facsimile
|
||||||
|
#: model:ir.model.fields,help:l10n_ru_doc.field_res_users__print_facsimile
|
||||||
|
msgid "Check this for adding Facsimiles of responsible persons to documents."
|
||||||
|
msgstr "Отметьте, для вставки подписей ответственных лиц в документы."
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_stamp
|
||||||
|
msgid "Check this for adding Stamp of company to documents."
|
||||||
|
msgstr "Отметьте, для вставки печати организации в документы."
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__chief_id
|
||||||
|
msgid "Chief"
|
||||||
|
msgstr "Руководитель организации"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_account_setup_bank_manual_config__bank_corr_acc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_bank__corr_acc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner_bank__bank_corr_acc
|
||||||
|
msgid "Corresponding account"
|
||||||
|
msgstr "Корр. счет"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model_terms:ir.ui.view,arch_db:l10n_ru_doc.view_company_ru_form
|
||||||
|
msgid "Documents"
|
||||||
|
msgstr "Документы"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__facsimile
|
||||||
|
msgid "Facsimile"
|
||||||
|
msgstr "Подпись"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__inn
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__inn
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__inn
|
||||||
|
msgid "INN"
|
||||||
|
msgstr "ИНН"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__kpp
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__kpp
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__kpp
|
||||||
|
msgid "KPP"
|
||||||
|
msgstr "КПП"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__okpo
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_partner__okpo
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__okpo
|
||||||
|
msgid "OKPO"
|
||||||
|
msgstr "ОКПО"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_anywhere
|
||||||
|
msgid "Print Anywhere"
|
||||||
|
msgstr "Документы"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_facsimile
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_users__print_facsimile
|
||||||
|
msgid "Print Facsimile"
|
||||||
|
msgstr "Выводить подписи"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__print_stamp
|
||||||
|
msgid "Print Stamp"
|
||||||
|
msgstr "Выводить печать"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model_terms:ir.ui.view,arch_db:l10n_ru_doc.view_company_ru_form
|
||||||
|
msgid "Responsible Persons"
|
||||||
|
msgstr "Ответственные лица"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,field_description:l10n_ru_doc.field_res_company__stamp
|
||||||
|
msgid "Stamp"
|
||||||
|
msgstr "Печать"
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.model.fields,help:l10n_ru_doc.field_res_company__print_anywhere
|
||||||
|
msgid "Uncheck this, if you want add Facsimile and Stamp only in email."
|
||||||
|
msgstr "Снимите отметку, если хотите добавлять подписи и печать только в email."
|
||||||
|
|
||||||
|
#. module: l10n_ru_doc
|
||||||
|
#: model:ir.actions.report,name:l10n_ru_doc.report_account_invoice_upd
|
||||||
|
msgid "Upd"
|
||||||
|
msgstr "Универсальный платежный документ (УПД)"
|
12
l10n_ru_doc/models/__init__.py
Normal file
12
l10n_ru_doc/models/__init__.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import res_partner
|
||||||
|
from . import res_company
|
||||||
|
from . import res_users
|
||||||
|
from . import res_bank
|
||||||
|
from . import account_invoice
|
||||||
|
from . import account_move_line
|
||||||
|
from . import sale
|
||||||
|
from . import uom
|
||||||
|
from . import tax
|
||||||
|
from . import product
|
BIN
l10n_ru_doc/models/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/account_invoice.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/account_invoice.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/account_move_line.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/account_move_line.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/product.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/product.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/res_bank.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/res_bank.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/res_company.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/res_company.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/res_partner.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/res_partner.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/res_users.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/res_users.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/sale.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/sale.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/tax.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/tax.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/models/__pycache__/uom.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/models/__pycache__/uom.cpython-310.pyc
Normal file
Binary file not shown.
144
l10n_ru_doc/models/account_invoice.py
Normal file
144
l10n_ru_doc/models/account_invoice.py
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
class AccountInvoice(models.Model):
|
||||||
|
_inherit = 'account.move'
|
||||||
|
kladov=fields.Many2one('res.users', string='Ответственный за передачу товаров/услуг')
|
||||||
|
gruzopol=fields.Many2one('res.partner', string='Грузополучатель')
|
||||||
|
gruzootpr=fields.Many2one('res.partner', string='Грузоотправитель')
|
||||||
|
transport=fields.Char('Данные о транспортировке и грузе')
|
||||||
|
osnovanie=fields.Char('Основание')
|
||||||
|
payment_text=fields.Char('Текст для платежек в УПД', compute='_compute_get_txtpayment')
|
||||||
|
payment_num=fields.Char('Номер платежки в УПД', compute='_compute_get_txtpayment')
|
||||||
|
payment_date = fields.Char('Дата платежки в УПД', compute='_compute_get_txtpayment')
|
||||||
|
only_service = fields.Boolean('Только услуги', compute='_compute_get_check_service')
|
||||||
|
|
||||||
|
@api.depends('invoice_line_ids')
|
||||||
|
def _compute_get_check_service(self):
|
||||||
|
for s in self:
|
||||||
|
s.only_service = all((line.product_id.type=='service') for line in s.invoice_line_ids)
|
||||||
|
|
||||||
|
def _compute_get_txtpayment(self):
|
||||||
|
for s in self:
|
||||||
|
payments = s._get_reconciled_payments()
|
||||||
|
payment_text = ''
|
||||||
|
|
||||||
|
for payment in payments:
|
||||||
|
if payment.date:
|
||||||
|
payment_text += payment.name + ' от ' + \
|
||||||
|
fields.Datetime.from_string(payment.date).strftime("%d.%m.%Y")
|
||||||
|
if payments[-1]!=payment:
|
||||||
|
payment_text += ', '
|
||||||
|
if payments:
|
||||||
|
s.payment_num = payments[0].name
|
||||||
|
s.payment_date = fields.Datetime.from_string(payments[0].date).strftime("%d.%m.%Y")
|
||||||
|
else:
|
||||||
|
s.payment_num = ''
|
||||||
|
s.payment_text = ''
|
||||||
|
s.payment_date = ''
|
||||||
|
|
||||||
|
s.payment_text = payment_text
|
||||||
|
|
||||||
|
def action_bill_sent(self):
|
||||||
|
assert len(self) == 1, 'This option should only be used for a single id at a time.'
|
||||||
|
template = self.env.ref('account.email_template_edi_invoice', False)
|
||||||
|
compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
|
||||||
|
ctx = {
|
||||||
|
'default_model': 'account.move',
|
||||||
|
'default_res_id': self.id,
|
||||||
|
'default_use_template': bool(template),
|
||||||
|
'default_template_id': template.id,
|
||||||
|
'default_composition_mode': 'comment',
|
||||||
|
'mark_invoice_as_sent': True,
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'name': 'Compose Email',
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'view_type': 'form',
|
||||||
|
'view_mode': 'form',
|
||||||
|
'res_model': 'mail.compose.message',
|
||||||
|
'views': [(compose_form.id, 'form')],
|
||||||
|
'view_id': compose_form.id,
|
||||||
|
'target': 'new',
|
||||||
|
'context': ctx,
|
||||||
|
}
|
||||||
|
|
||||||
|
def bill_print(self):
|
||||||
|
assert len(self) == 1, 'This option should only be used for a single id at a time.'
|
||||||
|
return self.env['report'].get_action(self, 'l10n_ru_doc.report_upd')
|
||||||
|
|
||||||
|
def get_delivery_doc_name(self):
|
||||||
|
for s in self:
|
||||||
|
pickings = []
|
||||||
|
pickings_list = '0'
|
||||||
|
orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)])
|
||||||
|
for o in orders:
|
||||||
|
if o.picking_ids:
|
||||||
|
for p in o.picking_ids:
|
||||||
|
pickings.append(p.name)
|
||||||
|
if len(pickings)>0:
|
||||||
|
pickings_list = ';'.join(pickings)
|
||||||
|
if pickings_list != '0':
|
||||||
|
return pickings_list
|
||||||
|
if s.name.find('/') > -1:
|
||||||
|
return 'УПД № ' + s.name[len(s.name) - 4:]
|
||||||
|
return 'УПД № ' + s.name
|
||||||
|
|
||||||
|
def get_delivery_doc_date(self):
|
||||||
|
for s in self:
|
||||||
|
pickings = []
|
||||||
|
pickings_list = '0'
|
||||||
|
orders = self.env['sale.order'].sudo().search([('name','=',s.invoice_origin)])
|
||||||
|
for o in orders:
|
||||||
|
if o.picking_ids:
|
||||||
|
for p in o.picking_ids:
|
||||||
|
pickings.append(datetime.strftime(p.date, '%d.%m.%Y'))
|
||||||
|
if len(pickings)>0:
|
||||||
|
pickings_list = ';'.join(pickings)
|
||||||
|
if pickings_list != '0':
|
||||||
|
return pickings_list
|
||||||
|
return datetime.strftime(s.date, '%d.%m.%Y')
|
||||||
|
|
||||||
|
def get_function_partner(self, partner=False, type='director'):
|
||||||
|
if partner:
|
||||||
|
if partner.parent_id:
|
||||||
|
partner = partner.parent_id
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||||||
|
('type', '=', type)], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.function:
|
||||||
|
return director.function
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def get_name_partner(self, partner=False, type='director'):
|
||||||
|
if partner:
|
||||||
|
if partner.parent_id:
|
||||||
|
partner = partner.parent_id
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||||||
|
('type', '=', type)], limit=1)
|
||||||
|
if director:
|
||||||
|
if director.name:
|
||||||
|
return director.name
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def get_facsimile_partner(self, partner=False, type='director'):
|
||||||
|
if partner:
|
||||||
|
if partner.parent_id:
|
||||||
|
partner = partner.parent_id
|
||||||
|
director = self.env['res.partner'].search([('parent_id', '=', partner.id),
|
||||||
|
('type', '=', type)],
|
||||||
|
limit=1)
|
||||||
|
if director:
|
||||||
|
if director.facsimile:
|
||||||
|
return director.facsimile
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def get_stamp_partner(self, partner=False):
|
||||||
|
if partner:
|
||||||
|
if partner.parent_id:
|
||||||
|
partner = partner.parent_id
|
||||||
|
if partner.stamp:
|
||||||
|
return partner.stamp
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
29
l10n_ru_doc/models/account_move_line.py
Normal file
29
l10n_ru_doc/models/account_move_line.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
class AccountMoveLine(models.Model):
|
||||||
|
_inherit = 'account.move.line'
|
||||||
|
|
||||||
|
price_total_pf = fields.Monetary(
|
||||||
|
string='TotalPF',
|
||||||
|
compute='_compute_totals',
|
||||||
|
currency_field='currency_id',
|
||||||
|
)
|
||||||
|
|
||||||
|
@api.depends('quantity', 'discount', 'price_unit', 'tax_ids', 'currency_id')
|
||||||
|
def _compute_totals(self):
|
||||||
|
super(AccountMoveLine,self)._compute_totals()
|
||||||
|
for line in self:
|
||||||
|
line_discount_price_unit = line.price_unit * (1 - (line.discount / 100.0))
|
||||||
|
if line.tax_ids.filtered(lambda tax: tax.invisiblePF == False):
|
||||||
|
taxes_res = line.tax_ids.filtered(lambda tax: tax.invisiblePF == False).compute_all(
|
||||||
|
line_discount_price_unit,
|
||||||
|
quantity=line.quantity,
|
||||||
|
currency=line.currency_id,
|
||||||
|
product=line.product_id,
|
||||||
|
partner=line.partner_id,
|
||||||
|
is_refund=line.is_refund,
|
||||||
|
)
|
||||||
|
line.price_total_pf = taxes_res['total_included']
|
||||||
|
else:
|
||||||
|
line.price_total_pf = line.price_total
|
5
l10n_ru_doc/models/product.py
Normal file
5
l10n_ru_doc/models/product.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
class ProductTnved(models.Model):
|
||||||
|
_inherit = 'product.product'
|
||||||
|
kod_tnved = fields.Char('Код ТНВЭД')
|
19
l10n_ru_doc/models/res_bank.py
Normal file
19
l10n_ru_doc/models/res_bank.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
class Bank(models.Model):
|
||||||
|
_inherit = 'res.bank'
|
||||||
|
|
||||||
|
corr_acc = fields.Char('Corresponding account', size=64)
|
||||||
|
|
||||||
|
|
||||||
|
class ResPartnerBank(models.Model):
|
||||||
|
_inherit = 'res.partner.bank'
|
||||||
|
|
||||||
|
bank_corr_acc = fields.Char('Corresponding account', size=64)
|
||||||
|
|
||||||
|
@api.onchange('bank_id')
|
||||||
|
def onchange_bank_id(self):
|
||||||
|
for s in self:
|
||||||
|
s.bank_name = s.bank_id.name
|
||||||
|
s.bank_bic = s.bank_id.bic
|
||||||
|
s.bank_corr_acc = s.bank_id.corr_acc
|
18
l10n_ru_doc/models/res_company.py
Normal file
18
l10n_ru_doc/models/res_company.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
class Company(models.Model):
|
||||||
|
_inherit = 'res.company'
|
||||||
|
|
||||||
|
inn = fields.Char(related='partner_id.inn', readonly=False)
|
||||||
|
kpp = fields.Char(related='partner_id.kpp', readonly=False)
|
||||||
|
okpo = fields.Char(related='partner_id.okpo', readonly=False)
|
||||||
|
chief_id = fields.Many2one('res.users', 'Chief')
|
||||||
|
accountant_id = fields.Many2one('res.users', 'General Accountant')
|
||||||
|
print_facsimile = fields.Boolean(string='Print Facsimile',
|
||||||
|
help="Check this for adding Facsimiles of responsible persons to documents.")
|
||||||
|
print_stamp = fields.Boolean(string='Print Stamp',
|
||||||
|
help="Check this for adding Stamp of company to documents.")
|
||||||
|
stamp = fields.Binary("Stamp")
|
||||||
|
print_anywhere = fields.Boolean(string='Print Anywhere',
|
||||||
|
help="Uncheck this, if you want add Facsimile and Stamp only in email.",
|
||||||
|
default=True)
|
11
l10n_ru_doc/models/res_partner.py
Normal file
11
l10n_ru_doc/models/res_partner.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
class ResPartner(models.Model):
|
||||||
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
|
inn = fields.Char('INN', related='vat')
|
||||||
|
kpp = fields.Char('KPP', size=9)
|
||||||
|
okpo = fields.Char('OKPO', size=14)
|
||||||
|
ogrn = fields.Char('ОГРН')
|
||||||
|
type = fields.Selection(selection_add=[('director', 'Директор'), ('accountant', 'Бухгалтер')])
|
||||||
|
facsimile = fields.Binary("Подпись")
|
||||||
|
stamp = fields.Binary("Печать")
|
7
l10n_ru_doc/models/res_users.py
Normal file
7
l10n_ru_doc/models/res_users.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
class Users(models.Model):
|
||||||
|
_inherit = 'res.users'
|
||||||
|
|
||||||
|
print_facsimile = fields.Boolean(related='company_id.print_facsimile')
|
||||||
|
facsimile = fields.Binary()
|
8
l10n_ru_doc/models/sale.py
Normal file
8
l10n_ru_doc/models/sale.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from odoo import models
|
||||||
|
|
||||||
|
class SaleOrder(models.Model):
|
||||||
|
_inherit = 'sale.order'
|
||||||
|
def print_quotation(self):
|
||||||
|
self.filtered(lambda s: s.state == 'draft').write({'state': 'sent'})
|
||||||
|
return self.env['report'].get_action(self, 'l10n_ru_doc.report_order')
|
||||||
|
|
6
l10n_ru_doc/models/tax.py
Normal file
6
l10n_ru_doc/models/tax.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
class TaxInherit(models.Model):
|
||||||
|
_inherit = 'account.tax'
|
||||||
|
|
||||||
|
invisiblePF = fields.Boolean('Не видно в ПФ')
|
4
l10n_ru_doc/models/uom.py
Normal file
4
l10n_ru_doc/models/uom.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from odoo import fields, models
|
||||||
|
class UomInherit(models.Model):
|
||||||
|
_inherit = 'uom.uom'
|
||||||
|
kod = fields.Char('Код единицы измерения')
|
5
l10n_ru_doc/report/__init__.py
Normal file
5
l10n_ru_doc/report/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from . import report_order
|
||||||
|
from . import report_invoice
|
||||||
|
from . import report_bill
|
||||||
|
from . import report_act
|
||||||
|
from . import report_upd
|
BIN
l10n_ru_doc/report/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/report/__pycache__/report_act.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/report_act.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/report/__pycache__/report_bill.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/report_bill.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/report/__pycache__/report_invoice.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/report_invoice.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/report/__pycache__/report_order.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/report_order.cpython-310.pyc
Normal file
Binary file not shown.
BIN
l10n_ru_doc/report/__pycache__/report_upd.cpython-310.pyc
Normal file
BIN
l10n_ru_doc/report/__pycache__/report_upd.cpython-310.pyc
Normal file
Binary file not shown.
107
l10n_ru_doc/report/l10n_ru_doc_report.xml
Normal file
107
l10n_ru_doc/report/l10n_ru_doc_report.xml
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<record id="paperformat_a4" model="report.paperformat">
|
||||||
|
<field name="name">A4</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Portrait</field>
|
||||||
|
<field name="margin_top">7</field>
|
||||||
|
<field name="margin_bottom">7</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">35</field>
|
||||||
|
<field name="dpi">75</field>
|
||||||
|
</record>
|
||||||
|
<record id="paperformat_a4l" model="report.paperformat">
|
||||||
|
<field name="name">A4 Landscape</field>
|
||||||
|
<field name="default" eval="True"/>
|
||||||
|
<field name="format">A4</field>
|
||||||
|
<field name="page_height">0</field>
|
||||||
|
<field name="page_width">0</field>
|
||||||
|
<field name="orientation">Landscape</field>
|
||||||
|
<field name="margin_top">7</field>
|
||||||
|
<field name="margin_bottom">7</field>
|
||||||
|
<field name="margin_left">7</field>
|
||||||
|
<field name="margin_right">7</field>
|
||||||
|
<field name="header_line" eval="False"/>
|
||||||
|
<field name="header_spacing">75</field>
|
||||||
|
<field name="dpi">60</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="l10n_ru_doc.action_report_saleorder_new" model="ir.actions.report">
|
||||||
|
<field name="name">Счет по форме 1С</field>
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_order</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_order</field>
|
||||||
|
<field name="print_report_name">'Счет - %s ' % (object.name+' '+(object.partner_id.parent_id.name if object.partner_id.parent_id else object.partner_id.name))</field>
|
||||||
|
<field name="binding_model_id" ref="sale.model_sale_order" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="l10n_ru_doc.account_invoices_new" model="ir.actions.report">
|
||||||
|
<field name="name">Счет-фактура</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_invoice</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_invoice</field>
|
||||||
|
<field name="print_report_name">'Счет-фактура - %s ' % (object.name+' '+(object.partner_id.parent_id.name if object.partner_id.parent_id else object.partner_id.name))</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4l" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="l10n_ru_doc.report_account_invoice_bill_new" model="ir.actions.report">
|
||||||
|
<field name="name">Товарная накладная (ТОРГ-12)</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_bill</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_bill</field>
|
||||||
|
<field name="print_report_name">'Товарная накладная - %s ' % (object.name+' '+(object.partner_id.parent_id.name if object.partner_id.parent_id else object.partner_id.name))</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4l" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="l10n_ru_doc.report_account_invoice_act_new" model="ir.actions.report">
|
||||||
|
<field name="name">Акт выполненных работ</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_act</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_act</field>
|
||||||
|
<field name="print_report_name">'Акт - %s ' % (object.name+' '+(object.partner_id.parent_id.name if object.partner_id.parent_id else object.partner_id.name))</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="report_account_invoice_upd_new" model="ir.actions.report">
|
||||||
|
<field name="name">Универсальный передаточный документ(УПД)</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_upd</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_upd</field>
|
||||||
|
<field name="print_report_name">'УПД'</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4l" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="report_account_invoice_updn" model="ir.actions.report">
|
||||||
|
<field name="name">УПД без печатей</field>
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="report_type">qweb-pdf</field>
|
||||||
|
<field name="report_name">l10n_ru_doc.report_updn</field>
|
||||||
|
<field name="report_file">l10n_ru_doc.report_updn</field>
|
||||||
|
<field name="print_report_name">'УПД без печатей'</field>
|
||||||
|
<field name="binding_model_id" ref="account.model_account_move" />
|
||||||
|
<field name="paperformat_id" ref="l10n_ru_doc.paperformat_a4l" />
|
||||||
|
<field name="binding_type">report</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
16
l10n_ru_doc/report/report_act.py
Normal file
16
l10n_ru_doc/report/report_act.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import models
|
||||||
|
from odoo.addons.l10n_ru_doc.report_helper import QWebHelper
|
||||||
|
|
||||||
|
class RuActReport(models.AbstractModel):
|
||||||
|
_name = 'report.l10n_ru_doc.report_act'
|
||||||
|
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['account.move'].browse(docids)
|
||||||
|
return {
|
||||||
|
'helper': QWebHelper(),
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'account.move',
|
||||||
|
'docs': docs
|
||||||
|
}
|
203
l10n_ru_doc/report/report_act.xml
Normal file
203
l10n_ru_doc/report/report_act.xml
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<template id="report_act">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<!-- Multicompany -->
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"></t>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"></t>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"></t>
|
||||||
|
|
||||||
|
<div class="page">
|
||||||
|
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body { background: #ffffff; margin: 0; font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
tr.R0{ height: 15px; }
|
||||||
|
tr.R0 td.R11C1{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: medium; border-left: #000000 2px solid; border-top: #000000 2px solid; }
|
||||||
|
tr.R0 td.R11C29{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R0 td.R11C3{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 2px solid; }
|
||||||
|
tr.R0 td.R14C1{ text-align: center; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; }
|
||||||
|
tr.R0 td.R14C20{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; }
|
||||||
|
tr.R0 td.R14C23{ vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; }
|
||||||
|
tr.R0 td.R14C29{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R0 td.R14C3{ vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; }
|
||||||
|
tr.R0 td.R31C1{ font-family: Arial; font-size: 9pt; font-style: normal; }
|
||||||
|
tr.R17{ height: 20px; }
|
||||||
|
tr.R2{ height: 1px; }
|
||||||
|
tr.R3{ height: 28px; }
|
||||||
|
tr.R3 td.R3C1{ font-family: Arial; font-size: 14pt; font-style: normal; font-weight: bold; vertical-align: medium; border-bottom: #000000 2px solid; }
|
||||||
|
tr.R32{ height: 19px; }
|
||||||
|
tr.R37{ height: 25px; }
|
||||||
|
tr.R37 td.R37C1{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R37 td.R37C17{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R37 td.R37C4{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: right; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R37 td.R37C5, tr.R37 td.R37C5I, tr.R37 td.R37C5S{ font-family: Arial; font-size: 7pt; font-style: normal; text-align: right; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R37 td.R37C5I,tr.R37 td.R37C5S { overflow: visible; }
|
||||||
|
tr.R37 td.R37C5I span,tr.R37 td.R37C5S span { position: relative; }
|
||||||
|
tr.R37 td.R37C5I span img { position: absolute; width: 100px; top: -30px; left: -120px;}
|
||||||
|
tr.R37 td.R37C5S span img { position: absolute; width: 140px; top: -60px; left: -60px; }
|
||||||
|
tr.R5{ height: 17px; }
|
||||||
|
tr.R5 td.R22C28{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: right; vertical-align: top; }
|
||||||
|
tr.R5 td.R35C1{ font-family: Arial; font-size: 10pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R5 td.R35C17{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R5 td.R35C20{ font-family: Arial; font-size: 10pt; font-style: normal; font-weight: bold; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R36C1{ }
|
||||||
|
tr.R5 td.R36C20{ border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R38C1{ text-align: center; border-top: #000000 1px solid;}
|
||||||
|
tr.R5 td.R5C1{ font-family: Arial; font-size: 9pt; font-style: normal; vertical-align: medium; }
|
||||||
|
tr.R5 td.R5C5{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; vertical-align: top; }
|
||||||
|
tr.R6{ height: 9px; }
|
||||||
|
tr.R6 td.R21C1{ border-top: #000000 2px solid; }
|
||||||
|
tr.R6 td.R33C1{ border-bottom: #000000 2px solid; }
|
||||||
|
table {table-layout: fixed; padding: 0px; padding-left: 2px; vertical-align:bottom; border-collapse:collapse;width: 100%; font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
td { padding: 0px; padding-left: 2px; overflow:hidden; }
|
||||||
|
.cu_wspace { white-space:nowrap; }
|
||||||
|
.cu_space1 { width:100%;height:1px;overflow:hidden; }
|
||||||
|
.cu_space28 { width:100%;height:28px;overflow:hidden; }
|
||||||
|
.cu_space9 { width:100%;height:9px;overflow:hidden; }
|
||||||
|
.cu_space29 { width:100%;height:29px;overflow:hidden; }
|
||||||
|
.cu_space34 { width:100%;height:34px;overflow:hidden; }
|
||||||
|
.cu_space20 { width:100%;height:20px;overflow:hidden; }
|
||||||
|
.cu_space19 { width:100%;height:19px;overflow:hidden; }
|
||||||
|
.cu_space33 { width:100%;height:33px;overflow:hidden; }
|
||||||
|
.cu_space25 { width:100%;height:25px;overflow:hidden; }
|
||||||
|
tbody, table, tr, td, th{border: none;}
|
||||||
|
</STYLE>
|
||||||
|
|
||||||
|
<!-- start header -->
|
||||||
|
<TABLE CELLSPACING="0">
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<COL WIDTH="40%"/>
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<COL WIDTH="10%"/>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R3C1" COLSPAN="7"><DIV class="cu_space28"><SPAN class="cu_wspace">Акт № <t t-esc="helper.numer(o.name)"/> от <span t-field="o.invoice_date"/></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R5C1" COLSPAN="2"><SPAN class="cu_wspace">Исполнитель:</SPAN></TD>
|
||||||
|
<TD CLASS="R5C5" COLSPAN="5"><t t-esc="helper.full_representation(company.partner_id)"/></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R5C1" COLSPAN="2"><SPAN class="cu_wspace">Заказчик:</SPAN></TD>
|
||||||
|
<TD CLASS="R5C5" COLSPAN="5"><t t-esc="helper.full_representation(o.partner_id.parent_id or o.partner_id)"/></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R11C1"><DIV class="cu_space29"><SPAN class="cu_wspace">№</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R11C3" COLSPAN="2"><DIV class="cu_space29"><SPAN class="cu_wspace">Наименование<![CDATA[ ]]>работ,<![CDATA[ ]]>услуг</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R11C3"><DIV class="cu_space29"><SPAN class="cu_wspace">Кол-во</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R11C3"><DIV class="cu_space29"><SPAN class="cu_wspace">Ед.</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R11C3"><DIV class="cu_space29"><SPAN class="cu_wspace">Цена</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R11C29"><DIV class="cu_space29"><SPAN class="cu_wspace">Сумма</SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0" t-foreach="o.invoice_line_ids" t-as="line">
|
||||||
|
<TD CLASS="R14C1"><SPAN class="cu_wspace"><t t-esc="line_index+1"/></SPAN></TD>
|
||||||
|
<TD CLASS="R14C3" COLSPAN="2"><t t-esc="line.product_id.name or ''"/></TD>
|
||||||
|
<TD CLASS="R14C20"><SPAN class="cu_wspace"><t t-esc="line.quantity or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R14C23"><SPAN class="cu_wspace"><t t-esc="line.product_uom_id.name or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R14C20"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(line.price_subtotal/line.quantity)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R14C29"><SPAN class="cu_wspace"><t t-esc="line.price_subtotal or ''"/></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R6">
|
||||||
|
<TD COLSPAN="7" CLASS="R21C1"><DIV class="cu_space9"><![CDATA[ ]]></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R22C28" COLSPAN="6"><SPAN class="cu_wspace">Итого:</SPAN></TD>
|
||||||
|
<TD CLASS="R22C28"><SPAN class="cu_wspace"><t t-esc="o.amount_untaxed or '0,00'"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><DIV class="cu_space9"><![CDATA[ ]]></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R22C28" COLSPAN="6"><SPAN class="cu_wspace">Сумма НДС: <!-- TO DO: [НДС]: --></SPAN></TD>
|
||||||
|
<TD CLASS="R22C28"><SPAN class="cu_wspace"><t t-esc="o.amount_tax or '0,00'"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD COLSPAN="7"><SPAN class="cu_wspace">Всего оказано услуг <t t-esc="o.invoice_line_ids and len(o.invoice_line_ids) or 0"/>, на сумму <t t-esc="o.amount_total or '0,00'"/> руб.</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R5C5" COLSPAN="7"><t t-esc="helper.rubles(o.amount_total).capitalize()"/></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<!-- end total -->
|
||||||
|
<!-- start footer -->
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R31C1" COLSPAN="7"><DIV class="cu_space33">Вышеперечисленные услуги выполнены полностью и в срок. Заказчик претензий по объему, качеству и срокам оказания услуг не имеет.</DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R32">
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R6">
|
||||||
|
<TD CLASS="R33C1" COLSPAN="7"><DIV class="cu_space9"><![CDATA[ ]]></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R35C1" COLSPAN="2"><SPAN class="cu_wspace">ИСПОЛНИТЕЛЬ</SPAN></TD>
|
||||||
|
<TD CLASS="R35C17"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R35C20" COLSPAN="4"><SPAN class="cu_wspace">ЗАКАЗЧИК</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R36C1" COLSPAN="3">Директор <t t-esc="company.name or ''"/><!-- TO DO: ДолжностьИНазваниеОрганизации --></TD>
|
||||||
|
<TD CLASS="R35C17" COLSPAN="3"><SPAN></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN="7"><![CDATA[ ]]></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R37">
|
||||||
|
<TD CLASS="R37C5S"><SPAN><t t-raw="company.print_stamp and (company.print_anywhere or context.get('mark_invoice_as_sent', False)) and helper.img(company.stamp) or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R37C5I"><SPAN><t t-raw="company.print_facsimile and (company.print_anywhere or context.get('mark_invoice_as_sent', False)) and helper.img(company.chief_id.facsimile) or ''"/></SPAN></TD>
|
||||||
|
<TD><DIV class="cu_space25" COLSPAN="5"><SPAN></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R38C1" COLSPAN="2"><t t-esc="helper.initials(company.chief_id.name)"/></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R38C1" COLSPAN="2"><SPAN></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
14
l10n_ru_doc/report/report_bill.py
Normal file
14
l10n_ru_doc/report/report_bill.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from odoo import models
|
||||||
|
from odoo.addons.l10n_ru_doc.report_helper import QWebHelper
|
||||||
|
|
||||||
|
class RuBillReport(models.AbstractModel):
|
||||||
|
_name = 'report.l10n_ru_doc.report_bill'
|
||||||
|
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['account.move'].browse(docids)
|
||||||
|
return {
|
||||||
|
'helper': QWebHelper(),
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'account.move',
|
||||||
|
'docs': docs
|
||||||
|
}
|
758
l10n_ru_doc/report/report_bill.xml
Normal file
758
l10n_ru_doc/report/report_bill.xml
Normal file
@ -0,0 +1,758 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<template id="report_bill">
|
||||||
|
<t t-call="web.basic_layout">
|
||||||
|
<t t-foreach="docs" t-as="o">
|
||||||
|
<!-- Multicompany -->
|
||||||
|
<t t-if="o and 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="o.company_id"></t>
|
||||||
|
</t>
|
||||||
|
<t t-if="not o or not 'company_id' in o">
|
||||||
|
<t t-set="company" t-value="res_company"></t>
|
||||||
|
</t>
|
||||||
|
<t t-set="context" t-value="o._context"></t>
|
||||||
|
|
||||||
|
<div class="page">
|
||||||
|
|
||||||
|
<STYLE TYPE="text/css">
|
||||||
|
body { background: #ffffff; margin: 0; font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
tr.R0{ height: 17px; }
|
||||||
|
tr.R0 td.R0C0{ color: #413003; }
|
||||||
|
tr.R0 td.R0C5{ font-family: Arial; font-size: 6pt; font-style: normal; vertical-align: top; }
|
||||||
|
tr.R0 td.R0C8{ font-family: Arial; font-size: 7pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R0 td.R19C15{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: right; vertical-align: medium; }
|
||||||
|
tr.R0 td.R20C0{ vertical-align: top; }
|
||||||
|
tr.R0 td.R20C15{ font-family: Arial; font-size: 8pt; font-style: italic; text-align: right; vertical-align: top; }
|
||||||
|
tr.R0 td.R20C3{ text-align: center; vertical-align: top; }
|
||||||
|
tr.R0 td.R20C7{ text-align: right; vertical-align: top; }
|
||||||
|
tr.R0 td.R21C0{ vertical-align: top; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R21C1{ text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R21C2{ text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R23C0{ vertical-align: medium; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R23C1{ font-family: Arial; font-size: 7pt; font-style: normal; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R23C3{ font-family: Arial; font-size: 7pt; font-style: normal; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 2px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C1{ vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R25C10{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C12{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R25C13{ text-align: center; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R25C14{ text-align: right; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C15{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R0 td.R25C2{ vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C3{ text-align: left; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C4{ text-align: center; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C5{ text-align: center; vertical-align: top; border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R25C6{ text-align: center; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C7{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R25C8{ vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R27C0{ border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R27C1{ border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R27C11{ text-align: center; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R27C12{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 1px solid; border-right: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R27C13{ text-align: center; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R27C14{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R27C15{ text-align: right; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R27C2{ border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R27C3{ border-top: #000000 2px solid; }
|
||||||
|
tr.R0 td.R27C7{ text-align: right; border-top: #000000 2px solid; }
|
||||||
|
tr.R0 td.R27C8{ text-align: right; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R29C11{ text-align: center; vertical-align: top; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R29C7, tr.R0 td.R29C7S{ text-align: right; }
|
||||||
|
tr.R0 td.R29C8{ text-align: right; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R32C3{ border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R32C4{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R32C7{ border-top: #000000 1px solid; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R32C8, tr.R0 td.R32C8I{ border-bottom: #000000 1px solid; }
|
||||||
|
|
||||||
|
tr.R0 td.R32C8I,tr.R0 td.R29C7S { overflow: visible; }
|
||||||
|
tr.R0 td.R32C8I span,tr.R0 td.R29C7S span { position: relative; }
|
||||||
|
tr.R0 td.R32C8I span img { position: absolute; width: 100px; top: -30px; }
|
||||||
|
tr.R0 td.R29C7S span img { position: absolute; width: 140px; top: -110px; left: 50px; }
|
||||||
|
|
||||||
|
tr.R0 td.R34C8{ border-left: #ffffff 0px none; border-top: #ffffff 0px none; border-bottom: #000000 1px solid; border-right: #ffffff 0px none; }
|
||||||
|
tr.R0 td.R36C16{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R36C9{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R42C0{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; vertical-align: bottom; }
|
||||||
|
tr.R0 td.R42C1{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; vertical-align: bottom; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R42C2{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; vertical-align: top; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R42C7{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; vertical-align: top; border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R44C2{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R44C3{ border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R44C6{ border-bottom: #000000 1px solid;}
|
||||||
|
tr.R0 td.R44C6_1{border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R46C0{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R0 td.R47C17{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; overflow: hidden;border-top: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R47C2{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: left; vertical-align: bottom; border-top: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R47C6{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none;}
|
||||||
|
tr.R0 td.R47C6_1{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top;border-right: #000000 1px solid; }
|
||||||
|
tr.R0 td.R48C2{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: left; vertical-align: bottom; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R0 td.R48C3{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: left; vertical-align: bottom; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R0 td.R51C10{ text-align: center; }
|
||||||
|
tr.R0 td.R51C7{ border-right: #000000 1px solid; }
|
||||||
|
tr.R1{ height: 21px; }
|
||||||
|
tr.R1 td.R1C5{ font-family: Arial; font-size: 6pt; font-style: normal; vertical-align: top; }
|
||||||
|
tr.R1 td.R1C9{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R2{ height: 17px; }
|
||||||
|
tr.R2 td.R2C0{ font-family: Arial; font-size: 8pt; font-style: normal; vertical-align: top; }
|
||||||
|
tr.R2 td.R2C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; vertical-align: medium; }
|
||||||
|
tr.R2 td.R2C9{ text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R22{ height: 56px; }
|
||||||
|
tr.R22 td.R22C0{ vertical-align: top; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R22 td.R22C2{ text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R22 td.R22C3{ text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R3{ height: 16px; }
|
||||||
|
tr.R3 td.R14C2{ vertical-align: bottom; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R3 td.R15C1{ font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
tr.R3 td.R15C2{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R3 td.R15C8{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; vertical-align: bottom; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R3 td.R16C3{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R3 td.R17C2{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: right; vertical-align: medium; border-right: #000000 1px solid; }
|
||||||
|
tr.R3 td.R17C3{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: center; vertical-align: medium; border-left: #000000 2px solid; border-top: #000000 2px solid; border-bottom: #000000 2px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R3 td.R17C4{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: center; vertical-align: medium; border-left: #000000 1px solid; border-top: #000000 2px solid; border-bottom: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R3 td.R18C3{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: center; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; border-right: #ffffff 1px none; }
|
||||||
|
tr.R3 td.R18C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; vertical-align: bottom; }
|
||||||
|
tr.R3 td.R18C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R3 td.R31C5{ border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R3 td.R31C6{ border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R3 td.R3C0{ font-family: Arial; font-size: 8pt; font-style: normal; vertical-align: top; }
|
||||||
|
tr.R3 td.R3C1{ font-family: Arial; font-size: 8pt; font-style: normal; vertical-align: bottom; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R3 td.R3C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; vertical-align: medium; }
|
||||||
|
tr.R3 td.R3C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: medium; border-left: #000000 2px solid; border-top: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R3 td.R4C0{ text-align: right; }
|
||||||
|
tr.R3 td.R4C6{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R3 td.R4C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R3 td.R4C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-top: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R3 td.R6C1{ font-family: Arial; font-size: 8pt; font-style: normal; vertical-align: bottom; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R3 td.R6C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R3 td.R8C1{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R3 td.R8C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R38{ height: 7px; }
|
||||||
|
tr.R38 td.R50C7{ border-right: #000000 1px solid; }
|
||||||
|
tr.R39{ height: 13px; }
|
||||||
|
tr.R39 td.R39C10{ text-align: right; }
|
||||||
|
tr.R39 td.R39C14{ text-align: center; }
|
||||||
|
tr.R39 td.R39C4{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R39 td.R39C7{ border-right: #000000 1px solid; }
|
||||||
|
tr.R39 td.R41C0{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R39 td.R41C11{ border-top: #ffffff 1px none; border-bottom: #000000 1px solid; }
|
||||||
|
tr.R39 td.R41C2{ font-family: Arial; font-size: 8pt; font-style: normal; font-weight: bold; }
|
||||||
|
tr.R40{ height: 14px; }
|
||||||
|
tr.R40 td.R40C4{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; }
|
||||||
|
tr.R40 td.R40C7{ border-right: #000000 1px solid; }
|
||||||
|
tr.R45{ height: 12px; }
|
||||||
|
tr.R45 td.R45C10{ border-left: #ffffff 0px none; border-top: #ffffff 1px none; }
|
||||||
|
tr.R45 td.R45C11{ border-top: #ffffff 1px none; }
|
||||||
|
tr.R45 td.R45C2{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; }
|
||||||
|
tr.R45 td.R45C6{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none;}
|
||||||
|
tr.R45 td.R45C6_1{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-right: #000000 1px solid; }
|
||||||
|
tr.R5{ height: 15px; }
|
||||||
|
tr.R5 td.R11C3{ font-family: Arial; font-size: 8pt; font-style: normal; vertical-align: bottom; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R13C8{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; vertical-align: bottom; border-left: #000000 1px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 1px solid; }
|
||||||
|
tr.R5 td.R33C17{ border-left: #000000 2px solid; border-top: #000000 2px solid; border-bottom: #000000 2px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R5 td.R35C10{ border-top: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R35C9{ font-family: Arial; font-size: 6pt; font-style: normal; border-top: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R43C1{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R43C11{ border-bottom: #000000 1px solid; }
|
||||||
|
tr.R5 td.R43C7{ border-right: #000000 1px solid; }
|
||||||
|
tr.R5 td.R5C0{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-top: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R5C2{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R5C7{ font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
tr.R5 td.R5C9{ font-family: Arial; font-size: 9pt; font-style: normal; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R5 td.R9C0{ text-align: right; }
|
||||||
|
tr.R5 td.R9C1{ font-family: Arial; font-size: 8pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R5 td.R9C3{ font-family: Arial; font-size: 8pt; font-style: normal; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R5 td.R9C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R5 td.R9C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-top: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
tr.R7{ height: 19px; }
|
||||||
|
tr.R7 td.R7C0{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-left: #ffffff 0px none; border-top: #ffffff 1px none; }
|
||||||
|
tr.R7 td.R7C2{ font-family: Arial; font-size: 6pt; font-style: normal; text-align: center; vertical-align: top; border-left: #ffffff 1px none; border-top: #ffffff 1px none; border-bottom: #ffffff 1px none; }
|
||||||
|
tr.R7 td.R7C7{ font-family: Arial; font-size: 9pt; font-style: normal; text-align: right; }
|
||||||
|
tr.R7 td.R7C9{ font-family: Arial; font-size: 9pt; font-style: normal; font-weight: bold; text-align: center; vertical-align: bottom; overflow: hidden;border-left: #000000 2px solid; border-top: #000000 1px solid; border-bottom: #000000 1px solid; border-right: #000000 2px solid; }
|
||||||
|
table {table-layout: fixed; padding: 0px; padding-left: 2px; vertical-align:bottom; border-collapse:collapse;width: 100%; font-family: Arial; font-size: 8pt; font-style: normal; }
|
||||||
|
td { padding: 0px; padding-left: 2px; overflow:hidden; }
|
||||||
|
|
||||||
|
.cu_wspace { white-space:nowrap; }
|
||||||
|
.cu_space21 { width:100%;height:30px;overflow:hidden; }
|
||||||
|
.cu_space31 { width:100%;height:31px;overflow:hidden; }
|
||||||
|
.cu_space11 { width:100%;height:15px;overflow:hidden; }
|
||||||
|
.cu_space16 { width:100%;height:16px;overflow:hidden; }
|
||||||
|
.cu_space19 { width:100%;height:19px;overflow:hidden; }
|
||||||
|
.cu_space26 { width:100%;height:26px;overflow:hidden; }
|
||||||
|
.cu_left { border-left: #ffffff 0px none; }
|
||||||
|
.cu_space15 { width:100%;height:15px;overflow:hidden; }
|
||||||
|
.cu_space70 { width:100%;height:70px;overflow:hidden; }
|
||||||
|
.cu_space40 { width:100%;height:40px;overflow:hidden; }
|
||||||
|
.cu_space7 { width:100%;height:7px;overflow:hidden; }
|
||||||
|
.cu_space13 { width:100%;height:13px;overflow:hidden; }
|
||||||
|
.cu_right { border-right: #000000 1px solid; }
|
||||||
|
.cu_space14 { width:100%;height:14px;overflow:hidden; }
|
||||||
|
.cu_space12 { width:100%;height:12px;overflow:hidden; }
|
||||||
|
tbody, table, tr, td, th{border: none;}
|
||||||
|
</STYLE>
|
||||||
|
<!-- start header -->
|
||||||
|
<TABLE CELLSPACING="0">
|
||||||
|
<COL WIDTH="3%"/>
|
||||||
|
<COL WIDTH="15%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="5%"/>
|
||||||
|
<COL WIDTH="6%"/>
|
||||||
|
<COL WIDTH="6%"/>
|
||||||
|
<COL WIDTH="6%"/>
|
||||||
|
<COL WIDTH="6%"/>
|
||||||
|
<COL WIDTH="6%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<COL WIDTH="7%"/>
|
||||||
|
<TR CLASS="R1">
|
||||||
|
<TD CLASS="R1C9" COLSPAN="15"><DIV class="cu_space21"><SPAN class="cu_wspace">Унифицированная<![CDATA[ ]]>форма<![CDATA[ ]]>№<![CDATA[ ]]>ТОРГ-12<BR/>Утверждена<![CDATA[ ]]>постановлением<![CDATA[ ]]>Госкомстата<![CDATA[ ]]>России<![CDATA[ ]]>от<![CDATA[ ]]>25.12.98<![CDATA[ ]]>№<![CDATA[ ]]>132</SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R2">
|
||||||
|
<TD CLASS="R2C0" COLSPAN="14"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R2C9"><SPAN class="cu_wspace">Коды</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R3C1" COLSPAN="12" ROWSPAN="2"><DIV class="cu_space31"><t t-esc="helper.full_representation(company.partner_id)"/></DIV></TD>
|
||||||
|
<TD CLASS="R3C7" COLSPAN="2"><SPAN class="cu_wspace">Форма<![CDATA[ ]]>по<![CDATA[ ]]>ОКУД<![CDATA[ ]]></SPAN></TD>
|
||||||
|
<TD CLASS="R3C9"><SPAN class="cu_wspace">0330212</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">по<![CDATA[ ]]>ОКПО</SPAN></TD>
|
||||||
|
<TD CLASS="R4C9"><SPAN class="cu_wspace"><t t-esc="company.okpo or ''"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R5C2" COLSPAN="12"><DIV class="cu_space11"><SPAN class="cu_wspace">организация-грузоотправитель,<![CDATA[ ]]>адрес,<![CDATA[ ]]>телефон,<![CDATA[ ]]>факс,<![CDATA[ ]]>банковские<![CDATA[ ]]>реквизиты</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C7" COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C9" ROWSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R6C1" COLSPAN="12"><DIV class="cu_space16"><SPAN class="cu_wspace"><!-- TO DO: ПредставлениеПодразделения --></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R6C7" COLSPAN="2"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R6C7"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R7">
|
||||||
|
<TD CLASS="R7C2" COLSPAN="12"><DIV class="cu_space19"><SPAN class="cu_wspace">структурное<![CDATA[ ]]>подразделение</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R7C7" COLSPAN="2"><DIV class="cu_space19"><SPAN class="cu_wspace">Вид<![CDATA[ ]]>деятельности<![CDATA[ ]]>по<![CDATA[ ]]>ОКДП</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R7C9"><DIV class="cu_space19"><SPAN class="cu_wspace"><!-- TO DO: ВидДеятельностиПоОКДП --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R8C1" COLSPAN="2">Грузополучатель</TD>
|
||||||
|
<TD CLASS="R3C1" COLSPAN="10"><t t-esc="helper.full_representation(o.partner_id)"/></TD>
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">по<![CDATA[ ]]>ОКПО</SPAN></TD>
|
||||||
|
<TD CLASS="R8C9"><SPAN class="cu_wspace"><t t-esc="o.partner_id.okpo or ''"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R9C0" COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C2" COLSPAN="10"><DIV class="cu_space11"><SPAN class="cu_wspace">организация,<![CDATA[ ]]>адрес,<![CDATA[ ]]>телефон,<![CDATA[ ]]>факс,<![CDATA[ ]]>банковские<![CDATA[ ]]>реквизиты</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R9C7" COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R9C9" ROWSPAN="2"><DIV class="cu_space26"><SPAN class="cu_wspace"><t t-esc="company.okpo or ''"/></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">Поставщик</SPAN></TD>
|
||||||
|
<TD CLASS="R3C1" COLSPAN="10"><t t-esc="helper.full_representation(company.partner_id)"/></TD>
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">по<![CDATA[ ]]>ОКПО</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R9C0" COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C2" COLSPAN="10"><DIV class="cu_space11"><SPAN class="cu_wspace">организация,<![CDATA[ ]]>адрес,<![CDATA[ ]]>телефон,<![CDATA[ ]]>факс,<![CDATA[ ]]>банковские<![CDATA[ ]]>реквизиты</SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R9C9" ROWSPAN="2"><DIV class="cu_space26"><SPAN class="cu_wspace"><t t-esc="o.partner_id.okpo or ''"/></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">Плательщик</SPAN></TD>
|
||||||
|
<TD CLASS="R3C1" COLSPAN="10"><t t-esc="helper.full_representation(o.partner_id.parent_id or o.partner_id)"/></TD>
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><SPAN class="cu_wspace">по<![CDATA[ ]]>ОКПО</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD CLASS="R9C0" COLSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C2" COLSPAN="10"><DIV class="cu_space11"><SPAN class="cu_wspace">организация,<![CDATA[ ]]>адрес,<![CDATA[ ]]>телефон,<![CDATA[ ]]>факс,<![CDATA[ ]]>банковские<![CDATA[ ]]>реквизиты</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"></DIV></TD>
|
||||||
|
<TD CLASS="R13C8" ROWSPAN="2"><DIV class="cu_space26"><SPAN class="cu_wspace">номер</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R9C9" ROWSPAN="2"><DIV class="cu_space26"><SPAN class="cu_wspace"><!-- TO DO: ОснованиеНомер --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R4C7" COLSPAN="2"><DIV class="cu_space16"><SPAN class="cu_wspace">Основание</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R14C2" COLSPAN="10"><DIV class="cu_space16"><SPAN class="cu_wspace"><t t-esc="o.name or ''"/></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD COLSPAN="2"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R15C2" COLSPAN="10"><DIV class="cu_space16"><SPAN class="cu_wspace">договор,<![CDATA[ ]]>заказ-наряд</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R15C8"><DIV class="cu_space16"><SPAN class="cu_wspace">дата</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C9"><DIV class="cu_space16"><SPAN class="cu_wspace"><!-- TO DO: ОснованиеДата --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD COLSPAN="5"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R16C3" COLSPAN="2"><DIV class="cu_space16"><SPAN class="cu_wspace">Номер<![CDATA[ ]]>документа</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R16C3" COLSPAN="2"><DIV class="cu_space16"><SPAN class="cu_wspace">Дата<![CDATA[ ]]>составления</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R6C7" COLSPAN="3"><DIV class="cu_space16"><SPAN class="cu_wspace">Транспортная<![CDATA[ ]]>накладная</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R15C8"><DIV class="cu_space16"><SPAN class="cu_wspace">номер</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C9"><DIV class="cu_space16"><SPAN class="cu_wspace"><!-- TO DO: ТранспортнаяНакладнаяНомер --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R17C2" COLSPAN="5"><DIV class="cu_space16"><SPAN class="cu_wspace">ТОВАРНАЯ<![CDATA[ ]]>НАКЛАДНАЯ<![CDATA[ ]]><![CDATA[ ]]></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R17C3" COLSPAN="2"><DIV class="cu_space16"><SPAN class="cu_wspace"><t t-esc="helper.numer(o.name)"/></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R17C4" COLSPAN="2"><DIV class="cu_space16"><span class="cu_wspace" t-field="o.invoice_date"/></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R15C8"><DIV class="cu_space16"><SPAN class="cu_wspace">дата</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C9"><DIV class="cu_space16"><SPAN class="cu_wspace"><!-- TO DO: ТранспортнаяНакладнаяДата --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD CLASS="R4C7" COLSPAN="10"><DIV class="cu_space16"><SPAN class="cu_wspace"></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R18C7" COLSPAN="4"><DIV class="cu_space16"><SPAN class="cu_wspace">Вид<![CDATA[ ]]>операции</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R18C9"><DIV class="cu_space16"><SPAN class="cu_wspace"><!-- TO DO: ВидОперации --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R20C15" COLSPAN="15"><SPAN class="cu_wspace">Страница 1<!-- TO DO: НомерСтраницы --></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R21C1" ROWSPAN="2"><DIV class="cu_space70">Но-<BR/>мер<BR/>по по-<BR/>рядку </DIV></TD>
|
||||||
|
<TD CLASS="R21C2" COLSPAN="2"><DIV class="cu_space15"><SPAN class="cu_wspace">Товар</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C2" COLSPAN="2"><DIV class="cu_space15"><SPAN class="cu_wspace">Единица<![CDATA[ ]]>измерения</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C1" ROWSPAN="2"><DIV class="cu_space70">Вид упаков<BR/>ки</DIV></TD>
|
||||||
|
<TD CLASS="R21C2" COLSPAN="2"><DIV class="cu_space15"><SPAN class="cu_wspace">Количество</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C1" ROWSPAN="2"><DIV class="cu_space70">Масса брутто</DIV></TD>
|
||||||
|
<TD CLASS="R21C2" ROWSPAN="2"><DIV class="cu_space70"><SPAN class="cu_wspace">Коли-<BR/>чество<![CDATA[ ]]><BR/>(масса<![CDATA[ ]]><BR/>нетто)</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C2" ROWSPAN="2"><DIV class="cu_space70"><SPAN class="cu_wspace">Цена,<BR/>руб.<![CDATA[ ]]>коп.</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C2" ROWSPAN="2"><DIV class="cu_space70"><SPAN class="cu_wspace">Сумма<![CDATA[ ]]>без<BR/>учета<![CDATA[ ]]>НДС,<BR/>руб.<![CDATA[ ]]>коп.</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C2" COLSPAN="2"><DIV class="cu_space15"><SPAN class="cu_wspace">НДС</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R21C2" ROWSPAN="2"><DIV class="cu_space70"><SPAN class="cu_wspace">Сумма<![CDATA[ ]]>с<BR/>учетом<![CDATA[ ]]><BR/>НДС,<![CDATA[ ]]><BR/>руб.<![CDATA[ ]]>коп.</SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R22">
|
||||||
|
<TD CLASS="R22C2">наименование, характеристика, сорт, артикул товара</TD>
|
||||||
|
<TD CLASS="R22C3"><SPAN class="cu_wspace">код</SPAN></TD>
|
||||||
|
<TD CLASS="R22C2">наиме- нование</TD>
|
||||||
|
<TD CLASS="R22C2">код по ОКЕИ</TD>
|
||||||
|
<TD CLASS="R22C2">в одном месте</TD>
|
||||||
|
<TD CLASS="R22C2">мест,<BR/>штук</TD>
|
||||||
|
<TD CLASS="R22C2">ставка, %</TD>
|
||||||
|
<TD CLASS="R22C2">сумма, <BR/>руб. коп.</TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R23C1"><SPAN class="cu_wspace">1</SPAN></TD>
|
||||||
|
<TD CLASS="R23C1"><SPAN class="cu_wspace">2</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">3</SPAN></TD>
|
||||||
|
<TD CLASS="R23C1"><SPAN class="cu_wspace">4</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">5</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">6</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">7</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">8</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">9</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">10</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">11</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">12</SPAN></TD>
|
||||||
|
<TD CLASS="R23C1"><SPAN class="cu_wspace">13</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">14</SPAN></TD>
|
||||||
|
<TD CLASS="R23C3"><SPAN class="cu_wspace">15</SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<t t-set="page_quantity" t-value="sum([line.quantity for line in o.invoice_line_ids])" />
|
||||||
|
<t t-set="total_quantity" t-value="sum([line.quantity for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="page_price_subtotal" t-value="sum([line.price_subtotal for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="total_price_subtotal" t-value="sum([line.price_subtotal for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="page_tax" t-value="sum([line.price_unit*line.quantity - line.price_subtotal for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="total_tax" t-value="sum([line.price_unit*line.quantity - line.price_subtotal for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="page_price_tax_subtotal" t-value="sum([line.price_unit*line.quantity for line in o.invoice_line_ids])"/>
|
||||||
|
<t t-set="total_price_tax_subtotal" t-value="sum([line.price_unit*line.quantity for line in o.invoice_line_ids])"/>
|
||||||
|
<tr CLASS="R0" t-foreach="o.invoice_line_ids" t-as="line">
|
||||||
|
<TD CLASS="R25C1"><SPAN class="cu_wspace"><t t-esc="line_index+1"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C2"><t t-esc="line.name or ''"/></TD>
|
||||||
|
<TD CLASS="R25C3"><!-- TO DO: ТоварКод --></TD>
|
||||||
|
<TD CLASS="R25C4"><SPAN class="cu_wspace"><t t-esc="line.product_uom_id.name or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C5">796<!-- TO DO: БазоваяЕдиницаКодПоОКЕИ --></TD>
|
||||||
|
<TD CLASS="R25C6"><SPAN class="cu_wspace"><!-- TO DO: ВидУпаковки --></SPAN></TD>
|
||||||
|
<TD CLASS="R25C7"><SPAN class="cu_wspace"><!-- TO DO: КоличествоВОдномМесте --></SPAN></TD>
|
||||||
|
<TD CLASS="R25C8"><SPAN class="cu_wspace"><!-- TO DO: КоличествоМест --></SPAN></TD>
|
||||||
|
<TD CLASS="R25C7"><SPAN class="cu_wspace"><!-- TO DO: МассаБрутто --></SPAN></TD>
|
||||||
|
<TD CLASS="R25C10"><SPAN class="cu_wspace"><t t-esc="line.quantity or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C10"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(line.price_subtotal/line.quantity)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C12"><SPAN class="cu_wspace"><t t-esc="line.price_subtotal or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C13"><SPAN class="cu_wspace">18% <!-- TO DO: СтавкаНДС --></SPAN></TD>
|
||||||
|
<TD CLASS="R25C14"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(line.price_unit*line.quantity - line.price_subtotal)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C15"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(line.price_unit*line.quantity)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
</tr>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R27C1"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R27C2"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R27C3"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R27C0"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R27C7" COLSPAN="3"><SPAN class="cu_wspace">Итого<![CDATA[ ]]></SPAN></TD>
|
||||||
|
<TD CLASS="R27C8"><SPAN class="cu_wspace"><!-- TO DO: ИтогоКоличествоМест --></SPAN></TD>
|
||||||
|
<TD CLASS="R27C8"><SPAN class="cu_wspace"><!-- TO DO: ИтогоМассаБрутто --></SPAN></TD>
|
||||||
|
<TD CLASS="R27C8"><SPAN class="cu_wspace"><t t-esc="(('%.3f')%(page_quantity)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R27C11"><SPAN class="cu_wspace">Х</SPAN></TD>
|
||||||
|
<TD CLASS="R27C12"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(page_price_subtotal)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R27C13"><SPAN class="cu_wspace">Х</SPAN></TD>
|
||||||
|
<TD CLASS="R27C14"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(page_tax)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R27C15"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(page_price_tax_subtotal)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R29C7" COLSPAN="7"><SPAN class="cu_wspace">Всего<![CDATA[ ]]>по<![CDATA[ ]]>накладной<![CDATA[ ]]></SPAN></TD>
|
||||||
|
<TD CLASS="R29C8"><SPAN class="cu_wspace"><!-- TO DO: ИтогМест --></SPAN></TD>
|
||||||
|
<TD CLASS="R29C8"><SPAN class="cu_wspace"><!-- TO DO: ИтогМассаБрутто --></SPAN></TD>
|
||||||
|
<TD CLASS="R29C8"><SPAN class="cu_wspace"><t t-esc="(('%.3f')%(total_quantity)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R29C11"><SPAN class="cu_wspace">Х</SPAN></TD>
|
||||||
|
<TD CLASS="R25C10"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(total_price_subtotal)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R29C11"><SPAN class="cu_wspace">Х</SPAN></TD>
|
||||||
|
<TD CLASS="R25C10"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(total_tax)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R25C10"><SPAN class="cu_wspace"><t t-esc="(('%.2f')%(total_price_tax_subtotal)).replace('.',',') or ''"/></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
<TABLE CELLSPACING="0">
|
||||||
|
<COL WIDTH="17"/>
|
||||||
|
<COL WIDTH="143"/>
|
||||||
|
<COL WIDTH="130"/>
|
||||||
|
<COL WIDTH="30"/>
|
||||||
|
<COL WIDTH="122"/>
|
||||||
|
<COL WIDTH="31"/>
|
||||||
|
<COL WIDTH="216"/>
|
||||||
|
<COL WIDTH="33"/>
|
||||||
|
<COL WIDTH="34"/>
|
||||||
|
<COL WIDTH="74"/>
|
||||||
|
<COL WIDTH="60"/>
|
||||||
|
<COL WIDTH="100"/>
|
||||||
|
<COL WIDTH="30"/>
|
||||||
|
<COL WIDTH="46"/>
|
||||||
|
<COL WIDTH="40"/>
|
||||||
|
<COL WIDTH="51"/>
|
||||||
|
<COL WIDTH="30"/>
|
||||||
|
<COL WIDTH="182"/>
|
||||||
|
<TR CLASS="R3">
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space16"><SPAN class="cu_space11">Товарная<![CDATA[ ]]>накладная<![CDATA[ ]]>имеет<![CDATA[ ]]>приложение<![CDATA[ ]]>на</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R31C5"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R31C6"><DIV class="cu_space16"><SPAN class="cu_space11"><!-- TO DO: КоличествоЛистовВПриложении --></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C6"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C6"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R4C6"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space16"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space15"><SPAN class="cu_space11">и<![CDATA[ ]]>содержит</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R32C3" COLSPAN="4"><DIV class="cu_space15"><SPAN class="cu_space11"><t t-esc="helper.in_words(o.invoice_line_ids and len(o.invoice_line_ids) or 0).capitalize()"/></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R32C7"><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R32C8"><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R32C8"><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R32C8"><DIV class="cu_space15"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="8"><DIV class="cu_space15"><SPAN class="cu_space11">порядковых<![CDATA[ ]]>номеров<![CDATA[ ]]>записей</SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0" COLSPAN="8"><DIV class="cu_space11"><SPAN class="cu_wspace">прописью</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R33C17" ROWSPAN="3"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD COLSPAN="2"><SPAN class="cu_space11"><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]>Масса<![CDATA[ ]]>груза<![CDATA[ ]]>(нетто)</SPAN></TD>
|
||||||
|
<TD CLASS="R34C8"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R34C8"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R34C8"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R34C8"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R34C8"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R34C8" COLSPAN="3"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0" COLSPAN="8"><DIV class="cu_space11"><SPAN class="cu_space11">прописью</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R33C17" ROWSPAN="2"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN class="cu_space11">Всего<![CDATA[ ]]>мест</SPAN></TD>
|
||||||
|
<TD CLASS="R32C4"><SPAN class="cu_space"/></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD COLSPAN="2"><SPAN class="cu_space11"><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]>Масса<![CDATA[ ]]>груза<![CDATA[ ]]>(брутто)</SPAN></TD>
|
||||||
|
<TD CLASS="R32C3" COLSPAN="8"><SPAN class="cu_space"><!-- TO DO: МассаГрузаПрописью --></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0" COLSPAN="2"><DIV class="cu_space11"><SPAN class="cu_space11">прописью</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0" COLSPAN="8"><DIV class="cu_space11"><SPAN class="cu_space11">прописью</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R5C0"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R38">
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><![CDATA[ ]]></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R39">
|
||||||
|
<TD><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space13"><SPAN class="cu_space11">Приложение<![CDATA[ ]]>(паспорта,<![CDATA[ ]]>сертификаты<![CDATA[ ]]>и<![CDATA[ ]]>т.п.)<![CDATA[ ]]>на<![CDATA[ ]]></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R39C4"><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="2" class="cu_right"><DIV class="cu_space13"><SPAN class="cu_space11">листах</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R39C10" COLSPAN="3"><DIV class="cu_space13"><SPAN class="cu_space11">По<![CDATA[ ]]>доверенности<![CDATA[ ]]>№</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R39C4" COLSPAN="3"><DIV class="cu_space13"><SPAN class="cu_space11"><!-- TO DO: ДоверенностьНомер --></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R39C14"><DIV class="cu_space13"><SPAN class="cu_space11">от</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R39C4" COLSPAN="3"><DIV class="cu_space13"><SPAN class="cu_space11"><!-- TO DO: ДоверенностьДата --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R40">
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R40C4" COLSPAN="2"><DIV class="cu_space14"><SPAN class="cu_space11">прописью</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R40C7"><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space14"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R39">
|
||||||
|
<TD CLASS="R41C0"><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R41C0" COLSPAN="2"><DIV class="cu_space13"><SPAN class="cu_space11">Всего<![CDATA[ ]]>отпущено<![CDATA[ ]]><![CDATA[ ]]>на<![CDATA[ ]]>сумму</SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="5" class="cu_right"><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space13"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="2"><DIV class="cu_space13"><SPAN class="cu_space11">выданной</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R41C11" COLSPAN="7"><DIV class="cu_space13"><SPAN class="cu_space11"><!-- TO DO: ДоверенностьВыдана --></SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R42C0"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R42C1" COLSPAN="6"><t t-esc="helper.rubles(o.amount_total).capitalize()"/></TD>
|
||||||
|
<TD class="cu_right"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16" COLSPAN="7"><SPAN class="cu_wspace">кем,<![CDATA[ ]]>кому<![CDATA[ ]]>(организация,<![CDATA[ ]]>должность,<![CDATA[ ]]>фамилия,<![CDATA[ ]]>и.<![CDATA[ ]]>о.)</SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R5">
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C1" COLSPAN="6"><DIV class="cu_space11"><SPAN class="cu_wspace">прописью</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C7"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C11"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C11"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C11" COLSPAN="3"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C11"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R43C11"><DIV class="cu_space11"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space11"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN class="cu_wspace">Отпуск<![CDATA[ ]]>груза<![CDATA[ ]]>разрешил</SPAN></TD>
|
||||||
|
<TD CLASS="R44C2">Директор<!-- TO DO: ДолжностьРуководителя --></TD>
|
||||||
|
<TD CLASS="R44C3"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8I"><SPAN><t t-raw="company.print_facsimile and (company.print_anywhere or context.get('mark_invoice_as_sent', False)) and helper.img(company.chief_id.facsimile) or ''"/></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R44C6"><t t-esc="helper.initials(company.chief_id.name)"/></TD>
|
||||||
|
<TD CLASS="R44C6_1"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8" COLSPAN="7"><SPAN class="cu_wspace"><!-- TO DO: ДоверенностьЧерезКого --></SPAN></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R45">
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C2"><DIV class="cu_space12"><SPAN class="cu_wspace">должность</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C2"><DIV class="cu_space12"><SPAN class="cu_wspace">подпись</SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C6"><DIV class="cu_space12"><SPAN class="cu_wspace">расшифровка<![CDATA[ ]]>подписи</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C6_1"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C10"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C11"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C11"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C11" COLSPAN="3"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C11"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R45C11"><DIV class="cu_space12"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space12"></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R46C0"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R46C0" COLSPAN="3"><SPAN class="cu_wspace">Главный<![CDATA[ ]]>(старший)<![CDATA[ ]]>бухгалтер</SPAN></TD>
|
||||||
|
<TD CLASS="R32C8I"><SPAN><t t-raw="company.print_facsimile and (company.print_anywhere or context.get('mark_invoice_as_sent', False)) and helper.img(company.accountant_id.facsimile) or ''"/></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R44C6"><t t-esc="helper.initials(company.accountant_id.name)"/></TD>
|
||||||
|
<TD CLASS="R44C6_1"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD COLSPAN="2"><SPAN class="cu_wspace">Груз<![CDATA[ ]]>принял</SPAN></TD>
|
||||||
|
<TD CLASS="R32C8"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8" COLSPAN="3"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8"><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD></TD>
|
||||||
|
<TD COLSPAN="3"></TD>
|
||||||
|
<TD CLASS="R36C16">подпись</TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD CLASS="R47C6"><SPAN class="cu_wspace">расшифровка<![CDATA[ ]]>подписи</SPAN></TD>
|
||||||
|
<TD CLASS="R47C6_1"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16"><SPAN class="cu_wspace">должность</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16" COLSPAN="3"><SPAN class="cu_wspace">подпись</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R47C17"><SPAN class="cu_wspace">расшифровка<![CDATA[ ]]>подписи</SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN class="cu_wspace">Отпуск<![CDATA[ ]]>груза<![CDATA[ ]]>произвел</SPAN></TD>
|
||||||
|
<TD CLASS="R48C2"><!-- TO DO: ДолжностьКладовщика --></TD>
|
||||||
|
<TD CLASS="R48C3"><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R44C6"><!-- TO DO: ФИОКладовщика --></TD>
|
||||||
|
<TD CLASS="R44C6_1"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD COLSPAN="2"><SPAN class="cu_wspace">Груз<![CDATA[ ]]>получил<![CDATA[ ]]></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8" COLSPAN="3"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R32C8"><SPAN></SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16"><SPAN class="cu_wspace">должность</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16"><SPAN class="cu_wspace">подпись</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R47C6"><SPAN class="cu_wspace">расшифровка<![CDATA[ ]]>подписи</SPAN></TD>
|
||||||
|
<TD CLASS="R47C6_1"><SPAN></SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R20C0" COLSPAN="2"><SPAN class="cu_wspace">грузополучатель</SPAN></TD>
|
||||||
|
<TD CLASS="R36C16"><SPAN class="cu_wspace">должность</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R36C16" COLSPAN="3"><SPAN class="cu_wspace">подпись</SPAN></TD>
|
||||||
|
<TD><SPAN></SPAN></TD>
|
||||||
|
<TD CLASS="R47C17"><SPAN class="cu_wspace">расшифровка<![CDATA[ ]]>подписи</SPAN></TD>
|
||||||
|
<TD></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R38">
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R50C7"><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3"><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><SPAN></SPAN></DIV></TD>
|
||||||
|
<TD><DIV class="cu_space7"><![CDATA[ ]]></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
<TR CLASS="R0">
|
||||||
|
<TD CLASS="R29C7S"><SPAN><t t-raw="company.print_stamp and (company.print_anywhere or context.get('mark_invoice_as_sent', False)) and helper.img(company.stamp) or ''"/></SPAN></TD>
|
||||||
|
<TD CLASS="R29C7"><DIV class="cu_space15"><SPAN class="cu_wspace">М.П.</SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R29C7" COLSPAN="3"><DIV class="cu_space15"><SPAN class="cu_wspace"><t t-esc="helper.ru_date(o.invoice_date)"/><!-- TO DO: ДатаДокументаДень --></SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="3" class="cu_right"><DIV class="cu_space15"><SPAN class="cu_wspace"><!-- TO DO: ДатаДокументаГод --></SPAN></DIV></TD>
|
||||||
|
<TD CLASS="R51C10" COLSPAN="4"><DIV class="cu_space15"><SPAN class="cu_wspace">М.П.</SPAN></DIV></TD>
|
||||||
|
<TD COLSPAN="7"><DIV class="cu_space15"><SPAN class="cu_wspace">"<![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]>"<![CDATA[ ]]>_____________<![CDATA[ ]]>20<![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]><![CDATA[ ]]>года</SPAN></DIV></TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
13
l10n_ru_doc/report/report_invoice.py
Normal file
13
l10n_ru_doc/report/report_invoice.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from odoo import models
|
||||||
|
from odoo.addons.l10n_ru_doc.report_helper import QWebHelper
|
||||||
|
class RuInvoiceReport(models.AbstractModel):
|
||||||
|
_name = 'report.l10n_ru_doc.report_invoice'
|
||||||
|
def _get_report_values(self, docids, data=None):
|
||||||
|
docs = self.env['account.move'].browse(docids)
|
||||||
|
return {
|
||||||
|
'helper': QWebHelper(),
|
||||||
|
'doc_ids': docs.ids,
|
||||||
|
'doc_model': 'account.move',
|
||||||
|
'docs': docs
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user