1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # POS Membership module for OpenERP, Manage membership payments from POS.
5 # Copyright (C) 2013 L'Heureux Cyclage (<http://www.heureux-cyclage.org>)
7 # This file is a part of POS Membership
9 # POS Membership is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
14 # ReMembership is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 ##############################################################################
23 from openerp
import netsvc
24 from openerp
.osv
import fields
, osv
25 from openerp
.tools
.translate
import _
27 from datetime
import datetime
, date
28 from dateutil
.relativedelta
import relativedelta
32 ('none', 'Non Member'),
33 ('canceled', 'Cancelled Member'),
34 ('old', 'Old Member'),
35 ('waiting', 'Waiting Member'),
36 ('invoiced', 'Invoiced Member'),
37 ('free', 'Free Member'),
38 ('paid', 'Paid Member'),
41 class membership_line(osv
.osv
):
43 _inherit
= 'membership.membership_line'
45 def _get_partners(self
, cr
, uid
, ids
, context
=None):
46 list_membership_line
= []
47 member_line_obj
= self
.pool
.get('membership.membership_line')
48 for partner
in self
.pool
.get('res.partner').browse(cr
, uid
, ids
, context
=context
):
49 if partner
.member_lines
:
50 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('id', 'in', [ l
.id for l
in partner
.member_lines
])], context
=context
)
51 return list_membership_line
53 #def _get_membership_lines_from_account_invoice(self, cr, uid, ids, context=None):
54 # list_membership_line = []
55 # member_line_obj = self.pool.get('membership.membership_line')
56 # for invoice in self.pool.get('account.invoice').browse(cr, uid, ids, context=context):
57 # if invoice.invoice_line:
58 # list_membership_line += member_line_obj.search(cr, uid, [('account_invoice_line', 'in', [ l.id for l in invoice.invoice_line])], context=context)
60 # { 'class': 'account.invoice'
61 # , 'ids': list_membership_line
63 # #res= list_membership_line
64 # print("DEV: [pos_membership] [membership_line] [_get_membership_lines_from_account_invoice]: res=%s" % str(res))
66 def _get_membership_lines_from_pos_order(self
, cr
, uid
, ids
, context
=None):
67 list_membership_line
= []
68 member_line_obj
= self
.pool
.get('membership.membership_line')
69 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
71 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('pos_order_line', 'in', [ l
.id for l
in order
.lines
])], context
=context
)
73 # { 'class': 'pos.order'
74 # , 'ids': list_membership_line
76 res
= list_membership_line
77 print("DEV: [pos_membership] [membership_line] [_get_membership_lines_from_pos_order]: res=%s" % str(res
))
80 def _check_membership_date(self
, cr
, uid
, ids
, context
=None):
81 """Check if membership product is not in the past
82 @param self: The object pointer
83 @param cr: the current row, from the database cursor,
84 @param uid: the current user’s ID for security checks,
85 @param ids: List of Membership Line IDs
86 @param context: A standard dictionary for contextual values
90 SELECT MIN(ml.date_to - ai.date_invoice)
91 FROM membership_membership_line ml
92 JOIN account_invoice_line ail ON (
93 ml.account_invoice_line = ail.id
95 JOIN account_invoice ai ON (
96 ai.id = ail.invoice_id)
97 WHERE ml.id IN %s''', (tuple(ids
),))
100 if r
[0] and r
[0] < 0:
103 SELECT MIN(ml.date_to - ai.date_order)
104 FROM membership_membership_line ml
105 JOIN pos_order_line ail ON (
106 ml.pos_order_line = ail.id
108 JOIN pos_order ai ON (
109 ai.id = ail.order_id)
110 WHERE ml.id IN %s''', (tuple(ids
),))
113 if r
[0] and r
[0] < 0:
117 def _state(self
, cr
, uid
, ids
, name
, args
, context
=None):
118 """Compute the state lines
119 @param self: The object pointer
120 @param cr: the current row, from the database cursor,
121 @param uid: the current user’s ID for security checks,
122 @param ids: List of Membership Line IDs
123 @param name: Field Name
124 @param context: A standard dictionary for contextual values
125 @param return: Dictionary of state Value
128 print("DEV: [pos_membership] [membership_line] [_state]: name=%s ids=%s args=%s context=%s" % (str(name
), str(ids
), str(args
), str(context
)))
129 inv_obj
= self
.pool
.get('account.invoice')
130 ord_obj
= self
.pool
.get('pos.order')
131 for line
in self
.browse(cr
, uid
, ids
, context
=context
):
133 SELECT i.state, i.id FROM
137 SELECT l.invoice_id FROM
138 account_invoice_line l WHERE
140 SELECT ml.account_invoice_line FROM
141 membership_membership_line ml WHERE
146 fetched
= cr
.fetchone()
150 if (istate
== 'draft') |
(istate
== 'proforma'):
152 elif istate
== 'open':
154 elif istate
== 'paid':
156 inv
= inv_obj
.browse(cr
, uid
, fetched
[1], context
=context
)
157 for payment
in inv
.payment_ids
:
158 if payment
.invoice
and payment
.invoice
.type == 'out_refund':
160 elif istate
== 'cancel':
165 SELECT i.state, i.id FROM
169 SELECT l.order_id FROM
170 pos_order_line l WHERE
172 SELECT ml.pos_order_line FROM
173 membership_membership_line ml WHERE
178 fetched
= cr
.fetchone()
180 res
[line
.id] = 'canceled'
184 if (ostate
== 'draft'):
186 elif (ostate
== 'paid') |
(ostate
== 'done') |
(ostate
== 'invoiced'):
188 # XXX: regarder l'équivalent de out_refund pour un pos.order
189 print("DEV: [pos_membership] [membership_line] [_state]: paid: TODO")
190 #inv = ord_obj.browse(cr, uid, fetched[1], context=context)
191 #for payment in inv.payment_ids:
192 # if payment.invoice and payment.invoice.type == 'out_refund':
194 elif ostate
== 'cancel':
200 'pos_order_line': fields
.many2one('pos.order.line', 'POS Order line', readonly
=True),
201 'pos_order_id': fields
.related('pos_order_line', 'order_id', type='many2one', relation
='pos.order', string
='Order', readonly
=True),
202 'state': fields
.function(_state
,
203 string
='Membership Status', type='selection',
206 #'account.invoice': (_get_membership_lines_from_account_invoice, ['state'], 10),
207 'pos.order': (_get_membership_lines_from_pos_order
, ['state'], 10),
208 'res.partner': (_get_partners
, ['membership_state'], 12),
209 }, help="""It indicates the membership status.
210 -Non Member: A member who has not applied for any membership.
211 -Cancelled Member: A member who has cancelled his membership.
212 -Old Member: A member whose membership date has expired.
213 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
214 -Invoiced Member: A member whose invoice has been created.
215 -Paid Member: A member who has paid the membership amount."""),
216 'company_id': fields
.related('account_invoice_line', 'invoice_id', 'company_id', type="many2one", relation
="res.company", string
="Company", readonly
=True, store
=True)
217 # XXX: pos_order_line a aussi un company_id
222 class Partner(osv
.osv
):
224 _inherit
= 'res.partner'
226 def _get_partner_id(self
, cr
, uid
, ids
, context
=None):
227 member_line_obj
= self
.pool
.get('membership.membership_line')
228 res_obj
= self
.pool
.get('res.partner')
229 data_inv
= member_line_obj
.browse(cr
, uid
, ids
, context
=context
)
231 for data
in data_inv
:
232 list_partner
.append(data
.partner
.id)
235 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
239 def _get_invoice_partner(self
, cr
, uid
, ids
, context
=None):
240 inv_obj
= self
.pool
.get('account.invoice')
241 res_obj
= self
.pool
.get('res.partner')
242 data_inv
= inv_obj
.browse(cr
, uid
, ids
, context
=context
)
244 for data
in data_inv
:
245 list_partner
.append(data
.partner_id
.id)
248 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
252 def _get_order_partner(self
, cr
, uid
, ids
, context
=None):
253 ord_obj
= self
.pool
.get('pos.order')
254 res_obj
= self
.pool
.get('res.partner')
255 data_ord
= ord_obj
.browse(cr
, uid
, ids
, context
=context
)
257 for data
in data_ord
:
258 list_partner
.append(data
.partner_id
.id)
261 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
265 def _membership_state(self
, cr
, uid
, ids
, name
, args
, context
=None):
266 """This Function return Membership State For Given Partner.
267 @param self: The object pointer
268 @param cr: the current row, from the database cursor,
269 @param uid: the current user’s ID for security checks,
270 @param ids: List of Partner IDs
271 @param name: Field Name
272 @param context: A standard dictionary for contextual values
273 @param return: Dictionary of Membership state Value
278 today
= time
.strftime('%Y-%m-%d')
280 partner_data
= self
.browse(cr
, uid
, id, context
=context
)
281 if partner_data
.membership_cancel
and today
> partner_data
.membership_cancel
:
284 if partner_data
.membership_stop
and today
> partner_data
.membership_stop
:
288 if partner_data
.member_lines
:
289 for mline
in partner_data
.member_lines
:
290 if mline
.date_to
>= today
:
291 if mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
:
292 mstate
= mline
.account_invoice_line
.invoice_id
.state
295 inv
= mline
.account_invoice_line
.invoice_id
296 for payment
in inv
.payment_ids
:
297 if payment
.invoice
.type == 'out_refund':
300 elif mstate
== 'open' and s
!=0:
302 elif mstate
== 'cancel' and s
!=0 and s
!=1:
304 elif (mstate
== 'draft' or mstate
== 'proforma') and s
!=0 and s
!=1:
306 elif mline
.order_pos_line
and mline
.order_pos_line
.order_id
:
307 mstate
= mline
.pos_order_line
.order_id
.state
308 if (mstate
== 'paid') |
(mstate
== 'done') |
(mstate
== 'paid'):
310 # XXX: regarder l'équivalent de out_refund pour un pos.order
311 print("DEV: [pos_membership] [partner] [_membership_state]: paid: TODO")
312 #inv = mline.pos_order_line.order_id
313 #for payment in inv.payment_ids:
314 # if payment.invoice.type == 'out_refund':
317 elif mstate
== 'open' and s
!=0:
318 # XXX: 1 donne invoiced, c'est pitet pas bon
319 print("DEV: [pos_membership] [partner] [_membership_state]: invoiced: TODO")
321 elif mstate
== 'cancel' and s
!=0 and s
!=1:
323 elif mstate
== 'draft' and s
!=0 and s
!=1:
326 for mline
in partner_data
.member_lines
:
327 if mline
.date_from
< today
and \
328 mline
.date_to
< today
and \
329 mline
.date_from
<= mline
.date_to
and \
330 ( (mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
.state
) == 'paid' or \
331 ( mline
.pos_order_line
and \
332 ( mline
.pos_order_line
.order_id
.state
== 'paid' or \
333 mline
.pos_order_line
.order_id
.state
== 'done' or \
334 mline
.pos_order_line
.order_id
.state
== 'invoiced' ))):
350 if partner_data
.free_member
and s
!=0:
352 if partner_data
.associate_member
:
353 res_state
= self
._membership
_state
(cr
, uid
, [partner_data
.associate_member
.id], name
, args
, context
=context
)
354 res
[id] = res_state
[partner_data
.associate_member
.id]
357 def _membership_date(self
, cr
, uid
, ids
, name
, args
, context
=None):
358 """Return date of membership"""
361 member_line_obj
= self
.pool
.get('membership.membership_line')
362 for partner
in self
.browse(cr
, uid
, ids
, context
=context
):
363 if partner
.associate_member
:
364 partner_id
= partner
.associate_member
.id
366 partner_id
= partner
.id
368 'membership_start': False,
369 'membership_stop': False,
370 'membership_cancel': False
372 if name
== 'membership_start':
373 line_id
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
374 limit
=1, order
='date_from', context
=context
)
376 res
[partner
.id]['membership_start'] = member_line_obj
.read(cr
, uid
, line_id
[0],
377 ['date_from'], context
=context
)['date_from']
379 if name
== 'membership_stop':
380 line_id1
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
381 limit
=1, order
='date_to desc', context
=context
)
383 res
[partner
.id]['membership_stop'] = member_line_obj
.read(cr
, uid
, line_id1
[0],
384 ['date_to'], context
=context
)['date_to']
386 if name
== 'membership_cancel':
387 if partner
.membership_state
== 'canceled':
388 line_id2
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner
.id)], limit
=1, order
='date_cancel', context
=context
)
390 res
[partner
.id]['membership_cancel'] = member_line_obj
.read(cr
, uid
, line_id2
[0], ['date_cancel'], context
=context
)['date_cancel']
393 def _get_partners(self
, cr
, uid
, ids
, context
=None):
396 ids2
= self
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
400 def __get_membership_state(self
, *args
, **kwargs
):
401 return self
._membership
_state
(*args
, **kwargs
)
404 'associate_member': fields
.many2one('res.partner', 'Associate Member',help="A member with whom you want to associate your membership.It will consider the membership state of the associated member."),
405 'member_lines': fields
.one2many('membership.membership_line', 'partner', 'Membership'),
406 'free_member': fields
.boolean('Free Member', help = "Select if you want to give free membership."),
407 'membership_amount': fields
.float(
408 'Membership Amount', digits
=(16, 2),
409 help = 'The price negotiated by the partner'),
410 'membership_state': fields
.function(
411 __get_membership_state
,
412 string
= 'Current Membership Status', type = 'selection',
415 'account.invoice': (_get_invoice_partner
, ['state'], 10),
416 'pos.order': (_get_order_partner
, ['state'], 10),
417 'membership.membership_line': (_get_partner_id
, ['state'], 10),
418 'res.partner': (_get_partners
, ['free_member', 'membership_state', 'associate_member'], 10)
419 }, help="""It indicates the membership state.
420 -Non Member: A partner who has not applied for any membership.
421 -Cancelled Member: A member who has cancelled his membership.
422 -Old Member: A member whose membership date has expired.
423 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
424 -Invoiced Member: A member whose invoice has been created.
425 -Paying member: A member who has paid the membership fee."""),
426 'membership_start': fields
.function(
427 _membership_date
, multi
= 'membeship_start',
428 string
= 'Membership Start Date', type = 'date',
430 'account.invoice': (_get_invoice_partner
, ['state'], 10),
431 'pos.order': (_get_order_partner
, ['state'], 10),
432 'membership.membership_line': (_get_partner_id
, ['state'], 10, ),
433 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
434 }, help="Date from which membership becomes active."),
435 'membership_stop': fields
.function(
437 string
= 'Membership End Date', type='date', multi
='membership_stop',
439 'account.invoice': (_get_invoice_partner
, ['state'], 10),
440 'pos.order': (_get_order_partner
, ['state'], 10),
441 'membership.membership_line': (_get_partner_id
, ['state'], 10),
442 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
443 }, help="Date until which membership remains active."),
444 'membership_cancel': fields
.function(
446 string
= 'Cancel Membership Date', type='date', multi
='membership_cancel',
448 'account.invoice': (_get_invoice_partner
, ['state'], 11),
449 'pos.order': (_get_order_partner
, ['state'], 11),
450 'membership.membership_line': (_get_partner_id
, ['state'], 10),
451 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
452 }, help="Date on which membership has been cancelled"),
457 class pos_order(osv
.osv
):
458 _inherit
= 'pos.order'
460 def _check_membership_product(self
, cr
, uid
, ids
, context
=None):
461 #TODO : check condition and return boolean accordingly
462 if not context
is None:
464 order_line_obj
= self
.pool
.get('pos.order.line')
465 data_order_line
= order_line_obj
.browse(cr
, uid
, ids
, context
=context
)
466 for data
in data_order_line
:
467 print("DEV: [pos_membership] [_check_membership_product] [order_line]: data=%s product=%s" % (str(data
.id), str(data
.product_id
)))
471 (_check_membership_product
, 'Error: Invalid Message', ['field_name']),
474 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py
475 def action_invoice(self
, cr
, uid
, ids
, context
=None):
476 print ("DEV: [pos_membership] [pos_order] [action_invoice]")
477 wf_service
= netsvc
.LocalService("workflow")
478 inv_ref
= self
.pool
.get('account.invoice')
479 inv_line_ref
= self
.pool
.get('account.invoice.line')
480 product_obj
= self
.pool
.get('product.product')
483 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
485 inv_ids
.append(order
.invoice_id
.id)
488 if not order
.partner_id
:
489 raise osv
.except_osv(_('Error!'), _('Please provide a partner for the sale.'))
491 acc
= order
.partner_id
.property_account_receivable
.id
492 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py to fix account.invoice.line creation
495 'origin': order
.name
,
497 'journal_id': order
.sale_journal
.id or None,
498 'type': 'out_invoice',
499 'reference': order
.name
,
500 'partner_id': order
.partner_id
.id,
501 'comment': order
.note
or '',
502 'currency_id': order
.pricelist_id
.currency_id
.id, # considering partner's sale pricelist's currency
505 inv
.update(inv_ref
.onchange_partner_id(cr
, uid
, [], 'out_invoice', order
.partner_id
.id)['value'])
506 if not inv
.get('account_id', None):
507 inv
['account_id'] = acc
508 for line
in order
.lines
:
510 #'invoice_id': inv_id,
511 'product_id': line
.product_id
.id,
512 'quantity': line
.qty
,
514 inv_name
= product_obj
.name_get(cr
, uid
, [line
.product_id
.id], context
=context
)[0][1]
515 inv_line
.update(inv_line_ref
.product_id_change(cr
, uid
, [],
517 line
.product_id
.uom_id
.id,
518 line
.qty
, partner_id
= order
.partner_id
.id,
519 fposition_id
=order
.partner_id
.property_account_position
.id)['value'])
520 if line
.product_id
.description_sale
:
521 inv_line
['note'] = line
.product_id
.description_sale
522 inv_line
['price_unit'] = line
.price_unit
523 inv_line
['discount'] = line
.discount
524 inv_line
['name'] = inv_name
525 inv_line
['invoice_line_tax_id'] = ('invoice_line_tax_id' in inv_line
)\
526 and [(6, 0, inv_line
['invoice_line_tax_id'])] or []
527 #inv_line_ref.create(cr, uid, inv_line, context=context)
528 inv
['invoice_line'].append((0, 0, inv_line
))
529 inv_id
= inv_ref
.create(cr
, uid
, inv
, context
=context
)
531 self
.write(cr
, uid
, [order
.id], {'invoice_id': inv_id
, 'state': 'invoiced'}, context
=context
)
532 inv_ref
.confirm_paid(cr
, uid
, [inv_id
], context
=context
)
533 inv_ids
.append(inv_id
)
534 inv_ref
.button_reset_taxes(cr
, uid
, [inv_id
], context
=context
)
535 wf_service
.trg_validate(uid
, 'pos.order', order
.id, 'invoice', cr
)
537 if not inv_ids
: return {}
539 mod_obj
= self
.pool
.get('ir.model.data')
540 res
= mod_obj
.get_object_reference(cr
, uid
, 'account', 'invoice_form')
541 res_id
= res
and res
[1] or False
543 'name': _('Customer Invoice'),
547 'res_model': 'account.invoice',
548 'context': "{'type':'out_invoice'}",
549 'type': 'ir.actions.act_window',
552 'res_id': inv_ids
and inv_ids
[0] or False,
557 class pos_order_line(osv
.osv
):
558 _inherit
= 'pos.order.line'
560 def write(self
, cr
, uid
, ids
, vals
, context
=None):
561 member_line_obj
= self
.pool
.get('membership.membership_line')
562 res
= super(pos_order_line
, self
).write(cr
, uid
, ids
, vals
, context
=context
)
563 for line
in self
.browse(cr
, uid
, ids
, context
=context
):
564 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', line
.id)], context
=context
)
565 if line
.product_id
and line
.product_id
.membership
and not ml_ids
:
566 date_from
= line
.product_id
.membership_date_from
567 date_to
= line
.product_id
.membership_date_to
568 if line
.invoice_id
.date_invoice
> date_from
and line
.invoice_id
.date_invoice
< date_to
:
569 date_from
= line
.invoice_id
.date_invoice
571 if line
.product_id
.membership_date2date
:
572 date_from
= ('date_from' in context
573 and context
['date_from']
574 and datetime
.strptime(context
['date_from'], "%Y-%m-%d")
576 date_to
= date_from
+ relativedelta(months
= +12) # TODO: parameterize this delta?
577 date_from
= date_from
.strftime("%Y-%m-%d")
578 date_to
= date_to
.strftime("%Y-%m-%d")
579 print ("DEV: [pos_membership] [write] date_from: %s" % str(date_from
))
580 print ("DEV: [pos_membership] [write] date_to : %s" % str(date_to
))
581 member_line_obj
.create(cr
, uid
582 , { 'partner': line
.invoice_id
.partner_id
.id
583 , 'membership_id': line
.product_id
.id
584 , 'member_price': line
.price_unit
585 , 'date': time
.strftime('%Y-%m-%d')
586 , 'date_from': date_from
588 , 'pos_order_line': line
.id
591 if line
.product_id
.membership_grouped
:
592 if line
.order_id
.partner_id
.associate_members
:
593 associate_member_line_ids
= member_line_obj
.search(cr
, uid
594 , [ ('pos_order_line', '=', line
.id)
595 , ('partner', '!=', line
.order_id
.partner_id
.id)
598 for associate_member_line
in member_line_obj
.browse(cr
, uid
, associate_member_line_ids
, context
=context
):
599 print ("DEV: [pos_membership] [write] [associate] date_from: %s" % str(date_from
))
600 print ("DEV: [pos_membership] [write] [associate] date_to : %s" % str(date_to
))
601 member_line_obj
.write(cr
, uid
, associate_member_line
.id
602 , {'date_from': date_from
607 print("DEV: mettre une contrainte pour l'objet\
608 membership.membership_line interdisant les\
609 adhésions groupées reliées à des partenaires\
610 sans membres associés")
612 associate_member_line_ids
= member_line_obj
.search(cr
, uid
613 , [ ('pos_order_line', '=', line
.id)
614 , ('partner', '!=', line
.order_id
.partner_id
.id)
617 member_line_obj
.unlink(cr
, uid
, associate_member_line_ids
, context
=context
)
619 #Define member ident if it's necessary
620 partners
= [line
.order_id
.partner_id
]
621 if line
.order_id
.partner_id
.associate_members
:
622 partners
.extend(line
.order_id
.partner_id
.associate_members
)
624 if not i
.member_ident
:
625 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
626 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
627 if line
.product_id
and not line
.product_id
.membership
and ml_ids
:
628 # Product line has changed to a non membership product
629 member_line_obj
.unlink(cr
, uid
, ml_ids
, context
=context
)
632 def unlink(self
, cr
, uid
, ids
, context
=None):
633 """Remove Membership Line Record for Account Invoice Line
635 member_line_obj
= self
.pool
.get('membership.membership_line')
637 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', id)], context
=context
)
638 member_line_obj
.unlink(cr
, uid
, ml_ids
, context
=context
)
639 return super(pos_order_line
, self
).unlink(cr
, uid
, ids
, context
=context
)
641 def create(self
, cr
, uid
, vals
, context
=None):
642 member_line_obj
= self
.pool
.get('membership.membership_line')
643 res
= super(pos_order_line
, self
).create(cr
, uid
, vals
, context
=context
)
644 print ("DEV: [pos_membership] [pos_order_line] [create] : begin res=%s" % str(res
))
645 line
= self
.browse(cr
, uid
, res
, context
=context
)
647 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', line
.id)], context
=context
)
648 if line
.product_id
and line
.product_id
.membership
and not ml_ids
:
649 date_from
= line
.product_id
.membership_date_from
650 date_to
= line
.product_id
.membership_date_to
651 if line
.order_id
.date_order
> date_from
and line
.order_id
.date_order
< date_to
:
652 date_from
= line
.order_id
.date_order
653 if line
.product_id
.membership_date2date
:
654 date_from
= ('date_from' in context
655 and context
.get('date_from')
656 and datetime
.strptime(context
.get('date_from'), "%Y-%m-%d")
658 date_to
= date_from
+ relativedelta(days
= +364) # TODO: parameterize this delta?
659 date_from
= date_from
.strftime("%Y-%m-%d")
660 date_to
= date_to
.strftime("%Y-%m-%d")
661 print ("DEV: [pos_membership] [pos_order_line] [create] date_from: %s" % str(date_from
))
662 print ("DEV: [pos_membership] [pos_order_line] [create] date_to : %s" % str(date_to
))
663 member_line_obj
.create(cr
, uid
, {
664 'partner': line
.order_id
.partner_id
and line
.order_id
.partner_id
.id or False,
665 'membership_id': line
.product_id
.id,
666 'member_price': line
.price_unit
,
667 'date': time
.strftime('%Y-%m-%d'),
668 'date_from': date_from
,
670 'pos_order_line': line
.id,
672 partners
= [line
.order_id
.partner_id
]
673 if line
.product_id
.membership_grouped
and line
.order_id
.partner_id
.associate_members
:
674 partners
.extend(line
.order_id
.partner_id
.associate_members
)
675 #Adding membership lines just for associate partners
676 for associate_member
in line
.order_id
.partner_id
.associate_members
:
677 print ("DEV: [pos_membership] [pos_order_line] [create] [associate] date_from: %s" % str(date_from
))
678 print ("DEV: [pos_membership] [pos_order_line] [create] [associate] date_to : %s" % str(date_to
))
679 member_line_obj
.create(cr
, uid
, {
680 'partner': associate_member
.id,
681 'membership_id': line
.product_id
.id,
682 'member_price': line
.price_unit
,
683 'date': time
.strftime('%Y-%m-%d'),
684 'date_from': date_from
,
686 'pos_order_line': line
.id,
688 elif line
.product_id
.membership_grouped
and not line
.order_id
.partner_id
.associate_members
:
689 raise osv
.except_osv(_('Error!!!'), _('You try to order grouped membership product to a partner who hasn\'t associated partners.'))
690 #Define member ident if it's necessary
693 print ("\033[7mXXX: [pos_membership] [pos_order_line] [create] : pos_order_line has no partner_id!\033[0m")
695 if not i
.member_ident
:
696 print ("DEV: [pos_membership] [pos_order_line] [create] [partners] : i=%s i.id=%s" % (str(i
), str(i
.id)))
697 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
698 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
699 print ("DEV: [pos_membership] [pos_order_line] [create] : return=%s" % str(res
))
704 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: