1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ##############################################################################
25 from osv import fields, osv
26 from tools.translate import _
27 import decimal_precision as dp
28 from crm import wizard
31 wizard.mail_compose_message.SUPPORTED_MODELS.append('event.registration')
33 class event_type(osv.osv):
36 _description = __doc__
38 'name': fields.char('Event type', size=64, required=True),
43 class event_event(osv.osv):
46 _description = __doc__
49 def copy(self, cr, uid, id, default=None, context=None):
50 """ Copy record of Given id
51 @param id: Id of Event record.
52 @param context: A standard dictionary for contextual values
58 'registration_ids': False,
60 return super(event_event, self).copy(cr, uid, id, default=default, context=context)
62 def onchange_product(self, cr, uid, ids, product_id=False):
63 """This function returns value of product's unit price based on product id.
64 @param self: The object pointer
65 @param cr: the current row, from the database cursor,
66 @param uid: the current user’s ID for security checks,
67 @param ids: List of Event IDs
68 @param product_id: Product's id
71 return {'value': {'unit_price': False}}
73 unit_price=self.pool.get('product.product').price_get(cr, uid, [product_id])[product_id]
74 return {'value': {'unit_price': unit_price}}
76 def button_draft(self, cr, uid, ids, context=None):
77 return self.write(cr, uid, ids, {'state': 'draft'}, context=context)
79 def button_cancel(self, cr, uid, ids, context=None):
80 return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
82 def button_done(self, cr, uid, ids, context=None):
83 if type(ids) in (int, long,):
85 return self.write(cr, uid, ids, {'state': 'done'}, context=context)
87 def do_confirm(self, cr, uid, ids, context=None):
88 """ Confirm Event and send confirmation email to all register peoples
90 register_pool = self.pool.get('event.registration')
91 for event in self.browse(cr, uid, ids, context=context):
92 if event.mail_auto_confirm:
93 #send reminder that will confirm the event for all the people that were already confirmed
94 reg_ids = register_pool.search(cr, uid, [
95 ('event_id', '=', event.id),
96 ('state', 'not in', ['draft', 'cancel'])], context=context)
97 register_pool.mail_user_confirm(cr, uid, reg_ids)
99 return self.write(cr, uid, ids, {'state': 'confirm'}, context=context)
101 def button_confirm(self, cr, uid, ids, context=None):
102 """This Function Confirm Event.
103 @param ids: List of Event IDs
104 @param context: A standard dictionary for contextual values
110 if type(ids) in (int, long,):
112 data_pool = self.pool.get('ir.model.data')
114 for event in self.browse(cr, uid, ids, context=context):
115 total_confirmed = event.register_current
116 if total_confirmed >= event.register_min or event.register_max == 0:
117 res = self.do_confirm(cr, uid, [event.id], context=context)
119 unconfirmed_ids.append(event.id)
121 view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_confirm')
122 view_id = view_id and view_id[1] or False
123 context['event_ids'] = unconfirmed_ids
125 'name': _('Confirm Event'),
128 'view_mode': 'tree,form',
129 'res_model': 'event.confirm',
130 'views': [(view_id, 'form')],
131 'type': 'ir.actions.act_window',
138 def _get_register(self, cr, uid, ids, fields, args, context=None):
139 """Get Confirm or uncofirm register value.
140 @param ids: List of Event registration type's id
141 @param fields: List of function fields(register_current and register_prospect).
142 @param context: A standard dictionary for contextual values
143 @return: Dictionary of function fields value.
145 register_pool = self.pool.get('event.registration')
147 for event in self.browse(cr, uid, ids, context=context):
150 res[event.id][field] = False
152 if 'register_current' in fields:
153 state += ['open', 'done']
154 if 'register_prospect' in fields:
155 state.append('draft')
157 reg_ids = register_pool.search(cr, uid, [
158 ('event_id', '=', event.id),
159 ('state', 'in', state)], context=context)
163 cr.execute('SELECT SUM(nb_register) FROM event_registration WHERE id IN %s', (tuple(reg_ids),))
164 number = cr.fetchone()
166 if 'register_current' in fields:
167 res[event.id]['register_current'] = number and number[0] or 0.0
168 if 'register_prospect' in fields:
169 res[event.id]['register_prospect'] = number and number[0] or 0.0
172 def write(self, cr, uid, ids, vals, context=None):
174 Writes values in one or several fields.
175 @param ids: List of Event registration type's IDs
176 @param vals: dictionary with values to update.
179 register_pool = self.pool.get('event.registration')
180 res = super(event_event, self).write(cr, uid, ids, vals, context=context)
181 if vals.get('date_begin', False) or vals.get('mail_auto_confirm', False) or vals.get('mail_confirm', False):
182 for event in self.browse(cr, uid, ids, context=context):
183 #change the deadlines of the registration linked to this event
185 if vals.get('date_begin', False):
186 register_values['date_deadline'] = vals['date_begin']
188 #change the description of the registration linked to this event
189 if vals.get('mail_auto_confirm', False):
190 if vals['mail_auto_confirm']:
191 if 'mail_confirm' not in vals:
192 vals['mail_confirm'] = event.mail_confirm
194 vals['mail_confirm'] = False
195 if 'mail_confirm' in vals:
196 register_values['description'] = vals['mail_confirm']
199 reg_ids = register_pool.search(cr, uid, [('event_id', '=', event.id)], context=context)
200 register_pool.write(cr, uid, reg_ids, register_values, context=context)
204 'name': fields.char('Summary', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
205 'user_id': fields.many2one('res.users', 'Responsible User', readonly=False, states={'done': [('readonly', True)]}),
206 'parent_id': fields.many2one('event.event', 'Parent Event', readonly=False, states={'done': [('readonly', True)]}),
207 'section_id': fields.many2one('crm.case.section', 'Sale Team', readonly=False, states={'done': [('readonly', True)]}),
208 'child_ids': fields.one2many('event.event', 'parent_id', 'Child Events', readonly=False, states={'done': [('readonly', True)]}),
209 '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 OpenERP"),
210 'type': fields.many2one('event.type', 'Type', help="Type of Event like Seminar, Exhibition, Conference, Training.", readonly=False, states={'done': [('readonly', True)]}),
211 'register_max': fields.integer('Maximum Registrations', help="Provide Maximum Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
212 'register_min': fields.integer('Minimum Registrations', help="Provide Minimum Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
213 'register_current': fields.function(_get_register, string='Confirmed Registrations', multi='register_current',
214 help="Total of Open and Done Registrations"),
215 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_prospect',
216 help="Total of Prospect Registrations"),
217 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
218 'date_begin': fields.datetime('Beginning date', required=True, help="Beginning Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
219 'date_end': fields.datetime('Closing date', required=True, help="Closing Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
220 'state': fields.selection([
222 ('confirm', 'Confirmed'),
224 ('cancel', 'Cancelled')],
225 'State', readonly=True, required=True,
226 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\'.'),
227 'mail_auto_registr': fields.boolean('Mail Auto Register', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want to use automatic emailing for new registration.'),
228 'mail_auto_confirm': fields.boolean('Mail Auto Confirm', readonly=False, states={'done': [('readonly', True)]}, help='Check this box if you want to use automatic confirmation emailing or reminder.'),
229 'mail_registr': fields.text('Registration Email', readonly=False, states={'done': [('readonly', True)]}, help='This email will be sent when someone subscribes to the event.'),
230 'mail_confirm': fields.text('Confirmation Email', readonly=False, states={'done': [('readonly', True)]}, help="This email will be sent when the event gets confirmed or when someone subscribes to a confirmed event. This is also the email sent to remind someone about the event."),
231 'product_id': fields.many2one('product.product', 'Product', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="The invoices of this event registration will be created with this Product. Thus it allows you to set the default label and the accounting info you want by default on these invoices."),
232 'note': fields.text('Notes', help="Description or Summary of Event", readonly=False, states={'done': [('readonly', True)]}),
233 'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', readonly=True, states={'draft': [('readonly', False)]}, help="Pricelist version for current event."),
234 'unit_price': fields.related('product_id', 'list_price', type='float', string='Registration Cost', readonly=True, states={'draft':[('readonly',False)]}, help="This will be the default price used as registration cost when invoicing this event. Note that you can specify a specific amount for each registration.", digits_compute=dp.get_precision('Sale Price')),
235 'main_speaker_id': fields.many2one('res.partner','Main Speaker', readonly=False, states={'done': [('readonly', True)]}, help="Speaker who will be giving speech at the event."),
236 'speaker_ids': fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}),
237 'address_id': fields.many2one('res.partner.address','Location Address', readonly=False, states={'done': [('readonly', True)]}),
238 'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}),
239 'country_id': fields.related('address_id', 'country_id',
240 type='many2one', relation='res.country', string='Country', readonly=False, states={'done': [('readonly', True)]}),
241 'language': fields.char('Language',size=64, readonly=False, states={'done': [('readonly', True)]}),
242 'note': fields.text('Description', readonly=False, states={'done': [('readonly', True)]}),
243 'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
248 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c),
249 'user_id': lambda obj, cr, uid, context: uid,
252 def _check_recursion(self, cr, uid, ids, context=None):
253 return super(event_event, self)._check_recursion(cr, uid, ids, context=context)
255 def _check_closing_date(self, cr, uid, ids, context=None):
256 for event in self.browse(cr, uid, ids, context=context):
257 if event.date_end < event.date_begin:
262 (_check_recursion, 'Error ! You cannot create recursive event.', ['parent_id']),
263 (_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']),
266 def do_team_change(self, cr, uid, ids, team_id, context=None):
268 On Change Callback: when team change, this is call.
269 on this function, take value of reply_to from selected team.
273 team_pool = self.pool.get('crm.case.section')
275 team = team_pool.browse(cr, uid, team_id, context=context)
277 res = {'value': {'reply_to': team.reply_to}}
282 class event_registration(osv.osv):
283 """Event Registration"""
284 _name= 'event.registration'
285 _description = __doc__
286 _inherit = 'mail.thread'
288 def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
289 cur_obj = self.pool.get('res.currency')
291 for line in self.browse(cr, uid, ids, context=context):
292 price = line.unit_price * line.nb_register
293 pricelist = line.event_id.pricelist_id or line.partner_invoice_id.property_product_pricelist
294 cur = pricelist and pricelist.currency_id or False
295 res[line.id] = cur and cur_obj.round(cr, uid, cur, price) or price
299 'id': fields.integer('ID'),
300 'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),
301 'email_cc': fields.text('CC', size=252, readonly=False, states={'done': [('readonly', True)]}, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
302 'nb_register': fields.integer('Quantity', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Number of Registrations or Tickets"),
303 'event_id': fields.many2one('event.event', 'Event', required=True, readonly=True, states={'draft': [('readonly', False)]}),
304 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}),
305 "partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced', readonly=True, states={'draft': [('readonly', False)]}),
306 "contact_id": fields.many2one('res.partner.address', 'Partner Contact', readonly=False, states={'done': [('readonly', True)]}), #TODO: filter only the contacts that have a function into the selected partner_id
307 "unit_price": fields.float('Unit Price', required=True, digits_compute=dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),
308 'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute=dp.get_precision('Sale Price'), store=True),
309 "badge_ids": fields.one2many('event.registration.badge', 'registration_id', 'Badges', readonly=False, states={'done': [('readonly', True)]}),
310 "event_product": fields.char("Invoice Name", size=128, readonly=True, states={'draft': [('readonly', False)]}),
311 "tobe_invoiced": fields.boolean("To be Invoiced", readonly=True, states={'draft': [('readonly', False)]}),
312 "invoice_id": fields.many2one("account.invoice", "Invoice", readonly=True),
313 'date_closed': fields.datetime('Closed', readonly=True),
314 'ref': fields.reference('Reference', selection=crm._links_get, size=128),
315 'ref2': fields.reference('Reference 2', selection=crm._links_get, size=128),
316 'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."),
317 'create_date': fields.datetime('Creation Date', readonly=True),
318 'write_date': fields.datetime('Write Date', readonly=True),
319 'description': fields.text('Description', states={'done': [('readonly', True)]}),
320 'message_ids': fields.one2many('mail.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
321 'log_ids': fields.one2many('mail.message', 'res_id', 'Logs', domain=[('email_from', '=', False),('model','=',_name)]),
322 'date_deadline': fields.related('event_id','date_end', type='datetime', string="End Date", readonly=True),
323 'date': fields.related('event_id', 'date_begin', type='datetime', string="Start Date", readonly=True),
324 'user_id': fields.many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}),
325 'active': fields.boolean('Active'),
326 'section_id': fields.related('event_id', 'section_id', type='many2one', relation='crm.case.section', string='Sale Team', store=True, readonly=True),
327 'company_id': fields.related('event_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True, states={'draft':[('readonly',False)]}),
328 'state': fields.selection([('open', 'Confirmed'),
329 ('draft', 'Unconfirmed'),
330 ('cancel', 'Cancelled'),
331 ('done', 'Done')], 'State', \
332 size=16, readonly=True)
336 'tobe_invoiced': True,
339 'user_id': lambda self, cr, uid, ctx: uid,
342 def _make_invoice(self, cr, uid, reg, lines, context=None):
343 """ Create Invoice from Invoice lines
344 @param reg: Model of Event Registration
345 @param lines: Ids of Invoice lines
349 inv_pool = self.pool.get('account.invoice')
350 val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
351 val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
352 val_invoice['value'].update({
353 'origin': reg.event_product,
355 'invoice_line': [(6, 0, lines)],
357 'date_invoice': context.get('date_inv', False)
359 inv_id = inv_pool.create(cr, uid, val_invoice['value'], context=context)
360 inv_pool.button_compute(cr, uid, [inv_id])
361 self.message_append(cr, uid, [reg], _('Invoiced'))
364 def copy(self, cr, uid, id, default=None, context=None):
365 """ Copy record of Given id
366 @param id: Id of Registration record.
367 @param context: A standard dictionary for contextual values
374 return super(event_registration, self).copy(cr, uid, id, default=default, context=context)
376 def action_invoice_create(self, cr, uid, ids, grouped=False, date_inv = False, context=None):
377 """ Action of Create Invoice """
382 inv_lines_pool = self.pool.get('account.invoice.line')
383 inv_pool = self.pool.get('account.invoice')
384 product_pool = self.pool.get('product.product')
385 contact_pool = self.pool.get('res.partner.address')
388 # If date was specified, use it as date invoiced, usefull when invoices are generated this month and put the
389 # last day of the last month as invoice date
391 context['date_inv'] = date_inv
393 for reg in self.browse(cr, uid, ids, context=context):
394 val_invoice = inv_pool.onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False)
395 val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id})
396 if not partner_address_id:
397 raise osv.except_osv(_('Error !'),
398 _("Registered partner doesn't have an address to make the invoice."))
400 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)
401 product = product_pool.browse(cr, uid, reg.event_id.product_id.id, context=context)
402 for tax in product.taxes_id:
403 tax_ids.append(tax.id)
404 vals = value['value']
405 c_name = reg.contact_id and ('-' + contact_pool.name_get(cr, uid, [reg.contact_id.id])[0][1]) or ''
407 'name': reg.event_product + '-' + c_name,
408 'price_unit': reg.unit_price,
409 'quantity': reg.nb_register,
410 'product_id':reg.event_id.product_id.id,
411 'invoice_line_tax_id': [(6, 0, tax_ids)],
413 inv_line_ids = self._create_invoice_lines(cr, uid, [reg.id], vals)
414 invoices.setdefault(reg.partner_id.id, []).append((reg, inv_line_ids))
415 for val in invoices.values():
418 res = self._make_invoice(cr, uid, val[0][0], [v for k, v in val], context=context)
421 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
425 res = self._make_invoice(cr, uid, k, [v], context=context)
426 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
427 if res: new_invoice_ids.append(res)
428 return new_invoice_ids
430 def do_open(self, cr, uid, ids, context=None):
431 """ Open Registration
433 res = self.write(cr, uid, ids, {'state': 'open'}, context=context)
434 self.mail_user(cr, uid, ids)
435 self.message_append(cr, uid, ids, _('Open'))
438 def do_close(self, cr, uid, ids, context=None):
439 """ Close Registration
443 invoice_id = context.get('invoice_id', False)
444 values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
447 values['invoice_id'] = invoice_id
448 res = self.write(cr, uid, ids, values)
449 self.message_append(cr, uid, ids, msg)
452 # event uses add_note wizard from crm, which expects case_* methods
453 def case_open(self, cr, uid, ids, context=None):
454 self.do_open(cr, uid, ids, context)
456 # event uses add_note wizard from crm, which expects case_* methods
457 def case_close(self, cr, uid, ids, context=None):
458 self.do_close(cr, uid, ids, context)
460 # event uses add_note wizard from crm, which expects case_* methods
461 def case_cancel(self, cr, uid, ids, context=None):
462 """ Cancel Registration
464 self.message_append(cr, uid, ids, _('Cancel'))
465 return self.write(cr, uid, ids, {'state': 'cancel'})
467 # event uses add_note wizard from crm, which expects case_* methods
468 def case_reset(self, cr, uid, ids, context=None):
471 # event uses add_note wizard from crm, which expects case_* methods
472 def case_pending(self, cr, uid, ids, context=None):
475 def check_confirm(self, cr, uid, ids, context=None):
476 """This Function Open Event Registration and send email to user.
477 @param ids: List of Event registration's IDs
478 @param context: A standard dictionary for contextual values
481 if type(ids) in (int, long,):
483 data_pool = self.pool.get('ir.model.data')
487 for registration in self.browse(cr, uid, ids, context=context):
488 total_confirmed = registration.event_id.register_current + registration.nb_register
489 if total_confirmed <= registration.event_id.register_max or registration.event_id.register_max == 0:
490 self.do_open(cr, uid, [registration.id], context=context)
492 unconfirmed_ids.append(registration.id)
494 view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_confirm_registration')
495 view_id = view_id and view_id[1] or False
496 context['registration_ids'] = unconfirmed_ids
498 'name': _('Confirm Registration'),
501 'view_mode': 'tree,form',
502 'res_model': 'event.confirm.registration',
503 'views': [(view_id, 'form')],
504 'type': 'ir.actions.act_window',
511 def button_reg_close(self, cr, uid, ids, context=None):
512 """This Function Close Event Registration.
514 data_pool = self.pool.get('ir.model.data')
516 for registration in self.browse(cr, uid, ids, context=context):
517 if registration.tobe_invoiced and not registration.invoice_id:
518 unclosed_ids.append(registration.id)
520 self.do_close(cr, uid, [registration.id], context=context)
522 view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_make_invoice')
523 view_id = view_id and view_id[1] or False
524 context['active_ids'] = unclosed_ids
526 'name': _('Close Registration'),
529 'view_mode': 'tree,form',
530 'res_model': 'event.make.invoice',
531 'views': [(view_id, 'form')],
532 'type': 'ir.actions.act_window',
539 def button_reg_cancel(self, cr, uid, ids, context=None, *args):
540 return self.case_cancel(cr, uid, ids)
542 def mail_user(self, cr, uid, ids, confirm=False, context=None):
546 mail_message = self.pool.get('mail.message')
547 for registration in self.browse(cr, uid, ids, context=context):
548 src = registration.event_id.reply_to or False
551 if registration.email_from:
552 email_to = [registration.email_from]
553 if registration.email_cc:
554 email_cc += [registration.email_cc]
555 if not (email_to or email_cc):
560 subject = _('Auto Confirmation: [%s] %s') %(registration.id, registration.name)
561 body = registration.event_id.mail_confirm
562 elif registration.event_id.mail_auto_confirm or registration.event_id.mail_auto_registr:
563 if registration.event_id.state in ['draft', 'fixed', 'open', 'confirm', 'running'] and registration.event_id.mail_auto_registr:
564 subject = _('Auto Registration: [%s] %s') %(registration.id, registration.name)
565 body = registration.event_id.mail_registr
566 if (registration.event_id.state in ['confirm', 'running']) and registration.event_id.mail_auto_confirm:
567 subject = _('Auto Confirmation: [%s] %s') %(registration.id, registration.name)
568 body = registration.event_id.mail_confirm
570 mail_message.schedule_with_attach(cr, uid, src, email_to, subject, body, model='event.registration', email_cc=email_cc, res_id=registration.id)
574 def mail_user_confirm(self, cr, uid, ids, context=None):
578 return self.mail_user(cr, uid, ids, confirm=True, context=context)
580 def _create_invoice_lines(self, cr, uid, ids, vals):
581 """ Create account Invoice line for Registration Id.
583 return self.pool.get('account.invoice.line').create(cr, uid, vals)
585 def onchange_contact_id(self, cr, uid, ids, contact, partner):
587 """This function returns value of Badge Name, Badge Title based on Partner contact.
588 @param self: The object pointer
589 @param cr: the current row, from the database cursor,
590 @param uid: the current user’s ID for security checks,
591 @param ids: List of Registration IDs
592 @param contact: Patner Contact IDS
593 @param partner: Partner IDS
598 addr_obj = self.pool.get('res.partner.address')
599 data['email_from'] = addr_obj.browse(cr, uid, contact).email
600 return {'value': data}
602 def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id):
603 """This function returns value of Product Name, Unit Price based on Event.
604 @param self: The object pointer
605 @param cr: the current row, from the database cursor,
606 @param uid: the current user’s ID for security checks,
607 @param ids: List of Registration IDs
608 @param event_id: Event ID
609 @param partner_invoice_id: Partner Invoice ID
613 return {'value': {'unit_price': False, 'event_product': False}}
615 event_obj = self.pool.get('event.event')
616 prod_obj = self.pool.get('product.product')
617 res_obj = self.pool.get('res.partner')
619 data_event = event_obj.browse(cr, uid, event_id)
620 res = {'value': {'unit_price': False,
621 'event_product': False,
623 'date': data_event.date_begin,
624 'date_deadline': data_event.date_end,
625 'description': data_event.note,
626 'name': data_event.name,
627 'section_id': data_event.section_id and data_event.section_id.id or False,
629 if data_event.user_id.id:
630 res['value'].update({'user_id': data_event.user_id.id})
631 if data_event.product_id:
632 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
633 if partner_invoice_id:
634 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
635 pricelist_id = pricelist_id or partner.property_product_pricelist.id
636 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
638 unit_price = data_event.unit_price
639 res['value'].update({'unit_price': unit_price, 'event_product': data_event.product_id.name})
642 def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False):
643 """This function returns value of Patner Invoice id, Unit Price, badget title based on partner and Event.
644 @param self: The object pointer
645 @param cr: the current row, from the database cursor,
646 @param uid: the current user’s ID for security checks,
647 @param ids: List of Registration IDs
648 @param event_id: Event ID
649 @param partner_invoice_id: Partner Invoice ID
651 res_obj = self.pool.get('res.partner')
654 data['contact_id'], data['partner_invoice_id'], data['email_from'] = (False, False, False)
656 return {'value': data}
657 data['partner_invoice_id'] = part
658 # this calls onchange_partner_invoice_id
659 d = self.onchange_partner_invoice_id(cr, uid, ids, event_id, part)
660 # this updates the dictionary
661 data.update(d['value'])
662 addr = res_obj.address_get(cr, uid, [part]).get('default', False)
664 d = self.onchange_contact_id(cr, uid, ids, addr, part)
665 data.update(d['value'])
666 return {'value': data}
668 def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id):
669 """This function returns value of Product unit Price based on Invoiced partner.
670 @param self: The object pointer
671 @param cr: the current row, from the database cursor,
672 @param uid: the current user’s ID for security checks,
673 @param ids: List of Registration IDs
674 @param event_id: Event ID
675 @param partner_invoice_id: Partner Invoice ID
679 event_obj = self.pool.get('event.event')
680 prod_obj = self.pool.get('product.product')
681 res_obj = self.pool.get('res.partner')
683 data['unit_price']=False
685 return {'value': data}
686 data_event = event_obj.browse(cr, uid, event_id, context=context)
687 if data_event.product_id:
688 data['event_product'] = data_event.product_id.name
689 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
690 if partner_invoice_id:
691 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
692 pricelist_id = pricelist_id or partner.property_product_pricelist.id
693 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
695 unit_price = data_event.unit_price
696 data['unit_price'] = unit_price
697 return {'value': data}
701 class event_registration_badge(osv.osv):
702 _name = 'event.registration.badge'
703 _description = __doc__
705 "registration_id": fields.many2one('event.registration', 'Registration', required=True),
706 "title": fields.char('Title', size=128),
707 "name": fields.char('Name', size=128, required=True),
708 "address_id": fields.many2one('res.partner.address', 'Address'),
711 event_registration_badge()
713 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: