[12.0][IMP] - Add strat/stop wizard to contract line

[12.0][IMP] - Add pause button to contract line

[IMP] - Add state filed in contract line form

[FIX] - stop don't change date_end for finished contract line

[IMP] - Change contract line buttons visibility

Add renewal process with termination notice

[FIX] - don't consider stop_date If it is after the contract line end_date

[IMP] - consider more cases in stop_plan_successor

[IMP] - cancel upcoming line on stop

[IMP] - Chnage next invoice date on un-cancel

[IMP] - Post message in contract on contract line actions

[IMP] - check contract line overlap
This commit is contained in:
sbejaoui
2018-11-13 11:29:46 +01:00
committed by Pedro M. Baeza
parent f785d3ae76
commit c716e7ab39
14 changed files with 1727 additions and 122 deletions

View File

@@ -0,0 +1 @@
from . import contract_line_constraints

View File

@@ -0,0 +1,230 @@
# Copyright 2018 ACSONE SA/NV.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from collections import namedtuple
from odoo.fields import Date
CRITERIA = namedtuple(
'CRITERIA',
['WHEN', 'HAS_DATE_END', 'IS_AUTO_RENEW', 'HAS_SUCCESSOR', 'CANCELED'],
)
ALLOWED = namedtuple(
'ALLOWED',
['PLAN_SUCCESSOR', 'STOP_PLAN_SUCCESSOR', 'STOP', 'CANCEL', 'UN_CANCEL'],
)
CRITERIA_ALLOWED_DICT = {
CRITERIA(
WHEN='BEFORE',
HAS_DATE_END=True,
IS_AUTO_RENEW=True,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='BEFORE',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=True,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=False,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='BEFORE',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=True,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='BEFORE',
HAS_DATE_END=False,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='IN',
HAS_DATE_END=True,
IS_AUTO_RENEW=True,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='IN',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=True,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=False,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='IN',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=True,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='IN',
HAS_DATE_END=False,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=True,
STOP=True,
CANCEL=True,
UN_CANCEL=False,
),
CRITERIA(
WHEN='AFTER',
HAS_DATE_END=True,
IS_AUTO_RENEW=True,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=False,
STOP=False,
CANCEL=False,
UN_CANCEL=False,
),
CRITERIA(
WHEN='AFTER',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=True,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=False,
STOP=False,
CANCEL=False,
UN_CANCEL=False,
),
CRITERIA(
WHEN='AFTER',
HAS_DATE_END=True,
IS_AUTO_RENEW=False,
HAS_SUCCESSOR=False,
CANCELED=False,
): ALLOWED(
PLAN_SUCCESSOR=True,
STOP_PLAN_SUCCESSOR=False,
STOP=False,
CANCEL=False,
UN_CANCEL=False,
),
CRITERIA(
WHEN=None,
HAS_DATE_END=None,
IS_AUTO_RENEW=None,
HAS_SUCCESSOR=None,
CANCELED=True,
): ALLOWED(
PLAN_SUCCESSOR=False,
STOP_PLAN_SUCCESSOR=False,
STOP=False,
CANCEL=False,
UN_CANCEL=True,
),
}
def compute_when(date_start, date_end):
today = Date.today()
if today < date_start:
return 'BEFORE'
if date_end and today > date_end:
return 'AFTER'
return 'IN'
def compute_criteria(
date_start,
date_end,
is_auto_renew,
successor_contract_line_id,
is_canceled,
):
if is_canceled:
return CRITERIA(
WHEN=None,
HAS_DATE_END=None,
IS_AUTO_RENEW=None,
HAS_SUCCESSOR=None,
CANCELED=True,
)
when = compute_when(date_start, date_end)
has_date_end = date_end if not date_end else True
is_auto_renew = is_auto_renew
has_successor = True if successor_contract_line_id else False
canceled = is_canceled
return CRITERIA(
WHEN=when,
HAS_DATE_END=has_date_end,
IS_AUTO_RENEW=is_auto_renew,
HAS_SUCCESSOR=has_successor,
CANCELED=canceled,
)
def get_allowed(
date_start,
date_end,
is_auto_renew,
successor_contract_line_id,
is_canceled,
):
criteria = compute_criteria(
date_start,
date_end,
is_auto_renew,
successor_contract_line_id,
is_canceled,
)
if criteria in CRITERIA_ALLOWED_DICT:
return CRITERIA_ALLOWED_DICT[criteria]
return False

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding='UTF-8'?>
<odoo noupdate="1">
<record model="ir.cron" id="contract_line_cron_for_renew">
<field name="name">Renew Contract lines</field>
<field name="model_id" ref="model_account_analytic_invoice_line"/>
<field name="state">code</field>
<field name="code">model.cron_renew_contract_line()</field>
<field name="user_id" ref="base.user_root" />
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall" />
</record>
</odoo>