Merge lp:~openerp-dev/openobject-addons/trunk-event-mva into lp:openobject-addons

Proposed by Antony Lesuisse (OpenERP)
Status: Work in progress
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-event-mva
Merge into: lp:openobject-addons
Diff against target: 1804 lines (+300/-907) (has conflicts)
15 files modified
event/__openerp__.py (+7/-7)
event/board_association_view.xml (+3/-3)
event/email_template.xml (+27/-0)
event/event.py (+67/-449)
event/event_demo.xml (+10/-6)
event/event_view.xml (+110/-161)
event/report/report_event_registration.py (+38/-57)
event/report/report_event_registration_view.xml (+27/-20)
event/security/ir.model.access.csv (+0/-3)
event/test/process/partner_register2invoice.yml (+8/-38)
event/wizard/__init__.py (+1/-1)
event/wizard/event_confirm_registration.py (+2/-26)
event/wizard/event_make_invoice.py (+0/-95)
event/wizard/event_make_invoice_view.xml (+0/-40)
event/wizard/partner_event_registration.py (+0/-1)
Text conflict in event/__openerp__.py
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-event-mva
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+88857@code.launchpad.net

Description of the change

event rework

To post a comment you must log in.
6288. By Michael (OpenERP)

[CLEAN] cleaning the code

6289. By Michael (OpenERP)

[MERGE] merged with main trunk

6290. By Michael (OpenERP)

[merge]merge with the trunk

6291. By Michael (OpenERP)

[merge]merge with the trunk

6292. By Michael (OpenERP)

[CLEAN] cleaning the code

6293. By Michael (OpenERP)

[CLEAN] cleaning the code

6294. By Michael (OpenERP)

[REF] remove product id from the report view

6295. By Michael (OpenERP)

[ADD] add email template

6296. By Quentin (OpenERP) <email address hidden>

[IMP] event: some usability changes

6297. By Quentin (OpenERP) <email address hidden>

[REF] event: code refactoring

6298. By Michael (OpenERP)

[REF] remove the make invoice action

6299. By Michael (OpenERP)

[IMP] change the sql request and change demo data

6300. By Michael (OpenERP)

[REF] clean the sql in the report

6301. By Michael (OpenERP)

[REF] remove the certificate

Unmerged revisions

6301. By Michael (OpenERP)

[REF] remove the certificate

6300. By Michael (OpenERP)

[REF] clean the sql in the report

6299. By Michael (OpenERP)

[IMP] change the sql request and change demo data

6298. By Michael (OpenERP)

[REF] remove the make invoice action

6297. By Quentin (OpenERP) <email address hidden>

[REF] event: code refactoring

6296. By Quentin (OpenERP) <email address hidden>

[IMP] event: some usability changes

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'event/__openerp__.py'
--- event/__openerp__.py 2012-01-31 13:36:57 +0000
+++ event/__openerp__.py 2012-02-02 16:05:26 +0000
@@ -39,7 +39,7 @@
39 Association / Configuration / Types of Events39 Association / Configuration / Types of Events
40""",40""",
41 'author': 'OpenERP SA',41 'author': 'OpenERP SA',
42 'depends': ['crm', 'account', 'marketing', 'mail'],42 'depends': ['crm', 'account', 'marketing', 'email_template'],
43 'init_xml': [],43 'init_xml': [],
44 'update_xml': [44 'update_xml': [
45 'security/ir.model.access.csv',45 'security/ir.model.access.csv',
@@ -47,20 +47,20 @@
47 'wizard/event_confirm_view.xml',47 'wizard/event_confirm_view.xml',
48 'event_view.xml',48 'event_view.xml',
49 'report/report_event_registration_view.xml',49 'report/report_event_registration_view.xml',
50 'wizard/event_make_invoice_view.xml',
51 'wizard/partner_event_registration_view.xml',50 'wizard/partner_event_registration_view.xml',
52 'board_association_view.xml',51 'board_association_view.xml',
53 'res_partner_view.xml',52 'res_partner_view.xml',
53 'email_template.xml',
54 ],54 ],
55 'demo_xml': ['event_demo.xml'],55 'demo_xml': ['event_demo.xml'],
56 'test': ['test/process/event_confirm2done.yml',56 'test': [],
57 'test/process/event_draft2cancel.yml',
58 'test/process/partner_register2invoice.yml',
59 'test/ui/duplicate_event.yml',
60 'test/ui/demo_data.yml'],
61 'installable': True,57 'installable': True,
58<<<<<<< TREE
62 'auto_install': False,59 'auto_install': False,
63 'certificate': '0083059161581',60 'certificate': '0083059161581',
61=======
62 'active': False,
63>>>>>>> MERGE-SOURCE
64 'images': ['images/1_event_type_list.jpeg','images/2_events.jpeg','images/3_registrations.jpeg'],64 'images': ['images/1_event_type_list.jpeg','images/2_events.jpeg','images/3_registrations.jpeg'],
65}65}
66# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:66# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
6767
=== modified file 'event/board_association_view.xml'
--- event/board_association_view.xml 2011-12-19 16:54:40 +0000
+++ event/board_association_view.xml 2012-02-02 16:05:26 +0000
@@ -21,7 +21,7 @@
21 <field name="name">Events Filling Status</field>21 <field name="name">Events Filling Status</field>
22 <field name="res_model">report.event.registration</field>22 <field name="res_model">report.event.registration</field>
23 <field name="view_type">form</field>23 <field name="view_type">form</field>
24 <field name="domain">[('state','not in',('cancel','done'))]</field>24 <field name="domain">[('event_state','not in',('cancel','done'))]</field>
25 <field name="view_mode">graph,tree</field>25 <field name="view_mode">graph,tree</field>
26 <field name="view_id" ref="view_report_event_reg_graph"/>26 <field name="view_id" ref="view_report_event_reg_graph"/>
27 </record>27 </record>
@@ -45,9 +45,9 @@
45 <action string="Next Events"45 <action string="Next Events"
46 name="%(act_event_view)d"46 name="%(act_event_view)d"
47 domain="[('state','not in',('cancel','done'))]"/>47 domain="[('state','not in',('cancel','done'))]"/>
48 <action string="Unconfirmed Registrations"48 <!--<action string="Unconfirmed Registrations"
49 name="%(event.act_event_list_register_event)d"49 name="%(event.act_event_list_register_event)d"
50 domain="[('state','=','draft')]"/>50 domain="[('state','=','draft')]"/>-->
51 </column>51 </column>
52 <column>52 <column>
53 <action string="Events Filling Status"53 <action string="Events Filling Status"
5454
=== added file 'event/email_template.xml'
--- event/email_template.xml 1970-01-01 00:00:00 +0000
+++ event/email_template.xml 2012-02-02 16:05:26 +0000
@@ -0,0 +1,27 @@
1<?xml version="1.0"?>
2<openerp>
3 <data>
4
5 <record id="confirmation_event" model="email.template">
6 <field name="name">confirmation the event</field>
7<!-- <field name="model_id" ref="event.event_registration"/>-->
8 <field name="email_from" >${object.user_id.user_email or object.company_id.email or 'noreply@localhost'}</field>
9 <field name="email_to" >${object.email_from}</field>
10 <field name="subject">Ticket for ${object.event_id.name}</field>
11 <field name="body_text">thank you for your registration</field>
12 </record>
13
14 </data>
15 <data>
16
17 <record id="confirmation_registration" model="email.template">
18 <field name="name">confirmation the registration</field>
19<!-- <field name="model_id" ref="event.event_registration"/>-->
20 <field name="email_from" >${object.user_id.user_email or object.company_id.email or 'noreply@localhost'}</field>
21 <field name="email_to" >${object.email_from}</field>
22 <field name="subject">Ticket for ${object.event_id.name}</field>
23 <field name="body_text">thank you for your registration</field>
24 </record>
25
26 </data>
27</openerp>
028
=== modified file 'event/event.py'
--- event/event.py 2011-12-22 17:02:05 +0000
+++ event/event.py 2012-02-02 16:05:26 +0000
@@ -47,9 +47,7 @@
47 _order = 'date_begin'47 _order = 'date_begin'
4848
49 def copy(self, cr, uid, id, default=None, context=None):49 def copy(self, cr, uid, id, default=None, context=None):
50 """ Copy record of Given id50 """ Reset the state and the registrations while copying an event
51 @param id: Id of Event record.
52 @param context: A standard dictionary for contextual values
53 """51 """
54 if not default:52 if not default:
55 default = {}53 default = {}
@@ -59,20 +57,6 @@
59 })57 })
60 return super(event_event, self).copy(cr, uid, id, default=default, context=context)58 return super(event_event, self).copy(cr, uid, id, default=default, context=context)
6159
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
69 """
70 if not product_id:
71 return {'value': {'unit_price': False}}
72 else:
73 unit_price=self.pool.get('product.product').price_get(cr, uid, [product_id])[product_id]
74 return {'value': {'unit_price': unit_price}}
75
76 def button_draft(self, cr, uid, ids, context=None):60 def button_draft(self, cr, uid, ids, context=None):
77 return self.write(cr, uid, ids, {'state': 'draft'}, context=context)61 return self.write(cr, uid, ids, {'state': 'draft'}, context=context)
7862
@@ -80,61 +64,27 @@
80 return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)64 return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
8165
82 def button_done(self, cr, uid, ids, context=None):66 def button_done(self, cr, uid, ids, context=None):
83 if type(ids) in (int, long,):
84 ids = [ids]
85 return self.write(cr, uid, ids, {'state': 'done'}, context=context)67 return self.write(cr, uid, ids, {'state': 'done'}, context=context)
8668
87 def do_confirm(self, cr, uid, ids, context=None):69 def button_confirm(self, cr, uid, ids, context=None):
88 """ Confirm Event and send confirmation email to all register peoples70 """ Confirm Event and send confirmation email to all register peoples
89 """71 """
72 if isinstance(ids, (int, long)):
73 ids = [ids]
74 #renforcing method : create a list of ids
90 register_pool = self.pool.get('event.registration')75 register_pool = self.pool.get('event.registration')
91 for event in self.browse(cr, uid, ids, context=context):76 for event in self.browse(cr, uid, ids, context=context):
92 if event.mail_auto_confirm:77 total_confirmed = event.register_current
78 if total_confirmed < event.register_min or total_confirmed > event.register_max:
79 raise osv.except_osv(_('Error!'),_("The total of confirmed registration for the event '%s' does not meet the expected minimum/maximum. You should maybe reconsider those limits before going further") % (even.name))
80 if event.email_confirmation_id:
93 #send reminder that will confirm the event for all the people that were already confirmed81 #send reminder that will confirm the event for all the people that were already confirmed
94 reg_ids = register_pool.search(cr, uid, [82 reg_ids = register_pool.search(cr, uid, [
95 ('event_id', '=', event.id),83 ('event_id', '=', event.id),
96 ('state', 'not in', ['draft', 'cancel'])], context=context)84 ('state', 'not in', ['draft', 'cancel'])], context=context)
97 register_pool.mail_user_confirm(cr, uid, reg_ids)85 register_pool.mail_user_confirm(cr, uid, reg_ids)
98
99 return self.write(cr, uid, ids, {'state': 'confirm'}, context=context)86 return self.write(cr, uid, ids, {'state': 'confirm'}, context=context)
10087
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
105 @return: True
106 """
107 if context is None:
108 context = {}
109 res = False
110 if type(ids) in (int, long,):
111 ids = [ids]
112 data_pool = self.pool.get('ir.model.data')
113 unconfirmed_ids = []
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)
118 else:
119 unconfirmed_ids.append(event.id)
120 if unconfirmed_ids:
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
124 return {
125 'name': _('Confirm Event'),
126 'context': context,
127 'view_type': 'form',
128 'view_mode': 'tree,form',
129 'res_model': 'event.confirm',
130 'views': [(view_id, 'form')],
131 'type': 'ir.actions.act_window',
132 'target': 'new',
133 'context': context,
134 'nodestroy': True
135 }
136 return res
137
138 def _get_register(self, cr, uid, ids, fields, args, context=None):88 def _get_register(self, cr, uid, ids, fields, args, context=None):
139 """Get Confirm or uncofirm register value.89 """Get Confirm or uncofirm register value.
140 @param ids: List of Event registration type's id90 @param ids: List of Event registration type's id
@@ -169,44 +119,10 @@
169 res[event.id]['register_prospect'] = number and number[0] or 0.0119 res[event.id]['register_prospect'] = number and number[0] or 0.0
170 return res120 return res
171121
172 def write(self, cr, uid, ids, vals, context=None):
173 """
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.
177 @return: True
178 """
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
184 register_values = {}
185 if vals.get('date_begin', False):
186 register_values['date_deadline'] = vals['date_begin']
187
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
193 else:
194 vals['mail_confirm'] = False
195 if 'mail_confirm' in vals:
196 register_values['description'] = vals['mail_confirm']
197
198 if register_values:
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)
201 return res
202
203 _columns = {122 _columns = {
204 'name': fields.char('Summary', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),123 'name': fields.char('Name', 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)]}),124 '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)]}),125 '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)]}),126 '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)]}),127 '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)]}),128 'register_min': fields.integer('Minimum Registrations', help="Provide Minimum Number of Registrations", readonly=True, states={'draft': [('readonly', False)]}),
@@ -215,8 +131,8 @@
215 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_prospect',131 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_prospect',
216 help="Total of Prospect Registrations"),132 help="Total of Prospect Registrations"),
217 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),133 '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)]}),134 'date_begin': fields.datetime('Starting 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)]}),135 'date_end': fields.datetime('Closing Date', required=True, help="Closing Date of Event", readonly=True, states={'draft': [('readonly', False)]}),
220 'state': fields.selection([136 'state': fields.selection([
221 ('draft', 'Draft'),137 ('draft', 'Draft'),
222 ('confirm', 'Confirmed'),138 ('confirm', 'Confirmed'),
@@ -224,23 +140,18 @@
224 ('cancel', 'Cancelled')],140 ('cancel', 'Cancelled')],
225 'State', readonly=True, required=True,141 '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\'.'),142 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.'),143 'email_registration_id' : fields.many2one('email.template','Email 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.'),144 'email_confirmation_id' : fields.many2one('email.template','Email confirmation'),
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.'),145 '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"),
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."),146 '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)]}),147 '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)]}),148 '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)]}),149 'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}),
239 'country_id': fields.related('address_id', 'country_id',150 'country_id': fields.related('address_id', 'country_id',
240 type='many2one', relation='res.country', string='Country', readonly=False, states={'done': [('readonly', True)]}),151 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)]}),152 '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)]}),153 'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
154 'product_id': fields.many2one('product.product', 'Product', readonly=True, states={'draft': [('readonly', False)]}, help="The product is optional and only serves informative purposes. It will be used for analysis mainly."),
244 }155 }
245156
246 _defaults = {157 _defaults = {
@@ -249,9 +160,6 @@
249 'user_id': lambda obj, cr, uid, context: uid,160 'user_id': lambda obj, cr, uid, context: uid,
250 }161 }
251162
252 def _check_recursion(self, cr, uid, ids, context=None):
253 return super(event_event, self)._check_recursion(cr, uid, ids, context=context)
254
255 def _check_closing_date(self, cr, uid, ids, context=None):163 def _check_closing_date(self, cr, uid, ids, context=None):
256 for event in self.browse(cr, uid, ids, context=context):164 for event in self.browse(cr, uid, ids, context=context):
257 if event.date_end < event.date_begin:165 if event.date_end < event.date_begin:
@@ -259,10 +167,9 @@
259 return True167 return True
260168
261 _constraints = [169 _constraints = [
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']),170 (_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']),
264 ]171 ]
265172 #TODO: display sale_team in event form view and use this onchange
266 def do_team_change(self, cr, uid, ids, team_id, context=None):173 def do_team_change(self, cr, uid, ids, team_id, context=None):
267 """174 """
268 On Change Callback: when team change, this is call.175 On Change Callback: when team change, this is call.
@@ -283,151 +190,36 @@
283 """Event Registration"""190 """Event Registration"""
284 _name= 'event.registration'191 _name= 'event.registration'
285 _description = __doc__192 _description = __doc__
286 _inherit = 'mail.thread'193 _inherit = ['mail.thread','res.partner.address']
287
288 def _amount_line(self, cr, uid, ids, field_name, arg, context=None):
289 cur_obj = self.pool.get('res.currency')
290 res = {}
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
296 return res
297194
298 _columns = {195 _columns = {
299 'id': fields.integer('ID'),196 'id': fields.integer('ID'),
300 'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),197 'origin': fields.char('Origin', 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"),198 '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)]}),199 '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)]}),200 '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)]}),201 'partner_id_address': fields.many2one('res.partner.address', 'Partner', states={'done': [('readonly', True)]}),
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_id202 "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)]}),203 'date_closed': fields.datetime('Closure Date', readonly=True),
308 'price_subtotal': fields.function(_amount_line, string='Subtotal', digits_compute=dp.get_precision('Sale Price'), store=True),204 'email_from': fields.related('event_id','reply_to',string='Reply-to Email', type='char', size=128, readonly=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)]),205 '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),206 'date_deadline': fields.related('event_id','date_end', type='datetime', string="Event End Date", readonly=True),
323 'date': fields.related('event_id', 'date_begin', type='datetime', string="Start Date", readonly=True),207 'date': fields.related('event_id', 'date_begin', type='datetime', string="Event Start Date", readonly=True),
324 'user_id': fields.many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}),208 '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),209 '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)]}),210 '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'),211 'state': fields.selection([('draft', 'Unconfirmed'),
329 ('draft', 'Unconfirmed'),212 ('open', 'Confirmed'),
330 ('cancel', 'Cancelled'),213 ('cancel', 'Cancelled'),
331 ('done', 'Done')], 'State', \214 ('done', 'Done')], 'State', \
332 size=16, readonly=True)215 size=16, readonly=True)
333 }216 }
334 _defaults = {217 _defaults = {
335 'nb_register': 1,218 'nb_register': 1,
336 'tobe_invoiced': True,
337 'state': 'draft',219 'state': 'draft',
338 'active': 1,
339 'user_id': lambda self, cr, uid, ctx: uid,220 'user_id': lambda self, cr, uid, ctx: uid,
340 }221 }
341222
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
346 """
347 if context is None:
348 context = {}
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,
354 'reference': False,
355 'invoice_line': [(6, 0, lines)],
356 'comment': "",
357 'date_invoice': context.get('date_inv', False)
358 })
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'))
362 return inv_id
363
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
368 """
369 if not default:
370 default = {}
371 default.update({
372 'invoice_id': False,
373 })
374 return super(event_registration, self).copy(cr, uid, id, default=default, context=context)
375
376 def action_invoice_create(self, cr, uid, ids, grouped=False, date_inv = False, context=None):
377 """ Action of Create Invoice """
378 res = False
379 invoices = {}
380 tax_ids=[]
381 new_invoice_ids = []
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')
386 if context is None:
387 context = {}
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
390 if date_inv:
391 context['date_inv'] = date_inv
392
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 partner_address_id = val_invoice['value']['address_invoice_id']
397 if not partner_address_id:
398 raise osv.except_osv(_('Error !'),
399 _("Registered partner doesn't have an address to make the invoice."))
400
401 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)
402 product = product_pool.browse(cr, uid, reg.event_id.product_id.id, context=context)
403 for tax in product.taxes_id:
404 tax_ids.append(tax.id)
405 vals = value['value']
406 c_name = reg.contact_id and ('-' + contact_pool.name_get(cr, uid, [reg.contact_id.id])[0][1]) or ''
407 vals.update({
408 'name': reg.event_product + '-' + c_name,
409 'price_unit': reg.unit_price,
410 'quantity': reg.nb_register,
411 'product_id':reg.event_id.product_id.id,
412 'invoice_line_tax_id': [(6, 0, tax_ids)],
413 })
414 inv_line_ids = self._create_invoice_lines(cr, uid, [reg.id], vals)
415 invoices.setdefault(reg.partner_id.id, []).append((reg, inv_line_ids))
416 for val in invoices.values():
417 res = False
418 if grouped:
419 res = self._make_invoice(cr, uid, val[0][0], [v for k, v in val], context=context)
420
421 for k, v in val:
422 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
423
424 else:
425 for k, v in val:
426 res = self._make_invoice(cr, uid, k, [v], context=context)
427 self.do_close(cr, uid, [k.id], context={'invoice_id': res})
428 if res: new_invoice_ids.append(res)
429 return new_invoice_ids
430
431 def do_open(self, cr, uid, ids, context=None):223 def do_open(self, cr, uid, ids, context=None):
432 """ Open Registration224 """ Open Registration
433 """225 """
@@ -441,274 +233,100 @@
441 """233 """
442 if context is None:234 if context is None:
443 context = {}235 context = {}
444 invoice_id = context.get('invoice_id', False)
445 values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}236 values = {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
446 msg = _('Done')237 msg = _('Done')
447 if invoice_id:
448 values['invoice_id'] = invoice_id
449 res = self.write(cr, uid, ids, values)238 res = self.write(cr, uid, ids, values)
450 self.message_append(cr, uid, ids, msg)239 self.message_append(cr, uid, ids, msg)
451 return res240 return res
452 241
453 # event uses add_note wizard from crm, which expects case_* methods242 # event uses add_note wizard from crm, which expects case_* methods
454 def case_open(self, cr, uid, ids, context=None):243 def case_open(self, cr, uid, ids, context=None):
455 self.do_open(cr, uid, ids, context)244 self.do_open(cr, uid, ids, context)
456 245
457 # event uses add_note wizard from crm, which expects case_* methods246 # event uses add_note wizard from crm, which expects case_* methods
458 def case_close(self, cr, uid, ids, context=None):247 #def case_close(self, cr, uid, ids, context=None):
459 self.do_close(cr, uid, ids, context)248 # self.do_close(cr, uid, ids, context)
460 249 # return self.write(cr, uid, ids, {'state': 'done'})
250
461 # event uses add_note wizard from crm, which expects case_* methods251 # event uses add_note wizard from crm, which expects case_* methods
462 def case_cancel(self, cr, uid, ids, context=None):252 def case_cancel(self, cr, uid, ids, context=None):
463 """ Cancel Registration253 """ Cancel Registration
464 """254 """
465 self.message_append(cr, uid, ids, _('Cancel'))255 self.message_append(cr, uid, ids, _('Cancel'))
466 return self.write(cr, uid, ids, {'state': 'cancel'})256 return self.write(cr, uid, ids, {'state': 'cancel'})
467 257
468 # event uses add_note wizard from crm, which expects case_* methods258 # event uses add_note wizard from crm, which expects case_* methods
469 def case_reset(self, cr, uid, ids, context=None):259 def case_reset(self, cr, uid, ids, context=None):
470 pass260 pass
471 261
472 # event uses add_note wizard from crm, which expects case_* methods262 # event uses add_note wizard from crm, which expects case_* methods
473 def case_pending(self, cr, uid, ids, context=None):263 def case_pending(self, cr, uid, ids, context=None):
474 pass264 pass
475
476 def check_confirm(self, cr, uid, ids, context=None):
477 """This Function Open Event Registration and send email to user.
478 @param ids: List of Event registration's IDs
479 @param context: A standard dictionary for contextual values
480 @return: True
481 """
482 if type(ids) in (int, long,):
483 ids = [ids]
484 data_pool = self.pool.get('ir.model.data')
485 unconfirmed_ids = []
486 if context is None:
487 context = {}
488 for registration in self.browse(cr, uid, ids, context=context):
489 total_confirmed = registration.event_id.register_current + registration.nb_register
490 if total_confirmed <= registration.event_id.register_max or registration.event_id.register_max == 0:
491 self.do_open(cr, uid, [registration.id], context=context)
492 else:
493 unconfirmed_ids.append(registration.id)
494 if unconfirmed_ids:
495 view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_confirm_registration')
496 view_id = view_id and view_id[1] or False
497 context['registration_ids'] = unconfirmed_ids
498 return {
499 'name': _('Confirm Registration'),
500 'context': context,
501 'view_type': 'form',
502 'view_mode': 'tree,form',
503 'res_model': 'event.confirm.registration',
504 'views': [(view_id, 'form')],
505 'type': 'ir.actions.act_window',
506 'target': 'new',
507 'context': context,
508 'nodestroy': True
509 }
510 return True
511265
512 def button_reg_close(self, cr, uid, ids, context=None):266 #def button_reg_close(self, cr, uid, ids, context=None):
513 """This Function Close Event Registration.267 # """This Function Close Event Registration.
514 """268 # """
515 data_pool = self.pool.get('ir.model.data')269 # return self.case_close(cr, uid, ids)
516 unclosed_ids = []
517 for registration in self.browse(cr, uid, ids, context=context):
518 if registration.tobe_invoiced and not registration.invoice_id:
519 unclosed_ids.append(registration.id)
520 else:
521 self.do_close(cr, uid, [registration.id], context=context)
522 if unclosed_ids:
523 view_id = data_pool.get_object_reference(cr, uid, 'event', 'view_event_make_invoice')
524 view_id = view_id and view_id[1] or False
525 context['active_ids'] = unclosed_ids
526 return {
527 'name': _('Close Registration'),
528 'context': context,
529 'view_type': 'form',
530 'view_mode': 'tree,form',
531 'res_model': 'event.make.invoice',
532 'views': [(view_id, 'form')],
533 'type': 'ir.actions.act_window',
534 'target': 'new',
535 'context': context,
536 'nodestroy': True
537 }
538 return True
539270
540 def button_reg_cancel(self, cr, uid, ids, context=None, *args):271 def button_reg_cancel(self, cr, uid, ids, context=None, *args):
541 return self.case_cancel(cr, uid, ids)272 return self.case_cancel(cr, uid, ids)
542273
543 def mail_user(self, cr, uid, ids, confirm=False, context=None):274 def mail_user(self, cr, uid, ids, confirm=False, context=None):
544 """275 """
545 Send email to user276 Send email to user with email_template when registration is done
546 """277 """
547 mail_message = self.pool.get('mail.message')
548 for registration in self.browse(cr, uid, ids, context=context):278 for registration in self.browse(cr, uid, ids, context=context):
549 src = registration.event_id.reply_to or False279 template_id = registration.event_id.email_registration_id.id
550 email_to = []280 if template_id:
551 email_cc = []281 mail_message = self.pool.get('email.template').send_mail(cr,uid,template_id,registration.id)
552 if registration.email_from:
553 email_to = [registration.email_from]
554 if registration.email_cc:
555 email_cc += [registration.email_cc]
556 if not (email_to or email_cc):
557 continue
558 subject = ""
559 body = ""
560 if confirm:
561 subject = _('Auto Confirmation: [%s] %s') %(registration.id, registration.name)
562 body = registration.event_id.mail_confirm
563 elif registration.event_id.mail_auto_confirm or registration.event_id.mail_auto_registr:
564 if registration.event_id.state in ['draft', 'fixed', 'open', 'confirm', 'running'] and registration.event_id.mail_auto_registr:
565 subject = _('Auto Registration: [%s] %s') %(registration.id, registration.name)
566 body = registration.event_id.mail_registr
567 if (registration.event_id.state in ['confirm', 'running']) and registration.event_id.mail_auto_confirm:
568 subject = _('Auto Confirmation: [%s] %s') %(registration.id, registration.name)
569 body = registration.event_id.mail_confirm
570 if subject or body:
571 mail_message.schedule_with_attach(cr, uid, src, email_to, subject, body, model='event.registration', email_cc=email_cc, res_id=registration.id)
572
573 return True282 return True
574283
575 def mail_user_confirm(self, cr, uid, ids, context=None):284 def mail_user_confirm(self, cr, uid, ids, context=None):
576 """285 """
577 Send email to user286 Send email to user when the event is done
578 """287 """
579 return self.mail_user(cr, uid, ids, confirm=True, context=context)288 for registration in self.browse(cr, uid, ids, context=context):
580289 template_id = registration.event_id.email_confirmation_id.id
581 def _create_invoice_lines(self, cr, uid, ids, vals):290 if template_id:
582 """ Create account Invoice line for Registration Id.291 mail_message = self.pool.get('email.template').send_mail(cr,uid,template_id,registration.id)
583 """292 return True
584 return self.pool.get('account.invoice.line').create(cr, uid, vals)293
585294 def onchange_contact_id(self, cr, uid, ids, contact, partner, context=None):
586 def onchange_contact_id(self, cr, uid, ids, contact, partner):
587
588 """This function returns value of Badge Name, Badge Title based on Partner contact.
589 @param self: The object pointer
590 @param cr: the current row, from the database cursor,
591 @param uid: the current user’s ID for security checks,
592 @param ids: List of Registration IDs
593 @param contact: Patner Contact IDS
594 @param partner: Partner IDS
595 """
596 data ={}295 data ={}
597 if not contact:296 if not contact:
598 return data297 return data
599 addr_obj = self.pool.get('res.partner.address')298 addr_obj = self.pool.get('res.partner.address')
600 data['email_from'] = addr_obj.browse(cr, uid, contact).email299 data['email_from'] = addr_obj.browse(cr, uid, contact, context).email
601 return {'value': data}300 return {'value': data}
602301
603 def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id):302 def onchange_event(self, cr, uid, ids, event_id, context=None):
604 """This function returns value of Product Name, Unit Price based on Event.303 """This function returns value of Product Name, Unit Price based on Event.
605 @param self: The object pointer
606 @param cr: the current row, from the database cursor,
607 @param uid: the current user’s ID for security checks,
608 @param ids: List of Registration IDs
609 @param event_id: Event ID
610 @param partner_invoice_id: Partner Invoice ID
611 """304 """
612 context = {}305 if context is None:
306 context = {}
613 if not event_id:307 if not event_id:
614 return {'value': {'unit_price': False, 'event_product': False}}308 return {}
615
616 event_obj = self.pool.get('event.event')309 event_obj = self.pool.get('event.event')
617 prod_obj = self.pool.get('product.product')310 data_event = event_obj.browse(cr, uid, event_id, context=context)
618 res_obj = self.pool.get('res.partner')311 return {'value':
619312 {'date': data_event.date_begin,
620 data_event = event_obj.browse(cr, uid, event_id)313 'date_deadline': data_event.date_end,
621 res = {'value': {'unit_price': False,314 'section_id': data_event.section_id and data_event.section_id.id or False,
622 'event_product': False,315 'company_id': data_event.company_id and data_event.company_id.id or False,
623 'user_id': False,316 }
624 'date': data_event.date_begin,317 }
625 'date_deadline': data_event.date_end,318
626 'description': data_event.note,319 def onchange_partner_id(self, cr, uid, ids, part, context=None):
627 'name': data_event.name,
628 'section_id': data_event.section_id and data_event.section_id.id or False,
629 }}
630 if data_event.user_id.id:
631 res['value'].update({'user_id': data_event.user_id.id})
632 if data_event.product_id:
633 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
634 if partner_invoice_id:
635 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
636 pricelist_id = pricelist_id or partner.property_product_pricelist.id
637 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
638 if not unit_price:
639 unit_price = data_event.unit_price
640 res['value'].update({'unit_price': unit_price, 'event_product': data_event.product_id.name})
641 return res
642
643 def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False):
644 """This function returns value of Patner Invoice id, Unit Price, badget title based on partner and Event.
645 @param self: The object pointer
646 @param cr: the current row, from the database cursor,
647 @param uid: the current user’s ID for security checks,
648 @param ids: List of Registration IDs
649 @param event_id: Event ID
650 @param partner_invoice_id: Partner Invoice ID
651 """
652 res_obj = self.pool.get('res.partner')320 res_obj = self.pool.get('res.partner')
653321
654 data = {}322 data = {}
655 data['contact_id'], data['partner_invoice_id'], data['email_from'] = (False, False, False)
656 if not part:323 if not part:
657 return {'value': data}324 return {'value': data}
658 data['partner_invoice_id'] = part
659 # this calls onchange_partner_invoice_id
660 d = self.onchange_partner_invoice_id(cr, uid, ids, event_id, part)
661 # this updates the dictionary
662 data.update(d['value'])
663 addr = res_obj.address_get(cr, uid, [part]).get('default', False)325 addr = res_obj.address_get(cr, uid, [part]).get('default', False)
664 if addr:326 if addr:
665 d = self.onchange_contact_id(cr, uid, ids, addr, part)327 d = self.onchange_contact_id(cr, uid, ids, addr, part, context)
666 data.update(d['value'])328 data.update(d['value'])
667 return {'value': data}329 return {'value': data}
668330
669 def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id):
670 """This function returns value of Product unit Price based on Invoiced partner.
671 @param self: The object pointer
672 @param cr: the current row, from the database cursor,
673 @param uid: the current user’s ID for security checks,
674 @param ids: List of Registration IDs
675 @param event_id: Event ID
676 @param partner_invoice_id: Partner Invoice ID
677 """
678 data = {}
679 context = {}
680 event_obj = self.pool.get('event.event')
681 prod_obj = self.pool.get('product.product')
682 res_obj = self.pool.get('res.partner')
683
684 data['unit_price']=False
685 if not event_id:
686 return {'value': data}
687 data_event = event_obj.browse(cr, uid, event_id, context=context)
688 if data_event.product_id:
689 data['event_product'] = data_event.product_id.name
690 pricelist_id = data_event.pricelist_id and data_event.pricelist_id.id or False
691 if partner_invoice_id:
692 partner = res_obj.browse(cr, uid, partner_invoice_id, context=context)
693 pricelist_id = pricelist_id or partner.property_product_pricelist.id
694 unit_price = prod_obj._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': pricelist_id})[data_event.product_id.id]
695 if not unit_price:
696 unit_price = data_event.unit_price
697 data['unit_price'] = unit_price
698 return {'value': data}
699
700event_registration()331event_registration()
701
702class event_registration_badge(osv.osv):
703 _name = 'event.registration.badge'
704 _description = __doc__
705 _columns = {
706 "registration_id": fields.many2one('event.registration', 'Registration', required=True),
707 "title": fields.char('Title', size=128),
708 "name": fields.char('Name', size=128, required=True),
709 "address_id": fields.many2one('res.partner.address', 'Address'),
710 }
711
712event_registration_badge()
713
714# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:332# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
715333
=== modified file 'event/event_demo.xml'
--- event/event_demo.xml 2011-12-19 16:54:40 +0000
+++ event/event_demo.xml 2012-02-02 16:05:26 +0000
@@ -4,6 +4,10 @@
4 <record id="base.user_demo" model="res.users">4 <record id="base.user_demo" model="res.users">
5 <field name="groups_id" eval="[(4, ref('marketing.group_marketing_user')),(4, ref('base.group_sale_salesman'))]"/>5 <field name="groups_id" eval="[(4, ref('marketing.group_marketing_user')),(4, ref('base.group_sale_salesman'))]"/>
6 </record>6 </record>
7
8
9
10
7<!-- Demo Data for Product -->11<!-- Demo Data for Product -->
8 <record id="event_product_0" model="product.product">12 <record id="event_product_0" model="product.product">
9 <field name="list_price">68.00</field>13 <field name="list_price">68.00</field>
@@ -99,7 +103,7 @@
99<!-- Demo data for Event Registration-->103<!-- Demo data for Event Registration-->
100 <record id="reg_1_1" model="event.registration">104 <record id="reg_1_1" model="event.registration">
101 <field name="event_id" ref="event_1"/>105 <field name="event_id" ref="event_1"/>
102 <field name="partner_id" ref="base.res_partner_asus"/>106 <field name="partner_id_address" ref="base.res_partner_asus"/>
103 <field name="partner_invoice_id" ref="base.res_partner_asus"/>107 <field name="partner_invoice_id" ref="base.res_partner_asus"/>
104 <field name="nb_register">5</field>108 <field name="nb_register">5</field>
105 <field name="event_product">Ticket for Opera</field>109 <field name="event_product">Ticket for Opera</field>
@@ -108,25 +112,25 @@
108112
109 <record id="reg_1_2" model="event.registration">113 <record id="reg_1_2" model="event.registration">
110 <field name="event_id" ref="event_1"/>114 <field name="event_id" ref="event_1"/>
111 <field name="partner_id" ref="base.res_partner_agrolait"/>115 <field name="partner_id_address" ref="base.res_partner_agrolait"/>
112 <field name="partner_invoice_id" ref="base.res_partner_agrolait"/>116 <field name="partner_invoice_id" ref="base.res_partner_agrolait"/>
113 <field name="nb_register">10</field>117 <field name="nb_register">10</field>
114 <field name="event_product">Ticket for Opera</field>118 <field name="event_product">Ticket for Opera</field>
115 <field name="unit_price">24.00</field>119 <field name="unit_price">24.00</field>
116 </record>120 </record>
117121
118 <function model="event.registration" name="check_confirm" eval="[ref('reg_1_2')]"/> 122
119123
120 <record id="reg_0_1" model="event.registration">124 <record id="reg_0_1" model="event.registration">
121 <field name="event_id" ref="event_0"/>125 <field name="event_id" ref="event_0"/>
122 <field name="partner_id" ref="base.res_partner_c2c"/>126 <field name="partner_id_address" ref="base.res_partner_c2c"/>
123 <field name="partner_invoice_id" ref="base.res_partner_c2c"/>127 <field name="partner_invoice_id" ref="base.res_partner_c2c"/>
124 <field name="nb_register">6</field>128 <field name="nb_register">6</field>
125 <field name="event_product">Ticket for Concert</field>129 <field name="event_product">Ticket for Concert</field>
126 <field name="unit_price">15.50</field>130 <field name="unit_price">15.50</field>
127 </record>131 </record>
128132
129 <function model="event.registration" name="check_confirm" eval="[ref('reg_0_1')]"/> 133
130134
131 <record id="reg_0_2" model="event.registration">135 <record id="reg_0_2" model="event.registration">
132 <field name="event_id" ref="event_2"/>136 <field name="event_id" ref="event_2"/>
@@ -137,7 +141,7 @@
137 <field name="unit_price">20</field>141 <field name="unit_price">20</field>
138 </record>142 </record>
139 143
140 <function model="event.registration" name="check_confirm" eval="[ref('reg_0_2')]"/>144
141 145
142 </data>146 </data>
143</openerp>147</openerp>
144148
=== modified file 'event/event_view.xml'
--- event/event_view.xml 2011-12-19 16:54:40 +0000
+++ event/event_view.xml 2012-02-02 16:05:26 +0000
@@ -38,11 +38,11 @@
38 <field name="res_model">event.type</field>38 <field name="res_model">event.type</field>
39 <field name="view_type">form</field>39 <field name="view_type">form</field>
40 </record>40 </record>
41 <menuitem name="Configuration" id="base.menu_marketing_config_root" parent="base.marketing_menu" sequence="30" groups="base.group_extended"/>41 <menuitem name="Configuration" id="base.menu_marketing_config_root" parent="base.marketing_menu" sequence="30"/>
42 <menuitem name="Configuration" id="base.menu_marketing_config_association" parent="base.menu_association" sequence="30" groups="base.group_extended"/>42 <menuitem name="Configuration" id="base.menu_marketing_config_association" parent="base.menu_association" sequence="30"/>
4343
44 <menuitem name="Types of Events" id="menu_event_type" action="action_event_type" parent="base.menu_marketing_config_root" groups="base.group_extended"/>44 <menuitem name="Types of Events" id="menu_event_type" action="action_event_type" parent="base.menu_marketing_config_root"/>
45 <menuitem name="Events Type" id="menu_event_type_association" action="action_event_type" parent="base.menu_marketing_config_association" groups="base.group_extended"/>45 <menuitem name="Events Type" id="menu_event_type_association" action="action_event_type" parent="base.menu_marketing_config_association"/>
4646
47 <!-- Events Organisation/CONFIGURATION/EVENTS -->47 <!-- Events Organisation/CONFIGURATION/EVENTS -->
4848
@@ -57,32 +57,51 @@
57 <field name="date_begin"/>57 <field name="date_begin"/>
58 <field name="date_end"/>58 <field name="date_end"/>
59 <field name="type" widget="selection"/>59 <field name="type" widget="selection"/>
60 <field name="language"/>60 <field name="user_id"/>
61 <field name="parent_id"/>61 <field name="address_id" />
62 </group>62 </group>
63 <notebook colspan="4">63 <notebook colspan="4">
64 <page string="Event">64 <page string="Event">
65 <group colspan="4" col="4">
66 <separator string="Invoice Information" colspan="4"/>
67 <field name="product_id" on_change="onchange_product(product_id)" colspan="4"/>
68 <field name="unit_price"/>
69 <field name="pricelist_id" widget="selection" domain="[('type','=','sale')]" groups="base.group_extended"/>
70 </group>
71 <group colspan="2" col="2">
72 <separator string="Contact" colspan="4"/>
73 <field name="user_id"/>
74 <field name="section_id" widget="selection" on_change="do_team_change(section_id)"/>
75 <field name="company_id" groups="base.group_multi_company" widget="selection"/>
76 </group>
77 <group colspan="2" col="2">
78 <separator string="Location" colspan="4"/>
79 <field name="country_id" />
80 <field name="address_id" domain="[('country_id','=',country_id)]"/>
81
82 </group>
83 <separator string="Description" colspan="4"/>65 <separator string="Description" colspan="4"/>
84 <field name="note" colspan="4" nolabel="1"/>66 <field name="note" colspan="4" nolabel="1"/>
85 <field name="state" select="1"/>67 <field name="registration_ids" colspan="4" nolabel="1">
68 <tree string="Registration" editable="top">
69 <field name="name" />
70 <field name="email" />
71 <field name="phone"/>
72 <field name="nb_register" />
73 <field name="state"/>
74 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
75 <button name="case_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
76 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
77 </tree>
78 <form string="Registration">
79 <field name="partner_id" attrs="{'readonly':[('state','!=', 'draft')]}" on_change="onchange_partner_id(partner_id, context)" />
80 <field name="name"/>
81 <group colspan="4" col="4">
82 <field name="street"/>
83 <field name="city"/>
84 </group>
85 <group colspan="4" col="4">
86 <field name="email"/>
87 <field name="phone"/>
88 </group>
89 <group colspan="4" col="4">
90 <field name="nb_register"/>
91 </group>
92 <group colspan="4" col="4">
93 </group>
94 <group col="8" colspan="4">
95 <separator string="" colspan="4"/>
96 <newline/>
97 <field name="state" select="1" colspan="2"/>
98 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
99 <button name="case_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
100 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
101 </group>
102 </form>
103 </field>
104 <field name="state" select="1" widget="statusbar" statusbar_visible="draft,confirm,done"/>
86 <group col="4" colspan="2">105 <group col="4" colspan="2">
87 <button string="Cancel Event" name="button_cancel" states="draft,confirm" type="object" icon="gtk-cancel"/>106 <button string="Cancel Event" name="button_cancel" states="draft,confirm" type="object" icon="gtk-cancel"/>
88 <button string="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>107 <button string="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>
@@ -90,72 +109,33 @@
90 <button string="Set To Draft" name="button_draft" states="cancel" type="object" icon="gtk-convert"/>109 <button string="Set To Draft" name="button_draft" states="cancel" type="object" icon="gtk-convert"/>
91 </group>110 </group>
92 </page>111 </page>
93 <page string="Speakers">112 <page string="Speakers" groups="base.group_extended">
94 <field name="main_speaker_id" domain="[('speaker','=',True)]"/>113 <field name="main_speaker_id" domain="[('speaker','=',True)]"/>
95 <field name="speaker_confirmed"/>114 <field name="speaker_confirmed"/>
96 <separator string="Other Speakers" colspan="4"/>115 <separator string="Other Speakers" colspan="4"/>
97 <field name="speaker_ids" domain="[('speaker','=',True)]" colspan="4" nolabel="1"/>116 <field name="speaker_ids" domain="[('speaker','=',True)]" colspan="4" nolabel="1"/>
98 </page>117 </page>
99 <page string="Registrations">118 <page string="Extra Info">
100 <field name="register_min"/>119 <group col="2" colspan="2">
101 <field name="register_max"/>120 <separator string="Registrations" colspan="2"/>
102 <field name="register_current"/>121 <field name="register_min"/>
103 <field name="register_prospect"/>122 <field name="register_max"/>
104 <field name="registration_ids" colspan="4" nolabel="1" readonly="1">123 <field name="register_current"/>
105 <form string="Registration">124 <field name="register_prospect"/>
106 <field name="name"/>125 </group>
107 <field name="date" string="Date"/>126 <group col="2" colspan="2">
108 <field name="partner_id" required="1" on_change="onchange_partner_id(partner_id,event_id)"/>127 <separator string="Emails" colspan="2"/>
109 <field name="partner_invoice_id" on_change="onchange_partner_invoice_id(event_id, partner_invoice_id)"/>128 <field name="reply_to"/>
110 <group colspan="4" col="4">129 <field name="email_registration_id" domain="[('model_id','=','Event Registration')]"/>
111 <field name="event_product"/>130 <field name="email_confirmation_id"/>
112 <field name="nb_register"/>131 </group>
113 <field name="unit_price"/>132 <group col="2" colspan="2" groups="base.group_extended">
114 <field name="price_subtotal"/>133 <separator string="Misc" colspan="2"/>
115 </group>134 <field name="product_id"/>
116 <group col="8" colspan="4">135 </group>
117 <separator string="" colspan="4"/>136 <group col="2" colspan="2">
118 <newline/>137 <separator string="Sales Team" colspan="2"/>
119 <field name="state" select="1" colspan="2"/>138 <field name="section_id" on_change="do_team_change(self, cr, uid, ids, team_id)"/>
120 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
121 <button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
122 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
123 </group>
124 </form>
125 <tree string="Registration">
126 <field name="create_date" string="Registration Date"/>
127 <field name="partner_id" required="1" string="Partner" on_change="onchange_partner_id(partner_id,event_id)"/>
128 <field name="event_product"/>
129 <field name="nb_register"/>
130 <field name="unit_price"/>
131 <field name="price_subtotal"/>
132 <field name="state"/>
133 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
134 <button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
135 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
136 </tree>
137 </field>
138 </page>
139 <page string="Mailing">
140 <field name="reply_to" />
141 <newline/>
142 <group col="4" colspan="4">
143 <group col="2" colspan="2">
144 <separator string="Auto Registration Email" colspan="4"/>
145 <field name="mail_auto_registr" colspan="4"/>
146 <group colspan="4" attrs="{'readonly':[('mail_auto_registr','=',False)]}">
147 <separator string="Registration Email Body" colspan="4"/>
148 <field name="mail_registr" colspan="4" nolabel="1" />
149 </group>
150 </group>
151 <group col="2" colspan="2">
152 <separator string="Auto Confirmation Email" colspan="4"/>
153 <field name="mail_auto_confirm" colspan="4"/>
154 <group colspan="4" attrs="{'readonly':[('mail_auto_confirm','=',False)]}">
155 <separator string="Confirmation Email Body" colspan="4"/>
156 <field name="mail_confirm" nolabel="1" colspan="4"/>
157 </group>
158 </group>
159 </group>139 </group>
160 </page>140 </page>
161 </notebook>141 </notebook>
@@ -172,14 +152,13 @@
172 <field name="arch" type="xml">152 <field name="arch" type="xml">
173 <tree string="Events" colors="red:register_min>register_current;black:register_min&lt;=register_current">153 <tree string="Events" colors="red:register_min>register_current;black:register_min&lt;=register_current">
174 <field name="name" string="Name"/>154 <field name="name" string="Name"/>
175 <field name="main_speaker_id"/>
176 <field name="language"/>
177 <field name="type"/>155 <field name="type"/>
178 <field name="date_begin"/>156 <field name="date_begin"/>
179 <field name="date_end"/>157 <field name="date_end"/>
158 <field name="register_current"/>
180 <field name="register_min"/>159 <field name="register_min"/>
181 <field name="register_current"/>
182 <field name="section_id" invisible="context.get('invisible_section', True)"/>160 <field name="section_id" invisible="context.get('invisible_section', True)"/>
161 <field name="main_speaker_id" groups="base.extended"/>
183 <field name="user_id"/>162 <field name="user_id"/>
184 <field name="state"/>163 <field name="state"/>
185 <button string="Confirm Event" help="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>164 <button string="Confirm Event" help="Confirm Event" name="button_confirm" states="draft" type="object" icon="gtk-apply"/>
@@ -262,8 +241,8 @@
262 </field>241 </field>
263 </record>242 </record>
264243
265 <!-- Events Organisation/CONFIGURATION/EVENTS -->
266244
245 <!-- Events Organisation/CONFIGURATION/EVENTS -->
267 <record model="ir.actions.act_window" id="action_event_view">246 <record model="ir.actions.act_window" id="action_event_view">
268 <field name="name">Events</field>247 <field name="name">Events</field>
269 <field name="type">ir.actions.act_window</field>248 <field name="type">ir.actions.act_window</field>
@@ -296,23 +275,23 @@
296 <menuitem name="Events" id="menu_event_event" action="action_event_view" parent="base.menu_event_main" />275 <menuitem name="Events" id="menu_event_event" action="action_event_view" parent="base.menu_event_main" />
297 <menuitem name="Events" id="menu_event_event_assiciation" action="action_event_view" parent="base.menu_event_association" />276 <menuitem name="Events" id="menu_event_event_assiciation" action="action_event_view" parent="base.menu_event_association" />
298277
299 <!-- EVENTS/REGISTRATIONS/EVENTS -->278
300279 <!-- EVENTS/REGISTRATIONS/EVENTS -->
301
302 <record model="ir.ui.view" id="view_event_registration_tree">280 <record model="ir.ui.view" id="view_event_registration_tree">
303 <field name="name">event.registration.tree</field>281 <field name="name">event.registration.tree</field>
304 <field name="model">event.registration</field>282 <field name="model">event.registration</field>
305 <field name="type">tree</field>283 <field name="type">tree</field>
306 <field name="arch" type="xml">284 <field name="arch" type="xml">
307 <tree string="Registration">285 <tree string="Registration" >
308 <field name="partner_id"/>286 <field name="name"/>
287 <field name="email"/>
288 <field name="phone"/>
309 <field name="event_id"/>289 <field name="event_id"/>
310 <field name="nb_register"/>290 <field name="nb_register" invisible="1"/>
311 <field name="price_subtotal" sum="Total"/>
312 <field name="user_id"/>291 <field name="user_id"/>
313 <field name="state"/>292 <field name="state"/>
314 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>293 <button name="case_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
315 <button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>294 <button name="case_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
316 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>295 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
317 </tree>296 </tree>
318 </field>297 </field>
@@ -325,69 +304,39 @@
325 <field name="arch" type="xml">304 <field name="arch" type="xml">
326 <form string="Registration">305 <form string="Registration">
327 <group col="6" colspan="4">306 <group col="6" colspan="4">
328 <field name="event_id" on_change="onchange_event(event_id, partner_invoice_id)" domain="[('state','in',('draft','confirm'))]"/>307 <field name="event_id" on_change="onchange_event(event_id, context)" domain="[('state','in',('draft','confirm'))]"/>
329 <field name="create_date" string="Registration Date"/>308 <field name="nb_register"/>
330 <field name="name"/>309 <field name="origin"/>
331 <field name="partner_id" attrs="{'readonly':[('state','!=', 'draft')]}" required="1" on_change="onchange_partner_id(partner_id,event_id)" />310 <field name="name" colspan="4"/>
332 <field name="user_id" attrs="{'readonly':[('state','!=', 'draft')]}" />311 <field name="user_id" attrs="{'readonly':[('state','!=', 'draft')]}"/>
333 <field name="tobe_invoiced"/>
334 </group>312 </group>
335 <notebook colspan="4">313 <notebook colspan="4">
336 <page string="Registration">314 <page string="Additional Information">
337 <field name="date" />
338 <field name="date_deadline" />
339 <group colspan="2" col="2">315 <group colspan="2" col="2">
340 <separator string="Registration Cost" colspan="4"/>316 <separator string="Contact Information" colspan="2"/>
341 <field name="nb_register"/>317 <field name="partner_id" attrs="{'readonly':[('state','!=', 'draft')]}" on_change="onchange_partner_id(partner_id, context)" groups="base.group_extended"/>
342 <field name="unit_price"/>318 <field name="contact_id" attrs="{'readonly':[('state','!=', 'draft')]}" on_change="onchange_contact_id(contact_id, context)" groups="base.group_extended"/>
343 <field name="price_subtotal"/>319 <field name="email"/>
344 </group>320 <field name="phone"/>
345 <group colspan="2" col="2" attrs="{'invisible':[('tobe_invoiced','=',False)]}">321 <field name="street"/>
346 <separator string="Invoice" colspan="4"/>322 <field name="city"/>
347 <field name="event_product" attrs="{'required':[('tobe_invoiced','=',True)]}"/>323 </group>
348 <field name="partner_invoice_id" attrs="{'required':[('tobe_invoiced','=',True)]}" on_change="onchange_partner_invoice_id(event_id, partner_invoice_id)"/>324 <group colspan="2" col="2" groups="base.group_extended">
349 <field name="invoice_id"/>325 <separator string="Dates" colspan="2"/>
350 </group>326 <field name="date_closed"/>
351 <separator string="Description" colspan="4"/>327 <field name="date" />
352 <field name="description" colspan="4" nolabel="1"/>328 <field name="date_deadline" />
329 </group>
330
353 <separator string="" colspan="4"/>331 <separator string="" colspan="4"/>
354 <group col="8" colspan="4">332 <group col="8" colspan="4">
355 <field name="state" select="1" colspan="2"/>333 <field name="state" select="1" colspan="2" widget="statusbar" statusbar_visible="draft,open,done"/>
356 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>334 <button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
357 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>335 <button name="button_reg_close" string="Close Registration" states="open" type="object" icon="gtk-close"/>
358 <button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>336 <button name="case_open" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
359 </group>
360 </page>
361 <page string="Extra Info">
362 <separator string="Contact" colspan="4"/>
363 <field name="contact_id" on_change="onchange_contact_id(contact_id, partner_id)" />
364 <field name="email_from"/>
365 <field name="badge_ids" colspan="4" nolabel="1">
366 <tree string="Badges" editable="bottom">
367 <field name="name"/>
368 <field name="title"/>
369 <field name="address_id"/>
370 </tree>
371 <form string="Badges">
372 <field name="name"/>
373 <field name="title"/>
374 <field name="address_id"/>
375 </form>
376 </field>
377 <group col="2" colspan="2" groups="base.group_extended">
378 <separator string="Dates" colspan="2"/>
379 <field name="date_closed"/>
380 </group>
381 <group col="2" colspan="2" groups="base.group_extended">
382 <separator string="Misc" colspan="2"/>
383 <field name="id"/>
384 <field name="active"/>
385 </group>337 </group>
386 </page>338 </page>
387 <page string="Emails" groups="base.group_extended">339 <page string="Emails" groups="base.group_extended">
388 <group colspan="4">
389 <field colspan="4" name="email_cc" string="CC" widget="char" size="512"/>
390 </group>
391 <field name="message_ids" colspan="4" nolabel="1" mode="tree">340 <field name="message_ids" colspan="4" nolabel="1" mode="tree">
392 <tree string="History">341 <tree string="History">
393 <field name="display_text" string="History Information"/>342 <field name="display_text" string="History Information"/>
@@ -407,13 +356,13 @@
407 name="%(mail.action_email_compose_message_wizard)d"356 name="%(mail.action_email_compose_message_wizard)d"
408 icon="terp-mail-message-new" type="action"/>357 icon="terp-mail-message-new" type="action"/>
409 </page>358 </page>
359
410 </notebook>360 </notebook>
411 </form>361 </form>
412 </field>362 </field>
413 </record>363 </record>
414364
415 <!-- Calendar view of event registration -->365 <!-- Calendar view of event registration -->
416
417 <record id="view_event_registration_calendar" model="ir.ui.view">366 <record id="view_event_registration_calendar" model="ir.ui.view">
418 <field name="name">event.registration.calendar</field>367 <field name="name">event.registration.calendar</field>
419 <field name="model">event.registration</field>368 <field name="model">event.registration</field>
@@ -422,7 +371,7 @@
422 <field name="arch" type="xml">371 <field name="arch" type="xml">
423 <calendar color="event_id" date_start="date" date_stop="date_closed" string="Event Registration">372 <calendar color="event_id" date_start="date" date_stop="date_closed" string="Event Registration">
424 <field name="event_id"/>373 <field name="event_id"/>
425 <field name="partner_invoice_id"/>374 <field name="name"/>
426 </calendar>375 </calendar>
427 </field>376 </field>
428 </record>377 </record>
@@ -434,14 +383,13 @@
434 <field name="arch" type="xml">383 <field name="arch" type="xml">
435 <graph string="Registration" type="bar" orientation="horizontal">384 <graph string="Registration" type="bar" orientation="horizontal">
436 <field name="event_id"/>385 <field name="event_id"/>
437 <field name = "nb_register" operator="+"/>386 <field name= "nb_register" operator="+"/>
438 </graph>387 </graph>
439 </field>388 </field>
440 </record>389 </record>
441390
442391
443<!-- Search view of event registration form-->392 <!-- Search view of event registration -->
444
445 <record model="ir.ui.view" id="view_registration_search">393 <record model="ir.ui.view" id="view_registration_search">
446 <field name="name">Registrations</field>394 <field name="name">Registrations</field>
447 <field name="model">event.registration</field>395 <field name="model">event.registration</field>
@@ -452,24 +400,25 @@
452 <filter icon="terp-check" string="New" name="draft" domain="[('state','=','draft')]" help="Registrations in unconfirmed state"/>400 <filter icon="terp-check" string="New" name="draft" domain="[('state','=','draft')]" help="Registrations in unconfirmed state"/>
453 <filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','open')]" help="Confirmed registrations"/>401 <filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','open')]" help="Confirmed registrations"/>
454 <separator orientation="vertical"/>402 <separator orientation="vertical"/>
455 <field name="partner_id" />
456 <field name="event_id" widget="selection"/>403 <field name="event_id" widget="selection"/>
404 <field name="partner_id" groups="base.group_extended"/>
457 <field name="user_id" widget="selection">405 <field name="user_id" widget="selection">
458 <filter icon="terp-personal"406 <filter icon="terp-personal"
459 string="My Registrations"407 string="My Registrations"
460 help="My Registrations"408 help="My Registrations"
461 domain="[('user_id','=',uid)]"/>409 domain="[('user_id','=',uid)]"/>
462 </field>410 </field>
463 <field name="state"/>411 <field name="origin"/>
464 </group>412 </group>
465 <newline/>413 <newline/>
466 <group expand="0" string="Group By...">414 <group expand="0" string="Group By...">
467 <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>415 <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
468 <filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>416 <filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}" groups="base.group_extended"/>
469 <separator orientation="vertical"/>417 <separator orientation="vertical"/>
470 <filter string="Event" icon="terp-crm" domain="[]" context="{'group_by':'event_id'}"/>418 <filter string="Event" icon="terp-crm" domain="[]" context="{'group_by':'event_id'}"/>
471 <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>419 <filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
472 </group>420 </group>
421
473 </search>422 </search>
474 </field>423 </field>
475 </record>424 </record>
476425
=== modified file 'event/report/report_event_registration.py'
--- event/report/report_event_registration.py 2011-12-19 16:54:40 +0000
+++ event/report/report_event_registration.py 2012-02-02 16:05:26 +0000
@@ -29,7 +29,7 @@
29 _auto = False29 _auto = False
30 _rec_name = 'date'30 _rec_name = 'date'
31 _columns = {31 _columns = {
32 'date': fields.date('Event Start Date', readonly=True),32 'event_date': fields.date('Event Start Date', readonly=True),
33 'year': fields.char('Year', size=4, readonly=True),33 'year': fields.char('Year', size=4, readonly=True),
34 'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),34 'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
35 ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),35 ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
@@ -39,16 +39,18 @@
39 'confirm_state': fields.integer(' # No of Confirmed Registrations', size=20),39 'confirm_state': fields.integer(' # No of Confirmed Registrations', size=20),
40 'register_max': fields.integer('Maximum Registrations'),40 'register_max': fields.integer('Maximum Registrations'),
41 'nbevent': fields.integer('Number Of Events'),41 'nbevent': fields.integer('Number Of Events'),
42 'type': fields.many2one('event.type', 'Event Type'),42 'event_type': fields.many2one('event.type', 'Event Type'),
43 'state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, required=True),43 'registration_state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, required=True),
44 'event_state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, required=True),
44 'user_id': fields.many2one('res.users', 'Responsible', readonly=True),45 'user_id': fields.many2one('res.users', 'Responsible', readonly=True),
46 'user_id_registration': fields.many2one('res.users', 'Register', readonly=True),
47 'name_registration': fields.char('Register',size=45, readonly=True),
45 'speaker_id': fields.many2one('res.partner', 'Speaker', readonly=True),48 'speaker_id': fields.many2one('res.partner', 'Speaker', readonly=True),
46 'company_id': fields.many2one('res.company', 'Company', readonly=True),49 'company_id': fields.many2one('res.company', 'Company', readonly=True),
47 'product_id': fields.many2one('product.product', 'Product', readonly=True),
48 'total': fields.float('Total'),50 'total': fields.float('Total'),
49 'section_id': fields.related('event_id', 'section_id', type='many2one', relation='crm.case.section', string='Sale Team', store=True, readonly=True),51 'section_id': fields.related('event_id', 'section_id', type='many2one', relation='crm.case.section', string='Sale Team', store=True, readonly=True),
50 }52 }
51 _order = 'date desc'53 _order = 'event_date desc'
52 def init(self, cr):54 def init(self, cr):
53 """55 """
54 initialize the sql view for the event registration56 initialize the sql view for the event registration
@@ -58,75 +60,54 @@
58 cr.execute("""60 cr.execute("""
59 CREATE OR REPLACE view report_event_registration AS (61 CREATE OR REPLACE view report_event_registration AS (
60 SELECT62 SELECT
61 id,
62 event_id,63 event_id,
63 date,64 r.id,
64 user_id,65 e.date_begin AS event_date,
65 section_id,
66 company_id,
67 product_id,
68 speaker_id,
69 year,
70 month,
71 nbevent,
72 type,
73 SUM(draft_state) AS draft_state,
74 SUM(confirm_state) AS confirm_state,
75 SUM(total) AS total,
76 register_max,
77 state
78 FROM(
79 SELECT
80 MIN(e.id) AS id,
81 e.id AS event_id,
82 e.date_begin AS date,
83 e.user_id AS user_id,66 e.user_id AS user_id,
67 r.user_id AS user_id_registration,
68 r.name AS name_registration,
84 e.section_id AS section_id,69 e.section_id AS section_id,
85 e.company_id AS company_id,70 e.company_id AS company_id,
86 e.product_id AS product_id,
87 e.main_speaker_id AS speaker_id,71 e.main_speaker_id AS speaker_id,
88 to_char(e.date_begin, 'YYYY') AS year,72 to_char(e.date_begin, 'YYYY') AS year,
89 to_char(e.date_begin, 'MM') AS month,73 to_char(e.date_begin, 'MM') AS month,
90 count(e.id) AS nbevent,74 count(e.id) AS nbevent,
91 t.id AS type,75 CASE WHEN r.state IN ('draft') THEN r.nb_register ELSE 0 END AS draft_state,
92 CASE WHEN c.state IN ('draft') THEN c.nb_register ELSE 0 END AS draft_state,76 CASE WHEN r.state IN ('open','done') THEN r.nb_register ELSE 0 END AS confirm_state,
93 CASE WHEN c.state IN ('open','done') THEN c.nb_register ELSE 0 END AS confirm_state,77 e.type AS event_type,
94 CASE WHEN c.state IN ('done') THEN c.price_subtotal ELSE 0 END AS total,
95 e.register_max AS register_max,78 e.register_max AS register_max,
96 e.state AS state79 e.state AS event_state,
80 r.state AS registration_state
97 FROM81 FROM
98 event_event e82 event_event e
99 LEFT JOIN83
100 event_registration c ON (e.id=c.event_id)84 LEFT JOIN
101 LEFT JOIN85 event_registration r ON (e.id=r.event_id)
102 event_type t ON (e.type=t.id)86
103 WHERE c.active = 'true'87 WHERE r.active = 'true'
88
104 GROUP BY89 GROUP BY
105 to_char(e.date_begin, 'YYYY'),
106 to_char(e.date_begin, 'MM'),
107 c.state,
108 c.nb_register,
109 t.id, e.id, e.date_begin, e.main_speaker_id,
110 e.register_max, e.type, e.state, c.event_id, e.user_id,e.company_id,e.product_id,e.section_id,
111 to_char(e.date_begin, 'YYYY-MM-DD'), c.id, c.price_subtotal )AS foo
112 GROUP BY
113 id,
114 event_id,90 event_id,
115 date,91 user_id_registration,
116 user_id,92 e.id,
117 section_id,93 r.id,
118 company_id,94 registration_state,
119 product_id,95 r.nb_register,
120 speaker_id,96 event_type, e.id, e.date_begin, e.main_speaker_id,
97 e.register_max,event_id, e.user_id,e.company_id,e.section_id,
98 e.user_id,
99 e.section_id,
100 event_state,
101 e.company_id,
102 e.main_speaker_id,
121 year,103 year,
122 month,104 month,
123 nbevent,105 e.register_max,
124 type,106 name_registration
125 register_max,107
126 state
127 )108 )
128 """)109 """)
129110
130report_event_registration()111report_event_registration()
131112
132# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
133\ No newline at end of file113\ No newline at end of file
114# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
134115
=== modified file 'event/report/report_event_registration_view.xml'
--- event/report/report_event_registration_view.xml 2011-11-16 19:01:24 +0000
+++ event/report/report_event_registration_view.xml 2012-02-02 16:05:26 +0000
@@ -8,21 +8,23 @@
8 <field name="model">report.event.registration</field>8 <field name="model">report.event.registration</field>
9 <field name="type">tree</field>9 <field name="type">tree</field>
10 <field name="arch" type="xml">10 <field name="arch" type="xml">
11 <tree colors="blue:state == 'draft';black:state == 'confirm';gray:state in('done','cancel')" string="Events Analysis">11 <tree colors="blue:event_state == 'draft';black:event_state == 'confirm';gray:event_state in('done','cancel')" string="Events Analysis">
12 <field name="date" invisible="1"/>12 <field name="event_date" invisible="1"/>
13 <field name="user_id" invisible="1"/>13 <field name="user_id" invisible="1"/>
14 <field name="speaker_id" invisible="1"/>14 <field name="speaker_id" invisible="1"/>
15 <field name="year" invisible="1"/>15 <field name="year" invisible="1"/>
16 <field name="month" invisible="1"/>16 <field name="month" invisible="1"/>
17 <field name="event_id" invisible="1"/>17 <field name="event_id" invisible="1"/>
18 <field name="state" invisible="1"/>18 <field name="event_state" invisible="1"/>
19 <field name="type" invisible="1"/>19 <field name="event_type" invisible="1"/>
20 <field name="nbevent"/>20 <field name="nbevent"/>
21 <field name="draft_state" invisible="context.get('no_of_draft_invisible', False)"/>21 <field name="draft_state" invisible="context.get('no_of_draft_invisible', False)"/>
22 <field name="confirm_state"/>22 <field name="confirm_state"/>
23 <field name="registration_state" invisible="1"/>
24 <field name="name_registration" invisible="1"/>
25 <field name="user_id_registration" invisible="1"/>
23 <field name="register_max" invisible="context.get('max_reg_event_visible', True)"/>26 <field name="register_max" invisible="context.get('max_reg_event_visible', True)"/>
24 <field name="company_id" invisible="1"/>27 <field name="company_id" invisible="1"/>
25 <field name="product_id" invisible="1"/>
26 <field name="section_id" invisible="1"/>28 <field name="section_id" invisible="1"/>
27 <field name="total" invisible="context.get('total_invisible', True)" sum="Total"/>29 <field name="total" invisible="context.get('total_invisible', True)" sum="Total"/>
28 </tree>30 </tree>
@@ -54,33 +56,30 @@
54 <search string="Event on Registration">56 <search string="Event on Registration">
55 <group>57 <group>
56 <filter string="Year" icon="terp-go-year" name="year"58 <filter string="Year" icon="terp-go-year" name="year"
57 domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;=',time.strftime('%%Y-01-01'))]"59 domain="[('event_date','&lt;=', time.strftime('%%Y-%%m-%%d')),('event_date','&gt;=',time.strftime('%%Y-01-01'))]"
58 help="Events created in current year"/>60 help="Events created in current year"/>
59 <separator orientation="vertical"/>61 <separator orientation="vertical"/>
60 <filter string="Month" icon="terp-go-month" name="this_month"62 <filter string="Month" icon="terp-go-month" name="this_month"
61 domain="[('date','&lt;=',(datetime.date.today()+relativedelta(day=31)).strftime('%%Y-%%m-%%d')),('date','&gt;=',(datetime.date.today()-relativedelta(day=1)).strftime('%%Y-%%m-%%d'))]"63 domain="[('event_date','&lt;=',(datetime.date.today()+relativedelta(day=31)).strftime('%%Y-%%m-%%d')),('event_date','&gt;=',(datetime.date.today()-relativedelta(day=1)).strftime('%%Y-%%m-%%d'))]"
62 help="Events created in current month"/>64 help="Events created in current month"/>
63 <filter icon="terp-go-month" string=" Month-1 "65 <filter icon="terp-go-month" string=" Month-1 "
64 domain="[('date','&lt;=', (datetime.date.today() - relativedelta(day=31, months=1)).strftime('%%Y-%%m-%%d')),('date','&gt;=',(datetime.date.today() - relativedelta(day=1,months=1)).strftime('%%Y-%%m-%%d'))]"66 domain="[('event_date','&lt;=', (datetime.date.today() - relativedelta(day=31, months=1)).strftime('%%Y-%%m-%%d')),('event_date','&gt;=',(datetime.date.today() - relativedelta(day=1,months=1)).strftime('%%Y-%%m-%%d'))]"
65 help="Events created in last month"/>67 help="Events created in last month"/>
66 <separator orientation="vertical"/>68 <separator orientation="vertical"/>
67 <filter icon="terp-document-new"69 <filter icon="terp-document-new"
68 string="New"70 string="New"
69 domain="[('state','=','draft')]"71 domain="[('event_state','=','draft')]"
70 help="Events which are in New state"/>72 help="Events which are in New state"/>
71 <filter icon="terp-check"73 <filter icon="terp-check"
72 string="Confirm"74 string="Confirm"
73 domain="[('state','=','confirm')]"75 domain="[('event_state','=','confirm')]"
74 help="Events which are in confirm state"/>76 help="Events which are in confirm state"/>
75 <separator orientation="vertical"/>77 <separator orientation="vertical"/>
76 <filter icon="terp-camera_test"78 <filter icon="terp-camera_test"
77 string="Confirmed Registrations"79 string="Confirmed Registrations"
78 help="Registrations in confirmed or done state"80 help="Registrations in confirmed or done state"
79 context="{'no_of_draft_invisible':1}"/>81 context="{'no_of_draft_invisible':1}"/>
80 <filter string="Invoiced"82
81 name="invoiced"
82 icon="terp-dolar"
83 help = "Invoiced Registrations only" context="{'total_invisible':0, 'no_of_draft_invisible':1}"/>
84 <separator orientation="vertical"/>83 <separator orientation="vertical"/>
85 <field name="event_id" string="Event"/>84 <field name="event_id" string="Event"/>
86 <field name="user_id" widget="selection">85 <field name="user_id" widget="selection">
@@ -92,31 +91,39 @@
92 </group>91 </group>
93 <newline/>92 <newline/>
94 <group expand="0" string="Extended Filters..." groups="base.group_extended">93 <group expand="0" string="Extended Filters..." groups="base.group_extended">
95 <field name="type" widget="selection"/>94 <field name="event_type" widget="selection"/>
96 <field name="date"/>95 <field name="event_date"/>
97 </group>96 </group>
98 <newline/>97 <newline/>
9998
100 <group expand="1" string="Group By...">99 <group expand="1" string="Group By...">
101 <filter string="Responsible" name="user_id" icon="terp-personal" context="{'group_by': 'user_id'}"/>100 <filter string="Responsible" name="user_id" icon="terp-personal" context="{'group_by': 'user_id'}"/>
102 <filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}"/>101 <filter string="Speaker" name="speaker" icon="terp-personal+" context="{'group_by': 'speaker_id'}"/>
102 <filter string="Participant" icon="terp-personal" context="{'group_by':'name_registration'}" help="Registration contact"/>
103 <filter string="Sale Team" icon="terp-personal" context="{'group_by': 'section_id'}"/>103 <filter string="Sale Team" icon="terp-personal" context="{'group_by': 'section_id'}"/>
104 <separator orientation="vertical"/>104 <separator orientation="vertical"/>
105 <filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/>105 <filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id', 'max_reg_event_visible':0}"/>
106 <filter string="Product" icon="terp-accessories-archiver" context="{'group_by': 'product_id'}"/>106
107 <separator orientation="vertical"/>107 <separator orientation="vertical"/>
108 <filter string="Event Type" icon="terp-crm" context="{'group_by':'type'}"/>108 <filter string="Event Type" icon="terp-crm" context="{'group_by':'event_type'}"/>
109 <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}" help="Events States"/>109 <filter string="event_state" icon="terp-stock_effects-object-colorize" context="{'group_by':'event_state'}" help="Events States"/>
110 <separator orientation="vertical" groups="base.group_multi_company"/>110 <separator orientation="vertical" groups="base.group_multi_company"/>
111 <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>111 <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
112 <separator orientation="vertical" />112 <separator orientation="vertical" />
113 <filter string="Date" icon="terp-go-month"113 <filter string="Date" icon="terp-go-month"
114 domain="[]" context="{'group_by':'date'}" help="Event Beginning Date"/>114 domain="[]" context="{'group_by':'event_date'}" help="Event Beginning Date"/>
115 <filter string="Month" icon="terp-go-month"115 <filter string="Month" icon="terp-go-month"
116 domain="[]" context="{'group_by':'month'}" help="Event Beginning Date"/>116 domain="[]" context="{'group_by':'month'}" help="Event Beginning Date"/>
117 <filter string="Year" icon="terp-go-year"117 <filter string="Year" icon="terp-go-year"
118 domain="[]" context="{'group_by':'year'}" help="Event Beginning Date"/>118 domain="[]" context="{'group_by':'year'}" help="Event Beginning Date"/>
119 <filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'registration_state'}" help="Events States"/>
120 <filter string="name of the register" icon="terp-personal" context="{'group_by':'user_id_registration'}" help="Registration contact"/>
121
119 </group>122 </group>
123
124
125
126
120 </search>127 </search>
121 </field>128 </field>
122 </record>129 </record>
123130
=== modified file 'event/security/ir.model.access.csv'
--- event/security/ir.model.access.csv 2011-12-19 16:54:40 +0000
+++ event/security/ir.model.access.csv 2012-02-02 16:05:26 +0000
@@ -8,8 +8,5 @@
8access_event_registration_manager,event.registration manager,model_event_registration,marketing.group_marketing_manager,1,0,0,08access_event_registration_manager,event.registration manager,model_event_registration,marketing.group_marketing_manager,1,0,0,0
9access_crm_case_section_manager,crm.case.section manager,crm.model_crm_case_section,marketing.group_marketing_manager,1,1,1,19access_crm_case_section_manager,crm.case.section manager,crm.model_crm_case_section,marketing.group_marketing_manager,1,1,1,1
10access_product_product,product.product.product manager,product.model_product_product,marketing.group_marketing_manager,1,1,1,110access_product_product,product.product.product manager,product.model_product_product,marketing.group_marketing_manager,1,1,1,1
11access_event_registration_badge_manager,event.registration.badge manager,model_event_registration_badge,marketing.group_marketing_manager,1,1,1,1
12access_event_event_sale_salesman,event.event.sale,model_event_event,base.group_sale_salesman,1,0,0,011access_event_event_sale_salesman,event.event.sale,model_event_event,base.group_sale_salesman,1,0,0,0
13access_account_account_invoice_manager,account.account.invoice,account.model_account_invoice,marketing.group_marketing_manager,1,0,0,0
14access_event_registration_badge,event.registration.badge,model_event_registration_badge,marketing.group_marketing_user,1,0,0,0
15access_event_registration_sale_user,event.registration.sale.user,model_event_registration,base.group_sale_salesman,1,0,0,012access_event_registration_sale_user,event.registration.sale.user,model_event_registration,base.group_sale_salesman,1,0,0,0
1613
=== modified file 'event/test/process/partner_register2invoice.yml'
--- event/test/process/partner_register2invoice.yml 2011-11-15 09:18:56 +0000
+++ event/test/process/partner_register2invoice.yml 2012-02-02 16:05:26 +0000
@@ -22,41 +22,11 @@
22- 22-
23 !assert {model: event.registration, id: reg_1_1}: 23 !assert {model: event.registration, id: reg_1_1}:
24 - state == 'open', "Registration should be open here."24 - state == 'open', "Registration should be open here."
25-25
26 After confirmation of partner, I create invoice base on costing of event. 26-
27-27 I Check that Registration is close.
28 !python {model: event.registration}: |28-
29 self.action_invoice_create(cr, uid, [ref("reg_1_1")])29 !assert {model: event.registration, id: reg_1_1}:
30-30 - state == 'done', "Registration should be done here."
31 Now I Check for Invoice is created and Registration should be closed after invoice generated.31
32- 32
33 !python {model: event.registration}: |
34 record = self.browse(cr, uid, [ref("reg_1_1")])[0]
35 assert record.invoice_id, "Invoice should be generated"
36 assert record.invoice_id.state == "draft", "Invoice state should be draft"
37 assert record.invoice_id.partner_id == record.partner_id, "Customer is not correspond with registration"
38 assert record.invoice_id.type == 'out_invoice', "Invoice type is not correct"
39 assert record.invoice_id.origin == record.event_product, "Invoice origin is not correct"
40 assert record.invoice_id.amount_total == record.price_subtotal, "Invoice amount is not correct"
41 assert record.state == "done", "Registration should be closed after invoice generated"
42-
43 Now I check for same partner registration for two diffrent event and I create group invoices for same partner.
44-
45 !python {model: event.make.invoice}: |
46 context.update({'active_model': 'event.make.invoice', 'active_ids': [ref("reg_0_1"), ref("reg_0_2")], 'active_id': ref("reg_0_1")})
47 invoice = self.create(cr, uid, {'grouped': True}, context=context)
48 self.make_invoice(cr, uid, [invoice], context=context)
49-
50 Now I Check for group Invoice is created with total amount of both registration
51 and Registration should be closed after invoice generated.
52-
53 !python {model: event.registration}: |
54 reg_data_1 = self.browse(cr, uid, [ref("reg_0_1")])[0]
55 reg_data_2 = self.browse(cr, uid, [ref("reg_0_2")])[0]
56 assert reg_data_1.invoice_id, "Invoice should be generated"
57 assert reg_data_1.invoice_id.state == "draft", "Invoice state should be draft"
58 assert reg_data_1.invoice_id.partner_id == reg_data_1.partner_id, "Customer is not correspond with registration"
59 assert reg_data_1.invoice_id.type == 'out_invoice', "Invoice type is not correct"
60 assert reg_data_1.invoice_id.origin == reg_data_1.event_product, "Invoice origin is not correct"
61 assert reg_data_1.invoice_id.amount_total == (reg_data_1.price_subtotal + reg_data_2.price_subtotal), "Invoice total amount is not correct"
62 assert reg_data_1.state == "done", "Registration should be closed after invoice generated"
6333
=== modified file 'event/wizard/__init__.py'
--- event/wizard/__init__.py 2011-09-07 17:25:00 +0000
+++ event/wizard/__init__.py 2012-02-02 16:05:26 +0000
@@ -19,7 +19,7 @@
19#19#
20##############################################################################20##############################################################################
2121
22import event_make_invoice22
23import event_confirm_registration23import event_confirm_registration
24import event_confirm24import event_confirm
25import partner_event_registration25import partner_event_registration
2626
=== modified file 'event/wizard/event_confirm_registration.py'
--- event/wizard/event_confirm_registration.py 2011-01-14 00:11:01 +0000
+++ event/wizard/event_confirm_registration.py 2012-02-02 16:05:26 +0000
@@ -36,35 +36,11 @@
36 'msg': 'The event limit is reached. What do you want to do?'36 'msg': 'The event limit is reached. What do you want to do?'
37 }37 }
3838
39 def default_get(self, cr, uid, fields, context=None):39
40 """
41 This function gets default values
42 """
43 if context is None:
44 context = {}
45 registration_pool = self.pool.get('event.registration')
46 registration_ids = context.get('registration_ids', [])
47 res = super(event_confirm_registration, self).default_get(cr, uid, fields, context=context)
48 msg = ""
49 overlimit_event_ids = []
50 for registration in registration_pool.browse(cr, uid, registration_ids, context=context):
51 register_max = registration.event_id.register_max
52 if registration.event_id.id not in overlimit_event_ids:
53 overlimit_event_ids.append(registration.event_id.id)
54 msg += _("Warning: The Event '%s' has reached its Maximum Limit (%s).") \
55 %(registration.event_id.name, register_max)
56 if 'msg' in fields:
57 res.update({'msg': msg})
58 return res
5940
60 def confirm(self, cr, uid, ids, context=None):41 def confirm(self, cr, uid, ids, context=None):
61 if context is None:
62 context = {}
63 registration_pool = self.pool.get('event.registration')
64 registration_ids = context.get('registration_ids', [])
65 registration_pool.do_open(cr, uid, registration_ids, context=context)
66 return {'type': 'ir.actions.act_window_close'}42 return {'type': 'ir.actions.act_window_close'}
6743
68event_confirm_registration()44event_confirm_registration()
6945
70# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
71\ No newline at end of file46\ No newline at end of file
47# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
7248
=== removed file 'event/wizard/event_make_invoice.py'
--- event/wizard/event_make_invoice.py 2011-01-14 00:11:01 +0000
+++ event/wizard/event_make_invoice.py 1970-01-01 00:00:00 +0000
@@ -1,95 +0,0 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6#
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.
11#
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.
16#
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/>.
19#
20##############################################################################
21
22from osv import fields, osv
23from tools.translate import _
24
25class event_make_invoice(osv.osv_memory):
26 """
27 Make Invoices
28 """
29 _name = "event.make.invoice"
30 _description = "Event Make Invoice"
31 _columns = {
32 'grouped': fields.boolean('Group the invoices'),
33 'invoice_date': fields.date('Invoice Date'),
34 }
35
36 def view_init(self, cr, uid, fields, context=None):
37 """
38 This function checks for precondition before wizard executes
39 @param self: The object pointer
40 @param cr: the current row, from the database cursor,
41 @param uid: the current user’s ID for security checks,
42 @param fields: List of fields for default value
43 @param context: A standard dictionary for contextual values
44 """
45 obj_event_reg = self.pool.get('event.registration')
46 data = context and context.get('active_ids', [])
47
48 for event_reg in obj_event_reg.browse(cr, uid, data, context=context):
49 if event_reg.state in ('draft', 'done', 'cancel'):
50 raise osv.except_osv(_('Warning !'),
51 _("Invoice cannot be created if the registration is in %s state.") % (event_reg.state))
52
53 if (not event_reg.tobe_invoiced):
54 raise osv.except_osv(_('Warning !'),
55 _("Registration is set as Cannot be invoiced"))
56
57 if not event_reg.event_id.product_id:
58 raise osv.except_osv(_('Warning !'),
59 _("Event related doesn't have any product defined"))
60
61 if not event_reg.partner_invoice_id:
62 raise osv.except_osv(_('Warning !'),
63 _("Registration doesn't have any partner to invoice."))
64
65 def default_get(self, cr, uid, fields_list, context=None):
66 return super(event_make_invoice, self).default_get(cr, uid, fields_list, context=context)
67
68 def make_invoice(self, cr, uid, ids, context=None):
69 reg_obj = self.pool.get('event.registration')
70 mod_obj = self.pool.get('ir.model.data')
71 if context is None:
72 context = {}
73
74 for data in self.browse(cr, uid, ids, context=context):
75 res = reg_obj.action_invoice_create(cr, uid, context.get(('active_ids'),[]), data.grouped, date_inv = data.invoice_date)
76
77 form_id = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_form')
78 form_res = form_id and form_id[1] or False
79 tree_id = mod_obj.get_object_reference(cr, uid, 'account', 'invoice_tree')
80 tree_res = tree_id and tree_id[1] or False
81 return {
82 'domain': "[('id', 'in', %s)]" % res,
83 'name': _('Customer Invoices'),
84 'view_type': 'form',
85 'view_mode': 'tree,form',
86 'res_model': 'account.invoice',
87 'view_id': False,
88 'views': [(tree_res, 'tree'), (form_res, 'form')],
89 'context': "{'type':'out_refund'}",
90 'type': 'ir.actions.act_window',
91 }
92
93event_make_invoice()
94
95# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
960
=== removed file 'event/wizard/event_make_invoice_view.xml'
--- event/wizard/event_make_invoice_view.xml 2011-01-14 00:11:01 +0000
+++ event/wizard/event_make_invoice_view.xml 1970-01-01 00:00:00 +0000
@@ -1,40 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="view_event_make_invoice" model="ir.ui.view">
6 <field name="name">event.make.invoice</field>
7 <field name="model">event.make.invoice</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Create invoices">
11 <separator colspan="4" string="Do you really want to create the invoice(s) ?" />
12 <field name="grouped" />
13 <field name="invoice_date"/>
14 <group colspan="4">
15 <separator string="" colspan="4" />
16 <label string="" colspan="2"/>
17 <button special="cancel" string="Close" icon="gtk-close"/>
18 <button name="make_invoice" string="Done" type="object" icon="gtk-ok"/>
19 </group>
20 </form>
21 </field>
22 </record>
23
24 <record id="action_event_confirm_registration" model="ir.actions.act_window">
25 <field name="name">Make Invoices</field>
26 <field name="type">ir.actions.act_window</field>
27 <field name="res_model">event.make.invoice</field>
28 <field name="view_type">form</field>
29 <field name="view_mode">form</field>
30 <field name="view_id" ref="view_event_make_invoice"/>
31 <field name="target">new</field>
32 </record>
33
34 <act_window id="action_make_invoices"
35 key2 = "client_action_multi" name="Make Invoice"
36 res_model="event.make.invoice" src_model="event.registration"
37 view_mode="form" target="new" view_type="form" />
38
39 </data>
40</openerp>
410
=== modified file 'event/wizard/partner_event_registration.py'
--- event/wizard/partner_event_registration.py 2011-12-19 16:54:40 +0000
+++ event/wizard/partner_event_registration.py 2012-02-02 16:05:26 +0000
@@ -76,7 +76,6 @@
76 'event_id': current.event_id and current.event_id.id or False,76 'event_id': current.event_id and current.event_id.id or False,
77 'unit_price': current.unit_price,77 'unit_price': current.unit_price,
78 'partner_id': partner.id,78 'partner_id': partner.id,
79 'partner_invoice_id': partner.id,
80 'event_product': current.event_id.product_id.name,79 'event_product': current.event_id.product_id.name,
81 'contact_id': contact_id,80 'contact_id': contact_id,
82 'email_from': email,81 'email_from': email,

Subscribers

People subscribed via source and target branches

to all changes: