[PYTHON] +change partner in membership line if s-he is change in pos_order and pos_or...
[burette/pos_membership.git] / pos_membership.py
index 3513176..e0b63c9 100644 (file)
@@ -385,12 +385,13 @@ class Partner(osv.osv):
         today = time.strftime('%Y-%m-%d')
         for id in ids:
             partner_data = self.browse(cr, uid, id, context=context)
-            if partner_data.membership_cancel and today > partner_data.membership_cancel:
-                res[id] = 'canceled'
-                continue
-            if partner_data.membership_stop and today > partner_data.membership_stop:
-                res[id] = 'old'
-                continue
+            if not partner_data.free_member:
+                if partner_data.membership_cancel and today > partner_data.membership_cancel:
+                    res[id] = 'canceled'
+                    continue
+                if partner_data.membership_stop and today > partner_data.membership_stop:
+                    res[id] = 'old'
+                    continue
             s = 4
             if partner_data.member_lines:
                 for mline in partner_data.member_lines:
@@ -444,6 +445,25 @@ class Partner(osv.osv):
                             s = 5
                         else:
                             s = 6
+
+                if s == 6:
+                    # special case when the partner is imported from a file,
+                    # in this case is has a valid membership lines but
+                    # no payment information associated, consider it valid
+
+                    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 or mline.pos_order_line:
+                            no_payment_info_at_all = False
+
+                    if no_payment_info_at_all and valid_line:
+                        s = 0
+
                 if s == 0:
                     res[id] = 'paid'
                 elif s == 1:
@@ -458,9 +478,6 @@ class Partner(osv.osv):
                     res[id] = 'none'
             if partner_data.free_member and s != 0:
                 res[id] = 'free'
-            if partner_data.associate_member:
-                res_state = self._membership_state(cr, uid, [partner_data.associate_member.id], name, args, context=context)
-                res[id] = res_state[partner_data.associate_member.id]
         return res
 
     def _membership_date(self, cr, uid, ids, name, args, context=None):
@@ -469,10 +486,7 @@ class Partner(osv.osv):
         res = {}
         member_line_obj = self.pool.get('membership.membership_line')
         for partner in self.browse(cr, uid, ids, context=context):
-            if partner.associate_member:
-                 partner_id = partner.associate_member.id
-            else:
-                 partner_id = partner.id
+            partner_id = partner.id
             res[partner.id] = {
                  'membership_start': False,
                  'membership_stop': False,
@@ -654,11 +668,24 @@ class pos_order(osv.osv):
         return res
 
     def onchange_partner_id(self, cr, uid, ids, part=False, context=None):
+        """
+        - Change membership stop value if partner change
+        - Change partner in membership line if s·he is change
+        """
         if not part:
             return {'value': {}}
         res = super(pos_order, self).onchange_partner_id(cr, uid, ids, part=part, context=context)
         membership_stop = self.pool.get('res.partner').browse(cr, uid, part, context=context).membership_stop
         res['value']['membership_stop'] = membership_stop
+        ml_line_obj = self.pool.get('membership.membership_line')
+        pol_obj = self.pool.get('pos.order.line')
+        for id in ids:
+            pol_ids = pol_obj.search(cr, uid, [('order_id', '=', id)], context=context)
+            pols = pol_obj.browse(cr, uid, pol_ids, context=context)
+            for pol in pols:
+                if pol.product_id.membership:
+                    ml_line_ids = ml_line_obj.search(cr, uid, [('pos_order_line', '=', pol.id)], context=context)
+                    ml_line_obj.write(cr, uid, ml_line_ids, {'partner': part}, context=context)
         return res
 
     def _get_membership_stop(self, cr, uid, ids, name, args, context=None):
@@ -697,16 +724,18 @@ class pos_order_line(osv.osv):
                     date_from = member_line.date_from
                     date_to   = member_line.date_to
                     if line.product_id.membership_date2date:
-                        date_from = ('date_from' in context
-                          and context.get('date_from')
-                          and datetime.strptime(context('date_from'), "%Y-%m-%d")
-                          or date.today())
+                        date_from = datetime.strptime(line.order_id.date_order, "%Y-%m-%d %H:%M:%S")
                         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")
-                    member_line_obj.write(cr, uid, member_line.id
-                      , {'date_from': date_from
-                        ,'date_to'  : date_to
+                    member_line_obj.write(cr, uid, member_line.id, {
+                        'partner': line.order_id.partner_id and line.order_id.partner_id.id or False,
+                        'membership_id': line.product_id.id,
+                        'member_price': line.price_unit,
+                        'date': date_from,
+                        'date_from': date_from,
+                        'date_to': date_to,
+                        'pos_order_line': line.id,
                         }
                       , context=context)
                 if line.product_id.membership_grouped:
@@ -768,10 +797,7 @@ class pos_order_line(osv.osv):
             if line.order_id.date_order > date_from and line.order_id.date_order < date_to:
                 date_from = line.order_id.date_order
             if line.product_id.membership_date2date:
-                date_from = ('date_from' in context
-                  and context.get('date_from')
-                  and datetime.strptime(context.get('date_from'), "%Y-%m-%d")
-                  or date.today())
+                date_from = datetime.strptime(line.order_id.date_order, "%Y-%m-%d %H:%M:%S")
                 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")
@@ -779,7 +805,7 @@ class pos_order_line(osv.osv):
                         'partner': line.order_id.partner_id and line.order_id.partner_id.id or False,
                         'membership_id': line.product_id.id,
                         'member_price': line.price_unit,
-                        'date': time.strftime('%Y-%m-%d'),
+                        'date': date_from,
                         'date_from': date_from,
                         'date_to': date_to,
                         'pos_order_line': line.id,