2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2008-08-24 14:45:43 +00:00
##############################################################################
2009-11-24 13:34:45 +00:00
#
2008-12-17 12:48:00 +00:00
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2008-08-24 14:45:43 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 11:15:34 +00:00
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
2008-08-24 14:45:43 +00:00
#
2008-11-03 19:18:56 +00:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2009-10-14 11:15:34 +00:00
# GNU Affero General Public License for more details.
2008-08-24 14:45:43 +00:00
#
2009-10-14 11:15:34 +00:00
# You should have received a copy of the GNU Affero General Public License
2009-11-24 13:34:45 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2008-08-24 14:45:43 +00:00
#
##############################################################################
2010-10-07 09:36:00 +00:00
import time
2008-08-24 14:45:43 +00:00
from osv import fields , osv
2010-03-06 20:52:19 +00:00
import decimal_precision as dp
2010-10-07 09:36:00 +00:00
from tools . translate import _
2010-03-06 20:52:19 +00:00
2008-08-24 14:45:43 +00:00
STATE = [
( ' none ' , ' Non Member ' ) ,
2010-05-18 06:15:39 +00:00
( ' canceled ' , ' Cancelled Member ' ) ,
2008-08-24 14:45:43 +00:00
( ' old ' , ' Old Member ' ) ,
( ' waiting ' , ' Waiting Member ' ) ,
( ' invoiced ' , ' Invoiced Member ' ) ,
( ' free ' , ' Free Member ' ) ,
( ' paid ' , ' Paid Member ' ) ,
]
STATE_PRIOR = {
2010-10-13 13:46:45 +00:00
' none ' : 0 ,
' canceled ' : 1 ,
' old ' : 2 ,
' waiting ' : 3 ,
' invoiced ' : 4 ,
' free ' : 6 ,
' paid ' : 7
2010-08-13 12:20:05 +00:00
}
2008-08-24 14:45:43 +00:00
class membership_line ( osv . osv ) :
''' Member line '''
2010-10-25 08:31:13 +00:00
def _get_partners ( self , cr , uid , ids , context = None ) :
list_membership_line = [ ]
member_line_obj = self . pool . get ( ' membership.membership_line ' )
for partner in self . pool . get ( ' res.partner ' ) . browse ( cr , uid , ids , context = context ) :
if partner . member_lines :
list_membership_line + = member_line_obj . search ( cr , uid , [ ( ' id ' , ' in ' , [ l . id for l in partner . member_lines ] ) ] , context = context )
return list_membership_line
2010-10-06 11:30:17 +00:00
def _get_membership_lines ( self , cr , uid , ids , context = None ) :
2010-10-25 08:31:13 +00:00
list_membership_line = [ ]
member_line_obj = self . pool . get ( ' membership.membership_line ' )
for invoice in self . pool . get ( ' account.invoice ' ) . browse ( cr , uid , ids , context = context ) :
if invoice . invoice_line :
list_membership_line + = member_line_obj . search ( cr , uid , [ ( ' account_invoice_line ' , ' in ' , [ l . id for l in invoice . invoice_line ] ) ] , context = context )
return list_membership_line
2010-10-06 11:30:17 +00:00
2008-08-24 14:45:43 +00:00
def _check_membership_date ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
""" Check if membership product is not in the past
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of Membership Line IDs
@param context : A standard dictionary for contextual values
"""
2008-08-24 14:45:43 +00:00
cr . execute ( '''
SELECT MIN ( ml . date_to - ai . date_invoice )
2010-10-08 12:15:06 +00:00
FROM membership_membership_line ml
JOIN account_invoice_line ail ON (
ml . account_invoice_line = ail . id
)
JOIN account_invoice ai ON (
2008-08-24 14:45:43 +00:00
ai . id = ail . invoice_id )
2010-10-19 11:46:32 +00:00
WHERE ml . id IN % s ''' , (tuple(ids),))
2008-08-24 14:45:43 +00:00
res = cr . fetchall ( )
for r in res :
if r [ 0 ] and r [ 0 ] < 0 :
return False
return True
def _state ( self , cr , uid , ids , name , args , context = None ) :
2010-07-12 13:30:56 +00:00
""" Compute the state lines
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of Membership Line IDs
@param name : Field Name
@param context : A standard dictionary for contextual values
2010-08-13 12:20:05 +00:00
@param return : Dictionary of state Value
2010-07-12 13:30:56 +00:00
"""
2008-08-24 14:45:43 +00:00
res = { }
2010-10-08 12:15:06 +00:00
inv_obj = self . pool . get ( ' account.invoice ' )
2010-10-06 11:30:17 +00:00
for line in self . browse ( cr , uid , ids , context = context ) :
2008-08-24 14:45:43 +00:00
cr . execute ( '''
2010-05-18 10:29:15 +00:00
SELECT i . state , i . id FROM
account_invoice i
WHERE
2008-08-24 14:45:43 +00:00
i . id = (
SELECT l . invoice_id FROM
account_invoice_line l WHERE
l . id = (
SELECT ml . account_invoice_line FROM
membership_membership_line ml WHERE
2008-12-10 14:29:55 +00:00
ml . id = % s
2008-08-24 14:45:43 +00:00
)
)
2008-12-10 14:29:55 +00:00
''' , (line.id,))
2008-08-24 14:45:43 +00:00
fetched = cr . fetchone ( )
2010-10-13 13:46:45 +00:00
if not fetched :
2008-08-24 14:45:43 +00:00
res [ line . id ] = ' canceled '
continue
istate = fetched [ 0 ]
state = ' none '
if ( istate == ' draft ' ) | ( istate == ' proforma ' ) :
state = ' waiting '
elif istate == ' open ' :
state = ' invoiced '
elif istate == ' paid ' :
state = ' paid '
2010-10-08 12:15:06 +00:00
inv = inv_obj . browse ( cr , uid , fetched [ 1 ] , context = context )
2010-05-18 10:29:15 +00:00
for payment in inv . payment_ids :
2010-05-19 08:56:10 +00:00
if payment . invoice and payment . invoice . type == ' out_refund ' :
2010-05-18 10:29:15 +00:00
state = ' canceled '
2008-08-24 14:45:43 +00:00
elif istate == ' cancel ' :
state = ' canceled '
res [ line . id ] = state
return res
_description = __doc__
_name = ' membership.membership_line '
_columns = {
2010-08-13 12:20:05 +00:00
' partner ' : fields . many2one ( ' res.partner ' , ' Partner ' , ondelete = ' cascade ' , select = 1 ) ,
2012-06-29 13:48:22 +00:00
' membership_id ' : fields . many2one ( ' product.product ' , string = " Membership " , required = True ) ,
2010-08-13 12:20:05 +00:00
' date_from ' : fields . date ( ' From ' , readonly = True ) ,
' date_to ' : fields . date ( ' To ' , readonly = True ) ,
2010-10-13 13:46:45 +00:00
' date_cancel ' : fields . date ( ' Cancel date ' ) ,
2010-10-20 13:09:40 +00:00
' date ' : fields . date ( ' Join Date ' , help = " Date on which member has joined the membership " ) ,
2012-08-14 14:10:40 +00:00
' member_price ' : fields . float ( ' Member Price ' , digits_compute = dp . get_precision ( ' Product Price ' ) , required = True , help = ' Amount for the membership ' ) ,
2010-08-13 12:20:05 +00:00
' account_invoice_line ' : fields . many2one ( ' account.invoice.line ' , ' Account Invoice line ' , readonly = True ) ,
' account_invoice_id ' : fields . related ( ' account_invoice_line ' , ' invoice_id ' , type = ' many2one ' , relation = ' account.invoice ' , string = ' Invoice ' , readonly = True ) ,
2011-07-01 23:41:24 +00:00
' state ' : fields . function ( _state ,
2010-10-06 11:30:17 +00:00
string = ' Membership State ' , type = ' selection ' ,
selection = STATE , store = {
2010-10-19 11:46:32 +00:00
' account.invoice ' : ( _get_membership_lines , [ ' state ' ] , 10 ) ,
2010-10-25 08:31:13 +00:00
' res.partner ' : ( _get_partners , [ ' membership_state ' ] , 12 ) ,
2010-10-20 13:09:40 +00:00
} , help = """ It indicates the membership state.
2010-10-25 11:16:23 +00:00
- Non Member : A member who has not applied for any membership .
- Cancelled Member : A member who has cancelled his membership .
- Old Member : A member whose membership date has expired .
- Waiting Member : A member who has applied for the membership and whose invoice is going to be created .
- Invoiced Member : A member whose invoice has been created .
- Paid Member : A member who has paid the membership amount . """ ),
2010-10-05 10:49:59 +00:00
' company_id ' : fields . related ( ' account_invoice_line ' , ' invoice_id ' , ' company_id ' , type = " many2one " , relation = " res.company " , string = " Company " , readonly = True , store = True )
2010-07-20 12:50:15 +00:00
}
2008-08-24 14:45:43 +00:00
_rec_name = ' partner '
_order = ' id desc '
_constraints = [
2010-08-13 12:20:05 +00:00
( _check_membership_date , ' Error, this membership product is out of date ' , [ ] )
2009-01-28 11:15:30 +00:00
]
2008-08-24 14:45:43 +00:00
membership_line ( )
class Partner ( osv . osv ) :
''' Partner '''
2009-01-28 11:15:30 +00:00
_inherit = ' res.partner '
2008-08-24 14:45:43 +00:00
2008-12-17 12:48:00 +00:00
def _get_partner_id ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
member_line_obj = self . pool . get ( ' membership.membership_line ' )
res_obj = self . pool . get ( ' res.partner ' )
2010-10-06 11:30:17 +00:00
data_inv = member_line_obj . browse ( cr , uid , ids , context = context )
2008-08-24 14:45:43 +00:00
list_partner = [ ]
for data in data_inv :
2008-12-17 12:48:00 +00:00
list_partner . append ( data . partner . id )
2009-01-28 11:29:15 +00:00
ids2 = list_partner
while ids2 :
2010-10-19 11:46:32 +00:00
ids2 = res_obj . search ( cr , uid , [ ( ' associate_member ' , ' in ' , ids2 ) ] , context = context )
2009-01-28 11:29:15 +00:00
list_partner + = ids2
2008-08-24 14:45:43 +00:00
return list_partner
2008-12-18 06:55:42 +00:00
def _get_invoice_partner ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
inv_obj = self . pool . get ( ' account.invoice ' )
res_obj = self . pool . get ( ' res.partner ' )
2010-10-06 11:30:17 +00:00
data_inv = inv_obj . browse ( cr , uid , ids , context = context )
2008-12-18 06:55:42 +00:00
list_partner = [ ]
for data in data_inv :
list_partner . append ( data . partner_id . id )
2009-01-28 11:29:15 +00:00
ids2 = list_partner
while ids2 :
2010-10-19 11:46:32 +00:00
ids2 = res_obj . search ( cr , uid , [ ( ' associate_member ' , ' in ' , ids2 ) ] , context = context )
2009-01-28 11:29:15 +00:00
list_partner + = ids2
2008-12-18 06:55:42 +00:00
return list_partner
2008-08-24 14:45:43 +00:00
def _membership_state ( self , cr , uid , ids , name , args , context = None ) :
2010-07-12 13:30:56 +00:00
""" This Function return Membership State For Given Partner.
@param self : The object pointer
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of Partner IDs
@param name : Field Name
@param context : A standard dictionary for contextual values
2010-08-13 12:20:05 +00:00
@param return : Dictionary of Membership state Value
2010-07-12 13:30:56 +00:00
"""
2008-08-24 14:45:43 +00:00
res = { }
for id in ids :
res [ id ] = ' none '
today = time . strftime ( ' % Y- % m- %d ' )
for id in ids :
2010-10-06 11:30:17 +00:00
partner_data = self . browse ( cr , uid , id , context = context )
2008-08-24 14:45:43 +00:00
if partner_data . membership_cancel and today > partner_data . membership_cancel :
res [ id ] = ' canceled '
continue
if partner_data . membership_stop and today > partner_data . membership_stop :
res [ id ] = ' old '
continue
s = 4
if partner_data . member_lines :
for mline in partner_data . member_lines :
2010-05-13 13:43:54 +00:00
if mline . date_to > = today :
2008-08-24 14:45:43 +00:00
if mline . account_invoice_line and mline . account_invoice_line . invoice_id :
mstate = mline . account_invoice_line . invoice_id . state
if mstate == ' paid ' :
s = 0
2010-05-18 10:29:15 +00:00
inv = mline . account_invoice_line . invoice_id
for payment in inv . payment_ids :
if payment . invoice . type == ' out_refund ' :
s = 2
2008-08-24 14:45:43 +00:00
break
elif mstate == ' open ' and s != 0 :
s = 1
elif mstate == ' cancel ' and s != 0 and s != 1 :
s = 2
elif ( mstate == ' draft ' or mstate == ' proforma ' ) and s != 0 and s != 1 :
s = 3
if s == 4 :
for mline in partner_data . member_lines :
2010-10-19 11:46:32 +00:00
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 ' :
2008-08-24 14:45:43 +00:00
s = 5
else :
s = 6
if s == 0 :
res [ id ] = ' paid '
elif s == 1 :
res [ id ] = ' invoiced '
elif s == 2 :
res [ id ] = ' canceled '
elif s == 3 :
res [ id ] = ' waiting '
elif s == 5 :
res [ id ] = ' old '
elif s == 6 :
res [ id ] = ' none '
if partner_data . free_member and s != 0 :
res [ id ] = ' free '
if partner_data . associate_member :
2010-10-06 11:30:17 +00:00
res_state = self . _membership_state ( cr , uid , [ partner_data . associate_member . id ] , name , args , context = context )
2009-02-19 12:12:05 +00:00
res [ id ] = res_state [ partner_data . associate_member . id ]
2008-08-24 14:45:43 +00:00
return res
2010-08-13 12:20:05 +00:00
2010-06-07 06:33:42 +00:00
def _membership_date ( self , cr , uid , ids , name , args , context = None ) :
2010-07-12 13:30:56 +00:00
""" Return date of membership """
2010-06-07 06:33:42 +00:00
name = name [ 0 ]
2008-08-24 14:45:43 +00:00
res = { }
member_line_obj = self . pool . get ( ' membership.membership_line ' )
2010-10-06 11:30:17 +00:00
for partner in self . browse ( cr , uid , ids , context = context ) :
2009-01-15 17:02:24 +00:00
if partner . associate_member :
2010-06-07 06:33:42 +00:00
partner_id = partner . associate_member . id
2008-08-24 14:45:43 +00:00
else :
2010-06-07 06:33:42 +00:00
partner_id = partner . id
2010-08-13 12:20:05 +00:00
res [ partner . id ] = {
' membership_start ' : False ,
' membership_stop ' : False ,
' membership_cancel ' : False
}
2010-06-07 06:33:42 +00:00
if name == ' membership_start ' :
2011-03-14 10:55:17 +00:00
line_id = member_line_obj . search ( cr , uid , [ ( ' partner ' , ' = ' , partner_id ) , ( ' date_cancel ' , ' = ' , False ) ] ,
2010-10-06 11:30:17 +00:00
limit = 1 , order = ' date_from ' , context = context )
2010-05-13 12:25:41 +00:00
if line_id :
2010-06-07 06:33:42 +00:00
res [ partner . id ] [ ' membership_start ' ] = member_line_obj . read ( cr , uid , line_id [ 0 ] ,
2010-10-06 11:30:17 +00:00
[ ' date_from ' ] , context = context ) [ ' date_from ' ]
2010-06-07 06:33:42 +00:00
2010-08-13 12:20:05 +00:00
if name == ' membership_stop ' :
2011-03-14 10:55:17 +00:00
line_id1 = member_line_obj . search ( cr , uid , [ ( ' partner ' , ' = ' , partner_id ) , ( ' date_cancel ' , ' = ' , False ) ] ,
2010-10-06 11:30:17 +00:00
limit = 1 , order = ' date_to desc ' , context = context )
2010-06-07 06:33:42 +00:00
if line_id1 :
res [ partner . id ] [ ' membership_stop ' ] = member_line_obj . read ( cr , uid , line_id1 [ 0 ] ,
2010-10-06 11:30:17 +00:00
[ ' date_to ' ] , context = context ) [ ' date_to ' ]
2010-10-08 12:15:06 +00:00
2010-08-13 12:20:05 +00:00
if name == ' membership_cancel ' :
2010-06-07 06:33:42 +00:00
if partner . membership_state == ' canceled ' :
2010-10-06 11:30:17 +00:00
line_id2 = member_line_obj . search ( cr , uid , [ ( ' partner ' , ' = ' , partner . id ) ] , limit = 1 , order = ' date_cancel ' , context = context )
2010-06-07 06:33:42 +00:00
if line_id2 :
2010-10-06 11:30:17 +00:00
res [ partner . id ] [ ' membership_cancel ' ] = member_line_obj . read ( cr , uid , line_id2 [ 0 ] , [ ' date_cancel ' ] , context = context ) [ ' date_cancel ' ]
2008-08-24 14:45:43 +00:00
return res
2010-10-08 12:15:06 +00:00
def _get_partners ( self , cr , uid , ids , context = None ) :
2009-01-15 16:57:02 +00:00
ids2 = ids
while ids2 :
2010-10-19 11:46:32 +00:00
ids2 = self . search ( cr , uid , [ ( ' associate_member ' , ' in ' , ids2 ) ] , context = context )
2010-10-08 12:15:06 +00:00
ids + = ids2
2009-01-15 16:57:02 +00:00
return ids
2010-05-19 08:56:10 +00:00
def __get_membership_state ( self , * args , * * kwargs ) :
return self . _membership_state ( * args , * * kwargs )
2010-06-09 11:31:06 +00:00
2008-08-24 14:45:43 +00:00
_columns = {
2012-07-05 12:06:11 +00:00
' 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. " ) ,
2009-01-28 11:15:30 +00:00
' member_lines ' : fields . one2many ( ' membership.membership_line ' , ' partner ' , ' Membership ' ) ,
2012-07-05 12:06:11 +00:00
' free_member ' : fields . boolean ( ' Free Member ' , help = " Select if you want to give membership free of cost. " ) ,
2009-01-28 11:15:30 +00:00
' membership_amount ' : fields . float (
2012-07-05 12:06:11 +00:00
' Membership Amount ' , digits = ( 16 , 2 ) ,
2010-10-20 13:09:40 +00:00
help = ' The price negotiated by the partner ' ) ,
2009-01-28 11:15:30 +00:00
' membership_state ' : fields . function (
2011-07-01 23:41:24 +00:00
__get_membership_state ,
2010-07-20 12:50:15 +00:00
string = ' Current Membership State ' , type = ' selection ' ,
2010-10-08 12:15:06 +00:00
selection = STATE ,
store = {
' account.invoice ' : ( _get_invoice_partner , [ ' state ' ] , 10 ) ,
' membership.membership_line ' : ( _get_partner_id , [ ' state ' ] , 10 ) ,
' res.partner ' : ( _get_partners , [ ' free_member ' , ' membership_state ' , ' associate_member ' ] , 10 )
2010-10-20 13:09:40 +00:00
} , help = """ It indicates the membership state.
2010-10-25 11:16:23 +00:00
- Non Member : A member who has not applied for any membership .
- Cancelled Member : A member who has cancelled his membership .
- Old Member : A member whose membership date has expired .
- Waiting Member : A member who has applied for the membership and whose invoice is going to be created .
- Invoiced Member : A member whose invoice has been created .
- Paid Member : A member who has paid the membership amount . """ ),
2009-01-28 11:15:30 +00:00
' membership_start ' : fields . function (
2011-07-01 23:41:24 +00:00
_membership_date , multi = ' membeship_start ' ,
2012-07-05 12:06:11 +00:00
string = ' Start Membership Date ' , type = ' date ' ,
2009-01-28 11:15:30 +00:00
store = {
2010-10-08 12:15:06 +00:00
' account.invoice ' : ( _get_invoice_partner , [ ' state ' ] , 10 ) ,
' membership.membership_line ' : ( _get_partner_id , [ ' state ' ] , 10 , ) ,
' res.partner ' : ( lambda self , cr , uid , ids , c = { } : ids , [ ' free_member ' ] , 10 )
2010-10-20 13:09:40 +00:00
} , help = " Date from which membership becomes active. " ) ,
2009-01-28 11:15:30 +00:00
' membership_stop ' : fields . function (
2011-07-01 23:41:24 +00:00
_membership_date ,
2012-07-05 12:06:11 +00:00
string = ' Stop Membership Date ' , type = ' date ' , multi = ' membership_stop ' ,
2009-01-28 11:15:30 +00:00
store = {
2010-10-08 12:15:06 +00:00
' account.invoice ' : ( _get_invoice_partner , [ ' state ' ] , 10 ) ,
' membership.membership_line ' : ( _get_partner_id , [ ' state ' ] , 10 ) ,
2010-10-25 11:16:23 +00:00
' res.partner ' : ( lambda self , cr , uid , ids , c = { } : ids , [ ' free_member ' ] , 10 )
2010-10-20 13:09:40 +00:00
} , help = " Date until which membership remains active. " ) ,
2009-01-28 11:15:30 +00:00
' membership_cancel ' : fields . function (
2011-07-01 23:41:24 +00:00
_membership_date ,
2012-07-05 12:06:11 +00:00
string = ' Cancel Membership Date ' , type = ' date ' , multi = ' membership_cancel ' ,
2009-01-28 11:15:30 +00:00
store = {
2010-10-08 12:15:06 +00:00
' account.invoice ' : ( _get_invoice_partner , [ ' state ' ] , 11 ) ,
' membership.membership_line ' : ( _get_partner_id , [ ' state ' ] , 10 ) ,
2010-10-25 11:16:23 +00:00
' res.partner ' : ( lambda self , cr , uid , ids , c = { } : ids , [ ' free_member ' ] , 10 )
2010-10-20 13:09:40 +00:00
} , help = " Date on which membership has been cancelled " ) ,
2008-08-24 14:45:43 +00:00
}
_defaults = {
2010-10-08 12:15:06 +00:00
' free_member ' : False ,
2010-10-13 13:46:45 +00:00
' membership_cancel ' : False ,
2008-08-24 14:45:43 +00:00
}
2010-11-19 13:48:01 +00:00
def _check_recursion ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
""" Check Recursive for Associated Members.
"""
2009-01-28 11:15:30 +00:00
level = 100
while len ( ids ) :
2010-10-08 12:15:06 +00:00
cr . execute ( ' SELECT DISTINCT associate_member FROM res_partner WHERE id IN %s ' , ( tuple ( ids ) , ) )
2009-01-28 11:15:30 +00:00
ids = filter ( None , map ( lambda x : x [ 0 ] , cr . fetchall ( ) ) )
if not level :
return False
level - = 1
return True
_constraints = [
2011-09-18 13:53:10 +00:00
( _check_recursion , ' Error ! You cannot create recursive associated members. ' , [ ' associate_member ' ] )
2009-01-28 11:15:30 +00:00
]
2010-06-09 11:31:06 +00:00
2010-05-11 09:36:38 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
if default is None :
default = { }
default = default . copy ( )
default [ ' member_lines ' ] = [ ]
2010-10-06 11:30:17 +00:00
return super ( Partner , self ) . copy ( cr , uid , id , default , context = context )
2010-08-13 12:20:05 +00:00
2010-07-20 13:43:26 +00:00
def create_membership_invoice ( self , cr , uid , ids , product_id = None , datas = None , context = None ) :
2010-07-20 12:50:15 +00:00
""" Create Customer Invoice of Membership for partners.
@param datas : datas has dictionary value which consist Id of Membership product and Cost Amount of Membership .
2010-10-25 11:16:23 +00:00
datas = { ' membership_product_id ' : None , ' amount ' : None }
2010-07-20 12:50:15 +00:00
"""
invoice_obj = self . pool . get ( ' account.invoice ' )
invoice_line_obj = self . pool . get ( ' account.invoice.line ' )
invoice_tax_obj = self . pool . get ( ' account.invoice.tax ' )
2010-10-19 11:46:32 +00:00
product_id = product_id or datas . get ( ' membership_product_id ' , False )
2010-07-20 12:50:15 +00:00
amount = datas . get ( ' amount ' , 0.0 )
invoice_list = [ ]
2010-10-19 11:46:32 +00:00
if type ( ids ) in ( int , long , ) :
2010-07-20 13:43:26 +00:00
ids = [ ids ]
2010-07-20 12:50:15 +00:00
for partner in self . browse ( cr , uid , ids , context = context ) :
account_id = partner . property_account_receivable and partner . property_account_receivable . id or False
fpos_id = partner . property_account_position and partner . property_account_position . id or False
addr = self . address_get ( cr , uid , [ partner . id ] , [ ' invoice ' ] )
if partner . free_member :
2012-08-07 11:31:37 +00:00
raise osv . except_osv ( _ ( ' Error! ' ) ,
2010-07-20 12:50:15 +00:00
_ ( " Partner is a free Member. " ) )
if not addr . get ( ' invoice ' , False ) :
2012-08-07 11:31:37 +00:00
raise osv . except_osv ( _ ( ' Error! ' ) ,
2010-07-20 12:50:15 +00:00
_ ( " Partner doesn ' t have an address to make the invoice. " ) )
quantity = 1
line_value = {
2010-10-08 12:15:06 +00:00
' product_id ' : product_id ,
2010-07-20 12:50:15 +00:00
}
2010-08-13 12:20:05 +00:00
line_dict = invoice_line_obj . product_id_change ( cr , uid , { } ,
2010-07-20 12:50:15 +00:00
product_id , False , quantity , ' ' , ' out_invoice ' , partner . id , fpos_id , price_unit = amount , context = context )
line_value . update ( line_dict [ ' value ' ] )
2011-12-22 10:05:29 +00:00
line_value [ ' price_unit ' ] = amount
2010-07-20 12:50:15 +00:00
if line_value . get ( ' invoice_line_tax_id ' , False ) :
tax_tab = [ ( 6 , 0 , line_value [ ' invoice_line_tax_id ' ] ) ]
line_value [ ' invoice_line_tax_id ' ] = tax_tab
invoice_id = invoice_obj . create ( cr , uid , {
2010-10-08 12:15:06 +00:00
' partner_id ' : partner . id ,
2010-07-20 12:50:15 +00:00
' account_id ' : account_id ,
' fiscal_position ' : fpos_id or False
2010-10-06 11:30:17 +00:00
} , context = context )
2010-07-20 12:50:15 +00:00
line_value [ ' invoice_id ' ] = invoice_id
invoice_line_id = invoice_line_obj . create ( cr , uid , line_value , context = context )
2010-10-08 12:15:06 +00:00
invoice_obj . write ( cr , uid , invoice_id , { ' invoice_line ' : [ ( 6 , 0 , [ invoice_line_id ] ) ] } , context = context )
2010-07-20 12:50:15 +00:00
invoice_list . append ( invoice_id )
if line_value [ ' invoice_line_tax_id ' ] :
tax_value = invoice_tax_obj . compute ( cr , uid , invoice_id ) . values ( )
for tax in tax_value :
invoice_tax_obj . create ( cr , uid , tax , context = context )
2010-10-14 14:34:44 +00:00
#recompute the membership_state of those partners
self . pool . get ( ' res.partner ' ) . write ( cr , uid , ids , { } )
2010-07-20 12:50:15 +00:00
return invoice_list
2010-06-09 11:31:06 +00:00
2008-08-24 14:45:43 +00:00
Partner ( )
class product_template ( osv . osv ) :
_inherit = ' product.template '
_columns = {
2012-07-11 13:06:15 +00:00
' member_price ' : fields . float ( ' Member Price ' , digits_compute = dp . get_precision ( ' Product Price ' ) ) ,
2010-07-20 12:50:15 +00:00
}
2010-10-27 04:29:13 +00:00
2008-08-24 14:45:43 +00:00
product_template ( )
class Product ( osv . osv ) :
2009-10-07 11:29:18 +00:00
def fields_view_get ( self , cr , user , view_id = None , view_type = ' form ' , context = None , toolbar = False , submenu = False ) :
2010-07-12 13:30:56 +00:00
model_obj = self . pool . get ( ' ir.model.data ' )
2010-11-23 07:05:05 +00:00
if context is None :
2010-11-19 13:48:01 +00:00
context = { }
2010-08-13 12:20:05 +00:00
2008-08-24 14:45:43 +00:00
if ( ' product ' in context ) and ( context [ ' product ' ] == ' membership_product ' ) :
2010-10-19 11:46:32 +00:00
model_data_ids_form = model_obj . search ( cr , user , [ ( ' model ' , ' = ' , ' ir.ui.view ' ) , ( ' name ' , ' in ' , [ ' membership_products_form ' , ' membership_products_tree ' ] ) ] , context = context )
2010-10-08 12:15:06 +00:00
resource_id_form = model_obj . read ( cr , user , model_data_ids_form , fields = [ ' res_id ' , ' name ' ] , context = context )
dict_model = { }
2008-08-24 14:45:43 +00:00
for i in resource_id_form :
2010-10-08 12:15:06 +00:00
dict_model [ i [ ' name ' ] ] = i [ ' res_id ' ]
if view_type == ' form ' :
2008-08-24 14:45:43 +00:00
view_id = dict_model [ ' membership_products_form ' ]
else :
view_id = dict_model [ ' membership_products_tree ' ]
2009-10-07 11:29:18 +00:00
return super ( Product , self ) . fields_view_get ( cr , user , view_id , view_type , context , toolbar , submenu )
2008-08-24 14:45:43 +00:00
''' Product '''
_inherit = ' product.product '
_columns = {
2010-10-20 13:09:40 +00:00
' membership ' : fields . boolean ( ' Membership ' , help = ' Select if a product is a membership product. ' ) ,
' membership_date_from ' : fields . date ( ' Date from ' , help = ' Date from which membership becomes active. ' ) ,
' membership_date_to ' : fields . date ( ' Date to ' , help = ' Date until which membership remains active. ' ) ,
2010-08-13 12:20:05 +00:00
}
2008-08-24 14:45:43 +00:00
_defaults = {
2010-10-19 11:46:32 +00:00
' membership ' : False ,
2010-08-13 12:20:05 +00:00
}
2010-10-26 13:03:37 +00:00
2008-08-24 14:45:43 +00:00
Product ( )
class Invoice ( osv . osv ) :
''' Invoice '''
_inherit = ' account.invoice '
2010-10-06 11:30:17 +00:00
def action_cancel ( self , cr , uid , ids , * args ) :
2008-08-24 14:45:43 +00:00
''' Create a ' date_cancel ' on the membership_line object '''
member_line_obj = self . pool . get ( ' membership.membership_line ' )
today = time . strftime ( ' % Y- % m- %d ' )
for invoice in self . browse ( cr , uid , ids ) :
2010-06-16 11:51:39 +00:00
mlines = member_line_obj . search ( cr , uid ,
2010-10-19 11:46:32 +00:00
[ ( ' account_invoice_line ' , ' in ' ,
[ l . id for l in invoice . invoice_line ] ) ] )
2010-10-08 12:15:06 +00:00
member_line_obj . write ( cr , uid , mlines , { ' date_cancel ' : today } )
2010-10-06 11:30:17 +00:00
return super ( Invoice , self ) . action_cancel ( cr , uid , ids )
2010-10-26 13:03:37 +00:00
2008-08-24 14:45:43 +00:00
Invoice ( )
2009-02-04 22:50:47 +00:00
class account_invoice_line ( osv . osv ) :
_inherit = ' account.invoice.line '
2010-06-09 11:31:06 +00:00
2009-02-04 22:50:47 +00:00
def write ( self , cr , uid , ids , vals , context = None ) :
2010-07-12 13:30:56 +00:00
""" Overrides orm write method
"""
2009-02-04 22:50:47 +00:00
member_line_obj = self . pool . get ( ' membership.membership_line ' )
2010-10-27 04:29:13 +00:00
res = super ( account_invoice_line , self ) . write ( cr , uid , ids , vals , context = context )
2010-10-06 11:30:17 +00:00
for line in self . browse ( cr , uid , ids , context = context ) :
2010-05-18 10:29:15 +00:00
if line . invoice_id . type == ' out_invoice ' :
2010-10-19 11:46:32 +00:00
ml_ids = member_line_obj . search ( cr , uid , [ ( ' account_invoice_line ' , ' = ' , line . id ) ] , context = context )
2010-05-18 10:29:15 +00:00
if line . product_id and line . product_id . membership and not ml_ids :
# Product line has changed to a membership product
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
2010-10-27 11:11:08 +00:00
member_line_obj . create ( cr , uid , {
' partner ' : line . invoice_id . partner_id . 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 )
2010-05-18 10:29:15 +00:00
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 )
2009-02-04 22:50:47 +00:00
return res
def unlink ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
""" Remove Membership Line Record for Account Invoice Line
"""
2009-02-04 22:50:47 +00:00
member_line_obj = self . pool . get ( ' membership.membership_line ' )
for id in ids :
2010-10-19 11:46:32 +00:00
ml_ids = member_line_obj . search ( cr , uid , [ ( ' account_invoice_line ' , ' = ' , id ) ] , context = context )
2009-02-04 22:50:47 +00:00
member_line_obj . unlink ( cr , uid , ml_ids , context = context )
return super ( account_invoice_line , self ) . unlink ( cr , uid , ids , context = context )
2010-10-06 11:30:17 +00:00
def create ( self , cr , uid , vals , context = None ) :
2010-07-12 13:30:56 +00:00
""" Overrides orm create method
"""
2010-10-27 04:29:13 +00:00
member_line_obj = self . pool . get ( ' membership.membership_line ' )
2010-10-06 11:30:17 +00:00
result = super ( account_invoice_line , self ) . create ( cr , uid , vals , context = context )
line = self . browse ( cr , uid , result , context = context )
2010-05-18 10:29:15 +00:00
if line . invoice_id . type == ' out_invoice ' :
2010-10-19 11:46:32 +00:00
ml_ids = member_line_obj . search ( cr , uid , [ ( ' account_invoice_line ' , ' = ' , line . id ) ] , context = context )
2010-05-18 10:29:15 +00:00
if line . product_id and line . product_id . membership and not ml_ids :
# Product line is a membership product
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
2010-10-27 11:11:08 +00:00
member_line_obj . create ( cr , uid , {
2010-08-13 12:20:05 +00:00
' partner ' : line . invoice_id . partner_id and line . invoice_id . partner_id . id or False ,
' 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 ,
2010-10-06 11:30:17 +00:00
} , context = context )
2009-02-04 22:50:47 +00:00
return result
2009-02-19 10:41:30 +00:00
2009-02-04 22:50:47 +00:00
account_invoice_line ( )
2010-10-26 13:03:37 +00:00
2011-09-18 13:53:10 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: