From bde83307c918696ccb179d435cbc66f0284e9d10 Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Wed, 30 Nov 2016 13:45:34 -0800
Subject: [PATCH 1/6] [IMP] contract: Add templating * Add template
functionality for contracts
---
contract/README.rst | 1 +
contract/__manifest__.py | 1 +
contract/models/__init__.py | 7 +-
contract/models/account_analytic_contract.py | 66 ++++++++
.../models/account_analytic_invoice_line.py | 89 ++++++++++
...ontract.py => account_anayltic_account.py} | 155 +++---------------
.../models/{invoice.py => account_invoice.py} | 0
contract/security/ir.model.access.csv | 7 +-
contract/views/contract.xml | 3 +-
9 files changed, 193 insertions(+), 136 deletions(-)
create mode 100644 contract/models/account_analytic_contract.py
create mode 100644 contract/models/account_analytic_invoice_line.py
rename contract/models/{contract.py => account_anayltic_account.py} (58%)
rename contract/models/{invoice.py => account_invoice.py} (100%)
diff --git a/contract/README.rst b/contract/README.rst
index df13f6bfd7..449191a4cc 100644
--- a/contract/README.rst
+++ b/contract/README.rst
@@ -66,6 +66,7 @@ Contributors
* Pedro M. Baeza
* Carlos Dauden
* Angel Moya
+* Dave Lasley
Maintainer
----------
diff --git a/contract/__manifest__.py b/contract/__manifest__.py
index 173be551c9..172339dcfc 100644
--- a/contract/__manifest__.py
+++ b/contract/__manifest__.py
@@ -10,6 +10,7 @@
'license': 'AGPL-3',
'author': "OpenERP SA,"
"Tecnativa,"
+ "LasLabs, "
"Odoo Community Association (OCA)",
'website': 'https://github.com/oca/contract',
'depends': ['base', 'account', 'analytic'],
diff --git a/contract/models/__init__.py b/contract/models/__init__.py
index 8deef4105b..af0dd623b4 100644
--- a/contract/models/__init__.py
+++ b/contract/models/__init__.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
-# © 2016 Carlos Dauden
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from . import contract
-from . import invoice
+from . import account_analytic_contract
+from . import account_anayltic_account
+from . import account_analytic_invoice_line
+from . import account_invoice
diff --git a/contract/models/account_analytic_contract.py b/contract/models/account_analytic_contract.py
new file mode 100644
index 0000000000..eca4fca6d4
--- /dev/null
+++ b/contract/models/account_analytic_contract.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+# © 2004-2010 OpenERP SA
+# © 2014 Angel Moya
+# © 2015 Pedro M. Baeza
+# © 2016 Carlos Dauden
+# Copyright 2016 LasLabs Inc.
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models
+from odoo.addons import decimal_precision as dp
+from odoo.exceptions import ValidationError
+from odoo.tools.translate import _
+
+
+class AccountAnalyticContract(models.Model):
+ _name = 'account.analytic.contract'
+
+ pricelist_id = fields.Many2one(
+ comodel_name='product.pricelist',
+ string='Pricelist')
+ recurring_invoice_line_ids = fields.One2many(
+ comodel_name='account.analytic.invoice.line',
+ inverse_name='analytic_account_id',
+ copy=True,
+ string='Invoice Lines')
+ recurring_rule_type = fields.Selection(
+ [('daily', 'Day(s)'),
+ ('weekly', 'Week(s)'),
+ ('monthly', 'Month(s)'),
+ ('monthlylastday', 'Month(s) last day'),
+ ('yearly', 'Year(s)'),
+ ],
+ default='monthly',
+ string='Recurrency',
+ help="Specify Interval for automatic invoice generation.")
+ recurring_invoicing_type = fields.Selection(
+ [('pre-paid', 'Pre-paid'),
+ ('post-paid', 'Post-paid'),
+ ],
+ default='pre-paid',
+ string='Invoicing type',
+ help="Specify if process date is 'from' or 'to' invoicing date")
+ recurring_interval = fields.Integer(
+ default=1,
+ string='Repeat Every',
+ help="Repeat every (Days/Week/Month/Year)")
+ journal_id = fields.Many2one(
+ 'account.journal',
+ string='Journal',
+ default=lambda s: s._default_journal(),
+ domain="[('type', '=', 'sale'),('company_id', '=', company_id)]")
+
+ @api.model
+ def _default_journal(self):
+ company_id = self.env.context.get(
+ 'company_id', self.env.user.company_id.id)
+ domain = [
+ ('type', '=', 'sale'),
+ ('company_id', '=', company_id)]
+ return self.env['account.journal'].search(domain, limit=1)
+
+ @api.onchange('partner_id')
+ def _onchange_partner_id(self):
+ self.pricelist_id = self.partner_id.property_product_pricelist.id
diff --git a/contract/models/account_analytic_invoice_line.py b/contract/models/account_analytic_invoice_line.py
new file mode 100644
index 0000000000..e2f20048aa
--- /dev/null
+++ b/contract/models/account_analytic_invoice_line.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# © 2004-2010 OpenERP SA
+# © 2014 Angel Moya
+# © 2015 Pedro M. Baeza
+# © 2016 Carlos Dauden
+# Copyright 2016 LasLabs Inc.
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models
+from odoo.addons import decimal_precision as dp
+from odoo.exceptions import ValidationError
+from odoo.tools.translate import _
+
+
+class AccountAnalyticInvoiceLine(models.Model):
+ _name = 'account.analytic.invoice.line'
+
+ product_id = fields.Many2one(
+ 'product.product', string='Product', required=True)
+ analytic_account_id = fields.Many2one(
+ 'account.analytic.account', string='Analytic Account')
+ name = fields.Text(string='Description', required=True)
+ quantity = fields.Float(default=1.0, required=True)
+ uom_id = fields.Many2one(
+ 'product.uom', string='Unit of Measure', required=True)
+ price_unit = fields.Float('Unit Price', required=True)
+ price_subtotal = fields.Float(
+ compute='_compute_price_subtotal',
+ digits=dp.get_precision('Account'),
+ string='Sub Total')
+ discount = fields.Float(
+ string='Discount (%)',
+ digits=dp.get_precision('Discount'),
+ help='Discount that is applied in generated invoices.'
+ ' It should be less or equal to 100')
+
+ @api.multi
+ @api.depends('quantity', 'price_unit', 'discount')
+ def _compute_price_subtotal(self):
+ for line in self:
+ subtotal = line.quantity * line.price_unit
+ discount = line.discount / 100
+ subtotal *= 1 - discount
+ if line.analytic_account_id.pricelist_id:
+ cur = line.analytic_account_id.pricelist_id.currency_id
+ line.price_subtotal = cur.round(subtotal)
+ else:
+ line.price_subtotal = subtotal
+
+ @api.multi
+ @api.constrains('discount')
+ def _check_discount(self):
+ for line in self:
+ if line.discount > 100:
+ raise ValidationError(
+ _("Discount should be less or equal to 100"))
+
+ @api.multi
+ @api.onchange('product_id')
+ def _onchange_product_id(self):
+ if not self.product_id:
+ return {'domain': {'uom_id': []}}
+
+ vals = {}
+ domain = {'uom_id': [
+ ('category_id', '=', self.product_id.uom_id.category_id.id)]}
+ if not self.uom_id or (self.product_id.uom_id.category_id.id !=
+ self.uom_id.category_id.id):
+ vals['uom_id'] = self.product_id.uom_id
+
+ product = self.product_id.with_context(
+ lang=self.analytic_account_id.partner_id.lang,
+ partner=self.analytic_account_id.partner_id.id,
+ quantity=self.quantity,
+ date=self.analytic_account_id.recurring_next_date,
+ pricelist=self.analytic_account_id.pricelist_id.id,
+ uom=self.uom_id.id
+ )
+
+ name = product.name_get()[0][1]
+ if product.description_sale:
+ name += '\n' + product.description_sale
+ vals['name'] = name
+
+ vals['price_unit'] = product.price
+ self.update(vals)
+ return {'domain': domain}
diff --git a/contract/models/contract.py b/contract/models/account_anayltic_account.py
similarity index 58%
rename from contract/models/contract.py
rename to contract/models/account_anayltic_account.py
index 89bd5fbec9..4edb49bbd1 100644
--- a/contract/models/contract.py
+++ b/contract/models/account_anayltic_account.py
@@ -3,151 +3,48 @@
# © 2014 Angel Moya
# © 2015 Pedro M. Baeza
# © 2016 Carlos Dauden
+# Copyright 2016 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
-import logging
from odoo import api, fields, models
from odoo.addons import decimal_precision as dp
from odoo.exceptions import ValidationError
from odoo.tools.translate import _
-_logger = logging.getLogger(__name__)
-
-
-class AccountAnalyticInvoiceLine(models.Model):
- _name = 'account.analytic.invoice.line'
-
- product_id = fields.Many2one(
- 'product.product', string='Product', required=True)
- analytic_account_id = fields.Many2one(
- 'account.analytic.account', string='Analytic Account')
- name = fields.Text(string='Description', required=True)
- quantity = fields.Float(default=1.0, required=True)
- uom_id = fields.Many2one(
- 'product.uom', string='Unit of Measure', required=True)
- price_unit = fields.Float('Unit Price', required=True)
- price_subtotal = fields.Float(
- compute='_compute_price_subtotal',
- digits=dp.get_precision('Account'),
- string='Sub Total')
- discount = fields.Float(
- string='Discount (%)',
- digits=dp.get_precision('Discount'),
- help='Discount that is applied in generated invoices.'
- ' It should be less or equal to 100')
-
- @api.multi
- @api.depends('quantity', 'price_unit', 'discount')
- def _compute_price_subtotal(self):
- for line in self:
- subtotal = line.quantity * line.price_unit
- discount = line.discount / 100
- subtotal *= 1 - discount
- if line.analytic_account_id.pricelist_id:
- cur = line.analytic_account_id.pricelist_id.currency_id
- line.price_subtotal = cur.round(subtotal)
- else:
- line.price_subtotal = subtotal
-
- @api.multi
- @api.constrains('discount')
- def _check_discount(self):
- for line in self:
- if line.discount > 100:
- raise ValidationError(
- _("Discount should be less or equal to 100"))
-
- @api.multi
- @api.onchange('product_id')
- def _onchange_product_id(self):
- if not self.product_id:
- return {'domain': {'uom_id': []}}
-
- vals = {}
- domain = {'uom_id': [
- ('category_id', '=', self.product_id.uom_id.category_id.id)]}
- if not self.uom_id or (self.product_id.uom_id.category_id.id !=
- self.uom_id.category_id.id):
- vals['uom_id'] = self.product_id.uom_id
-
- product = self.product_id.with_context(
- lang=self.analytic_account_id.partner_id.lang,
- partner=self.analytic_account_id.partner_id.id,
- quantity=self.quantity,
- date=self.analytic_account_id.recurring_next_date,
- pricelist=self.analytic_account_id.pricelist_id.id,
- uom=self.uom_id.id
- )
-
- name = product.name_get()[0][1]
- if product.description_sale:
- name += '\n' + product.description_sale
- vals['name'] = name
-
- vals['price_unit'] = product.price
- self.update(vals)
- return {'domain': domain}
-
class AccountAnalyticAccount(models.Model):
- _inherit = 'account.analytic.account'
-
- @api.model
- def _default_journal(self):
- company_id = self.env.context.get(
- 'company_id', self.env.user.company_id.id)
- domain = [
- ('type', '=', 'sale'),
- ('company_id', '=', company_id)]
- return self.env['account.journal'].search(domain, limit=1)
-
- pricelist_id = fields.Many2one(
- comodel_name='product.pricelist',
- string='Pricelist')
+ _name = 'account.analytic.account'
+ _inherit = ['account.analytic.account',
+ 'account.analytic.contract',
+ ]
+
+ contract_template_id = fields.Many2one(
+ string='Contract Template',
+ comodel_name='account.analytic.contract',
+ )
date_start = fields.Date(default=fields.Date.context_today)
- recurring_invoice_line_ids = fields.One2many(
- comodel_name='account.analytic.invoice.line',
- inverse_name='analytic_account_id',
- copy=True,
- string='Invoice Lines')
recurring_invoices = fields.Boolean(
- string='Generate recurring invoices automatically')
- recurring_rule_type = fields.Selection(
- [('daily', 'Day(s)'),
- ('weekly', 'Week(s)'),
- ('monthly', 'Month(s)'),
- ('monthlylastday', 'Month(s) last day'),
- ('yearly', 'Year(s)'),
- ],
- default='monthly',
- string='Recurrency',
- help="Specify Interval for automatic invoice generation.")
- recurring_invoicing_type = fields.Selection(
- [('pre-paid', 'Pre-paid'),
- ('post-paid', 'Post-paid'),
- ],
- default='pre-paid',
- string='Invoicing type',
- help="Specify if process date is 'from' or 'to' invoicing date")
- recurring_interval = fields.Integer(
- default=1,
- string='Repeat Every',
- help="Repeat every (Days/Week/Month/Year)")
+ string='Generate recurring invoices automatically',
+ )
recurring_next_date = fields.Date(
default=fields.Date.context_today,
copy=False,
- string='Date of Next Invoice')
- journal_id = fields.Many2one(
- 'account.journal',
- string='Journal',
- default=_default_journal,
- domain="[('type', '=', 'sale'),('company_id', '=', company_id)]")
-
- @api.onchange('partner_id')
- def _onchange_partner_id(self):
- self.pricelist_id = self.partner_id.property_product_pricelist.id
+ string='Date of Next Invoice',
+ )
+
+ @api.onchange('contract_template_id')
+ def _onchange_contract_template_id(self):
+ """ It updates contract fields with that of the template """
+ contract = self.contract_template_id
+ for field_name, field in contract._fields.iteritems():
+ if any((
+ field.compute, field.related, field.automatic,
+ field.readonly, field.company_dependent,
+ )):
+ continue
+ self[field_name] = self.contract_template_id[field_name]
@api.onchange('recurring_invoices')
def _onchange_recurring_invoices(self):
diff --git a/contract/models/invoice.py b/contract/models/account_invoice.py
similarity index 100%
rename from contract/models/invoice.py
rename to contract/models/account_invoice.py
diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv
index d477bb7868..6939770a39 100644
--- a/contract/security/ir.model.access.csv
+++ b/contract/security/ir.model.access.csv
@@ -1,4 +1,5 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","account.group_account_manager",1,1,1,1
-"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","account.group_account_user",1,0,0,0
-
+"account_analytic_contract_manager","Recurring manager","model_account_analytic_contract","account.group_account_manager",1,1,1,1
+"account_analytic_contract_user","Recurring user","model_account_analytic_contract","account.group_account_user",1,0,0,0
+"account_analytic_contract_manager","Recurring manager","model_account_analytic_contract","account.group_account_manager",1,1,1,1
+"account_analytic_contract_user","Recurring user","model_account_analytic_contract","account.group_account_user",1,0,0,0
diff --git a/contract/views/contract.xml b/contract/views/contract.xml
index d9360d58ac..6541c39727 100644
--- a/contract/views/contract.xml
+++ b/contract/views/contract.xml
@@ -27,11 +27,12 @@
attrs="{'invisible': [('recurring_invoices','!=',True)]}"
string="Create invoices" class="oe_link"
groups="base.group_no_one"/>
-
+
From 3d294cef1f6d197fc3839454b899ec0652811e4a Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Mon, 26 Dec 2016 18:28:24 -0800
Subject: [PATCH 2/6] Add security for account.anayltic.invoice.line & fix
lints
---
contract/models/account_analytic_contract.py | 5 -----
contract/models/account_analytic_invoice_line.py | 2 --
contract/models/account_anayltic_account.py | 1 -
contract/security/ir.model.access.csv | 4 ++--
4 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/contract/models/account_analytic_contract.py b/contract/models/account_analytic_contract.py
index eca4fca6d4..80fa279ac9 100644
--- a/contract/models/account_analytic_contract.py
+++ b/contract/models/account_analytic_contract.py
@@ -6,12 +6,7 @@
# Copyright 2016 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from dateutil.relativedelta import relativedelta
-
from odoo import api, fields, models
-from odoo.addons import decimal_precision as dp
-from odoo.exceptions import ValidationError
-from odoo.tools.translate import _
class AccountAnalyticContract(models.Model):
diff --git a/contract/models/account_analytic_invoice_line.py b/contract/models/account_analytic_invoice_line.py
index e2f20048aa..e3a0487ad2 100644
--- a/contract/models/account_analytic_invoice_line.py
+++ b/contract/models/account_analytic_invoice_line.py
@@ -6,8 +6,6 @@
# Copyright 2016 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from dateutil.relativedelta import relativedelta
-
from odoo import api, fields, models
from odoo.addons import decimal_precision as dp
from odoo.exceptions import ValidationError
diff --git a/contract/models/account_anayltic_account.py b/contract/models/account_anayltic_account.py
index 4edb49bbd1..4907f4523d 100644
--- a/contract/models/account_anayltic_account.py
+++ b/contract/models/account_anayltic_account.py
@@ -9,7 +9,6 @@
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
-from odoo.addons import decimal_precision as dp
from odoo.exceptions import ValidationError
from odoo.tools.translate import _
diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv
index 6939770a39..75ca4b7285 100644
--- a/contract/security/ir.model.access.csv
+++ b/contract/security/ir.model.access.csv
@@ -1,5 +1,5 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"account_analytic_contract_manager","Recurring manager","model_account_analytic_contract","account.group_account_manager",1,1,1,1
"account_analytic_contract_user","Recurring user","model_account_analytic_contract","account.group_account_user",1,0,0,0
-"account_analytic_contract_manager","Recurring manager","model_account_analytic_contract","account.group_account_manager",1,1,1,1
-"account_analytic_contract_user","Recurring user","model_account_analytic_contract","account.group_account_user",1,0,0,0
+"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","account.group_account_manager",1,1,1,1
+"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","account.group_account_user",1,0,0,0
From a5b026bac160f52523ab0189923dfe21b47abd03 Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Wed, 28 Dec 2016 12:57:23 -0800
Subject: [PATCH 3/6] Add missing test coverage
---
contract/models/account_analytic_contract.py | 2 +-
contract/tests/test_contract.py | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/contract/models/account_analytic_contract.py b/contract/models/account_analytic_contract.py
index 80fa279ac9..8929a8906b 100644
--- a/contract/models/account_analytic_contract.py
+++ b/contract/models/account_analytic_contract.py
@@ -28,7 +28,7 @@ class AccountAnalyticContract(models.Model):
('yearly', 'Year(s)'),
],
default='monthly',
- string='Recurrency',
+ string='Recurrence',
help="Specify Interval for automatic invoice generation.")
recurring_invoicing_type = fields.Selection(
[('pre-paid', 'Pre-paid'),
diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py
index be2d17e687..90596f03d7 100644
--- a/contract/tests/test_contract.py
+++ b/contract/tests/test_contract.py
@@ -15,6 +15,13 @@ def setUp(self):
self.product.taxes_id += self.env['account.tax'].search(
[('type_tax_use', '=', 'sale')], limit=1)
self.product.description_sale = 'Test description sale'
+ self.template_vals = {
+ 'recurring_rule_type': 'yearly',
+ 'recurring_interval': 12345,
+ }
+ self.template = self.env['account.analytic.contract'].create(
+ self.template_vals,
+ )
self.contract = self.env['account.analytic.account'].create({
'name': 'Test Contract',
'partner_id': self.partner.id,
@@ -136,3 +143,13 @@ def test_check_journal(self):
journal.write({'type': 'general'})
with self.assertRaises(ValidationError):
contract_no_journal.recurring_create_invoice()
+
+ def test_onchange_contract_template_id(self):
+ """ It should change the contract values to match the template. """
+ self.contract.contract_template_id = self.template
+ self.contract._onchange_contract_template_id()
+ res = {
+ 'recurring_rule_type': self.contract.recurring_rule_type,
+ 'recurring_interval': self.contract.recurring_interval,
+ }
+ self.assertDictEqual(res, self.template_vals)
From 34ec56a1c7bf9c6f35d8a8c740324437f84bebbb Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Tue, 17 Jan 2017 11:50:50 -0800
Subject: [PATCH 4/6] PR fixes & add template views
---
contract/__manifest__.py | 11 +-
contract/models/__init__.py | 2 +-
...account.py => account_analytic_account.py} | 7 +-
contract/models/account_analytic_contract.py | 32 +++--
contract/tests/test_contract.py | 2 +
....xml => account_analytic_account_view.xml} | 20 ++--
.../views/account_analytic_contract_view.xml | 112 ++++++++++++++++++
contract/views/account_invoice_view.xml | 12 +-
8 files changed, 166 insertions(+), 32 deletions(-)
rename contract/models/{account_anayltic_account.py => account_analytic_account.py} (97%)
rename contract/views/{contract.xml => account_analytic_account_view.xml} (89%)
create mode 100644 contract/views/account_analytic_contract_view.xml
diff --git a/contract/__manifest__.py b/contract/__manifest__.py
index 172339dcfc..1b22ea139d 100644
--- a/contract/__manifest__.py
+++ b/contract/__manifest__.py
@@ -4,12 +4,12 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
- 'name': 'Contracts Management recurring',
- 'version': '10.0.1.0.0',
+ 'name': 'Contracts Management - Recurring',
+ 'version': '10.0.1.0.1',
'category': 'Contract Management',
'license': 'AGPL-3',
- 'author': "OpenERP SA,"
- "Tecnativa,"
+ 'author': "OpenERP SA, "
+ "Tecnativa, "
"LasLabs, "
"Odoo Community Association (OCA)",
'website': 'https://github.com/oca/contract',
@@ -17,7 +17,8 @@
'data': [
'security/ir.model.access.csv',
'data/contract_cron.xml',
- 'views/contract.xml',
+ 'views/account_analytic_account_view.xml',
+ 'views/account_analytic_contract_view.xml',
'views/account_invoice_view.xml',
],
'installable': True,
diff --git a/contract/models/__init__.py b/contract/models/__init__.py
index af0dd623b4..7edc9a63d3 100644
--- a/contract/models/__init__.py
+++ b/contract/models/__init__.py
@@ -2,6 +2,6 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import account_analytic_contract
-from . import account_anayltic_account
+from . import account_analytic_account
from . import account_analytic_invoice_line
from . import account_invoice
diff --git a/contract/models/account_anayltic_account.py b/contract/models/account_analytic_account.py
similarity index 97%
rename from contract/models/account_anayltic_account.py
rename to contract/models/account_analytic_account.py
index 4907f4523d..986effc839 100644
--- a/contract/models/account_anayltic_account.py
+++ b/contract/models/account_analytic_account.py
@@ -3,7 +3,7 @@
# © 2014 Angel Moya
# © 2015 Pedro M. Baeza
# © 2016 Carlos Dauden
-# Copyright 2016 LasLabs Inc.
+# Copyright 2016-2017 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
@@ -41,6 +41,7 @@ def _onchange_contract_template_id(self):
if any((
field.compute, field.related, field.automatic,
field.readonly, field.company_dependent,
+ field.name in self.NO_SYNC,
)):
continue
self[field_name] = self.contract_template_id[field_name]
@@ -50,6 +51,10 @@ def _onchange_recurring_invoices(self):
if self.date_start and self.recurring_invoices:
self.recurring_next_date = self.date_start
+ @api.onchange('partner_id')
+ def _onchange_partner_id(self):
+ self.pricelist_id = self.partner_id.property_product_pricelist.id
+
@api.model
def get_relative_delta(self, recurring_rule_type, interval):
if recurring_rule_type == 'daily':
diff --git a/contract/models/account_analytic_contract.py b/contract/models/account_analytic_contract.py
index 8929a8906b..6e46894aaf 100644
--- a/contract/models/account_analytic_contract.py
+++ b/contract/models/account_analytic_contract.py
@@ -3,7 +3,7 @@
# © 2014 Angel Moya
# © 2015 Pedro M. Baeza
# © 2016 Carlos Dauden
-# Copyright 2016 LasLabs Inc.
+# Copyright 2016-2017 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
@@ -12,14 +12,24 @@
class AccountAnalyticContract(models.Model):
_name = 'account.analytic.contract'
+ # These fields will not be synced to the contract
+ NO_SYNC = [
+ 'name',
+ ]
+
+ name = fields.Char(
+ required=True,
+ )
pricelist_id = fields.Many2one(
comodel_name='product.pricelist',
- string='Pricelist')
+ string='Pricelist',
+ )
recurring_invoice_line_ids = fields.One2many(
comodel_name='account.analytic.invoice.line',
inverse_name='analytic_account_id',
copy=True,
- string='Invoice Lines')
+ string='Invoice Lines',
+ )
recurring_rule_type = fields.Selection(
[('daily', 'Day(s)'),
('weekly', 'Week(s)'),
@@ -29,23 +39,27 @@ class AccountAnalyticContract(models.Model):
],
default='monthly',
string='Recurrence',
- help="Specify Interval for automatic invoice generation.")
+ help="Specify Interval for automatic invoice generation.",
+ )
recurring_invoicing_type = fields.Selection(
[('pre-paid', 'Pre-paid'),
('post-paid', 'Post-paid'),
],
default='pre-paid',
string='Invoicing type',
- help="Specify if process date is 'from' or 'to' invoicing date")
+ help="Specify if process date is 'from' or 'to' invoicing date",
+ )
recurring_interval = fields.Integer(
default=1,
string='Repeat Every',
- help="Repeat every (Days/Week/Month/Year)")
+ help="Repeat every (Days/Week/Month/Year)",
+ )
journal_id = fields.Many2one(
'account.journal',
string='Journal',
default=lambda s: s._default_journal(),
- domain="[('type', '=', 'sale'),('company_id', '=', company_id)]")
+ domain="[('type', '=', 'sale'),('company_id', '=', company_id)]",
+ )
@api.model
def _default_journal(self):
@@ -55,7 +69,3 @@ def _default_journal(self):
('type', '=', 'sale'),
('company_id', '=', company_id)]
return self.env['account.journal'].search(domain, limit=1)
-
- @api.onchange('partner_id')
- def _onchange_partner_id(self):
- self.pricelist_id = self.partner_id.property_product_pricelist.id
diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py
index 90596f03d7..8cef951268 100644
--- a/contract/tests/test_contract.py
+++ b/contract/tests/test_contract.py
@@ -18,6 +18,7 @@ def setUp(self):
self.template_vals = {
'recurring_rule_type': 'yearly',
'recurring_interval': 12345,
+ 'name': 'Test Contract Template',
}
self.template = self.env['account.analytic.contract'].create(
self.template_vals,
@@ -152,4 +153,5 @@ def test_onchange_contract_template_id(self):
'recurring_rule_type': self.contract.recurring_rule_type,
'recurring_interval': self.contract.recurring_interval,
}
+ del self.template_vals['name']
self.assertDictEqual(res, self.template_vals)
diff --git a/contract/views/contract.xml b/contract/views/account_analytic_account_view.xml
similarity index 89%
rename from contract/views/contract.xml
rename to contract/views/account_analytic_account_view.xml
index 6541c39727..949e1481ca 100644
--- a/contract/views/contract.xml
+++ b/contract/views/account_analytic_account_view.xml
@@ -1,22 +1,11 @@
-
- {'search_default_contract_id':
- [active_id],
- 'default_contract_id': active_id}
-
- Invoices
- account.invoice
-
-
-
-
account.analytic.account.invoice.recurring.form.inherit
account.analytic.account
-
+ primary
@@ -110,6 +99,11 @@
-
+
+
diff --git a/contract/views/account_analytic_contract_view.xml b/contract/views/account_analytic_contract_view.xml
new file mode 100644
index 0000000000..a7d2f4d112
--- /dev/null
+++ b/contract/views/account_analytic_contract_view.xml
@@ -0,0 +1,112 @@
+
+
+
+
+ Account Analytic Contract Form View
+ account.analytic.contract
+
+
+
+
+
+
+ Account Analytic Contract Tree View
+ account.analytic.contract
+
+
+
+
+
+
+
+
+
+
+
+
+ Account Analytic Contract Search View
+ account.analytic.contract
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contract Templates
+ account.analytic.contract
+ form
+ tree,form
+
+
+ Click to create a new contract template.
+
+
+
+
+
+
+
diff --git a/contract/views/account_invoice_view.xml b/contract/views/account_invoice_view.xml
index 9506a2f41b..89a35e1dc1 100644
--- a/contract/views/account_invoice_view.xml
+++ b/contract/views/account_invoice_view.xml
@@ -1,7 +1,6 @@
-
account.invoice.select.contract
account.invoice
@@ -14,4 +13,15 @@
+
+ {'search_default_contract_id':
+ [active_id],
+ 'default_contract_id': active_id}
+
+ Invoices
+ account.invoice
+
+
+
+
From 9d24dea301217622547d491d3eb4b71ab93dabc8 Mon Sep 17 00:00:00 2001
From: Dave Lasley
Date: Wed, 18 Jan 2017 16:44:11 -0800
Subject: [PATCH 5/6] [IMP] contract_variable_quantity: Move config menu to
contract * Move Contracts config menu from contract_variable_quantity to
contract
---
contract/views/account_analytic_contract_view.xml | 8 +++++++-
contract_variable_quantity/views/contract_view.xml | 5 -----
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/contract/views/account_analytic_contract_view.xml b/contract/views/account_analytic_contract_view.xml
index a7d2f4d112..a39f8e4ddb 100644
--- a/contract/views/account_analytic_contract_view.xml
+++ b/contract/views/account_analytic_contract_view.xml
@@ -103,8 +103,14 @@
-
+
+
diff --git a/contract_variable_quantity/views/contract_view.xml b/contract_variable_quantity/views/contract_view.xml
index f54b410702..5a5f5237ea 100644
--- a/contract_variable_quantity/views/contract_view.xml
+++ b/contract_variable_quantity/views/contract_view.xml
@@ -77,11 +77,6 @@
-