Administrator
5 years ago
21 changed files with 453 additions and 588 deletions
-
4contract/__manifest__.py
-
94contract/migrations/12.0.2.0.0/pre-migration.py
-
63contract/migrations/12.0.4.0.0/post-migration.py
-
147contract/migrations/12.0.4.0.0/pre-migration.py
-
4contract/models/__init__.py
-
21contract/models/abstract_contract.py
-
102contract/models/abstract_contract_line.py
-
12contract/models/account_invoice.py
-
12contract/models/account_move.py
-
4contract/models/account_move_line.py
-
144contract/models/contract.py
-
324contract/models/contract_line.py
-
1contract/models/contract_template_line.py
-
4contract/tests/test_contract.py
-
6contract/views/abstract_contract_line.xml
-
28contract/views/account_move.xml
-
28contract/views/contract.xml
-
8contract/views/contract_line.xml
-
1contract/views/contract_template.xml
-
6contract/views/res_partner_view.xml
-
4contract/wizards/contract_line_wizard.py
@ -1,94 +0,0 @@ |
|||
# Copyright 2018 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__) |
|||
|
|||
|
|||
def _set_finished_contract(cr): |
|||
_logger.info("set recurring_next_date to false for finished contract") |
|||
openupgrade.logged_query( |
|||
cr, |
|||
""" |
|||
UPDATE account_analytic_account |
|||
SET recurring_next_date=NULL |
|||
WHERE recurring_next_date > date_end |
|||
""", |
|||
) |
|||
|
|||
|
|||
def _move_contract_recurrence_info_to_contract_line(cr): |
|||
_logger.info("Move contract data to line level") |
|||
openupgrade.logged_query( |
|||
cr, |
|||
""" |
|||
ALTER TABLE account_analytic_invoice_line |
|||
ADD COLUMN IF NOT EXISTS recurring_rule_type VARCHAR(255), |
|||
ADD COLUMN IF NOT EXISTS recurring_invoicing_type VARCHAR(255), |
|||
ADD COLUMN IF NOT EXISTS recurring_interval INTEGER, |
|||
ADD COLUMN IF NOT EXISTS recurring_next_date DATE, |
|||
ADD COLUMN IF NOT EXISTS date_start DATE, |
|||
ADD COLUMN IF NOT EXISTS date_end DATE |
|||
""", |
|||
) |
|||
|
|||
openupgrade.logged_query( |
|||
cr, |
|||
""" |
|||
UPDATE account_analytic_invoice_line AS contract_line |
|||
SET |
|||
recurring_rule_type=contract.recurring_rule_type, |
|||
recurring_invoicing_type=contract.recurring_invoicing_type, |
|||
recurring_interval=contract.recurring_interval, |
|||
recurring_next_date=contract.recurring_next_date, |
|||
date_start=contract.date_start, |
|||
date_end=contract.date_end |
|||
FROM |
|||
account_analytic_account AS contract |
|||
WHERE |
|||
contract.id=contract_line.analytic_account_id |
|||
""", |
|||
) |
|||
|
|||
|
|||
def _move_contract_template_recurrence_info_to_contract_template_line(cr): |
|||
_logger.info("Move contract template data to line level") |
|||
openupgrade.logged_query( |
|||
cr, |
|||
""" |
|||
ALTER TABLE account_analytic_contract_line |
|||
ADD COLUMN IF NOT EXISTS recurring_rule_type VARCHAR(255), |
|||
ADD COLUMN IF NOT EXISTS recurring_invoicing_type VARCHAR(255), |
|||
ADD COLUMN IF NOT EXISTS recurring_interval INTEGER |
|||
""", |
|||
) |
|||
|
|||
openupgrade.logged_query( |
|||
cr, |
|||
""" |
|||
UPDATE account_analytic_contract_line AS contract_template_line |
|||
SET |
|||
recurring_rule_type=contract_template.recurring_rule_type, |
|||
recurring_invoicing_type=contract_template.recurring_invoicing_type, |
|||
recurring_interval=contract_template.recurring_interval |
|||
FROM |
|||
account_analytic_contract AS contract_template |
|||
WHERE |
|||
contract_template.id=contract_template_line.analytic_account_id |
|||
""", |
|||
) |
|||
|
|||
|
|||
@openupgrade.migrate() |
|||
def migrate(env, version): |
|||
""" |
|||
set recurring_next_date to false for finished contract |
|||
""" |
|||
_logger.info(">> Pre-Migration 12.0.2.0.0") |
|||
cr = env.cr |
|||
_set_finished_contract(cr) |
|||
_move_contract_recurrence_info_to_contract_line(cr) |
|||
_move_contract_template_recurrence_info_to_contract_template_line(cr) |
@ -1,63 +0,0 @@ |
|||
# Copyright 2019 ACSONE SA/NV |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
import logging |
|||
|
|||
from openupgradelib import openupgrade |
|||
from odoo.tools import parse_version |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
def _update_no_update_ir_cron(env): |
|||
# Update ir.cron |
|||
env.ref('contract.contract_cron_for_invoice').model_id = env.ref( |
|||
'contract.model_contract_contract' |
|||
) |
|||
env.ref('contract.contract_line_cron_for_renew').model_id = env.ref( |
|||
'contract.model_contract_line' |
|||
) |
|||
env.ref('contract.email_contract_template').model_id = env.ref( |
|||
'contract.model_contract_contract' |
|||
) |
|||
|
|||
|
|||
def _init_last_date_invoiced_on_contract_lines(env): |
|||
_logger.info("init last_date_invoiced field for contract lines") |
|||
contract_lines = env["contract.line"].search( |
|||
[("recurring_next_date", "!=", False)] |
|||
) |
|||
contract_lines._init_last_date_invoiced() |
|||
|
|||
|
|||
def _init_invoicing_partner_id_on_contracts(env): |
|||
_logger.info("Populate invoicing partner field on contracts") |
|||
contracts = env["contract.contract"].search([]) |
|||
contracts._inverse_partner_id() |
|||
|
|||
|
|||
def assign_salesman(env): |
|||
"""As v11 takes salesman from linked partner and now the salesman is a |
|||
field in the contract that is initialized to current user, we need |
|||
to assign to the recently converted contracts following old logic, or they |
|||
will have admin as responsible. |
|||
""" |
|||
openupgrade.logged_query( |
|||
env.cr, """ |
|||
UPDATE contract_contract cc |
|||
SET user_id = rp.user_id |
|||
FROM res_partner rp |
|||
WHERE rp.id = cc.partner_id""", |
|||
) |
|||
|
|||
|
|||
@openupgrade.migrate() |
|||
def migrate(env, version): |
|||
_update_no_update_ir_cron(env) |
|||
if parse_version(version) < parse_version('12.0.2.0.0'): |
|||
# We check the version here as this post-migration script was in |
|||
# 12.0.2.0.0 and already done for those who used the module when |
|||
# it was a PR |
|||
_init_last_date_invoiced_on_contract_lines(env) |
|||
_init_invoicing_partner_id_on_contracts(env) |
|||
assign_salesman(env) |
@ -1,147 +0,0 @@ |
|||
# Copyright 2019 ACSONE SA/NV |
|||
# Copyright 2019 Tecnativa 2019 - Pedro M. Baeza |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
import logging |
|||
|
|||
from openupgradelib import openupgrade |
|||
from psycopg2 import sql |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
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 Line |
|||
('account_analytic_invoice_line', 'contract_line'), |
|||
# Contract Template |
|||
('account_analytic_contract', 'contract_template'), |
|||
# Contract Template Line |
|||
('account_analytic_contract_line', 'contract_template_line'), |
|||
] |
|||
columns_to_copy = { |
|||
'contract_line': [ |
|||
('analytic_account_id', 'contract_id', None), |
|||
], |
|||
} |
|||
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', |
|||
), |
|||
] |
|||
|
|||
|
|||
def _get_contract_field_name(cr): |
|||
""" |
|||
Contract field changed the name from analytic_account_id to contract_id |
|||
in 12.0.2.0.0. This method used to get the contract field name in |
|||
account_analytic_invoice_line""" |
|||
return ( |
|||
'contract_id' |
|||
if openupgrade.column_exists( |
|||
cr, 'account_analytic_invoice_line', 'contract_id' |
|||
) |
|||
else 'analytic_account_id' |
|||
) |
|||
|
|||
|
|||
def create_contract_records(cr): |
|||
contract_field_name = _get_contract_field_name(cr) |
|||
openupgrade.logged_query( |
|||
cr, """ |
|||
CREATE TABLE contract_contract |
|||
(LIKE account_analytic_account INCLUDING ALL)""", |
|||
) |
|||
openupgrade.logged_query( |
|||
cr, sql.SQL(""" |
|||
INSERT INTO contract_contract |
|||
SELECT * FROM account_analytic_account |
|||
WHERE id IN (SELECT DISTINCT {} FROM contract_line) |
|||
""").format( |
|||
sql.Identifier(contract_field_name), |
|||
), |
|||
) |
|||
# Deactivate disabled contracts |
|||
openupgrade.logged_query( |
|||
cr, """UPDATE contract_contract cc |
|||
SET active = False |
|||
FROM account_analytic_account aaa |
|||
WHERE aaa.id = cc.id |
|||
AND NOT aaa.recurring_invoices""", |
|||
) |
|||
# Handle id sequence |
|||
cr.execute("CREATE SEQUENCE IF NOT EXISTS contract_contract_id_seq") |
|||
cr.execute("SELECT setval('contract_contract_id_seq', " |
|||
"(SELECT MAX(id) FROM contract_contract))") |
|||
cr.execute("ALTER TABLE contract_contract ALTER id " |
|||
"SET DEFAULT NEXTVAL('contract_contract_id_seq')") |
|||
# Move common stuff from one table to the other |
|||
mapping = [ |
|||
('ir_attachment', 'res_model', 'res_id'), |
|||
('mail_message', 'model', 'res_id'), |
|||
('mail_activity', 'res_model', 'res_id'), |
|||
('mail_followers', 'res_model', 'res_id'), |
|||
] |
|||
for table, model_column, id_column in mapping: |
|||
openupgrade.logged_query( |
|||
cr, sql.SQL(""" |
|||
UPDATE {table} SET {model_column}='contract.contract' |
|||
WHERE {model_column}='account.analytic.account' |
|||
AND {id_column} IN (SELECT DISTINCT {col} FROM contract_line) |
|||
""").format( |
|||
table=sql.Identifier(table), |
|||
model_column=sql.Identifier(model_column), |
|||
id_column=sql.Identifier(id_column), |
|||
col=sql.Identifier(contract_field_name), |
|||
), |
|||
) |
|||
|
|||
|
|||
@openupgrade.migrate() |
|||
def migrate(env, version): |
|||
cr = env.cr |
|||
openupgrade.rename_models(cr, models_to_rename) |
|||
openupgrade.rename_tables(cr, tables_to_rename) |
|||
openupgrade.rename_xmlids(cr, xmlids_to_rename) |
|||
openupgrade.copy_columns(cr, columns_to_copy) |
|||
create_contract_records(cr) |
@ -1,12 +0,0 @@ |
|||
# © 2016 Carlos Dauden <carlos.dauden@tecnativa.com> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class AccountInvoice(models.Model): |
|||
_inherit = 'account.invoice' |
|||
|
|||
# We keep this field for migration purpose |
|||
old_contract_id = fields.Many2one( |
|||
'contract.contract', oldname='contract_id') |
@ -0,0 +1,12 @@ |
|||
# Copyright 2018 ACSONE SA/NV. |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|||
|
|||
from odoo import fields, models |
|||
|
|||
|
|||
class AccountMove(models.Model): |
|||
_inherit = 'account.move' |
|||
|
|||
contract_id = fields.Many2one('contract.contract', string='Generated by contract', index=True, readonly=True) |
|||
|
|||
|
@ -0,0 +1,28 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!-- Copyright 2017 Carlos Dauden <carlos.dauden@tecnativa.com> |
|||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> |
|||
<odoo> |
|||
|
|||
<record id="contract_in_view_move_form" model="ir.ui.view"> |
|||
<field name="inherit_id" ref="account.view_move_form" /> |
|||
<field name="model">account.move</field> |
|||
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/> |
|||
<field type="xml" name="arch"> |
|||
<field name="ref" position="after"> |
|||
<field name="contract_id" /> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="contract_view_account_invoice_filter" model="ir.ui.view"> |
|||
<field name="inherit_id" ref="account.view_account_invoice_filter" /> |
|||
<field name="model">account.move</field> |
|||
<field type="xml" name="arch"> |
|||
<filter name="duedate" position="after"> |
|||
<filter string="Contract" name="contract" context="{'group_by': 'contract_id'}"/> |
|||
</filter> |
|||
|
|||
</field> |
|||
</record> |
|||
|
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue