mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[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:
1
contract/data/__init__.py
Normal file
1
contract/data/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import contract_line_constraints
|
||||
230
contract/data/contract_line_constraints.py
Normal file
230
contract/data/contract_line_constraints.py
Normal 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
|
||||
16
contract/data/contract_renew_cron.xml
Normal file
16
contract/data/contract_renew_cron.xml
Normal 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>
|
||||
Reference in New Issue
Block a user