Files
contract/contract/data/contract_line_constraints.py
sbejaoui 73c08d0f2f [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
2019-09-14 14:34:02 +02:00

231 lines
5.2 KiB
Python

# 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