[MODULE] ~v8 migration
[burette/remembership.git] / remembership.py
index 999f8c8..7a03490 100644 (file)
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
 #
-#    Remembership module for OpenERP, Overload membership module
-#    Copyright (C) 2012 L'Heureux Cyclage (<http://www.heureux-cyclage.org>) Ludovic CHEVALIER
+#    Remembership module for OpenERP, Membership module enhancement and bug fixes
+#    Copyright (C) 2012-2013 L'Heureux Cyclage (<http://www.heureux-cyclage.org>)
 #
 #    This file is a part of Remembership
 #
 #
 ##############################################################################
 
-from osv import osv
-from osv import fields
+from openerp.osv import fields, osv
 import time
 from datetime import datetime, date
 from dateutil.relativedelta import relativedelta
 from openerp.tools.translate import _
 
-
 class Partner(osv.osv):
     _inherit = 'res.partner'
 
@@ -52,7 +50,7 @@ class Partner(osv.osv):
                  'membership_cancel': False
             }
             if name == 'membership_start':
-                line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('date_cancel','=',False)],
+                line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('state','!=','canceled')],
                             limit=1, order='date_from', context=context)
                 if line_id:
                     res[partner.id]['membership_start'] = member_line_obj.read(cr, uid, line_id[0],
@@ -63,7 +61,7 @@ class Partner(osv.osv):
                         print ("DEV: [_membership_date] date_from: %s" % str(res[partner.id]['membership_start']))
 
             if name == 'membership_stop':
-                line_id1 = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('date_cancel','=',False)],
+                line_id1 = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('state','!=','canceled')],
                             limit=1, order='date_to desc', context=context)
                 if line_id1:
                     res[partner.id]['membership_stop'] = member_line_obj.read(cr, uid, line_id1[0],
@@ -144,15 +142,83 @@ class Partner(osv.osv):
 
     def create_membership_invoice(self, cr, uid, ids, product_id=None, datas=None, context=None):
         # NOTE: use context to supply date_from to account_invoice_line.create
-        ctx = context and context.copy() or {}
-        ctx['date_from'] = datas.get('date_from', None)
-        return super(Partner, self).create_membership_invoice(cr, uid, ids, product_id=product_id, datas=datas, context=ctx)
+        context = context and context.copy() or {}
+        context.update({'date_from': datas.get('date_from', None)});
+        # XXX: copied from openerp/addons/membership/membership.py to fix account_invoice_line creation
+        print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s" % str(ids))
+        invoice_obj = self.pool.get('account.invoice')
+        invoice_line_obj = self.pool.get('account.invoice.line')
+        invoice_tax_obj = self.pool.get('account.invoice.tax')
+        product_id = product_id or datas.get('membership_product_id', False)
+        amount = datas.get('amount', 0.0)
+        invoice_list = []
+        if type(ids) in (int, long,):
+            ids = [ids]
+        for partner in self.browse(cr, uid, ids, context=context):
+            print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s partner=%s" % (str(ids),str(partner.id)))
+            account_id = partner.property_account_receivable and partner.property_account_receivable.id or False
+            fpos_id = partner.property_account_position and partner.property_account_position.id or False
+            addr = self.address_get(cr, uid, [partner.id], ['invoice'])
+            if partner.free_member:
+                raise osv.except_osv(_('Error!'),
+                        _("Partner is a free Member."))
+            if not addr.get('invoice', False):
+                raise osv.except_osv(_('Error!'),
+                        _("Partner doesn't have an address to make the invoice."))
+            quantity = 1
+            line_value =  {
+                'product_id': product_id,
+            }
+
+            print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s partner=%s [invoice_line_obj] [product_id_change]" % (str(ids),str(partner.id)))
+            line_dict = invoice_line_obj.product_id_change(cr, uid, {},
+                            product_id, False, quantity, '', 'out_invoice', partner.id, fpos_id, price_unit=amount, context=context)
+            line_value.update(line_dict['value'])
+            line_value['price_unit'] = amount
+            if line_value.get('invoice_line_tax_id', False):
+                tax_tab = [(6, 0, line_value['invoice_line_tax_id'])]
+                line_value['invoice_line_tax_id'] = tax_tab
+
+            print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s partner=%s [invoice_obj] [create] account=%s" % (str(ids),str(partner.id),str(account_id)))
+            # NOTE: let account_invoice_obj.create() call account_invoice_line.create()
+            #       to have a correct membership_state: becauce now fields.function 'store' watchdogs
+            #       are triggered after account_invoice_line.create().
+            invoice_id = invoice_obj.create(cr, uid, {
+                'partner_id': partner.id,
+                'account_id': account_id,
+                'fiscal_position': fpos_id or False,
+                'invoice_line':[(0, 0, line_value)]
+                }, context=context)
+            #line_value['invoice_id'] = invoice_id
+            #print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s partner=%s [invoice_line_obj] [create]" % (str(ids),str(partner.id)))
+            #invoice_line_id = invoice_line_obj.create(cr, uid, line_value, context=context)
+            #invoice_obj.write(cr, uid, invoice_id, {'invoice_line': line_value}, context=context)
+            print ("DEV: [remembership] [partner] [create_membership_invoice] : invoice_list.append(invoice_id) : pre")
+            invoice_list.append(invoice_id)
+            print ("DEV: [remembership] [partner] [create_membership_invoice] : invoice_list.append(invoice_id) : post")
+            if line_value['invoice_line_tax_id']:
+                tax_value = invoice_tax_obj.compute(cr, uid, invoice_id).values()
+                for tax in tax_value:
+                       invoice_tax_obj.create(cr, uid, tax, context=context)
+        # NOTE: this wasn't working, and is not needed now.
+        #recompute the membership_state of those partners
+        #print ("DEV: [remembership] [partner] [create_membership_invoice] ids=%s [recompute states]" % str(ids))
+        #self.pool.get('res.partner').write(cr, uid, ids, {}, context=context)
+        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()
 
 
 class Product(osv.osv):
-    _inherit = 'product.product'
+    _inherit = 'product.template'
 
     _columns = {
         'membership_grouped': fields.boolean('Grouped membership product', help='Check if it\'s a grouped membership product.'),
@@ -182,12 +248,15 @@ class account_invoice_line(osv.osv):
                         date_from = member_line.date_from
                         date_to   = member_line.date_to
                         if line.product_id.membership_date2date:
-                            date_from = context['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_from = ('date_from' in context
+                              and context.get('date_from')
+                              and datetime.strptime(context('date_from'), "%Y-%m-%d")
+                              or date.today())
+                            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: [write] date_from: %s" % str(date_from))
-                        print ("DEV: [write] date_to  : %s" % str(date_to))
+                        print ("DEV: [remembership] [account_invoice_line] [write] date_from: %s" % str(date_from))
+                        print ("DEV: [remembership] [account_invoice_line] [write] date_to  : %s" % str(date_to))
                         member_line_obj.write(cr, uid, member_line.id
                           , {'date_from': date_from
                             ,'date_to'  : date_to
@@ -201,8 +270,8 @@ class account_invoice_line(osv.osv):
                                 ]
                               , context=context)
                             for associate_member_line in member_line_obj.browse(cr, uid, associate_member_line_ids, context=context):
-                                print ("DEV: [write] [associate] date_from: %s" % str(date_from))
-                                print ("DEV: [write] [associate] date_to  : %s" % str(date_to))
+                                print ("DEV: [remembership] [account_invoice_line] [write] [associate] date_from: %s" % str(date_from))
+                                print ("DEV: [remembership] [account_invoice_line] [write] [associate] date_to  : %s" % str(date_to))
                                 member_line_obj.write(cr, uid, associate_member_line.id
                                   , {'date_from': date_from
                                     ,'date_to'  : date_to
@@ -220,7 +289,6 @@ class account_invoice_line(osv.osv):
                             ]
                           , context=context)
                         member_line_obj.unlink(cr, uid, associate_member_line_ids, context=context)
-
                     #Define member ident if it's necessary
                     partners = [line.invoice_id.partner_id]
                     if line.invoice_id.partner_id.associate_members:
@@ -232,11 +300,13 @@ class account_invoice_line(osv.osv):
                 if line.product_id and not line.product_id.membership and ml_ids:
                     # Product line has changed to a non membership product
                     member_line_obj.unlink(cr, uid, ml_ids, context=context)
+        print ("DEV: [remembership] [account_invoice_line] [write] : return=%s" % str(res))
         return res
 
     def create(self, cr, uid, vals, context=None):
         member_line_obj = self.pool.get('membership.membership_line')
         res = super(account_invoice_line, self).create(cr, uid, vals, context=context)
+        print ("DEV: [remembership] [account_invoice_line] [create] : begin res=%s" % str(res))
         line = self.browse(cr, uid, res, context=context)
 
         if line.invoice_id.type == 'out_invoice' and line.product_id and line.product_id.membership:
@@ -251,14 +321,15 @@ class account_invoice_line(osv.osv):
                 date_to   = member_line.date_to
                 if line.product_id.membership_date2date:
                     date_from = ('date_from' in context
-                      and context['date_from']
-                      and datetime.strptime(context['date_from'], "%Y-%m-%d")
+                      and context.get('date_from')
+                      and datetime.strptime(context.get('date_from'), "%Y-%m-%d")
                       or date.today())
-                    date_to   = date_from + relativedelta(months = +12) # 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: [create] date_from: %s" % str(date_from))
-                print ("DEV: [create] date_to  : %s" % str(date_to))
+                print ("DEV: [remembership] [account_invoice_line] [create] date_from: %s" % str(date_from))
+                print ("DEV: [remembership] [account_invoice_line] [create] date_to  : %s" % str(date_to))
                 member_line_obj.write(cr, uid, member_line.id
                   , {'date_from': date_from
                     ,'date_to'  : date_to
@@ -269,8 +340,8 @@ class account_invoice_line(osv.osv):
                 partners.extend(line.invoice_id.partner_id.associate_members)
                 #Adding membership lines just for associate partners
                 for associate_member in line.invoice_id.partner_id.associate_members:
-                    print ("DEV: [create] [associate] date_from: %s" % str(date_from))
-                    print ("DEV: [create] [associate] date_to  : %s" % str(date_to))
+                    print ("DEV: [remembership] [account_invoice_line] [create] [associate] date_from: %s" % str(date_from))
+                    print ("DEV: [remembership] [account_invoice_line] [create] [associate] date_to  : %s" % str(date_to))
                     member_line_obj.create(cr, uid, {
                         'partner': associate_member.id,
                         'membership_id': line.product_id.id,
@@ -287,25 +358,8 @@ class account_invoice_line(osv.osv):
                 if not i.member_ident:
                     mbr_id = self.pool.get('ir.sequence').get(cr, uid, 'member_ident')
                     self.pool.get('res.partner').write(cr, uid, i.id, {'member_ident': mbr_id})
+        print ("DEV: [remembership] [account_invoice_line] [create] : return=%s" % str(res))
         return res
 
 account_invoice_line()
-
-
-class pos_make_payment(osv.osv_memory):
-    _inherit = 'pos.make.payment'
-
-    def check(self, cr, uid, ids, context=None):
-        """
-        Auto invoice orders. Temporarly solution before make partner members just with orders, without invoice.
-        """
-        res = super(pos_make_payment, self).check(cr, uid, ids, context=context)
-
-        order_obj = self.pool.get('pos.order')
-        order_obj.action_invoice(cr, uid, ids, context=context)
-
-        return res
-
-pos_make_payment()
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: