mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
Merge pull request #170 from Eficent/11.0-imp-contract-adapted-to-purchase
[11.0][IMP] contract: adapted to purchase contracts
This commit is contained in:
@@ -25,10 +25,10 @@ Contracts Management - Recurring
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
|
||||
This module brings back the contracts management with recurring invoicing
|
||||
features. Also you can print and send by email contract report.
|
||||
This module enables contracts management with recurring
|
||||
invoicing functions. Also you can print and send by email contract report.
|
||||
|
||||
In upstream Odoo, this functionality was moved into the Enterprise edition.
|
||||
It works for customer contract and supplier contracts.
|
||||
|
||||
**Table of contents**
|
||||
|
||||
@@ -106,6 +106,7 @@ Contributors
|
||||
* Angel Moya <angel.moya@domatix.com>
|
||||
* Dave Lasley <dave@laslabs.com>
|
||||
* Vicent Cubells <vicent.cubells@tecnativa.com>
|
||||
* Miquel Raïch <miquel.raich@eficent.com>
|
||||
|
||||
Maintainers
|
||||
~~~~~~~~~~~
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
{
|
||||
'name': 'Contracts Management - Recurring',
|
||||
'version': '11.0.3.0.0',
|
||||
'version': '11.0.4.0.0',
|
||||
'category': 'Contract Management',
|
||||
'license': 'AGPL-3',
|
||||
'author': "OpenERP SA, "
|
||||
|
||||
@@ -199,28 +199,38 @@ class AccountAnalyticAccount(models.Model):
|
||||
return invoice_line_vals
|
||||
|
||||
@api.multi
|
||||
def _prepare_invoice(self):
|
||||
def _prepare_invoice(self, journal=None):
|
||||
self.ensure_one()
|
||||
if not self.partner_id:
|
||||
raise ValidationError(
|
||||
_("You must first select a Customer for Contract %s!") %
|
||||
self.name)
|
||||
journal = self.journal_id or self.env['account.journal'].search(
|
||||
[('type', '=', 'sale'),
|
||||
('company_id', '=', self.company_id.id)],
|
||||
limit=1)
|
||||
if self.contract_type == 'purchase':
|
||||
raise ValidationError(
|
||||
_("You must first select a Supplier for Contract %s!") %
|
||||
self.name)
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("You must first select a Customer for Contract %s!") %
|
||||
self.name)
|
||||
if not journal:
|
||||
journal = self.journal_id or self.env['account.journal'].search([
|
||||
('type', '=', self.contract_type),
|
||||
('company_id', '=', self.company_id.id)
|
||||
], limit=1)
|
||||
if not journal:
|
||||
raise ValidationError(
|
||||
_("Please define a sale journal for the company '%s'.") %
|
||||
(self.company_id.name or '',))
|
||||
_("Please define a %s journal for the company '%s'.") %
|
||||
(self.contract_type, self.company_id.name or '')
|
||||
)
|
||||
currency = (
|
||||
self.pricelist_id.currency_id or
|
||||
self.partner_id.property_product_pricelist.currency_id or
|
||||
self.company_id.currency_id
|
||||
)
|
||||
invoice_type = 'out_invoice'
|
||||
if self.contract_type == 'purchase':
|
||||
invoice_type = 'in_invoice'
|
||||
invoice = self.env['account.invoice'].new({
|
||||
'reference': self.code,
|
||||
'type': 'out_invoice',
|
||||
'type': invoice_type,
|
||||
'partner_id': self.partner_id.address_get(
|
||||
['invoice'])['invoice'],
|
||||
'currency_id': currency.id,
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2004-2010 OpenERP SA
|
||||
# Copyright 2014 Angel Moya <angel.moya@domatix.com>
|
||||
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
@@ -26,6 +25,12 @@ class AccountAnalyticContract(models.Model):
|
||||
comodel_name="res.partner",
|
||||
string="Partner (always False)",
|
||||
)
|
||||
contract_type = fields.Selection(
|
||||
selection=[
|
||||
('sale', 'Customer'),
|
||||
('purchase', 'Supplier'),
|
||||
], default='sale',
|
||||
)
|
||||
pricelist_id = fields.Many2one(
|
||||
comodel_name='product.pricelist',
|
||||
string='Pricelist',
|
||||
@@ -64,7 +69,8 @@ class AccountAnalyticContract(models.Model):
|
||||
'account.journal',
|
||||
string='Journal',
|
||||
default=lambda s: s._default_journal(),
|
||||
domain="[('type', '=', 'sale'),('company_id', '=', company_id)]",
|
||||
domain="[('type', '=', contract_type),"
|
||||
"('company_id', '=', company_id)]",
|
||||
)
|
||||
company_id = fields.Many2one(
|
||||
'res.company',
|
||||
@@ -73,11 +79,21 @@ class AccountAnalyticContract(models.Model):
|
||||
default=lambda self: self.env.user.company_id,
|
||||
)
|
||||
|
||||
@api.onchange('contract_type')
|
||||
def _onchange_contract_type(self):
|
||||
if self.contract_type == 'purchase':
|
||||
self.recurring_invoice_line_ids.filtered('automatic_price').update(
|
||||
{'automatic_price': False})
|
||||
self.journal_id = self.env['account.journal'].search([
|
||||
('type', '=', self.contract_type),
|
||||
('company_id', '=', self.company_id.id)
|
||||
], limit=1)
|
||||
|
||||
@api.model
|
||||
def _default_journal(self):
|
||||
company_id = self.env.context.get(
|
||||
'company_id', self.env.user.company_id.id)
|
||||
domain = [
|
||||
('type', '=', 'sale'),
|
||||
('type', '=', self.contract_type),
|
||||
('company_id', '=', company_id)]
|
||||
return self.env['account.journal'].search(domain, limit=1)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2004-2010 OpenERP SA
|
||||
# Copyright 2014 Angel Moya <angel.moya@domatix.com>
|
||||
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
|
||||
|
||||
@@ -9,7 +9,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
||||
_inherit = 'account.analytic.contract.line'
|
||||
|
||||
analytic_account_id = fields.Many2one(
|
||||
'account.analytic.account',
|
||||
comodel_name='account.analytic.account',
|
||||
string='Analytic Account',
|
||||
required=True,
|
||||
ondelete='cascade',
|
||||
|
||||
@@ -7,30 +7,45 @@ from odoo import fields, models
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
contract_count = fields.Integer(
|
||||
string='Contracts',
|
||||
sale_contract_count = fields.Integer(
|
||||
string='Sale Contracts',
|
||||
compute='_compute_contract_count',
|
||||
)
|
||||
purchase_contract_count = fields.Integer(
|
||||
string='Purchase Contracts',
|
||||
compute='_compute_contract_count',
|
||||
)
|
||||
|
||||
def _compute_contract_count(self):
|
||||
Contract = self.env['account.analytic.account']
|
||||
contract_model = self.env['account.analytic.account']
|
||||
today = fields.Date.today()
|
||||
fetch_data = contract_model.read_group([
|
||||
('recurring_invoices', '=', True),
|
||||
('partner_id', 'child_of', self.ids),
|
||||
'|',
|
||||
('date_end', '=', False),
|
||||
('date_end', '>=', today)],
|
||||
['partner_id', 'contract_type'], ['partner_id', 'contract_type'],
|
||||
lazy=False)
|
||||
result = [[data['partner_id'][0], data['contract_type'],
|
||||
data['__count']] for data in fetch_data]
|
||||
for partner in self:
|
||||
partner.contract_count = Contract.search_count([
|
||||
('recurring_invoices', '=', True),
|
||||
('partner_id', 'child_of', partner.ids),
|
||||
'|',
|
||||
('date_end', '=', False),
|
||||
('date_end', '>=', today),
|
||||
])
|
||||
partner_child_ids = partner.child_ids.ids + partner.ids
|
||||
partner.sale_contract_count = sum([
|
||||
r[2] for r in result
|
||||
if r[0] in partner_child_ids and r[1] == 'sale'])
|
||||
partner.purchase_contract_count = sum([
|
||||
r[2] for r in result
|
||||
if r[0] in partner_child_ids and r[1] == 'purchase'])
|
||||
|
||||
def act_show_contract(self):
|
||||
""" This opens contract view
|
||||
@return: the contract view
|
||||
"""
|
||||
self.ensure_one()
|
||||
res = self.env['ir.actions.act_window'].for_xml_id(
|
||||
'contract', 'action_account_analytic_overdue_all')
|
||||
contract_type = self._context.get('contract_type')
|
||||
|
||||
res = self._get_act_window_contract_xml(contract_type)
|
||||
res.update(
|
||||
context=dict(
|
||||
self.env.context,
|
||||
@@ -43,3 +58,11 @@ class ResPartner(models.Model):
|
||||
),
|
||||
)
|
||||
return res
|
||||
|
||||
def _get_act_window_contract_xml(self, contract_type):
|
||||
if contract_type == 'purchase':
|
||||
return self.env['ir.actions.act_window'].for_xml_id(
|
||||
'contract', 'action_account_analytic_purchase_overdue_all')
|
||||
else:
|
||||
return self.env['ir.actions.act_window'].for_xml_id(
|
||||
'contract', 'action_account_analytic_sale_overdue_all')
|
||||
|
||||
@@ -3,3 +3,4 @@
|
||||
* Angel Moya <angel.moya@domatix.com>
|
||||
* Dave Lasley <dave@laslabs.com>
|
||||
* Vicent Cubells <vicent.cubells@tecnativa.com>
|
||||
* Miquel Raïch <miquel.raich@eficent.com>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
This module brings back the contracts management with recurring invoicing
|
||||
features. Also you can print and send by email contract report.
|
||||
This module enables contracts management with recurring
|
||||
invoicing functions. Also you can print and send by email contract report.
|
||||
|
||||
In upstream Odoo, this functionality was moved into the Enterprise edition.
|
||||
It works for customer contract and supplier contracts.
|
||||
|
||||
@@ -32,6 +32,15 @@ class TestContractBase(common.SavepointCase):
|
||||
'date_start': '2016-02-15',
|
||||
'recurring_next_date': '2016-02-29',
|
||||
})
|
||||
cls.contract2 = cls.env['account.analytic.account'].create({
|
||||
'name': 'Test Contract 2',
|
||||
'partner_id': cls.partner.id,
|
||||
'pricelist_id': cls.partner.property_product_pricelist.id,
|
||||
'recurring_invoices': True,
|
||||
'date_start': '2016-02-15',
|
||||
'recurring_next_date': '2016-02-29',
|
||||
'contract_type': 'purchase',
|
||||
})
|
||||
cls.line_vals = {
|
||||
'analytic_account_id': cls.contract.id,
|
||||
'product_id': cls.product.id,
|
||||
@@ -233,6 +242,12 @@ class TestContract(TestContractBase):
|
||||
result = self.contract.action_contract_send()
|
||||
self.assertEqual(result['res_model'], 'mail.compose.message')
|
||||
|
||||
def test_onchange_contract_type(self):
|
||||
self.contract._onchange_contract_type()
|
||||
self.assertEqual(self.contract.journal_id.type, 'sale')
|
||||
self.assertEqual(
|
||||
self.contract.journal_id.company_id, self.contract.company_id)
|
||||
|
||||
def test_contract_onchange_product_id_domain_blank(self):
|
||||
"""It should return a blank UoM domain when no product."""
|
||||
line = self.env['account.analytic.contract.line'].new()
|
||||
@@ -269,24 +284,27 @@ class TestContract(TestContractBase):
|
||||
]))
|
||||
|
||||
def test_contract_count(self):
|
||||
"""It should return contract count."""
|
||||
count = self.partner.contract_count + 2
|
||||
"""It should return sale contract count."""
|
||||
count = self.partner.sale_contract_count + 2
|
||||
self.contract.copy()
|
||||
self.contract.copy()
|
||||
self.assertEqual(self.partner.contract_count, count)
|
||||
self.assertEqual(self.partner.sale_contract_count, count)
|
||||
count = self.partner.purchase_contract_count + 1
|
||||
self.contract2.copy()
|
||||
self.assertEqual(self.partner.purchase_contract_count, count)
|
||||
|
||||
def test_same_date_start_and_date_end(self):
|
||||
"""It should create one invoice with same start and end date."""
|
||||
AccountInvoice = self.env['account.invoice']
|
||||
account_invoice_model = self.env['account.invoice']
|
||||
self.contract.write({
|
||||
'date_start': fields.Date.today(),
|
||||
'date_end': fields.Date.today(),
|
||||
'recurring_next_date': fields.Date.today(),
|
||||
})
|
||||
init_count = AccountInvoice.search_count(
|
||||
init_count = account_invoice_model.search_count(
|
||||
[('contract_id', '=', self.contract.id)])
|
||||
self.contract.cron_recurring_create_invoice()
|
||||
last_count = AccountInvoice.search_count(
|
||||
last_count = account_invoice_model.search_count(
|
||||
[('contract_id', '=', self.contract.id)])
|
||||
self.assertEqual(last_count, init_count + 1)
|
||||
with self.assertRaises(ValidationError):
|
||||
@@ -305,14 +323,29 @@ class TestContract(TestContractBase):
|
||||
self.assertFalse(self.contract.create_invoice_visibility)
|
||||
|
||||
def test_extend_invoice(self):
|
||||
AccountInvoice = self.env['account.invoice']
|
||||
account_invoice_model = self.env['account.invoice']
|
||||
self.contract.recurring_create_invoice()
|
||||
invoice = AccountInvoice.search(
|
||||
invoice = account_invoice_model.search(
|
||||
[('contract_id', '=', self.contract.id)])
|
||||
invoice.origin = 'Orig Invoice'
|
||||
self.contract._create_invoice(invoice)
|
||||
self.assertEqual(invoice.origin, 'Orig Invoice Test Contract')
|
||||
invoice_count = AccountInvoice.search_count(
|
||||
invoice_count = account_invoice_model.search_count(
|
||||
[('contract_id', '=', self.contract.id)])
|
||||
self.assertEqual(invoice_count, 1)
|
||||
self.assertEqual(len(invoice.invoice_line_ids), 2)
|
||||
|
||||
def test_act_show_contract(self):
|
||||
show_contract = self.partner.\
|
||||
with_context(contract_type='sale').act_show_contract()
|
||||
self.assertDictContainsSubset(
|
||||
{
|
||||
'name': 'Customer Contracts',
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'res_model': 'account.analytic.account',
|
||||
'xml_id': 'contract.action_account_analytic_sale_overdue_all',
|
||||
},
|
||||
show_contract,
|
||||
'There was an error and the view couldn\'t be opened.'
|
||||
)
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
<button name="action_contract_send" type="object" string="Send by Email" groups="base.group_user"/>
|
||||
</header>
|
||||
</xpath>
|
||||
<xpath expr='//field[@name="code"]' position='before'>
|
||||
<field name="contract_type" invisible="1" required="1"/>
|
||||
</xpath>
|
||||
<group name="main" position="after">
|
||||
<separator string="Recurring Invoices"
|
||||
attrs="{'invisible': [('recurring_invoices','!=',True)]}"
|
||||
@@ -39,7 +42,7 @@
|
||||
/>
|
||||
</div>
|
||||
<group col="4" attrs="{'invisible': [('recurring_invoices','!=',True)]}">
|
||||
<field name="contract_template_id" colspan="4"/>
|
||||
<field name="contract_template_id" colspan="4" domain="['|', ('contract_type', '=', contract_type), ('contract_type', '=', False)]" context="{'default_contract_type': contract_type}"/>
|
||||
<field name="journal_id"
|
||||
attrs="{'required': [('recurring_invoices', '=', True)]}"
|
||||
/>
|
||||
@@ -95,6 +98,51 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_analytic_account_sale_form" model="ir.ui.view">
|
||||
<field name="name">account.analytic.account.sale.form</field>
|
||||
<field name="model">account.analytic.account</field>
|
||||
<field name="inherit_id" ref="account_analytic_account_recurring_form_form"/>
|
||||
<field name="mode">primary</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="attributes">
|
||||
<attribute name="string">Customer</attribute>
|
||||
<attribute name="domain">[('customer', '=', True)]</attribute>
|
||||
<attribute name="context">{'default_customer': True, 'default_supplier': False}</attribute>
|
||||
</field>
|
||||
<field name="journal_id" position="attributes">
|
||||
<attribute name="domain">[('type', '=', 'sale')]</attribute>
|
||||
</field>
|
||||
<field name="product_id" position="attributes">
|
||||
<attribute name="domain">[('sale_ok', '=', True)]</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_analytic_account_purchase_form" model="ir.ui.view">
|
||||
<field name="name">account.analytic.account.purchase.form</field>
|
||||
<field name="model">account.analytic.account</field>
|
||||
<field name="inherit_id" ref="account_analytic_account_recurring_form_form"/>
|
||||
<field name="mode">primary</field>
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="attributes">
|
||||
<attribute name="string">Supplier</attribute>
|
||||
<attribute name="domain">[('supplier', '=', True)]</attribute>
|
||||
<attribute name="context">{'default_customer': False, 'default_supplier': True}</attribute>
|
||||
</field>
|
||||
<field name="journal_id" position="attributes">
|
||||
<attribute name="domain">[('type', '=', 'purchase')]</attribute>
|
||||
</field>
|
||||
<field name="product_id" position="attributes">
|
||||
<attribute name="domain">[('purchase_ok', '=', True)]</attribute>
|
||||
</field>
|
||||
<xpath expr="//field[@name='recurring_invoice_line_ids']/tree/field[@name='automatic_price']" position="attributes">
|
||||
<attribute name="invisible">True</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Inherited Analytic Account list for contracts -->
|
||||
<record id="view_account_analytic_account_journal_tree" model="ir.ui.view">
|
||||
<field name="name">Contract list</field>
|
||||
@@ -154,13 +202,14 @@
|
||||
</record>
|
||||
|
||||
<!-- Action Sales/Sales/Contracts -->
|
||||
<record id="action_account_analytic_overdue_all" model="ir.actions.act_window">
|
||||
<field name="name">Contracts</field>
|
||||
<record id="action_account_analytic_sale_overdue_all" model="ir.actions.act_window">
|
||||
<field name="name">Customer Contracts</field>
|
||||
<field name="res_model">account.analytic.account</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{'is_contract':1, 'search_default_not_finished':1, 'search_default_recurring_invoices':1, 'default_recurring_invoices': 1}</field>
|
||||
<field name="search_view_id" ref="analytic.view_account_analytic_account_search"/>
|
||||
<field name="domain">[('contract_type', '=', 'sale')]</field>
|
||||
<field name="context">{'is_contract':1, 'search_default_not_finished':1, 'search_default_recurring_invoices':1, 'default_recurring_invoices': 1, 'default_contract_type': 'sale'}</field>
|
||||
<field name="search_view_id" ref="view_account_analytic_account_contract_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new contract.
|
||||
@@ -168,24 +217,60 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_account_analytic_overdue_all_tree" model="ir.actions.act_window.view">
|
||||
<record id="action_account_analytic_sale_overdue_all_tree" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_account_analytic_account_journal_tree"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_overdue_all"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_sale_overdue_all"/>
|
||||
</record>
|
||||
|
||||
<record id="action_account_analytic_overdue_all_form" model="ir.actions.act_window.view">
|
||||
<record id="action_account_analytic_sale_overdue_all_form" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="account_analytic_account_recurring_form_form"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_overdue_all"/>
|
||||
<field name="view_id" ref="account_analytic_account_sale_form"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_sale_overdue_all"/>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_action_account_analytic_overdue_all"
|
||||
<menuitem id="menu_action_account_analytic_sale_overdue_all"
|
||||
parent="account.menu_finance_receivables_documents"
|
||||
action="action_account_analytic_overdue_all"
|
||||
action="action_account_analytic_sale_overdue_all"
|
||||
sequence="99"
|
||||
/>
|
||||
|
||||
<!-- Action Purchases/Purchases/Contracts -->
|
||||
<record id="action_account_analytic_purchase_overdue_all" model="ir.actions.act_window">
|
||||
<field name="name">Supplier Contracts</field>
|
||||
<field name="res_model">account.analytic.account</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('contract_type', '=', 'purchase')]</field>
|
||||
<field name="context">{'is_contract':1, 'search_default_not_finished':1, 'search_default_recurring_invoices':1, 'default_recurring_invoices': 1, 'default_contract_type': 'purchase'}</field>
|
||||
<field name="search_view_id" ref="view_account_analytic_account_contract_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new contract.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_account_analytic_purchase_overdue_all_tree" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_account_analytic_account_journal_tree"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_purchase_overdue_all"/>
|
||||
</record>
|
||||
|
||||
<record id="action_account_analytic_purchase_overdue_all_form" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="account_analytic_account_purchase_form"/>
|
||||
<field name="act_window_id" ref="action_account_analytic_purchase_overdue_all"/>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_action_account_analytic_purchase_overdue_all"
|
||||
parent="account.menu_finance_payables_documents"
|
||||
action="action_account_analytic_purchase_overdue_all"
|
||||
sequence="99"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -6,13 +6,15 @@
|
||||
<field name="model">account.analytic.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contract Template">
|
||||
<group name="name">
|
||||
<field name="name"/>
|
||||
</group>
|
||||
<group name="group_main">
|
||||
<field name="company_id" invisible="1" />
|
||||
<field name="name" />
|
||||
<group name="group_main_left">
|
||||
<field name="contract_type" />
|
||||
<field name="journal_id" />
|
||||
<field name="pricelist_id" />
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group name="group_main_right">
|
||||
<field name="recurring_invoicing_type" />
|
||||
@@ -37,7 +39,7 @@
|
||||
<field name="name" />
|
||||
<field name="quantity" />
|
||||
<field name="uom_id" />
|
||||
<field name="automatic_price"/>
|
||||
<field name="automatic_price" attrs="{'column_invisible': [('parent.contract_type','=','purchase')]}"/>
|
||||
<field name="price_unit" attrs="{'readonly': [('automatic_price', '=', True)]}"/>
|
||||
<field name="specific_price" invisible="1"/>
|
||||
<field name="discount" groups="sale.group_discount_per_so_line" />
|
||||
@@ -61,6 +63,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Contract Templates">
|
||||
<field name="name" />
|
||||
<field name="contract_type" />
|
||||
<field name="recurring_rule_type" />
|
||||
<field name="recurring_interval" />
|
||||
<field name="recurring_invoicing_type" />
|
||||
@@ -75,11 +78,15 @@
|
||||
<field name="arch" type="xml">
|
||||
<search string="Contract Templates">
|
||||
<field name="name" />
|
||||
<field name="contract_type" />
|
||||
<field name="recurring_rule_type" />
|
||||
<field name="recurring_interval" />
|
||||
<field name="recurring_invoicing_type" />
|
||||
<field name="pricelist_id" />
|
||||
<field name="journal_id" />
|
||||
<filter string="Contract Type"
|
||||
context="{'group_by': 'contract_type'}"
|
||||
/>
|
||||
<filter string="Recurrence"
|
||||
context="{'group_by': 'recurring_rule_type'}"
|
||||
/>
|
||||
@@ -101,6 +108,7 @@
|
||||
<field name="res_model">account.analytic.contract</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="search_view_id" ref="account_analytic_contract_view_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new contract template.
|
||||
|
||||
@@ -9,9 +9,14 @@
|
||||
<field type="xml" name="arch">
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="act_show_contract" type="object" class="oe_stat_button"
|
||||
icon="fa-book"
|
||||
help="Show the contracts for this partner">
|
||||
<field name="contract_count" widget="statinfo" string="Contracts"/>
|
||||
icon="fa-book" context="{'contract_type': 'sale'}"
|
||||
help="Show the sale contracts for this partner">
|
||||
<field name="sale_contract_count" widget="statinfo" string="Sale Contracts"/>
|
||||
</button>
|
||||
<button name="act_show_contract" type="object" class="oe_stat_button"
|
||||
icon="fa-book" context="{'contract_type': 'purchase'}"
|
||||
help="Show the purchase contracts for this partner">
|
||||
<field name="purchase_contract_count" widget="statinfo" string="Purchase Contracts"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
Reference in New Issue
Block a user