Browse Source

Merge pull request #170 from Eficent/11.0-imp-contract-adapted-to-purchase

[11.0][IMP] contract: adapted to purchase contracts
pull/145/head
Pedro M. Baeza 6 years ago
committed by GitHub
parent
commit
a995bc0b8d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      contract/README.rst
  2. 2
      contract/__manifest__.py
  3. 32
      contract/models/account_analytic_account.py
  4. 22
      contract/models/account_analytic_contract.py
  5. 1
      contract/models/account_analytic_contract_line.py
  6. 2
      contract/models/account_analytic_invoice_line.py
  7. 47
      contract/models/res_partner.py
  8. 1
      contract/readme/CONTRIBUTORS.rst
  9. 6
      contract/readme/DESCRIPTION.rst
  10. 51
      contract/tests/test_contract.py
  11. 109
      contract/views/account_analytic_account_view.xml
  12. 16
      contract/views/account_analytic_contract_view.xml
  13. 11
      contract/views/res_partner_view.xml

7
contract/README.rst

@ -25,10 +25,10 @@ Contracts Management - Recurring
|badge1| |badge2| |badge3| |badge4| |badge5| |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** **Table of contents**
@ -106,6 +106,7 @@ Contributors
* Angel Moya <angel.moya@domatix.com> * Angel Moya <angel.moya@domatix.com>
* Dave Lasley <dave@laslabs.com> * Dave Lasley <dave@laslabs.com>
* Vicent Cubells <vicent.cubells@tecnativa.com> * Vicent Cubells <vicent.cubells@tecnativa.com>
* Miquel Raïch <miquel.raich@eficent.com>
Maintainers Maintainers
~~~~~~~~~~~ ~~~~~~~~~~~

2
contract/__manifest__.py

@ -8,7 +8,7 @@
{ {
'name': 'Contracts Management - Recurring', 'name': 'Contracts Management - Recurring',
'version': '11.0.3.0.0',
'version': '11.0.4.0.0',
'category': 'Contract Management', 'category': 'Contract Management',
'license': 'AGPL-3', 'license': 'AGPL-3',
'author': "OpenERP SA, " 'author': "OpenERP SA, "

32
contract/models/account_analytic_account.py

@ -199,28 +199,38 @@ class AccountAnalyticAccount(models.Model):
return invoice_line_vals return invoice_line_vals
@api.multi @api.multi
def _prepare_invoice(self):
def _prepare_invoice(self, journal=None):
self.ensure_one() self.ensure_one()
if not self.partner_id: 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: if not journal:
raise ValidationError( 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 = ( currency = (
self.pricelist_id.currency_id or self.pricelist_id.currency_id or
self.partner_id.property_product_pricelist.currency_id or self.partner_id.property_product_pricelist.currency_id or
self.company_id.currency_id self.company_id.currency_id
) )
invoice_type = 'out_invoice'
if self.contract_type == 'purchase':
invoice_type = 'in_invoice'
invoice = self.env['account.invoice'].new({ invoice = self.env['account.invoice'].new({
'reference': self.code, 'reference': self.code,
'type': 'out_invoice',
'type': invoice_type,
'partner_id': self.partner_id.address_get( 'partner_id': self.partner_id.address_get(
['invoice'])['invoice'], ['invoice'])['invoice'],
'currency_id': currency.id, 'currency_id': currency.id,

22
contract/models/account_analytic_contract.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2004-2010 OpenERP SA # Copyright 2004-2010 OpenERP SA
# Copyright 2014 Angel Moya <angel.moya@domatix.com> # Copyright 2014 Angel Moya <angel.moya@domatix.com>
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com> # Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>
@ -26,6 +25,12 @@ class AccountAnalyticContract(models.Model):
comodel_name="res.partner", comodel_name="res.partner",
string="Partner (always False)", string="Partner (always False)",
) )
contract_type = fields.Selection(
selection=[
('sale', 'Customer'),
('purchase', 'Supplier'),
], default='sale',
)
pricelist_id = fields.Many2one( pricelist_id = fields.Many2one(
comodel_name='product.pricelist', comodel_name='product.pricelist',
string='Pricelist', string='Pricelist',
@ -64,7 +69,8 @@ class AccountAnalyticContract(models.Model):
'account.journal', 'account.journal',
string='Journal', string='Journal',
default=lambda s: s._default_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( company_id = fields.Many2one(
'res.company', 'res.company',
@ -73,11 +79,21 @@ class AccountAnalyticContract(models.Model):
default=lambda self: self.env.user.company_id, 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 @api.model
def _default_journal(self): def _default_journal(self):
company_id = self.env.context.get( company_id = self.env.context.get(
'company_id', self.env.user.company_id.id) 'company_id', self.env.user.company_id.id)
domain = [ domain = [
('type', '=', 'sale'),
('type', '=', self.contract_type),
('company_id', '=', company_id)] ('company_id', '=', company_id)]
return self.env['account.journal'].search(domain, limit=1) return self.env['account.journal'].search(domain, limit=1)

1
contract/models/account_analytic_contract_line.py

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Copyright 2004-2010 OpenERP SA # Copyright 2004-2010 OpenERP SA
# Copyright 2014 Angel Moya <angel.moya@domatix.com> # Copyright 2014 Angel Moya <angel.moya@domatix.com>
# Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com> # Copyright 2016 Carlos Dauden <carlos.dauden@tecnativa.com>

2
contract/models/account_analytic_invoice_line.py

@ -9,7 +9,7 @@ class AccountAnalyticInvoiceLine(models.Model):
_inherit = 'account.analytic.contract.line' _inherit = 'account.analytic.contract.line'
analytic_account_id = fields.Many2one( analytic_account_id = fields.Many2one(
'account.analytic.account',
comodel_name='account.analytic.account',
string='Analytic Account', string='Analytic Account',
required=True, required=True,
ondelete='cascade', ondelete='cascade',

47
contract/models/res_partner.py

@ -7,30 +7,45 @@ from odoo import fields, models
class ResPartner(models.Model): class ResPartner(models.Model):
_inherit = 'res.partner' _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', compute='_compute_contract_count',
) )
def _compute_contract_count(self): def _compute_contract_count(self):
Contract = self.env['account.analytic.account']
contract_model = self.env['account.analytic.account']
today = fields.Date.today() 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: 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): def act_show_contract(self):
""" This opens contract view """ This opens contract view
@return: the contract view @return: the contract view
""" """
self.ensure_one() 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( res.update(
context=dict( context=dict(
self.env.context, self.env.context,
@ -43,3 +58,11 @@ class ResPartner(models.Model):
), ),
) )
return res 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')

1
contract/readme/CONTRIBUTORS.rst

@ -3,3 +3,4 @@
* Angel Moya <angel.moya@domatix.com> * Angel Moya <angel.moya@domatix.com>
* Dave Lasley <dave@laslabs.com> * Dave Lasley <dave@laslabs.com>
* Vicent Cubells <vicent.cubells@tecnativa.com> * Vicent Cubells <vicent.cubells@tecnativa.com>
* Miquel Raïch <miquel.raich@eficent.com>

6
contract/readme/DESCRIPTION.rst

@ -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.

51
contract/tests/test_contract.py

@ -32,6 +32,15 @@ class TestContractBase(common.SavepointCase):
'date_start': '2016-02-15', 'date_start': '2016-02-15',
'recurring_next_date': '2016-02-29', '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 = { cls.line_vals = {
'analytic_account_id': cls.contract.id, 'analytic_account_id': cls.contract.id,
'product_id': cls.product.id, 'product_id': cls.product.id,
@ -233,6 +242,12 @@ class TestContract(TestContractBase):
result = self.contract.action_contract_send() result = self.contract.action_contract_send()
self.assertEqual(result['res_model'], 'mail.compose.message') 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): def test_contract_onchange_product_id_domain_blank(self):
"""It should return a blank UoM domain when no product.""" """It should return a blank UoM domain when no product."""
line = self.env['account.analytic.contract.line'].new() line = self.env['account.analytic.contract.line'].new()
@ -269,24 +284,27 @@ class TestContract(TestContractBase):
])) ]))
def test_contract_count(self): 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.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): def test_same_date_start_and_date_end(self):
"""It should create one invoice with same start and end date.""" """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({ self.contract.write({
'date_start': fields.Date.today(), 'date_start': fields.Date.today(),
'date_end': fields.Date.today(), 'date_end': fields.Date.today(),
'recurring_next_date': 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)]) [('contract_id', '=', self.contract.id)])
self.contract.cron_recurring_create_invoice() self.contract.cron_recurring_create_invoice()
last_count = AccountInvoice.search_count(
last_count = account_invoice_model.search_count(
[('contract_id', '=', self.contract.id)]) [('contract_id', '=', self.contract.id)])
self.assertEqual(last_count, init_count + 1) self.assertEqual(last_count, init_count + 1)
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
@ -305,14 +323,29 @@ class TestContract(TestContractBase):
self.assertFalse(self.contract.create_invoice_visibility) self.assertFalse(self.contract.create_invoice_visibility)
def test_extend_invoice(self): def test_extend_invoice(self):
AccountInvoice = self.env['account.invoice']
account_invoice_model = self.env['account.invoice']
self.contract.recurring_create_invoice() self.contract.recurring_create_invoice()
invoice = AccountInvoice.search(
invoice = account_invoice_model.search(
[('contract_id', '=', self.contract.id)]) [('contract_id', '=', self.contract.id)])
invoice.origin = 'Orig Invoice' invoice.origin = 'Orig Invoice'
self.contract._create_invoice(invoice) self.contract._create_invoice(invoice)
self.assertEqual(invoice.origin, 'Orig Invoice Test Contract') 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)]) [('contract_id', '=', self.contract.id)])
self.assertEqual(invoice_count, 1) self.assertEqual(invoice_count, 1)
self.assertEqual(len(invoice.invoice_line_ids), 2) 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.'
)

109
contract/views/account_analytic_account_view.xml

@ -16,6 +16,9 @@
<button name="action_contract_send" type="object" string="Send by Email" groups="base.group_user"/> <button name="action_contract_send" type="object" string="Send by Email" groups="base.group_user"/>
</header> </header>
</xpath> </xpath>
<xpath expr='//field[@name="code"]' position='before'>
<field name="contract_type" invisible="1" required="1"/>
</xpath>
<group name="main" position="after"> <group name="main" position="after">
<separator string="Recurring Invoices" <separator string="Recurring Invoices"
attrs="{'invisible': [('recurring_invoices','!=',True)]}" attrs="{'invisible': [('recurring_invoices','!=',True)]}"
@ -39,7 +42,7 @@
/> />
</div> </div>
<group col="4" attrs="{'invisible': [('recurring_invoices','!=',True)]}"> <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" <field name="journal_id"
attrs="{'required': [('recurring_invoices', '=', True)]}" attrs="{'required': [('recurring_invoices', '=', True)]}"
/> />
@ -95,6 +98,51 @@
</field> </field>
</record> </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 --> <!-- Inherited Analytic Account list for contracts -->
<record id="view_account_analytic_account_journal_tree" model="ir.ui.view"> <record id="view_account_analytic_account_journal_tree" model="ir.ui.view">
<field name="name">Contract list</field> <field name="name">Contract list</field>
@ -154,13 +202,14 @@
</record> </record>
<!-- Action Sales/Sales/Contracts --> <!-- 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="res_model">account.analytic.account</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,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"> <field name="help" type="html">
<p class="oe_view_nocontent_create"> <p class="oe_view_nocontent_create">
Click to create a new contract. Click to create a new contract.
@ -168,24 +217,60 @@
</field> </field>
</record> </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="sequence" eval="1"/>
<field name="view_mode">tree</field> <field name="view_mode">tree</field>
<field name="view_id" ref="view_account_analytic_account_journal_tree"/> <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>
<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="sequence" eval="2"/>
<field name="view_mode">form</field> <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> </record>
<menuitem id="menu_action_account_analytic_overdue_all"
<menuitem id="menu_action_account_analytic_sale_overdue_all"
parent="account.menu_finance_receivables_documents" parent="account.menu_finance_receivables_documents"
action="action_account_analytic_overdue_all"
action="action_account_analytic_sale_overdue_all"
sequence="99" 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> </odoo>

16
contract/views/account_analytic_contract_view.xml

@ -6,13 +6,15 @@
<field name="model">account.analytic.contract</field> <field name="model">account.analytic.contract</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Contract Template"> <form string="Contract Template">
<group name="name">
<field name="name"/>
</group>
<group name="group_main"> <group name="group_main">
<field name="company_id" invisible="1" />
<field name="name" />
<group name="group_main_left"> <group name="group_main_left">
<field name="contract_type" />
<field name="journal_id" /> <field name="journal_id" />
<field name="pricelist_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>
<group name="group_main_right"> <group name="group_main_right">
<field name="recurring_invoicing_type" /> <field name="recurring_invoicing_type" />
@ -37,7 +39,7 @@
<field name="name" /> <field name="name" />
<field name="quantity" /> <field name="quantity" />
<field name="uom_id" /> <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="price_unit" attrs="{'readonly': [('automatic_price', '=', True)]}"/>
<field name="specific_price" invisible="1"/> <field name="specific_price" invisible="1"/>
<field name="discount" groups="sale.group_discount_per_so_line" /> <field name="discount" groups="sale.group_discount_per_so_line" />
@ -61,6 +63,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Contract Templates"> <tree string="Contract Templates">
<field name="name" /> <field name="name" />
<field name="contract_type" />
<field name="recurring_rule_type" /> <field name="recurring_rule_type" />
<field name="recurring_interval" /> <field name="recurring_interval" />
<field name="recurring_invoicing_type" /> <field name="recurring_invoicing_type" />
@ -75,11 +78,15 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Contract Templates"> <search string="Contract Templates">
<field name="name" /> <field name="name" />
<field name="contract_type" />
<field name="recurring_rule_type" /> <field name="recurring_rule_type" />
<field name="recurring_interval" /> <field name="recurring_interval" />
<field name="recurring_invoicing_type" /> <field name="recurring_invoicing_type" />
<field name="pricelist_id" /> <field name="pricelist_id" />
<field name="journal_id" /> <field name="journal_id" />
<filter string="Contract Type"
context="{'group_by': 'contract_type'}"
/>
<filter string="Recurrence" <filter string="Recurrence"
context="{'group_by': 'recurring_rule_type'}" context="{'group_by': 'recurring_rule_type'}"
/> />
@ -101,6 +108,7 @@
<field name="res_model">account.analytic.contract</field> <field name="res_model">account.analytic.contract</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,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"> <field name="help" type="html">
<p class="oe_view_nocontent_create"> <p class="oe_view_nocontent_create">
Click to create a new contract template. Click to create a new contract template.

11
contract/views/res_partner_view.xml

@ -9,9 +9,14 @@
<field type="xml" name="arch"> <field type="xml" name="arch">
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button name="act_show_contract" type="object" class="oe_stat_button" <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> </button>
</xpath> </xpath>
</field> </field>

Loading…
Cancel
Save