offer creating feature is ready, time for offer template

This commit is contained in:
Alexandr 2021-05-11 23:58:05 +05:00
parent a50f74e375
commit 9069b92175
5 changed files with 253 additions and 5 deletions

View File

@ -2,7 +2,7 @@
<odoo>
<data>
<!-- Action -->
<!-- Action for contract -->
<record id="action_get_contract_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"/>
@ -153,7 +153,7 @@ action = ctx
</record>
<!-- Action -->
<!-- Action for annex -->
<record id="action_get_annex_context" model="ir.actions.server">
<field name="name">Generate Context for Annex</field>
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
@ -317,6 +317,162 @@ else:
"partner_ogrn": partner.psrn,
})
action = ctx
</field>
</record>
<!-- Action for sale order -->
<record id="action_get_so_context" model="ir.actions.server">
<field name="name">Generate Context for Sale order</field>
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
<field name="binding_model_id" ref="client_contracts.model_res_partner_contract_wizard" />
<field name="state">code</field>
<field name="code">
# Aliases
self = record # sale.order
seller = self.company_id.partner_id
partner = self.partner_id
# Functions
_ = self._t
# get_date = self.contract_id.get_date
# Parse date
months = ["",
"января", "февраля", "марта", "апреля",
"мая", "июня", "июля", "августа",
"сентября", "октября", "ноября", "декабря",
]
offer_date = self.date_order
dd = offer_date.day
mm = offer_date.month
yyyy = offer_date.year
yy = yyyy % 100
MM = months[mm]
dd = dd if dd // 10 else '0{}'.format(dd)
mm = mm if mm // 10 else '0{}'.format(mm)
# order_date = self.order_id.date_order
# ctx keys must be declared in this xml with id equal to "contract_field_{technical_name}"
ctx = {
"offer_name": self.name,
"offer_date": "{} {} {}".format(offer_date.day, months[offer_date.month], offer_date.year),
# "delivery_address": self.delivery_address,
"commitment_date": self.commitment_date,
"amount_total": self.amount_total,
# "payment_part_one": self.payment_part_one,
# "payment_part_two": self.payment_part_two,
# "payment_part_three": self.payment_part_three,
# "delivery_period": self.delivery_period,
"dd": dd,
"mm": mm,
"MM": MM,
"yy": yy,
"yyyy": yyyy,
"seller_name": seller.name_write,
"seller_company_form": _(dict(seller._fields['company_form'].selection).get(seller.company_form)),
# "seller_representer_name": seller.representative_id.name,
# "seller_representer_name_parent": seller.representative_id.name_genitive,
# "seller_representer_name_initials": seller.representative_id.name_initials,
# "seller_representer_function": seller.representative_id.function,
# "seller_representer_function_parent": seller.representative_id.function_genitive,
"seller_inn": seller.vat,
"seller_kpp": seller.iec,
"seller_ogrn": seller.psrn,
"seller_business_address": seller.full_address,
"seller_phone": seller.phone,
"seller_email": seller.email,
"partner_name": partner.name_write,
"partner_representer_name": partner.representative_id.name,
"partner_representer_name_initials": partner.representative_id.name_initials,
"partner_inn": partner.vat,
"partner_business_address": partner.full_address,
"partner_phone": partner.phone,
"partner_email": partner.email,
}
seller_bank = seller.bank_ids and seller.bank_ids[0]
if seller_bank:
bank = seller_bank.bank_id
bank_name = bank and bank.name or ""
bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else ""
seller_bank_name = "{} {}".format(bank_name, bank_city).strip()
ctx.update({
"seller_bank": seller_bank_name,
"seller_rs": seller_bank.acc_number,
"seller_ks": bank.corr_account,
"seller_bic": bank.bic,
})
partner_bank = partner.bank_ids and partner.bank_ids[0]
if partner_bank:
bank = partner_bank.bank_id
bank_name = bank and bank.name or ""
bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else ""
partner_bank_name = "{} {}".format(bank_name, bank_city).strip()
ctx.update({
"partner_bank": partner_bank_name,
"partner_rs": partner_bank.acc_number,
"partner_ks": bank.corr_account,
"partner_bic": bank.bic,
})
# Person
if not partner.is_company:
ctx.update({
# "partner_representer_name": partner.name_write,
# "partner_representer_name_initials": partner.name_initials,
# "partner_representer_passport_number": partner.passport_number,
# "partner_representer_passport_date": partner.passport_date,
# "partner_representer_passport_department": partner.passport_department,
})
if not partner.name_write:
ctx.update({
"partner_name": partner.name,
# "partner_representer_name": partner.name,
})
else:
# Company
ctx.update({
"partner_company_form": _(dict(partner._fields['company_form'].selection).get(partner.company_form)),
# "partner_representer_name_parent": partner.representative_id.name_genitive,
# "partner_representer_document_parent": partner.representative_document,
# "partner_representer_function": partner.representative_id.function,
# "partner_representer_function_parent": partner.representative_id.function_genitive,
})
if partner.company_form == 'sp':
# Sole Proprietor
ctx.update({
"partner_ip_number": partner.sp_register_number,
"partner_ip_date": partner.sp_register_date,
"partner_ogrnip": partner.psrn_sp,
# "partner_representer_passport_number": partner.representative_id.passport_number,
# "partner_representer_passport_date": partner.representative_id.passport_date,
# "partner_representer_passport_department": partner.representative_id.passport_department,
})
if partner.company_form == 'plc':
# Private Limited Company
ctx.update({
"partner_kpp": partner.iec,
"partner_ogrn": partner.psrn,
})
action = ctx
</field>
</record>
@ -339,6 +495,44 @@ action = ctx
</record>
<!-- Offer fields -->
<record id="contract_field_offer_name" model="res.partner.contract.field">
<field name="name">Offer name</field>
<field name="technical_name">offer_name</field>
<field name="description">Sale order number</field>
<field name="sequence">1</field>
</record>
<record id="contract_field_offer_date" model="res.partner.contract.field">
<field name="name">Offer date</field>
<field name="technical_name">offer_date</field>
<field name="description">
Sale order creation date or confirmation date, if confirmed.
</field>
<field name="sequence">2</field>
</record>
<record id="contract_field_commitment_date" model="res.partner.contract.field">
<field name="name">Commitment date</field>
<field name="technical_name">commitment_date</field>
<field name="description">
Date when executor's commitment should be fulfilled
</field>
<field name="sequence">3</field>
</record>
<record id="contract_field_amount_total" model="res.partner.contract.field">
<field name="name">Amount total</field>
<field name="technical_name">amount_total</field>
<field name="description">
Sale order total amount
</field>
<field name="sequence">4</field>
</record>
<!-- Common fields -->
<record id="contract_field_contract_number" model="res.partner.contract.field">

View File

@ -19,11 +19,13 @@ class DocumentTemplate(models.Model):
("contract", _("Contract")),
("annex", _("Annex")),
("addition", _("Addition")),
("offer", _("Offer")),
],
)
document_type_name = fields.Selection(
string="Document",
selection=[
("offer", _("Offer")),
("bill", _("Bill")),
("specification", _("Specification")),
("approval_list", _("Approval List")),
@ -42,6 +44,7 @@ class DocumentTemplate(models.Model):
selection=[
("contract", "Contract"),
("annex", "Annex"),
("offer", _("Offer")),
]
)
sequence = fields.Integer()

View File

@ -1,4 +1,4 @@
from odoo import api, fields, models
from odoo import api, fields, models, _
from ..utils import MODULE_NAME
@ -48,3 +48,42 @@ class SaleOrder(models.Model):
self.contract_annex_id = self.contract_annex_ids[0].id
else:
self.contract_annex_id = False
def action_print_form(self):
self.ensure_one()
view = self.env.ref(
"{}.res_partner_wizard_print_document_view".format(MODULE_NAME)
)
return {
"name": _("Print Form of Contract"),
"type": "ir.actions.act_window",
"res_model": "res.partner.contract.wizard",
"view_mode": "form",
"view_id": view.id,
"target": "new",
"context": {
"self_id": self.id,
"active_model": self._name,
"company_form": self.partner_id.company_form
if self.partner_id.is_company
else "person",
"attachment_model": "sale.order",
},
}
def get_filename_by_document_template(self, document_template_id):
self.ensure_one()
return "{doc_type} {number} {from_} {date}".format(
doc_type=_("Offer"),
number=self.name,
from_=_("from"),
date=self.date_order.strftime("%d.%m.%Y"),
)
@staticmethod
def _t(arg):
"""Uses in xml action (data/fields_default)
Arguments:
arg {str} -- String to translate
"""
return _(arg)

View File

@ -8,6 +8,10 @@
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="action_print_form" type="object" string="Create offer document"/>
</xpath>
<xpath expr="//field[@name='payment_term_id']" position="after">
<field name="delivery_time"/>
<field name="contract_annex_id" readonly="1"/>

View File

@ -1,3 +1,5 @@
import pdb
import base64
import logging
@ -29,6 +31,7 @@ class ContractWizard(models.TransientModel):
template_type = {
"res.partner.contract": "contract",
"res.partner.contract.annex": "annex",
"sale.order": "offer",
}.get(self.active_model, False)
company_type = self.env.context.get("company_form", False)
document_template_domain = [
@ -41,6 +44,7 @@ class ContractWizard(models.TransientModel):
selection=[
("res.partner.contract", "Contract"),
("res.partner.contract.annex", "Contract Annex"),
("sale.order", "Offer")
],
string="Target",
default=_default_target,
@ -133,6 +137,7 @@ class ContractWizard(models.TransientModel):
model_to_action = {
"res.partner.contract": "action_get_contract_context",
"res.partner.contract.annex": "action_get_annex_context",
"sale.order": "action_get_so_context",
}
action_external_id = "{}.{}".format(
MODULE_NAME, model_to_action[self.active_model]
@ -202,7 +207,7 @@ class ContractWizard(models.TransientModel):
}
)
)
pdb.set_trace()
return self.afterload(document_as_attachment)
def payload(self):
@ -259,6 +264,9 @@ class ContractWizard(models.TransientModel):
if hasattr(self.target, "contract_id"):
res_id = self.target.contract_id.id
self.env["mail.message"].create(
{
"model": self.env.context.get(