[PYTHON]fix allowing for partners without invoice to be considered as valid, eg impor...
[burette/remembership.git] / remembership.py
index 6256b4d..68a0ad5 100644 (file)
@@ -28,6 +28,15 @@ from datetime import datetime, date
 from dateutil.relativedelta import relativedelta
 from openerp.tools.translate import _
 
+STATE = [
+    ('none', 'Non Member'),
+    ('canceled', 'Cancelled Member'),
+    ('old', 'Old Member'),
+    ('waiting', 'Waiting Member'),
+    ('invoiced', 'Invoiced Member'),
+    ('free', 'Free Member'),
+    ('paid', 'Paid Member'),
+]
 
 class Partner(osv.osv):
     _inherit = 'res.partner'
@@ -106,10 +115,60 @@ class Partner(osv.osv):
             list_partner += ids2
         return list_partner
 
+
+    def __get_membership_state(self, cr, uid, ids, name, args, context=None):
+        res = super(Partner, self).__get_membership_state(cr, uid, ids, name, args, context)
+        today = time.strftime('%Y-%m-%d')
+
+        # special case when the partner is imported from a file,
+        # in this case is has a valid membership line but
+        # no payment information associated to it, consider it valid
+        for id in ids:
+            if res[id] == 'none':
+
+                partner_data = self.browse(cr, uid, id, context=context)
+
+                no_payment_info_at_all = True
+                valid_line = False
+
+                for mline in partner_data.member_lines:
+                    if mline.date_to >= today:
+                        valid_line = True
+
+                    if mline.account_invoice_line:
+                        no_payment_info_at_all = False
+
+                if no_payment_info_at_all and valid_line:
+                    res[id] = 'paid'
+
+        return res
+
+
+    def _get_partners(self, *args, **kwargs):
+        res = super(Partner, self.pool.get('res.partner'))._get_partners(*args, **kwargs)
+        return res
+
+
     _columns = {
         'member_ident': fields.char('Member identifier', size=64),
         'associate_members': fields.one2many('res.partner', 'associate_member', 'Associate members', help='Members who are associated to this partner.'),
         # XXX: copied from openerp/addons/membership/membership.py
+        'membership_state': fields.function(
+                    __get_membership_state,
+                    string = 'Current Membership Status', type = 'selection',
+                    selection = STATE,
+                    store = {
+                        'account.invoice': (_get_invoice_partner, ['state'], 20),
+                        'membership.membership_line': (_get_partner_id, ['state'], 20),
+                        'res.partner': (_get_partners, ['free_member', 'membership_state', 'associate_member'], 20)
+                    }, help="""It indicates the membership state.
+                    -Non Member: A partner who has not applied for any membership.
+                    -Cancelled Member: A member who has cancelled his membership.
+                    -Old Member: A member whose membership date has expired.
+                    -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
+                    -Invoiced Member: A member whose invoice has been created.
+                    -Paying member: A member who has paid the membership fee."""),
+        # XXX: copied from openerp/addons/membership/membership.py
         'membership_start': fields.function(
                     _membership_date, multi = 'membership_start',
                     string = 'Membership Start Date', type = 'date',
@@ -209,6 +268,13 @@ class Partner(osv.osv):
         print ("DEV: [remembership] [partner] [create_membership_invoice] return=%s" % str(invoice_list))
         return invoice_list
 
+    def update_membership_status(self, cr, uid):
+        """Action for updating old members status with scheduled cron job"""
+        partner_obj = self.pool.get('res.partner')
+        today = date.today()
+        ids = partner_obj.search(cr, uid, [('membership_state', '=', 'paid'), ('membership_stop', '<', today)], context=None)
+        self.write(cr, uid, ids, {'membership_state': 'old'}, context=None)
+
 Partner()
 
 
@@ -247,7 +313,7 @@ class account_invoice_line(osv.osv):
                               and context.get('date_from')
                               and datetime.strptime(context('date_from'), "%Y-%m-%d")
                               or date.today())
-                            date_to   = date_from + relativedelta(months = +12) # TODO: parameterize this delta?
+                            date_to   = date_from + relativedelta(months=+12, days=-1) # TODO: parameterize this delta?
                             date_from = date_from.strftime("%Y-%m-%d")
                             date_to   = date_to  .strftime("%Y-%m-%d")
                         print ("DEV: [remembership] [account_invoice_line] [write] date_from: %s" % str(date_from))
@@ -319,7 +385,8 @@ class account_invoice_line(osv.osv):
                       and context.get('date_from')
                       and datetime.strptime(context.get('date_from'), "%Y-%m-%d")
                       or date.today())
-                    date_to   = date_from + relativedelta(days = +364) # TODO: parameterize this delta?
+                    print("#DEBUG: Date de début - %s" % str(date_from))
+                    date_to   = date_from + relativedelta(months=+12, days=-1) # TODO: parameterize this delta?
                     date_from = date_from.strftime("%Y-%m-%d")
                     date_to   = date_to  .strftime("%Y-%m-%d")
                 print ("DEV: [remembership] [account_invoice_line] [create] date_from: %s" % str(date_from))