mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[REF] contract: Several things
[REF] use context_today instead of time in filters [REF] Contract: split from analytic account [REF] Contract Sale Invoicing: split from analytic account [REF] Contract Sale Invoicing: update translations [IMP] - Assert that the predecessor is available for new link at uncancel [RMV] - remove usless changes [RMV] - Remove usless field recurring_invoices after the total isolation between contract model and account analytic one. recurring_invoices which was used to mark analytic account as contract became usless [IMP] - P3 syntax [IMP] - use @openupgrade.migrate() and openupgrade.logged_query [IMP] - drop transient table in migration script
This commit is contained in:
committed by
Christopher Rogos
parent
2f405c546b
commit
489a79588d
@@ -9,19 +9,17 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Recurring - Contracts Management',
|
'name': 'Recurring - Contracts Management',
|
||||||
'version': '12.0.3.0.1',
|
'version': '12.0.4.0.0',
|
||||||
'category': 'Contract Management',
|
'category': 'Contract Management',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'author': "OpenERP SA, "
|
'author': "OpenERP SA, "
|
||||||
"Tecnativa, "
|
"Tecnativa, "
|
||||||
"LasLabs, "
|
"LasLabs, "
|
||||||
"ACSONE SA/NV, "
|
"Odoo Community Association (OCA)",
|
||||||
"Odoo Community Association (OCA)",
|
|
||||||
'website': 'https://github.com/oca/contract',
|
'website': 'https://github.com/oca/contract',
|
||||||
'depends': ['base', 'account', 'analytic', 'product'],
|
'depends': ['base', 'account', 'product'],
|
||||||
"external_dependencies": {"python": ["dateutil"]},
|
"external_dependencies": {"python": ["dateutil"]},
|
||||||
'data': [
|
'data': [
|
||||||
'wizards/contract_line_wizard.xml',
|
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'security/contract_security.xml',
|
'security/contract_security.xml',
|
||||||
'report/report_contract.xml',
|
'report/report_contract.xml',
|
||||||
@@ -29,11 +27,12 @@
|
|||||||
'data/contract_cron.xml',
|
'data/contract_cron.xml',
|
||||||
'data/contract_renew_cron.xml',
|
'data/contract_renew_cron.xml',
|
||||||
'data/mail_template.xml',
|
'data/mail_template.xml',
|
||||||
|
'wizards/contract_line_wizard.xml',
|
||||||
'views/abstract_contract_line.xml',
|
'views/abstract_contract_line.xml',
|
||||||
'views/contract.xml',
|
'views/contract.xml',
|
||||||
'views/contract_template_line.xml',
|
|
||||||
'views/contract_template.xml',
|
|
||||||
'views/contract_line.xml',
|
'views/contract_line.xml',
|
||||||
|
'views/contract_template.xml',
|
||||||
|
'views/contract_template_line.xml',
|
||||||
'views/res_partner_view.xml',
|
'views/res_partner_view.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding='UTF-8'?>
|
<?xml version="1.0" encoding='UTF-8'?>
|
||||||
<odoo noupdate="1">
|
<odoo noupdate="1">
|
||||||
|
|
||||||
<record model="ir.cron" id="account_analytic_cron_for_invoice">
|
<record model="ir.cron" id="contract_cron_for_invoice">
|
||||||
<field name="name">Generate Recurring Invoices from Contracts</field>
|
<field name="name">Generate Recurring Invoices from Contracts</field>
|
||||||
<field name="model_id" ref="analytic.model_account_analytic_account"/>
|
<field name="model_id" ref="model_contract_contract"/>
|
||||||
<field name="state">code</field>
|
<field name="state">code</field>
|
||||||
<field name="code">model.cron_recurring_create_invoice()</field>
|
<field name="code">model.cron_recurring_create_invoice()</field>
|
||||||
<field name="user_id" ref="base.user_root" />
|
<field name="user_id" ref="base.user_root" />
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<record model="ir.cron" id="contract_line_cron_for_renew">
|
<record model="ir.cron" id="contract_line_cron_for_renew">
|
||||||
<field name="name">Renew Contract lines</field>
|
<field name="name">Renew Contract lines</field>
|
||||||
<field name="model_id" ref="model_account_analytic_invoice_line"/>
|
<field name="model_id" ref="model_contract_line"/>
|
||||||
<field name="state">code</field>
|
<field name="state">code</field>
|
||||||
<field name="code">model.cron_renew_contract_line()</field>
|
<field name="code">model.cron_renew_contract_line()</field>
|
||||||
<field name="user_id" ref="base.user_root" />
|
<field name="user_id" ref="base.user_root" />
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field>
|
<field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</field>
|
||||||
<field name="subject">${object.company_id.name} Contract (Ref ${object.name or 'n/a'})</field>
|
<field name="subject">${object.company_id.name} Contract (Ref ${object.name or 'n/a'})</field>
|
||||||
<field name="partner_to">${object.partner_id.id}</field>
|
<field name="partner_to">${object.partner_id.id}</field>
|
||||||
<field name="model_id" ref="contract.model_account_analytic_account"/>
|
<field name="model_id" ref="model_contract_contract"/>
|
||||||
<field name="auto_delete" eval="True"/>
|
<field name="auto_delete" eval="True"/>
|
||||||
<field name="report_template" ref="contract.report_contract"/>
|
<field name="report_template" ref="contract.report_contract"/>
|
||||||
<field name="report_name">Contract</field>
|
<field name="report_name">Contract</field>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
def migrate(cr, version):
|
def migrate(cr, version):
|
||||||
"""Copy recurrence info from contract to contract lines and compute
|
"""Copy recurrence info from contract to contract lines and compute
|
||||||
last_date_invoiced"""
|
last_date_invoiced"""
|
||||||
|
_logger.info(">> Post-Migration 12.0.2.0.0")
|
||||||
cr.execute(
|
cr.execute(
|
||||||
"""UPDATE account_analytic_invoice_line AS contract_line
|
"""UPDATE account_analytic_invoice_line AS contract_line
|
||||||
SET recurring_rule_type=contract.recurring_rule_type,
|
SET recurring_rule_type=contract.recurring_rule_type,
|
||||||
@@ -23,8 +23,6 @@ def migrate(cr, version):
|
|||||||
FROM account_analytic_account AS contract
|
FROM account_analytic_account AS contract
|
||||||
WHERE contract.id=contract_line.contract_id"""
|
WHERE contract.id=contract_line.contract_id"""
|
||||||
)
|
)
|
||||||
|
|
||||||
_logger.info("order all contract line")
|
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
contract_lines = env["account.analytic.invoice.line"].search(
|
contract_lines = env["account.analytic.invoice.line"].search(
|
||||||
[("recurring_next_date", "!=", False)]
|
[("recurring_next_date", "!=", False)]
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ def migrate(cr, version):
|
|||||||
"""
|
"""
|
||||||
set recurring_next_date to false for finished contract
|
set recurring_next_date to false for finished contract
|
||||||
"""
|
"""
|
||||||
_logger.info("order all contract line")
|
_logger.info(">> Pre-Migration 12.0.2.0.0")
|
||||||
with api.Environment(cr, SUPERUSER_ID, {}) as env:
|
with api.Environment(cr, SUPERUSER_ID, {}) as env:
|
||||||
contracts = env["account.analytic.account"].search([])
|
contracts = env["account.analytic.account"].search([])
|
||||||
finished_contract = contracts.filtered(
|
finished_contract = contracts.filtered(
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
def migrate(cr, version):
|
def migrate(cr, version):
|
||||||
|
_logger.info(">> Post-Migration 12.0.3.0.0")
|
||||||
_logger.info("Populate invoicing partner field on contracts")
|
_logger.info("Populate invoicing partner field on contracts")
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
contracts = env["account.analytic.account"].search([])
|
contracts = env["account.analytic.account"].search([])
|
||||||
|
|||||||
152
contract/migrations/12.0.4.0.0/post-migration.py
Normal file
152
contract/migrations/12.0.4.0.0/post-migration.py
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# Copyright 2019 ACSONE SA/NV
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from openupgradelib import openupgrade
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@openupgrade.migrate()
|
||||||
|
def migrate(env, version):
|
||||||
|
cr = env.cr
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
INSERT INTO contract_contract (
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
partner_id,
|
||||||
|
pricelist_id,
|
||||||
|
contract_type,
|
||||||
|
journal_id,
|
||||||
|
company_id,
|
||||||
|
analytic_account_id,
|
||||||
|
active,
|
||||||
|
code,
|
||||||
|
group_id,
|
||||||
|
contract_template_id,
|
||||||
|
user_id,
|
||||||
|
recurring_next_date,
|
||||||
|
date_end,
|
||||||
|
payment_term_id,
|
||||||
|
fiscal_position_id,
|
||||||
|
invoice_partner_id,
|
||||||
|
message_main_attachment_id,
|
||||||
|
create_uid,
|
||||||
|
create_date,
|
||||||
|
write_uid,
|
||||||
|
write_date
|
||||||
|
)
|
||||||
|
SELECT id,
|
||||||
|
name,
|
||||||
|
partner_id,
|
||||||
|
pricelist_id,
|
||||||
|
contract_type,
|
||||||
|
journal_id,
|
||||||
|
company_id,
|
||||||
|
id,
|
||||||
|
active,
|
||||||
|
code,
|
||||||
|
group_id,
|
||||||
|
contract_template_id,
|
||||||
|
user_id,
|
||||||
|
recurring_next_date,
|
||||||
|
date_end,
|
||||||
|
payment_term_id,
|
||||||
|
fiscal_position_id,
|
||||||
|
invoice_partner_id,
|
||||||
|
message_main_attachment_id,
|
||||||
|
create_uid,
|
||||||
|
create_date,
|
||||||
|
write_uid,
|
||||||
|
write_date
|
||||||
|
FROM account_analytic_account
|
||||||
|
WHERE id in (
|
||||||
|
SELECT DISTINCT contract_id FROM account_analytic_invoice_line
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
INSERT INTO contract_line (
|
||||||
|
id,
|
||||||
|
product_id,
|
||||||
|
name,
|
||||||
|
quantity,
|
||||||
|
uom_id,
|
||||||
|
automatic_price,
|
||||||
|
specific_price,
|
||||||
|
discount,
|
||||||
|
recurring_rule_type,
|
||||||
|
recurring_invoicing_type,
|
||||||
|
recurring_interval,
|
||||||
|
sequence,
|
||||||
|
contract_id,
|
||||||
|
date_start,
|
||||||
|
date_end,
|
||||||
|
recurring_next_date,
|
||||||
|
last_date_invoiced,
|
||||||
|
termination_notice_date,
|
||||||
|
successor_contract_line_id,
|
||||||
|
predecessor_contract_line_id,
|
||||||
|
manual_renew_needed,
|
||||||
|
active,
|
||||||
|
create_uid,
|
||||||
|
create_date,
|
||||||
|
write_uid,
|
||||||
|
write_date
|
||||||
|
)
|
||||||
|
SELECT id,
|
||||||
|
product_id,
|
||||||
|
name,
|
||||||
|
quantity,
|
||||||
|
uom_id,
|
||||||
|
automatic_price,
|
||||||
|
specific_price,
|
||||||
|
discount,
|
||||||
|
recurring_rule_type,
|
||||||
|
recurring_invoicing_type,
|
||||||
|
recurring_interval,
|
||||||
|
sequence,
|
||||||
|
contract_id,
|
||||||
|
date_start,
|
||||||
|
date_end,
|
||||||
|
recurring_next_date,
|
||||||
|
last_date_invoiced,
|
||||||
|
termination_notice_date,
|
||||||
|
successor_contract_line_id,
|
||||||
|
predecessor_contract_line_id,
|
||||||
|
manual_renew_needed,
|
||||||
|
active,
|
||||||
|
create_uid,
|
||||||
|
create_date,
|
||||||
|
write_uid,
|
||||||
|
write_date
|
||||||
|
FROM account_analytic_invoice_line
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.rename_models(cr, [('account.analytic.invoice.line',
|
||||||
|
'contract.line')])
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
DROP TABLE account_analytic_invoice_line
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
UPDATE account_invoice_line
|
||||||
|
SET contract_line_id = contract_line_id_tmp
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
ALTER TABLE account_invoice_line
|
||||||
|
DROP COLUMN contract_line_id_tmp
|
||||||
|
"""
|
||||||
|
)
|
||||||
82
contract/migrations/12.0.4.0.0/pre-migration.py
Normal file
82
contract/migrations/12.0.4.0.0/pre-migration.py
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# Copyright 2019 ACSONE SA/NV
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from openupgradelib import openupgrade
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@openupgrade.migrate()
|
||||||
|
def migrate(env, version):
|
||||||
|
_logger.info(">> Pre-Migration 12.0.4.0.0")
|
||||||
|
cr = env.cr
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
DROP TABLE IF EXISTS account_analytic_invoice_line_wizard
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
models_to_rename = [
|
||||||
|
# Contract Line Wizard
|
||||||
|
('account.analytic.invoice.line.wizard', 'contract.line.wizard'),
|
||||||
|
# Abstract Contract
|
||||||
|
('account.abstract.analytic.contract', 'contract.abstract.contract'),
|
||||||
|
# Abstract Contract Line
|
||||||
|
('account.abstract.analytic.contract.line',
|
||||||
|
'contract.abstract.contract.line'),
|
||||||
|
# Contract Line
|
||||||
|
('account.analytic.invoice.line', 'contract.line'),
|
||||||
|
# Contract Template
|
||||||
|
('account.analytic.contract', 'contract.template'),
|
||||||
|
# Contract Template Line
|
||||||
|
('account.analytic.contract.line', 'contract.template.line'),
|
||||||
|
]
|
||||||
|
tables_to_rename = [
|
||||||
|
# Contract Template
|
||||||
|
('account_analytic_contract', 'contract_template'),
|
||||||
|
# Contract Template Line
|
||||||
|
('account_analytic_contract_line', 'contract_template_line'),
|
||||||
|
]
|
||||||
|
xmlids_to_rename = [
|
||||||
|
('contract.account_analytic_cron_for_invoice',
|
||||||
|
'contract.contract_cron_for_invoice'),
|
||||||
|
('contract.account_analytic_contract_manager',
|
||||||
|
'contract.contract_template_manager'),
|
||||||
|
('contract.account_analytic_contract_user',
|
||||||
|
'contract.contract_template_user'),
|
||||||
|
('contract.account_analytic_invoice_line_manager',
|
||||||
|
'contract.contract_line_manager'),
|
||||||
|
('contract.account_analytic_invoice_line_user',
|
||||||
|
'contract.contract_line_user'),
|
||||||
|
('contract.account_analytic_contract_line_manager',
|
||||||
|
'contract.contract_template_line_manager'),
|
||||||
|
('contract.account_analytic_contract_line_user',
|
||||||
|
'contract.contract_template_line_user'),
|
||||||
|
]
|
||||||
|
openupgrade.rename_models(cr, models_to_rename)
|
||||||
|
openupgrade.rename_tables(cr, tables_to_rename)
|
||||||
|
openupgrade.rename_xmlids(cr, xmlids_to_rename)
|
||||||
|
# A temporary column is needed to avoid breaking the foreign key constraint
|
||||||
|
# The temporary column is dropped in the post-migration script
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
ALTER TABLE account_invoice_line
|
||||||
|
ADD COLUMN contract_line_id_tmp INTEGER
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
UPDATE account_invoice_line
|
||||||
|
SET contract_line_id_tmp = contract_line_id
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
openupgrade.logged_query(
|
||||||
|
cr,
|
||||||
|
"""
|
||||||
|
UPDATE account_invoice_line SET contract_line_id = NULL
|
||||||
|
"""
|
||||||
|
)
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
from odoo import api, models, fields
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
class AbstractAccountAnalyticContract(models.AbstractModel):
|
class ContractAbstractContract(models.AbstractModel):
|
||||||
_name = 'account.abstract.analytic.contract'
|
_name = 'contract.abstract.contract'
|
||||||
_description = 'Abstract Recurring Contract'
|
_description = 'Abstract Recurring Contract'
|
||||||
|
|
||||||
# These fields will not be synced to the contract
|
# These fields will not be synced to the contract
|
||||||
@@ -50,7 +50,7 @@ class AbstractAccountAnalyticContract(models.AbstractModel):
|
|||||||
@api.onchange('contract_type')
|
@api.onchange('contract_type')
|
||||||
def _onchange_contract_type(self):
|
def _onchange_contract_type(self):
|
||||||
if self.contract_type == 'purchase':
|
if self.contract_type == 'purchase':
|
||||||
self.recurring_invoice_line_ids.filtered('automatic_price').update(
|
self.contract_line_ids.filtered('automatic_price').update(
|
||||||
{'automatic_price': False}
|
{'automatic_price': False}
|
||||||
)
|
)
|
||||||
self.journal_id = self.env['account.journal'].search(
|
self.journal_id = self.env['account.journal'].search(
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ from odoo.exceptions import ValidationError
|
|||||||
from odoo.tools.translate import _
|
from odoo.tools.translate import _
|
||||||
|
|
||||||
|
|
||||||
class AccountAbstractAnalyticContractLine(models.AbstractModel):
|
class ContractAbstractContractLine(models.AbstractModel):
|
||||||
_name = 'account.abstract.analytic.contract.line'
|
_name = 'contract.abstract.contract.line'
|
||||||
_description = 'Abstract Recurring Contract Line'
|
_description = 'Abstract Recurring Contract Line'
|
||||||
|
|
||||||
product_id = fields.Many2one(
|
product_id = fields.Many2one(
|
||||||
@@ -110,7 +110,7 @@ class AccountAbstractAnalyticContractLine(models.AbstractModel):
|
|||||||
)
|
)
|
||||||
contract_id = fields.Many2one(
|
contract_id = fields.Many2one(
|
||||||
string='Contract',
|
string='Contract',
|
||||||
comodel_name='account.abstract.analytic.contract',
|
comodel_name='contract.abstract.contract',
|
||||||
required=True,
|
required=True,
|
||||||
ondelete='cascade',
|
ondelete='cascade',
|
||||||
oldname='analytic_account_id',
|
oldname='analytic_account_id',
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ class AccountInvoice(models.Model):
|
|||||||
|
|
||||||
# We keep this field for migration purpose
|
# We keep this field for migration purpose
|
||||||
old_contract_id = fields.Many2one(
|
old_contract_id = fields.Many2one(
|
||||||
'account.analytic.account', oldname="contract_id"
|
'contract.contract', oldname="contract_id"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ class AccountInvoiceLine(models.Model):
|
|||||||
_inherit = 'account.invoice.line'
|
_inherit = 'account.invoice.line'
|
||||||
|
|
||||||
contract_line_id = fields.Many2one(
|
contract_line_id = fields.Many2one(
|
||||||
'account.analytic.invoice.line', string='Contract Line', index=True
|
'contract.line', string='Contract Line', index=True
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,25 +11,41 @@ from odoo.exceptions import ValidationError
|
|||||||
from odoo.tools.translate import _
|
from odoo.tools.translate import _
|
||||||
|
|
||||||
|
|
||||||
class AccountAnalyticAccount(models.Model):
|
class ContractContract(models.Model):
|
||||||
_name = 'account.analytic.account'
|
_name = 'contract.contract'
|
||||||
_inherit = [
|
_inherit = ['mail.thread', 'contract.abstract.contract']
|
||||||
'account.analytic.account',
|
|
||||||
'account.abstract.analytic.contract',
|
|
||||||
]
|
|
||||||
|
|
||||||
contract_template_id = fields.Many2one(
|
active = fields.Boolean(
|
||||||
string='Contract Template', comodel_name='account.analytic.contract'
|
default=True,
|
||||||
)
|
)
|
||||||
recurring_invoice_line_ids = fields.One2many(
|
code = fields.Char(
|
||||||
string='Invoice Lines',
|
string="Reference",
|
||||||
comodel_name='account.analytic.invoice.line',
|
)
|
||||||
|
group_id = fields.Many2one(
|
||||||
|
string="Group",
|
||||||
|
comodel_name='account.analytic.account',
|
||||||
|
ondelete='restrict',
|
||||||
|
)
|
||||||
|
analytic_account_id = fields.Many2one(
|
||||||
|
string="Analytic account",
|
||||||
|
comodel_name='account.analytic.account',
|
||||||
|
)
|
||||||
|
currency_id = fields.Many2one(
|
||||||
|
related="company_id.currency_id",
|
||||||
|
string="Currency",
|
||||||
|
readonly=True,
|
||||||
|
)
|
||||||
|
contract_template_id = fields.Many2one(
|
||||||
|
string='Contract Template', comodel_name='contract.template'
|
||||||
|
)
|
||||||
|
contract_line_ids = fields.One2many(
|
||||||
|
string='Contract lines',
|
||||||
|
comodel_name='contract.line',
|
||||||
inverse_name='contract_id',
|
inverse_name='contract_id',
|
||||||
copy=True,
|
copy=True,
|
||||||
|
oldnae='contract_line_ids',
|
||||||
)
|
)
|
||||||
recurring_invoices = fields.Boolean(
|
|
||||||
string='Generate recurring invoices automatically'
|
|
||||||
)
|
|
||||||
user_id = fields.Many2one(
|
user_id = fields.Many2one(
|
||||||
comodel_name='res.users',
|
comodel_name='res.users',
|
||||||
string='Responsible',
|
string='Responsible',
|
||||||
@@ -62,7 +78,9 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
ondelete='restrict',
|
ondelete='restrict',
|
||||||
)
|
)
|
||||||
partner_id = fields.Many2one(
|
partner_id = fields.Many2one(
|
||||||
comodel_name='res.partner', inverse='_inverse_partner_id'
|
comodel_name='res.partner',
|
||||||
|
inverse='_inverse_partner_id',
|
||||||
|
required=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
@@ -84,7 +102,7 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
(
|
(
|
||||||
'contract_line_id',
|
'contract_line_id',
|
||||||
'in',
|
'in',
|
||||||
self.recurring_invoice_line_ids.ids,
|
self.contract_line_ids.ids,
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@@ -127,31 +145,31 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
action['views'] = [(tree_view.id, 'tree'), (form_view.id, 'form')]
|
action['views'] = [(tree_view.id, 'tree'), (form_view.id, 'form')]
|
||||||
return action
|
return action
|
||||||
|
|
||||||
@api.depends('recurring_invoice_line_ids.date_end')
|
@api.depends('contract_line_ids.date_end')
|
||||||
def _compute_date_end(self):
|
def _compute_date_end(self):
|
||||||
for contract in self:
|
for contract in self:
|
||||||
contract.date_end = False
|
contract.date_end = False
|
||||||
date_end = contract.recurring_invoice_line_ids.mapped('date_end')
|
date_end = contract.contract_line_ids.mapped('date_end')
|
||||||
if date_end and all(date_end):
|
if date_end and all(date_end):
|
||||||
contract.date_end = max(date_end)
|
contract.date_end = max(date_end)
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
'recurring_invoice_line_ids.recurring_next_date',
|
'contract_line_ids.recurring_next_date',
|
||||||
'recurring_invoice_line_ids.is_canceled',
|
'contract_line_ids.is_canceled',
|
||||||
)
|
)
|
||||||
def _compute_recurring_next_date(self):
|
def _compute_recurring_next_date(self):
|
||||||
for contract in self:
|
for contract in self:
|
||||||
recurring_next_date = contract.recurring_invoice_line_ids.filtered(
|
recurring_next_date = contract.contract_line_ids.filtered(
|
||||||
lambda l: l.recurring_next_date and not l.is_canceled
|
lambda l: l.recurring_next_date and not l.is_canceled
|
||||||
).mapped('recurring_next_date')
|
).mapped('recurring_next_date')
|
||||||
if recurring_next_date:
|
if recurring_next_date:
|
||||||
contract.recurring_next_date = min(recurring_next_date)
|
contract.recurring_next_date = min(recurring_next_date)
|
||||||
|
|
||||||
@api.depends('recurring_invoice_line_ids.create_invoice_visibility')
|
@api.depends('contract_line_ids.create_invoice_visibility')
|
||||||
def _compute_create_invoice_visibility(self):
|
def _compute_create_invoice_visibility(self):
|
||||||
for contract in self:
|
for contract in self:
|
||||||
contract.create_invoice_visibility = any(
|
contract.create_invoice_visibility = any(
|
||||||
contract.recurring_invoice_line_ids.mapped(
|
contract.contract_line_ids.mapped(
|
||||||
'create_invoice_visibility'
|
'create_invoice_visibility'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -160,7 +178,7 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
def _onchange_contract_template_id(self):
|
def _onchange_contract_template_id(self):
|
||||||
"""Update the contract fields with that of the template.
|
"""Update the contract fields with that of the template.
|
||||||
|
|
||||||
Take special consideration with the `recurring_invoice_line_ids`,
|
Take special consideration with the `contract_line_ids`,
|
||||||
which must be created using the data from the contract lines. Cascade
|
which must be created using the data from the contract lines. Cascade
|
||||||
deletion ensures that any errant lines that are created are also
|
deletion ensures that any errant lines that are created are also
|
||||||
deleted.
|
deleted.
|
||||||
@@ -169,9 +187,9 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
if not contract_template_id:
|
if not contract_template_id:
|
||||||
return
|
return
|
||||||
for field_name, field in contract_template_id._fields.items():
|
for field_name, field in contract_template_id._fields.items():
|
||||||
if field.name == 'recurring_invoice_line_ids':
|
if field.name == 'contract_line_ids':
|
||||||
lines = self._convert_contract_lines(contract_template_id)
|
lines = self._convert_contract_lines(contract_template_id)
|
||||||
self.recurring_invoice_line_ids += lines
|
self.contract_line_ids += lines
|
||||||
elif not any(
|
elif not any(
|
||||||
(
|
(
|
||||||
field.compute,
|
field.compute,
|
||||||
@@ -207,21 +225,12 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@api.constrains('partner_id', 'recurring_invoices')
|
|
||||||
def _check_partner_id_recurring_invoices(self):
|
|
||||||
for contract in self.filtered('recurring_invoices'):
|
|
||||||
if not contract.partner_id:
|
|
||||||
raise ValidationError(
|
|
||||||
_("You must supply a partner for the contract '%s'")
|
|
||||||
% contract.name
|
|
||||||
)
|
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _convert_contract_lines(self, contract):
|
def _convert_contract_lines(self, contract):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
new_lines = self.env['account.analytic.invoice.line']
|
new_lines = self.env['contract.line']
|
||||||
contract_line_model = self.env['account.analytic.invoice.line']
|
contract_line_model = self.env['contract.line']
|
||||||
for contract_line in contract.recurring_invoice_line_ids:
|
for contract_line in contract.contract_line_ids:
|
||||||
vals = contract_line._convert_to_write(contract_line.read()[0])
|
vals = contract_line._convert_to_write(contract_line.read()[0])
|
||||||
# Remove template link field
|
# Remove template link field
|
||||||
vals.pop('contract_template_id', False)
|
vals.pop('contract_template_id', False)
|
||||||
@@ -282,7 +291,7 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
template = self.env.ref('contract.email_contract_template', False)
|
template = self.env.ref('contract.email_contract_template', False)
|
||||||
compose_form = self.env.ref('mail.email_compose_message_wizard_form')
|
compose_form = self.env.ref('mail.email_compose_message_wizard_form')
|
||||||
ctx = dict(
|
ctx = dict(
|
||||||
default_model='account.analytic.account',
|
default_model='contract.contract',
|
||||||
default_res_id=self.id,
|
default_res_id=self.id,
|
||||||
default_use_template=bool(template),
|
default_use_template=bool(template),
|
||||||
default_template_id=template and template.id or False,
|
default_template_id=template and template.id or False,
|
||||||
@@ -368,19 +377,14 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
def _get_contracts_to_invoice_domain(self, date_ref=None):
|
def _get_contracts_to_invoice_domain(self, date_ref=None):
|
||||||
"""
|
"""
|
||||||
This method builds the domain to use to find all
|
This method builds the domain to use to find all
|
||||||
contracts (account.analytic.account) to invoice.
|
contracts (contract.contract) to invoice.
|
||||||
:param date_ref: optional reference date to use instead of today
|
:param date_ref: optional reference date to use instead of today
|
||||||
:return: list (domain) usable on account.analytic.account
|
:return: list (domain) usable on contract.contract
|
||||||
"""
|
"""
|
||||||
domain = []
|
domain = []
|
||||||
if not date_ref:
|
if not date_ref:
|
||||||
date_ref = fields.Date.context_today(self)
|
date_ref = fields.Date.context_today(self)
|
||||||
domain.extend(
|
domain.extend([('recurring_next_date', '<=', date_ref)])
|
||||||
[
|
|
||||||
('recurring_invoices', '=', True),
|
|
||||||
('recurring_next_date', '<=', date_ref),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
return domain
|
return domain
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
@@ -389,10 +393,10 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
This method fetches and returns the lines to invoice on the contract
|
This method fetches and returns the lines to invoice on the contract
|
||||||
(self), based on the given date.
|
(self), based on the given date.
|
||||||
:param date_ref: date used as reference date to find lines to invoice
|
:param date_ref: date used as reference date to find lines to invoice
|
||||||
:return: contract lines (account.analytic.invoice.line recordset)
|
:return: contract lines (contract.line recordset)
|
||||||
"""
|
"""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
return self.recurring_invoice_line_ids.filtered(
|
return self.contract_line_ids.filtered(
|
||||||
lambda l: not l.is_canceled
|
lambda l: not l.is_canceled
|
||||||
and l.recurring_next_date
|
and l.recurring_next_date
|
||||||
and l.recurring_next_date <= date_ref
|
and l.recurring_next_date <= date_ref
|
||||||
|
|||||||
@@ -11,12 +11,15 @@ from odoo.exceptions import ValidationError
|
|||||||
from .contract_line_constraints import get_allowed
|
from .contract_line_constraints import get_allowed
|
||||||
|
|
||||||
|
|
||||||
class AccountAnalyticInvoiceLine(models.Model):
|
class ContractLine(models.Model):
|
||||||
_name = 'account.analytic.invoice.line'
|
_name = 'contract.line'
|
||||||
_inherit = 'account.abstract.analytic.contract.line'
|
_inherit = 'contract.abstract.contract.line'
|
||||||
|
|
||||||
|
sequence = fields.Integer(
|
||||||
|
string="Sequence",
|
||||||
|
)
|
||||||
contract_id = fields.Many2one(
|
contract_id = fields.Many2one(
|
||||||
comodel_name='account.analytic.account',
|
comodel_name='contract.contract',
|
||||||
string='Contract',
|
string='Contract',
|
||||||
required=True,
|
required=True,
|
||||||
index=True,
|
index=True,
|
||||||
@@ -43,7 +46,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
compute='_compute_create_invoice_visibility'
|
compute='_compute_create_invoice_visibility'
|
||||||
)
|
)
|
||||||
successor_contract_line_id = fields.Many2one(
|
successor_contract_line_id = fields.Many2one(
|
||||||
comodel_name='account.analytic.invoice.line',
|
comodel_name='contract.line',
|
||||||
string="Successor Contract Line",
|
string="Successor Contract Line",
|
||||||
required=False,
|
required=False,
|
||||||
readonly=True,
|
readonly=True,
|
||||||
@@ -53,7 +56,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
"contract line created.",
|
"contract line created.",
|
||||||
)
|
)
|
||||||
predecessor_contract_line_id = fields.Many2one(
|
predecessor_contract_line_id = fields.Many2one(
|
||||||
comodel_name='account.analytic.invoice.line',
|
comodel_name='contract.line',
|
||||||
string="Predecessor Contract Line",
|
string="Predecessor Contract Line",
|
||||||
required=False,
|
required=False,
|
||||||
readonly=True,
|
readonly=True,
|
||||||
@@ -452,7 +455,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
|
|
||||||
@api.constrains('recurring_next_date')
|
@api.constrains('recurring_next_date')
|
||||||
def _check_recurring_next_date_recurring_invoices(self):
|
def _check_recurring_next_date_recurring_invoices(self):
|
||||||
for rec in self.filtered('contract_id.recurring_invoices'):
|
for rec in self:
|
||||||
if not rec.recurring_next_date and (
|
if not rec.recurring_next_date and (
|
||||||
not rec.date_end
|
not rec.date_end
|
||||||
or not rec.last_date_invoiced
|
or not rec.last_date_invoiced
|
||||||
@@ -511,12 +514,11 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
invoice_line._onchange_product_id()
|
invoice_line._onchange_product_id()
|
||||||
invoice_line_vals = invoice_line._convert_to_write(invoice_line._cache)
|
invoice_line_vals = invoice_line._convert_to_write(invoice_line._cache)
|
||||||
# Insert markers
|
# Insert markers
|
||||||
contract = self.contract_id
|
|
||||||
name = self._insert_markers(dates[0], dates[1])
|
name = self._insert_markers(dates[0], dates[1])
|
||||||
invoice_line_vals.update(
|
invoice_line_vals.update(
|
||||||
{
|
{
|
||||||
'name': name,
|
'name': name,
|
||||||
'account_analytic_id': contract.id,
|
'account_analytic_id': self.contract_id.analytic_account_id.id,
|
||||||
'price_unit': self.price_unit,
|
'price_unit': self.price_unit,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -737,7 +739,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
successor_contract_line
|
successor_contract_line
|
||||||
:return: successor_contract_line
|
:return: successor_contract_line
|
||||||
"""
|
"""
|
||||||
contract_line = self.env['account.analytic.invoice.line']
|
contract_line = self.env['contract.line']
|
||||||
for rec in self:
|
for rec in self:
|
||||||
if not rec.is_plan_successor_allowed:
|
if not rec.is_plan_successor_allowed:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
@@ -804,7 +806,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_('Stop/Plan successor not allowed for this line')
|
_('Stop/Plan successor not allowed for this line')
|
||||||
)
|
)
|
||||||
contract_line = self.env['account.analytic.invoice.line']
|
contract_line = self.env['contract.line']
|
||||||
for rec in self:
|
for rec in self:
|
||||||
if rec.date_start >= date_start:
|
if rec.date_start >= date_start:
|
||||||
if rec.date_start < date_end:
|
if rec.date_start < date_end:
|
||||||
@@ -914,9 +916,9 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
contract.message_post(body=msg)
|
contract.message_post(body=msg)
|
||||||
for rec in self:
|
for rec in self:
|
||||||
if rec.predecessor_contract_line_id:
|
if rec.predecessor_contract_line_id:
|
||||||
rec.predecessor_contract_line_id.successor_contract_line_id = (
|
predecessor_contract_line = rec.predecessor_contract_line_id
|
||||||
rec
|
assert not predecessor_contract_line.successor_contract_line_id
|
||||||
)
|
predecessor_contract_line.successor_contract_line_id = rec
|
||||||
rec.is_canceled = False
|
rec.is_canceled = False
|
||||||
rec.recurring_next_date = recurring_next_date
|
rec.recurring_next_date = recurring_next_date
|
||||||
return True
|
return True
|
||||||
@@ -935,7 +937,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'name': 'Un-Cancel Contract Line',
|
'name': 'Un-Cancel Contract Line',
|
||||||
'res_model': 'account.analytic.invoice.line.wizard',
|
'res_model': 'contract.line.wizard',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
'view_mode': 'form',
|
'view_mode': 'form',
|
||||||
'views': [(view_id, 'form')],
|
'views': [(view_id, 'form')],
|
||||||
@@ -957,7 +959,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'name': 'Plan contract line successor',
|
'name': 'Plan contract line successor',
|
||||||
'res_model': 'account.analytic.invoice.line.wizard',
|
'res_model': 'contract.line.wizard',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
'view_mode': 'form',
|
'view_mode': 'form',
|
||||||
'views': [(view_id, 'form')],
|
'views': [(view_id, 'form')],
|
||||||
@@ -979,7 +981,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'name': 'Resiliate contract line',
|
'name': 'Resiliate contract line',
|
||||||
'res_model': 'account.analytic.invoice.line.wizard',
|
'res_model': 'contract.line.wizard',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
'view_mode': 'form',
|
'view_mode': 'form',
|
||||||
'views': [(view_id, 'form')],
|
'views': [(view_id, 'form')],
|
||||||
@@ -1001,7 +1003,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
return {
|
return {
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'name': 'Suspend contract line',
|
'name': 'Suspend contract line',
|
||||||
'res_model': 'account.analytic.invoice.line.wizard',
|
'res_model': 'contract.line.wizard',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
'view_mode': 'form',
|
'view_mode': 'form',
|
||||||
'views': [(view_id, 'form')],
|
'views': [(view_id, 'form')],
|
||||||
@@ -1020,7 +1022,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def renew(self):
|
def renew(self):
|
||||||
res = self.env['account.analytic.invoice.line']
|
res = self.env['contract.line']
|
||||||
for rec in self:
|
for rec in self:
|
||||||
is_auto_renew = rec.is_auto_renew
|
is_auto_renew = rec.is_auto_renew
|
||||||
rec.stop(rec.date_end, post_message=False)
|
rec.stop(rec.date_end, post_message=False)
|
||||||
@@ -1050,7 +1052,6 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
return [
|
return [
|
||||||
('is_auto_renew', '=', True),
|
('is_auto_renew', '=', True),
|
||||||
('is_canceled', '=', False),
|
('is_canceled', '=', False),
|
||||||
('contract_id.recurring_invoices', '=', True),
|
|
||||||
('termination_notice_date', '<=', fields.Date.context_today(self)),
|
('termination_notice_date', '<=', fields.Date.context_today(self)),
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1067,18 +1068,18 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
default_contract_type = self.env.context.get('default_contract_type')
|
default_contract_type = self.env.context.get('default_contract_type')
|
||||||
if view_type == 'tree' and default_contract_type == 'purchase':
|
if view_type == 'tree' and default_contract_type == 'purchase':
|
||||||
view_id = self.env.ref(
|
view_id = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_purchase_view_tree'
|
'contract.contract_line_supplier_tree_view'
|
||||||
).id
|
).id
|
||||||
if view_type == 'form':
|
if view_type == 'form':
|
||||||
if default_contract_type == 'purchase':
|
if default_contract_type == 'purchase':
|
||||||
view_id = self.env.ref(
|
view_id = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_purchase_view_form'
|
'contract.contract_line_supplier_form_view'
|
||||||
).id
|
).id
|
||||||
elif default_contract_type == 'sale':
|
elif default_contract_type == 'sale':
|
||||||
view_id = self.env.ref(
|
view_id = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_sale_view_form'
|
'contract.contract_line_customer_form_view'
|
||||||
).id
|
).id
|
||||||
return super(AccountAnalyticInvoiceLine, self).fields_view_get(
|
return super().fields_view_get(
|
||||||
view_id, view_type, toolbar, submenu
|
view_id, view_type, toolbar, submenu
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1089,7 +1090,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Contract line must be canceled before delete")
|
_("Contract line must be canceled before delete")
|
||||||
)
|
)
|
||||||
return super(AccountAnalyticInvoiceLine, self).unlink()
|
return super().unlink()
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _get_quantity_to_invoice(
|
def _get_quantity_to_invoice(
|
||||||
|
|||||||
@@ -9,14 +9,15 @@
|
|||||||
from odoo import fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class AccountAnalyticContract(models.Model):
|
class ContractTemplate(models.Model):
|
||||||
_name = 'account.analytic.contract'
|
_name = 'contract.template'
|
||||||
_inherit = 'account.abstract.analytic.contract'
|
_inherit = 'contract.abstract.contract'
|
||||||
_description = "Account Analytic Contract"
|
_description = "Contract Template"
|
||||||
|
|
||||||
recurring_invoice_line_ids = fields.One2many(
|
contract_line_ids = fields.One2many(
|
||||||
comodel_name='account.analytic.contract.line',
|
comodel_name='contract.template.line',
|
||||||
inverse_name='contract_id',
|
inverse_name='contract_id',
|
||||||
copy=True,
|
copy=True,
|
||||||
string='Invoice Lines',
|
string='Contract template lines',
|
||||||
|
oldname='contract_line_ids',
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,15 +9,15 @@
|
|||||||
from odoo import fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class AccountAnalyticContractLine(models.Model):
|
class ContractTemplateLine(models.Model):
|
||||||
_name = 'account.analytic.contract.line'
|
_name = 'contract.template.line'
|
||||||
_inherit = 'account.abstract.analytic.contract.line'
|
_inherit = 'contract.abstract.contract.line'
|
||||||
_description = 'Contract Lines'
|
_description = "Contract Template Line"
|
||||||
_order = "sequence,id"
|
_order = "sequence,id"
|
||||||
|
|
||||||
contract_id = fields.Many2one(
|
contract_id = fields.Many2one(
|
||||||
string='Contract',
|
string='Contract',
|
||||||
comodel_name='account.analytic.contract',
|
comodel_name='contract.template',
|
||||||
required=True,
|
required=True,
|
||||||
ondelete='cascade',
|
ondelete='cascade',
|
||||||
oldname='analytic_account_id',
|
oldname='analytic_account_id',
|
||||||
|
|||||||
@@ -8,43 +8,30 @@ class ResPartner(models.Model):
|
|||||||
_inherit = 'res.partner'
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
sale_contract_count = fields.Integer(
|
sale_contract_count = fields.Integer(
|
||||||
string='Sale Contracts', compute='_compute_contract_count'
|
string='Sale Contracts',
|
||||||
|
compute='_compute_contract_count',
|
||||||
)
|
)
|
||||||
purchase_contract_count = fields.Integer(
|
purchase_contract_count = fields.Integer(
|
||||||
string='Purchase Contracts', compute='_compute_contract_count'
|
string='Purchase Contracts',
|
||||||
|
compute='_compute_contract_count',
|
||||||
)
|
)
|
||||||
|
|
||||||
def _compute_contract_count(self):
|
def _compute_contract_count(self):
|
||||||
contract_model = self.env['account.analytic.account']
|
contract_model = self.env['contract.contract']
|
||||||
fetch_data = contract_model.read_group(
|
fetch_data = contract_model.read_group([
|
||||||
[
|
('partner_id', 'child_of', self.ids)],
|
||||||
('recurring_invoices', '=', True),
|
['partner_id', 'contract_type'], ['partner_id', 'contract_type'],
|
||||||
('partner_id', 'child_of', self.ids),
|
lazy=False)
|
||||||
],
|
result = [[data['partner_id'][0], data['contract_type'],
|
||||||
['partner_id', 'contract_type'],
|
data['__count']] for data in fetch_data]
|
||||||
['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_child_ids = partner.child_ids.ids + partner.ids
|
partner_child_ids = partner.child_ids.ids + partner.ids
|
||||||
partner.sale_contract_count = sum(
|
partner.sale_contract_count = sum([
|
||||||
[
|
r[2] for r in result
|
||||||
r[2]
|
if r[0] in partner_child_ids and r[1] == 'sale'])
|
||||||
for r in result
|
partner.purchase_contract_count = sum([
|
||||||
if r[0] in partner_child_ids and r[1] == 'sale'
|
r[2] for r in result
|
||||||
]
|
if r[0] in partner_child_ids and r[1] == 'purchase'])
|
||||||
)
|
|
||||||
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
|
||||||
@@ -57,21 +44,19 @@ class ResPartner(models.Model):
|
|||||||
res.update(
|
res.update(
|
||||||
context=dict(
|
context=dict(
|
||||||
self.env.context,
|
self.env.context,
|
||||||
search_default_recurring_invoices=True,
|
|
||||||
search_default_partner_id=self.id,
|
search_default_partner_id=self.id,
|
||||||
default_partner_id=self.id,
|
default_partner_id=self.id,
|
||||||
default_recurring_invoices=True,
|
|
||||||
default_pricelist_id=self.property_product_pricelist.id,
|
default_pricelist_id=self.property_product_pricelist.id,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _get_act_window_contract_xml(self, contract_type):
|
def _get_act_window_contract_xml(self, contract_type):
|
||||||
if contract_type == 'purchase':
|
if contract_type == 'purchase':
|
||||||
return self.env['ir.actions.act_window'].for_xml_id(
|
return self.env['ir.actions.act_window'].for_xml_id(
|
||||||
'contract', 'action_account_analytic_purchase_overdue_all'
|
'contract', 'action_supplier_contract'
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return self.env['ir.actions.act_window'].for_xml_id(
|
return self.env['ir.actions.act_window'].for_xml_id(
|
||||||
'contract', 'action_account_analytic_sale_overdue_all'
|
'contract', 'action_customer_contract'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<report
|
<report
|
||||||
id="report_contract"
|
id="report_contract"
|
||||||
model="account.analytic.account"
|
model="contract.contract"
|
||||||
string="Contract"
|
string="Contract"
|
||||||
report_type="qweb-pdf"
|
report_type="qweb-pdf"
|
||||||
name="contract.report_contract_document"
|
name="contract.report_contract_document"
|
||||||
|
|||||||
@@ -9,54 +9,34 @@
|
|||||||
<div class="oe_structure"/>
|
<div class="oe_structure"/>
|
||||||
<div class="row" id="partner_info">
|
<div class="row" id="partner_info">
|
||||||
<div class="col-xs-5 col-xs-offset-7">
|
<div class="col-xs-5 col-xs-offset-7">
|
||||||
<p id="partner_info">
|
<p id="partner_info"><strong>Partner:</strong></p>
|
||||||
<strong>Partner:</strong>
|
<div t-field="o.partner_id" t-field-options='{"widget": "contact", "fields": ["address", "name", "phone", "mobile", "fax", "email"], "no_marker": true, "phone_icons": true}'/>
|
||||||
</p>
|
<p t-if="o.partner_id.vat">VAT: <span t-field="o.partner_id.vat"/></p>
|
||||||
<div t-field="o.partner_id"
|
|
||||||
t-field-options='{"widget": "contact", "fields": ["address", "name", "phone", "mobile", "fax", "email"], "no_marker": true, "phone_icons": true}'/>
|
|
||||||
<p t-if="o.partner_id.vat">VAT:
|
|
||||||
<span t-field="o.partner_id.vat"/>
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row" id="header_info">
|
<div class="row" id="header_info">
|
||||||
<div class="col-xs-3">
|
<div class="col-xs-3">
|
||||||
<strong>Responsible:</strong>
|
<strong>Responsible: </strong><p t-field="o.user_id"/>
|
||||||
<p t-field="o.user_id"/>
|
<strong>Contract: </strong><p t-field="o.code"/>
|
||||||
<strong>Contract:</strong>
|
|
||||||
<p t-field="o.code"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row" id="invoice_info">
|
<div class="row" id="invoice_info">
|
||||||
<t t-set="total" t-value="0"/>
|
<t t-set="total" t-value="0"/>
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<t t-set="total" t-value="0"/>
|
<t t-set="total" t-value="0"/>
|
||||||
<p id="services_info">
|
<p id="services_info"><strong>Recurring Items</strong></p>
|
||||||
<strong>Recurring Items</strong>
|
|
||||||
</p>
|
|
||||||
<table class="table table-condensed">
|
<table class="table table-condensed">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th><strong>Description</strong></th>
|
||||||
<strong>Description</strong>
|
<th class="text-right"><strong>Quantity</strong></th>
|
||||||
</th>
|
<th class="text-right"><strong>Unit Price</strong></th>
|
||||||
<th class="text-right">
|
<th class="text-right"><strong>Price</strong></th>
|
||||||
<strong>Quantity</strong>
|
<th class="text-right"><strong>Date Start</strong></th>
|
||||||
</th>
|
|
||||||
<th class="text-right">
|
|
||||||
<strong>Unit Price</strong>
|
|
||||||
</th>
|
|
||||||
<th class="text-right">
|
|
||||||
<strong>Price</strong>
|
|
||||||
</th>
|
|
||||||
<th class="text-right">
|
|
||||||
<strong>Date Start</strong>
|
|
||||||
</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr t-foreach="o.recurring_invoice_line_ids"
|
<tr t-foreach="o.recurring_invoice_line_ids" t-as="l">
|
||||||
t-as="l">
|
|
||||||
<td>
|
<td>
|
||||||
<span t-field="l.name"/>
|
<span t-field="l.name"/>
|
||||||
</td>
|
</td>
|
||||||
@@ -64,18 +44,15 @@
|
|||||||
<span t-field="l.quantity"/>
|
<span t-field="l.quantity"/>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span t-field="l.price_unit"
|
<span t-field="l.price_unit" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
||||||
t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
|
||||||
</td>
|
</td>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span t-field="l.price_subtotal"
|
<span t-field="l.price_subtotal" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
||||||
t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span t-field="l.date_start"/>
|
<span t-field="l.date_start"/>
|
||||||
</td>
|
</td>
|
||||||
<t t-set="total"
|
<t t-set="total" t-value="total + l.price_subtotal"/>
|
||||||
t-value="total + l.price_subtotal"/>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -83,12 +60,9 @@
|
|||||||
<div class="col-xs-4 pull-right">
|
<div class="col-xs-4 pull-right">
|
||||||
<table class="table table-condensed">
|
<table class="table table-condensed">
|
||||||
<tr class="border-black">
|
<tr class="border-black">
|
||||||
<td>
|
<td><strong>Total</strong></td>
|
||||||
<strong>Total</strong>
|
|
||||||
</td>
|
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<span t-esc="total"
|
<span t-esc="total" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
||||||
t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<record id="rule_contract_template_multi_company" model="ir.rule">
|
<record id="rule_contract_template_multi_company" model="ir.rule">
|
||||||
<field name="name">Contract template multi-company</field>
|
<field name="name">Contract template multi-company</field>
|
||||||
<field name="model_id" ref="model_account_analytic_contract"/>
|
<field name="model_id" ref="model_contract_template"/>
|
||||||
<field name="global" eval="True"/>
|
<field name="global" eval="True"/>
|
||||||
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
|
<field name="domain_force">['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
"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
|
"contract_template_manager","Recurring manager","model_contract_template","account.group_account_manager",1,1,1,1
|
||||||
"account_analytic_contract_user","Recurring user","model_account_analytic_contract","account.group_account_invoice",1,0,0,0
|
"contract_template_user","Recurring user","model_contract_template","account.group_account_invoice",1,0,0,0
|
||||||
"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","account.group_account_manager",1,1,1,1
|
"contract_manager","Recurring manager","model_contract_contract","account.group_account_manager",1,1,1,1
|
||||||
"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","account.group_account_invoice",1,0,0,0
|
"contract_user","Recurring user","model_contract_contract","account.group_account_invoice",1,0,0,0
|
||||||
"account_analytic_contract_line_manager","Recurring manager","model_account_analytic_contract_line","account.group_account_manager",1,1,1,1
|
"contract_line_manager","Recurring manager","model_contract_line","account.group_account_manager",1,1,1,1
|
||||||
"account_analytic_contract_line_user","Recurring user","model_account_analytic_contract_line","account.group_account_invoice",1,0,0,0
|
"contract_line_user","Recurring user","model_contract_line","account.group_account_invoice",1,0,0,0
|
||||||
|
"contract_template_line_manager","Recurring manager","model_contract_template_line","account.group_account_manager",1,1,1,1
|
||||||
|
"contract_template_line_user","Recurring user","model_contract_template_line","account.group_account_invoice",1,0,0,0
|
||||||
|
|||||||
|
@@ -16,7 +16,7 @@ def to_date(date):
|
|||||||
class TestContractBase(common.SavepointCase):
|
class TestContractBase(common.SavepointCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(TestContractBase, cls).setUpClass()
|
super().setUpClass()
|
||||||
cls.today = fields.Date.today()
|
cls.today = fields.Date.today()
|
||||||
cls.partner = cls.env.ref('base.res_partner_2')
|
cls.partner = cls.env.ref('base.res_partner_2')
|
||||||
cls.product_1 = cls.env.ref('product.product_product_1')
|
cls.product_1 = cls.env.ref('product.product_product_1')
|
||||||
@@ -37,9 +37,9 @@ class TestContractBase(common.SavepointCase):
|
|||||||
}
|
}
|
||||||
cls.template_vals = {
|
cls.template_vals = {
|
||||||
'name': 'Test Contract Template',
|
'name': 'Test Contract Template',
|
||||||
'recurring_invoice_line_ids': [(0, 0, cls.line_template_vals)],
|
'contract_line_ids': [(0, 0, cls.line_template_vals)],
|
||||||
}
|
}
|
||||||
cls.template = cls.env['account.analytic.contract'].create(
|
cls.template = cls.env['contract.template'].create(
|
||||||
cls.template_vals
|
cls.template_vals
|
||||||
)
|
)
|
||||||
# For being sure of the applied price
|
# For being sure of the applied price
|
||||||
@@ -51,22 +51,20 @@ class TestContractBase(common.SavepointCase):
|
|||||||
'base': 'list_price',
|
'base': 'list_price',
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
cls.contract = cls.env['account.analytic.account'].create(
|
cls.contract = cls.env['contract.contract'].create(
|
||||||
{
|
{
|
||||||
'name': 'Test Contract',
|
'name': 'Test Contract',
|
||||||
'partner_id': cls.partner.id,
|
'partner_id': cls.partner.id,
|
||||||
'pricelist_id': cls.partner.property_product_pricelist.id,
|
'pricelist_id': cls.partner.property_product_pricelist.id,
|
||||||
'recurring_invoices': True,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
cls.contract2 = cls.env['account.analytic.account'].create(
|
cls.contract2 = cls.env['contract.contract'].create(
|
||||||
{
|
{
|
||||||
'name': 'Test Contract 2',
|
'name': 'Test Contract 2',
|
||||||
'partner_id': cls.partner.id,
|
'partner_id': cls.partner.id,
|
||||||
'pricelist_id': cls.partner.property_product_pricelist.id,
|
'pricelist_id': cls.partner.property_product_pricelist.id,
|
||||||
'recurring_invoices': True,
|
|
||||||
'contract_type': 'purchase',
|
'contract_type': 'purchase',
|
||||||
'recurring_invoice_line_ids': [
|
'contract_line_ids': [
|
||||||
(
|
(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@@ -100,7 +98,7 @@ class TestContractBase(common.SavepointCase):
|
|||||||
'recurring_next_date': '2018-01-15',
|
'recurring_next_date': '2018-01-15',
|
||||||
'is_auto_renew': False,
|
'is_auto_renew': False,
|
||||||
}
|
}
|
||||||
cls.acct_line = cls.env['account.analytic.invoice.line'].create(
|
cls.acct_line = cls.env['contract.line'].create(
|
||||||
cls.line_vals
|
cls.line_vals
|
||||||
)
|
)
|
||||||
cls.acct_line.product_id.is_auto_renew = True
|
cls.acct_line.product_id.is_auto_renew = True
|
||||||
@@ -115,7 +113,7 @@ class TestContract(TestContractBase):
|
|||||||
del vals['date_start']
|
del vals['date_start']
|
||||||
vals['contract_id'] = self.template.id
|
vals['contract_id'] = self.template.id
|
||||||
vals.update(overrides)
|
vals.update(overrides)
|
||||||
return self.env['account.analytic.contract.line'].create(vals)
|
return self.env['contract.template.line'].create(vals)
|
||||||
|
|
||||||
def test_check_discount(self):
|
def test_check_discount(self):
|
||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
@@ -141,8 +139,6 @@ class TestContract(TestContractBase):
|
|||||||
res = self.acct_line._onchange_product_id()
|
res = self.acct_line._onchange_product_id()
|
||||||
self.assertIn('uom_id', res['domain'])
|
self.assertIn('uom_id', res['domain'])
|
||||||
self.acct_line.price_unit = 100.0
|
self.acct_line.price_unit = 100.0
|
||||||
with self.assertRaises(ValidationError):
|
|
||||||
self.contract.partner_id = False
|
|
||||||
self.contract.partner_id = self.partner.id
|
self.contract.partner_id = self.partner.id
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
self.invoice_monthly = self.contract._get_related_invoices()
|
self.invoice_monthly = self.contract._get_related_invoices()
|
||||||
@@ -360,7 +356,7 @@ class TestContract(TestContractBase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_onchange_product_id(self):
|
def test_onchange_product_id(self):
|
||||||
line = self.env['account.analytic.invoice.line'].new()
|
line = self.env['contract.line'].new()
|
||||||
res = line._onchange_product_id()
|
res = line._onchange_product_id()
|
||||||
self.assertFalse(res['domain']['uom_id'])
|
self.assertFalse(res['domain']['uom_id'])
|
||||||
|
|
||||||
@@ -388,11 +384,6 @@ class TestContract(TestContractBase):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_check_recurring_next_date_recurring_invoices(self):
|
|
||||||
with self.assertRaises(ValidationError):
|
|
||||||
self.contract.write({'recurring_invoices': True})
|
|
||||||
self.acct_line.write({'recurring_next_date': False})
|
|
||||||
|
|
||||||
def test_onchange_contract_template_id(self):
|
def test_onchange_contract_template_id(self):
|
||||||
"""It should change the contract values to match the template."""
|
"""It should change the contract values to match the template."""
|
||||||
self.contract.contract_template_id = False
|
self.contract.contract_template_id = False
|
||||||
@@ -400,7 +391,7 @@ class TestContract(TestContractBase):
|
|||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
self.contract._onchange_contract_template_id()
|
self.contract._onchange_contract_template_id()
|
||||||
res = {
|
res = {
|
||||||
'recurring_invoice_line_ids': [
|
'contract_line_ids': [
|
||||||
(
|
(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@@ -427,15 +418,15 @@ class TestContract(TestContractBase):
|
|||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
|
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
self.contract.recurring_invoice_line_ids,
|
self.contract.contract_line_ids,
|
||||||
'Recurring lines were not removed.',
|
'Recurring lines were not removed.',
|
||||||
)
|
)
|
||||||
self.contract.contract_template_id = self.template
|
self.contract.contract_template_id = self.template
|
||||||
self.contract._onchange_contract_template_id()
|
self.contract._onchange_contract_template_id()
|
||||||
self.assertEqual(len(self.contract.recurring_invoice_line_ids), 1)
|
self.assertEqual(len(self.contract.contract_line_ids), 1)
|
||||||
|
|
||||||
for key, value in self.line_template_vals.items():
|
for key, value in self.line_template_vals.items():
|
||||||
test_value = self.contract.recurring_invoice_line_ids[0][key]
|
test_value = self.contract.contract_line_ids[0][key]
|
||||||
try:
|
try:
|
||||||
test_value = test_value.id
|
test_value = test_value.id
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
@@ -456,7 +447,7 @@ class TestContract(TestContractBase):
|
|||||||
self.contract._onchange_contract_type()
|
self.contract._onchange_contract_type()
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
any(
|
any(
|
||||||
self.contract.recurring_invoice_line_ids.mapped(
|
self.contract.contract_line_ids.mapped(
|
||||||
'automatic_price'
|
'automatic_price'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -464,7 +455,7 @@ class TestContract(TestContractBase):
|
|||||||
|
|
||||||
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['contract.template.line'].new()
|
||||||
res = line._onchange_product_id()
|
res = line._onchange_product_id()
|
||||||
self.assertFalse(res['domain']['uom_id'])
|
self.assertFalse(res['domain']['uom_id'])
|
||||||
|
|
||||||
@@ -533,8 +524,8 @@ class TestContract(TestContractBase):
|
|||||||
'name': 'Customer Contracts',
|
'name': 'Customer Contracts',
|
||||||
'type': 'ir.actions.act_window',
|
'type': 'ir.actions.act_window',
|
||||||
'view_type': 'form',
|
'view_type': 'form',
|
||||||
'res_model': 'account.analytic.account',
|
'res_model': 'contract.contract',
|
||||||
'xml_id': 'contract.action_account_analytic_sale_overdue_all',
|
'xml_id': 'contract.action_customer_contract',
|
||||||
},
|
},
|
||||||
show_contract,
|
show_contract,
|
||||||
'There was an error and the view couldn\'t be opened.',
|
'There was an error and the view couldn\'t be opened.',
|
||||||
@@ -605,7 +596,7 @@ class TestContract(TestContractBase):
|
|||||||
(to_date('2018-01-05'), 'post-paid', 'yearly', 1),
|
(to_date('2018-01-05'), 'post-paid', 'yearly', 1),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
contract_line_env = self.env['account.analytic.invoice.line']
|
contract_line_env = self.env['contract.line']
|
||||||
for recurring_next_date, combination in combinations:
|
for recurring_next_date, combination in combinations:
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
recurring_next_date,
|
recurring_next_date,
|
||||||
@@ -621,7 +612,7 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.contract.recurring_next_date,
|
self.contract.recurring_next_date,
|
||||||
min(
|
min(
|
||||||
self.contract.recurring_invoice_line_ids.mapped(
|
self.contract.contract_line_ids.mapped(
|
||||||
'recurring_next_date'
|
'recurring_next_date'
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@@ -701,7 +692,7 @@ class TestContract(TestContractBase):
|
|||||||
'is_auto_renew': True,
|
'is_auto_renew': True,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
wizard = self.env['account.analytic.invoice.line.wizard'].create(
|
wizard = self.env['contract.line.wizard'].create(
|
||||||
{
|
{
|
||||||
'date_end': self.today + relativedelta(months=3),
|
'date_end': self.today + relativedelta(months=3),
|
||||||
'contract_line_id': self.acct_line.id,
|
'contract_line_id': self.acct_line.id,
|
||||||
@@ -754,7 +745,7 @@ class TestContract(TestContractBase):
|
|||||||
suspension_start, suspension_end, True
|
suspension_start, suspension_end, True
|
||||||
)
|
)
|
||||||
self.assertEqual(self.acct_line.date_end, end_date)
|
self.assertEqual(self.acct_line.date_end, end_date)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -785,7 +776,7 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertTrue(new_line)
|
self.assertTrue(new_line)
|
||||||
@@ -826,7 +817,7 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertTrue(new_line)
|
self.assertTrue(new_line)
|
||||||
@@ -868,7 +859,7 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertTrue(new_line)
|
self.assertTrue(new_line)
|
||||||
@@ -906,7 +897,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end,
|
self.acct_line.date_end,
|
||||||
end_date + (suspension_end - start_date) + timedelta(days=1),
|
end_date + (suspension_end - start_date) + timedelta(days=1),
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -939,7 +930,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end,
|
self.acct_line.date_end,
|
||||||
end_date + (suspension_end - start_date) + timedelta(days=1),
|
end_date + (suspension_end - start_date) + timedelta(days=1),
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -970,7 +961,7 @@ class TestContract(TestContractBase):
|
|||||||
start_date + (suspension_end - start_date) + timedelta(days=1),
|
start_date + (suspension_end - start_date) + timedelta(days=1),
|
||||||
)
|
)
|
||||||
self.assertFalse(self.acct_line.date_end)
|
self.assertFalse(self.acct_line.date_end)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -1005,7 +996,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end,
|
self.acct_line.date_end,
|
||||||
end_date + (suspension_end - suspension_start) + timedelta(days=1),
|
end_date + (suspension_end - suspension_start) + timedelta(days=1),
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -1038,7 +1029,7 @@ class TestContract(TestContractBase):
|
|||||||
+ timedelta(days=1),
|
+ timedelta(days=1),
|
||||||
)
|
)
|
||||||
self.assertFalse(self.acct_line.date_end)
|
self.assertFalse(self.acct_line.date_end)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -1055,7 +1046,7 @@ class TestContract(TestContractBase):
|
|||||||
'date_end': end_date,
|
'date_end': end_date,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
wizard = self.env['account.analytic.invoice.line.wizard'].create(
|
wizard = self.env['contract.line.wizard'].create(
|
||||||
{
|
{
|
||||||
'date_start': suspension_start,
|
'date_start': suspension_start,
|
||||||
'date_end': suspension_end,
|
'date_end': suspension_end,
|
||||||
@@ -1074,7 +1065,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end,
|
self.acct_line.date_end,
|
||||||
end_date + (suspension_end - suspension_start) + timedelta(days=1),
|
end_date + (suspension_end - suspension_start) + timedelta(days=1),
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(new_line)
|
self.assertFalse(new_line)
|
||||||
@@ -1093,7 +1084,7 @@ class TestContract(TestContractBase):
|
|||||||
self.today + relativedelta(months=7),
|
self.today + relativedelta(months=7),
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(self.acct_line.is_auto_renew)
|
self.assertFalse(self.acct_line.is_auto_renew)
|
||||||
@@ -1120,7 +1111,7 @@ class TestContract(TestContractBase):
|
|||||||
self.today + relativedelta(months=7),
|
self.today + relativedelta(months=7),
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
@@ -1137,7 +1128,7 @@ class TestContract(TestContractBase):
|
|||||||
'is_auto_renew': False,
|
'is_auto_renew': False,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
wizard = self.env['account.analytic.invoice.line.wizard'].create(
|
wizard = self.env['contract.line.wizard'].create(
|
||||||
{
|
{
|
||||||
'date_start': self.today + relativedelta(months=3),
|
'date_start': self.today + relativedelta(months=3),
|
||||||
'date_end': self.today + relativedelta(months=5),
|
'date_end': self.today + relativedelta(months=5),
|
||||||
@@ -1146,7 +1137,7 @@ class TestContract(TestContractBase):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
wizard.plan_successor()
|
wizard.plan_successor()
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertFalse(self.acct_line.is_auto_renew)
|
self.assertFalse(self.acct_line.is_auto_renew)
|
||||||
@@ -1177,7 +1168,7 @@ class TestContract(TestContractBase):
|
|||||||
def test_uncancel_wizard(self):
|
def test_uncancel_wizard(self):
|
||||||
self.acct_line.cancel()
|
self.acct_line.cancel()
|
||||||
self.assertTrue(self.acct_line.is_canceled)
|
self.assertTrue(self.acct_line.is_canceled)
|
||||||
wizard = self.env['account.analytic.invoice.line.wizard'].create(
|
wizard = self.env['contract.line.wizard'].create(
|
||||||
{
|
{
|
||||||
'recurring_next_date': self.today,
|
'recurring_next_date': self.today,
|
||||||
'contract_line_id': self.acct_line.id,
|
'contract_line_id': self.acct_line.id,
|
||||||
@@ -1204,7 +1195,7 @@ class TestContract(TestContractBase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
self.acct_line.date_end, suspension_start - relativedelta(days=1)
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
|
self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
|
||||||
@@ -1235,7 +1226,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.stop_plan_successor(
|
self.acct_line.stop_plan_successor(
|
||||||
suspension_start, suspension_end, True
|
suspension_start, suspension_end, True
|
||||||
)
|
)
|
||||||
new_line = self.env['account.analytic.invoice.line'].search(
|
new_line = self.env['contract.line'].search(
|
||||||
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
[('predecessor_contract_line_id', '=', self.acct_line.id)]
|
||||||
)
|
)
|
||||||
new_line.cancel()
|
new_line.cancel()
|
||||||
@@ -1324,12 +1315,13 @@ class TestContract(TestContractBase):
|
|||||||
contracts = self.contract2
|
contracts = self.contract2
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
contracts |= self.contract.copy()
|
contracts |= self.contract.copy()
|
||||||
self.env['account.analytic.account'].cron_recurring_create_invoice()
|
self.env['contract.contract'].cron_recurring_create_invoice()
|
||||||
invoice_lines = self.env['account.invoice.line'].search(
|
invoice_lines = self.env['account.invoice.line'].search(
|
||||||
[('account_analytic_id', 'in', contracts.ids)]
|
[('contract_line_id', 'in',
|
||||||
|
contracts.mapped('contract_line_ids').ids)]
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(contracts.mapped('recurring_invoice_line_ids')),
|
len(contracts.mapped('contract_line_ids')),
|
||||||
len(invoice_lines),
|
len(invoice_lines),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1535,7 +1527,7 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.unlink()
|
self.acct_line.unlink()
|
||||||
|
|
||||||
def test_contract_line_state(self):
|
def test_contract_line_state(self):
|
||||||
lines = self.env['account.analytic.invoice.line']
|
lines = self.env['contract.line']
|
||||||
# upcoming
|
# upcoming
|
||||||
lines |= self.acct_line.copy(
|
lines |= self.acct_line.copy(
|
||||||
{
|
{
|
||||||
@@ -1607,39 +1599,39 @@ class TestContract(TestContractBase):
|
|||||||
]
|
]
|
||||||
self.assertEqual(set(lines.mapped('state')), set(states))
|
self.assertEqual(set(lines.mapped('state')), set(states))
|
||||||
for state in states:
|
for state in states:
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', '=', state)]
|
[('state', '=', state)]
|
||||||
)
|
)
|
||||||
self.assertEqual(len(set(lines.mapped('state'))), 1, state)
|
self.assertEqual(len(set(lines.mapped('state'))), 1, state)
|
||||||
self.assertEqual(lines.mapped('state')[0], state, state)
|
self.assertEqual(lines.mapped('state')[0], state, state)
|
||||||
|
|
||||||
for state in states:
|
for state in states:
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', '!=', state)]
|
[('state', '!=', state)]
|
||||||
)
|
)
|
||||||
self.assertFalse(state in lines.mapped('state'))
|
self.assertFalse(state in lines.mapped('state'))
|
||||||
|
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', 'in', states)]
|
[('state', 'in', states)]
|
||||||
)
|
)
|
||||||
self.assertEqual(set(lines.mapped('state')), set(states))
|
self.assertEqual(set(lines.mapped('state')), set(states))
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', 'in', [])]
|
[('state', 'in', [])]
|
||||||
)
|
)
|
||||||
self.assertFalse(lines.mapped('state'))
|
self.assertFalse(lines.mapped('state'))
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.env['account.analytic.invoice.line'].search(
|
self.env['contract.line'].search(
|
||||||
[('state', 'in', 'upcoming')]
|
[('state', 'in', 'upcoming')]
|
||||||
)
|
)
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', 'not in', [])]
|
[('state', 'not in', [])]
|
||||||
)
|
)
|
||||||
self.assertEqual(set(lines.mapped('state')), set(states))
|
self.assertEqual(set(lines.mapped('state')), set(states))
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', 'not in', states)]
|
[('state', 'not in', states)]
|
||||||
)
|
)
|
||||||
self.assertFalse(lines.mapped('state'))
|
self.assertFalse(lines.mapped('state'))
|
||||||
lines = self.env['account.analytic.invoice.line'].search(
|
lines = self.env['contract.line'].search(
|
||||||
[('state', 'not in', ['upcoming', 'in-progress'])]
|
[('state', 'not in', ['upcoming', 'in-progress'])]
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@@ -1780,10 +1772,10 @@ class TestContract(TestContractBase):
|
|||||||
|
|
||||||
def test_purchase_fields_view_get(self):
|
def test_purchase_fields_view_get(self):
|
||||||
purchase_tree_view = self.env.ref(
|
purchase_tree_view = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_purchase_view_tree'
|
'contract.contract_line_supplier_tree_view'
|
||||||
)
|
)
|
||||||
purchase_form_view = self.env.ref(
|
purchase_form_view = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_purchase_view_form'
|
'contract.contract_line_supplier_form_view'
|
||||||
)
|
)
|
||||||
view = self.acct_line.with_context(
|
view = self.acct_line.with_context(
|
||||||
default_contract_type='purchase'
|
default_contract_type='purchase'
|
||||||
@@ -1796,7 +1788,7 @@ class TestContract(TestContractBase):
|
|||||||
|
|
||||||
def test_sale_fields_view_get(self):
|
def test_sale_fields_view_get(self):
|
||||||
sale_form_view = self.env.ref(
|
sale_form_view = self.env.ref(
|
||||||
'contract.account_analytic_invoice_line_sale_view_form'
|
'contract.contract_line_customer_form_view'
|
||||||
)
|
)
|
||||||
view = self.acct_line.with_context(
|
view = self.acct_line.with_context(
|
||||||
default_contract_type='sale'
|
default_contract_type='sale'
|
||||||
@@ -1832,8 +1824,8 @@ class TestContract(TestContractBase):
|
|||||||
self.assertFalse(self.contract.create_invoice_visibility)
|
self.assertFalse(self.contract.create_invoice_visibility)
|
||||||
|
|
||||||
def test_invoice_contract_without_lines(self):
|
def test_invoice_contract_without_lines(self):
|
||||||
self.contract.recurring_invoice_line_ids.cancel()
|
self.contract.contract_line_ids.cancel()
|
||||||
self.contract.recurring_invoice_line_ids.unlink()
|
self.contract.contract_line_ids.unlink()
|
||||||
self.assertFalse(self.contract.recurring_create_invoice())
|
self.assertFalse(self.contract.recurring_create_invoice())
|
||||||
|
|
||||||
def test_stop_at_last_date_invoiced(self):
|
def test_stop_at_last_date_invoiced(self):
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_abstract_analytic_contract_line_view_form"
|
<!--FORM view-->
|
||||||
model="ir.ui.view">
|
<record id="contract_abstract_contract_line_form_view" model="ir.ui.view">
|
||||||
<field name="name">Account Abstract Analytic Contract Line Form View
|
<field name="name">contract.abstract.contract.line form view (in contract)</field>
|
||||||
</field>
|
<field name="model">contract.abstract.contract.line</field>
|
||||||
<field name="model">account.abstract.analytic.contract.line</field>
|
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
|
<header/>
|
||||||
<sheet>
|
<sheet>
|
||||||
<group col="4">
|
<group col="4">
|
||||||
<field colspan="4" name="product_id"/>
|
<field colspan="4" name="product_id"/>
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="recurring_invoicing_type"
|
<field name="recurring_invoicing_type"
|
||||||
attrs="{'invisible': [('recurring_rule_type', '=', 'monthlylastday')]}"/>
|
attrs="{'invisible': [('recurring_rule_type', '=', 'monthlylastday')]}"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_analytic_account_recurring_form_form"
|
<!--Main FORM view-->
|
||||||
model="ir.ui.view">
|
<record id="contract_contract_form_view" model="ir.ui.view">
|
||||||
<field name="name">Contract form</field>
|
<field name="name">contract.contract form view (in contract)</field>
|
||||||
<field name="model">account.analytic.account</field>
|
<field name="model">contract.contract</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<header>
|
<header>
|
||||||
@@ -70,15 +70,10 @@
|
|||||||
<notebook>
|
<notebook>
|
||||||
<page name="recurring_invoice_line"
|
<page name="recurring_invoice_line"
|
||||||
string="Recurring Invoices">
|
string="Recurring Invoices">
|
||||||
<field name="recurring_invoice_line_ids"
|
<field name="contract_line_ids"
|
||||||
context="{'default_contract_type': contract_type}"/>
|
context="{'default_contract_type': contract_type}"/>
|
||||||
</page>
|
</page>
|
||||||
<page name="info" string="Other Information">
|
<page name="info" string="Other Information">
|
||||||
<div invisible="1">
|
|
||||||
<field name="recurring_invoices"
|
|
||||||
class="oe_inline"/>
|
|
||||||
<label for="recurring_invoices"/>
|
|
||||||
</div>
|
|
||||||
<field name="create_invoice_visibility"
|
<field name="create_invoice_visibility"
|
||||||
invisible="1"/>
|
invisible="1"/>
|
||||||
<group>
|
<group>
|
||||||
@@ -119,20 +114,18 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_account_sale_form" model="ir.ui.view">
|
<!--Customer FORM view-->
|
||||||
<field name="name">account.analytic.account.sale.form</field>
|
<record id="contract_contract_customer_form_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.account</field>
|
<field name="name">contract.contract customer form view (in contract)</field>
|
||||||
<field name="inherit_id"
|
<field name="model">contract.contract</field>
|
||||||
ref="account_analytic_account_recurring_form_form"/>
|
<field name="inherit_id" ref="contract_contract_form_view"/>
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="priority" eval="20"/>
|
<field name="priority" eval="20"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="partner_id" position="attributes">
|
<field name="partner_id" position="attributes">
|
||||||
<attribute name="string">Customer</attribute>
|
<attribute name="string">Customer</attribute>
|
||||||
<attribute name="domain">[('customer', '=', True)]</attribute>
|
<attribute name="domain">[('customer', '=', True)]</attribute>
|
||||||
<attribute name="context">{'default_customer': True,
|
<attribute name="context">{'default_customer': True, 'default_supplier': False}</attribute>
|
||||||
'default_supplier': False}
|
|
||||||
</attribute>
|
|
||||||
</field>
|
</field>
|
||||||
<field name="journal_id" position="attributes">
|
<field name="journal_id" position="attributes">
|
||||||
<attribute name="domain">[('type', '=', 'sale'),('company_id', '=', company_id)]</attribute>
|
<attribute name="domain">[('type', '=', 'sale'),('company_id', '=', company_id)]</attribute>
|
||||||
@@ -140,20 +133,18 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_account_purchase_form" model="ir.ui.view">
|
<!--Supplier FORM view-->
|
||||||
<field name="name">account.analytic.account.purchase.form</field>
|
<record id="contract_contract_supplier_form_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.account</field>
|
<field name="name">contract.contract supplier form view (in contract)</field>
|
||||||
<field name="inherit_id"
|
<field name="model">contract.contract</field>
|
||||||
ref="account_analytic_account_recurring_form_form"/>
|
<field name="inherit_id" ref="contract_contract_form_view"/>
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="priority" eval="20"/>
|
<field name="priority" eval="20"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="partner_id" position="attributes">
|
<field name="partner_id" position="attributes">
|
||||||
<attribute name="string">Supplier</attribute>
|
<attribute name="string">Supplier</attribute>
|
||||||
<attribute name="domain">[('supplier', '=', True)]</attribute>
|
<attribute name="domain">[('supplier', '=', True)]</attribute>
|
||||||
<attribute name="context">{'default_customer': False,
|
<attribute name="context">{'default_customer': False, 'default_supplier': True}</attribute>
|
||||||
'default_supplier': True}
|
|
||||||
</attribute>
|
|
||||||
</field>
|
</field>
|
||||||
<field name="journal_id" position="attributes">
|
<field name="journal_id" position="attributes">
|
||||||
<attribute name="domain">[('type', '=', 'purchase'),('company_id', '=', company_id)]</attribute>
|
<attribute name="domain">[('type', '=', 'purchase'),('company_id', '=', company_id)]</attribute>
|
||||||
@@ -161,77 +152,78 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Inherited Analytic Account list for contracts -->
|
<!--TREE view-->
|
||||||
<record id="view_account_analytic_account_journal_tree" model="ir.ui.view">
|
<record id="contract_contract_tree_view" model="ir.ui.view">
|
||||||
<field name="name">Contract list</field>
|
<field name="name">contract.contract tree view (in contract)</field>
|
||||||
<field name="model">account.analytic.account</field>
|
<field name="model">contract.contract</field>
|
||||||
<field name="inherit_id"
|
|
||||||
ref="analytic.view_account_analytic_account_list"/>
|
|
||||||
<field name="mode">primary</field>
|
|
||||||
<field name="priority" eval="9999"/>
|
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="partner_id" position="before">
|
<tree>
|
||||||
|
<field name="name" string="Name"/>
|
||||||
|
<field name="code"/>
|
||||||
<field name="journal_id" groups="account.group_account_user"/>
|
<field name="journal_id" groups="account.group_account_user"/>
|
||||||
</field>
|
<field name="partner_id"/>
|
||||||
|
<field name="active" invisible="1"/>
|
||||||
|
<field name="company_id" groups="base.group_multi_company"/>
|
||||||
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Analytic Account search view for contract -->
|
<!--SEARCH view-->
|
||||||
<record id="view_account_analytic_account_contract_search"
|
<record id="contract_contract_search_view" model="ir.ui.view">
|
||||||
model="ir.ui.view">
|
<field name="name">contract.contract search view (in contract)</field>
|
||||||
<field name="name">Contract search</field>
|
<field name="model">contract.contract</field>
|
||||||
<field name="model">account.analytic.account</field>
|
|
||||||
<field name="inherit_id"
|
|
||||||
ref="analytic.view_account_analytic_account_search"/>
|
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="name" position="after">
|
<search>
|
||||||
|
<field name="name"
|
||||||
|
filter_domain="['|', ('name','ilike',self), ('code','ilike',self)]"/>
|
||||||
<field name="journal_id"/>
|
<field name="journal_id"/>
|
||||||
<field name="pricelist_id"/>
|
<field name="pricelist_id"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter name="recurring_invoices"
|
|
||||||
string="Recurring Invoices"
|
|
||||||
domain="[('recurring_invoices','=',True)]"
|
|
||||||
/>
|
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter name="not_finished"
|
<filter name="not_finished"
|
||||||
string="In progress"
|
string="In progress"
|
||||||
domain="['|', ('date_end', '>=', time.strftime('%Y-%m-%d')), ('date_end', '=', False)]"
|
domain="['|', ('date_end', '>=', context_today().strftime('%Y-%m-%d')), ('date_end', '=', False)]"
|
||||||
/>
|
/>
|
||||||
<filter name="finished"
|
<filter name="finished"
|
||||||
string="Finished"
|
string="Finished"
|
||||||
domain="[('date_end', '<', time.strftime('%Y-%m-%d')), ('recurring_next_date', '=', False)]"
|
domain="[('date_end', '<', context_today().strftime('%Y-%m-%d')), ('recurring_next_date', '=', False)]"
|
||||||
/>
|
/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<filter string="Archived"
|
||||||
|
domain="[('active', '=', False)]"
|
||||||
|
name="inactive"/>
|
||||||
<group expand="0" string="Group By...">
|
<group expand="0" string="Group By...">
|
||||||
<filter name="next_invoice"
|
<filter string="Associated Partner"
|
||||||
|
name="group_by_partner"
|
||||||
|
domain="[]"
|
||||||
|
context="{'group_by':'partner_id'}"/>
|
||||||
|
<filter name="group_by_next_invoice"
|
||||||
string="Next Invoice"
|
string="Next Invoice"
|
||||||
domain="[('recurring_next_date', '!=', False)]"
|
domain="[('recurring_next_date', '!=', False)]"
|
||||||
context="{'group_by':'recurring_next_date'}"
|
context="{'group_by':'recurring_next_date'}"
|
||||||
/>
|
/>
|
||||||
<filter name="date_end"
|
<filter name="group_by_date_end"
|
||||||
string="Date End"
|
string="Date End"
|
||||||
domain="[]"
|
domain="[]"
|
||||||
context="{'group_by':'date_end'}"
|
context="{'group_by':'date_end'}"
|
||||||
/>
|
/>
|
||||||
</group>
|
</group>
|
||||||
</field>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Action Sales/Sales/Contracts -->
|
<!--ACTION customer contracts-->
|
||||||
<record id="action_account_analytic_sale_overdue_all"
|
<record id="action_customer_contract" model="ir.actions.act_window">
|
||||||
model="ir.actions.act_window">
|
|
||||||
<field name="name">Customer Contracts</field>
|
<field name="name">Customer Contracts</field>
|
||||||
<field name="res_model">account.analytic.account</field>
|
<field name="res_model">contract.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="domain">[('contract_type', '=', 'sale')]</field>
|
<field name="domain">[('contract_type', '=', 'sale')]</field>
|
||||||
<field name="context">{'is_contract':1,
|
<field name="context">{'is_contract':1,
|
||||||
'search_default_not_finished':1,
|
'search_default_not_finished':1,
|
||||||
'search_default_recurring_invoices':1,
|
'default_contract_type': 'sale'}
|
||||||
'default_recurring_invoices': 1, 'default_contract_type': 'sale'}
|
|
||||||
</field>
|
</field>
|
||||||
<field name="search_view_id"
|
<field name="search_view_id" ref="contract_contract_search_view"/>
|
||||||
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.
|
||||||
@@ -239,47 +231,38 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_account_analytic_sale_overdue_all_tree"
|
<record id="action_customer_contract_view_tree" model="ir.actions.act_window.view">
|
||||||
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"
|
<field name="view_id" ref="contract_contract_tree_view"/>
|
||||||
ref="view_account_analytic_account_journal_tree"/>
|
<field name="act_window_id" ref="action_customer_contract"/>
|
||||||
<field name="act_window_id"
|
|
||||||
ref="action_account_analytic_sale_overdue_all"/>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_account_analytic_sale_overdue_all_form"
|
<record id="action_customer_contract_view_form" model="ir.actions.act_window.view">
|
||||||
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_sale_form"/>
|
<field name="view_id" ref="contract_contract_customer_form_view"/>
|
||||||
<field name="act_window_id"
|
<field name="act_window_id" ref="action_customer_contract"/>
|
||||||
ref="action_account_analytic_sale_overdue_all"/>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem id="menu_action_account_analytic_sale_overdue_all"
|
<menuitem id="menu_contract_contract_customer"
|
||||||
parent="account.menu_finance_receivables"
|
parent="account.menu_finance_receivables"
|
||||||
action="action_account_analytic_sale_overdue_all"
|
action="action_customer_contract"
|
||||||
sequence="99"
|
sequence="99"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Action Purchases/Purchases/Contracts -->
|
<!--ACTION supplier contracts-->
|
||||||
<record id="action_account_analytic_purchase_overdue_all"
|
<record id="action_supplier_contract" model="ir.actions.act_window">
|
||||||
model="ir.actions.act_window">
|
|
||||||
<field name="name">Supplier Contracts</field>
|
<field name="name">Supplier Contracts</field>
|
||||||
<field name="res_model">account.analytic.account</field>
|
<field name="res_model">contract.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="domain">[('contract_type', '=', 'purchase')]</field>
|
<field name="domain">[('contract_type', '=', 'purchase')]</field>
|
||||||
<field name="context">{'is_contract':1,
|
<field name="context">{'is_contract':1,
|
||||||
'search_default_not_finished':1,
|
'search_default_not_finished':1,
|
||||||
'search_default_recurring_invoices':1,
|
'default_contract_type': 'purchase'}
|
||||||
'default_recurring_invoices': 1, 'default_contract_type':
|
|
||||||
'purchase'}
|
|
||||||
</field>
|
</field>
|
||||||
<field name="search_view_id"
|
<field name="search_view_id" ref="contract_contract_search_view"/>
|
||||||
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.
|
||||||
@@ -287,28 +270,23 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_account_analytic_purchase_overdue_all_tree"
|
<record id="action_supplier_contract_view_tree" model="ir.actions.act_window.view">
|
||||||
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"
|
<field name="view_id" ref="contract_contract_tree_view"/>
|
||||||
ref="view_account_analytic_account_journal_tree"/>
|
<field name="act_window_id" ref="action_supplier_contract"/>
|
||||||
<field name="act_window_id"
|
|
||||||
ref="action_account_analytic_purchase_overdue_all"/>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_account_analytic_purchase_overdue_all_form"
|
<record id="action_supplier_contract_view_form" model="ir.actions.act_window.view">
|
||||||
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_purchase_form"/>
|
<field name="view_id" ref="contract_contract_supplier_form_view"/>
|
||||||
<field name="act_window_id"
|
<field name="act_window_id" ref="action_supplier_contract"/>
|
||||||
ref="action_account_analytic_purchase_overdue_all"/>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem id="menu_action_account_analytic_purchase_overdue_all"
|
<menuitem id="menu_contract_contract_supplier"
|
||||||
parent="account.menu_finance_payables"
|
parent="account.menu_finance_payables"
|
||||||
action="action_account_analytic_purchase_overdue_all"
|
action="action_supplier_contract"
|
||||||
sequence="99"
|
sequence="99"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_analytic_invoice_line_view_form" model="ir.ui.view">
|
<!--FORM view-->
|
||||||
<field name="name">account.analytic.invoice.line.form</field>
|
<record id="contract_line_form_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.invoice.line</field>
|
<field name="name">contract.line form view (in contract)</field>
|
||||||
<field name="inherit_id"
|
<field name="model">contract.line</field>
|
||||||
ref="account_abstract_analytic_contract_line_view_form"/>
|
<field name="inherit_id" ref="contract_abstract_contract_line_form_view"/>
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//sheet" position="before">
|
<header position="inside">
|
||||||
<header>
|
<field name="state" widget="statusbar"/>
|
||||||
<field name="state" widget="statusbar"/>
|
</header>
|
||||||
</header>
|
<group name="recurrence_info" position="inside">
|
||||||
</xpath>
|
|
||||||
<xpath expr="//form" position="attributes">
|
|
||||||
<attribute name="string">Contract Line</attribute>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//group[@name='recurrence_info']" position="inside">
|
|
||||||
<group>
|
<group>
|
||||||
<field name="create_invoice_visibility" invisible="1"/>
|
<field name="create_invoice_visibility" invisible="1"/>
|
||||||
<field name="date_start" required="1"/>
|
<field name="date_start" required="1"/>
|
||||||
@@ -33,23 +28,21 @@
|
|||||||
<group>
|
<group>
|
||||||
<field name="manual_renew_needed"/>
|
<field name="manual_renew_needed"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<group>
|
<group>
|
||||||
<field name="predecessor_contract_line_id"/>
|
<field name="predecessor_contract_line_id"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="successor_contract_line_id"/>
|
<field name="successor_contract_line_id"/>
|
||||||
</group>
|
</group>
|
||||||
</xpath>
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_invoice_line_sale_view_form"
|
<!--Customer FORM view-->
|
||||||
model="ir.ui.view">
|
<record id="contract_line_customer_form_view" model="ir.ui.view">
|
||||||
<field name="name">account.analytic.invoice.line.sale.form</field>
|
<field name="name">contract.line customer form view (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line</field>
|
<field name="model">contract.line</field>
|
||||||
<field name="inherit_id"
|
<field name="inherit_id" ref="contract_line_form_view"/>
|
||||||
ref="account_analytic_invoice_line_view_form"/>
|
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="priority" eval="20"/>
|
<field name="priority" eval="20"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
@@ -59,29 +52,27 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_invoice_line_purchase_view_form"
|
<!--Supplier FORM view-->
|
||||||
model="ir.ui.view">
|
<record id="contract_line_supplier_form_view" model="ir.ui.view">
|
||||||
<field name="name">account.analytic.invoice.line.purchase.form</field>
|
<field name="name">contract.line supplier form view (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line</field>
|
<field name="model">contract.line</field>
|
||||||
<field name="inherit_id"
|
<field name="inherit_id" ref="contract_line_form_view"/>
|
||||||
ref="account_analytic_invoice_line_view_form"/>
|
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="priority" eval="20"/>
|
<field name="priority" eval="20"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="product_id" position="attributes">
|
<field name="product_id" position="attributes">
|
||||||
<attribute name="domain">[('purchase_ok', '=', True)]
|
<attribute name="domain">[('purchase_ok', '=', True)]</attribute>
|
||||||
</attribute>
|
|
||||||
</field>
|
</field>
|
||||||
<xpath expr="//field[@name='automatic_price']"
|
<field name="automatic_price" position="attributes">
|
||||||
position="attributes">
|
|
||||||
<attribute name="invisible">True</attribute>
|
<attribute name="invisible">True</attribute>
|
||||||
</xpath>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_invoice_line_view_tree" model="ir.ui.view">
|
<!--TREE view-->
|
||||||
<field name="name">account.analytic.invoice.line.tree</field>
|
<record id="contract_line_tree_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.invoice.line</field>
|
<field name="name">contract.line tree view (in contract)</field>
|
||||||
|
<field name="model">contract.line</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree decoration-muted="is_canceled"
|
<tree decoration-muted="is_canceled"
|
||||||
decoration-info="create_invoice_visibility and not is_canceled">
|
decoration-info="create_invoice_visibility and not is_canceled">
|
||||||
@@ -155,19 +146,17 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_invoice_line_purchase_view_tree"
|
<!--Supplier TREE view-->
|
||||||
model="ir.ui.view">
|
<record id="contract_line_supplier_tree_view" model="ir.ui.view">
|
||||||
<field name="name">account.analytic.invoice.line.purchase.tree</field>
|
<field name="name">contract.line supplier tree view (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line</field>
|
<field name="model">contract.line</field>
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="priority" eval="20"/>
|
<field name="priority" eval="20"/>
|
||||||
<field name="inherit_id"
|
<field name="inherit_id" ref="contract_line_tree_view"/>
|
||||||
ref="account_analytic_invoice_line_view_tree"/>
|
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='automatic_price']"
|
<field name="automatic_price" position="attributes">
|
||||||
position="attributes">
|
|
||||||
<attribute name="invisible">True</attribute>
|
<attribute name="invisible">True</attribute>
|
||||||
</xpath>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_analytic_contract_view_form" model="ir.ui.view">
|
<!--FORM view-->
|
||||||
<field name="name">Account Analytic Contract Form View</field>
|
<record id="contract_template_form_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.contract</field>
|
<field name="name">contract.template form view (in contract)</field>
|
||||||
|
<field name="model">contract.template</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Contract Template">
|
<form string="Contract Template">
|
||||||
<group name="name">
|
<group name="name">
|
||||||
@@ -17,9 +18,9 @@
|
|||||||
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
|
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group name="group_invoice_lines" string="Invoice Lines">
|
<group name="group_invoice_lines" string="Contract Template Lines">
|
||||||
<field name="recurring_invoice_line_ids" nolabel="1">
|
<field name="contract_line_ids" nolabel="1">
|
||||||
<tree string="Account Analytic Lines">
|
<tree>
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="product_id" />
|
<field name="product_id" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
@@ -46,11 +47,12 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_contract_view_tree" model="ir.ui.view">
|
<!--TREE view-->
|
||||||
<field name="name">Account Analytic Contract Tree View</field>
|
<record id="contract_template_tree_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.contract</field>
|
<field name="name">contract.template tree view (in contract)</field>
|
||||||
|
<field name="model">contract.template</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Contract Templates">
|
<tree>
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="contract_type" />
|
<field name="contract_type" />
|
||||||
<field name="pricelist_id" />
|
<field name="pricelist_id" />
|
||||||
@@ -58,11 +60,12 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_contract_view_search" model="ir.ui.view">
|
<!--SEARCH view-->
|
||||||
<field name="name">Account Analytic Contract Search View</field>
|
<record id="contract_template_search_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.contract</field>
|
<field name="name">contract.template search view (in contract)</field>
|
||||||
|
<field name="model">contract.template</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Contract Templates">
|
<search>
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="contract_type" />
|
<field name="contract_type" />
|
||||||
<field name="pricelist_id" />
|
<field name="pricelist_id" />
|
||||||
@@ -83,12 +86,13 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="account_analytic_contract_action" model="ir.actions.act_window">
|
<!--ACTION-->
|
||||||
|
<record id="contract_template_action" model="ir.actions.act_window">
|
||||||
<field name="name">Contract Templates</field>
|
<field name="name">Contract Templates</field>
|
||||||
<field name="res_model">account.analytic.contract</field>
|
<field name="res_model">contract.template</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="search_view_id" ref="contract_template_search_view"/>
|
||||||
<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.
|
||||||
@@ -102,9 +106,9 @@
|
|||||||
parent="account.menu_finance_configuration"
|
parent="account.menu_finance_configuration"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<menuitem id="account_analytic_contract_menu"
|
<menuitem id="contract_template_menu"
|
||||||
parent="menu_config_contract"
|
parent="menu_config_contract"
|
||||||
action="account_analytic_contract_action"
|
action="contract_template_action"
|
||||||
sequence="1"
|
sequence="1"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_analytic_contract_line_view_form" model="ir.ui.view">
|
<!--FORM view-->
|
||||||
<field name="name">account.analytic.contract.line.form</field>
|
<record id="contract_template_line_form_view" model="ir.ui.view">
|
||||||
<field name="model">account.analytic.contract.line</field>
|
<field name="name">contract.template.line form view (in contract)</field>
|
||||||
<field name="inherit_id"
|
<field name="model">contract.template.line</field>
|
||||||
ref="account_abstract_analytic_contract_line_view_form"/>
|
<field name="inherit_id" ref="contract_abstract_contract_line_form_view"/>
|
||||||
<field name="mode">primary</field>
|
<field name="mode">primary</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//form" position="attributes">
|
<form position="attributes">
|
||||||
<attribute name="string">Contract Line Template</attribute>
|
<attribute name="string">Contract Template Line</attribute>
|
||||||
</xpath>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
from odoo import api, fields, models
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class AccountAnalyticInvoiceLineWizard(models.TransientModel):
|
class ContractLineWizard(models.TransientModel):
|
||||||
|
|
||||||
_name = 'account.analytic.invoice.line.wizard'
|
_name = 'contract.line.wizard'
|
||||||
_description = 'Contract Line Wizard'
|
_description = 'Contract Line Wizard'
|
||||||
|
|
||||||
date_start = fields.Date(string='Date Start')
|
date_start = fields.Date(string='Date Start')
|
||||||
@@ -21,7 +21,7 @@ class AccountAnalyticInvoiceLineWizard(models.TransientModel):
|
|||||||
"successor in advance",
|
"successor in advance",
|
||||||
)
|
)
|
||||||
contract_line_id = fields.Many2one(
|
contract_line_id = fields.Many2one(
|
||||||
comodel_name="account.analytic.invoice.line",
|
comodel_name="contract.line",
|
||||||
string="Contract Line",
|
string="Contract Line",
|
||||||
required=True,
|
required=True,
|
||||||
index=True,
|
index=True,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<record model="ir.ui.view" id="contract_line_wizard_stop_form_view">
|
<record model="ir.ui.view" id="contract_line_wizard_stop_form_view">
|
||||||
<field name="name">contract.line.stop.wizard.form (in contract)</field>
|
<field name="name">contract.line.stop.wizard.form (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line.wizard</field>
|
<field name="model">contract.line.wizard</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<group>
|
<group>
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<record model="ir.ui.view" id="contract_line_wizard_plan_successor_form_view">
|
<record model="ir.ui.view" id="contract_line_wizard_plan_successor_form_view">
|
||||||
<field name="name">contract.line.plan_successor.wizard.form (in contract)</field>
|
<field name="name">contract.line.plan_successor.wizard.form (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line.wizard</field>
|
<field name="model">contract.line.wizard</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<group>
|
<group>
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
|
|
||||||
<record model="ir.ui.view" id="contract_line_wizard_stop_plan_successor_form_view">
|
<record model="ir.ui.view" id="contract_line_wizard_stop_plan_successor_form_view">
|
||||||
<field name="name">contract.line.stop_plan_successor.wizard.form (in contract)</field>
|
<field name="name">contract.line.stop_plan_successor.wizard.form (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line.wizard</field>
|
<field name="model">contract.line.wizard</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<group>
|
<group>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
<record model="ir.ui.view" id="contract_line_wizard_uncancel_form_view">
|
<record model="ir.ui.view" id="contract_line_wizard_uncancel_form_view">
|
||||||
<field name="name">contract.line.stop_plan_successor.wizard.form (in contract)</field>
|
<field name="name">contract.line.stop_plan_successor.wizard.form (in contract)</field>
|
||||||
<field name="model">account.analytic.invoice.line.wizard</field>
|
<field name="model">contract.line.wizard</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<group>
|
<group>
|
||||||
|
|||||||
Reference in New Issue
Block a user