2009-10-13 05:58:37 +00:00
# -*- coding: utf-8 -*-
2008-08-24 14:45:43 +00:00
##############################################################################
2009-11-26 12:30:42 +00:00
#
2008-11-18 10:56:11 +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-26 12:30:42 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2008-08-24 14:45:43 +00:00
#
##############################################################################
2010-06-07 06:43:12 +00:00
from crm import crm
2008-08-24 14:45:43 +00:00
from osv import fields , osv
2010-06-07 06:43:12 +00:00
from tools . translate import _
2008-08-24 14:45:43 +00:00
import netsvc
import pooler
2010-06-07 06:43:12 +00:00
import time
2008-08-24 14:45:43 +00:00
import tools
2010-07-15 13:41:44 +00:00
import decimal_precision as dp
2008-08-24 14:45:43 +00:00
2010-06-26 10:13:40 +00:00
class event_type ( osv . osv ) :
""" Event Type """
2008-08-24 14:45:43 +00:00
_name = ' event.type '
2010-06-07 06:43:12 +00:00
_description = __doc__
2008-08-24 14:45:43 +00:00
_columns = {
2010-05-17 13:31:14 +00:00
' name ' : fields . char ( ' Event type ' , size = 64 , required = True ) ,
2008-08-24 14:45:43 +00:00
}
event_type ( )
2010-06-26 10:13:40 +00:00
class event_event ( osv . osv ) :
""" Event """
2008-08-24 14:45:43 +00:00
_name = ' event.event '
2010-06-07 06:43:12 +00:00
_description = __doc__
2008-08-24 14:45:43 +00:00
_order = ' date_begin '
2010-06-30 14:21:59 +00:00
2010-06-26 10:13:40 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
""" Copy record of Given id
2010-07-12 13:30:56 +00:00
@param id : Id of Event record .
2010-06-07 06:43:12 +00:00
@param context : A standard dictionary for contextual values
"""
2010-06-26 10:13:40 +00:00
if not default :
default = { }
default . update ( {
' code ' : self . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' event.event ' ) ,
' state ' : ' draft '
} )
return super ( event_event , self ) . copy ( cr , uid , id , default = default , context = context )
2010-06-30 14:21:59 +00:00
def onchange_product ( self , cr , uid , ids , product_id ) :
2010-07-12 13:30:56 +00:00
""" This function returns value of product ' s unit price based on product id.
@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 Event IDs
@param product_id : Product ' s id
"""
2010-06-30 14:21:59 +00:00
if not product_id :
return { ' value ' : { ' unit_price ' : False } }
else :
unit_price = self . pool . get ( ' product.product ' ) . price_get ( cr , uid , [ product_id ] ) [ product_id ]
return { ' value ' : { ' unit_price ' : unit_price } }
2010-06-26 10:13:40 +00:00
def button_draft ( self , cr , uid , ids , context = None ) :
return self . write ( cr , uid , ids , { ' state ' : ' draft ' } , context = context )
def button_cancel ( self , cr , uid , ids , context = None ) :
return self . write ( cr , uid , ids , { ' state ' : ' cancel ' } , context = context )
def button_done ( self , cr , uid , ids , context = None ) :
return self . write ( cr , uid , ids , { ' state ' : ' done ' } , context = context )
2010-07-15 13:41:44 +00:00
def do_confirm ( self , cr , uid , ids , context = None ) :
""" Confirm Event and send confirmation email to all register peoples
"""
2010-06-26 10:13:40 +00:00
register_pool = self . pool . get ( ' event.registration ' )
for event in self . browse ( cr , uid , ids , context = context ) :
if event . mail_auto_confirm :
2008-10-07 09:26:12 +00:00
#send reminder that will confirm the event for all the people that were already confirmed
2010-06-26 10:13:40 +00:00
reg_ids = register_pool . search ( cr , uid , [
( ' event_id ' , ' = ' , event . id ) ,
( ' state ' , ' not in ' , [ ' draft ' , ' cancel ' ] ) ] )
register_pool . mail_user_confirm ( cr , uid , reg_ids )
2010-06-07 06:43:12 +00:00
2010-05-17 13:31:14 +00:00
return self . write ( cr , uid , ids , { ' state ' : ' confirm ' } )
2008-08-24 14:45:43 +00:00
2010-07-15 13:41:44 +00:00
def button_confirm ( self , cr , uid , ids , context = None ) :
""" This Function Confirm Event.
@param ids : List of Event IDs
@param context : A standard dictionary for contextual values
@return : True
"""
data_pool = self . pool . get ( ' ir.model.data ' )
unconfirmed_ids = [ ]
for event in self . browse ( cr , uid , ids , context = context ) :
total_confirmed = event . register_current
if total_confirmed > = event . register_min or event . register_max == 0 :
self . do_confirm ( cr , uid , [ event . id ] , context = context )
else :
unconfirmed_ids . append ( event . id )
if unconfirmed_ids :
view_id = data_pool . _get_id ( cr , uid , ' event ' , ' view_event_confirm ' )
view_data = data_pool . browse ( cr , uid , view_id )
view_id = view_data . res_id
context [ ' event_ids ' ] = unconfirmed_ids
return {
' name ' : _ ( ' Confirm Event ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' event.confirm ' ,
' views ' : [ ( view_id , ' form ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
' context ' : context ,
' nodestroy ' : True
}
return True
2008-08-24 14:45:43 +00:00
2010-06-26 10:13:40 +00:00
def _get_register ( self , cr , uid , ids , fields , args , context = None ) :
2010-07-12 13:30:56 +00:00
""" Get Confirm or uncofirm register value.
2010-06-07 06:43:12 +00:00
@param ids : List of Event registration type ' s id
2010-06-26 10:13:40 +00:00
@param fields : List of function fields ( register_current and register_prospect ) .
2010-06-07 06:43:12 +00:00
@param context : A standard dictionary for contextual values
@return : Dictionary of function fields value .
"""
2010-06-26 10:13:40 +00:00
register_pool = self . pool . get ( ' event.registration ' )
2010-06-07 06:43:12 +00:00
res = { }
2008-08-24 14:45:43 +00:00
for event in self . browse ( cr , uid , ids , context ) :
2010-05-17 13:31:14 +00:00
res [ event . id ] = { }
2010-06-26 10:13:40 +00:00
for field in fields :
res [ event . id ] [ field ] = False
state = [ ]
if ' register_current ' in fields :
2010-07-15 13:41:44 +00:00
state + = [ ' open ' , ' done ' ]
2010-06-26 10:13:40 +00:00
if ' register_prospect ' in fields :
state . append ( ' draft ' )
reg_ids = register_pool . search ( cr , uid , [
2010-07-12 13:30:56 +00:00
( ' event_id ' , ' = ' , event . id ) ,
2010-06-26 10:13:40 +00:00
( ' state ' , ' in ' , state ) ] )
2010-06-30 14:21:59 +00:00
2010-06-26 10:13:40 +00:00
if ' register_current ' in fields :
res [ event . id ] [ ' register_current ' ] = len ( reg_ids )
if ' register_prospect ' in fields :
res [ event . id ] [ ' register_prospect ' ] = len ( reg_ids )
2010-06-07 06:43:12 +00:00
2008-08-24 14:45:43 +00:00
return res
2010-06-26 10:13:40 +00:00
def write ( self , cr , uid , ids , vals , context = None ) :
2010-06-07 06:43:12 +00:00
"""
Writes values in one or several fields .
@param ids : List of Event registration type ' s IDs
@param vals : dictionary with values to update .
@return : True
"""
2010-06-26 10:13:40 +00:00
register_pool = self . pool . get ( ' event.registration ' )
res = super ( event_event , self ) . write ( cr , uid , ids , vals , context = context )
if vals . get ( ' date_begin ' , False ) or vals . get ( ' mail_auto_confirm ' , False ) or vals . get ( ' mail_confirm ' , False ) :
for event in self . browse ( cr , uid , ids , context = context ) :
2008-10-07 09:26:12 +00:00
#change the deadlines of the registration linked to this event
2010-06-26 10:13:40 +00:00
register_values = { }
if vals . get ( ' date_begin ' , False ) :
register_values [ ' date_deadline ' ] = vals [ ' date_begin ' ]
#change the description of the registration linked to this event
if vals . get ( ' mail_auto_confirm ' , False ) :
if vals [ ' mail_auto_confirm ' ] :
if ' mail_confirm ' not in vals :
vals [ ' mail_confirm ' ] = event . mail_confirm
else :
vals [ ' mail_confirm ' ] = False
if ' mail_confirm ' in vals :
register_values [ ' description ' ] = vals [ ' mail_confirm ' ]
if register_values :
reg_ids = register_pool . search ( cr , uid , [ ( ' event_id ' , ' = ' , event . id ) ] )
register_pool . write ( cr , uid , reg_ids , register_values )
2008-08-24 14:45:43 +00:00
return res
_columns = {
2010-07-15 13:41:44 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True , translate = True , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' user_id ' : fields . many2one ( ' res.users ' , ' Responsible User ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' parent_id ' : fields . many2one ( ' event.event ' , ' Parent Event ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' section_id ' : fields . many2one ( ' crm.case.section ' , ' Sale Team ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' child_ids ' : fields . one2many ( ' event.event ' , ' parent_id ' , ' Child Events ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' reply_to ' : fields . char ( ' Reply-To ' , size = 64 , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = " The email address put in the ' Reply-To ' of all emails sent by Open ERP " ) ,
' type ' : fields . many2one ( ' event.type ' , ' Type ' , help = " Type of Event like Seminar, Exhibition, Conference, Training. " , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' register_max ' : fields . integer ( ' Maximum Registrations ' , help = " Provide Maximun Number of Registrations " , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' register_min ' : fields . integer ( ' Minimum Registrations ' , help = " Providee Minimum Number of Registrations " , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' register_current ' : fields . function ( _get_register , method = True , string = ' Confirmed Registrations ' , multi = ' register_current ' ,
help = " Total of Open and Done Registrations " ) ,
' register_prospect ' : fields . function ( _get_register , method = True , string = ' Unconfirmed Registrations ' , multi = ' register_prospect ' ,
help = " Total of Prospect Registrations " ) ,
' registration_ids ' : fields . one2many ( ' event.registration ' , ' event_id ' , ' Registrations ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' date_begin ' : fields . datetime ( ' Beginning date ' , required = True , help = " Beginning Date of Event " , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' date_end ' : fields . datetime ( ' Closing date ' , required = True , help = " Closing Date of Event " , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' state ' : fields . selection ( [
( ' draft ' , ' Draft ' ) ,
( ' confirm ' , ' Confirmed ' ) ,
( ' done ' , ' Done ' ) ,
( ' cancel ' , ' Cancelled ' ) ] ,
' State ' , readonly = True , required = True ,
help = ' If event is created, the state is \' Draft \' .If event is confirmed for the particular dates the state is set to \' Confirmed \' . If the event is over, the state is set to \' Done \' .If event is cancelled the state is set to \' Cancelled \' . ' ) ,
' mail_auto_registr ' : fields . boolean ( ' Mail Auto Register ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = ' Check this box if you want to use the automatic mailing for new registration ' ) ,
' mail_auto_confirm ' : fields . boolean ( ' Mail Auto Confirm ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = ' Check this box if you want ot use the automatic confirmation emailing or the reminder ' ) ,
' mail_registr ' : fields . text ( ' Registration Email ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = ' This email will be sent when someone subscribes to the event. ' ) ,
' mail_confirm ' : fields . text ( ' Confirmation Email ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = " This email will be sent when the event gets confimed or when someone subscribes to a confirmed event. This is also the email sent to remind someone about the event. " ) ,
' product_id ' : fields . many2one ( ' product.product ' , ' Product ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Product which is provided cost of event. Invoice of event will be created with this Product. " ) ,
' note ' : fields . text ( ' Notes ' , help = " Description or Summary of Event " , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' pricelist_id ' : fields . many2one ( ' product.pricelist ' , ' Pricelist ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Pricelist version for current event. " ) ,
" unit_price " : fields . float ( ' Registration Cost ' , digits_compute = dp . get_precision ( ' Event Price ' ) , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' main_speaker_id ' : fields . many2one ( ' res.partner ' , ' Main Speaker ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' speaker_ids ' : fields . many2many ( ' res.partner ' , ' event_speaker_rel ' , ' speaker_id ' , ' partner_id ' , ' Other Speakers ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' address_id ' : fields . many2one ( ' res.partner.address ' , ' Location Address ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' speaker_confirmed ' : fields . boolean ( ' Speaker Confirmed ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
2010-07-02 08:32:50 +00:00
' country_id ' : fields . related ( ' address_id ' , ' country_id ' ,
2010-07-15 13:41:44 +00:00
type = ' many2one ' , relation = ' res.country ' , string = ' Country ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' language ' : fields . char ( ' Language ' , size = 64 , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' note ' : fields . text ( ' Description ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = True , change_default = True , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
2010-06-30 14:21:59 +00:00
2008-08-24 14:45:43 +00:00
}
2008-12-08 17:08:40 +00:00
2008-08-24 14:45:43 +00:00
_defaults = {
2010-06-26 10:13:40 +00:00
' state ' : ' draft ' ,
2010-07-15 13:41:44 +00:00
' company_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' event.event ' , context = c ) ,
2010-06-26 10:13:40 +00:00
' user_id ' : lambda obj , cr , uid , context : uid ,
2008-08-24 14:45:43 +00:00
}
2010-05-17 13:31:14 +00:00
2010-07-15 13:41:44 +00:00
def _check_recursion ( self , cr , uid , ids ) :
"""
Checks for recursion level for event
"""
level = 100
while len ( ids ) :
cr . execute ( ' select distinct parent_id from event_event where id IN %s ' , ( tuple ( ids ) , ) )
ids = filter ( None , map ( lambda x : x [ 0 ] , cr . fetchall ( ) ) )
if not level :
return False
level - = 1
return True
_constraints = [
( _check_recursion , ' Error ! You cannot create recursive event. ' , [ ' parent_id ' ] )
]
def do_team_change ( self , cr , uid , ids , team_id , context = None ) :
"""
On Change Callback : when team change , this is call .
on this function , take value of reply_to from selected team .
"""
if not team_id :
return { }
if context is None :
context = { }
team_pool = self . pool . get ( ' crm.case.section ' )
team = team_pool . browse ( cr , uid , team_id , context = context )
res = { }
if team . reply_to :
res = { ' value ' : { ' reply_to ' : team . reply_to } }
return res
2010-06-30 14:21:59 +00:00
2010-06-26 10:13:40 +00:00
event_event ( )
class event_registration ( osv . osv ) :
2010-07-15 13:41:44 +00:00
""" Event Registration """
2010-06-26 10:13:40 +00:00
_name = ' event.registration '
_description = __doc__
_inherit = ' crm.meeting '
2008-08-24 14:45:43 +00:00
2010-07-15 13:41:44 +00:00
def _amount_line ( self , cr , uid , ids , field_name , arg , context = None ) :
cur_obj = self . pool . get ( ' res.currency ' )
res = { }
context = context or { }
for line in self . browse ( cr , uid , ids , context = context ) :
price = line . unit_price * line . nb_register
pricelist = line . event_id . pricelist_id or line . partner_invoice_id . property_product_pricelist
cur = pricelist and pricelist . currency_id or False
res [ line . id ] = cur and cur_obj . round ( cr , uid , cur , price ) or price
return res
2010-06-26 10:13:40 +00:00
_columns = {
2010-07-15 13:41:44 +00:00
' name ' : fields . char ( ' Summary ' , size = 124 , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' email_cc ' : fields . text ( ' CC ' , size = 252 , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } , help = " These people will receive a copy of the future communication between partner and users by email " ) ,
' nb_register ' : fields . integer ( ' Quantity ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } , help = " Number of Registrations or Tickets " ) ,
' event_id ' : fields . many2one ( ' event.event ' , ' Event Related ' , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
" partner_invoice_id " : fields . many2one ( ' res.partner ' , ' Partner Invoiced ' , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
" contact_id " : fields . many2one ( ' res.partner.contact ' , ' Partner Contact ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) , #TODO: filter only the contacts that have a function into the selected partner_id
" unit_price " : fields . float ( ' Unit Price ' , required = True , digits_compute = dp . get_precision ( ' Event Price ' ) , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' price_subtotal ' : fields . function ( _amount_line , method = True , string = ' Subtotal ' , digits_compute = dp . get_precision ( ' Event Price ' ) ) ,
" badge_ids " : fields . one2many ( ' event.registration.badge ' , ' registration_id ' , ' Badges ' , readonly = False , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
" event_product " : fields . char ( " Invoice Name " , size = 128 , required = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
" tobe_invoiced " : fields . boolean ( " To be Invoiced " , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2010-07-12 13:30:56 +00:00
" invoice_id " : fields . many2one ( " account.invoice " , " Invoice " , readonly = True ) ,
2010-06-26 10:13:40 +00:00
' date_closed ' : fields . datetime ( ' Closed ' , readonly = True ) ,
' ref ' : fields . reference ( ' Reference ' , selection = crm . _links_get , size = 128 ) ,
2010-06-30 14:21:59 +00:00
' ref2 ' : fields . reference ( ' Reference 2 ' , selection = crm . _links_get , size = 128 ) ,
' message_ids ' : fields . one2many ( ' mailgate.message ' , ' res_id ' , ' Messages ' , domain = [ ( ' history ' , ' = ' , True ) , ( ' model ' , ' = ' , _name ) ] ) ,
' log_ids ' : fields . one2many ( ' mailgate.message ' , ' res_id ' , ' Logs ' , domain = [ ( ' history ' , ' = ' , False ) , ( ' model ' , ' = ' , _name ) ] ) ,
2010-07-15 13:41:44 +00:00
' section_id ' : fields . related ( ' event_id ' , ' section_id ' , type = ' many2one ' , relation = ' crm.case.section ' , string = ' Sale Team ' , store = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' company_id ' : fields . related ( ' event_id ' , ' company_id ' , type = ' many2one ' , relation = ' res.company ' , string = ' Company ' , store = True , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
2010-06-26 10:13:40 +00:00
}
_defaults = {
' nb_register ' : 1 ,
' tobe_invoiced ' : True ,
2010-07-15 13:41:44 +00:00
' date ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' )
2010-06-26 10:13:40 +00:00
}
2008-08-24 14:45:43 +00:00
2010-06-21 06:02:20 +00:00
def _make_invoice ( self , cr , uid , reg , lines , context = None ) :
2010-06-26 10:13:40 +00:00
""" Create Invoice from Invoice lines
2010-07-12 13:30:56 +00:00
@param reg : Model of Event Registration
@param lines : Ids of Invoice lines
2010-06-26 10:13:40 +00:00
"""
2010-06-21 06:02:20 +00:00
if context is None :
context = { }
2010-06-26 10:13:40 +00:00
inv_pool = self . pool . get ( ' account.invoice ' )
inv_lines_pool = self . pool . get ( ' account.invoice.line ' )
2010-06-21 06:02:20 +00:00
2010-06-26 10:13:40 +00:00
val_invoice = inv_pool . onchange_partner_id ( cr , uid , [ ] , ' out_invoice ' , reg . partner_invoice_id . id , False , False )
2010-06-21 06:02:20 +00:00
val_invoice [ ' value ' ] . update ( { ' partner_id ' : reg . partner_invoice_id . id } )
partner_address_id = val_invoice [ ' value ' ] [ ' address_invoice_id ' ]
2010-06-26 10:13:40 +00:00
value = inv_lines_pool . product_id_change ( cr , uid , [ ] , reg . event_id . product_id . id , uom = False , partner_id = reg . partner_invoice_id . id , fposition_id = reg . partner_invoice_id . property_account_position . id )
2010-06-21 06:02:20 +00:00
2010-06-26 10:13:40 +00:00
l = inv_lines_pool . read ( cr , uid , lines )
2010-06-21 06:02:20 +00:00
val_invoice [ ' value ' ] . update ( {
' origin ' : reg . event_product ,
' reference ' : False ,
' invoice_line ' : [ ( 6 , 0 , lines ) ] ,
' comment ' : " " ,
2010-07-05 14:28:43 +00:00
' date_invoice ' : context . get ( ' date_inv ' , False )
2010-06-21 06:02:20 +00:00
} )
2010-06-26 10:13:40 +00:00
inv_id = inv_pool . create ( cr , uid , val_invoice [ ' value ' ] )
inv_pool . button_compute ( cr , uid , [ inv_id ] )
2010-06-21 06:02:20 +00:00
self . _history ( cr , uid , [ reg ] , _ ( ' Invoiced ' ) )
return inv_id
2010-06-26 10:13:40 +00:00
def action_invoice_create ( self , cr , uid , ids , grouped = False , date_inv = False , context = None ) :
""" Action of Create Invoice """
2010-06-21 06:02:20 +00:00
res = False
invoices = { }
tax_ids = [ ]
2010-07-01 15:29:07 +00:00
new_invoice_ids = [ ]
2010-06-26 10:13:40 +00:00
inv_lines_pool = self . pool . get ( ' account.invoice.line ' )
inv_pool = self . pool . get ( ' account.invoice ' )
product_pool = self . pool . get ( ' product.product ' )
contact_pool = self . pool . get ( ' res.partner.contact ' )
if not context :
context = { }
2010-06-21 06:02:20 +00:00
# If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the
# last day of the last month as invoice date
if date_inv :
context [ ' date_inv ' ] = date_inv
2010-06-26 10:13:40 +00:00
for reg in self . browse ( cr , uid , ids , context = context ) :
2010-06-21 06:02:20 +00:00
2010-06-26 10:13:40 +00:00
val_invoice = inv_pool . onchange_partner_id ( cr , uid , [ ] , ' out_invoice ' , reg . partner_invoice_id . id , False , False )
2010-06-21 06:02:20 +00:00
val_invoice [ ' value ' ] . update ( { ' partner_id ' : reg . partner_invoice_id . id } )
partner_address_id = val_invoice [ ' value ' ] [ ' address_invoice_id ' ]
if not partner_address_id :
raise osv . except_osv ( _ ( ' Error ! ' ) ,
_ ( " Registered partner doesn ' t have an address to make the invoice. " ) )
2010-06-26 10:13:40 +00:00
value = inv_lines_pool . product_id_change ( cr , uid , [ ] , reg . event_id . product_id . id , uom = False , partner_id = reg . partner_invoice_id . id , fposition_id = reg . partner_invoice_id . property_account_position . id )
product = product_pool . browse ( cr , uid , reg . event_id . product_id . id , context = context )
for tax in product . taxes_id :
2010-06-21 06:02:20 +00:00
tax_ids . append ( tax . id )
vals = value [ ' value ' ]
2010-06-26 10:13:40 +00:00
c_name = reg . contact_id and ( ' - ' + contact_pool . name_get ( cr , uid , [ reg . contact_id . id ] ) [ 0 ] [ 1 ] ) or ' '
2010-06-21 06:02:20 +00:00
vals . update ( {
' name ' : reg . event_product + ' - ' + c_name ,
' price_unit ' : reg . unit_price ,
' quantity ' : reg . nb_register ,
' product_id ' : reg . event_id . product_id . id ,
' invoice_line_tax_id ' : [ ( 6 , 0 , tax_ids ) ] ,
} )
2010-06-26 10:13:40 +00:00
inv_line_ids = self . _create_invoice_lines ( cr , uid , [ reg . id ] , vals )
2010-06-21 06:02:20 +00:00
invoices . setdefault ( reg . partner_id . id , [ ] ) . append ( ( reg , inv_line_ids ) )
for val in invoices . values ( ) :
2010-07-01 15:29:07 +00:00
res = False
2010-06-21 06:02:20 +00:00
if grouped :
res = self . _make_invoice ( cr , uid , val [ 0 ] [ 0 ] , [ v for k , v in val ] , context = context )
for k , v in val :
2010-07-15 13:41:44 +00:00
self . do_close ( cr , uid , [ k . id ] , context = { ' invoice_id ' : res } )
2010-06-21 06:02:20 +00:00
else :
for k , v in val :
res = self . _make_invoice ( cr , uid , k , [ v ] , context = context )
2010-07-15 13:41:44 +00:00
self . do_close ( cr , uid , [ k . id ] , context = { ' invoice_id ' : res } )
2010-07-01 15:29:07 +00:00
if res : new_invoice_ids . append ( res )
return new_invoice_ids
2010-06-21 06:02:20 +00:00
2010-07-15 13:41:44 +00:00
def do_open ( self , cr , uid , ids , context = None ) :
""" Open Registration
"""
res = self . write ( cr , uid , ids , { ' state ' : ' open ' } , context = context )
self . mail_user ( cr , uid , ids )
self . _history ( cr , uid , ids , _ ( ' Open ' ) )
return res
def do_close ( self , cr , uid , ids , context = None ) :
""" Close Registration
"""
if not context :
context = { }
invoice_id = context . get ( ' invoice_id ' , False )
values = { ' state ' : ' done ' , ' date_closed ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) }
msg = _ ( ' Done ' )
if invoice_id :
values [ ' invoice_id ' ] = invoice_id
res = self . write ( cr , uid , ids , values )
self . _history ( cr , uid , ids , msg )
return res
2010-06-26 10:13:40 +00:00
def check_confirm ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
""" This Function Open Event Registration and send email to user.
2010-06-07 06:43:12 +00:00
@param ids : List of Event registration ' s IDs
@param context : A standard dictionary for contextual values
2010-07-12 13:30:56 +00:00
@return : True
2010-06-07 06:43:12 +00:00
"""
2010-06-26 10:13:40 +00:00
data_pool = self . pool . get ( ' ir.model.data ' )
unconfirmed_ids = [ ]
for registration in self . browse ( cr , uid , ids , context = context ) :
total_confirmed = registration . event_id . register_current + registration . nb_register
if total_confirmed < = registration . event_id . register_max or registration . event_id . register_max == 0 :
2010-07-15 13:41:44 +00:00
self . do_open ( cr , uid , [ registration . id ] , context )
2010-06-21 06:02:20 +00:00
else :
2010-06-26 10:13:40 +00:00
unconfirmed_ids . append ( registration . id )
if unconfirmed_ids :
view_id = data_pool . _get_id ( cr , uid , ' event ' , ' view_event_confirm_registration ' )
view_data = data_pool . browse ( cr , uid , view_id )
view_id = view_data . res_id
context [ ' registration_ids ' ] = unconfirmed_ids
2010-03-30 12:17:54 +00:00
return {
2010-05-17 13:31:14 +00:00
' name ' : _ ( ' Confirm Registration ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' event.confirm.registration ' ,
2010-06-26 10:13:40 +00:00
' views ' : [ ( view_id , ' form ' ) ] ,
2010-05-17 13:31:14 +00:00
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
2010-06-26 10:13:40 +00:00
' context ' : context ,
2010-03-30 12:17:54 +00:00
' nodestroy ' : True
}
2010-06-26 10:13:40 +00:00
return True
2010-03-30 12:17:54 +00:00
2010-07-15 13:41:44 +00:00
def button_reg_close ( self , cr , uid , ids , context = None ) :
2010-07-12 13:30:56 +00:00
""" This Function Close Event Registration.
"""
2010-07-15 13:41:44 +00:00
if not context :
context = { }
data_pool = self . pool . get ( ' ir.model.data ' )
unclosed_ids = [ ]
for registration in self . browse ( cr , uid , ids , context = context ) :
if registration . tobe_invoiced and not registration . invoice_id :
unclosed_ids . append ( registration . id )
else :
self . do_close ( cr , uid , [ registration . id ] )
if unclosed_ids :
view_id = data_pool . _get_id ( cr , uid , ' event ' , ' view_event_make_invoice ' )
view_data = data_pool . browse ( cr , uid , view_id )
view_id = view_data . res_id
context [ ' active_ids ' ] = unclosed_ids
return {
' name ' : _ ( ' Close Registration ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' event.make.invoice ' ,
' views ' : [ ( view_id , ' form ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
' context ' : context ,
' nodestroy ' : True
}
2008-08-24 14:45:43 +00:00
return True
2010-06-21 06:02:20 +00:00
2010-07-12 13:30:56 +00:00
def button_reg_cancel ( self , cr , uid , ids , * args ) :
""" This Function Cancel Event Registration.
"""
2010-06-26 10:13:40 +00:00
registrations = self . browse ( cr , uid , ids )
self . _history ( cr , uid , registrations , _ ( ' Cancel ' ) )
2010-06-21 06:02:20 +00:00
self . write ( cr , uid , ids , { ' state ' : ' cancel ' } )
2008-08-24 14:45:43 +00:00
return True
2010-06-26 10:13:40 +00:00
def create ( self , cr , uid , values , context = None ) :
2010-06-07 06:43:12 +00:00
""" Overrides orm create method.
"""
2010-07-12 13:30:56 +00:00
event_obj = self . pool . get ( ' event.event ' )
event = event_obj . browse ( cr , uid , values [ ' event_id ' ] , context = context )
2010-06-26 10:13:40 +00:00
values [ ' date_deadline ' ] = event . date_begin
values [ ' description ' ] = event . mail_confirm
res = super ( event_registration , self ) . create ( cr , uid , values , context = context )
registrations = self . browse ( cr , uid , [ res ] , context = context )
self . _history ( cr , uid , registrations , _ ( ' Created ' ) )
2008-08-24 14:45:43 +00:00
return res
2010-07-12 13:30:56 +00:00
def write ( self , cr , uid , ids , values , context = None ) :
""" Overrides orm write method.
"""
event_obj = self . pool . get ( ' event.event ' )
2010-06-26 10:13:40 +00:00
if ' event_id ' in values :
2010-07-12 13:30:56 +00:00
event = event_obj . browse ( cr , uid , values [ ' event_id ' ] , context = context )
2010-06-26 10:13:40 +00:00
values [ ' date_deadline ' ] = event . date_begin
values [ ' description ' ] = event . mail_confirm
return super ( event_registration , self ) . write ( cr , uid , ids , values , context = context )
2010-06-21 06:02:20 +00:00
2010-06-26 10:13:40 +00:00
def mail_user ( self , cr , uid , ids , confirm = False , context = None ) :
2010-06-21 06:02:20 +00:00
"""
2010-06-26 10:13:40 +00:00
Send email to user
2010-06-21 06:02:20 +00:00
"""
2010-06-26 10:13:40 +00:00
if not context :
context = { }
2010-06-21 06:02:20 +00:00
2010-07-15 13:41:44 +00:00
for regestration in self . browse ( cr , uid , ids , context = context ) :
src = regestration . event_id . reply_to or False
email_to = [ ]
email_cc = [ ]
if regestration . email_from :
email_to = regestration . email_from
if regestration . email_cc :
email_cc + = [ regestration . email_cc ]
if not ( email_to and email_cc ) :
continue
subject = " "
body = " "
if confirm :
subject = _ ( ' Auto Confirmation: [ %s ] %s ' ) % ( regestration . id , regestration . name )
body = regestration . event_id . mail_confirm
elif regestration . event_id . mail_auto_confirm or regestration . event_id . mail_auto_registr :
if regestration . event_id . state in [ ' draft ' , ' fixed ' , ' open ' , ' confirm ' , ' running ' ] and regestration . event_id . mail_auto_registr :
subject = _ ( ' Auto Registration: [ %s ] %s ' ) % ( regestration . id , regestration . name )
body = regestration . event_id . mail_registr
if ( regestration . event_id . state in [ ' confirm ' , ' running ' ] ) and regestration . event_id . mail_auto_confirm :
subject = _ ( ' Auto Confirmation: [ %s ] %s ' ) % ( regestration . id , regestration . name )
body = regestration . event_id . mail_confirm
if subject or body :
tools . email_send ( src , email_to , subject , body , email_cc = email_cc , openobject_id = regestration . id )
self . history ( cr , uid , [ regestration ] , subject , history = True , \
email = email_to , details = body , \
subject = subject , email_from = src , \
email_cc = ' , ' . join ( email_cc ) )
2010-06-26 10:13:40 +00:00
return True
2008-10-07 09:26:12 +00:00
2010-06-26 10:13:40 +00:00
def mail_user_confirm ( self , cr , uid , ids , context = None ) :
2010-06-07 06:43:12 +00:00
"""
2010-06-26 10:13:40 +00:00
Send email to user
2010-06-07 06:43:12 +00:00
"""
2010-06-26 10:13:40 +00:00
return self . mail_user ( cr , uid , ids , confirm = True , context = context )
2008-08-24 14:45:43 +00:00
2008-11-28 13:09:47 +00:00
def _create_invoice_lines ( self , cr , uid , ids , vals ) :
2010-06-07 06:43:12 +00:00
""" Create account Invoice line for Registration Id.
"""
2010-07-15 13:41:44 +00:00
return self . pool . get ( ' account.invoice.line ' ) . create ( cr , uid , vals )
2008-08-24 14:45:43 +00:00
2008-10-07 09:26:12 +00:00
def onchange_contact_id ( self , cr , uid , ids , contact , partner ) :
2010-06-07 06:43:12 +00:00
2010-07-12 13:30:56 +00:00
""" This function returns value of Badge Name , Badge Title based on Partner contact.
@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 Registration IDs
@param contact : Patner Contact IDS
@param partner : Partner IDS
"""
2008-08-24 14:45:43 +00:00
data = { }
2008-10-07 09:26:12 +00:00
if not contact :
2008-08-24 14:45:43 +00:00
return data
2010-07-12 13:30:56 +00:00
contact_obj = self . pool . get ( ' res.partner.contact ' )
addr_obj = self . pool . get ( ' res.partner.address ' )
job_obj = self . pool . get ( ' res.partner.job ' )
contact_id = contact_obj . browse ( cr , uid , contact )
2008-10-07 09:26:12 +00:00
if partner :
2010-07-12 13:30:56 +00:00
partner_addresses = addr_obj . search ( cr , uid , [ ( ' partner_id ' , ' = ' , partner ) ] )
job_ids = job_obj . search ( cr , uid , [ ( ' contact_id ' , ' = ' , contact ) , ( ' address_id ' , ' in ' , partner_addresses ) ] )
2008-10-08 05:29:16 +00:00
if job_ids :
2010-07-12 13:30:56 +00:00
data [ ' email_from ' ] = job_obj . browse ( cr , uid , job_ids [ 0 ] ) . email
2010-05-17 13:31:14 +00:00
return { ' value ' : data }
2008-08-24 14:45:43 +00:00
def onchange_event ( self , cr , uid , ids , event_id , partner_invoice_id ) :
2010-07-12 13:30:56 +00:00
""" This function returns value of Product Name, Unit Price based on Event.
@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 Registration IDs
@param event_id : Event ID
@param partner_invoice_id : Partner Invoice ID
"""
2008-08-24 14:45:43 +00:00
context = { }
if not event_id :
2010-06-21 06:02:20 +00:00
return { ' value ' : { ' unit_price ' : False , ' event_product ' : False } }
2010-06-07 06:43:12 +00:00
2010-07-12 13:30:56 +00:00
event_obj = self . pool . get ( ' event.event ' )
prod_obj = self . pool . get ( ' product.product ' )
res_obj = self . pool . get ( ' res.partner ' )
data_event = event_obj . browse ( cr , uid , event_id )
2010-07-15 13:41:44 +00:00
res = { ' value ' : { ' unit_price ' : False , ' event_product ' : False , ' user_id ' : False } }
2010-07-10 09:16:49 +00:00
if data_event . user_id . id :
2010-07-15 13:41:44 +00:00
res [ ' value ' ] . update ( { ' user_id ' : data_event . user_id . id } )
2008-08-24 14:45:43 +00:00
if data_event . product_id :
2010-07-15 13:41:44 +00:00
pricelist_id = data_event . pricelist_id and data_event . pricelist_id . id or False
if partner_invoice_id :
partner = res_obj . browse ( cr , uid , partner_invoice_id , context = context )
pricelist_id = pricelist_id or partner . property_product_pricelist . id
unit_price = prod_obj . _product_price ( cr , uid , [ data_event . product_id . id ] , False , False , { ' pricelist ' : pricelist_id } ) [ data_event . product_id . id ]
res [ ' value ' ] . update ( { ' unit_price ' : unit_price , ' event_product ' : data_event . product_id . name } )
return res
2008-08-24 14:45:43 +00:00
2008-10-07 12:51:22 +00:00
def onchange_partner_id ( self , cr , uid , ids , part , event_id , email = False ) :
2010-07-12 13:30:56 +00:00
""" This function returns value of Patner Invoice id, Unit Price, badget title based on partner and Event.
@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 Registration IDs
@param event_id : Event ID
@param partner_invoice_id : Partner Invoice ID
"""
job_obj = self . pool . get ( ' res.partner.job ' )
res_obj = self . pool . get ( ' res.partner ' )
2010-06-07 06:43:12 +00:00
2010-07-15 13:41:44 +00:00
data = { }
data [ ' contact_id ' ] , data [ ' partner_invoice_id ' ] , data [ ' email_from ' ] = ( False , False , False )
2008-08-24 14:45:43 +00:00
if not part :
2010-05-17 13:31:14 +00:00
return { ' value ' : data }
2008-08-24 14:45:43 +00:00
data [ ' partner_invoice_id ' ] = part
# this calls onchange_partner_invoice_id
2010-05-17 13:31:14 +00:00
d = self . onchange_partner_invoice_id ( cr , uid , ids , event_id , part )
2008-08-24 14:45:43 +00:00
# this updates the dictionary
data . update ( d [ ' value ' ] )
2010-07-12 13:30:56 +00:00
addr = res_obj . address_get ( cr , uid , [ part ] )
2008-10-07 09:26:12 +00:00
if addr :
if addr . has_key ( ' default ' ) :
2010-07-12 13:30:56 +00:00
job_ids = job_obj . search ( cr , uid , [ ( ' address_id ' , ' = ' , addr [ ' default ' ] ) ] )
2008-10-07 09:26:12 +00:00
if job_ids :
2010-07-12 13:30:56 +00:00
data [ ' contact_id ' ] = job_obj . browse ( cr , uid , job_ids [ 0 ] ) . contact_id . id
2010-05-17 13:31:14 +00:00
d = self . onchange_contact_id ( cr , uid , ids , data [ ' contact_id ' ] , part )
2008-10-07 09:26:12 +00:00
data . update ( d [ ' value ' ] )
2010-07-15 13:41:44 +00:00
partner_data = res_obj . browse ( cr , uid , part )
2010-05-17 13:31:14 +00:00
return { ' value ' : data }
2008-08-24 14:45:43 +00:00
def onchange_partner_invoice_id ( self , cr , uid , ids , event_id , partner_invoice_id ) :
2010-07-12 13:30:56 +00:00
""" This function returns value of Product unit Price based on Invoiced 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 Registration IDs
@param event_id : Event ID
@param partner_invoice_id : Partner Invoice ID
"""
2008-08-24 14:45:43 +00:00
data = { }
context = { }
2010-07-12 13:30:56 +00:00
event_obj = self . pool . get ( ' event.event ' )
prod_obj = self . pool . get ( ' product.product ' )
res_obj = self . pool . get ( ' res.partner ' )
2008-08-24 14:45:43 +00:00
data [ ' unit_price ' ] = False
if not event_id :
2010-05-17 13:31:14 +00:00
return { ' value ' : data }
2010-07-12 13:30:56 +00:00
data_event = event_obj . browse ( cr , uid , event_id )
2008-08-24 14:45:43 +00:00
if data_event . product_id :
2010-07-15 13:41:44 +00:00
data [ ' event_product ' ] = data_event . product_id . name
pricelist_id = data_event . pricelist_id and data_event . pricelist_id . id or False
if partner_invoice_id :
partner = res_obj . browse ( cr , uid , partner_invoice_id , context = context )
pricelist_id = pricelist_id or partner . property_product_pricelist . id
data [ ' unit_price ' ] = prod_obj . _product_price ( cr , uid , [ data_event . product_id . id ] , False , False , { ' pricelist ' : pricelist_id } ) [ data_event . product_id . id ]
2010-05-17 13:31:14 +00:00
return { ' value ' : data }
2008-08-24 14:45:43 +00:00
event_registration ( )
2010-07-15 13:41:44 +00:00
class event_registration_badge ( osv . osv ) :
_name = ' event.registration.badge '
_description = __doc__
_columns = {
' registration_id ' : fields . many2one ( ' event.registration ' , ' Registration ' , required = True ) ,
" title " : fields . char ( ' Title ' , size = 128 ) ,
" name " : fields . char ( ' Name ' , size = 128 , required = True ) ,
" address_id " : fields . many2one ( ' res.partner.address ' , ' Address ' ) ,
}
event_registration_badge ( )
2008-08-24 14:45:43 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: