Commit fb155821 by François C.

Membership parameters mangement to fit with many scenarii

parent a5f1a125
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
'description': """ 'description': """
Specific rules are beeing implemented Specific rules are beeing implemented
lacagette_membership.absence_status can be excused or absent
""", """,
'author': "fracolo/cooperatic", 'author': "fracolo/cooperatic",
...@@ -14,12 +16,13 @@ ...@@ -14,12 +16,13 @@
# #
'category': 'Uncategorized', 'category': 'Uncategorized',
'version': '0.0.4', 'version': '0.0.5',
# any module necessary for this one to work correctly # any module necessary for this one to work correctly
'depends': ['base', 'coop_shift'], 'depends': ['base', 'coop_membership', 'coop_shift'],
# always loaded # always loaded
'data': [ 'data': [
'security/ir.model.access.csv',
'data/ir_cron.xml', 'data/ir_cron.xml',
'data/ir_config_parameter_data.xml' 'data/ir_config_parameter_data.xml'
], ],
......
...@@ -4,4 +4,25 @@ ...@@ -4,4 +4,25 @@
<field name="key">lacagette_membership.makeups_to_do_on_shift_missed</field> <field name="key">lacagette_membership.makeups_to_do_on_shift_missed</field>
<field name="value">2</field> <field name="value">2</field>
</record> </record>
<record id="points_limit_to_get_suspended" model="ir.config_parameter">
<field name="key">lacagette_membership.points_limit_to_get_suspended</field>
<field name="value">-2</field>
</record>
<record id="points_limit_to_get_unsubscribed" model="ir.config_parameter">
<field name="key">lacagette_membership.points_limit_to_get_unsubscribed</field>
<field name="value">-3</field>
</record>
<record id="makeups_to_do_if_missed_id" model="ir.config_parameter">
<field name="key">lacagette_membership.absence_status</field>
<field name="value">excused</field>
</record>
<record id="extension_duration" model="ir.config_parameter">
<field name="key">lacagette_membership.extension_duration</field>
<field name="value">6 months</field>
</record>
<record id="max_successive_extensions" model="ir.config_parameter">
<field name="key">lacagette_membership.max_successive_extensions</field>
<field name="value">1</field>
</record>
</odoo> </odoo>
...@@ -4,3 +4,4 @@ from . import res_partner ...@@ -4,3 +4,4 @@ from . import res_partner
from . import shift_registration from . import shift_registration
from . import shift_counter_event from . import shift_counter_event
from . import shift_shift from . import shift_shift
from . import member_state_change
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html
from openerp import fields, models
class MembersStateChange(models.Model):
_name = "member.state.change"
member_id = fields.Many2one(
comodel_name='res.partner',
ondelete='cascade',
index=True
)
state = fields.Char(
'state',
size=15
)
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
from openerp import _, api, models, fields from openerp import _, api, models, fields
import datetime import datetime
import logging
_logger = logging.getLogger(__name__)
TARGET_STATUS_SELECTION = [ TARGET_STATUS_SELECTION = [
('unsubscribed', 'Unsubscribed'), ('unsubscribed', 'Unsubscribed'),
...@@ -26,7 +29,7 @@ class ResPartner(models.Model): ...@@ -26,7 +29,7 @@ class ResPartner(models.Model):
for p in self.env['res.partner']\ for p in self.env['res.partner']\
.search([('target_status', '!=', "")]): .search([('target_status', '!=', "")]):
new_values = {'target_status': "", "date_alert_stop": ""} new_values = {'target_status': "", "date_alert_stop": False}
if p.final_ftop_point < 0: if p.final_ftop_point < 0:
new_values['cooperative_state'] = p.target_status new_values['cooperative_state'] = p.target_status
if new_values['cooperative_state'] == "unsubscribed": if new_values['cooperative_state'] == "unsubscribed":
...@@ -56,3 +59,60 @@ class ResPartner(models.Model): ...@@ -56,3 +59,60 @@ class ResPartner(models.Model):
today = datetime.datetime.now().strftime("%Y-%m-%d") today = datetime.datetime.now().strftime("%Y-%m-%d")
for ext in extension_model.search([('id', 'in', extension_ids)]): for ext in extension_model.search([('id', 'in', extension_ids)]):
ext.update({'date_stop': today}) ext.update({'date_stop': today})
@api.multi
def can_have_extension(self):
"""Return if the member can ask for an extension"""
answer = True
conf = self.env['ir.config_parameter']
max_nb = int(conf.get_param("lacagette_membership.max_successive_extensions"))
if max_nb == 1:
args = [('member_id', '=', self.id)]
states = self.env['member.state.change']\
.search(args, order='write_date DESC', limit=2)
"""
member.state.change may have no record for the current member
"""
if len(states) > 0:
if (len(states) == 1 and states[0]['state'] == 'delay'
or
len(states) == 2 and states[1]['state'] == 'delay'):
answer = False
else:
# need to load data
member = self.env['res.partner'].search([('id', '=', self.id)])[0]
# should exist an other way to do it , but haven't found it
if member.cooperative_state != "up_to_date":
answer = False
else:
# TODO : Must have a look to previous extensions
pass
return answer
def _write_state_change(self, state):
data = {'member_id': self.id, 'state': state}
self.env['member.state.change'].create(data)
@api.model
def update(self, vals):
res = super(ResPartner, self).write(vals)
#_logger.info("valeurs reçues pour update partner = %s", str(vals))
state_to_record = ""
if 'cooperative_state' in vals:
state_to_record = vals['cooperative_state']
elif 'current_cooperative_state' in vals:
state_to_record = vals['current_cooperative_state']
if len(state_to_record) > 0:
self._write_state_change(state_to_record)
return res
@api.model
def write(self, vals):
res = super(ResPartner, self).write(vals)
# _logger.info("valeurs reçues pour write partner = %s", str(vals))
if 'cooperative_state' in vals:
self._write_state_change(vals['cooperative_state'])
return res
\ No newline at end of file
...@@ -11,29 +11,34 @@ class ShiftCounterEvent(models.Model): ...@@ -11,29 +11,34 @@ class ShiftCounterEvent(models.Model):
def _update_partner_target_status(self, vals): def _update_partner_target_status(self, vals):
"""actions if point_qty is negative""" """actions if point_qty is negative"""
conf = self.env['ir.config_parameter']
suspension_limit = int(conf.get_param("lacagette_membership.points_limit_to_get_suspended"))
unsubscribe_limit = int(conf.get_param("lacagette_membership.points_limit_to_get_unsubscribed"))
if vals['point_qty'] < 0: if vals['point_qty'] < 0:
res_partner = self.env['res.partner'].search([('id', '=', vals['partner_id'])]) res_partner = self.env['res.partner'].search([('id', '=', vals['partner_id'])])
if res_partner: if res_partner:
points_before_removing_points = res_partner[0].final_ftop_point points_before_removing_points = res_partner[0].final_ftop_point
points_after_removal = points_before_removing_points + vals['point_qty'] points_after_removal = points_before_removing_points + vals['point_qty']
_logger.info("points_after_removal = %s", str(points_after_removal)) _logger.info("points_after_removal = %s", str(points_after_removal))
if points_after_removal <= -2: if points_after_removal <= suspension_limit or points_after_removal <= unsubscribe_limit:
target_status = 'suspended' if points_after_removal <= suspension_limit:
if points_after_removal < -2: target_status = 'suspended'
if points_after_removal <= unsubscribe_limit:
target_status = 'unsubscribed' target_status = 'unsubscribed'
res_partner[0].update({'target_status': target_status}) res_partner[0].update({'target_status': target_status,
'current_cooperative_state': res_partner[0].cooperative_state})
@api.model @api.model
def write(self, vals): def write(self, vals):
res = super(ShiftCounterEvent, self).write(vals) res = super(ShiftCounterEvent, self).write(vals)
#_logger.info("Vals reçues = %s", str(vals)) _logger.info("Vals reçues = %s", str(vals))
self._update_partner_target_status(vals) self._update_partner_target_status(vals)
return res return res
@api.model @api.model
def create(self, vals): def create(self, vals):
self._update_partner_target_status(vals) self._update_partner_target_status(vals)
# _logger.info("Vals reçues creation = %s", str(vals)) _logger.info("Vals reçues creation = %s", str(vals))
return super(ShiftCounterEvent, self).create(vals) return super(ShiftCounterEvent, self).create(vals)
\ No newline at end of file
...@@ -20,10 +20,11 @@ class ShiftRegistration(models.Model): ...@@ -20,10 +20,11 @@ class ShiftRegistration(models.Model):
@api.multi @api.multi
def write(self, vals): def write(self, vals):
res = super(ShiftRegistration, self).write(vals) res = super(ShiftRegistration, self).write(vals)
if 'state' in vals and vals['state'] == 'excused': conf = self.env['ir.config_parameter']
absence_status = conf.get_param("lacagette_membership.absence_status")
if 'state' in vals and vals['state'] == absence_status:
if self.ids: if self.ids:
# it is the case when called from "absence cron job" run in external third-party # it is the case when called from "absence cron job" run in external third-party
conf = self.env['ir.config_parameter']
to_add = conf.get_param("lacagette_membership.makeups_to_do_on_shift_missed") to_add = conf.get_param("lacagette_membership.makeups_to_do_on_shift_missed")
for s in self.env['shift.registration']\ for s in self.env['shift.registration']\
.search([('id', 'in', self.ids)]): .search([('id', 'in', self.ids)]):
......
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
,,,,,,,
,,,,,,,
access_model_member_state_change,access_model_member_state_change,model_member_state_change,coop_shift.group_shift_user,1,1,1,1
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