1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
22 from osv import fields, osv
23 from tools import config
27 ('none', 'Non Member'),
28 ('canceled', 'Canceled Member'),
29 ('old', 'Old Member'),
30 ('waiting', 'Waiting Member'),
31 ('invoiced', 'Invoiced Member'),
32 ('free', 'Free Member'),
33 ('paid', 'Paid Member'),
46 #~ REQUETE = '''SELECT partner, state FROM (
47 #~ SELECT members.partner AS partner,
48 #~ CASE WHEN MAX(members.state) = 0 THEN 'none'
49 #~ ELSE CASE WHEN MAX(members.state) = 1 THEN 'canceled'
50 #~ ELSE CASE WHEN MAX(members.state) = 2 THEN 'old'
51 #~ ELSE CASE WHEN MAX(members.state) = 3 THEN 'waiting'
52 #~ ELSE CASE WHEN MAX(members.state) = 4 THEN 'invoiced'
53 #~ ELSE CASE WHEN MAX(members.state) = 6 THEN 'free'
54 #~ ELSE CASE WHEN MAX(members.state) = 7 THEN 'paid'
55 #~ END END END END END END END END
58 #~ CASE WHEN MAX(inv_digit.state) = 4 THEN 7
59 #~ ELSE CASE WHEN MAX(inv_digit.state) = 3 THEN 4
60 #~ ELSE CASE WHEN MAX(inv_digit.state) = 2 THEN 3
61 #~ ELSE CASE WHEN MAX(inv_digit.state) = 1 THEN 1
65 #~ SELECT p.id as partner,
66 #~ CASE WHEN ai.state = 'paid' THEN 4
67 #~ ELSE CASE WHEN ai.state = 'open' THEN 3
68 #~ ELSE CASE WHEN ai.state = 'proforma' THEN 2
69 #~ ELSE CASE WHEN ai.state = 'draft' THEN 2
70 #~ ELSE CASE WHEN ai.state = 'cancel' THEN 1
71 #~ END END END END END
74 #~ JOIN account_invoice ai ON (
75 #~ p.id = ai.partner_id
77 #~ JOIN account_invoice_line ail ON (
78 #~ ail.invoice_id = ai.id
80 #~ JOIN membership_membership_line ml ON (
81 #~ ml.account_invoice_line = ail.id
83 #~ WHERE ml.date_from <= '%s'
84 #~ AND ml.date_to >= '%s'
92 #~ SELECT p.id AS partner,
93 #~ CASE WHEN p.free_member THEN 6
94 #~ ELSE CASE WHEN p.associate_member IN (
95 #~ SELECT ai.partner_id FROM account_invoice ai JOIN
96 #~ account_invoice_line ail ON (ail.invoice_id = ai.id AND ai.state = 'paid')
97 #~ JOIN membership_membership_line ml ON (ml.account_invoice_line = ail.id)
98 #~ WHERE ml.date_from <= '%s'
99 #~ AND ml.date_to >= '%s'
104 #~ FROM res_partner p
105 #~ WHERE p.free_member
106 #~ OR p.associate_member > 0
108 #~ SELECT p.id as partner,
109 #~ MAX(CASE WHEN ai.state = 'paid' THEN 2
113 #~ FROM res_partner p
114 #~ JOIN account_invoice ai ON (
115 #~ p.id = ai.partner_id
117 #~ JOIN account_invoice_line ail ON (
118 #~ ail.invoice_id = ai.id
120 #~ JOIN membership_membership_line ml ON (
121 #~ ml.account_invoice_line = ail.id
123 #~ WHERE ml.date_from < '%s'
124 #~ AND ml.date_to < '%s'
125 #~ AND ml.date_from <= ml.date_to
130 #~ GROUP BY members.partner
136 class membership_line(osv.osv):
139 def _check_membership_date(self, cr, uid, ids, context=None):
140 '''Check if membership product is not in the past'''
143 SELECT MIN(ml.date_to - ai.date_invoice)
144 FROM membership_membership_line ml
145 JOIN account_invoice_line ail ON (
146 ml.account_invoice_line = ail.id
148 JOIN account_invoice ai ON (
149 ai.id = ail.invoice_id)
150 WHERE ml.id =ANY(%s)''',(ids,))
153 if r[0] and r[0] < 0:
157 def _state(self, cr, uid, ids, name, args, context=None):
158 '''Compute the state lines'''
160 for line in self.browse(cr, uid, ids):
163 account_invoice i WHERE
165 SELECT l.invoice_id FROM
166 account_invoice_line l WHERE
168 SELECT ml.account_invoice_line FROM
169 membership_membership_line ml WHERE
174 fetched = cr.fetchone()
176 res[line.id] = 'canceled'
180 if (istate == 'draft') | (istate == 'proforma'):
182 elif istate == 'open':
184 elif istate == 'paid':
186 elif istate == 'cancel':
192 _description = __doc__
193 _name = 'membership.membership_line'
195 'partner': fields.many2one('res.partner', 'Partner', ondelete='cascade', select=1),
196 'date_from': fields.date('From'),
197 'date_to': fields.date('To'),
198 'date_cancel' : fields.date('Cancel date'),
199 'account_invoice_line': fields.many2one('account.invoice.line', 'Account Invoice line'),
200 'state': fields.function(_state, method=True, string='State', type='selection', selection=STATE),
202 _rec_name = 'partner'
205 (_check_membership_date, 'Error, this membership product is out of date', [])
211 class Partner(osv.osv):
213 _inherit = 'res.partner'
215 def _get_partner_id(self, cr, uid, ids, context=None):
216 data_inv = self.pool.get('membership.membership_line').browse(cr, uid, ids, context)
218 for data in data_inv:
219 list_partner.append(data.partner.id)
222 ids2 = self.pool.get('res.partner').search(cr, uid, [('associate_member','in',ids2)], context=context)
226 def _get_invoice_partner(self, cr, uid, ids, context=None):
227 data_inv = self.pool.get('account.invoice').browse(cr, uid, ids, context)
229 for data in data_inv:
230 list_partner.append(data.partner_id.id)
233 ids2 = self.pool.get('res.partner').search(cr, uid, [('associate_member','in',ids2)], context=context)
237 def _membership_state(self, cr, uid, ids, name, args, context=None):
241 today = time.strftime('%Y-%m-%d')
243 partner_data = self.browse(cr,uid,id)
244 if partner_data.membership_cancel and today > partner_data.membership_cancel:
247 if partner_data.membership_stop and today > partner_data.membership_stop:
251 if partner_data.member_lines:
252 for mline in partner_data.member_lines:
253 if mline.date_from <= today and mline.date_to >= today:
254 if mline.account_invoice_line and mline.account_invoice_line.invoice_id:
255 mstate = mline.account_invoice_line.invoice_id.state
259 elif mstate == 'open' and s!=0:
261 elif mstate == 'cancel' and s!=0 and s!=1:
263 elif (mstate == 'draft' or mstate == 'proforma') and s!=0 and s!=1:
266 for mline in partner_data.member_lines:
267 if mline.date_from < today and mline.date_to < today and mline.date_from<=mline.date_to and (mline.account_invoice_line and mline.account_invoice_line.invoice_id.state) == 'paid':
283 if partner_data.free_member and s!=0:
285 if partner_data.associate_member:
286 res_state = self._membership_state(cr, uid, [partner_data.associate_member.id], name, args, context)
287 res[id] = res_state[partner_data.associate_member.id]
290 def _membership_start(self, cr, uid, ids, name, args, context=None):
291 '''Return the start date of membership'''
293 member_line_obj = self.pool.get('membership.membership_line')
294 for partner in self.browse(cr, uid, ids):
295 if partner.associate_member:
296 partner_id = partner.associate_member.id
298 partner_id = partner.id
299 line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
300 limit=1, order='date_from')
302 res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
303 ['date_from'])['date_from']
305 res[partner.id] = False
308 def _membership_stop(self, cr, uid, ids, name, args, context=None):
309 '''Return the stop date of membership'''
311 member_line_obj = self.pool.get('membership.membership_line')
312 for partner in self.browse(cr, uid, ids):
313 cr.execute('select membership_state from res_partner where id=%s', (partner.id,))
314 data_state = cr.fetchall()
315 if partner.associate_member:
316 partner_id = partner.associate_member.id
318 partner_id = partner.id
319 line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
320 limit=1, order='date_to desc')
322 res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
323 ['date_to'])['date_to']
325 res[partner.id] = False
328 def _membership_cancel(self, cr, uid, ids, name, args, context=None):
329 '''Return the cancel date of membership'''
331 member_line_obj = self.pool.get('membership.membership_line')
332 for partner_id in ids:
333 line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
334 limit=1, order='date_cancel')
336 res[partner_id] = member_line_obj.read(cr, uid, line_id[0],
337 ['date_cancel'])['date_cancel']
339 res[partner_id] = False
342 def _get_partners(self, cr, uid, ids, context={}):
345 ids2 = self.search(cr, uid, [('associate_member','in',ids2)], context=context)
350 'associate_member': fields.many2one('res.partner', 'Associate member'),
351 'member_lines': fields.one2many('membership.membership_line', 'partner', 'Membership'),
352 'free_member': fields.boolean('Free member'),
353 'membership_amount': fields.float(
354 'Membership amount', digites=(16, 2),
355 help='The price negociated by the partner'),
356 'membership_state': fields.function(
357 _membership_state, method = True,
358 string = 'Current membership state', type = 'selection',
359 selection = STATE ,store = {
360 'account.invoice':(_get_invoice_partner,['state'], 10),
361 'membership.membership_line':(_get_partner_id,['state'], 10),
362 'res.partner':(_get_partners, ['free_member', 'membership_state'], 10)
365 'membership_start': fields.function(
366 _membership_start, method=True,
367 string = 'Start membership date', type = 'date',
369 'account.invoice':(_get_invoice_partner,['state'], 10),
370 'membership.membership_line':(_get_partner_id,['state'], 10),
371 'res.partner':(lambda self,cr,uid,ids,c={}:ids, ['free_member'], 10)
374 'membership_stop': fields.function(
375 _membership_stop, method = True,
376 string = 'Stop membership date', type = 'date',
378 'account.invoice':(_get_invoice_partner,['state'], 10),
379 'membership.membership_line':(_get_partner_id,['state'], 10),
380 'res.partner':(lambda self,cr,uid,ids,c={}:ids, ['free_member'], 10)
384 'membership_cancel': fields.function(
385 _membership_cancel, method = True,
386 string = 'Cancel membership date', type='date',
388 'account.invoice':(_get_invoice_partner,['state'], 10),
389 'membership.membership_line':(_get_partner_id,['state'], 10),
390 'res.partner':(lambda self,cr,uid,ids,c={}:ids, ['free_member'], 10)
395 'free_member': lambda *a: False,
396 'membership_cancel' : lambda *d : False,
399 def _check_recursion(self, cr, uid, ids):
402 cr.execute('select distinct associate_member from res_partner where id =ANY(%s)',(ids,))
403 ids = filter(None, map(lambda x:x[0], cr.fetchall()))
410 (_check_recursion, 'Error ! You can not create recursive associated members.', ['associate_member'])
415 class product_template(osv.osv):
416 _inherit = 'product.template'
418 'member_price':fields.float('Member Price', digits=(16, int(config['price_accuracy']))),
422 class Product(osv.osv):
424 def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
425 if ('product' in context) and (context['product']=='membership_product'):
426 model_data_ids_form = self.pool.get('ir.model.data').search(cr,user,[('model','=','ir.ui.view'),('name','in',['membership_products_form','membership_products_tree'])])
427 resource_id_form = self.pool.get('ir.model.data').read(cr,user,model_data_ids_form,fields=['res_id','name'])
429 for i in resource_id_form:
430 dict_model[i['name']]=i['res_id']
431 if view_type=='form':
432 view_id = dict_model['membership_products_form']
434 view_id = dict_model['membership_products_tree']
435 return super(Product,self).fields_view_get(cr, user, view_id, view_type, context, toolbar, submenu)
438 _inherit = 'product.product'
439 _description = 'product.product'
442 'membership': fields.boolean('Membership', help='Specify if this product is a membership product'),
443 'membership_date_from': fields.date('Date from'),
444 'membership_date_to': fields.date('Date to'),
445 # 'member_price':fields.float('Member Price'),
449 'membership': lambda *args: False
454 class Invoice(osv.osv):
457 _inherit = 'account.invoice'
459 def action_cancel(self, cr, uid, ids, context=None):
460 '''Create a 'date_cancel' on the membership_line object'''
463 member_line_obj = self.pool.get('membership.membership_line')
464 today = time.strftime('%Y-%m-%d')
465 for invoice in self.browse(cr, uid, ids):
466 mlines = member_line_obj.search(cr,uid,
467 [('account_invoice_line','in',
468 [ l.id for l in invoice.invoice_line])], context)
469 member_line_obj.write(cr,uid,mlines, {'date_cancel':today}, context)
470 return super(Invoice, self).action_cancel(cr, uid, ids, context)
474 class ReportPartnerMemberYear(osv.osv):
475 '''Membership by Years'''
477 _name = 'report.partner_member.year'
478 _description = __doc__
482 'year': fields.char('Year', size='4', readonly=True, select=1),
483 'canceled_number': fields.integer('Canceled', readonly=True),
484 'waiting_number': fields.integer('Waiting', readonly=True),
485 'invoiced_number': fields.integer('Invoiced', readonly=True),
486 'paid_number': fields.integer('Paid', readonly=True),
487 'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
488 'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
489 'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
490 'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
491 'currency': fields.many2one('res.currency', 'Currency', readonly=True,
496 '''Create the view'''
498 CREATE OR REPLACE VIEW report_partner_member_year AS (
501 COUNT(ncanceled) as canceled_number,
502 COUNT(npaid) as paid_number,
503 COUNT(ninvoiced) as invoiced_number,
504 COUNT(nwaiting) as waiting_number,
505 SUM(acanceled) as canceled_amount,
506 SUM(apaid) as paid_amount,
507 SUM(ainvoiced) as invoiced_amount,
508 SUM(awaiting) as waiting_amount,
512 CASE WHEN ai.state = 'cancel' THEN ml.id END AS ncanceled,
513 CASE WHEN ai.state = 'paid' THEN ml.id END AS npaid,
514 CASE WHEN ai.state = 'open' THEN ml.id END AS ninvoiced,
515 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
516 THEN ml.id END AS nwaiting,
517 CASE WHEN ai.state = 'cancel'
518 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
519 ELSE 0 END AS acanceled,
520 CASE WHEN ai.state = 'paid'
521 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
523 CASE WHEN ai.state = 'open'
524 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
525 ELSE 0 END AS ainvoiced,
526 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
527 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
528 ELSE 0 END AS awaiting,
529 TO_CHAR(ml.date_from, 'YYYY') AS year,
530 ai.currency_id AS currency,
532 FROM membership_membership_line ml
533 JOIN (account_invoice_line ail
534 LEFT JOIN account_invoice ai
535 ON (ail.invoice_id = ai.id))
536 ON (ml.account_invoice_line = ail.id)
538 ON (ml.partner = p.id)
539 GROUP BY TO_CHAR(ml.date_from, 'YYYY'), ai.state,
540 ai.currency_id, ml.id) AS foo
541 GROUP BY year, currency)
544 ReportPartnerMemberYear()
547 class ReportPartnerMemberYearNew(osv.osv):
548 '''New Membership by Years'''
550 _name = 'report.partner_member.year_new'
551 _description = __doc__
556 'year': fields.char('Year', size='4', readonly=True, select=1),
557 'canceled_number': fields.integer('Canceled', readonly=True),
558 'waiting_number': fields.integer('Waiting', readonly=True),
559 'invoiced_number': fields.integer('Invoiced', readonly=True),
560 'paid_number': fields.integer('Paid', readonly=True),
561 'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
562 'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
563 'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
564 'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
565 'currency': fields.many2one('res.currency', 'Currency', readonly=True,
570 '''Create the view'''
572 CREATE OR REPLACE VIEW report_partner_member_year AS (
575 COUNT(ncanceled) as canceled_number,
576 COUNT(npaid) as paid_number,
577 COUNT(ninvoiced) as invoiced_number,
578 COUNT(nwaiting) as waiting_number,
579 SUM(acanceled) as canceled_amount,
580 SUM(apaid) as paid_amount,
581 SUM(ainvoiced) as invoiced_amount,
582 SUM(awaiting) as waiting_amount,
586 CASE WHEN ai.state = 'cancel' THEN ml.id END AS ncanceled,
587 CASE WHEN ai.state = 'paid' THEN ml.id END AS npaid,
588 CASE WHEN ai.state = 'open' THEN ml.id END AS ninvoiced,
589 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
590 THEN ml.id END AS nwaiting,
591 CASE WHEN ai.state = 'cancel'
592 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
593 ELSE 0 END AS acanceled,
594 CASE WHEN ai.state = 'paid'
595 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
597 CASE WHEN ai.state = 'open'
598 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
599 ELSE 0 END AS ainvoiced,
600 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
601 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
602 ELSE 0 END AS awaiting,
603 TO_CHAR(ml.date_from, 'YYYY') AS year,
604 ai.currency_id AS currency,
606 FROM membership_membership_line ml
607 JOIN (account_invoice_line ail
608 LEFT JOIN account_invoice ai
609 ON (ail.invoice_id = ai.id))
610 ON (ml.account_invoice_line = ail.id)
612 ON (ml.partner = p.id)
613 GROUP BY TO_CHAR(ml.date_from, 'YYYY'), ai.state,
614 ai.currency_id, ml.id) AS foo
615 GROUP BY year, currency)
618 ReportPartnerMemberYear()
621 class ReportPartnerMemberYearNew(osv.osv):
622 '''New Membership by Years'''
624 _name = 'report.partner_member.year_new'
625 _description = __doc__
629 'year': fields.char('Year', size='4', readonly=True, select=1),
630 'canceled_number': fields.integer('Canceled', readonly=True),
631 'waiting_number': fields.integer('Waiting', readonly=True),
632 'invoiced_number': fields.integer('Invoiced', readonly=True),
633 'paid_number': fields.integer('Paid', readonly=True),
634 'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
635 'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
636 'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
637 'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
638 'currency': fields.many2one('res.currency', 'Currency', readonly=True,
642 def init(self, cursor):
643 '''Create the view'''
645 CREATE OR REPLACE VIEW report_partner_member_year_new AS (
648 COUNT(ncanceled) AS canceled_number,
649 COUNT(npaid) AS paid_number,
650 COUNT(ninvoiced) AS invoiced_number,
651 COUNT(nwaiting) AS waiting_number,
652 SUM(acanceled) AS canceled_amount,
653 SUM(apaid) AS paid_amount,
654 SUM(ainvoiced) AS invoiced_amount,
655 SUM(awaiting) AS waiting_amount,
659 CASE WHEN ai.state = 'cancel' THEN ml2.id END AS ncanceled,
660 CASE WHEN ai.state = 'paid' THEN ml2.id END AS npaid,
661 CASE WHEN ai.state = 'open' THEN ml2.id END AS ninvoiced,
662 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
663 THEN ml2.id END AS nwaiting,
664 CASE WHEN ai.state = 'cancel'
665 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
666 ELSE 0 END AS acanceled,
667 CASE WHEN ai.state = 'paid'
668 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
670 CASE WHEN ai.state = 'open'
671 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
672 ELSE 0 END AS ainvoiced,
673 CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
674 THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
675 ELSE 0 END AS awaiting,
676 TO_CHAR(ml2.date_from, 'YYYY') AS year,
677 ai.currency_id AS currency,
681 MIN(date_from) AS date_from
682 FROM membership_membership_line
685 JOIN membership_membership_line ml2
686 JOIN (account_invoice_line ail
687 LEFT JOIN account_invoice ai
688 ON (ail.invoice_id = ai.id))
689 ON (ml2.account_invoice_line = ail.id)
690 ON (ml1.id = ml2.partner AND ml1.date_from = ml2.date_from)
692 ON (ml2.partner = p.id)
693 GROUP BY TO_CHAR(ml2.date_from, 'YYYY'), ai.state,
694 ai.currency_id, ml2.id) AS foo
695 GROUP BY year, currency
699 ReportPartnerMemberYearNew()
701 class account_invoice_line(osv.osv):
702 _inherit='account.invoice.line'
703 def write(self, cr, uid, ids, vals, context=None):
706 res = super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
707 member_line_obj = self.pool.get('membership.membership_line')
708 for line in self.browse(cr, uid, ids):
709 ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line','=',line.id)])
710 if line.product_id and line.product_id.membership and not ml_ids:
711 # Product line has changed to a membership product
712 date_from = line.product_id.membership_date_from
713 date_to = line.product_id.membership_date_to
714 if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
715 date_from = line.invoice_id.date_invoice
716 line_id = member_line_obj.create(cr, uid, {
717 'partner': line.invoice_id.partner_id.id,
718 'date_from': date_from,
720 'account_invoice_line': line.id,
722 if line.product_id and not line.product_id.membership and ml_ids:
723 # Product line has changed to a non membership product
724 member_line_obj.unlink(cr, uid, ml_ids, context=context)
727 def unlink(self, cr, uid, ids, context=None):
730 member_line_obj = self.pool.get('membership.membership_line')
732 ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line','=',id)])
733 member_line_obj.unlink(cr, uid, ml_ids, context=context)
734 return super(account_invoice_line, self).unlink(cr, uid, ids, context=context)
736 def create(self, cr, uid, vals, context={}):
737 result = super(account_invoice_line, self).create(cr, uid, vals, context)
738 line = self.browse(cr, uid, result)
739 member_line_obj = self.pool.get('membership.membership_line')
740 ml_ids = member_line_obj.search(cr, uid, [('account_invoice_line','=',line.id)])
741 if line.product_id and line.product_id.membership and not ml_ids:
742 # Product line is a membership product
743 date_from = line.product_id.membership_date_from
744 date_to = line.product_id.membership_date_to
745 if line.invoice_id.date_invoice > date_from and line.invoice_id.date_invoice < date_to:
746 date_from = line.invoice_id.date_invoice
747 line_id = member_line_obj.create(cr, uid, {
748 'partner': line.invoice_id.partner_id and line.invoice_id.partner_id.id or False,
749 'date_from': date_from,
751 'account_invoice_line': line.id,
755 account_invoice_line()
756 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: