[ADD] contract_field model, contract_field_transient_model, default_fields, transient field view inside a contract wizard, generate contract using transient fields, usererror when has no template
This commit is contained in:
parent
e313d822ab
commit
0dce76ae93
@ -23,10 +23,11 @@
|
||||
],
|
||||
|
||||
'data': [
|
||||
# 'security/ir.model.access.csv',
|
||||
'security/ir.model.access.csv',
|
||||
# 'views/templates.xml',
|
||||
'views/res_partner.xml',
|
||||
'views/res_partner_contract.xml',
|
||||
'views/res_partner.xml',
|
||||
'views/contract_wizard.xml',
|
||||
'data/fields_default.xml',
|
||||
],
|
||||
}
|
||||
|
219
data/fields_default.xml
Normal file
219
data/fields_default.xml
Normal file
@ -0,0 +1,219 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- Action -->
|
||||
<record id="action_get_context" model="ir.actions.server">
|
||||
<field name="name">Generate Context for Contract</field>
|
||||
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">
|
||||
self = records
|
||||
|
||||
# ctx keys must be decalared in this xml
|
||||
ctx = {
|
||||
"contract_number":"--1",
|
||||
"amount_whole":"",
|
||||
"amount_fractional":"",
|
||||
|
||||
"seller_company_name":"Test Company Name",
|
||||
"seller_business_address":"",
|
||||
"seller_representer_name":"",
|
||||
"seller_representer_name_parent":"",
|
||||
"seller_representer_name_initials":"",
|
||||
"seller_representer_function":"",
|
||||
"seller_inn":"",
|
||||
"seller_kpp":"",
|
||||
"seller_bic":"",
|
||||
"seller_ogrn":"",
|
||||
"seller_bank":"",
|
||||
"seller_bank_account":"",
|
||||
"seller_phone":"",
|
||||
|
||||
"partner_company_name":"",
|
||||
"partner_business_address":"",
|
||||
"partner_representer_name":"",
|
||||
"partner_representer_name_parent":"",
|
||||
"partner_representer_name_initials":"",
|
||||
"partner_representer_function":"",
|
||||
"partner_inn":"",
|
||||
"partner_kpp":"",
|
||||
"partner_bic":"",
|
||||
"partner_ogrn":"",
|
||||
"partner_bank":"",
|
||||
"partner_bank_account":"",
|
||||
"partner_phone":"",
|
||||
}
|
||||
action = ctx
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Common fields -->
|
||||
|
||||
<record id="contract_field_contract_number" model="res.partner.contract.field">
|
||||
<field name="name">Contract Number</field>
|
||||
<field name="technical_name">contract_number</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_amount_whole" model="res.partner.contract.field">
|
||||
<field name="name">Amount Whole Part</field>
|
||||
<field name="technical_name">amount_whole</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_amount_fractional" model="res.partner.contract.field">
|
||||
<field name="name">Amount Fractional Part</field>
|
||||
<field name="technical_name">amount_fractional</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Seller -->
|
||||
|
||||
<record id="contract_field_seller_company_name" model="res.partner.contract.field">
|
||||
<field name="name">Seller Company Name</field>
|
||||
<field name="technical_name">seller_company_name</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_business_address" model="res.partner.contract.field">
|
||||
<field name="name">Seller Business Address</field>
|
||||
<field name="technical_name">seller_business_address</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_representer_name" model="res.partner.contract.field">
|
||||
<field name="name">Seller Representer Name</field>
|
||||
<field name="technical_name">seller_representer_name</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_representer_name_parent" model="res.partner.contract.field">
|
||||
<field name="name">Seller Representer Parent Name</field>
|
||||
<field name="technical_name">seller_representer_name_parent</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_representer_name_initials" model="res.partner.contract.field">
|
||||
<field name="name">Seller Representer Initials Name</field>
|
||||
<field name="technical_name">seller_representer_name_initials</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_representer_function" model="res.partner.contract.field">
|
||||
<field name="name">Seller Representer Function</field>
|
||||
<field name="technical_name">seller_representer_function</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_inn" model="res.partner.contract.field">
|
||||
<field name="name">Seller INN</field>
|
||||
<field name="technical_name">seller_inn</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_kpp" model="res.partner.contract.field">
|
||||
<field name="name">Seller KPP</field>
|
||||
<field name="technical_name">seller_kpp</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_bic" model="res.partner.contract.field">
|
||||
<field name="name">Seller BIC</field>
|
||||
<field name="technical_name">seller_bic</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_ogrn" model="res.partner.contract.field">
|
||||
<field name="name">Seller OGRN</field>
|
||||
<field name="technical_name">seller_ogrn</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_bank" model="res.partner.contract.field">
|
||||
<field name="name">Seller Bank Name</field>
|
||||
<field name="technical_name">seller_bank</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_bank_account" model="res.partner.contract.field">
|
||||
<field name="name">Seller Bank Account</field>
|
||||
<field name="technical_name">seller_bank_account</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_seller_phone" model="res.partner.contract.field">
|
||||
<field name="name">Seller Phone</field>
|
||||
<field name="technical_name">seller_phone</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Partner -->
|
||||
|
||||
<record id="contract_field_partner_company_name" model="res.partner.contract.field">
|
||||
<field name="name">Partner Company Name</field>
|
||||
<field name="technical_name">partner_company_name</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_business_address" model="res.partner.contract.field">
|
||||
<field name="name">Partner Business Address</field>
|
||||
<field name="technical_name">partner_business_address</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_representer_name" model="res.partner.contract.field">
|
||||
<field name="name">Partner Representer Name</field>
|
||||
<field name="technical_name">partner_representer_name</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_representer_name_parent" model="res.partner.contract.field">
|
||||
<field name="name">Partner Representer Parent Name</field>
|
||||
<field name="technical_name">partner_representer_name_parent</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_representer_name_initials" model="res.partner.contract.field">
|
||||
<field name="name">Partner Representer Initials Name</field>
|
||||
<field name="technical_name">partner_representer_name_initials</field>
|
||||
<field name="description"></field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_representer_function" model="res.partner.contract.field">
|
||||
<field name="name">Partner Representer Function</field>
|
||||
<field name="technical_name">partner_representer_function</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_inn" model="res.partner.contract.field">
|
||||
<field name="name">Partner INN</field>
|
||||
<field name="technical_name">partner_inn</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_kpp" model="res.partner.contract.field">
|
||||
<field name="name">Partner KPP</field>
|
||||
<field name="technical_name">partner_kpp</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_bic" model="res.partner.contract.field">
|
||||
<field name="name">Partner BIC</field>
|
||||
<field name="technical_name">partner_bic</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_ogrn" model="res.partner.contract.field">
|
||||
<field name="name">Partner OGRN</field>
|
||||
<field name="technical_name">partner_ogrn</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_bank" model="res.partner.contract.field">
|
||||
<field name="name">Partner Bank Name</field>
|
||||
<field name="technical_name">partner_bank</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_bank_account" model="res.partner.contract.field">
|
||||
<field name="name">Partner Bank Account</field>
|
||||
<field name="technical_name">partner_bank_account</field>
|
||||
</record>
|
||||
|
||||
<record id="contract_field_partner_phone" model="res.partner.contract.field">
|
||||
<field name="name">Partner Phone</field>
|
||||
<field name="technical_name">partner_phone</field>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<!-- <record id="" model="res.partner.contract.field">
|
||||
<field name="name"></field>
|
||||
<field name="technical_name"></field>
|
||||
</record> -->
|
||||
|
||||
</data>
|
||||
</odoo>
|
@ -1,6 +1,8 @@
|
||||
from . import contract_wizard
|
||||
from . import res_partner
|
||||
from . import res_partner_contract
|
||||
from . import res_partner_contract_field
|
||||
from . import res_partner_contract_field_transient
|
||||
from . import sale_order
|
||||
|
||||
# TODO: rename all fields ilike 'adress' -> 'address'
|
||||
|
@ -4,6 +4,7 @@ import math
|
||||
from datetime import datetime
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
from pytils import numeral
|
||||
|
||||
from ..utils.docxtpl import get_document_from_values_stream
|
||||
@ -246,6 +247,12 @@ class ContractWizard(models.TransientModel):
|
||||
default='company'
|
||||
)
|
||||
|
||||
transient_field_ids = fields.One2many(
|
||||
'res.partner.contract.field.transient',
|
||||
'_contract_wizard_id',
|
||||
string="Contract Fields",
|
||||
)
|
||||
|
||||
@api.depends('contract_id')
|
||||
def _compute_context_name(self):
|
||||
self._context_name = self.contract_id.name
|
||||
@ -500,11 +507,43 @@ class ContractWizard(models.TransientModel):
|
||||
}
|
||||
return context
|
||||
|
||||
@api.onchange('partner_id')
|
||||
def _onchange_partner_id(self):
|
||||
"""Creates transient fields for generate contract template
|
||||
Looks as a tree view of *_contract_field_transient model in xml
|
||||
"""
|
||||
def get_contract_field(technical_name):
|
||||
return self.env['res.partner.contract.field'].search([
|
||||
('technical_name', '=', technical_name),
|
||||
])
|
||||
|
||||
contract_context_values = self.env.ref(
|
||||
'client_contracts.action_get_context').run()
|
||||
|
||||
self.transient_field_ids = [ # one2many
|
||||
(
|
||||
4,
|
||||
self.env['res.partner.contract.field.transient'].create({
|
||||
"contract_field_id": get_contract_field(field).id,
|
||||
"value": value,
|
||||
}).id,
|
||||
0,
|
||||
) for field, value in contract_context_values.items()
|
||||
]
|
||||
|
||||
def get_docx_contract(self):
|
||||
template = self.template.attachment_id
|
||||
if not template:
|
||||
raise UserError("Template must be set up")
|
||||
|
||||
path_to_template = template._full_path(template.store_fname)
|
||||
|
||||
fields = self._generate_context()
|
||||
fields = {
|
||||
transient_field.technical_name: transient_field.value
|
||||
for transient_field
|
||||
in self.transient_field_ids
|
||||
if transient_field.technical_name
|
||||
}
|
||||
|
||||
binary_data = get_document_from_values_stream(
|
||||
path_to_template, fields).read()
|
||||
|
22
models/res_partner_contract_field.py
Normal file
22
models/res_partner_contract_field.py
Normal file
@ -0,0 +1,22 @@
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ContractField(models.Model):
|
||||
_name = "res.partner.contract.field"
|
||||
_description = "Contract Field"
|
||||
|
||||
description = fields.Char(
|
||||
string="Description",
|
||||
translate=True,
|
||||
default="",
|
||||
)
|
||||
name = fields.Char(
|
||||
string="Name",
|
||||
required=True,
|
||||
translate=True,
|
||||
)
|
||||
technical_name = fields.Char(
|
||||
string="Technical Name",
|
||||
help="Name uses in template",
|
||||
required=True,
|
||||
)
|
39
models/res_partner_contract_field_transient.py
Normal file
39
models/res_partner_contract_field_transient.py
Normal file
@ -0,0 +1,39 @@
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class ContractFieldTransient(models.TransientModel):
|
||||
_name = "res.partner.contract.field.transient"
|
||||
_description = "Contract Field Transient"
|
||||
|
||||
_contract_wizard_id = fields.Many2one(
|
||||
'res.partner.contract.wizard',
|
||||
string='Contract',
|
||||
readonly=True,
|
||||
)
|
||||
contract_field_id = fields.Many2one(
|
||||
"res.partner.contract.field",
|
||||
string="Field",
|
||||
)
|
||||
technical_name = fields.Char(
|
||||
string="Technical Name",
|
||||
)
|
||||
name = fields.Char(
|
||||
string="Name",
|
||||
)
|
||||
description = fields.Char(
|
||||
string="Description",
|
||||
)
|
||||
value = fields.Char(
|
||||
string="Value",
|
||||
default="",
|
||||
)
|
||||
|
||||
@api.model
|
||||
def create(self, values):
|
||||
res = super().create(values)
|
||||
|
||||
res.technical_name = res.contract_field_id.technical_name
|
||||
res.name = res.contract_field_id.name
|
||||
res.description = res.contract_field_id.description
|
||||
|
||||
return res
|
@ -70,44 +70,14 @@
|
||||
</tree>
|
||||
</field>
|
||||
<group string="Contract values">
|
||||
<group string="Contract">
|
||||
<field name="_context_name"/>
|
||||
<field name="_context_date"/>
|
||||
<field name="_context_summ_rub"/>
|
||||
<field name="_context_summ_rub_word"/>
|
||||
<field name="_context_summ_kop"/>
|
||||
<field name="_context_summ_word"/>
|
||||
<field name="_context_delivery_term"/>
|
||||
<field name="_context_delivery_term_word"/>
|
||||
<field name="_context_payment_term"/>
|
||||
<field name="_context_payment_term_word"/>
|
||||
</group>
|
||||
<group string="Company values">
|
||||
<field name="_context_seller_contract_name"/>
|
||||
<field name="_context_seller_adress"/>
|
||||
<field name="_context_seller_representer_contract_job_name"/>
|
||||
<field name="_context_seller_representer_contract_name"/>
|
||||
<field name="_context_seller_inn"/>
|
||||
<field name="_context_seller_kpp"/>
|
||||
<field name="_context_seller_rs"/>
|
||||
<field name="_context_seller_bik"/>
|
||||
<field name="_context_seller_bank"/>
|
||||
<field name="_context_seller_phone"/>
|
||||
<field name="_context_seller_representer_job_name"/>
|
||||
<field name="_context_seller_representer_name"/>
|
||||
</group>
|
||||
<group string="Partner values">
|
||||
<field name="_context_partner_contract_name"/>
|
||||
<field name="_context_partner_adress"/>
|
||||
<field name="_context_partner_representer_contract_name"/>
|
||||
<field name="_context_partner_inn"/>
|
||||
<field name="_context_partner_kpp"/>
|
||||
<field name="_context_partner_rs"/>
|
||||
<field name="_context_partner_bik"/>
|
||||
<field name="_context_partner_bank"/>
|
||||
<field name="_context_partner_phone"/>
|
||||
<field name="_context_partner_representer_name"/>
|
||||
</group>
|
||||
<field name="transient_field_ids">
|
||||
<tree>
|
||||
<field name="technical_name"/>
|
||||
<field name="name"/>
|
||||
<field name="value"/>
|
||||
<field name="description"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
</group>
|
||||
<button string="Form DOCX from template" type="object" name="get_docx_contract" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user