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 print("DEV: [pos_membership] [membership_line] [_get_partners]: ids=%s res=%s" % (str(ids
), str(list_membership_line
)))
52 return list_membership_line
54 #def _get_membership_lines_from_account_invoice(self, cr, uid, ids, context=None):
55 # list_membership_line = []
56 # member_line_obj = self.pool.get('membership.membership_line')
57 # for invoice in self.pool.get('account.invoice').browse(cr, uid, ids, context=context):
58 # if invoice.invoice_line:
59 # list_membership_line += member_line_obj.search(cr, uid, [('account_invoice_line', 'in', [ l.id for l in invoice.invoice_line])], context=context)
61 # { 'class': 'account.invoice'
62 # , 'ids': list_membership_line
64 # #res= list_membership_line
65 # print("DEV: [pos_membership] [membership_line] [_get_membership_lines_from_account_invoice]: res=%s" % str(res))
67 def _get_membership_lines_from_pos_order(self
, cr
, uid
, ids
, context
=None):
68 list_membership_line
= []
69 member_line_obj
= self
.pool
.get('membership.membership_line')
70 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
72 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('pos_order_line', 'in', [ l
.id for l
in order
.lines
])], context
=context
)
74 # { 'class': 'pos.order'
75 # , 'ids': list_membership_line
77 res
= list_membership_line
78 print("DEV: [pos_membership] [membership_line] [_get_membership_lines_from_pos_order]: res=%s" % str(res
))
81 def _check_membership_date(self
, cr
, uid
, ids
, context
=None):
82 """Check if membership product is not in the past
83 @param self: The object pointer
84 @param cr: the current row, from the database cursor,
85 @param uid: the current user’s ID for security checks,
86 @param ids: List of Membership Line IDs
87 @param context: A standard dictionary for contextual values
91 SELECT MIN(ml.date_to - ai.date_invoice)
92 FROM membership_membership_line ml
93 JOIN account_invoice_line ail ON (
94 ml.account_invoice_line = ail.id
96 JOIN account_invoice ai ON (
97 ai.id = ail.invoice_id)
98 WHERE ml.id IN %s''', (tuple(ids
),))
101 if r
[0] and r
[0] < 0:
104 SELECT MIN(ml.date_to - ai.date_order)
105 FROM membership_membership_line ml
106 JOIN pos_order_line ail ON (
107 ml.pos_order_line = ail.id
109 JOIN pos_order ai ON (
110 ai.id = ail.order_id)
111 WHERE ml.id IN %s''', (tuple(ids
),))
114 if r
[0] and r
[0] < 0:
118 def _state(self
, cr
, uid
, ids
, name
, args
, context
=None):
119 """Compute the state lines
120 @param self: The object pointer
121 @param cr: the current row, from the database cursor,
122 @param uid: the current user’s ID for security checks,
123 @param ids: List of Membership Line IDs
124 @param name: Field Name
125 @param context: A standard dictionary for contextual values
126 @param return: Dictionary of state Value
129 print("DEV: [pos_membership] [membership_line] [_state]: name=%s ids=%s args=%s context=%s" % (str(name
), str(ids
), str(args
), str(context
)))
130 inv_obj
= self
.pool
.get('account.invoice')
131 ord_obj
= self
.pool
.get('pos.order')
132 for line
in self
.browse(cr
, uid
, ids
, context
=context
):
134 SELECT i.state, i.id FROM
138 SELECT l.invoice_id FROM
139 account_invoice_line l WHERE
141 SELECT ml.account_invoice_line FROM
142 membership_membership_line ml WHERE
147 fetched
= cr
.fetchone()
151 if (istate
== 'draft') |
(istate
== 'proforma'):
153 elif istate
== 'open':
155 elif istate
== 'paid':
157 inv
= inv_obj
.browse(cr
, uid
, fetched
[1], context
=context
)
158 for payment
in inv
.payment_ids
:
159 if payment
.invoice
and payment
.invoice
.type == 'out_refund':
161 elif istate
== 'cancel':
166 SELECT i.state, i.id, i.partner_id FROM
170 SELECT l.order_id FROM
171 pos_order_line l WHERE
173 SELECT ml.pos_order_line FROM
174 membership_membership_line ml WHERE
179 fetched
= cr
.fetchone()
181 res
[line
.id] = 'canceled'
183 self
.write(cr
, uid
, line
.id, {'partner': fetched
[2]})
184 # NOTE: force un mise à jour du partner,
185 # car il n'y en a pas lors de la création du pos.order
186 # dans le PoS (pour le moment)
189 if (ostate
== 'paid') |
(ostate
== 'draft'):
191 elif (ostate
== 'done') |
(ostate
== 'invoiced'):
193 # XXX: regarder l'équivalent de out_refund pour un pos.order
194 print("DEV: [pos_membership] [membership_line] [_state]: paid: TODO")
195 #inv = ord_obj.browse(cr, uid, fetched[1], context=context)
196 #for payment in inv.payment_ids:
197 # if payment.invoice and payment.invoice.type == 'out_refund':
199 elif ostate
== 'cancel':
202 print("DEV: [pos_membership] [membership_line] [_state]: return=%s" % (str(res
)))
205 def write(self
, cr
, uid
, ids
, vals
, context
=None):
206 print("DEV: [pos_membership] [membership_line] [write]: ids=%s vals=%s" % (str(ids
), str(vals
)))
207 member_line_obj
= self
.pool
.get('membership.membership_line')
208 res
= super(membership_line
, self
).write(cr
, uid
, ids
, vals
, context
=context
)
209 print("DEV: [pos_membership] [membership_line] [write]: res=%s" % str(res
))
212 def create(self
, cr
, uid
, vals
, context
=None):
213 print("DEV: [pos_membership] [membership_line] [create]: vals=%s" % (str(vals
)))
214 member_line_obj
= self
.pool
.get('membership.membership_line')
215 res
= super(membership_line
, self
).create(cr
, uid
, vals
, context
=context
)
216 print("DEV: [pos_membership] [membership_line] [create]: res=%s" % (str(res
)))
220 'pos_order_line': fields
.many2one('pos.order.line', 'POS Order line', readonly
=True),
221 'pos_order_id': fields
.related('pos_order_line', 'order_id', type='many2one', relation
='pos.order', string
='Order', readonly
=True),
222 'state': fields
.function(_state
,
223 string
='Membership Status', type='selection',
226 #'account.invoice': (_get_membership_lines_from_account_invoice, ['state'], 10),
227 # NOTE: déjà géré par membership.membership_line._get_membership_lines
228 'pos.order': (_get_membership_lines_from_pos_order
, ['state', 'partner_id'], 10),
229 'res.partner': (_get_partners
, ['membership_state'], 12),
230 }, help="""It indicates the membership status.
231 -Non Member: A member who has not applied for any membership.
232 -Cancelled Member: A member who has cancelled his membership.
233 -Old Member: A member whose membership date has expired.
234 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
235 -Invoiced Member: A member whose invoice has been created.
236 -Paid Member: A member who has paid the membership amount."""),
237 'company_id': fields
.related('account_invoice_line', 'invoice_id', 'company_id', type="many2one", relation
="res.company", string
="Company", readonly
=True, store
=True)
238 # XXX: pos_order_line a aussi un company_id
243 class Partner(osv
.osv
):
245 _inherit
= 'res.partner'
247 def _get_partner_id(self
, cr
, uid
, ids
, context
=None):
248 member_line_obj
= self
.pool
.get('membership.membership_line')
249 res_obj
= self
.pool
.get('res.partner')
250 data_inv
= member_line_obj
.browse(cr
, uid
, ids
, context
=context
)
252 for data
in data_inv
:
253 list_partner
.append(data
.partner
.id)
256 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
260 def _get_invoice_partner(self
, cr
, uid
, ids
, context
=None):
261 inv_obj
= self
.pool
.get('account.invoice')
262 res_obj
= self
.pool
.get('res.partner')
263 data_inv
= inv_obj
.browse(cr
, uid
, ids
, context
=context
)
265 for data
in data_inv
:
266 list_partner
.append(data
.partner_id
.id)
269 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
273 def _get_order_partner(self
, cr
, uid
, ids
, context
=None):
274 ord_obj
= self
.pool
.get('pos.order')
275 res_obj
= self
.pool
.get('res.partner')
276 data_ord
= ord_obj
.browse(cr
, uid
, ids
, context
=context
)
278 for data
in data_ord
:
279 list_partner
.append(data
.partner_id
.id)
282 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
286 def _membership_state(self
, cr
, uid
, ids
, name
, args
, context
=None):
287 """This Function return Membership State For Given Partner.
288 @param self: The object pointer
289 @param cr: the current row, from the database cursor,
290 @param uid: the current user’s ID for security checks,
291 @param ids: List of Partner IDs
292 @param name: Field Name
293 @param context: A standard dictionary for contextual values
294 @param return: Dictionary of Membership state Value
297 print("DEV: [pos_membership] [Partner] [_membership_state]: name=%s ids=%s args=%s context=%s" % (str(name
), str(ids
), str(args
), str(context
)))
300 today
= time
.strftime('%Y-%m-%d')
302 partner_data
= self
.browse(cr
, uid
, id, context
=context
)
303 if partner_data
.membership_cancel
and today
> partner_data
.membership_cancel
:
306 if partner_data
.membership_stop
and today
> partner_data
.membership_stop
:
310 if partner_data
.member_lines
:
311 print("DEV: [pos_membership] [Partner] [_membership_state] [partner_data] [member_lines]" % ())
312 for mline
in partner_data
.member_lines
:
313 print("DEV: [pos_membership] [Partner] [_membership_state] [mline]: id=%s" % str(mline
.id))
314 if mline
.date_to
>= today
:
315 if mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
:
316 istate
= mline
.account_invoice_line
.invoice_id
.state
317 print("DEV: [pos_membership] [Partner] [_membership_state] [account_invoice_line]: id=%s istate=%s" % (str(mline
.account_invoice_line
.invoice_id
.id), str(istate
)))
320 inv
= mline
.account_invoice_line
.invoice_id
321 for payment
in inv
.payment_ids
:
322 if payment
.invoice
.type == 'out_refund':
325 elif istate
== 'open' and s
!=0:
327 elif istate
== 'cancel' and s
!=0 and s
!=1:
329 elif (istate
== 'draft' or istate
== 'proforma') and s
!=0 and s
!=1:
331 elif mline
.pos_order_line
and mline
.pos_order_line
.order_id
:
332 ostate
= mline
.pos_order_line
.order_id
.state
333 print("DEV: [pos_membership] [Partner] [_membership_state] [pos_order_line]: id=%s ostate=%s" % (str(mline
.pos_order_line
.order_id
.id), str(ostate
)))
334 if ostate
== 'paid' and s
!=0 and s
!=1:
336 if ostate
== 'invoiced':
340 # XXX: regarder l'équivalent de out_refund pour un pos.order
341 print("DEV: [pos_membership] [partner] [_membership_state]: paid: TODO")
342 #inv = mline.pos_order_line.order_id
343 #for payment in inv.payment_ids:
344 # if payment.invoice.type == 'out_refund':
347 elif ostate
== 'open' and s
!=0:
348 # XXX: 1 donne invoiced, c'est pitet pas bon
349 print("DEV: [pos_membership] [partner] [_membership_state]: invoiced: TODO")
351 elif ostate
== 'cancel' and s
!=0 and s
!=1:
353 elif ostate
== 'draft' and s
!=0 and s
!=1:
356 for mline
in partner_data
.member_lines
:
357 if mline
.date_from
< today
and \
358 mline
.date_to
< today
and \
359 mline
.date_from
<= mline
.date_to
and \
360 ( (mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
.state
) == 'paid' or \
361 ( mline
.pos_order_line
and \
362 ( mline
.pos_order_line
.order_id
.state
== 'paid' or \
363 mline
.pos_order_line
.order_id
.state
== 'done' or \
364 mline
.pos_order_line
.order_id
.state
== 'invoiced' ))):
380 if partner_data
.free_member
and s
!=0:
382 if partner_data
.associate_member
:
383 res_state
= self
._membership
_state
(cr
, uid
, [partner_data
.associate_member
.id], name
, args
, context
=context
)
384 res
[id] = res_state
[partner_data
.associate_member
.id]
385 print("DEV: [pos_membership] [Partner] [_membership_state]: res=%s" % (str(res
)))
388 def _membership_date(self
, cr
, uid
, ids
, name
, args
, context
=None):
389 """Return date of membership"""
392 member_line_obj
= self
.pool
.get('membership.membership_line')
393 for partner
in self
.browse(cr
, uid
, ids
, context
=context
):
394 if partner
.associate_member
:
395 partner_id
= partner
.associate_member
.id
397 partner_id
= partner
.id
399 'membership_start': False,
400 'membership_stop': False,
401 'membership_cancel': False
403 if name
== 'membership_start':
404 line_id
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
405 limit
=1, order
='date_from', context
=context
)
407 res
[partner
.id]['membership_start'] = member_line_obj
.read(cr
, uid
, line_id
[0],
408 ['date_from'], context
=context
)['date_from']
410 if name
== 'membership_stop':
411 line_id1
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
412 limit
=1, order
='date_to desc', context
=context
)
414 res
[partner
.id]['membership_stop'] = member_line_obj
.read(cr
, uid
, line_id1
[0],
415 ['date_to'], context
=context
)['date_to']
417 if name
== 'membership_cancel':
418 if partner
.membership_state
== 'canceled':
419 line_id2
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner
.id)], limit
=1, order
='date_cancel', context
=context
)
421 res
[partner
.id]['membership_cancel'] = member_line_obj
.read(cr
, uid
, line_id2
[0], ['date_cancel'], context
=context
)['date_cancel']
424 def _get_partners(self
, cr
, uid
, ids
, context
=None):
427 ids2
= self
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
431 def __get_membership_state(self
, *args
, **kwargs
):
432 return self
._membership
_state
(*args
, **kwargs
)
435 'membership_state': fields
.function(
436 __get_membership_state
,
437 string
= 'Current Membership Status', type = 'selection',
440 'account.invoice': (_get_invoice_partner
, ['state'], 10),
441 'pos.order': (_get_order_partner
, ['state', 'partner_id'], 10),
442 'membership.membership_line': (_get_partner_id
, ['state'], 10),
443 'res.partner': (_get_partners
, ['free_member', 'membership_state', 'associate_member'], 10)
444 }, help="""It indicates the membership state.
445 -Non Member: A partner who has not applied for any membership.
446 -Cancelled Member: A member who has cancelled his membership.
447 -Old Member: A member whose membership date has expired.
448 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
449 -Invoiced Member: A member whose invoice has been created.
450 -Paying member: A member who has paid the membership fee."""),
451 'membership_start': fields
.function(
452 _membership_date
, multi
= 'membeship_start',
453 string
= 'Membership Start Date', type = 'date',
455 'account.invoice': (_get_invoice_partner
, ['state'], 10),
456 'pos.order': (_get_order_partner
, ['state'], 10),
457 'membership.membership_line': (_get_partner_id
, ['state'], 10, ),
458 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
459 }, help="Date from which membership becomes active."),
460 'membership_stop': fields
.function(
462 string
= 'Membership End Date', type='date', multi
='membership_stop',
464 'account.invoice': (_get_invoice_partner
, ['state'], 10),
465 'pos.order': (_get_order_partner
, ['state'], 10),
466 'membership.membership_line': (_get_partner_id
, ['state'], 10),
467 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
468 }, help="Date until which membership remains active."),
469 'membership_cancel': fields
.function(
471 string
= 'Cancel Membership Date', type='date', multi
='membership_cancel',
473 'account.invoice': (_get_invoice_partner
, ['state'], 11),
474 'pos.order': (_get_order_partner
, ['state'], 11),
475 'membership.membership_line': (_get_partner_id
, ['state'], 10),
476 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
477 }, help="Date on which membership has been cancelled"),
482 class pos_order(osv
.osv
):
483 _inherit
= 'pos.order'
485 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py
486 def action_invoice(self
, cr
, uid
, ids
, context
=None):
487 print ("DEV: [pos_membership] [pos_order] [action_invoice]")
488 wf_service
= netsvc
.LocalService("workflow")
489 inv_ref
= self
.pool
.get('account.invoice')
490 inv_line_ref
= self
.pool
.get('account.invoice.line')
491 product_obj
= self
.pool
.get('product.product')
494 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
496 inv_ids
.append(order
.invoice_id
.id)
499 if not order
.partner_id
:
500 raise osv
.except_osv(_('Error!'), _('Please provide a partner for the sale.'))
502 acc
= order
.partner_id
.property_account_receivable
.id
503 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py to fix account.invoice.line creation
506 'origin': order
.name
,
508 'journal_id': order
.sale_journal
.id or None,
509 'type': 'out_invoice',
510 'reference': order
.name
,
511 'partner_id': order
.partner_id
.id,
512 'comment': order
.note
or '',
513 'currency_id': order
.pricelist_id
.currency_id
.id, # considering partner's sale pricelist's currency
516 inv
.update(inv_ref
.onchange_partner_id(cr
, uid
, [], 'out_invoice', order
.partner_id
.id)['value'])
517 if not inv
.get('account_id', None):
518 inv
['account_id'] = acc
519 for line
in order
.lines
:
521 #'invoice_id': inv_id,
522 'product_id': line
.product_id
.id,
523 'quantity': line
.qty
,
525 inv_name
= product_obj
.name_get(cr
, uid
, [line
.product_id
.id], context
=context
)[0][1]
526 inv_line
.update(inv_line_ref
.product_id_change(cr
, uid
, [],
528 line
.product_id
.uom_id
.id,
529 line
.qty
, partner_id
= order
.partner_id
.id,
530 fposition_id
=order
.partner_id
.property_account_position
.id)['value'])
531 if line
.product_id
.description_sale
:
532 inv_line
['note'] = line
.product_id
.description_sale
533 inv_line
['price_unit'] = line
.price_unit
534 inv_line
['discount'] = line
.discount
535 inv_line
['name'] = inv_name
536 inv_line
['invoice_line_tax_id'] = ('invoice_line_tax_id' in inv_line
)\
537 and [(6, 0, inv_line
['invoice_line_tax_id'])] or []
538 #inv_line_ref.create(cr, uid, inv_line, context=context)
539 inv
['invoice_line'].append((0, 0, inv_line
))
540 inv_id
= inv_ref
.create(cr
, uid
, inv
, context
=context
)
542 self
.write(cr
, uid
, [order
.id], {'invoice_id': inv_id
, 'state': 'invoiced'}, context
=context
)
543 inv_ref
.confirm_paid(cr
, uid
, [inv_id
], context
=context
)
544 inv_ids
.append(inv_id
)
545 inv_ref
.button_reset_taxes(cr
, uid
, [inv_id
], context
=context
)
546 wf_service
.trg_validate(uid
, 'pos.order', order
.id, 'invoice', cr
)
548 if not inv_ids
: return {}
550 mod_obj
= self
.pool
.get('ir.model.data')
551 res
= mod_obj
.get_object_reference(cr
, uid
, 'account', 'invoice_form')
552 res_id
= res
and res
[1] or False
554 'name': _('Customer Invoice'),
558 'res_model': 'account.invoice',
559 'context': "{'type':'out_invoice'}",
560 'type': 'ir.actions.act_window',
563 'res_id': inv_ids
and inv_ids
[0] or False,
566 def write(self
, cr
, uid
, ids
, vals
, context
=None):
567 print("DEV: [pos_membership] [pos_order] [write]: ids=%s vals=%s" % (str(ids
), str(vals
)))
568 pos_order_obj
= self
.pool
.get('pos.order')
569 res
= super(pos_order
, self
).write(cr
, uid
, ids
, vals
, context
=context
)
570 print("DEV: [pos_membership] [pos_order] [write]: res=%s" % str(res
))
573 def create(self
, cr
, uid
, vals
, context
=None):
574 print("DEV: [pos_membership] [pos_order] [create]: vals=%s" % (str(vals
)))
575 pos_order_obj
= self
.pool
.get('pos.order')
576 res
= super(pos_order
, self
).create(cr
, uid
, vals
, context
=context
)
577 print("DEV: [pos_membership] [pos_order] [create]: res=%s" % (str(res
)))
582 class pos_order_line(osv
.osv
):
583 _inherit
= 'pos.order.line'
585 def write(self
, cr
, uid
, ids
, vals
, context
=None):
586 print("DEV: [pos_membership] [pos_order_line] [write]: ids=%s vals=%s context=%s" % (str(ids
), str(vals
), str(context
)))
587 member_line_obj
= self
.pool
.get('membership.membership_line')
588 res
= super(pos_order_line
, self
).write(cr
, uid
, ids
, vals
, context
=context
)
589 print ("DEV: [pos_membership] [pos_order_line] [write] [super] : res=%s" % str(res
))
590 for line
in self
.browse(cr
, uid
, ids
, context
=context
):
591 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', line
.id)], context
=context
)
592 if line
.product_id
and line
.product_id
.membership
and not ml_ids
:
593 date_from
= line
.product_id
.membership_date_from
594 date_to
= line
.product_id
.membership_date_to
595 if line
.order_id
.date_order
> date_from
and \
596 line
.order_id
.date_order
< date_to
:
597 date_from
= line
.order_id
.date_order
598 if line
.product_id
.membership_date2date
:
599 date_from
= ('date_from' in context
600 and context
['date_from']
601 and datetime
.strptime(context
['date_from'], "%Y-%m-%d")
603 date_to
= date_from
+ relativedelta(months
= +12) # TODO: parameterize this delta?
604 date_from
= date_from
.strftime("%Y-%m-%d")
605 date_to
= date_to
.strftime("%Y-%m-%d")
606 print ("DEV: [pos_membership] [write] date_from: %s" % str(date_from
))
607 print ("DEV: [pos_membership] [write] date_to : %s" % str(date_to
))
608 member_line_obj
.create(cr
, uid
609 , { 'partner': line
.order_id
.partner_id
and line
.order_id
.partner_id
.id or False
610 , 'membership_id': line
.product_id
.id
611 , 'member_price': line
.price_unit
612 , 'date': time
.strftime('%Y-%m-%d')
613 , 'date_from': date_from
615 , 'pos_order_line': line
.id
618 if line
.product_id
.membership_grouped
:
619 if line
.order_id
.partner_id
.associate_members
:
620 associate_member_line_ids
= member_line_obj
.search(cr
, uid
621 , [ ('pos_order_line', '=', line
.id)
622 , ('partner', '!=', line
.order_id
.partner_id
.id)
625 for associate_member_line
in member_line_obj
.browse(cr
, uid
, associate_member_line_ids
, context
=context
):
626 print ("DEV: [pos_membership] [write] [associate] date_from: %s" % str(date_from
))
627 print ("DEV: [pos_membership] [write] [associate] date_to : %s" % str(date_to
))
628 member_line_obj
.write(cr
, uid
, associate_member_line
.id
629 , {'date_from': date_from
634 print("DEV: mettre une contrainte pour l'objet\
635 membership.membership_line interdisant les\
636 adhésions groupées reliées à des partenaires\
637 sans membres associés")
639 associate_member_line_ids
= member_line_obj
.search(cr
, uid
640 , [ ('pos_order_line', '=', line
.id)
641 , ('partner', '!=', line
.order_id
.partner_id
.id)
644 member_line_obj
.unlink(cr
, uid
, associate_member_line_ids
, context
=context
)
646 #Define member ident if it's necessary
647 partners
= [line
.order_id
.partner_id
]
648 if line
.order_id
.partner_id
.associate_members
:
649 partners
.extend(line
.order_id
.partner_id
.associate_members
)
651 if not i
.member_ident
:
652 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
653 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
654 if line
.product_id
and not line
.product_id
.membership
and ml_ids
:
655 # Product line has changed to a non membership product
656 member_line_obj
.unlink(cr
, uid
, ml_ids
, context
=context
)
657 print("DEV: [pos_membership] [pos_order_line] [write]: res=%s" % str(res
))
660 def unlink(self
, cr
, uid
, ids
, context
=None):
661 """Remove Membership Line Record for Account Invoice Line
663 member_line_obj
= self
.pool
.get('membership.membership_line')
665 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', id)], context
=context
)
666 member_line_obj
.unlink(cr
, uid
, ml_ids
, context
=context
)
667 return super(pos_order_line
, self
).unlink(cr
, uid
, ids
, context
=context
)
669 def create(self
, cr
, uid
, vals
, context
=None):
670 member_line_obj
= self
.pool
.get('membership.membership_line')
671 print("DEV: [pos_membership] [pos_order_line] [create]: vals=%s context=%s" % (str(vals
), str(context
)))
672 res
= super(pos_order_line
, self
).create(cr
, uid
, vals
, context
=context
)
673 print ("DEV: [pos_membership] [pos_order_line] [create] [super] : res=%s" % str(res
))
674 line
= self
.browse(cr
, uid
, res
, context
=context
)
676 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', line
.id)], context
=context
)
677 if line
.product_id
and line
.product_id
.membership
and not ml_ids
:
678 date_from
= line
.product_id
.membership_date_from
679 date_to
= line
.product_id
.membership_date_to
680 if line
.order_id
.date_order
> date_from
and line
.order_id
.date_order
< date_to
:
681 date_from
= line
.order_id
.date_order
682 if line
.product_id
.membership_date2date
:
683 date_from
= ('date_from' in context
684 and context
.get('date_from')
685 and datetime
.strptime(context
.get('date_from'), "%Y-%m-%d")
687 date_to
= date_from
+ relativedelta(days
= +364) # TODO: parameterize this delta?
688 date_from
= date_from
.strftime("%Y-%m-%d")
689 date_to
= date_to
.strftime("%Y-%m-%d")
690 print ("DEV: [pos_membership] [pos_order_line] [create] date_from: %s" % str(date_from
))
691 print ("DEV: [pos_membership] [pos_order_line] [create] date_to : %s" % str(date_to
))
692 member_line_obj
.create(cr
, uid
, {
693 'partner': line
.order_id
.partner_id
and line
.order_id
.partner_id
.id or False,
694 'membership_id': line
.product_id
.id,
695 'member_price': line
.price_unit
,
696 'date': time
.strftime('%Y-%m-%d'),
697 'date_from': date_from
,
699 'pos_order_line': line
.id,
701 partners
= [line
.order_id
.partner_id
]
702 if line
.product_id
.membership_grouped
and line
.order_id
.partner_id
.associate_members
:
703 partners
.extend(line
.order_id
.partner_id
.associate_members
)
704 #Adding membership lines just for associate partners
705 for associate_member
in line
.order_id
.partner_id
.associate_members
:
706 print ("DEV: [pos_membership] [pos_order_line] [create] [associate] date_from: %s" % str(date_from
))
707 print ("DEV: [pos_membership] [pos_order_line] [create] [associate] date_to : %s" % str(date_to
))
708 member_line_obj
.create(cr
, uid
, {
709 'partner': associate_member
.id,
710 'membership_id': line
.product_id
.id,
711 'member_price': line
.price_unit
,
712 'date': time
.strftime('%Y-%m-%d'),
713 'date_from': date_from
,
715 'pos_order_line': line
.id,
717 elif line
.product_id
.membership_grouped
and not line
.order_id
.partner_id
.associate_members
:
718 raise osv
.except_osv(_('Error!!!'), _('You try to order grouped membership product to a partner who hasn\'t associated partners.'))
719 #Define member ident if it's necessary
722 print ("\033[7mXXX: [pos_membership] [pos_order_line] [create] : pos_order_line has no partner_id!\033[0m")
724 if not i
.member_ident
:
725 print ("DEV: [pos_membership] [pos_order_line] [create] [partners] : i=%s i.id=%s" % (str(i
), str(i
.id)))
726 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
727 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
728 print ("DEV: [pos_membership] [pos_order_line] [create] : return=%s" % str(res
))
733 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: