From e93f9c5bccc5a60dbb832805ad3ffbb9cc553e50 Mon Sep 17 00:00:00 2001 From: Julien Moutinho Date: Fri, 21 Dec 2012 06:01:48 +0100 Subject: [PATCH] [membership_date2date] initial implementation XXX: there are bugs in the dates of associate members when mixing several membership products XML product can be made date to date with: True XML invoice can be done like that: where date_from is %Y-%m-%d or None for today() NOTE: membership currently needs this fix: diff -Nru0 old/membership.py new/membership.py --- old/membership.py 2012-12-21 05:59:41.930076247 +0100 +++ new/membership.py 2012-12-21 05:59:06.338076588 +0100 @@ -340 +340 @@ - _membership_date, multi = 'membeship_start', + _membership_date, multi = 'membership_start', --- remembership.py | 60 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/remembership.py b/remembership.py index c2e6c85..ee17cb1 100644 --- a/remembership.py +++ b/remembership.py @@ -24,6 +24,8 @@ from osv import osv from osv import fields import time +from datetime import datetime, date +from dateutil.relativedelta import relativedelta class Partner(osv.osv): @@ -38,6 +40,12 @@ class Partner(osv.osv): ('member_ident_uniq', 'unique(member_ident, company_id)', 'The member identifier must be unique !'), ] + 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() @@ -55,7 +63,6 @@ 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) @@ -63,10 +70,25 @@ class account_invoice_line(osv.osv): 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: - date_from = line.product_id.membership_date_from - date_to = line.product_id.membership_date_to - if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to: - date_from = line.invoice_id.date_invoice + 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") + 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: @@ -107,15 +129,35 @@ class account_invoice_line(osv.osv): line = self.browse(cr, uid, res, context=context) if line.invoice_id.type == 'out_invoice' and line.product_id and line.product_id.membership: - date_from = line.product_id.membership_date_from - date_to = line.product_id.membership_date_to - if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to: - date_from = line.invoice_id.date_invoice + 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: date_from: %s" % str(date_from)) + print ("DEV: 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] 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: [associate] date_from: %s" % str(date_from)) + print ("DEV: [associate] date_to : %s" % str(date_to)) member_line_obj.create(cr, uid, { 'partner': associate_member.id, 'membership_id': line.product_id.id, -- 2.20.1