Public release from ruodoo-project: 19.0 - 2026-05-31 21:19:12 UTC
This commit is contained in:
343
l10n_ru_contract/report/report_contract_simple.xml
Normal file
343
l10n_ru_contract/report/report_contract_simple.xml
Normal file
@ -0,0 +1,343 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="action_report_contract_simple" model="ir.actions.report">
|
||||
<field name="name">Договор (WeasyPrint)</field>
|
||||
<field name="model">partner.contract.customer</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">l10n_ru_contract.report_contract_customer_modern</field>
|
||||
<field name="report_file">l10n_ru_contract.report_contract_customer_modern</field>
|
||||
<field name="print_report_name">'Договор - %s' % (object.name or '')</field>
|
||||
<field name="binding_model_id" ref="l10n_ru_contract.model_partner_contract_customer" />
|
||||
<field name="use_weasyprint">True</field>
|
||||
</record>
|
||||
|
||||
<template id="report_contract_customer_modern">
|
||||
<t t-call="web.html_container">
|
||||
<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-call="web.external_layout">
|
||||
|
||||
<!-- Корневой блок, передаём номер договора в string-set -->
|
||||
<div class="page contract-root" t-att-data-contract-number="o.name or ''">
|
||||
<style type="text/css">
|
||||
@page {
|
||||
size: A4;
|
||||
margin: 18mm 20mm 22mm 20mm;
|
||||
|
||||
@bottom-right {
|
||||
content: "Страница " counter(page) " из " counter(pages);
|
||||
font-size: 9pt;
|
||||
font-family: "DejaVu Serif", "Times New Roman", serif;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "DejaVu Serif", "Times New Roman", serif;
|
||||
font-size: 11pt;
|
||||
line-height: 1.45;
|
||||
color: #000;
|
||||
background: #ffffff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.contract-root {
|
||||
string-set: contract_number attr(data-contract-number);
|
||||
}
|
||||
|
||||
.contract-main-title {
|
||||
text-align: center;
|
||||
font-size: 15pt;
|
||||
font-weight: bold;
|
||||
margin-bottom: 4mm;
|
||||
}
|
||||
|
||||
.contract-subtitle {
|
||||
text-align: center;
|
||||
font-size: 11pt;
|
||||
color: #444;
|
||||
margin-bottom: 6mm;
|
||||
}
|
||||
|
||||
.meta-table {
|
||||
width: 100%;
|
||||
margin-bottom: 6mm;
|
||||
font-size: 10.5pt;
|
||||
}
|
||||
.meta-city { text-align: left; }
|
||||
.meta-date { text-align: right; }
|
||||
|
||||
.parties-block {
|
||||
margin-bottom: 10mm;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.clauses-root {
|
||||
counter-reset: clause;
|
||||
}
|
||||
|
||||
.clauses-columns {
|
||||
column-count: 2;
|
||||
column-gap: 12mm;
|
||||
column-rule: 0.2mm solid #999;
|
||||
}
|
||||
|
||||
.clause {
|
||||
counter-increment: clause;
|
||||
margin-bottom: 4mm;
|
||||
break-inside: avoid-column;
|
||||
}
|
||||
|
||||
.clause-title::before {
|
||||
content: counter(clause) ". ";
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.clause-title {
|
||||
font-weight: bold;
|
||||
margin-bottom: 1mm;
|
||||
}
|
||||
|
||||
.clause-body {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.requisites-title {
|
||||
margin-top: 12mm;
|
||||
margin-bottom: 4mm;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
.requisites-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 48% 48%;
|
||||
column-gap: 4%;
|
||||
row-gap: 6mm;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
.requisites-card {
|
||||
border: 1px solid #000;
|
||||
padding: 4mm;
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
.requisites-card-title {
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 3mm;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.requisites-line {
|
||||
margin-bottom: 2mm;
|
||||
}
|
||||
|
||||
.signature-block {
|
||||
margin-top: 12mm;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
column-gap: 12mm;
|
||||
}
|
||||
|
||||
.signature-side-title {
|
||||
font-size: 10pt;
|
||||
font-weight: bold;
|
||||
margin-bottom: 3mm;
|
||||
}
|
||||
|
||||
.signature-line {
|
||||
border-bottom: 1px solid #000;
|
||||
height: 6mm;
|
||||
margin-bottom: 2mm;
|
||||
width: 60mm;
|
||||
}
|
||||
|
||||
.signature-name {
|
||||
font-size: 10pt;
|
||||
margin-bottom: 4mm;
|
||||
}
|
||||
|
||||
.signature-stamp {
|
||||
margin-top: 4mm;
|
||||
height: 30mm;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.signature-stamp img {
|
||||
position: absolute;
|
||||
max-width: 120px;
|
||||
max-height: 120px;
|
||||
left: 0;
|
||||
top: -5mm;
|
||||
}
|
||||
|
||||
.debug-test {
|
||||
background: yellow;
|
||||
border: 3px solid red;
|
||||
font-size: 20pt;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="debug-test">
|
||||
ТЕСТ CSS
|
||||
</div>
|
||||
|
||||
<!-- Шапка договора -->
|
||||
<div class="header-block">
|
||||
<div class="contract-main-title">
|
||||
ДОГОВОР ПОСТАВКИ ПРОДУКЦИИ № <t t-esc="o.name or ''"/>
|
||||
</div>
|
||||
<div class="contract-subtitle">
|
||||
(пример шаблона, оптимизированного под WeasyPrint)
|
||||
</div>
|
||||
<table class="meta-table" border="0" cellpadding="0" cellspacing="0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="meta-city">
|
||||
<t t-esc="company.partner_id.city or ''"/>
|
||||
</td>
|
||||
<td class="meta-date">
|
||||
<t t-esc="o.get_date_text(o.date_start) if o.date_start else ''"/>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="parties-block">
|
||||
<t t-if="o.partner_type in ['company', 'company_ip']">
|
||||
<t t-esc="company.name or ''"/>,
|
||||
именуемое в дальнейшем «Поставщик», с одной стороны, и
|
||||
<t t-esc="o.partner_id.name or ''"/>,
|
||||
именуемое в дальнейшем «Покупатель», совместно именуемые «Стороны»,
|
||||
заключили настоящий договор о нижеследующем:
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-esc="company.name or ''"/> (далее — «Поставщик») и
|
||||
гражданин(ка) <t t-esc="o.partner_id.name or ''"/> (далее — «Покупатель»),
|
||||
совместно именуемые «Стороны», заключили настоящий договор о нижеследующем:
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Основная часть: пункты в две колонки -->
|
||||
<div class="clauses-root clauses-columns">
|
||||
<t t-foreach="o.lines_ids.sorted(key=lambda r: r.sequence, reverse=False)" t-as="line">
|
||||
<div class="clause">
|
||||
<div class="clause-title">
|
||||
<t t-esc="line.name or ''"/>
|
||||
</div>
|
||||
<div class="clause-body">
|
||||
<span>
|
||||
<t t-raw="line.punct or ''"/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
<!-- Реквизиты и подписи с использованием CSS Grid -->
|
||||
<div class="requisites-title">
|
||||
Реквизиты и подписи сторон
|
||||
</div>
|
||||
|
||||
<div class="requisites-grid">
|
||||
<!-- Поставщик -->
|
||||
<div class="requisites-card">
|
||||
<div class="requisites-card-title">Поставщик</div>
|
||||
<div class="requisites-line">
|
||||
<strong>Наименование:</strong>
|
||||
<t t-esc="company.name or ''"/>
|
||||
</div>
|
||||
<div class="requisites-line">
|
||||
<strong>ИНН:</strong>
|
||||
<t t-esc="company.inn or ''"/>
|
||||
</div>
|
||||
<div class="requisites-line">
|
||||
<strong>ОГРН:</strong>
|
||||
<t t-esc="company.company_registry or ''"/>
|
||||
</div>
|
||||
<div class="requisites-line">
|
||||
<strong>КПП:</strong>
|
||||
<t t-esc="company.kpp or ''"/>
|
||||
</div>
|
||||
<div class="requisites-line">
|
||||
<strong>Юр. адрес:</strong><br/>
|
||||
<t t-esc="o.address(o.company_id) or ''"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Покупатель -->
|
||||
<div class="requisites-card">
|
||||
<div class="requisites-card-title">Покупатель</div>
|
||||
<div class="requisites-line">
|
||||
<strong>Наименование / ФИО:</strong>
|
||||
<t t-esc="o.partner_id.name or ''"/>
|
||||
</div>
|
||||
<div class="requisites-line">
|
||||
<strong>ИНН:</strong>
|
||||
<t t-esc="o.partner_id.inn or ''"/>
|
||||
</div>
|
||||
<t t-if="o.partner_type in ['company', 'company_ip']">
|
||||
<div class="requisites-line">
|
||||
<strong>ОГРН:</strong>
|
||||
<t t-esc="o.partner_id.ogrn or ''"/>
|
||||
</div>
|
||||
<t t-if="o.partner_type == 'company'">
|
||||
<div class="requisites-line">
|
||||
<strong>КПП:</strong>
|
||||
<t t-esc="o.partner_id.kpp or ''"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<div class="requisites-line">
|
||||
<strong>Паспорт:</strong>
|
||||
<t t-esc="o.partner_id.passport or ''"/>
|
||||
</div>
|
||||
</t>
|
||||
<div class="requisites-line">
|
||||
<strong>Юр. адрес / адрес регистрации:</strong><br/>
|
||||
<t t-esc="o.address(o.partner_id) or ''"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="signature-block">
|
||||
<div>
|
||||
<div class="signature-side-title">Поставщик</div>
|
||||
<div class="signature-line"></div>
|
||||
<div class="signature-name">
|
||||
<t t-esc="o.director_name_company or ''"/>
|
||||
</div>
|
||||
<div class="signature-stamp">
|
||||
<t t-if="o.stamp">
|
||||
<t t-raw="o.img(o.company_id.stamp) or ''"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="signature-side-title">Покупатель</div>
|
||||
<div class="signature-line"></div>
|
||||
<div class="signature-name">
|
||||
<!-- тут можно вывести ФИО либо оставить пустым -->
|
||||
<t t-esc="''"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user