Commit 816d4274 by Administrator

Merge branch '5015-prevention-decalage-compteur-rattrapage-et-points' into 'dev_cooperatic'

5015 prevention decalage compteur rattrapage et points

See merge request !67
parents dfa12c72 ddc129a6
......@@ -2,12 +2,65 @@
from openerp import _, api, models, fields
import logging
import datetime
_logger = logging.getLogger(__name__)
class ShiftCounterEvent(models.Model):
_inherit = 'shift.counter.event'
def _alter_point_event_depending_on_makeups_total_count(self, vals):
"""
This code helps keeping the consistency between std_counter and makeup total count.
It solves very specific discrepancy occuring when following conditions are met :
A. the total makeup count (makeups_to_do + makeups_to_come) is more than 2 and std_counter = -2
B. some action increments std_counter
In that case, the std_counter becomes -1 whereas we would like it to be -2.
The idea behind the restriction to the [std_counter = -2] situation is that discrepancy
is always due to the fact that we are adding more makeups to a member where std_counter = -2.
TODO : take into account historically corrupted data where there is discrepancy with std_counter = -1
Below typical scenario where A and B are met (there are probably more than those two !) :
1. after a makeup service where a member has been present is closed [TODO :we are actually doing the right thing there now so we do it twice... we should simplify]
2. after a bdm admin increments the makeup counter
TODO : check that this process is the one we want in all other cases
Note that all of this is only valid in the on std shift members as makeups are not supposed
to be use on ftop shift members.
TODO : WARNING odoo openerp.models: shift.registration.read() with unknown field 'final_standard_point' : is it caused by this piece of code ?
TODO : understand difference in relative position of update_partner_target_status and actual value write in "CREATE" and "WRITE" methods below
TODO : _update_partner_target_status looks similar to run_process_target_status... is it necessary to call run_process_target_status in update_members_makeups_core ?
"""
try:
if vals['point_qty'] > 0:
res_partner = self.env['res.partner'].search([('id', '=', vals['partner_id'])])
if res_partner:
p = res_partner[0]
if p.final_standard_point == -2 and p.shift_type != "ftop":
cond = [
['name', '=', p["name"]],
['shift_type', '=', 'standard'],
['is_makeup', '=', True],
['date_begin', '>=', datetime.datetime.now().isoformat()],
['state', '=', 'open']
]
fields = ['id']
res_shift_reg = self.env['shift.registration'].search_read(cond, fields)
points_after_required_change = p.final_standard_point + vals['point_qty']
makeups_total_count = p['makeups_to_do'] + len(res_shift_reg)
if points_after_required_change + makeups_total_count > 0:
points_target = - makeups_total_count
if points_target < -2:
points_target = -2
vals['point_qty'] = points_target - p.final_standard_point
except Exception as e:
# don't block process if an error occurs here
_logger.error("Error during _alter_point_event_depending_on_makeups_total_count : %s", str(e))
def _update_partner_target_status(self, vals):
"""actions when points are removed or added"""
......@@ -37,8 +90,10 @@ class ShiftCounterEvent(models.Model):
# don't block process if an error occurs here
_logger.error("Error during _update_partner_target_status : %s", str(e))
@api.model
def write(self, vals):
self._alter_point_event_depending_on_makeups_total_count(vals)
res = super(ShiftCounterEvent, self).write(vals)
_logger.info("Vals recues = %s", str(vals))
self._update_partner_target_status(vals)
......@@ -46,6 +101,7 @@ class ShiftCounterEvent(models.Model):
@api.model
def create(self, vals):
self._alter_point_event_depending_on_makeups_total_count(vals)
self._update_partner_target_status(vals)
_logger.info("Vals recues creation = %s", str(vals))
return super(ShiftCounterEvent, self).create(vals)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment