offer creating feature is ready, time for offer template
This commit is contained in:
parent
a50f74e375
commit
9069b92175
@ -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">
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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"/>
|
||||
|
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user