Merge branch 'master' into membership_grouped
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 11 Jan 2013 12:00:41 +0000 (13:00 +0100)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Fri, 11 Jan 2013 12:00:41 +0000 (13:00 +0100)
1  2 
remembership.py

diff --combined remembership.py
  
  from osv import osv
  from osv import fields
 +import time
 +from datetime import datetime, date
 +from dateutil.relativedelta import relativedelta
 +from openerp.tools.translate import _
  
  
  class Partner(osv.osv):
  
      _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.'),
+         'associate_members': fields.one2many('res.partner', 'associate_member', 'Associate members', help='Members who are associated to this partner. If this member buy a membership, the associates members will be members too.'),
      }
  
      _sql_constraints = [
          ('member_ident_uniq', 'unique(member_ident, company_id)', 'The member identifier must be unique !'),
      ]
  
 +    def _membership_date(self, cr, uid, ids, name, args, context=None):
 +        """Return  date of membership"""
 +        name = name[0]
 +        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:
 +            # NOTE: hmm, ça devrait être toujours partner.id
 +            partner_id = partner.id
 +            res[partner.id] = {
 +                 'membership_start': False,
 +                 'membership_stop': False,
 +                 'membership_cancel': False
 +            }
 +            if name == 'membership_start':
 +                line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('date_cancel','=',False)],
 +                            limit=1, order='date_from', context=context)
 +                if line_id:
 +                        res[partner.id]['membership_start'] = member_line_obj.read(cr, uid, line_id[0],
 +                                ['date_from'], context=context)['date_from']
 +
 +            if name == 'membership_stop':
 +                line_id1 = member_line_obj.search(cr, uid, [('partner', '=', partner_id),('date_cancel','=',False)],
 +                            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],
 +                                ['date_to'], context=context)['date_to']
 +
 +            if name == 'membership_cancel':
 +                if partner.membership_state == 'canceled':
 +                    # NOTE: hmm, partner_id et pas partner.id ?
 +                    line_id2 = member_line_obj.search(cr, uid, [('partner', '=', partner_id)], limit=1, order='date_cancel', context=context)
 +                    if line_id2:
 +                        res[partner.id]['membership_cancel'] = member_line_obj.read(cr, uid, line_id2[0], ['date_cancel'], context=context)['date_cancel']
 +        return res
 +
 +    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)
 +
  Partner()
  
  
 +class Product(osv.osv):
 +    _inherit = 'product.product'
 +
 +    _columns = {
 +        'membership_grouped': fields.boolean('Grouped membership product', help='Check if it\'s a grouped membership product.'),
 +        'membership_date2date': fields.boolean('Date to date membership product', required=False, help='Check if it\'s a date to date membership product.'),
 +    }
 +
 +Product()
 +
 +
  class account_invoice_line(osv.osv):
      _inherit = 'account.invoice.line'
  
 +    def write(self, cr, uid, ids, vals, context=None):
 +        member_line_obj = self.pool.get('membership.membership_line')
 +        res = super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
 +        for line in self.browse(cr, uid, ids, context=context):
 +            if line.invoice_id.type == 'out_invoice':
 +                ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id)], context=context)
 +                if line.product_id and line.product_id.membership:
 +                    member_line_id = member_line_obj.search(cr, uid
 +                      , [('partner'             , '=', line.invoice_id.partner_id.id)
 +                        ,('account_invoice_line', '=', line.id)]
 +                      , limit=1
 +                      , context=context)
 +                    for member_line in member_line_obj.browse(cr, uid, member_line_id, context=context):
 +                      # NOTE: get member_line created in membership.account_invoice_line.create
 +                        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.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))
 +                        member_line_obj.write(cr, uid, member_line.id
 +                          , {'date_from': date_from
 +                            ,'date_to'  : date_to
 +                            }
 +                          , context=context)
 +                    if line.product_id.membership_grouped:
 +                        if line.invoice_id.partner_id.associate_members:
 +                            for associate_member in line.invoice_id.partner_id.associate_members:
 +                                print ("DEV: [write] [associate] date_from: %s" % str(date_from))
 +                                print ("DEV: [write] [associate] date_to  : %s" % str(date_to))
 +                                member_line_obj.create(cr, uid, {
 +                                    'partner': associate_member.id,
 +                                    'membership_id': line.product_id.id,
 +                                    'member_price': line.price_unit,
 +                                    'date': time.strftime('%Y-%m-%d'),
 +                                    'date_from': date_from,
 +                                    'date_to': date_to,
 +                                    'account_invoice_line': line.id,
 +                                }, context=context)
 +                        else:
 +                            print("DEV: mettre une contrainte pour l'objet\
 +                                  membership.membership_line interdisant les\
 +                                  adhésions groupées reliées à des partenaires\
 +                                  sans membres associés")
 +                    else:
 +                        associate_ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line', '=', line.id), ('partner', '!=', line.invoice_id.partner_id.id)], context=context)
 +                        member_line_obj.unlink(cr, uid, associate_ml_ids, context=context)
 +
 +                    #Define member ident if it's necessary
 +                    partners = [line.invoice_id.partner_id]
 +                    if line.invoice_id.partner_id.associate_members:
 +                        partners.extend(line.invoice_id.partner_id.associate_members)
 +                    for i in partners:
 +                        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})
 +                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)
 +        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)
          line = self.browse(cr, uid, res, context=context)
  
          if line.invoice_id.type == 'out_invoice' and line.product_id and line.product_id.membership:
 +            member_line_id = member_line_obj.search(cr, uid
 +              , [('partner'             , '=', line.invoice_id.partner_id.id)
 +                ,('account_invoice_line', '=', line.id)]
 +              , limit=1
 +              , context=context)
 +            for member_line in member_line_obj.browse(cr, uid, member_line_id, context=context):
 +              # NOTE: get member_line created in membership.account_invoice_line.create
 +                date_from = member_line.date_from
 +                date_to   = member_line.date_to
 +                if line.product_id.membership_date2date:
 +                    print "DEV: 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.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))
 +                member_line_obj.write(cr, uid, member_line.id
 +                  , {'date_from': date_from
 +                    ,'date_to'  : date_to
 +                    }
 +                  , context=context)
              partners = [line.invoice_id.partner_id]
 -            partners.extend(line.invoice_id.partner_id.associate_members)
 +            if line.product_id.membership_grouped and line.invoice_id.partner_id.associate_members:
 +                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))
 +                    member_line_obj.create(cr, uid, {
 +                        'partner': associate_member.id,
 +                        'membership_id': line.product_id.id,
 +                        'member_price': line.price_unit,
 +                        'date': time.strftime('%Y-%m-%d'),
 +                        'date_from': date_from,
 +                        'date_to': date_to,
 +                        'account_invoice_line': line.id,
 +                    }, context=context)
 +            elif line.product_id.membership_grouped and not line.invoice_id.partner_id.associate_members:
 +                raise osv.except_osv(_('Error!!!'), _('You try to invoice grouped membership product to a partner who hasn\'t associated partners.'))
 +            #Define member ident if it's necessary
              for i in partners:
                  if not i.member_ident:
                      mbr_id = self.pool.get('ir.sequence').get(cr, uid, 'member_ident')