diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 4445b8bd330..115df33085b 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -201,17 +201,18 @@ class account_invoice(osv.osv): 'state': fields.selection([ ('draft','Draft'), - ('cancel','Cancelled'), ('proforma','Pro-forma'), ('proforma2','Pro-forma'), ('open','Open'), - ('paid','Paid') - ],'Status', select=True, readonly=True, + ('paid','Paid'), + ('cancel','Cancelled'), + ],'State', select=True, readonly=True, help=' * The \'Draft\' state is used when a user is encoding a new and unconfirmed Invoice. \ \n* The \'Pro-forma\' when invoice is in Pro-forma state,invoice does not have an invoice number. \ \n* The \'Open\' state is used when user create invoice,a invoice number is generated.Its in open state till user does not pay invoice. \ \n* The \'Paid\' state is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled. \ \n* The \'Cancelled\' state is used when user cancel invoice.'), + 'sent': fields.boolean('Sent', readonly=True, help="It indicates that the invoice has been sent."), 'date_invoice': fields.date('Invoice Date', readonly=True, states={'draft':[('readonly',False)]}, select=True, help="Keep empty to use the current date"), 'date_due': fields.date('Due Date', states={'paid':[('readonly',True)], 'open':[('readonly',True)], 'close':[('readonly',True)]}, select=True, help="If you use payment terms, the due date will be computed automatically at the generation "\ @@ -286,6 +287,7 @@ class account_invoice(osv.osv): 'check_total': 0.0, 'internal_number': False, 'user_id': lambda s, cr, u, c: u, + 'sent': False, } _sql_constraints = [ ('number_uniq', 'unique(number, company_id, journal_id, type)', 'Invoice Number must be unique per Company!'), @@ -366,6 +368,47 @@ class account_invoice(osv.osv): else: raise orm.except_orm(_('Unknown Error'), str(e)) + def invoice_print(self, cr, uid, ids, context=None): + ''' + This function prints the invoice and mark it as sent, so that we can see more easily the next step of the workflow + ''' + assert len(ids) == 1, 'This option should only be used for a single id at a time' + self.write(cr, uid, ids, {'sent': True}, context=context) + datas = { + 'ids': ids, + 'model': 'account.invoice', + 'form': self.read(cr, uid, ids[0], context=context) + } + return { + 'type': 'ir.actions.report.xml', + 'report_name': 'account.invoice', + 'datas': datas, + 'nodestroy' : True + } + + def action_invoice_sent(self, cr, uid, ids, context=None): + ''' + This function opens a window to compose an email, with the edi invoice template message loaded by default + ''' + mod_obj = self.pool.get('ir.model.data') + template = mod_obj.get_object_reference(cr, uid, 'account', 'email_template_edi_invoice') + template_id = template and template[1] or False + res = mod_obj.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form') + res_id = res and res[1] or False + ctx = dict(context, active_model='account.invoice', active_id=ids[0]) + ctx.update({'mail.compose.template_id': template_id}) + return { + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'mail.compose.message', + 'views': [(res_id, 'form')], + 'view_id': res_id, + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': ctx, + 'nodestroy': True, + } + def confirm_paid(self, cr, uid, ids, context=None): if context is None: context = {} @@ -604,6 +647,7 @@ class account_invoice(osv.osv): 'move_name':False, 'internal_number': False, 'period_id': False, + 'sent': False, }) if 'date_invoice' not in default: default.update({ @@ -1664,4 +1708,14 @@ class res_partner(osv.osv): res_partner() +class mail_message(osv.osv): + _name = 'mail.message' + _inherit = 'mail.message' + + def _postprocess_sent_message(self, cr, uid, message, context=None): + if message.model == 'account.invoice': + self.pool.get('account.invoice').write(cr, uid, [message.res_id], {'sent':True}, context=context) + return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) + +mail_message() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 5fc687e0bd0..3810bcf5de8 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -146,11 +146,11 @@
- @@ -19,7 +19,7 @@ diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index 349d4e70ed7..3b33143648b 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -43,7 +43,7 @@
- + - + + + Leads + crm.lead + tree + + + + + + + + + + + + + + + + + + +
-

Order :

+ +

Quotation :

+
+ +

Request for Quotation :

+
+ +

Order :

+
@@ -116,7 +124,7 @@ - +

Pay Online

diff --git a/addons/email_template/i18n/ja.po b/addons/email_template/i18n/ja.po index ca2abdc61d3..60b491ad0c2 100644 --- a/addons/email_template/i18n/ja.po +++ b/addons/email_template/i18n/ja.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-02-08 00:36+0000\n" -"PO-Revision-Date: 2012-05-10 18:28+0000\n" -"Last-Translator: Raphael Collet (OpenERP) \n" +"PO-Revision-Date: 2012-05-25 04:53+0000\n" +"Last-Translator: Akira Hiyama \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-05-11 05:11+0000\n" -"X-Generator: Launchpad (build 15225)\n" +"X-Launchpad-Export-Date: 2012-05-26 05:07+0000\n" +"X-Generator: Launchpad (build 15288)\n" #. module: email_template #: field:email.template,subtype:0 @@ -408,7 +408,7 @@ msgstr "Eメールを送信する (%s)" #: field:email.template,body_html:0 #: field:email_template.preview,body_html:0 msgid "Rich-text Contents" -msgstr "リッチテキストの内容" +msgstr "リッチテキストのコンテンツ" #. module: email_template #: field:email.template,copyvalue:0 diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 5a829f63f43..f1a9769f803 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -1,3 +1,4 @@ + # -*- coding: utf-8 -*- ############################################################################## # @@ -38,7 +39,7 @@ Note that: Association / Configuration / Types of Events """, 'author': 'OpenERP SA', - 'depends': ['email_template'], + 'depends': ['email_template','google_map'], 'init_xml': [], 'update_xml': [ 'security/event_security.xml', diff --git a/addons/event/event.py b/addons/event/event.py index 218776b021d..a348e005d06 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -112,6 +112,14 @@ class event_event(osv.osv): if total_confirmed < self.event.register_min or total_confirmed > self.event.register_max and self.event.register_max!=0: 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") % (self.event.name)) + def check_registration_limits_before(self, cr, uid, ids, no_of_registration, context=None): + for event in self.browse(cr, uid, ids, context=context): + available_seats = event.register_avail + if available_seats and no_of_registration > available_seats: + raise osv.except_osv(_('Warning!'),_("Only %d Seats are Available!") % (available_seats)) + elif available_seats == 0: + raise osv.except_osv(_('Warning!'),_("No Tickets Available!")) + def confirm_event(self, cr, uid, ids, context=None): register_pool = self.pool.get('event.registration') if self.event.email_confirmation_id: @@ -189,7 +197,7 @@ class event_event(osv.osv): 'register_current': fields.function(_get_register, string='Confirmed Registrations', multi='register_numbers'), 'register_avail': fields.function(_get_register, string='Available Registrations', multi='register_numbers',type='integer'), 'register_prospect': fields.function(_get_register, string='Unconfirmed Registrations', multi='register_numbers'), - 'register_attended': fields.function(_get_register, string='Attended Registrations', multi='register_numbers'), + 'register_attended': fields.function(_get_register, string='# of Participations', multi='register_numbers'), 'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}), 'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}), 'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}), @@ -205,7 +213,6 @@ class event_event(osv.osv): 'full_name' : fields.function(_name_get_fnc, type="char", string='Name'), 'reply_to': fields.char('Reply-To Email', size=64, readonly=False, states={'done': [('readonly', True)]}, help="The email address of the organizer is likely to be put here, with the effect to be in the 'Reply-To' of the mails sent automatically at event or registrations confirmation. You can also put the email address of your mail gateway if you use one."), '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."), - 'speaker_ids': fields.many2many('res.partner', 'event_speaker_rel', 'speaker_id', 'partner_id', 'Other Speakers', readonly=False, states={'done': [('readonly', True)]}), 'address_id': fields.many2one('res.partner','Location Address', readonly=False, states={'done': [('readonly', True)]}), 'speaker_confirmed': fields.boolean('Speaker Confirmed', readonly=False, states={'done': [('readonly', True)]}), 'country_id': fields.related('address_id', 'country_id', @@ -214,21 +221,23 @@ class event_event(osv.osv): 'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}), 'is_subscribed' : fields.function(_subscribe_fnc, type="boolean", string='Subscribed'), } - _defaults = { 'state': 'draft', 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'event.event', context=c), 'user_id': lambda obj, cr, uid, context: uid, } - def subscribe_to_event(self, cr, uid, ids, context=None): register_pool = self.pool.get('event.registration') user_pool = self.pool.get('res.users') + num_of_seats = int(context.get('ticket', 1)) + self.check_registration_limits_before(cr, uid, ids, num_of_seats, context=context) user = user_pool.browse(cr, uid, uid, context=context) curr_reg_ids = register_pool.search(cr, uid, [('user_id', '=', user.id), ('event_id', '=' , ids[0])]) #the subscription is done with UID = 1 because in case we share the kanban view, we want anyone to be able to subscribe if not curr_reg_ids: - curr_reg_ids = [register_pool.create(cr, 1, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id,})] + curr_reg_ids = [register_pool.create(cr, 1, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})] + else: + register_pool.write(cr, uid, curr_reg_ids, {'nb_register': num_of_seats}, context=context) return register_pool.confirm_registration(cr, 1, curr_reg_ids, context=context) def unsubscribe_to_event(self, cr, uid, ids, context=None): @@ -246,7 +255,6 @@ class event_event(osv.osv): _constraints = [ (_check_closing_date, 'Error ! Closing Date cannot be set before Beginning Date.', ['date_end']), ] - def onchange_event_type(self, cr, uid, ids, type_event, context=None): if type_event: type_info = self.pool.get('event.type').browse(cr,uid,type_event,context) @@ -347,6 +355,11 @@ class event_registration(osv.osv): def registration_open(self, cr, uid, ids, context=None): """ Open Registration """ + event_obj = self.pool.get('event.event') + for register in self.browse(cr, uid, ids, context=context): + event_id = register.event_id.id + no_of_registration = register.nb_register + event_obj.check_registration_limits_before(cr, uid, [event_id], no_of_registration, context=context) res = self.confirm_registration(cr, uid, ids, context=context) self.mail_user(cr, uid, ids, context=context) return res @@ -457,5 +470,4 @@ class event_registration(osv.osv): event_registration() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event/event_demo.xml b/addons/event/event_demo.xml index 96bc64e12aa..81dad07b5e4 100644 --- a/addons/event/event_demo.xml +++ b/addons/event/event_demo.xml @@ -38,16 +38,16 @@ Opera of Verdi - - + + 50 350 Conference on ERP Business - - + + 200 diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index 0542f436cd9..ec326d282d4 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -50,10 +50,10 @@ event.event form -
+
- @@ -494,7 +495,7 @@ tree,form,calendar,graph {} - + view_ -
@@ -304,18 +315,22 @@ - -