diff --git a/addons/account/account.py b/addons/account/account.py index e11479e4dc0..57356f7d3ef 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -111,7 +111,7 @@ class account_payment_term_line(osv.osv): 'days': fields.integer('Number of Days', required=True, help="Number of days to add before computation of the day of month." \ "If Date=15/01, Number of Days=22, Day of Month=-1, then the due date is 28/02."), 'days2': fields.integer('Day of the Month', required=True, help="Day of the month, set -1 for the last day of the current month. If it's positive, it gives the day of the next month. Set 0 for net days (otherwise it's based on the beginning of the month)."), - 'payment_id': fields.many2one('account.payment.term', 'Payment Term', required=True, select=True), + 'payment_id': fields.many2one('account.payment.term', 'Payment Term', required=True, select=True, ondelete='cascade'), } _defaults = { 'value': 'balance', @@ -1375,7 +1375,7 @@ class account_move(osv.osv): balance = 0.0 for line in line_ids: if line[2]: - balance += (line[2]['debit'] or 0.00)- (line[2]['credit'] or 0.00) + balance += (line[2].get('debit',0.00)- (line[2].get('credit',0.00))) return {'value': {'balance': balance}} def write(self, cr, uid, ids, vals, context=None): @@ -1398,7 +1398,7 @@ class account_move(osv.osv): if not l[0]: l[2].update({ 'reconcile_id':False, - 'reconcil_partial_id':False, + 'reconcile_partial_id':False, 'analytic_lines':False, 'invoice':False, 'ref':False, @@ -2999,6 +2999,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): _columns = { 'company_id':fields.many2one('res.company', 'Company', required=True), + 'currency_id': fields.many2one('res.currency', 'Currency', help="Currency as per company's country."), 'only_one_chart_template': fields.boolean('Only One Chart Template Available'), 'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', required=True), 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Cash and Banks', required=True), @@ -3009,6 +3010,13 @@ class wizard_multi_charts_accounts(osv.osv_memory): 'purchase_tax_rate': fields.float('Purchase Tax(%)'), 'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sales and purchase rates or use the usual m2o fields. This last choice assumes that the set of tax defined for the chosen template is complete'), } + + def onchange_company_id(self, cr, uid, ids, company_id, context=None): + currency_id = False + if company_id: + currency_id = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id.id + return {'value': {'currency_id': currency_id}} + def onchange_tax_rate(self, cr, uid, ids, rate=False, context=None): return {'value': {'purchase_tax_rate': rate or False}} @@ -3039,6 +3047,13 @@ class wizard_multi_charts_accounts(osv.osv_memory): res.update({'bank_accounts_id': [{'acc_name': _('Cash'), 'account_type': 'cash'},{'acc_name': _('Bank'), 'account_type': 'bank'}]}) if 'company_id' in fields: res.update({'company_id': self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0].company_id.id}) + if 'currency_id' in fields: + company_id = res.get('company_id') or False + if company_id: + company_obj = self.pool.get('res.company') + country_id = company_obj.browse(cr, uid, company_id, context=context).country_id.id + currency_id = company_obj.on_change_country(cr, uid, company_id, country_id, context=context)['value']['currency_id'] + res.update({'currency_id': currency_id}) ids = self.pool.get('account.chart.template').search(cr, uid, [('visible', '=', True)], context=context) if ids: @@ -3343,6 +3358,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): ir_values_obj = self.pool.get('ir.values') obj_wizard = self.browse(cr, uid, ids[0]) company_id = obj_wizard.company_id.id + self.pool.get('res.company').write(cr, uid, [company_id], {'currency_id': obj_wizard.currency_id.id}) # If the floats for sale/purchase rates have been filled, create templates from them self._create_tax_templates_from_rates(cr, uid, obj_wizard, company_id, context=context) diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 8df291a98d1..095d461ff3b 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -430,7 +430,7 @@ class account_bank_statement(osv.osv): 'name': st_number, 'balance_end_real': st.balance_end }, context=context) - self.message_append_note(cr, uid, [st.id], body=_('Statement %s is confirmed, journal items are created.') % (st_number,), context=context) + self.message_post(cr, uid, [st.id], body=_('Statement %s confirmed, journal items were created.') % (st_number,), context=context) return self.write(cr, uid, ids, {'state':'confirm'}, context=context) def button_cancel(self, cr, uid, ids, context=None): diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 78ef090ebbe..42d42e7ec1b 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -214,7 +214,7 @@ class account_invoice(osv.osv): \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, + 'date_due': fields.date('Due Date', readonly=True, states={'draft':[('readonly',False)]}, select=True, help="If you use payment terms, the due date will be computed automatically at the generation "\ "of accounting entries. If you keep the payment term and the due date empty, it means direct payment. The payment term may compute several due dates, for example 50% now, 50% in one month."), 'partner_id': fields.many2one('res.partner', 'Partner', change_default=True, readonly=True, required=True, states={'draft':[('readonly',False)]}), @@ -253,7 +253,7 @@ class account_invoice(osv.osv): 'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'journal_id': fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'company_id': fields.many2one('res.company', 'Company', required=True, change_default=True, readonly=True, states={'draft':[('readonly',False)]}), - 'check_total': fields.float('Verification Total', digits_compute=dp.get_precision('Account'), states={'open':[('readonly',True)],'close':[('readonly',True)]}), + 'check_total': fields.float('Verification Total', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft':[('readonly',False)]}), 'reconciled': fields.function(_reconciled, string='Paid/Reconciled', type='boolean', store={ 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 50), # Check if we can remove ? @@ -1045,7 +1045,7 @@ class account_invoice(osv.osv): if obj_inv.type in ('out_invoice', 'out_refund'): ctx = self.get_log_context(cr, uid, context=ctx) message = _("Invoice '%s' is validated.") % name - self.message_append_note(cr, uid, [inv_id], body=message, context=context) + self.message_post(cr, uid, [inv_id], body=message, context=context) return True def action_cancel(self, cr, uid, ids, *args): @@ -1275,7 +1275,7 @@ class account_invoice(osv.osv): # TODO: use currency's formatting function msg = _("Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining).") % \ (name, pay_amount, code, invoice.amount_total, code, total, code) - self.message_append_note(cr, uid, [inv_id], body=msg, context=context) + self.message_post(cr, uid, [inv_id], body=msg, context=context) self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context) # Update the stored value (fields.function), so we write to trigger recompute @@ -1288,24 +1288,25 @@ class account_invoice(osv.osv): def _get_document_type(self, type): type_dict = { - 'out_invoice': 'Customer invoice', - 'in_invoice': 'Supplier invoice', - 'out_refund': 'Customer Refund', - 'in_refund': 'Supplier Refund', + # Translation markers will have no effect at runtime, only used to properly flag export + 'out_invoice': _('Customer invoice'), + 'in_invoice': _('Supplier invoice'), + 'out_refund': _('Customer Refund'), + 'in_refund': _('Supplier Refund'), } return type_dict.get(type, 'Invoice') def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id],body=_("%s created.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s created.") % (_(self._get_document_type(obj.type))), context=context) def confirm_paid_send_note(self, cr, uid, ids, context=None): - for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s paid.") % (self._get_document_type(obj.type)), context=context) + for obj in self.browse(cr, uid, ids, context=context): + self.message_post(cr, uid, [obj.id], body=_("%s paid.") % (_(self._get_document_type(obj.type))), context=context) def invoice_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (_(self._get_document_type(obj.type))), context=context) account_invoice() diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 81e683e1cfd..e3c5c211990 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -2371,8 +2371,10 @@
+
+ diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py index d151d2171a4..1e84681b1ea 100644 --- a/addons/account_followup/wizard/account_followup_print.py +++ b/addons/account_followup/wizard/account_followup_print.py @@ -213,8 +213,6 @@ class account_followup_print_all(osv.osv_memory): mod_obj = self.pool.get('ir.model.data') move_obj = self.pool.get('account.move.line') user_obj = self.pool.get('res.users') - line_obj = self.pool.get('account_followup.stat') - mail_message = self.pool.get('mail.message') if context is None: context = {} @@ -235,13 +233,7 @@ class account_followup_print_all(osv.osv_memory): total_amt += line.debit - line.credit dest = False if partner: - if partner.type=='contact': - if adr.email: - dest = [partner.email] - if (not dest) and partner.type=='default': - if partner.email: - dest = [partner.email] - src = tools.config.options['email_from'] + dest = [partner.email] if not data.partner_lang: body = data.email_body else: @@ -281,7 +273,12 @@ class account_followup_print_all(osv.osv_memory): msg = '' if dest: try: - mail_message.schedule_with_attach(cr, uid, src, dest, sub, body, context=context) + vals = {'state': 'outgoing', + 'subject': sub, + 'body_html': '
%s
' % body, + 'email_to': dest, + 'email_from': data_user.email or tools.config.options['email_from']} + self.pool.get('mail.mail').create(cr, uid, vals, context=context) msg_sent += partner.name + '\n' except Exception, e: raise osv.except_osv('Error !', e ) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 223705af85e..f75cda8cdde 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1293,17 +1293,17 @@ class account_voucher(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s created." % self._document_type[obj.type or False] - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) def post_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s '%s' is posted." % (self._document_type[obj.type or False], obj.move_id.name) - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) def reconcile_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s reconciled." % self._document_type[obj.type or False] - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) account_voucher() diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index 8be2851a434..656d2c2cd91 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -2,15 +2,16 @@ - - - - Module eInvoicing & Payments has been installed. - OpenERP's electronic invoicing allows to ease and fasten the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system. + + mail.group + + notification + eInvoicing & Payments application installed! + OpenERP's electronic invoicing accelerates the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system. -You can track customer payments easily and automate the reminders. You get an overview of the discussion with your customers on each invoice to ensure a full traceability. +You can track customer payments easily and automate follow-ups. You get an overview of the discussion with your customers on each invoice for easier traceability. -If you want to use advanced accounting features, you should install the "Accounting and Finance" module. - +For advanced accounting features, you should install the "Accounting and Finance" module. + diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 7eeb9266e47..d90e2006a71 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -297,7 +297,7 @@ class account_analytic_account(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), context=context) + self.message_post(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), context=context) account_analytic_account() diff --git a/addons/auth_reset_password/auth_reset_password.xml b/addons/auth_reset_password/auth_reset_password.xml index 26ea8878c45..b7d7e0baef6 100644 --- a/addons/auth_reset_password/auth_reset_password.xml +++ b/addons/auth_reset_password/auth_reset_password.xml @@ -9,16 +9,13 @@ ]]> Password reset - A password reset was requested the OpenERP account linked to this email on ${object._auth_reset_password_host()}

-You may change your password following this link: +

You may change your password following this link, +or by copy-pasting the following URL in your browser: ${object._auth_reset_password_link()}

-${object._auth_reset_password_link()} - -If you don't have asked for password reset, you can safely ignore this email. - -]]>
+

Note: If you did not ask for a password reset, you can safely ignore this email.

]]> diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index b6eacda63c0..7e9bbacab13 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -302,33 +302,27 @@ the rule to mark CC(mail to any other person defined in actions)."), return self.format_body(body % data) def email_send(self, cr, uid, obj, emails, body, emailfrom=None, context=None): - """ send email - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param email: pass the emails - @param emailfrom: Pass name the email From else False - @param context: A standard dictionary for contextual values """ - if not emailfrom: - emailfrom = tools.config.get('email_from', False) - - if context is None: - context = {} - - mail_message = self.pool.get('mail.message') + emailfrom = tools.config.get('email_from') body = self.format_mail(obj, body) - if not emailfrom: - if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: - emailfrom = obj.user_id.email - - name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) + if not emailfrom and hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: + emailfrom = obj.user_id.email emailfrom = tools.ustr(emailfrom) reply_to = emailfrom if not emailfrom: raise osv.except_osv(_('Error!'), - _("No email ID found for your company address.")) - return mail_message.schedule_with_attach(cr, uid, emailfrom, emails, name, body, model='base.action.rule', reply_to=reply_to, res_id=obj.id) + _("Missing default email address or missing email on responsible user")) + return self.pool.get('mail.mail').create(cr, uid, + { 'email_from': emailfrom, + 'email_to': emails.join(','), + 'reply_to': reply_to, + 'state': 'outgoing', + 'subject': '[%d] %s' % (obj.id, tools.ustr(obj.name)), + 'body_html': '
%s
' % body, + 'res_id': obj.id, + 'model': obj._table_name, + 'auto_delete': True + }, context=context) def do_check(self, cr, uid, action, obj, context=None): @@ -438,11 +432,8 @@ the rule to mark CC(mail to any other person defined in actions)."), if len(emails) and action.act_mail_body: emails = list(set(emails)) email_from = safe_eval(action.act_email_from, {}, locals_for_emails) - - def to_email(text): - return re.findall(r'([^ ,<@]+@[^> ,]+)', text or '') - emails = to_email(','.join(filter(None, emails))) - email_froms = to_email(email_from) + emails = tools.email_split(','.join(filter(None, emails))) + email_froms = tools.email_split(email_from) if email_froms: self.email_send(cr, uid, obj, emails, action.act_mail_body, emailfrom=email_froms[0]) return True diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index be3244f8a5b..a6d5f6859af 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -471,18 +471,10 @@ property or property parameter."), def _send_mail(self, cr, uid, ids, mail_to, email_from=tools.config.get('email_from', False), context=None): """ Send mail for event invitation to event attendees. - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of attendee’s IDs. @param email_from: Email address for user sending the mail - @param context: A standard dictionary for contextual values @return: True """ - if context is None: - context = {} - company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.name - mail_message = self.pool.get('mail.message') for att in self.browse(cr, uid, ids, context=context): sign = att.sent_by_uid and att.sent_by_uid.signature or '' sign = '
'.join(sign and sign.split('\n') or []) @@ -508,17 +500,18 @@ property or property parameter."), } body = html_invitation % body_vals if mail_to and email_from: - attach = self.get_ics_file(cr, uid, res_obj, context=context) - mail_message.schedule_with_attach(cr, uid, - email_from, - mail_to, - sub, - body, - attachments=attach and {'invitation.ics': attach} or None, - content_subtype='html', - reply_to=email_from, - context=context - ) + ics_file = self.get_ics_file(cr, uid, res_obj, context=context) + vals = {'email_from': email_from, + 'email_to': mail_to, + 'state': 'outgoing', + 'subject': sub, + 'body_html': body, + 'auto_delete': True} + if ics_file: + vals['attachment_ids'] = [(0,0,{'name': 'invitation.ics', + 'datas_fname': 'invitation.ics', + 'datas': str(ics_file).encode('base64')})] + self.pool.get('mail.mail').create(cr, uid, vals, context=context) return True def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv): @@ -812,7 +805,6 @@ class calendar_alarm(osv.osv): """ if context is None: context = {} - mail_message = self.pool.get('mail.message') current_datetime = datetime.now() alarm_ids = self.search(cr, uid, [('state', '!=', 'done')], context=context) @@ -849,36 +841,10 @@ class calendar_alarm(osv.osv): else: re_dates = [alarm.trigger_date] - for r_date in re_dates: - ref = alarm.model_id.model + ',' + str(alarm.res_id) - - # search for alreay sent requests - #if request_obj.search(cr, uid, [('trigger_date', '=', r_date), ('ref_doc1', '=', ref)], context=context): - #continue - - # Deactivated because of the removing of res.request - # TODO: when cleaning calendar module, re-add this in a new mechanism - #if alarm.action == 'display': - #value = { - #'name': alarm.name, - #'act_from': alarm.user_id.id, - #'act_to': alarm.user_id.id, - #'body': alarm.description, - #'trigger_date': r_date, - #'ref_doc1': ref - #} - #request_id = request_obj.create(cr, uid, value) - #request_ids = [request_id] - #for attendee in res_obj.attendee_ids: - #if attendee.user_id: - #value['act_to'] = attendee.user_id.id - #request_id = request_obj.create(cr, uid, value) - #request_ids.append(request_id) - #request_obj.request_send(cr, uid, request_ids) - + if re_dates: if alarm.action == 'email': - sub = '[Openobject Reminder] %s' % (alarm.name) - body = """ + sub = '[OpenERP Reminder] %s' % (alarm.name) + body = """
 Event: %s
 Event Date: %s
 Description: %s
@@ -888,20 +854,21 @@ From:
 
 ----
 %s
-
+
""" % (alarm.name, alarm.trigger_date, alarm.description, \ alarm.user_id.name, alarm.user_id.signature) mail_to = [alarm.user_id.email] for att in alarm.attendee_ids: mail_to.append(att.user_id.email) if mail_to: - mail_message.schedule_with_attach(cr, uid, - tools.config.get('email_from', False), - mail_to, - sub, - body, - context=context - ) + vals = { + 'state': 'outgoing', + 'subject': sub, + 'body_html': body, + 'email_to': mail_to, + 'email_from': tools.config.get('email_from', mail_to), + } + self.pool.get('mail.mail').create(cr, uid, vals, context=context) if next_trigger_date: update_vals.update({'trigger_date': next_trigger_date}) else: @@ -1616,36 +1583,6 @@ class calendar_todo(osv.osv): calendar_todo() -class ir_attachment(osv.osv): - _name = 'ir.attachment' - _inherit = 'ir.attachment' - - def search_count(self, cr, user, args, context=None): - new_args = [] - for domain_item in args: - if isinstance(domain_item, (list, tuple)) and len(domain_item) == 3 and domain_item[0] == 'res_id': - new_args.append((domain_item[0], domain_item[1], base_calendar_id2real_id(domain_item[2]))) - else: - new_args.append(domain_item) - return super(ir_attachment, self).search_count(cr, user, new_args, context) - - def create(self, cr, uid, vals, context=None): - if context: - id = context.get('default_res_id', False) - context.update({'default_res_id' : base_calendar_id2real_id(id)}) - return super(ir_attachment, self).create(cr, uid, vals, context=context) - - def search(self, cr, uid, args, offset=0, limit=None, order=None, - context=None, count=False): - new_args = [] - for domain_item in args: - if isinstance(domain_item, (list, tuple)) and len(domain_item) == 3 and domain_item[0] == 'res_id': - new_args.append((domain_item[0], domain_item[1], base_calendar_id2real_id(domain_item[2]))) - else: - new_args.append(domain_item) - return super(ir_attachment, self).search(cr, uid, new_args, offset=offset, - limit=limit, order=order, context=context, count=False) -ir_attachment() class ir_values(osv.osv): _inherit = 'ir.values' diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py index cb96ff2a4d0..e1c66148ae7 100644 --- a/addons/base_calendar/crm_meeting.py +++ b/addons/base_calendar/crm_meeting.py @@ -43,7 +43,7 @@ class crm_meeting(base_state, osv.Model): _name = 'crm.meeting' _description = "Meeting" _order = "id desc" - _inherit = ["calendar.event", 'ir.needaction_mixin', "mail.thread"] + _inherit = ["calendar.event", "mail.thread", 'ir.needaction_mixin'] _columns = { # base_state required fields 'create_date': fields.datetime('Creation Date', readonly=True), @@ -70,13 +70,17 @@ class crm_meeting(base_state, osv.Model): # OpenChatter # ---------------------------------------- + # shows events of the day for this user + def needaction_domain_get(self, cr, uid, domain=[], context={}): + return [('date','<=',time.strftime('%Y-%M-%D 23:59:59')), ('date_deadline','>=', time.strftime('%Y-%M-%D 00:00:00')), ('user_id','=',uid)] + def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Meeting' def case_open_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been confirmed."), context=context) + return self.message_post(cr, uid, ids, body=_("Meeting confirmed."), context=context) def case_close_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been done."), context=context) + return self.message_post(cr, uid, ids, body=_("Meeting completed."), context=context) diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml index 6009251a460..928f8d94d5c 100644 --- a/addons/base_calendar/crm_meeting_view.xml +++ b/addons/base_calendar/crm_meeting_view.xml @@ -170,7 +170,8 @@ @@ -36,7 +35,7 @@ -
+

Choose dashboard layout

diff --git a/addons/crm/board_crm_view.xml b/addons/crm/board_crm_view.xml index 16ed1e4c5ad..d80183b80c9 100644 --- a/addons/crm/board_crm_view.xml +++ b/addons/crm/board_crm_view.xml @@ -2,22 +2,6 @@ - - My Opportunities - crm.lead - tree - [('user_id','=',uid),('type', '=', 'opportunity'),('state','not in',('cancel','done'))] - - - - - New Leads - crm.lead - tree - [('user_id','=',uid),('state','=','draft'),('type','=','lead')] - - - Opportunities By Stage - Graph crm.lead.report @@ -70,11 +54,9 @@ - - + - diff --git a/addons/crm/crm_action_rule.py b/addons/crm/crm_action_rule.py index 3e3bdc90d08..8b1ba655afc 100644 --- a/addons/crm/crm_action_rule.py +++ b/addons/crm/crm_action_rule.py @@ -46,21 +46,11 @@ class base_action_rule(osv.osv): } def email_send(self, cr, uid, obj, emails, body, emailfrom=tools.config.get('email_from', False), context=None): - mail_message = self.pool.get('mail.message') - body = self.format_mail(obj, body) - if not emailfrom: - if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email: - emailfrom = obj.user_id.email - - name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) - emailfrom = tools.ustr(emailfrom) - if hasattr(obj, 'section_id') and obj.section_id and obj.section_id.alias_id: + mail_id = super(base_action_rule, self).email_send(cr, uid, obj, emails, body, emailfrom=emailfrom, context=context) + if mail_id and hasattr(obj, 'section_id') and obj.section_id and obj.section_id.alias_id: reply_to = obj.section_id.alias_id.name_get()[0][1] - else: - reply_to = emailfrom - if not emailfrom: - raise osv.except_osv(_('Error!'), _("There is no email for your company address.")) - return mail_message.schedule_with_attach(cr, uid, emailfrom, emails, name, body, model=obj._name, reply_to=reply_to, res_id=obj.id) + self.pool.get('mail.mail').write(cr, uid, [mail_id], {'reply_to': reply_to}, context=context) + return mail_id def do_check(self, cr, uid, action, obj, context=None): ok = super(base_action_rule, self).do_check(cr, uid, action, obj, context=context) @@ -105,8 +95,8 @@ class base_action_rule(osv.osv): write['email_cc'] = obj.act_email_cc # Put state change by rule in communication history - if hasattr(obj, 'state') and hasattr(obj, 'message_append') and action.act_state: - model_obj.message_append(cr, uid, [obj], _(action.act_state)) + if hasattr(obj, 'state') and hasattr(obj, 'message_post') and action.act_state: + model_obj.message_post(cr, uid, [obj], _(action.act_state), context=context) model_obj.write(cr, uid, [obj.id], write, context) super(base_action_rule, self).do_action(cr, uid, action, model_obj, obj, context=context) diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml index c5671385e56..5bf4b5ffbf9 100644 --- a/addons/crm/crm_data.xml +++ b/addons/crm/crm_data.xml @@ -55,21 +55,20 @@ - - - - Module CRM has been installed - From the top menu Sales, you can: trace leads and opportunities, get accurate forecast on your sales pipeline, plan meetings and phonecalls, get realtime statistics and efficiently organize the communication with your prospects. + + mail.group + + notification + CRM application installed! + From the top Sales menu you can track leads and opportunities, get accurate forecast on your sales pipeline, plan meetings and phonecalls, get realtime statistics and efficiently organize the communication with your prospects. +To manage quotations and sale orders, install the "Sales Management" application. + -To manage quotations and sale orders, install the module "Sales Management". - - sales {'type':'lead'} - diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 25a47ecbadc..ddfdb05ca66 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -19,11 +19,9 @@ # ############################################################################## -import binascii from base_status.base_stage import base_stage import crm from datetime import datetime -from mail.mail_message import to_email from osv import fields, osv import time import tools @@ -40,8 +38,7 @@ class crm_lead(base_stage, osv.osv): _name = "crm.lead" _description = "Lead/Opportunity" _order = "priority,date_action,id desc" - _inherit = ['ir.needaction_mixin', 'mail.thread'] - _mail_compose_message = True + _inherit = ['mail.thread','ir.needaction_mixin'] def _get_default_section_id(self, cr, uid, context=None): """ Gives default section by checking if present in the context """ @@ -90,8 +87,8 @@ class crm_lead(base_stage, osv.osv): search_domain = [] section_id = self._resolve_section_id_from_context(cr, uid, context=context) if section_id: - search_domain += ['|', '&', ('section_ids', '=', section_id), ('fold', '=', False)] - search_domain += ['|', ('id', 'in', ids), '&', ('case_default', '=', True), ('fold', '=', False)] + search_domain += ['|', ('section_ids', '=', section_id)] + search_domain += ['|', ('id', 'in', ids), ('case_default', '=', True)] # retrieve type from the context (if set: choose 'type' or 'both') type = self._resolve_type_from_context(cr, uid, context=context) if type: @@ -101,7 +98,12 @@ class crm_lead(base_stage, osv.osv): result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context) # restore order of the search result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0]))) - return result + + fold = {} + for stage in stage_obj.browse(cr, access_rights_uid, stage_ids, context=context): + fold[stage.id] = stage.fold or False + + return result, fold _group_by_full = { 'stage_id': _read_group_stage_ids @@ -175,16 +177,6 @@ class crm_lead(base_stage, osv.osv): else: return [('id', '=', '0')] - def _get_email_subject(self, cr, uid, ids, fields, args, context=None): - res = {} - for obj in self.browse(cr, uid, ids, context=context): - res[obj.id] = '' - for msg in obj.message_ids: - if msg.email_from: - res[obj.id] = msg.subject - break - return res - _columns = { 'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null', select=True, help="Optional linked partner, usually after conversion of the lead"), @@ -213,7 +205,7 @@ class crm_lead(base_stage, osv.osv): 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority', select=True), 'date_closed': fields.datetime('Closed', readonly=True), 'stage_id': fields.many2one('crm.case.stage', 'Stage', - domain="['&', '|', ('section_ids', '=', section_id), ('case_default', '=', True), '|', ('type', '=', type), ('type', '=', 'both')]"), + domain="['&', ('fold', '=', False), '&', '|', ('section_ids', '=', section_id), ('case_default', '=', True), '|', ('type', '=', type), ('type', '=', 'both')]"), 'user_id': fields.many2one('res.users', 'Salesperson'), 'referred': fields.char('Referred By', size=64), 'date_open': fields.datetime('Opened', readonly=True), @@ -228,7 +220,6 @@ class crm_lead(base_stage, osv.osv): When the case is over, the state is set to \'Done\'.\ If the case needs to be reviewed then the state is \ set to \'Pending\'.'), - 'subjects': fields.function(_get_email_subject, fnct_search=_history_search, string='Subject of Email', type='char', size=64), # Only used for type opportunity 'probability': fields.float('Success Rate (%)',group_operator="avg"), @@ -449,7 +440,7 @@ class crm_lead(base_stage, osv.osv): oldest_id = opportunity_ids[0] return self.browse(cr, uid, oldest_id, context=context) - def _mail_body_text(self, cr, uid, lead, fields, title=False, context=None): + def _mail_body(self, cr, uid, lead, fields, title=False, context=None): body = [] if title: body.append("%s\n" % (title)) @@ -486,11 +477,11 @@ class crm_lead(base_stage, osv.osv): for opportunity in opportunities: subject.append(opportunity.name) title = "%s : %s" % (merge_message, opportunity.name) - details.append(self._mail_body_text(cr, uid, opportunity, fields, title=title, context=context)) + details.append(self._mail_body(cr, uid, opportunity, fields, title=title, context=context)) subject = subject[0] + ", ".join(subject[1:]) details = "\n\n".join(details) - return self.message_append_note(cr, uid, [opportunity_id], subject=subject, body=details) + return self.message_post(cr, uid, [opportunity_id], body=details, subject=subject, context=context) def _merge_opportunity_history(self, cr, uid, opportunity_id, opportunities, context=None): message = self.pool.get('mail.message') @@ -546,7 +537,7 @@ class crm_lead(base_stage, osv.osv): oldest = self._merge_find_oldest(cr, uid, ids, context=context) if ctx_opportunities : first_opportunity = ctx_opportunities[0] - tail_opportunities = opportunities_list + tail_opportunities = opportunities_list + ctx_opportunities[1:] else: first_opportunity = opportunities_list[0] tail_opportunities = opportunities_list[1:] @@ -606,19 +597,13 @@ class crm_lead(base_stage, osv.osv): for lead in self.browse(cr, uid, ids, context=context): if lead.state in ('done', 'cancel'): continue - if user_ids or section_id: - self.allocate_salesman(cr, uid, [lead.id], user_ids, section_id, context=context) - vals = self._convert_opportunity_data(cr, uid, lead, customer, section_id, context=context) self.write(cr, uid, [lead.id], vals, context=context) - self.convert_opportunity_send_note(cr, uid, lead, context=context) - #TOCHECK: why need to change partner details in all messages of lead ? - if lead.partner_id: - msg_ids = [ x.id for x in lead.message_ids] - mail_message.write(cr, uid, msg_ids, { - 'partner_id': lead.partner_id.id - }, context=context) + + if user_ids or section_id: + self.allocate_salesman(cr, uid, ids, user_ids, section_id, context=context) + return True def _lead_create_contact(self, cr, uid, lead, name, is_company, parent_id=False, context=None): @@ -630,7 +615,7 @@ class crm_lead(base_stage, osv.osv): 'parent_id': parent_id, 'phone': lead.phone, 'mobile': lead.mobile, - 'email': lead.email_from and to_email(lead.email_from)[0], + 'email': lead.email_from and tools.email_split(lead.email_from)[0], 'fax': lead.fax, 'title': lead.title and lead.title.id or False, 'function': lead.function, @@ -650,7 +635,7 @@ class crm_lead(base_stage, osv.osv): partner_id = False if lead.partner_name and lead.contact_name: partner_id = self._lead_create_contact(cr, uid, lead, lead.partner_name, True, context=context) - self._lead_create_contact(cr, uid, lead, lead.contact_name, False, partner_id, context=context) + partner_id = self._lead_create_contact(cr, uid, lead, lead.contact_name, False, partner_id, context=context) elif lead.partner_name and not lead.contact_name: partner_id = self._lead_create_contact(cr, uid, lead, lead.partner_name, True, context=context) elif not lead.partner_name and lead.contact_name: @@ -678,32 +663,16 @@ class crm_lead(base_stage, osv.osv): if context is None: context = {} partner_ids = {} + force_partner_id = partner_id for lead in self.browse(cr, uid, ids, context=context): if action == 'create': if not partner_id: partner_id = self._create_lead_partner(cr, uid, lead, context) + partner_id = force_partner_id or self._create_lead_partner(cr, uid, lead, context=context) self._lead_set_partner(cr, uid, lead, partner_id, context=context) partner_ids[lead.id] = partner_id return partner_ids - def _send_mail_to_salesman(self, cr, uid, lead, context=None): - """ - Send mail to salesman with updated Lead details. - @ lead: browse record of 'crm.lead' object. - """ - #TOFIX: mail template should be used here instead of fix subject, body text. - message = self.pool.get('mail.message') - email_to = lead.user_id and lead.user_id.email - if not email_to: - return False - - email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.email or email_to - partner = lead.partner_id and lead.partner_id.name or lead.partner_name - subject = "lead %s converted into opportunity" % lead.name - body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description) - return message.schedule_with_attach(cr, uid, email_from, [email_to], subject, body) - - def allocate_salesman(self, cr, uid, ids, user_ids, team_id=False, context=None): index = 0 for lead_id in ids: @@ -821,14 +790,13 @@ class crm_lead(base_stage, osv.osv): if custom_values is None: custom_values = {} custom_values.update({ 'name': msg.get('subject') or _("No Subject"), - 'description': msg.get('body_text'), + 'description': msg.get('body'), 'email_from': msg.get('from'), 'email_cc': msg.get('cc'), 'user_id': False, }) if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES): custom_values['priority'] = msg.get('priority') - custom_values.update(self.message_partner_by_email(cr, uid, msg.get('from', False), context=context)) return super(crm_lead, self).message_new(cr, uid, msg, custom_values=custom_values, context=context) def message_update(self, cr, uid, ids, msg, update_vals=None, context=None): @@ -841,18 +809,18 @@ class crm_lead(base_stage, osv.osv): if update_vals is None: update_vals = {} if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES): - vals['priority'] = msg.get('priority') + update_vals['priority'] = msg.get('priority') maps = { 'cost':'planned_cost', 'revenue': 'planned_revenue', 'probability':'probability', } - for line in msg.get('body_text', '').split('\n'): + for line in msg.get('body', '').split('\n'): line = line.strip() res = tools.misc.command_re.match(line) if res and maps.get(res.group(1).lower()): key = maps.get(res.group(1).lower()) - vals[key] = res.group(2).lower() + update_vals[key] = res.group(2).lower() return super(crm_lead, self).message_update(cr, uid, ids, msg, update_vals=update_vals, context=context) @@ -860,15 +828,10 @@ class crm_lead(base_stage, osv.osv): # OpenChatter methods and notifications # ---------------------------------------- - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' to the monitored fields """ - res = super(crm_lead, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('crm.case.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_append_note(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) def case_get_note_msg_prefix(self, cr, uid, lead, context=None): if isinstance(lead, (int, long)): @@ -878,33 +841,33 @@ class crm_lead(base_stage, osv.osv): def create_send_note(self, cr, uid, ids, context=None): for id in ids: message = _("%s has been created.")% (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_append_note(cr, uid, [id], body=message, context=context) + self.message_post(cr, uid, [id], body=message, context=context) return True def case_mark_lost_send_note(self, cr, uid, ids, context=None): message = _("Opportunity has been lost.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def case_mark_won_send_note(self, cr, uid, ids, context=None): message = _("Opportunity has been won.") - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def schedule_phonecall_send_note(self, cr, uid, ids, phonecall_id, action, context=None): phonecall = self.pool.get('crm.phonecall').browse(cr, uid, [phonecall_id], context=context)[0] if action == 'log': prefix = 'Logged' else: prefix = 'Scheduled' message = _("%s a call for the %s.") % (prefix, phonecall.date) - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def _lead_set_partner_send_note(self, cr, uid, ids, context=None): for lead in self.browse(cr, uid, ids, context=context): message = _("%s partner is now set to %s." % (self.case_get_note_msg_prefix(cr, uid, lead, context=context), lead.partner_id.name)) - lead.message_append_note(body=message) + lead.message_post(body=message) return True def convert_opportunity_send_note(self, cr, uid, lead, context=None): message = _("Lead has been converted to an opportunity.") - lead.message_append_note(body=message) + lead.message_post(body=message) return True crm_lead() diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index 04f91933f66..f734a839ff4 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -55,7 +55,7 @@ Dead - + cancel diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index 6118c08c0e5..b3c00256b06 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -552,86 +552,67 @@ Andrew Plan to buy a Laptop crm.lead - html - <![CDATA[Email0 inquiry]]><div><font size="2">Hello,</font></div><div><font size="2"><br></font></div><div><font size="2">I am interested in your company's product and I plan to buy a new laptop having latest technologies and affordable price.</font></div><div><font size="2">Can you please send me product catalogue?</font></div> + <![CDATA[Email0 inquiry]]><div><font size="2">Hello,</font></div><div><font size="2"><br></font></div><div><font size="2">I am interested in your company's product and I plan to buy a new laptop having latest technologies and affordable price.</font></div><div><font size="2">Can you please send me product catalogue?</font></div> email - received - Re: Plan to buy a Laptop crm.lead - - plain - Dear Customer, + comment + Dear Customer, Thanks for showing interest in our products. We have attached the catalogue, We would like to know your interests, Let us know if we can call you for more details. Thanks - email - - sent + + Re: Plan to buy a Laptop crm.lead - html - <div>Thanks for the information,</div><div>I will visit the store soon.</div> + comment + <div>Thanks for the information,</div><div>I will visit the store soon.</div> - email - - received + Re: Plan to buy a Laptop crm.lead - html - <font color="#1f1f1f">Can you tell me if the store is open at 9:00 PM?</b></font> + comment + <font color="#1f1f1f">Can you tell me if the store is open at 9:00 PM?</b></font> - email - received - + Re: Plan to buy a Laptop crm.lead - plain - Yes, its open till 10:00 PM, you are welcome! + Yes, its open till 10:00 PM, you are welcome! email - sent - + - Inquiry crm.lead - plain - Hello, + Hello, I am Jason from Le Club SARL, I am intertested to attend Training organized in your company, Can you send details, email - received - - Need Details crm.lead - plain - Want to know features and benifits to use the new software. + Want to know features and benifits to use the new software. comment - - Leads crm.lead - + @@ -257,12 +257,11 @@ - + - - + @@ -296,19 +295,12 @@ - + - -
    -
  • Phone:
  • -
  • Probability: %%
  • -
  • Creation date:
  • -
  • Date Deadline:
  • -
-
+
-
+
í
@@ -362,10 +353,8 @@ - - - + @@ -386,7 +375,6 @@ - @@ -515,7 +503,7 @@ - + @@ -545,7 +533,7 @@ Opportunities Tree crm.lead - + @@ -555,7 +543,6 @@ - @@ -563,7 +550,7 @@ - + @@ -578,7 +565,7 @@ - + @@ -600,7 +587,6 @@ - diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index 13171d95b9b..62fc53364ee 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -44,7 +44,7 @@ class crm_meeting(osv.Model): def create_send_note(self, cr, uid, ids, context=None): if context is None: context = {} - # update context: if come from phonecall, default state values can make the message_append_note crash + # update context: if come from phonecall, default state values can make the message_post crash context.pop('default_state', False) for meeting in self.browse(cr, uid, ids, context=context): # in the message, transpose meeting.date to the timezone of the current user @@ -53,14 +53,14 @@ class crm_meeting(osv.Model): if meeting.opportunity_id: # meeting can be create from phonecalls or opportunities, therefore checking for the parent lead = meeting.opportunity_id message = _("Meeting linked to the opportunity %s has been created and scheduled on %s.") % (lead.name, meeting_date_tz) - lead.message_append_note(_('System Notification'), message) + lead.message_post(body=message) elif meeting.phonecall_id: phonecall = meeting.phonecall_id message = _("Meeting linked to the phonecall %s has been created and scheduled on %s.") % (phonecall.name, meeting_date_tz) - phonecall.message_append_note(body=message) + phonecall.message_post(body=message) else: message = _("A meeting has been scheduled on %s.") % (meeting_date_tz) - meeting.message_append_note(body=message) + meeting.message_post(body=message) return True class calendar_attendee(osv.osv): diff --git a/addons/crm/crm_phonecall.py b/addons/crm/crm_phonecall.py index da08f97250a..44894fc881d 100644 --- a/addons/crm/crm_phonecall.py +++ b/addons/crm/crm_phonecall.py @@ -32,7 +32,7 @@ class crm_phonecall(base_state, osv.osv): _name = "crm.phonecall" _description = "Phonecall" _order = "id desc" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread'] _columns = { # base_state required fields 'date_action_last': fields.datetime('Last Action', readonly=1), @@ -177,11 +177,11 @@ class crm_phonecall(base_state, osv.osv): if context is None: context = {} partner_ids = {} + force_partner_id = partner_id for call in self.browse(cr, uid, ids, context=context): if action == 'create': - if not partner_id: - partner_id = self._call_create_partner(cr, uid, call, context=context) - self._call_create_partner_address(cr, uid, call, partner_id, context=context) + partner_id = force_partner_id or self._call_create_partner(cr, uid, call, context=context) + self._call_create_partner_address(cr, uid, call, partner_id, context=context) self._call_set_partner(cr, uid, [call.id], partner_id, context=context) partner_ids[call.id] = partner_id return partner_ids @@ -266,7 +266,7 @@ class crm_phonecall(base_state, osv.osv): def case_reset_send_note(self, cr, uid, ids, context=None): message = _('Phonecall has been reset and set as open.') - return self.message_append_note(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def case_open_send_note(self, cr, uid, ids, context=None): lead_obj = self.pool.get('crm.lead') @@ -280,11 +280,11 @@ class crm_phonecall(base_state, osv.osv): message = _("Phonecall linked to the opportunity %s has been created and scheduled on %s.") % (lead.name, phonecall_date_str) else: message = _("Phonecall has been created and opened.") - phonecall.message_append_note(body=message) + phonecall.message_post(body=message) return True def _call_set_partner_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Partner has been created."), context=context) + return self.message_post(cr, uid, ids, body=_("Partner has been created."), context=context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml index 3b5162288a4..2f885e09b61 100644 --- a/addons/crm/crm_phonecall_view.xml +++ b/addons/crm/crm_phonecall_view.xml @@ -66,8 +66,7 @@ CRM - Phone Calls Tree crm.phonecall - - + @@ -76,7 +75,6 @@ -
@@ -37,8 +36,6 @@
- - crm.lead.geo_assign.tree.inherit crm.lead @@ -49,6 +46,7 @@
+ crm.opportunity.partner.filter.assigned crm.lead @@ -63,5 +61,6 @@
+ diff --git a/addons/crm_partner_assign/i18n/ar.po b/addons/crm_partner_assign/i18n/ar.po index de0f43af5a6..53d88fd259a 100644 --- a/addons/crm_partner_assign/i18n/ar.po +++ b/addons/crm_partner_assign/i18n/ar.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:39+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "التمركز الجغرافي" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -134,7 +134,7 @@ msgid "Highest" msgstr "أعلى" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/bg.po b/addons/crm_partner_assign/i18n/bg.po index 8d34ce6a73c..cb670286522 100644 --- a/addons/crm_partner_assign/i18n/bg.po +++ b/addons/crm_partner_assign/i18n/bg.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:39+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Най-висок" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/ca.po b/addons/crm_partner_assign/i18n/ca.po index 1ff3ec07048..1f73a19b35a 100644 --- a/addons/crm_partner_assign/i18n/ca.po +++ b/addons/crm_partner_assign/i18n/ca.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo localitzar" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "El més alt" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/crm_partner_assign.pot b/addons/crm_partner_assign/i18n/crm_partner_assign.pot index 3fb9fc0e915..c3ddc66fa3b 100644 --- a/addons/crm_partner_assign/i18n/crm_partner_assign.pot +++ b/addons/crm_partner_assign/i18n/crm_partner_assign.pot @@ -72,7 +72,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -129,7 +129,7 @@ msgid "Highest" msgstr "" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/da.po b/addons/crm_partner_assign/i18n/da.po index 4e249458019..5bb8265399f 100644 --- a/addons/crm_partner_assign/i18n/da.po +++ b/addons/crm_partner_assign/i18n/da.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/de.po b/addons/crm_partner_assign/i18n/de.po index 9257f3c329e..20a3352bc3f 100644 --- a/addons/crm_partner_assign/i18n/de.po +++ b/addons/crm_partner_assign/i18n/de.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geogr. Lokalisierung" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Text Version der Mitteilung" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Sehr Hoch" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Text Inhalt" diff --git a/addons/crm_partner_assign/i18n/el.po b/addons/crm_partner_assign/i18n/el.po index d621855b061..edad942b005 100644 --- a/addons/crm_partner_assign/i18n/el.po +++ b/addons/crm_partner_assign/i18n/el.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Υψηλότερο" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/es.po b/addons/crm_partner_assign/i18n/es.po index cfcbb629923..f4e6d399e15 100644 --- a/addons/crm_partner_assign/i18n/es.po +++ b/addons/crm_partner_assign/i18n/es.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo localizar" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Más alta" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/es_CR.po b/addons/crm_partner_assign/i18n/es_CR.po index 4315ece4f3b..383f2669379 100644 --- a/addons/crm_partner_assign/i18n/es_CR.po +++ b/addons/crm_partner_assign/i18n/es_CR.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" "Language: es\n" #. module: crm_partner_assign @@ -75,7 +75,7 @@ msgid "Geo Localize" msgstr "Geo localizar" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Versión en texto plano del mensaje" @@ -136,7 +136,7 @@ msgid "Highest" msgstr "Más alta" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Contenido del Texto" diff --git a/addons/crm_partner_assign/i18n/es_PY.po b/addons/crm_partner_assign/i18n/es_PY.po index b3e52bffc08..b250c96e070 100644 --- a/addons/crm_partner_assign/i18n/es_PY.po +++ b/addons/crm_partner_assign/i18n/es_PY.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo localizar" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Muy alto" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/fi.po b/addons/crm_partner_assign/i18n/fi.po index cd7065f8fd6..9c237cf5495 100644 --- a/addons/crm_partner_assign/i18n/fi.po +++ b/addons/crm_partner_assign/i18n/fi.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Alueellista" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Korkein" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/fr.po b/addons/crm_partner_assign/i18n/fr.po index 770f58f72a5..0d3f4e07808 100644 --- a/addons/crm_partner_assign/i18n/fr.po +++ b/addons/crm_partner_assign/i18n/fr.po @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -75,7 +75,7 @@ msgid "Geo Localize" msgstr "Géolocalisation" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Version plein texte du message" @@ -136,7 +136,7 @@ msgid "Highest" msgstr "La Plus haute" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Contenu du texte" diff --git a/addons/crm_partner_assign/i18n/gl.po b/addons/crm_partner_assign/i18n/gl.po index 5bf10d25f16..184f3a25386 100644 --- a/addons/crm_partner_assign/i18n/gl.po +++ b/addons/crm_partner_assign/i18n/gl.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Xeolocalizar" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "A máis alta" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/hr.po b/addons/crm_partner_assign/i18n/hr.po index e18b6c5188e..3236f0bd3ac 100644 --- a/addons/crm_partner_assign/i18n/hr.po +++ b/addons/crm_partner_assign/i18n/hr.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Najviši" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/hu.po b/addons/crm_partner_assign/i18n/hu.po index 816f93f1203..daaeca2363e 100644 --- a/addons/crm_partner_assign/i18n/hu.po +++ b/addons/crm_partner_assign/i18n/hu.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Földrajzi fekvés meghatározása" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Legmagasabb" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/it.po b/addons/crm_partner_assign/i18n/it.po index c008216c5d3..21d3c30d82b 100644 --- a/addons/crm_partner_assign/i18n/it.po +++ b/addons/crm_partner_assign/i18n/it.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo localizzazione" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Maggiore" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/ja.po b/addons/crm_partner_assign/i18n/ja.po index d6a739dc2b1..93dcbe346ca 100644 --- a/addons/crm_partner_assign/i18n/ja.po +++ b/addons/crm_partner_assign/i18n/ja.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "ジオロカライゼーション" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "メッセージのテキスト版" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "最高" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "テキストの内容" diff --git a/addons/crm_partner_assign/i18n/lt.po b/addons/crm_partner_assign/i18n/lt.po index 7c2f427260a..8e89e14575c 100644 --- a/addons/crm_partner_assign/i18n/lt.po +++ b/addons/crm_partner_assign/i18n/lt.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/lv.po b/addons/crm_partner_assign/i18n/lv.po index a51b096e0a3..182f8990341 100644 --- a/addons/crm_partner_assign/i18n/lv.po +++ b/addons/crm_partner_assign/i18n/lv.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Ģeo. lokalizācija" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "Augstākā" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/nl.po b/addons/crm_partner_assign/i18n/nl.po index ebb0cf33f10..ac9dc276e82 100644 --- a/addons/crm_partner_assign/i18n/nl.po +++ b/addons/crm_partner_assign/i18n/nl.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo lokaliseren" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Platte tekst versie van het bericht" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Hoogste" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Tekst inhoud" diff --git a/addons/crm_partner_assign/i18n/pl.po b/addons/crm_partner_assign/i18n/pl.po index 9645def6e96..31936f2794c 100644 --- a/addons/crm_partner_assign/i18n/pl.po +++ b/addons/crm_partner_assign/i18n/pl.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Lokalizacja geograficzna" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Najwyższy" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/pt.po b/addons/crm_partner_assign/i18n/pt.po index a1b159fe387..ba250d4519b 100644 --- a/addons/crm_partner_assign/i18n/pt.po +++ b/addons/crm_partner_assign/i18n/pt.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Localizar Geograficamente" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Formatação do texto da versão da mensagem" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Maior" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Conteúdos do texto" diff --git a/addons/crm_partner_assign/i18n/pt_BR.po b/addons/crm_partner_assign/i18n/pt_BR.po index 10e51041d3f..fa7a7d0561c 100644 --- a/addons/crm_partner_assign/i18n/pt_BR.po +++ b/addons/crm_partner_assign/i18n/pt_BR.po @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -75,7 +75,7 @@ msgid "Geo Localize" msgstr "Localização Geográfica" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Versão em texto" @@ -136,7 +136,7 @@ msgid "Highest" msgstr "Mais Alta" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Conteúdo" diff --git a/addons/crm_partner_assign/i18n/ro.po b/addons/crm_partner_assign/i18n/ro.po index d4e43523d6e..c385587a99b 100644 --- a/addons/crm_partner_assign/i18n/ro.po +++ b/addons/crm_partner_assign/i18n/ro.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Localizare Geo" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Versiune text-simplu a mesajului" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Cel mai ridicat (cea mai ridicata)" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Cuprins text" diff --git a/addons/crm_partner_assign/i18n/ru.po b/addons/crm_partner_assign/i18n/ru.po index 4a5229b59b2..0a354515bf8 100644 --- a/addons/crm_partner_assign/i18n/ru.po +++ b/addons/crm_partner_assign/i18n/ru.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Геолоцировать" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Высший" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/sq.po b/addons/crm_partner_assign/i18n/sq.po index 56d7f386635..7d2f01a6693 100644 --- a/addons/crm_partner_assign/i18n/sq.po +++ b/addons/crm_partner_assign/i18n/sq.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:39+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/sr@latin.po b/addons/crm_partner_assign/i18n/sr@latin.po index 6e9aab21f1c..0605ee65706 100644 --- a/addons/crm_partner_assign/i18n/sr@latin.po +++ b/addons/crm_partner_assign/i18n/sr@latin.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "" diff --git a/addons/crm_partner_assign/i18n/sv.po b/addons/crm_partner_assign/i18n/sv.po index 345d61d10b3..0605d54bcaa 100644 --- a/addons/crm_partner_assign/i18n/sv.po +++ b/addons/crm_partner_assign/i18n/sv.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geoplacering" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Textversion av meddelandet" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "Högsta" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Textinnehåll" diff --git a/addons/crm_partner_assign/i18n/tr.po b/addons/crm_partner_assign/i18n/tr.po index da879a6156b..11fcc743002 100644 --- a/addons/crm_partner_assign/i18n/tr.po +++ b/addons/crm_partner_assign/i18n/tr.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Coğrafi konumlama" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "Mesajın düz-metin versiyonu" @@ -135,7 +135,7 @@ msgid "Highest" msgstr "En yüksek" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "Metin içeriği" diff --git a/addons/crm_partner_assign/i18n/zh_CN.po b/addons/crm_partner_assign/i18n/zh_CN.po index 67f4a4e74b8..ff25feafd25 100644 --- a/addons/crm_partner_assign/i18n/zh_CN.po +++ b/addons/crm_partner_assign/i18n/zh_CN.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-28 06:40+0000\n" -"X-Generator: Launchpad (build 15864)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "geolocalization定位" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "内容的纯文本版本" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "最高" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "文本内容" diff --git a/addons/crm_partner_assign/i18n/zh_TW.po b/addons/crm_partner_assign/i18n/zh_TW.po index 3c77816d71b..4870b464035 100644 --- a/addons/crm_partner_assign/i18n/zh_TW.po +++ b/addons/crm_partner_assign/i18n/zh_TW.po @@ -14,8 +14,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-08-31 04:56+0000\n" -"X-Generator: Launchpad (build 15887)\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" #. module: crm_partner_assign #: field:crm.lead.forward.to.partner,send_to:0 @@ -74,7 +74,7 @@ msgid "Geo Localize" msgstr "Geo 定位" #. module: crm_partner_assign -#: help:crm.lead.forward.to.partner,body_text:0 +#: help:crm.lead.forward.to.partner,body:0 msgid "Plain-text version of the message" msgstr "內容的純文字版本" @@ -133,7 +133,7 @@ msgid "Highest" msgstr "最高" #. module: crm_partner_assign -#: field:crm.lead.forward.to.partner,body_text:0 +#: field:crm.lead.forward.to.partner,body:0 msgid "Text contents" msgstr "文本內容" diff --git a/addons/crm_partner_assign/test/partner_assign.yml b/addons/crm_partner_assign/test/partner_assign.yml index bc4cd0d6e57..a055fc6cd6d 100644 --- a/addons/crm_partner_assign/test/partner_assign.yml +++ b/addons/crm_partner_assign/test/partner_assign.yml @@ -29,8 +29,8 @@ I forward this opportunity to its nearest partner. - !python {model: crm.lead.forward.to.partner}: | - context.update({'active_model': 'crm.lead', 'active_id': ref('crm.crm_case_19'), 'active_ids': [ref('crm.crm_case_19')]}) - forward_id = self.create(cr, uid, {'email_from': 'test@openerp.com', 'send_to': 'partner'}, context=context) + context.update({'default_model': 'crm.lead', 'default_res_id': ref('crm.crm_case_19'), 'active_ids': [ref('crm.crm_case_19')]}) + forward_id = self.create(cr, uid, {}, context=context) try: self.action_forward(cr, uid, [forward_id], context=context) except: diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py index d479f8b1bd5..0cac38e0163 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py @@ -20,186 +20,153 @@ # ############################################################################## -import time import re +import time +import tools + from osv import osv, fields from tools.translate import _ -from mail.mail_message import to_email class crm_lead_forward_to_partner(osv.osv_memory): - """Forwards lead history""" + """ Forward info history to partners. """ _name = 'crm.lead.forward.to.partner' _inherit = "mail.compose.message" + def default_get(self, cr, uid, fields, context=None): + if context is None: + context = {} + # set as comment, perform overrided document-like action that calls get_record_data + old_mode = context.get('default_composition_mode', 'forward') + context['default_composition_mode'] = 'comment' + res = super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context) + # back to forward mode + context['default_composition_mode'] = old_mode + res['composition_mode'] = context['default_composition_mode'] + return res + + def _get_composition_mode_selection(self, cr, uid, context=None): + composition_mode = super(crm_lead_forward_to_partner, self)._get_composition_mode_selection(cr, uid, context=context) + composition_mode.append(('forward', 'Forward')) + return composition_mode + _columns = { - 'send_to': fields.selection([('user', 'User'), ('partner', 'Partner'), \ - ('email', 'Email Address')], 'Send to', required=True), - 'user_id': fields.many2one('res.users', "User"), - 'attachment_ids': fields.many2many('ir.attachment','lead_forward_to_partner_attachment_rel', 'wizard_id', 'attachment_id', 'Attachments'), - 'partner_id' : fields.many2one('res.partner', 'Partner'), - 'history': fields.selection([('info', 'Case Information'), ('latest', 'Latest email'), ('whole', 'Whole Story')], 'Send history', required=True), + 'partner_ids': fields.many2many('res.partner', + 'lead_forward_to_partner_res_partner_rel', + 'wizard_id', 'partner_id', 'Additional contacts'), + 'attachment_ids': fields.many2many('ir.attachment', + 'lead_forward_to_partner_attachment_rel', + 'wizard_id', 'attachment_id', 'Attachments'), + 'history_mode': fields.selection([('info', 'Case Information'), + ('latest', 'Latest email'), ('whole', 'Whole Story')], + 'Send history', required=True), } _defaults = { - 'send_to' : 'email', - 'history': 'latest', - 'email_from': lambda s, cr, uid, c: s.pool.get('res.users').browse(cr, uid, uid, c).email, + 'history_mode': 'latest', + 'content_subtype': lambda self,cr, uid, context={}: 'html', } - def on_change_email(self, cr, uid, ids, user, context=None): - if not user: - return {'value': {'email_to': False}} - return {'value': {'email_to': self.pool.get('res.users').browse(cr, uid, uid, context=context).email}} - - def on_change_history(self, cr, uid, ids, history_type, context=None): - """Gives message body according to type of history selected - * info: Forward the case information - * whole: Send the whole history - * latest: Send the latest histoy + def get_record_data(self, cr, uid, model, res_id, context=None): + """ Override of mail.compose.message, to add default values coming + form the related lead. """ - #TODO: ids and context are not comming - res = {} - res_id = context.get('active_id') - model = context.get('active_model') - lead = self.pool.get(model).browse(cr, uid, res_id, context) - body_text = self._get_message_body_text(cr, uid, lead, history_type, context=context) - if body_text: - res = {'value': {'body_text' : body_text}} + res = super(crm_lead_forward_to_partner, self).get_record_data(cr, uid, model, res_id, context=context) + if model not in ('crm.lead') or not res_id: + return res + lead_obj = self.pool.get(model) + lead = lead_obj.browse(cr, uid, res_id, context=context) + subject = '%s: %s - %s' % (_('Fwd'), _('Lead forward'), lead.name) + body = self._get_message_body(cr, uid, lead, 'info', context=context) + res.update({ + 'subject': subject, + 'body': body, + }) return res - - def on_change_partner(self, cr, uid, ids, partner_id): - """This function fills address information based on partner/user selected - """ - if not partner_id: - return {'value' : {'email_to' : False}} - partner_obj = self.pool.get('res.partner') - data = {} - partner = partner_obj.browse(cr, uid, [partner_id]) - user_id = partner and partner[0].user_id or False - data.update({'email_from': partner and partner[0].email or "", - 'email_cc' : user_id and user_id.user or '', - 'user_id': user_id and user_id.id or False}) - return {'value' : data} + + def on_change_history_mode(self, cr, uid, ids, history_mode, model, res_id, context=None): + """ Update body when changing history_mode """ + if model and model == 'crm.lead' and res_id: + lead = self.pool.get(model).browse(cr, uid, res_id, context=context) + body = self._get_message_body(cr, uid, lead, history_mode, context=context) + return {'value': {'body': body}} + + def create(self, cr, uid, values, context=None): + """ TDE-HACK: remove 'type' from context, because when viewing an + opportunity form view, a default_type is set and propagated + to the wizard, that has a not matching type field. """ + default_type = context.pop('default_type', None) + new_id = super(crm_lead_forward_to_partner, self).create(cr, uid, values, context=context) + if default_type: + context['default_type'] = default_type + return new_id def action_forward(self, cr, uid, ids, context=None): - """ - Forward the lead to a partner - """ + """ Forward the lead to a partner """ if context is None: context = {} res = {'type': 'ir.actions.act_window_close'} - model = context.get('active_model') - if model not in ('crm.lead'): + wizard = self.browse(cr, uid, ids[0], context=context) + if wizard.model not in ('crm.lead'): return res - this = self.browse(cr, uid, ids[0], context=context) - lead = self.pool.get(model) - lead_id = context and context.get('active_id', False) or False - lead_ids = lead_id and [lead_id] or [] - mode = context.get('mail.compose.message.mode') - if mode == 'mass_mail': + lead = self.pool.get(wizard.model) + lead_ids = wizard.res_id and [wizard.res_id] or [] + + if wizard.composition_mode == 'mass_mail': lead_ids = context and context.get('active_ids', []) or [] - value = self.default_get(cr, uid, ['body_text', 'email_to', 'email_cc', 'subject', 'history'], context=context) + value = self.default_get(cr, uid, ['body', 'email_to', 'email_cc', 'subject', 'history_mode'], context=context) self.write(cr, uid, ids, value, context=context) - context['mail.compose.message.mode'] = mode self.send_mail(cr, uid, ids, context=context) - for case in lead.browse(cr, uid, lead_ids, context=context): - if (this.send_to == 'partner' and this.partner_id): - lead.assign_partner(cr, uid, [case.id], this.partner_id.id, context=context) + # for case in lead.browse(cr, uid, lead_ids, context=context): + # TODO: WHAT TO DO WITH THAT ? + # if (this.send_to == 'partner' and this.partner_id): + # lead.assign_partner(cr, uid, [case.id], this.partner_id.id, context=context) - if this.send_to == 'user': - lead.allocate_salesman(cr, uid, [case.id], [this.user_id.id], context=context) - - email_cc = to_email(case.email_cc) - email_cc = email_cc and email_cc[0] or '' - new_cc = [] - if email_cc: - new_cc.append(email_cc) - for to in this.email_to.split(','): - email_to = to_email(to) - email_to = email_to and email_to[0] or '' - if email_to not in new_cc: - new_cc.append(to) - update_vals = {'email_cc' : ', '.join(new_cc) } - lead.write(cr, uid, [case.id], update_vals, context=context) + # if this.send_to == 'user': + # lead.allocate_salesman(cr, uid, [case.id], [this.user_id.id], context=context) return res - def _get_info_body_text(self, cr, uid, lead, context=None): + def _get_info_body(self, cr, uid, lead, context=None): field_names = [] proxy = self.pool.get(lead._name) if lead.type == 'opportunity': field_names += ['partner_id'] field_names += [ - 'partner_name' , 'title', 'function', 'street', 'street2', + 'partner_name' , 'title', 'function', 'street', 'street2', 'zip', 'city', 'country_id', 'state_id', 'email_from', 'phone', 'fax', 'mobile', 'categ_id', 'description', ] - return proxy._mail_body_text(cr, uid, lead, field_names, context=context) + return proxy._mail_body(cr, uid, lead, field_names, context=context) - def _get_message_body_text(self, cr, uid, lead, mode='whole', context=None): - """This function gets whole communication history and returns as top posting style + def _get_message_body(self, cr, uid, lead, history_mode='whole', context=None): + """ This function gets whole communication history and returns as top + posting style + #1: form a body, based on the lead + #2: append to the body the communication history, based on the + history_mode parameter + + - info: Forward the case information + - latest: Send the latest history + - whole: Send the whole history + + :param lead: browse_record on crm.lead + :param history_mode: 'whole' or 'latest' """ mail_message = self.pool.get('mail.message') - message_ids = [] - body = self._get_info_body_text(cr, uid, lead, context=context) - if mode in ('whole', 'latest'): - message_ids = lead.message_ids - message_ids = map(lambda x: x.id, filter(lambda x: x.email_from, message_ids)) - if mode == 'latest' and len(message_ids): - message_ids = [message_ids[0]] - for message in mail_message.browse(cr, uid, message_ids, context=context): - header = '-------- Original Message --------' - sender = 'From: %s' %(message.email_from or '') - to = 'To: %s' % (message.email_to or '') - sentdate = 'Date: %s' % (message.date or '') - desc = '\n%s'%(message.body_text) - original = [header, sender, to, sentdate, desc, '\n'] - original = '\n'.join(original) - body += original + body = self._get_info_body(cr, uid, lead, context=context) + if history_mode not in ('whole', 'latest'): + return body or '' + for message in lead.message_ids: + header = '-------- Original Message --------' + sentdate = 'Date: %s' % (message.date or '') + desc = '\n%s'%(message.body) + original = [header, sentdate, desc, '\n'] + original = '\n'.join(original) + body += original + if history_mode == 'latest': + break return body or '' - def get_value(self, cr, uid, model, res_id, context=None): - if context is None: - context = {} - res = super(crm_lead_forward_to_partner, self).get_value(cr, uid, model, res_id, context=context) - if model not in ("crm.lead"): - return res - proxy = self.pool.get(model) - partner = self.pool.get('res.partner') - lead = proxy.browse(cr, uid, res_id, context=context) - mode = context.get('mail.compose.message.mode') - if mode == "forward": - body_type = context.get('mail.compose.message.body') - email_cc = res.get('email_cc', "") - email = res.get('email_to', "") - subject = '%s: %s - %s' % (_('Fwd'), 'Lead forward', lead.name) - body = self._get_message_body_text(cr, uid, lead, body_type, context=context) - partner_assigned_id = lead.partner_assigned_id and lead.partner_assigned_id.id or False - user_id = False - if not partner_assigned_id: - partner_assigned_id = proxy.search_geo_partner(cr, uid, [lead.id], context=None).get(lead.id, False) - if partner_assigned_id: - assigned_partner = partner.browse(cr, uid, partner_assigned_id, context=context) - user_id = assigned_partner.user_id and assigned_partner.user_id.id or False - email_cc = assigned_partner.user_id and assigned_partner.user_id.email or '' - email = assigned_partner.email - - res.update({ - 'subject' : subject, - 'body_text' : body, - 'email_cc' : email_cc, - 'email_to' : email, - 'partner_assigned_id': partner_assigned_id, - 'user_id': user_id, - }) - return res - - def default_get(self, cr, uid, fields, context=None): - if context is None: - context = {} - context['mail.compose.message.mode'] = 'forward' - context['mail.compose.message.body'] = 'info' - return super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml index cecf73954e5..0d8f27eec74 100644 --- a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml +++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml @@ -7,42 +7,31 @@ crm.lead.forward.to.partner
+ + + - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - -
-
@@ -57,18 +46,14 @@ new - - - - + /> diff --git a/addons/crm_profiling/i18n/nb.po b/addons/crm_profiling/i18n/nb.po new file mode 100644 index 00000000000..653dc05522e --- /dev/null +++ b/addons/crm_profiling/i18n/nb.po @@ -0,0 +1,212 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-06 14:26+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-07 04:58+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: crm_profiling +#: view:crm_profiling.questionnaire:0 +msgid "Questions List" +msgstr "Spørsmål liste." + +#. module: crm_profiling +#: model:ir.actions.act_window,help:crm_profiling.open_questionnaires +msgid "" +"You can create specific topic-related questionnaires to guide your team(s) " +"in the sales cycle by helping them to ask the right questions. The " +"segmentation tool allows you to automatically assign a partner to a category " +"according to his answers to the different questionnaires." +msgstr "" +"Du kan opprette spesifikke tema-relaterte spørreskjemaer for å styre lag (e) " +"i salgsperioden ved å hjelpe dem til å stille de riktige spørsmålene. " +"Segmentering verktøyet lar deg automatisk tildele en partner til en kategori " +"i henhold til hans svar til de ulike spørreskjemaer." + +#. module: crm_profiling +#: field:crm_profiling.answer,question_id:0 +#: field:crm_profiling.question,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_question +#: field:open.questionnaire.line,question_id:0 +msgid "Question" +msgstr "Spørsmål" + +#. module: crm_profiling +#: model:ir.actions.act_window,name:crm_profiling.action_open_questionnaire +#: view:open.questionnaire:0 +msgid "Open Questionnaire" +msgstr "åpen Spørreskjema" + +#. module: crm_profiling +#: field:crm.segmentation,child_ids:0 +msgid "Child Profiles" +msgstr "Barn profiler" + +#. module: crm_profiling +#: view:crm.segmentation:0 +msgid "Partner Segmentations" +msgstr "Partner segmenteringer" + +#. module: crm_profiling +#: field:crm_profiling.answer,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_answer +#: field:open.questionnaire.line,answer_id:0 +msgid "Answer" +msgstr "Svar" + +#. module: crm_profiling +#: model:ir.model,name:crm_profiling.model_open_questionnaire_line +msgid "open.questionnaire.line" +msgstr "Åpen.Spørreskjema.Linje" + +#. module: crm_profiling +#: model:ir.model,name:crm_profiling.model_crm_segmentation +msgid "Partner Segmentation" +msgstr "Partnersegmentering" + +#. module: crm_profiling +#: view:res.partner:0 +msgid "Profiling" +msgstr "Profilering" + +#. module: crm_profiling +#: view:crm_profiling.questionnaire:0 +#: field:crm_profiling.questionnaire,description:0 +msgid "Description" +msgstr "Beskrivelse:" + +#. module: crm_profiling +#: field:crm.segmentation,answer_no:0 +msgid "Excluded Answers" +msgstr "Ekskluderte svar" + +#. module: crm_profiling +#: view:crm_profiling.answer:0 +#: view:crm_profiling.question:0 +#: field:res.partner,answers_ids:0 +msgid "Answers" +msgstr "Svar" + +#. module: crm_profiling +#: model:ir.model,name:crm_profiling.model_open_questionnaire +msgid "open.questionnaire" +msgstr "Åpen.Spørresjema" + +#. module: crm_profiling +#: field:open.questionnaire,questionnaire_id:0 +msgid "Questionnaire name" +msgstr "Spørresjema navn." + +#. module: crm_profiling +#: view:res.partner:0 +msgid "Use a questionnaire" +msgstr "Bruk et spørresjema." + +#. module: crm_profiling +#: view:open.questionnaire:0 +msgid "_Cancel" +msgstr "_Avbryt" + +#. module: crm_profiling +#: field:open.questionnaire,question_ans_ids:0 +msgid "Question / Answers" +msgstr "Spørsmål / Svar" + +#. module: crm_profiling +#: view:crm_profiling.questionnaire:0 +#: model:ir.actions.act_window,name:crm_profiling.open_questionnaires +#: model:ir.ui.menu,name:crm_profiling.menu_segm_questionnaire +#: view:open.questionnaire:0 +msgid "Questionnaires" +msgstr "Spørreskjemaer" + +#. module: crm_profiling +#: help:crm.segmentation,profiling_active:0 +msgid "" +"Check this box if you want to use this tab as " +"part of the segmentation rule. If not checked, " +"the criteria beneath will be ignored" +msgstr "" +"Kryss av her hvis du ønsker å bruke denne kategorien som en del av " +"segmentering regelen. Hvis det ikke er merket, vil kriteriene under bli " +"ignorert." + +#. module: crm_profiling +#: constraint:crm.segmentation:0 +msgid "Error ! You can not create recursive profiles." +msgstr "Feil ! Du kan ikke lage rekursive profiler." + +#. module: crm_profiling +#: field:crm.segmentation,profiling_active:0 +msgid "Use The Profiling Rules" +msgstr "Bruk profileringen Regler" + +#. module: crm_profiling +#: constraint:res.partner:0 +msgid "Error ! You cannot create recursive associated members." +msgstr "Feil! Du kan ikke opprette rekursive tilknyttede medlemmer." + +#. module: crm_profiling +#: view:crm_profiling.question:0 +#: field:crm_profiling.question,answers_ids:0 +msgid "Avalaible Answers" +msgstr "" + +#. module: crm_profiling +#: field:crm.segmentation,answer_yes:0 +msgid "Included Answers" +msgstr "Inkluderte svar." + +#. module: crm_profiling +#: view:crm_profiling.question:0 +#: field:crm_profiling.questionnaire,questions_ids:0 +#: model:ir.actions.act_window,name:crm_profiling.open_questions +#: model:ir.ui.menu,name:crm_profiling.menu_segm_answer +msgid "Questions" +msgstr "Spørsmål" + +#. module: crm_profiling +#: field:crm.segmentation,parent_id:0 +msgid "Parent Profile" +msgstr "Overordnede profil" + +#. module: crm_profiling +#: view:open.questionnaire:0 +msgid "Cancel" +msgstr "Kanseller" + +#. module: crm_profiling +#: model:ir.model,name:crm_profiling.model_res_partner +msgid "Partner" +msgstr "Partner" + +#. module: crm_profiling +#: code:addons/crm_profiling/wizard/open_questionnaire.py:77 +#: field:crm_profiling.questionnaire,name:0 +#: model:ir.model,name:crm_profiling.model_crm_profiling_questionnaire +#: view:open.questionnaire:0 +#: view:open.questionnaire.line:0 +#: field:open.questionnaire.line,wizard_id:0 +#, python-format +msgid "Questionnaire" +msgstr "Spørreskjemaet" + +#. module: crm_profiling +#: view:open.questionnaire:0 +msgid "Save Data" +msgstr "Lagre data" + +#~ msgid "Avalaible answers" +#~ msgstr "Tilgjengelige svar." diff --git a/addons/document/board_document_view.xml b/addons/document/board_document_view.xml index a802d788e05..986b054383f 100644 --- a/addons/document/board_document_view.xml +++ b/addons/document/board_document_view.xml @@ -8,9 +8,6 @@
- diff --git a/addons/document_ftp/i18n/nb.po b/addons/document_ftp/i18n/nb.po new file mode 100644 index 00000000000..3598b00f54c --- /dev/null +++ b/addons/document_ftp/i18n/nb.po @@ -0,0 +1,121 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-06 14:45+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-07 04:59+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: document_ftp +#: model:ir.model,name:document_ftp.model_document_ftp_configuration +msgid "Auto Directory Configuration" +msgstr "Automatisk Katalog Konfigurasjon." + +#. module: document_ftp +#: view:document.ftp.configuration:0 +msgid "" +"Indicate the network address on which your OpenERP server should be " +"reachable for end-users. This depends on your network topology and " +"configuration, and will only affect the links displayed to the users. The " +"format is HOST:PORT and the default host (localhost) is only suitable for " +"access from the server machine itself.." +msgstr "" +"Indikere nettverksadressen som din OpenERP server bør være tilgjengelige for " +"sluttbrukerne. Dette avhenger av nettverkstopologi og konfigurasjon, og vil " +"bare påvirke lenker som vises til brukerne. Formatet er HOST: PORT og " +"standard verten (lokalhost) er bare egnet for tilgang fra serveren maskinen " +"selv .." + +#. module: document_ftp +#: model:ir.actions.url,name:document_ftp.action_document_browse +msgid "Browse Files" +msgstr "Bla i filer" + +#. module: document_ftp +#: field:document.ftp.configuration,config_logo:0 +msgid "Image" +msgstr "Bilde" + +#. module: document_ftp +#: field:document.ftp.configuration,host:0 +msgid "Address" +msgstr "Adresse" + +#. module: document_ftp +#: field:document.ftp.browse,url:0 +msgid "FTP Server" +msgstr "FTP-tjener" + +#. module: document_ftp +#: model:ir.actions.act_window,name:document_ftp.action_config_auto_directory +msgid "FTP Server Configuration" +msgstr "FTP Serverkonfigurasjon" + +#. module: document_ftp +#: view:document.ftp.browse:0 +msgid "_Browse" +msgstr "_Bla gjennom" + +#. module: document_ftp +#: help:document.ftp.configuration,host:0 +msgid "" +"Server address or IP and port to which users should connect to for DMS access" +msgstr "" +"Server adresse eller IP og port til hvilke brukere som skal koble seg til " +"for DMS tilgang" + +#. module: document_ftp +#: model:ir.ui.menu,name:document_ftp.menu_document_browse +msgid "Shared Repository (FTP)" +msgstr "Wikimedia Commons (FTP)" + +#. module: document_ftp +#: view:document.ftp.browse:0 +msgid "_Cancel" +msgstr "_Avbryt" + +#. module: document_ftp +#: view:document.ftp.configuration:0 +msgid "Configure FTP Server" +msgstr "Konfigurer FTP serveren" + +#. module: document_ftp +#: view:document.ftp.configuration:0 +msgid "title" +msgstr "tittel" + +#. module: document_ftp +#: model:ir.model,name:document_ftp.model_document_ftp_browse +msgid "Document FTP Browse" +msgstr "Document FTP Bla i." + +#. module: document_ftp +#: view:document.ftp.configuration:0 +msgid "Knowledge Application Configuration" +msgstr "Kunnskap Programkonfigurasjon" + +#. module: document_ftp +#: model:ir.actions.act_window,name:document_ftp.action_ftp_browse +msgid "Document Browse" +msgstr "Dokument Bla i." + +#. module: document_ftp +#: view:document.ftp.browse:0 +msgid "Browse Document" +msgstr "Bla igjennom dokument" + +#. module: document_ftp +#: view:document.ftp.configuration:0 +msgid "res_config_contents" +msgstr "res_konfig_innhold" diff --git a/addons/document_page/document_page.py b/addons/document_page/document_page.py index 7304e2e9075..092d39f22e9 100644 --- a/addons/document_page/document_page.py +++ b/addons/document_page/document_page.py @@ -29,11 +29,13 @@ class document_page(osv.osv): _description = "Document Page" _order = 'name' - def _get_page_index(self, cr, uid, page): + def _get_page_index(self, cr, uid, page, link=True): index = [] for subpage in page.child_ids: index += ["
  • "+ self._get_page_index(cr, uid, subpage) +"
  • "] - r = '%s'%(page.id,page.name) + r = '' + if link: + r = '%s'%(page.id,page.name) if index: r += "
      " + "".join(index) + "
    " return r @@ -42,7 +44,7 @@ class document_page(osv.osv): res = {} for page in self.browse(cr, uid, ids, context=context): if page.type == "category": - content = self._get_page_index(cr, uid, page) + content = self._get_page_index(cr, uid, page, link=False) else: content = page.content res[page.id] = content @@ -120,12 +122,12 @@ class document_page_history(osv.osv): text2 = history_pool.read(cr, uid, [v2], ['content'])[0]['content'] line1 = line2 = '' if text1: - line1 = tools.ustr(text1.splitlines(1)) + line1 = text1.splitlines(1) if text2: - line2=tools.ustr(text2.splitlines(1)) + line2 = text2.splitlines(1) if (not line1 and not line2) or (line1 == line2): raise osv.except_osv(_('Warning!'), _('There are no changes in revisions.')) diff = difflib.HtmlDiff() - return diff.make_file(line1, line2, "Revision-%s" % (v1), "Revision-%s" % (v2), context=False) + return diff.make_table(line1, line2, "Revision-%s" % (v1), "Revision-%s" % (v2), context=True) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/document_page/document_page_view.xml b/addons/document_page/document_page_view.xml index fc3bd86fdaf..23c4b8f29c8 100644 --- a/addons/document_page/document_page_view.xml +++ b/addons/document_page/document_page_view.xml @@ -78,17 +78,6 @@ - - Category - document.page - [('type','=','category')] - {'default_type': 'category'} - form - tree,form - - - - Pages document.page @@ -100,7 +89,18 @@ Create web pages - + + + Category + document.page + [('type','=','category')] + {'default_type': 'category'} + form + tree,form + + + + diff --git a/addons/document_page/static/src/css/document_page.css b/addons/document_page/static/src/css/document_page.css index 77597fb4281..ddbbcffd45b 100644 --- a/addons/document_page/static/src/css/document_page.css +++ b/addons/document_page/static/src/css/document_page.css @@ -1,11 +1,12 @@ -.oe_document_page ul, .oe_document_page li { - padding: 2px 8px; - margin: 2px 8px; - list-style-type: circle; -} - .oe_form_editable .oe_document_page { display: none; } +table.diff {font-family:Courier; border:medium;} +.diff_header {background-color:#e0e0e0} +td.diff_header {text-align:right} +.diff_next {background-color:#c0c0c0} +.diff_add {background-color:#aaffaa} +.diff_chg {background-color:#ffff77} +.diff_sub {background-color:#ffaaaa} diff --git a/addons/document_page/wizard/document_page_show_diff_view.xml b/addons/document_page/wizard/document_page_show_diff_view.xml index f268db7ad2e..b1dfb536853 100644 --- a/addons/document_page/wizard/document_page_show_diff_view.xml +++ b/addons/document_page/wizard/document_page_show_diff_view.xml @@ -8,7 +8,7 @@ wizard.document.page.history.show_diff - +
    diff --git a/addons/document_webdav/i18n/nb.po b/addons/document_webdav/i18n/nb.po new file mode 100644 index 00000000000..d51ade795b3 --- /dev/null +++ b/addons/document_webdav/i18n/nb.po @@ -0,0 +1,197 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-07 17:44+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-08 04:54+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: document_webdav +#: field:document.webdav.dir.property,create_date:0 +#: field:document.webdav.file.property,create_date:0 +msgid "Date Created" +msgstr "Dato opprettet" + +#. module: document_webdav +#: model:ir.ui.menu,name:document_webdav.menu_document_props +msgid "Documents" +msgstr "Dokumenter" + +#. module: document_webdav +#: constraint:document.directory:0 +msgid "Error! You can not create recursive Directories." +msgstr "Feil! Du kan opprette rekursive kataloger." + +#. module: document_webdav +#: view:document.webdav.dir.property:0 +#: view:document.webdav.file.property:0 +msgid "Search Document properties" +msgstr "Søk Dokumentegenskaper." + +#. module: document_webdav +#: view:document.webdav.dir.property:0 +#: field:document.webdav.dir.property,namespace:0 +#: view:document.webdav.file.property:0 +#: field:document.webdav.file.property,namespace:0 +msgid "Namespace" +msgstr "Navnerom" + +#. module: document_webdav +#: field:document.directory,dav_prop_ids:0 +msgid "DAV properties" +msgstr "DAV egenskaper" + +#. module: document_webdav +#: model:ir.model,name:document_webdav.model_document_webdav_file_property +msgid "document.webdav.file.property" +msgstr "Dokumentet.WebDAV.fil.egenskap" + +#. module: document_webdav +#: view:document.webdav.dir.property:0 +#: view:document.webdav.file.property:0 +msgid "Group By..." +msgstr "Grupper etter ..." + +#. module: document_webdav +#: view:document.directory:0 +msgid "These properties will be added to WebDAV requests" +msgstr "Disse egenskapene vil bli lagt til WebDAV-forespørsler" + +#. module: document_webdav +#: model:ir.actions.act_window,name:document_webdav.action_file_props_form +msgid "DAV Properties for Documents" +msgstr "DAV Eiendommer for Dokumenter." + +#. module: document_webdav +#: code:addons/document_webdav/webdav.py:37 +#, python-format +msgid "PyWebDAV Import Error!" +msgstr "PyWebDAV importere Feil!" + +#. module: document_webdav +#: view:document.webdav.file.property:0 +#: field:document.webdav.file.property,file_id:0 +msgid "Document" +msgstr "Dokument" + +#. module: document_webdav +#: model:ir.ui.menu,name:document_webdav.menu_folder_props +msgid "Folders" +msgstr "Mapper" + +#. module: document_webdav +#: sql_constraint:document.directory:0 +msgid "Directory cannot be parent of itself!" +msgstr "Katalogen kan ikke være overordnede av seg selv!" + +#. module: document_webdav +#: view:document.directory:0 +msgid "Dynamic context" +msgstr "Dynamisk sammenheng" + +#. module: document_webdav +#: view:document.directory:0 +msgid "WebDAV properties" +msgstr "WebDAV egenskaper." + +#. module: document_webdav +#: sql_constraint:document.directory:0 +msgid "The directory name must be unique !" +msgstr "Katalogen Navnet må være unikt!" + +#. module: document_webdav +#: code:addons/document_webdav/webdav.py:37 +#, python-format +msgid "" +"Please install PyWebDAV from " +"http://code.google.com/p/pywebdav/downloads/detail?name=PyWebDAV-" +"0.9.4.tar.gz&can=2&q=/" +msgstr "" +"Vennligst installer PyWebDAV fra " +"http://code.google.com/p/pywebdav/downloads/detail?name=PyWebDAV-" +"0.9.4.tar.gz&can=2&q=/" + +#. module: document_webdav +#: model:ir.actions.act_window,name:document_webdav.action_dir_props_form +msgid "DAV Properties for Folders" +msgstr "DAV egenskaper for mapper." + +#. module: document_webdav +#: view:document.directory:0 +#: view:document.webdav.dir.property:0 +#: view:document.webdav.file.property:0 +msgid "Properties" +msgstr "Egenskaper" + +#. module: document_webdav +#: field:document.webdav.dir.property,name:0 +#: field:document.webdav.file.property,name:0 +msgid "Name" +msgstr "Navn" + +#. module: document_webdav +#: model:ir.model,name:document_webdav.model_document_webdav_dir_property +msgid "document.webdav.dir.property" +msgstr "Dokumentet.WebDAV.dir.eiendom" + +#. module: document_webdav +#: field:document.webdav.dir.property,value:0 +#: field:document.webdav.file.property,value:0 +msgid "Value" +msgstr "Verdi" + +#. module: document_webdav +#: field:document.webdav.dir.property,dir_id:0 +#: model:ir.model,name:document_webdav.model_document_directory +msgid "Directory" +msgstr "Katalog" + +#. module: document_webdav +#: field:document.webdav.dir.property,write_uid:0 +#: field:document.webdav.file.property,write_uid:0 +msgid "Last Modification User" +msgstr "Siste endring Bruker" + +#. module: document_webdav +#: view:document.webdav.dir.property:0 +msgid "Dir" +msgstr "Retn" + +#. module: document_webdav +#: field:document.webdav.dir.property,write_date:0 +#: field:document.webdav.file.property,write_date:0 +msgid "Date Modified" +msgstr "Dato endret" + +#. module: document_webdav +#: field:document.webdav.dir.property,create_uid:0 +#: field:document.webdav.file.property,create_uid:0 +msgid "Creator" +msgstr "Opprettet av" + +#. module: document_webdav +#: model:ir.ui.menu,name:document_webdav.menu_properties +msgid "DAV Properties" +msgstr "DAV Egenskaper." + +#. module: document_webdav +#: sql_constraint:document.directory:0 +msgid "Directory must have a parent or a storage" +msgstr "Katalog må ha en overordnede eller en lagringsplass." + +#. module: document_webdav +#: field:document.webdav.dir.property,do_subst:0 +#: field:document.webdav.file.property,do_subst:0 +msgid "Substitute" +msgstr "Erstatte" diff --git a/addons/edi/i18n/nb.po b/addons/edi/i18n/nb.po new file mode 100644 index 00000000000..bc8add1e6e9 --- /dev/null +++ b/addons/edi/i18n/nb.po @@ -0,0 +1,411 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-09-08 19:13+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-09 04:53+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: edi +#: sql_constraint:res.currency:0 +msgid "The currency code must be unique per company!" +msgstr "Valutakode må være unik pr. firma!" + +#. module: edi +#: model:ir.model,name:edi.model_res_partner_address +msgid "Partner Addresses" +msgstr "Partner adresser" + +#. module: edi +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "Firmanavn må være unikt !" + +#. module: edi +#: constraint:res.partner:0 +msgid "Error ! You cannot create recursive associated members." +msgstr "Feil! Du kan ikke opprette rekursive tilknyttede medlemmer." + +#. module: edi +#: field:edi.document,name:0 +msgid "EDI token" +msgstr "EDI tegn." + +#. module: edi +#: help:edi.document,name:0 +msgid "Unique identifier for retrieving an EDI document." +msgstr "Unik identifikator for å hente en EDI dokument." + +#. module: edi +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Feil ! Du kan ikke lage rekursive firmaer." + +#. module: edi +#: model:ir.model,name:edi.model_res_company +msgid "Companies" +msgstr "Firmaer" + +#. module: edi +#: sql_constraint:edi.document:0 +msgid "EDI Tokens must be unique!" +msgstr "EDI tegnet må være unikt!" + +#. module: edi +#: model:ir.model,name:edi.model_res_currency +msgid "Currency" +msgstr "Valuta" + +#. module: edi +#: code:addons/edi/models/edi.py:153 +#, python-format +msgid "" +"The document you are trying to import requires the OpenERP `%s` application. " +"You can install it by connecting as the administrator and opening the " +"configuration assistant." +msgstr "" +"Dokumentet du prøver å importere krever OpenERP `% s` søknad. Du kan " +"installere det ved å koble som administrator og åpne konfigurasjonen " +"assistent." + +#. module: edi +#: help:edi.document,document:0 +msgid "EDI document content" +msgstr "EDI dokumentinnhold" + +#. module: edi +#: model:ir.model,name:edi.model_edi_document +msgid "EDI Document" +msgstr "EDI dokument." + +#. module: edi +#: code:addons/edi/models/edi.py:48 +#, python-format +msgid "'%s' is an invalid external ID" +msgstr "'% s' er en ugyldig ekstern ID." + +#. module: edi +#: model:ir.model,name:edi.model_res_partner +msgid "Partner" +msgstr "Partner" + +#. module: edi +#: code:addons/edi/models/edi.py:152 +#, python-format +msgid "Missing Application" +msgstr "Manglende Søknad." + +#. module: edi +#: field:edi.document,document:0 +msgid "Document" +msgstr "Dokument" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:23 +msgid "View/Print" +msgstr "Vis / Skriv ut" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:28 +msgid "Import this document" +msgstr "Importer dette dokumentet." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:33 +msgid "Import it into an existing OpenERP instance" +msgstr "Importere den inn i en eksisterende OpenERP eksempel." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:36 +msgid "OpenERP instance address:" +msgstr "OpenERP eksempel adresse:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:39 +msgid "Import" +msgstr "Import" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:44 +msgid "Import it into a new OpenERP Online instance" +msgstr "Importere den til en ny OpenERP Online eksempel." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:47 +msgid "Create my new OpenERP instance" +msgstr "Opprett min nye OpenERP eksempel." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:52 +msgid "Import into another application" +msgstr "Importere til et annet program." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:54 +msgid "" +"OpenERP's Electronic Data Interchange documents are based on a generic and " +"language\n" +" independent" +msgstr "" +"OpenERP's elektronisk Data utveksler dokumentene er basert på en generisk og " +"språk.\n" +"                             " +" uavhengig." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:56 +msgid "JSON" +msgstr "JSON" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:56 +msgid "" +"serialization of the document's attribute.\n" +" It is usually very quick and straightforward to " +"create a small plug-in for your preferred\n" +" application that will be capable of importing " +"any OpenERP EDI document.\n" +" You can find out more details about how to do " +"this and what the content of OpenERP EDI documents\n" +" is like in the" +msgstr "" +"Serialisering av dokumentets attributtet.\n" +"                             Det er vanligvis svært rask og grei å lage en " +"liten plug-in for din foretrukne.\n" +"                             program som vil være i stand til å importere " +"noen OpenERP EDI dokument.\n" +"                             Du kan finne ut mer informasjon om hvordan du " +"gjør dette og hva innholdet i OpenERP EDI dokumenter\n" +"                             er som i." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:60 +msgid "OpenERP documentation" +msgstr "OpenERP dokumentasjon." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:61 +msgid "To get started immediately," +msgstr "Å komme i gang umiddelbart," + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:62 +msgid "see is all it takes to use this EDI document in Python" +msgstr "Se er alt som trengs for å bruke denne EDI dokumentet i Python." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:70 +msgid "You can download the raw EDI document here:" +msgstr "Du kan laste ned den rå EDI dokumentet her:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:73 +msgid "Download" +msgstr "Nedlastning" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:87 +msgid "Powered by" +msgstr "Drevet av." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi.xml:87 +msgid "OpenERP" +msgstr "OpenERP" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:34 +msgid "Invoice" +msgstr "Faktura" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:37 +msgid "Description" +msgstr "Beskrivelse:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:38 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:41 +msgid "Date" +msgstr "Dato" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:39 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:40 +msgid "Your Reference" +msgstr "Din referanse." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:50 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:57 +msgid "Product Description" +msgstr "Produktbeskrivelse" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:51 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:58 +msgid "Quantity" +msgstr "Antall" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:52 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:59 +msgid "Unit Price" +msgstr "Enhetspris" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:53 +msgid "Discount" +msgstr "Rabatt" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:54 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:61 +msgid "Price" +msgstr "Pris" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:72 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:81 +msgid "Net Total:" +msgstr "Netto total:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:83 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:92 +msgid "Taxes:" +msgstr "Avgifter:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:94 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:103 +msgid "Total:" +msgstr "Totalt:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:106 +msgid "Tax" +msgstr "Skatt" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:107 +msgid "Base Amount" +msgstr "Grunnbeløp" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:108 +msgid "Amount" +msgstr "Beløp" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:121 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:113 +msgid "Notes:" +msgstr "Notater:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:129 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:121 +msgid "Pay Online" +msgstr "Betal online." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:133 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:125 +msgid "Paypal" +msgstr "Paypal" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:135 +msgid "" +"You may directly pay this invoice online via Paypal's secure payment gateway:" +msgstr "" +"Du kan betale direkte denne fakturaen online via Paypal er sikker betaling " +"gateway:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:145 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:137 +msgid "Bank Wire Transfer" +msgstr "Bank Tråd overføring." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:147 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:139 +msgid "Please transfer" +msgstr "Vennligst overfør." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:148 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:140 +msgid "to" +msgstr "til" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:149 +msgid "" +"(postal address on the invoice header)\n" +" using one of the following bank accounts. Be sure to " +"mention the invoice\n" +" reference" +msgstr "" +"(postadresse på fakturaen header)\n" +"Ved hjelp av en av følgende bankkontoer. Sørg for å nevne faktura.\n" +"Referanse." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_account.xml:151 +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:143 +msgid "on the transfer:" +msgstr "På overføring:" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:36 +msgid "Order" +msgstr "Ordre" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:42 +msgid "Salesman" +msgstr "Selger" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:43 +msgid "Payment terms" +msgstr "Betalingsbetingelser" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:60 +msgid "Discount(%)" +msgstr "Raball(%)" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:127 +msgid "" +"You may directly pay this order online via Paypal's secure payment gateway:" +msgstr "" +"Du kan betale direkte i denne rekkefølgen online via Paypal's sikker " +"betaling gateway." + +#. openerp-web +#: /home/odo/repositories/addons/trunk/edi/static/src/xml/edi_sale_purchase.xml:141 +msgid "" +"(postal address on the order header)\n" +" using one of the following bank accounts. Be sure to " +"mention the document\n" +" reference" +msgstr "" +"Ostal adresse på bestillingen topp)\n" +"Ved hjelp av en av følgende bankkontoer. Sørg for å nevne dokumentet.\n" +"Referanse." diff --git a/addons/edi/static/src/xml/edi_account.xml b/addons/edi/static/src/xml/edi_account.xml index dc6ce3f8a1a..3ce1daebf93 100644 --- a/addons/edi/static/src/xml/edi_account.xml +++ b/addons/edi/static/src/xml/edi_account.xml @@ -151,7 +151,7 @@ reference on the transfer:

    -
      +
      • diff --git a/addons/edi/static/src/xml/edi_sale_purchase.xml b/addons/edi/static/src/xml/edi_sale_purchase.xml index 3b6497e4076..8d6bab67761 100644 --- a/addons/edi/static/src/xml/edi_sale_purchase.xml +++ b/addons/edi/static/src/xml/edi_sale_purchase.xml @@ -151,7 +151,7 @@ reference on the transfer:

        -
          +
          • diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py index b43b7d19b85..4080e62f002 100644 --- a/addons/email_template/email_template.py +++ b/addons/email_template/email_template.py @@ -28,6 +28,8 @@ from osv import osv from osv import fields import tools from tools.translate import _ +from tools.html_sanitize import html_sanitize +from tools import append_content_to_html from urllib import quote as quote _logger = logging.getLogger(__name__) @@ -38,10 +40,8 @@ except ImportError: class email_template(osv.osv): "Templates for sending email" - _inherit = 'mail.message' _name = "email.template" _description = 'Email Templates' - _rec_name = 'name' # override mail.message's behavior def render_template(self, cr, uid, template, model, res_id, context=None): """Render the given template text, replace mako expressions ``${expr}`` @@ -99,66 +99,46 @@ class email_template(osv.osv): mod_name = False if model_id: mod_name = self.pool.get('ir.model').browse(cr, uid, model_id, context).model - return {'value':{'model': mod_name}} - - def name_get(self, cr, uid, ids, context=None): - """ Override name_get of mail.message: return directly the template - name, and not the generated name from mail.message.common.""" - return [(record.id, record.name) for record in self.browse(cr, uid, ids, context=context)] + return {'value': {'model': mod_name}} _columns = { - 'name': fields.char('Name', size=250), - 'model_id': fields.many2one('ir.model', 'Related document model'), - 'lang': fields.char('Language Selection', size=250, + 'name': fields.char('Name'), + 'model_id': fields.many2one('ir.model', 'Applies to', help="The kind of document with with this template can be used"), + 'model': fields.related('model_id', 'model', type='char', string='Related Document Model', + size=128, select=True, store=True, readonly=True), + 'lang': fields.char('Language', help="Optional translation language (ISO code) to select when sending out an email. " "If not set, the english version will be used. " "This should usually be a placeholder expression " "that provides the appropriate language code, e.g. " - "${object.partner_id.lang.code}."), + "${object.partner_id.lang.code}.", + placeholder="${object.partner_id.lang.code}"), 'user_signature': fields.boolean('Add Signature', help="If checked, the user's signature will be appended to the text version " "of the message"), - 'report_name': fields.char('Report Filename', size=200, translate=True, - help="Name to use for the generated report file (may contain placeholders)\n" - "The extension can be omitted and will then come from the report type."), - 'report_template':fields.many2one('ir.actions.report.xml', 'Optional report to print and attach'), - 'ref_ir_act_window':fields.many2one('ir.actions.act_window', 'Sidebar action', readonly=True, - help="Sidebar action to make this template available on records " - "of the related document model"), - 'ref_ir_value':fields.many2one('ir.values', 'Sidebar Button', readonly=True, - help="Sidebar button to open the sidebar action"), - 'track_campaign_item': fields.boolean('Resource Tracking', - help="Enable this is you wish to include a special tracking marker " - "in outgoing emails so you can identify replies and link " - "them back to the corresponding resource record. " - "This is useful for CRM leads for example"), - - # Overridden mail.message.common fields for technical reasons: - 'model': fields.related('model_id','model', type='char', string='Related Document Model', - size=128, select=True, store=True, readonly=True), - # we need a separate m2m table to avoid ID collisions with the original mail.message entries - 'attachment_ids': fields.many2many('ir.attachment', 'email_template_attachment_rel', 'email_template_id', - 'attachment_id', 'Files to attach', - help="You may attach files to this template, to be added to all " - "emails created from this template"), - - # Overridden mail.message.common fields to make tooltips more appropriate: - 'subject':fields.char('Subject', size=512, translate=True, help="Subject (placeholders may be used here)",), - 'email_from': fields.char('From', size=128, help="Sender address (placeholders may be used here)"), - 'email_to': fields.char('To', size=256, help="Comma-separated recipient addresses (placeholders may be used here)"), - 'email_cc': fields.char('Cc', size=256, help="Carbon copy recipients (placeholders may be used here)"), - 'email_bcc': fields.char('Bcc', size=256, help="Blind carbon copy recipients (placeholders may be used here)"), - 'reply_to': fields.char('Reply-To', size=250, help="Preferred response address (placeholders may be used here)"), + 'subject': fields.char('Subject', translate=True, help="Subject (placeholders may be used here)",), + 'email_from': fields.char('From', help="Sender address (placeholders may be used here)"), + 'email_to': fields.char('To', help="Comma-separated recipient addresses (placeholders may be used here)"), + 'email_cc': fields.char('Cc', help="Carbon copy recipients (placeholders may be used here)"), + 'reply_to': fields.char('Reply-To', help="Preferred response address (placeholders may be used here)"), 'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing Mail Server', readonly=False, help="Optional preferred server for outgoing mails. If not set, the highest " "priority one will be used."), - 'body_text': fields.text('Text Contents', translate=True, help="Plaintext version of the message (placeholders may be used here)"), - 'body_html': fields.text('Rich-text Contents', translate=True, help="Rich-text/HTML version of the message (placeholders may be used here)"), - 'message_id': fields.char('Message-Id', size=256, help="Message-ID SMTP header to use in outgoing messages based on this template. " - "Please note that this overrides the 'Resource Tracking' option, " - "so if you simply need to track replies to outgoing emails, enable " - "that option instead.\n" - "Placeholders must be used here, as this value always needs to be unique!"), + 'body_html': fields.text('Body', translate=True, help="Rich-text/HTML version of the message (placeholders may be used here)"), + 'report_name': fields.char('Report Filename', translate=True, + help="Name to use for the generated report file (may contain placeholders)\n" + "The extension can be omitted and will then come from the report type."), + 'report_template': fields.many2one('ir.actions.report.xml', 'Optional report to print and attach'), + 'ref_ir_act_window': fields.many2one('ir.actions.act_window', 'Sidebar action', readonly=True, + help="Sidebar action to make this template available on records " + "of the related document model"), + 'ref_ir_value': fields.many2one('ir.values', 'Sidebar Button', readonly=True, + help="Sidebar button to open the sidebar action"), + 'attachment_ids': fields.many2many('ir.attachment', 'email_template_attachment_rel', 'email_template_id', + 'attachment_id', 'Attachments', + help="You may attach files to this template, to be added to all " + "emails created from this template"), + 'auto_delete': fields.boolean('Auto Delete', help="Permanently delete this email after sending it, to save space"), # Fake fields used to implement the placeholder assistant 'model_object_field': fields.many2one('ir.model.fields', string="Field", @@ -172,12 +152,12 @@ class email_template(osv.osv): help="When a relationship field is selected as first field, " "this field lets you select the target field within the " "destination document model (sub-model)."), - 'null_value': fields.char('Null value', help="Optional value to use if the target field is empty", size=128), - 'copyvalue': fields.char('Expression', size=256, help="Final placeholder expression, to be copy-pasted in the desired template field."), + 'null_value': fields.char('Default Value', help="Optional value to use if the target field is empty"), + 'copyvalue': fields.char('Placeholder Expression', help="Final placeholder expression, to be copy-pasted in the desired template field."), } _defaults = { - 'track_campaign_item': True + 'auto_delete': True, } def create_action(self, cr, uid, ids, context=None): @@ -195,7 +175,7 @@ class email_template(osv.osv): 'res_model': 'mail.compose.message', 'src_model': src_obj, 'view_type': 'form', - 'context': "{'mail.compose.message.mode':'mass_mail', 'mail.compose.template_id' : %d}" % (template.id), + 'context': "{'default_composition_mode': 'mass_mail', 'default_template_id' : %d}" % (template.id), 'view_mode':'form,tree', 'view_id': res_id, 'target': 'new', @@ -222,7 +202,7 @@ class email_template(osv.osv): if template.ref_ir_value: ir_values_obj = self.pool.get('ir.values') ir_values_obj.unlink(cr, uid, template.ref_ir_value.id, context) - except: + except Exception: raise osv.except_osv(_("Warning"), _("Deletion of the action record failed.")) return True @@ -294,65 +274,33 @@ class email_template(osv.osv): :param res_id: id of the record to use for rendering the template (model is taken from template definition) :returns: a dict containing all relevant fields for creating a new - mail.message entry, with the addition one additional - special key ``attachments`` containing a list of + mail.mail entry, with one extra key ``attachments``, in the + format expected by :py:meth:`mail_thread.message_post`. """ if context is None: context = {} - values = { - 'subject': False, - 'body_text': False, - 'body_html': False, - 'email_from': False, - 'email_to': False, - 'email_cc': False, - 'email_bcc': False, - 'reply_to': False, - 'auto_delete': False, - 'model': False, - 'res_id': False, - 'mail_server_id': False, - 'attachments': False, - 'attachment_ids': False, - 'message_id': False, - 'state': 'outgoing', - 'content_subtype': 'plain', - 'partner_ids': [], - } - if not template_id: - return values - report_xml_pool = self.pool.get('ir.actions.report.xml') template = self.get_email_template(cr, uid, template_id, res_id, context) - - for field in ['subject', 'body_text', 'body_html', 'email_from', - 'email_to', 'email_cc', 'email_bcc', 'reply_to', - 'message_id']: + values = {} + for field in ['subject', 'body_html', 'email_from', + 'email_to', 'email_cc', 'reply_to']: values[field] = self.render_template(cr, uid, getattr(template, field), template.model, res_id, context=context) \ or False - - # if email_to: find or create a partner - if values['email_to']: - partner_id = self.pool.get('mail.thread').message_partner_by_email(cr, uid, values['email_to'], context=context)['partner_id'] - if not partner_id: - partner_id = self.pool.get('res.partner').name_create(cr, uid, values['email_to'], context=context) - values['partner_ids'] = [partner_id] - - if values['body_html']: - values.update(content_subtype='html') - if template.user_signature: signature = self.pool.get('res.users').browse(cr, uid, uid, context).signature - values['body_text'] += '\n\n' + signature + values['body_html'] = append_content_to_html(values['body_html'], signature) - values.update(mail_server_id = template.mail_server_id.id or False, - auto_delete = template.auto_delete, + if values['body_html']: + values['body'] = html_sanitize(values['body_html']) + + values.update(mail_server_id=template.mail_server_id.id or False, + auto_delete=template.auto_delete, model=template.model, res_id=res_id or False) - attachments = {} - # Add report as a Document + attachments = [] + # Add report in attachments if template.report_template: report_name = self.render_template(cr, uid, template.report_name, template.model, res_id, context=context) report_service = 'report.' + report_xml_pool.browse(cr, uid, template.report_template.id, context).report_name @@ -368,12 +316,11 @@ class email_template(osv.osv): ext = "." + format if not report_name.endswith(ext): report_name += ext - attachments[report_name] = result + attachments.append(report_name, result) - # Add document attachments + # Add template attachments for attach in template.attachment_ids: - # keep the bytes as fetched from the db, base64 encoded - attachments[attach.datas_fname] = attach.datas + attachments.append((attach.datas_fname, attach.datas)) values['attachments'] = attachments return values @@ -391,12 +338,12 @@ class email_template(osv.osv): :returns: id of the mail.message that was created """ if context is None: context = {} - mail_message = self.pool.get('mail.message') + mail_mail = self.pool.get('mail.mail') ir_attachment = self.pool.get('ir.attachment') values = self.generate_email(cr, uid, template_id, res_id, context=context) assert 'email_from' in values, 'email_from is missing or empty after template rendering, send_mail() cannot proceed' attachments = values.pop('attachments') or {} - msg_id = mail_message.create(cr, uid, values, context=context) + msg_id = mail_mail.create(cr, uid, values, context=context) # link attachments attachment_ids = [] for fname, fcontent in attachments.iteritems(): @@ -404,15 +351,15 @@ class email_template(osv.osv): 'name': fname, 'datas_fname': fname, 'datas': fcontent, - 'res_model': mail_message._name, + 'res_model': mail_mail._name, 'res_id': msg_id, } context.pop('default_type', None) attachment_ids.append(ir_attachment.create(cr, uid, attachment_data, context=context)) if attachment_ids: - mail_message.write(cr, uid, msg_id, {'attachment_ids': [(6, 0, attachment_ids)]}, context=context) + mail_mail.write(cr, uid, msg_id, {'attachment_ids': [(6, 0, attachment_ids)]}, context=context) if force_send: - mail_message.send(cr, uid, [msg_id], context=context) + mail_mail.send(cr, uid, [msg_id], context=context) return msg_id # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml index a04790d1c1c..448655a3121 100644 --- a/addons/email_template/email_template_view.xml +++ b/addons/email_template/email_template_view.xml @@ -1,99 +1,67 @@ - email.template.form email.template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
            +
            +
            + +
            + + + + + + + + + + + + + + + + + + + + - - -
    - + - + + + + + + - - + - - - - - - - - - - + + + - - + + + + - + - + + + + + + + + + + + + + @@ -128,7 +135,7 @@ -
    +
    diff --git a/addons/hr/static/src/css/hr.css b/addons/hr/static/src/css/hr.css index 11e72fad31e..eb0728c6f1c 100644 --- a/addons/hr/static/src/css/hr.css +++ b/addons/hr/static/src/css/hr.css @@ -65,4 +65,5 @@ .oe_employee_details li { margin: 2px 0; + padding: 0; } diff --git a/addons/hr_attendance/__openerp__.py b/addons/hr_attendance/__openerp__.py index 985c42e5a04..cb2cd261773 100644 --- a/addons/hr_attendance/__openerp__.py +++ b/addons/hr_attendance/__openerp__.py @@ -43,7 +43,6 @@ actions(Sign in/Sign out) performed by them. 'wizard/hr_attendance_bymonth_view.xml', 'wizard/hr_attendance_byweek_view.xml', 'wizard/hr_attendance_error_view.xml', - 'wizard/hr_attendance_sign_in_out_view.xml', ], 'demo': ['hr_attendance_demo.xml'], 'test': [ @@ -53,5 +52,10 @@ actions(Sign in/Sign out) performed by them. 'installable': True, 'auto_install': False, 'certificate': '0063495605613', + + #web + "js": ["static/src/js/attendance.js"], + 'qweb' : ["static/src/xml/attendance.xml"], + 'css' : ["static/src/css/slider.css"], } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/hr_attendance.py b/addons/hr_attendance/hr_attendance.py index 7a0cc7a8e51..d3bc79bda1a 100644 --- a/addons/hr_attendance/hr_attendance.py +++ b/addons/hr_attendance/hr_attendance.py @@ -112,9 +112,23 @@ class hr_employee(osv.osv): for res in cr.fetchall(): result[res[1]] = res[0] == 'sign_in' and 'present' or 'absent' return result + + def _last_sign(self, cr, uid, ids, name, args, context=None): + result = {} + if not ids: + return result + for id in ids: + result[id] = False + cr.execute("""select max(name) as name + from hr_attendance + where action in ('sign_in', 'sign_out') and employee_id = %s""",(id,)) + for res in cr.fetchall(): + result[id] = res[0] + return result _columns = { 'state': fields.function(_state, type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Attendance'), + 'last_sign': fields.function(_last_sign, type='datetime', string='Last Sign'), } def _action_check(self, cr, uid, emp_id, dt=False, context=None): @@ -122,30 +136,25 @@ class hr_employee(osv.osv): res = cr.fetchone() return not (res and (res[0]>=(dt or time.strftime('%Y-%m-%d %H:%M:%S')))) - def attendance_action_change(self, cr, uid, ids, type='action', context=None, dt=False, *args): - obj_attendance = self.pool.get('hr.attendance') - id = False - warning_sign = 'sign' - res = {} + def attendance_action_change(self, cr, uid, ids, context=None): + if context is None: + context = {} + action_date = context.get('action_date', False) + action = context.get('action', False) + hr_attendance = self.pool.get('hr.attendance') + warning_sign = {'sign_in': _('Sign In'), 'sign_out': _('Sign Out')} + for employee in self.browse(cr, uid, ids, context=context): + if not action: + if employee.state == 'present': action = 'sign_out' + if employee.state == 'absent': action = 'sign_in' - #Special case when button calls this method: type=context - if isinstance(type, dict): - type = type.get('type','action') - if type == 'sign_in': - warning_sign = "Sign In" - elif type == 'sign_out': - warning_sign = "Sign Out" - for emp in self.read(cr, uid, ids, ['id'], context=context): - if not self._action_check(cr, uid, emp['id'], dt, context): - raise osv.except_osv(_('Warning!'), _('You tried to %s with a date anterior to another event !\nTry to contact the administrator to correct attendances.')%(warning_sign,)) + if not self._action_check(cr, uid, employee.id, action_date, context): + raise osv.except_osv(_('Warning'), _('You tried to %s with a date anterior to another event !\nTry to contact the HR Manager to correct attendances.')%(warning_sign[action],)) - res = {'action': type, 'employee_id': emp['id']} - if dt: - res['name'] = dt - id = obj_attendance.create(cr, uid, res, context=context) - - if type != 'action': - return id + vals = {'action': action, 'employee_id': employee.id} + if action_date: + vals['name'] = action_date + hr_attendance.create(cr, uid, vals, context=context) return True hr_employee() diff --git a/addons/hr_attendance/hr_attendance_view.xml b/addons/hr_attendance/hr_attendance_view.xml index 1d0122d55fa..c686b4c1ff0 100644 --- a/addons/hr_attendance/hr_attendance_view.xml +++ b/addons/hr_attendance/hr_attendance_view.xml @@ -136,3 +136,5 @@ + + diff --git a/addons/hr_attendance/static/src/css/slider.css b/addons/hr_attendance/static/src/css/slider.css new file mode 100644 index 00000000000..664d4f96e41 --- /dev/null +++ b/addons/hr_attendance/static/src/css/slider.css @@ -0,0 +1,33 @@ + +.openerp .oe_attendance_status { + height: 32px; + width: 32px; + display: inline-block; +} +.openerp .oe_attendance_signin { + float:left; + height: 32px; + width: 32px; + background: url(/hr_attendance/static/src/img/emp-out32.png); + cursor: pointer; +} +.openerp .oe_attendance_signin:hover { + background: url(/hr_attendance/static/src/img/emp-out-disable32.png); +} +.openerp .oe_attendance_status.oe_attendance_signed .oe_attendance_signin { + display: none; +} + +.openerp .oe_attendance_signout { + float:right; + height: 32px; + width: 32px; + background: url(/hr_attendance/static/src/img/emp-in32.png); + cursor: pointer; +} +.openerp .oe_attendance_signout:hover { + background: url(/hr_attendance/static/src/img/emp-in-disable32.png); +} +.openerp .oe_attendance_status.oe_attendance_nosigned .oe_attendance_signout { + display: none; +} diff --git a/addons/hr_attendance/static/src/img/emp-in-disable32.png b/addons/hr_attendance/static/src/img/emp-in-disable32.png new file mode 100644 index 00000000000..1968e0de464 Binary files /dev/null and b/addons/hr_attendance/static/src/img/emp-in-disable32.png differ diff --git a/addons/hr_attendance/static/src/img/emp-in32.png b/addons/hr_attendance/static/src/img/emp-in32.png new file mode 100644 index 00000000000..26e3c01556b Binary files /dev/null and b/addons/hr_attendance/static/src/img/emp-in32.png differ diff --git a/addons/hr_attendance/static/src/img/emp-out-disable32.png b/addons/hr_attendance/static/src/img/emp-out-disable32.png new file mode 100644 index 00000000000..b7099e44529 Binary files /dev/null and b/addons/hr_attendance/static/src/img/emp-out-disable32.png differ diff --git a/addons/hr_attendance/static/src/img/emp-out32.png b/addons/hr_attendance/static/src/img/emp-out32.png new file mode 100644 index 00000000000..d2a6cbb5013 Binary files /dev/null and b/addons/hr_attendance/static/src/img/emp-out32.png differ diff --git a/addons/hr_attendance/static/src/js/attendance.js b/addons/hr_attendance/static/src/js/attendance.js new file mode 100644 index 00000000000..1b5e271b4ba --- /dev/null +++ b/addons/hr_attendance/static/src/js/attendance.js @@ -0,0 +1,84 @@ + +openerp.hr_attendance = function (instance) { + + var QWeb = instance.web.qweb; + var _t = instance.web._t; + var _lt = instance.web._lt; + + instance.hr_attendance.AttendanceSlider = instance.web.Widget.extend({ + template: 'AttendanceSlider', + init: function (parent) { + this._super(parent); + this.set({"signed_in": false}); + }, + start: function() { + var self = this; + var tmp = function() { + this.$el.toggleClass("oe_attendance_nosigned", ! this.get("signed_in")); + this.$el.toggleClass("oe_attendance_signed", this.get("signed_in")); + }; + this.on("change:signed_in", this, tmp); + _.bind(tmp, this)(); + this.$(".oe_attendance_signin").click(function() { + self.do_update_attendance(); + }); + this.$(".oe_attendance_signout").click(function() { + self.do_update_attendance(); + }); + this.$el.tipsy({ + title: function() { + var last_text = instance.web.format_value(self.last_sign, {type: "datetime"}); + var current_text = instance.web.format_value(new Date(), {type: "datetime"}); + var duration = self.last_sign ? $.timeago(self.last_sign) : "none"; + if (self.get("signed_in")) { + return _.str.sprintf(_t("Last sign in: %s,
    %s.
    Click to sign out."), last_text, duration); + } else { + return _.str.sprintf(_t("Click to Sign In at %s."), current_text); + } + }, + html: true, + }); + return this.check_attendance(); + }, + do_update_attendance: function () { + var self = this; + var hr_employee = new instance.web.DataSet(self, 'hr.employee'); + hr_employee.call('attendance_action_change', [ + [self.employee.id] + ]).done(function (result) { + self.last_sign = new Date(); + self.set({"signed_in": ! self.get("signed_in")}); + }); + }, + check_attendance: function () { + var self = this; + self.employee = false; + this.$el.hide(); + var employee = new instance.web.DataSetSearch(self, 'hr.employee', self.session.user_context, [ + ['user_id', '=', self.session.uid] + ]); + return employee.read_slice(['id', 'name', 'state', 'last_sign']).pipe(function (res) { + if (_.isEmpty(res)) + return; + self.$el.show(); + self.employee = res[0]; + self.last_sign = instance.web.str_to_datetime(self.employee.last_sign); + self.set({"signed_in": self.employee.state !== "absent"}); + }); + }, + }); + + instance.web.UserMenu.include({ + do_update: function () { + this._super(); + var self = this; + this.update_promise = this.update_promise.then(function () { + if (self.attendanceslider) + return; + self.attendanceslider = new instance.hr_attendance.AttendanceSlider(self); + + self.attendanceslider.prependTo(instance.webclient.$('.oe_systray')); + }); + }, + }); +} diff --git a/addons/hr_attendance/static/src/xml/attendance.xml b/addons/hr_attendance/static/src/xml/attendance.xml new file mode 100644 index 00000000000..3fd9bcf2798 --- /dev/null +++ b/addons/hr_attendance/static/src/xml/attendance.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/addons/hr_attendance/test/attendance_process.yml b/addons/hr_attendance/test/attendance_process.yml index 4ad765d65df..7902bf11d9d 100644 --- a/addons/hr_attendance/test/attendance_process.yml +++ b/addons/hr_attendance/test/attendance_process.yml @@ -1,16 +1,8 @@ - In order to test attendance process in OpenERP, I entry of SignIn of employee. - - !python {model: hr.sign.in.out}: | - context.update({'emp_id': [ref('hr.employee_al')]}) #TOFIX: emp_ids instead of 'emp_id' -- - !record {model: hr.sign.in.out, id: employee_sign_in}: - {} -- - Employee Signs In. -- - !python {model: hr.sign.in.out}: | - self.si_check(cr, uid, [ref("employee_sign_in")], context=context) + !python {model: hr.employee}: | + self.attendance_action_change(cr, uid, [ref("hr.employee_al")], context=context) - I check that Employee is "Present". - @@ -19,10 +11,10 @@ - After few seconds, employee sign's out. - - !python {model: hr.sign.in.out}: | + !python {model: hr.employee}: | import time time.sleep(2) - self.so_check(cr, uid, [ref("employee_sign_in")], context=context) + self.attendance_action_change(cr, uid, [ref("hr.employee_al")], context=context) - I check that Employee is "Absent". - diff --git a/addons/hr_attendance/wizard/__init__.py b/addons/hr_attendance/wizard/__init__.py index a414c9a8798..6269c507d8c 100644 --- a/addons/hr_attendance/wizard/__init__.py +++ b/addons/hr_attendance/wizard/__init__.py @@ -19,9 +19,8 @@ # ############################################################################## -import hr_attendance_sign_in_out import hr_attendance_error import hr_attendance_byweek import hr_attendance_bymonth -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py b/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py deleted file mode 100644 index 0ad4323ad78..00000000000 --- a/addons/hr_attendance/wizard/hr_attendance_sign_in_out.py +++ /dev/null @@ -1,184 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -import time - -from osv import osv, fields -from tools.translate import _ - -class hr_si_so_ask(osv.osv_memory): - _name = 'hr.sign.in.out.ask' - _description = 'Ask for Sign In Out' - _columns = { - 'name': fields.char('Employees name', size=32, required=True, readonly=True), - 'last_time': fields.datetime('Your last sign out', required=True), - 'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True), - } - - def _get_empname(self, cr, uid, context=None): - emp_id = context.get('emp_id', self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)) - if emp_id: - employee = self.pool.get('hr.employee').browse(cr, uid, emp_id, context=context)[0].name - return employee - return '' - - def _get_empid(self, cr, uid, context=None): - emp_id = context.get('emp_id', self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)) - if emp_id: - return emp_id[0] - return False - - _defaults = { - 'name': _get_empname, - 'emp_id': _get_empid, - } - - def sign_in(self, cr, uid, ids, context=None): - data = self.read(cr, uid, ids, [], context=context)[0] - data['emp_id'] = data['emp_id'] and data['emp_id'][0] - return self.pool.get('hr.sign.in.out').sign_in(cr, uid, data, context) - - def sign_out(self, cr, uid, ids, context=None): - data = self.read(cr, uid, ids, [], context=context)[0] - data['emp_id'] = data['emp_id'] and data['emp_id'][0] - return self.pool.get('hr.sign.in.out').sign_out(cr, uid, data, context) - -hr_si_so_ask() - -class hr_sign_in_out(osv.osv_memory): - _name = 'hr.sign.in.out' - _description = 'Sign In Sign Out' - - _columns = { - 'name': fields.char('Employees name', size=32, required=True, readonly=True), - 'state': fields.char('Current state', size=32, required=True, readonly=True), - 'emp_id': fields.many2one('hr.employee', 'Empoyee ID', readonly=True), - } - - def _get_empid(self, cr, uid, context=None): - emp_id = context.get('emp_id', self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)) - if emp_id: - employee = self.pool.get('hr.employee').browse(cr, uid, emp_id, context=context)[0] - return {'name': employee.name, 'state': employee.state, 'emp_id': emp_id[0]} - return {} - - def default_get(self, cr, uid, fields_list, context=None): - res = super(hr_sign_in_out, self).default_get(cr, uid, fields_list, context=context) - res_emp = self._get_empid(cr, uid, context=context) - res.update(res_emp) - return res - - def si_check(self, cr, uid, ids, context=None): - obj_model = self.pool.get('ir.model.data') - att_obj = self.pool.get('hr.attendance') - data = self.read(cr, uid, ids, [], context=context)[0] - data['emp_id'] = data['emp_id'] and data['emp_id'][0] - emp_id = data['emp_id'] - att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id)], limit=1, order='name desc') - last_att = att_obj.browse(cr, uid, att_id, context=context) - if last_att: - last_att = last_att[0] - cond = not last_att or last_att.action == 'sign_out' - if cond: - return self.sign_in(cr, uid, data, context) - else: - model_data_ids = obj_model.search(cr,uid,[('model','=','ir.ui.view'),('name','=','view_hr_attendance_so_ask')], context=context) - resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] - return { - 'name': _('Sign in / Sign out'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'hr.sign.in.out.ask', - 'views': [(resource_id,'form')], - 'type': 'ir.actions.act_window', - 'context': context, - 'target': 'new', - } - - def so_check(self, cr, uid, ids, context=None): - obj_model = self.pool.get('ir.model.data') - att_obj = self.pool.get('hr.attendance') - data = self.read(cr, uid, ids, [], context=context)[0] - data['emp_id'] = data['emp_id'] and data['emp_id'][0] - emp_id = data['emp_id'] - att_id = att_obj.search(cr, uid, [('employee_id', '=', emp_id),('action', '!=', 'action')], limit=1, order='name desc') - last_att = att_obj.browse(cr, uid, att_id, context=context) - if last_att: - last_att = last_att[0] - if not att_id and not last_att: - model_data_ids = obj_model.search(cr, uid, [('model','=','ir.ui.view'),('name','=','view_hr_attendance_message')], context=context) - resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] - return { - 'name': _('Sign in / Sign out'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'hr.sign.in.out', - 'views': [(resource_id,'form')], - 'type': 'ir.actions.act_window', - 'context': context, - 'target': 'new', - } - - cond = last_att and last_att['action'] == 'sign_in' - if cond: - return self.sign_out(cr, uid, data, context) - else: - model_data_ids = obj_model.search(cr, uid, [('model','=','ir.ui.view'),('name','=','view_hr_attendance_si_ask')], context=context) - resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id'] - return { - 'name': _('Sign in / Sign out'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'hr.sign.in.out.ask', - 'views': [(resource_id,'form')], - 'type': 'ir.actions.act_window', - 'target': 'new', - } - - def sign_in(self, cr, uid, data, context=None): - if context is None: - context = {} - emp_id = data['emp_id'] - if 'last_time' in data: - if data['last_time'] > time.strftime('%Y-%m-%d %H:%M:%S'): - raise osv.except_osv(_('User Error!'), _('The sign-out date must be in the past.')) - self.pool.get('hr.attendance').create(cr, uid, {'name': data['last_time'], 'action': 'sign_out', - 'employee_id': emp_id}, context=context) - try: - self.pool.get('hr.employee').attendance_action_change(cr, uid, [emp_id], 'sign_in') - except: - raise osv.except_osv(_('User Error!'), _('A sign-in must be right after a sign-out!')) - return {'type': 'ir.actions.act_window_close'} # To do: Return Success message - - def sign_out(self, cr, uid, data, context=None): - emp_id = data['emp_id'] - if 'last_time' in data: - if data['last_time'] > time.strftime('%Y-%m-%d %H:%M:%S'): - raise osv.except_osv(_('User Error!'), _('The sign-in date must be in the past.')) - self.pool.get('hr.attendance').create(cr, uid, {'name':data['last_time'], 'action':'sign_in', 'employee_id':emp_id}, context=context) - try: - self.pool.get('hr.employee').attendance_action_change(cr, uid, [emp_id], 'sign_out') - except: - raise osv.except_osv(_('User Error!'), _('A sign-out must be right after a sign-in.')) - return {'type': 'ir.actions.act_window_close'} # To do: Return Success message - -hr_sign_in_out() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/hr_attendance_sign_in_out_view.xml b/addons/hr_attendance/wizard/hr_attendance_sign_in_out_view.xml deleted file mode 100644 index 5c84be5107f..00000000000 --- a/addons/hr_attendance/wizard/hr_attendance_sign_in_out_view.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - hr.sign.in.out.form - hr.sign.in.out - -
    - - - - - - - -
    -
    -
    -
    -
    - - - hr.sign.in.out.form - hr.sign.in.out - -
    - - -
    -
    - - - Sign in / Sign out - hr.sign.in.out - form - tree,form - - new - Sign in / Sign out. In some companies, staff have to sign in when they arrive at work and sign out again at the end of the day. If each employee has been linked to a system user, then they can encode their time with this action button. - - - - - - hr.sign.in.out.ask.form - hr.sign.in.out.ask - -
    -
    -
    - - - - - -
    -
    -
    - - - hr.sign.in.out.ask.form - hr.sign.in.out.ask - -
    -
    -
    - - - - - -
    -
    -
    - -
    -
    diff --git a/addons/hr_contract/hr_contract_view.xml b/addons/hr_contract/hr_contract_view.xml index 10620cb9a4b..92ae2524921 100644 --- a/addons/hr_contract/hr_contract_view.xml +++ b/addons/hr_contract/hr_contract_view.xml @@ -1,7 +1,18 @@ + + + + + hr.hr.employee.view.form2 @@ -9,19 +20,20 @@ - + +
    @@ -389,21 +398,23 @@ + id="evaluation_reminders" name="Appraisal Reminders" + res_model="mail.compose.message" + src_model="hr.evaluation.interview" + view_type="form" view_mode="form" + target="new" multi="True" + key2="client_action_multi" + context="{'default_composition_mode': 'mass_mail', + 'default_body_text': 'Hello,\n\nKindly post your response for the survey interview.\n\nThanks', + 'default_subject': 'Reminder to fill up Survey'}"/> + context="{'search_default_user_to_review_id': [active_id], 'default_user_to_review_id': active_id}" + id="act_hr_employee_2_hr__evaluation_interview" + name="Appraisal Interviews" + res_model="hr.evaluation.interview" + src_model="hr.employee"/> diff --git a/addons/hr_evaluation/wizard/hr_evaluation_mail.py b/addons/hr_evaluation/wizard/hr_evaluation_mail.py deleted file mode 100644 index 35c54a4cca3..00000000000 --- a/addons/hr_evaluation/wizard/hr_evaluation_mail.py +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields, osv -import tools - -class hr_evaluation_reminder(osv.osv_memory): - _name = "hr.evaluation.reminder" - _description = "Sends Reminders to employees to fill the evaluations" - _columns = { - 'evaluation_id': fields.many2one('hr.evaluation.interview', 'Interview', required=True) - } - - def send_mail(self, cr, uid, ids, context=None): - mail_message = self.pool.get('mail.message') - hr_evaluation_interview_obj = self.pool.get('hr.evaluation.interview') - evaluation_data = self.read(cr, uid, ids, context=context)[0] - current_interview = hr_evaluation_interview_obj.browse(cr, uid, evaluation_data.get('evaluation_id')) - if current_interview.state == "waiting_answer" and current_interview.user_to_review_id.work_email : - msg = " Hello %s, \n\n Kindly post your response for '%s' survey interview. \n\n Thanks," %(current_interview.user_to_review_id.name, current_interview.survey_id.title) - mail_message.schedule_with_attach(cr, uid, tools.config['email_from'], [current_interview.user_to_review_id.work_email],\ - 'Reminder to fill up Survey', msg, context=context) - return {'type': 'ir.actions.act_window_close'} - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_evaluation/wizard/hr_evaluation_mail_view.xml b/addons/hr_evaluation/wizard/hr_evaluation_mail_view.xml deleted file mode 100644 index 89ae99bb6c3..00000000000 --- a/addons/hr_evaluation/wizard/hr_evaluation_mail_view.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - hr.evaluation.send.mail - hr.evaluation.reminder - - - - - -
    -
    - -
    -
    - - - Evaluation Send Mail - hr.evaluation.reminder - ir.actions.act_window - form - tree,form - - {'record_id':active_id} - new - - -
    -
    diff --git a/addons/hr_evaluation/wizard/mail_compose_message.py b/addons/hr_evaluation/wizard/mail_compose_message.py deleted file mode 100644 index 7e4ba326947..00000000000 --- a/addons/hr_evaluation/wizard/mail_compose_message.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2010-Today OpenERP SA () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# -############################################################################## - -from osv import osv -from osv import fields -import tools -from tools.translate import _ - -class mail_compose_message(osv.osv_memory): - _inherit = 'mail.compose.message' - - def get_value(self, cr, uid, model, resource_id, context=None): - ''' - To get values of the resource_id for the model - @param model: Object - @param resource_id: id of a record for which values to be read - - @return: Returns a dictionary - ''' - if context is None: - context = {} - result = super(mail_compose_message, self).get_value(cr, uid, model, resource_id, context=context) - if model == 'hr.evaluation.interview' and resource_id: - model_pool = self.pool.get(model) - record_data = model_pool.browse(cr, uid, resource_id, context) - if record_data.state == "waiting_answer": - msg = _("Hello %s, \n\n Kindly post your response for '%s' survey interview. \n\n Thanks,") %(record_data.user_to_review_id.name, record_data.survey_id.title) - result.update({ - 'email_to': record_data.user_to_review_id.work_email or False, - 'subject': _("Reminder to fill up Survey"), - 'body_text': msg, - }) - return result - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py index 9c148ad9019..63fca88b148 100644 --- a/addons/hr_expense/__openerp__.py +++ b/addons/hr_expense/__openerp__.py @@ -21,14 +21,14 @@ { - 'name': 'Expenses Management', + 'name': 'Expense Management', 'version': '1.0', 'category': 'Human Resources', 'sequence': 30, 'summary': 'Expenses Validation, Invoicing', 'description': """ -This module aims to manage employee's expenses. -=============================================== +This module aims to manage employee expenses. +============================================= The whole workflow is implemented: ---------------------------------- diff --git a/addons/hr_expense/board_hr_expense_view.xml b/addons/hr_expense/board_hr_expense_view.xml index fe89a4afc7a..3f896a76fae 100644 --- a/addons/hr_expense/board_hr_expense_view.xml +++ b/addons/hr_expense/board_hr_expense_view.xml @@ -17,7 +17,7 @@ - + diff --git a/addons/hr_expense/hr_expense_data.xml b/addons/hr_expense/hr_expense_data.xml index 6e41f3d4e05..2a9f3ae0a56 100644 --- a/addons/hr_expense/hr_expense_data.xml +++ b/addons/hr_expense/hr_expense_data.xml @@ -2,20 +2,20 @@ - - - - Module Expenses Management has been installed - Manage your employee's expenses, with validations by employee manager and accountant, creation and payment of invoices. + + mail.group + + notification + Expense Management application installed! + Manage your employees' expenses, after due validation by their manager and the accountant, then generate and pay the corresponding invoices. -This module also uses the analytic accounting and is compatible with the invoice on timesheet module so that you will be able to automatically re-invoice your customer's expenses if your work by project. - +This feature is also linked to analytic accounting and compatible with timesheet invoices, so you will be able to automatically re-invoice project-related expenses to your customers. + Expenses - diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py index d5a2728c763..070ae0344b0 100644 --- a/addons/hr_holidays/__openerp__.py +++ b/addons/hr_holidays/__openerp__.py @@ -21,7 +21,7 @@ { - 'name': 'Leaves Management', + 'name': 'Leave Management', 'version': '1.5', 'author': 'OpenERP SA', 'category': 'Human Resources', @@ -29,8 +29,8 @@ 'summary': 'Holidays, Allocation and Leave Requests', 'website': 'http://www.openerp.com', 'description': """ -This module allows you to manage leaves and leave's requests. -============================================================= +This module allows you to manage leaves and leave requests. +=========================================================== Implements a dashboard for human resource management that includes: ------------------------------------------------------------------- diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index f687e91c3f0..759170224bd 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -95,7 +95,7 @@ class hr_holidays(osv.osv): _name = "hr.holidays" _description = "Leave" _order = "type desc, date_from asc" - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = [ 'mail.thread','ir.needaction_mixin'] def _employee_get(self, cr, uid, context=None): ids = self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context) @@ -344,62 +344,53 @@ class hr_holidays(osv.osv): if leaves_rest < record.number_of_days_temp: raise osv.except_osv(_('Warning!'), _('There are not enough %s allocated for employee %s; please create an allocation request for this leave type.') % (record.holiday_status_id.name, record.employee_id.name)) return True - + # ----------------------------- # OpenChatter and notifications # ----------------------------- - - def get_needaction_user_ids(self, cr, uid, ids, context=None): - result = super(hr_holidays, self).get_needaction_user_ids(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.state == 'confirm' and obj.holiday_type == 'employee' and obj.employee_id.parent_id: - result[obj.id] = [obj.employee_id.parent_id.user_id.id] - elif obj.state == 'validate1': - # get group_hr_manager: everyone will be warned of second validation - res = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'group_hr_manager') or False - obj_id = res and res[1] or False - if obj_id: - hr_manager_group = self.pool.get('res.groups').read(cr, uid, [obj_id], ['users'], context=context)[0] - result[obj.id] = hr_manager_group['users'] - return result - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' and 'manager' to the monitored fields """ - res = super(hr_holidays, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - + def needaction_domain_get(self, cr, uid, ids, context=None): + # to be tested, otherwise convert into employee_id in ... + emp_obj = self.pool.get('hr.employee') + empids = emp_obj.search(cr, uid, [('parent_id.user_id','=',uid)], context=context) + dom = [ + '&', ('state','=','confirm'),('employee_id', 'in', empids) + ] + # if this user is a hr.manager, he should do second validations + if self.pool.get('res.users').has_group(cr, uid, 'base.group_hr_manager'): + dom = ['|'] + dom + [ ('state','=','validate1') ] + return dom + def create_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, ids, _('System notification'), - _("The request has been created and is waiting confirmation."), type='notification', context=context) + self.message_post(cr, uid, ids, + _("The request has been created and is waiting confirmation."), context=context) return True def holidays_confirm_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): - self.message_append_note(cr, uid, [obj.id], _('System notification'), - _("The request has been submitted and is waiting for validation by the manager."), type='notification') + self.message_post(cr, uid, [obj.id], + _("The request has been submitted and is waiting for validation by the manager."), context=context) def holidays_first_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_append_note(cr, uid, [obj.id], _('System notification'), - _("The request has been approved. A second validation is necessary and is now pending."), type='notification', context=context) + self.message_post(cr, uid, [obj.id], + _("The request has been approved. A second validation is necessary and is now pending."), context=context) def holidays_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): if obj.double_validation: - self.message_append_note(cr, uid, [obj.id], _('System notification'), - _("The request has been double validated. The validation process is now over."), type='notification', context=context) + self.message_post(cr, uid, [obj.id], + _("The request has been double validated. The validation process is now over."), context=context) else: - self.message_append_note(cr, uid, [obj.id], _('System notification'), - _("The request has been approved. The validation process is now over."), type='notification', context=context) - + self.message_post(cr, uid, [obj.id], + _("The request has been approved. The validation process is now over."), context=context) def holidays_refuse_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): - self.message_append_note(cr, uid, [obj.id], _('System notification'), - _("The request has been refused. The validation process is now over."), type='notification', context=context) - -hr_holidays() + self.message_post(cr, uid, [obj.id], + _("The request has been refused. The validation process is now over."), context=context) + class resource_calendar_leaves(osv.osv): _inherit = "resource.calendar.leaves" diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml index 9db0f2e987a..1e534093eb3 100644 --- a/addons/hr_holidays/hr_holidays_data.xml +++ b/addons/hr_holidays/hr_holidays_data.xml @@ -13,12 +13,15 @@ 100 - - - - Module Leaves Management has been installed - Manage employee leaves from the top menu "Human Resources". Employees can create leave requests that are validated by their manager and/or HR people. Once validated, they are visible in the employee's calendar. HR people can define leave types and allocate off-days for employees. - + + mail.group + + notification + Leave Management application installed! + Manage employee leaves from the top menu "Human Resources". Employees can create leave requests that are validated by their manager and/or HR officers. +Once validated, they are visible in the employee's calendar. HR officers can define leave types and allocate leaves to employees and employee categories. + + diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 650445b2ade..5a2e0603b88 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -44,7 +44,6 @@ - @@ -170,8 +169,7 @@ hr.holidays.allocation.tree hr.holidays - - + @@ -218,8 +216,7 @@ hr.holidays 20 - - + @@ -241,8 +238,7 @@ hr.holidays.tree hr.holidays - - + @@ -517,13 +513,17 @@ hr.employee - - + + + + + +
    diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml index 352861263b8..849c2fa7caa 100644 --- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml +++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml @@ -26,7 +26,7 @@ Now, at the time of login, I create Attendances and perform "Sign In" action. - !python {model: hr_timesheet_sheet.sheet}: | - self.sign_in(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], {}) + self.attendance_action_change(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], {}) task_work = self.search(cr, uid, [("name","=","Quentin Paolinon")],context)[0] task_ids = self.browse(cr, uid, task_work, context) assert task_ids.state == "draft", "I State In Timesheet" diff --git a/addons/idea/idea.py b/addons/idea/idea.py index 3be4dd2e28d..e2e5ec50ddf 100644 --- a/addons/idea/idea.py +++ b/addons/idea/idea.py @@ -67,21 +67,21 @@ class idea_idea(osv.osv): def idea_cancel(self, cr, uid, ids, context={}): self.write(cr, uid, ids, { 'state': 'cancel' }) - self.message_append_note(cr, uid, ids, body=_('Idea canceled.'), context=context) + self.message_post(cr, uid, ids, body=_('Idea canceled.'), context=context) return True def idea_open(self, cr, uid, ids, context={}): self.write(cr, uid, ids, { 'state': 'open'}) - self.message_append_note(cr, uid, ids, body=_('Idea accepted.'), context=context) + self.message_post(cr, uid, ids, body=_('Idea accepted.'), context=context) return True def idea_close(self, cr, uid, ids, context={}): - self.message_append_note(cr, uid, ids, body=_('Idea done.'), context=context) + self.message_post(cr, uid, ids, body=_('Idea done.'), context=context) self.write(cr, uid, ids, { 'state': 'close' }) return True def idea_draft(self, cr, uid, ids, context={}): - self.message_append_note(cr, uid, ids, body=_('Idea reset to draft.'), context=context) + self.message_post(cr, uid, ids, body=_('Idea reset to draft.'), context=context) self.write(cr, uid, ids, { 'state': 'draft' }) return True idea_idea() diff --git a/addons/import_base/i18n/nb.po b/addons/import_base/i18n/nb.po new file mode 100644 index 00000000000..62b30d04da6 --- /dev/null +++ b/addons/import_base/i18n/nb.po @@ -0,0 +1,105 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-08 19:39+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-09 04:52+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:434 +#, python-format +msgid "Import failed due to an unexpected error" +msgstr "Import mislyktes på grunn av en uventet feil." + +#. module: import_base +#: code:addons/import_base/import_framework.py:461 +#, python-format +msgid "started at %s and finished at %s \n" +msgstr "Startet på% s og ferdig på% s \n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:448 +#, python-format +msgid "Import of your data finished at %s" +msgstr "Import av dine data ferdig på% s" + +#. module: import_base +#: code:addons/import_base/import_framework.py:463 +#, python-format +msgid "" +"but failed, in consequence no data were imported to keep database " +"consistency \n" +" error : \n" +msgstr "" +"Men mislyktes, i følge ingen data ble importert for å holde databasen " +"konsistens\n" +"  feil: \n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:477 +#, python-format +msgid "" +"The import of data \n" +" instance name : %s \n" +msgstr "" +"Import av data\n" +" Eksempel navn:% s \n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:470 +#, python-format +msgid "%s has been successfully imported from %s %s, %s \n" +msgstr "% s har blitt importert fra% s% s,% s \n" + +#. module: import_base +#: code:addons/import_base/import_framework.py:447 +#, python-format +msgid "Data Import failed at %s due to an unexpected error" +msgstr "Dataimport mislyktes ved% s på grunn av en uventet feil." + +#. module: import_base +#: code:addons/import_base/import_framework.py:436 +#, python-format +msgid "Import finished, notification email sended" +msgstr "Import ferdig, e-postmelding sendt." + +#. module: import_base +#: code:addons/import_base/import_framework.py:190 +#, python-format +msgid "%s is not a valid model name" +msgstr "% s er ikke en gyldig modellnavn." + +#. module: import_base +#: model:ir.ui.menu,name:import_base.menu_import_crm +msgid "Import" +msgstr "Import" + +#. module: import_base +#: code:addons/import_base/import_framework.py:467 +#, python-format +msgid "with no warning" +msgstr "Uten advarsel." + +#. module: import_base +#: code:addons/import_base/import_framework.py:469 +#, python-format +msgid "with warning : %s" +msgstr "Med advarsel :%s" + +#. module: import_base +#: code:addons/import_base/import_framework.py:191 +#, python-format +msgid " fields imported : " +msgstr " Felt importert: " diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py index 74d2185b57e..7e0a055d95b 100644 --- a/addons/import_base/import_framework.py +++ b/addons/import_base/import_framework.py @@ -425,7 +425,7 @@ class import_framework(Thread): email_id = email_obj.create(self.cr, self.uid, { 'email_from' : 'import@module.openerp', 'email_to' : self.email, - 'body_text' : self.get_email_body(result, error), + 'body' : self.get_email_body(result, error), 'subject' : self.get_email_subject(result, error), 'auto_delete' : True}) email_obj.send(self.cr, self.uid, [email_id]) diff --git a/addons/import_google/i18n/nb.po b/addons/import_google/i18n/nb.po new file mode 100644 index 00000000000..a6414341f8f --- /dev/null +++ b/addons/import_google/i18n/nb.po @@ -0,0 +1,226 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-09 16:36+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-10 04:41+0000\n" +"X-Generator: Launchpad (build 15924)\n" + +#. module: import_google +#: help:synchronize.google.import,group_name:0 +msgid "Choose which group to import, By default it takes all." +msgstr "Velg hvilken gruppe du vil importere, standard tar alt." + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import Google Calendar Events" +msgstr "Importer Google Kalender Hendelser." + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Import Events" +msgstr "_Importer hendelser." + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:71 +#, python-format +msgid "" +"No Google Username or password Defined for user.\n" +"Please define in user view" +msgstr "" +"Ingen Google-brukernavn eller passord definert for brukeren.\n" +"Vennligst angi i brukerens visning." + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:127 +#, python-format +msgid "" +"Invalid login detail !\n" +" Specify Username/Password." +msgstr "" +"Ugyldig pålogging detalj!\n" +"  Angi brukernavn / passord." + +#. module: import_google +#: field:synchronize.google.import,supplier:0 +msgid "Supplier" +msgstr "Leverandør" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import Options" +msgstr "Alternativer for import" + +#. module: import_google +#: field:synchronize.google.import,group_name:0 +msgid "Group Name" +msgstr "Gruppe Navn" + +#. module: import_google +#: model:ir.model,name:import_google.model_crm_case_categ +msgid "Category of Case" +msgstr "Kategori for hendelse" + +#. module: import_google +#: model:ir.actions.act_window,name:import_google.act_google_login_contact_form +#: model:ir.ui.menu,name:import_google.menu_sync_contact +msgid "Import Google Contacts" +msgstr "Importer Google kontakter." + +#. module: import_google +#: view:google.import.message:0 +msgid "Import Google Data" +msgstr "Importer Google data." + +#. module: import_google +#: view:crm.meeting:0 +msgid "Meeting Type" +msgstr "Møtetype" + +#. module: import_google +#: code:addons/import_google/wizard/import_google.py:38 +#: code:addons/import_google/wizard/import_google_data.py:28 +#, python-format +msgid "" +"Please install gdata-python-client from http://code.google.com/p/gdata-" +"python-client/downloads/list" +msgstr "" +"Vennligst Installer gdata-python-client from http://code.google.com/p/gdata-" +"python-client/downloads/list" + +#. module: import_google +#: model:ir.model,name:import_google.model_google_login +msgid "Google Contact" +msgstr "Google kontakt" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Import contacts from a google account" +msgstr "Importer kontakter fra en Google-konto" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:133 +#, python-format +msgid "Please specify correct user and password !" +msgstr "Vennligst oppgi riktig bruker og passord!" + +#. module: import_google +#: field:synchronize.google.import,customer:0 +msgid "Customer" +msgstr "Kunde" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Cancel" +msgstr "_Avbryt" + +#. module: import_google +#: model:ir.model,name:import_google.model_synchronize_google_import +msgid "synchronize.google.import" +msgstr "Synkronisere.google.import" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "_Import Contacts" +msgstr "_Importer kontakter." + +#. module: import_google +#: model:ir.actions.act_window,name:import_google.act_google_login_form +#: model:ir.ui.menu,name:import_google.menu_sync_calendar +msgid "Import Google Calendar" +msgstr "Importer Google kalender." + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:50 +#, python-format +msgid "Import google" +msgstr "Importer Google." + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:127 +#: code:addons/import_google/wizard/import_google_data.py:133 +#, python-format +msgid "Error" +msgstr "Feil" + +#. module: import_google +#: code:addons/import_google/wizard/import_google_data.py:71 +#, python-format +msgid "Warning !" +msgstr "Advarsel !" + +#. module: import_google +#: field:synchronize.google.import,create_partner:0 +msgid "Options" +msgstr "Valg" + +#. module: import_google +#: view:google.import.message:0 +msgid "_Ok" +msgstr "_Ok" + +#. module: import_google +#: code:addons/import_google/wizard/import_google.py:38 +#: code:addons/import_google/wizard/import_google_data.py:28 +#, python-format +msgid "Google Contacts Import Error!" +msgstr "Google kontakter Import Feil!" + +#. module: import_google +#: model:ir.model,name:import_google.model_google_import_message +msgid "Import Message" +msgstr "Importer melding." + +#. module: import_google +#: field:synchronize.google.import,calendar_name:0 +msgid "Calendar Name" +msgstr "Kalendernavn" + +#. module: import_google +#: help:synchronize.google.import,supplier:0 +msgid "Check this box to set newly created partner as Supplier." +msgstr "Kryss av for å sette nyopprettede partner som leverandør." + +#. module: import_google +#: selection:synchronize.google.import,create_partner:0 +msgid "Import only address" +msgstr "Importer bare adresse." + +#. module: import_google +#: field:crm.case.categ,user_id:0 +msgid "User" +msgstr "Bruker" + +#. module: import_google +#: view:synchronize.google.import:0 +msgid "Partner Status for this Group:" +msgstr "" + +#. module: import_google +#: field:google.import.message,name:0 +msgid "Message" +msgstr "Melding" + +#. module: import_google +#: selection:synchronize.google.import,create_partner:0 +msgid "Create partner for each contact" +msgstr "Opprett partner for hver kontakt." + +#. module: import_google +#: help:synchronize.google.import,customer:0 +msgid "Check this box to set newly created partner as Customer." +msgstr "Kryss av for å sette nyopprettede partner som Kunden." + +#~ msgid "Partner status for this group:" +#~ msgstr "Partner status for denne gruppen." diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index 440a7b2b6f6..1646fb7ff2a 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -226,7 +226,7 @@ class sugar_import(import_framework): 'model': 'model', 'partner_id/.id': 'partner_id/.id', 'user_id/id': ref(self.TABLE_USER, 'assigned_user_id'), - 'body_text': 'description', + 'body': 'description', 'body_html' : 'description_html', } diff --git a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml index 893a977e62c..b1951a2a032 100644 --- a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml +++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml @@ -38,11 +38,11 @@ hr.employee.inherit.form hr.employee - + 30 - + diff --git a/addons/l10n_ca/i18n/nb.po b/addons/l10n_ca/i18n/nb.po new file mode 100644 index 00000000000..47276cdded2 --- /dev/null +++ b/addons/l10n_ca/i18n/nb.po @@ -0,0 +1,128 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-08-02 21:08+0000\n" +"PO-Revision-Date: 2012-09-09 16:43+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-10 04:41+0000\n" +"X-Generator: Launchpad (build 15924)\n" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_receivable +msgid "Receivable" +msgstr "Fordring" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.acct_type_asset_view +msgid "Asset View" +msgstr "Eiendel Vis" + +#. module: l10n_ca +#: model:ir.module.module,description:l10n_ca.module_meta_information +msgid "" +"This is the module to manage the canadian accounting chart in OpenERP." +msgstr "" +"Dette er modulen for å administrere kanadiske regnskap diagrammet i OpenERP." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.acct_type_expense_view +msgid "Expense View" +msgstr "Kostnad Vis" + +#. module: l10n_ca +#: constraint:account.account.template:0 +msgid "Error ! You can not create recursive account templates." +msgstr "Feil ! Du kan ikke opprette rekursive konto maler." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.acct_type_income_view +msgid "Income View" +msgstr "Inntekt Vis" + +#. module: l10n_ca +#: model:ir.module.module,shortdesc:l10n_ca.module_meta_information +msgid "Canada - Chart of Accounts" +msgstr "Canada - Kontoplan" + +#. module: l10n_ca +#: constraint:account.account.type:0 +msgid "Error ! You can not create recursive types." +msgstr "Feil ! Du kan ikke opprette rekursive typer." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_tax +msgid "Tax" +msgstr "Skatt" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_cash +msgid "Cash" +msgstr "Kontant" + +#. module: l10n_ca +#: model:ir.actions.todo,note:l10n_ca.config_call_account_template_ca +msgid "" +"Generate Chart of Accounts from a Chart Template. You will be asked to pass " +"the name of the company, the chart template to follow, the no. of digits to " +"generate the code for your accounts and Bank account, currency to create " +"Journals. Thus,the pure copy of chart Template is generated.\n" +"\tThis is the same wizard that runs from Financial " +"Management/Configuration/Financial Accounting/Financial Accounts/Generate " +"Chart of Accounts from a Chart Template." +msgstr "" +"Generere Kontoplan fra en diagrammal. Du vil bli bedt om å passere navnet på " +"selskapet, diagrammal til følge, nei. sifre som skal generere koden for " +"kontoene og bankkonto, valuta å skape Journals. Dermed er den rene kopi av " +"diagrammal generert.\n" +"\t Dette er den samme veiviser som går fra økonomistyring / konfigurasjon / " +"finansiell Regnskap / finansregnskapet / Generer Kontoplan fra en diagrammal." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_payable +msgid "Payable" +msgstr "Utgift" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_asset +msgid "Asset" +msgstr "Eiendel" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_equity +msgid "Equity" +msgstr "Egenkapital" + +#. module: l10n_ca +#: constraint:account.tax.code.template:0 +msgid "Error ! You can not create recursive Tax Codes." +msgstr "Feil ! Du kan ikke opprette rekursive skatte koder." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.acct_type_liability_view +msgid "Liability View" +msgstr "Ansvar Vis." + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_expense +msgid "Expense" +msgstr "Utgift" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_income +msgid "Income" +msgstr "Inntekt" + +#. module: l10n_ca +#: model:account.account.type,name:l10n_ca.account_type_view +msgid "View" +msgstr "Vis" diff --git a/addons/l10n_cn/i18n/nb.po b/addons/l10n_cn/i18n/nb.po new file mode 100644 index 00000000000..cafcf30d8e8 --- /dev/null +++ b/addons/l10n_cn/i18n/nb.po @@ -0,0 +1,66 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-12-23 09:56+0000\n" +"PO-Revision-Date: 2012-09-08 19:45+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-09 04:52+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_profit_and_loss +msgid "损益类" +msgstr "Gevinst eller tap kategori." + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_all +msgid "所有科目" +msgstr "Alle fag." + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_equity +msgid "所有者权益类" +msgstr "Eiernes egenkapital." + +#. module: l10n_cn +#: model:ir.actions.todo,note:l10n_cn.config_call_account_template_cn_chart +msgid "" +"Generate Chart of Accounts from a Chart Template. You will be asked to pass " +"the name of the company, the chart template to follow, the no. of digits to " +"generate the code for your accounts and Bank account, currency to create " +"Journals. Thus,the pure copy of chart Template is generated.\n" +"\tThis is the same wizard that runs from Financial " +"Management/Configuration/Financial Accounting/Financial Accounts/Generate " +"Chart of Accounts from a Chart Template." +msgstr "" +"Generere Kontoplan fra en diagrammal. Du vil bli bedt om å passere navnet på " +"selskapet, diagrammal til følge, nei. sifre som skal generere koden for " +"kontoene og bankkonto, valuta å skape Journals. Dermed er den rene kopi av " +"diagrammal generert.\n" +"\t Dette er den samme veiviser som går fra økonomistyring / konfigurasjon / " +"finansiell Regnskap / finansregnskapet / Generer Kontoplan fra en diagrammal." + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_debt +msgid "负债类" +msgstr "Gjeld klasse." + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_cost +msgid "成本类" +msgstr "Kostnaden for klassen" + +#. module: l10n_cn +#: model:account.account.type,name:l10n_cn.user_type_capital +msgid "资产类" +msgstr "Aktivaklasser" diff --git a/addons/l10n_de/i18n/nb.po b/addons/l10n_de/i18n/nb.po new file mode 100644 index 00000000000..b8ba51a6810 --- /dev/null +++ b/addons/l10n_de/i18n/nb.po @@ -0,0 +1,66 @@ +# Norwegian Bokmal translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2010-12-15 15:05+0000\n" +"PO-Revision-Date: 2012-09-08 19:47+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Norwegian Bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-09 04:52+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_non_eu_sale_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_non_eu_sale_skr04 +msgid "Kunde Ausland" +msgstr "Kunde Ausland" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_no_id_sale_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_no_id_sale_skr04 +msgid "Kunde EU (ohne USt-ID)" +msgstr "Kunde EU (ohne USt-ID)" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_non_eu_purchase_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_non_eu_purchase_skr04 +msgid "Lieferant Ausland" +msgstr "" + +#. module: l10n_de +#: model:ir.module.module,shortdesc:l10n_de.module_meta_information +msgid "Deutschland - SKR03 and SKR04" +msgstr "" + +#. module: l10n_de +#: model:ir.module.module,description:l10n_de.module_meta_information +msgid "" +"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem " +"SKR03." +msgstr "" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_vat_id_purchase_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_vat_id_purchase_skr04 +msgid "Lieferant EU Unternehmen (mit USt-ID)" +msgstr "" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_no_id_purchase_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_no_id_purchase_skr04 +msgid "Lieferant EU (ohne Ust-ID)" +msgstr "" + +#. module: l10n_de +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_vat_id_sale_skr03 +#: model:account.fiscal.position.template,name:l10n_de.fiscal_position_eu_vat_id_sale_skr04 +msgid "Kunde EU Unternehmen (mit USt-ID)" +msgstr "" diff --git a/addons/l10n_in_hr_payroll/__init__.py b/addons/l10n_in_hr_payroll/__init__.py new file mode 100644 index 00000000000..9631ccf0317 --- /dev/null +++ b/addons/l10n_in_hr_payroll/__init__.py @@ -0,0 +1,26 @@ +#-*- coding:utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2011 OpenERP SA (). All Rights Reserved +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import l10n_in_hr_payroll +import report +import wizard + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/__openerp__.py b/addons/l10n_in_hr_payroll/__openerp__.py new file mode 100644 index 00000000000..6d891c7a08e --- /dev/null +++ b/addons/l10n_in_hr_payroll/__openerp__.py @@ -0,0 +1,68 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': 'Indian Payroll', + 'category': 'Localization', + 'init_xml': [], + 'author': 'OpenERP SA', + 'website':'http://www.openerp.com', + 'depends': ['hr_payroll'], + 'version': '1.0', + 'description': """ +Indian Payroll Salary Rules. +============================ + + -Configuration of hr_payroll for India localization + -All main contributions rules for India payslip. + * New payslip report + * Employee Contracts + * Allow to configure Basic / Gross / Net Salary + * Employee PaySlip + * Allowance / Deduction + * Integrated with Holiday Management + * Medical Allowance, Travel Allowance, Child Allowance, ... + - Payroll Advice and Report + - Yearly Salary by Head and Yearly Salary by Employee Report + """, + 'active': False, + 'update_xml': [ + 'l10n_in_hr_payroll_view.xml', + 'data/l10n_in_hr_payroll_data.xml', + 'data/hr.salary.rule.csv', + 'security/ir.model.access.csv', + 'l10n_in_hr_payroll_report.xml', + 'l10n_in_hr_payroll_sequence.xml', + 'wizard/hr_salary_employee_bymonth_view.xml', + 'wizard/hr_yearly_salary_detail_view.xml', + 'report/payment_advice_report_view.xml', + 'report/payslip_report_view.xml', + + ], + 'test': [ + 'test/payment_advice.yml', + 'test/payment_advice_batch.yml' + ], + + 'demo_xml': ['l10n_in_hr_payroll_demo.xml'], + 'installable': True +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_in_hr_payroll/data/hr.salary.rule.csv b/addons/l10n_in_hr_payroll/data/hr.salary.rule.csv new file mode 100644 index 00000000000..2fe1ba739f4 --- /dev/null +++ b/addons/l10n_in_hr_payroll/data/hr.salary.rule.csv @@ -0,0 +1,5 @@ +"id","amount_select","condition_range_min","condition_range_max","amount_percentage","amount_fix","name","category_id","sequence","code","parent_rule_id/id","condition_select","condition_range","amount_percentage_base" +1,"fix",1,1,,100,"Education Allowance For One Child","Allowance",23,"CHEAONE","hr_payroll_rule_child1","range","employee.children", +2,"fix",2,10,,200,"Education Allowance For Two Child","Allowance",24,"CHEATWO","hr_payroll_rule_child1","range","employee.children", +3,"fix",1,1,,300,"Child Hostel Allowance For One Child","Allowance",26,"CHOONE","hr_payroll_rule_child2","range","employee.children", +4,"fix",2,10,,600,"Child Hostel Allowance For Two Child","Allowance",27,"CHOTWO","hr_payroll_rule_child2","range","employee.children", diff --git a/addons/l10n_in_hr_payroll/data/l10n_in_hr_payroll_data.xml b/addons/l10n_in_hr_payroll/data/l10n_in_hr_payroll_data.xml new file mode 100644 index 00000000000..8c6449e6336 --- /dev/null +++ b/addons/l10n_in_hr_payroll/data/l10n_in_hr_payroll_data.xml @@ -0,0 +1,584 @@ + + + + + + + Register for House Rent Allowance + + + + Register for Provident Fund + + + + Register for Professional Tax + + + + Register for Food Coupen + + + + Register for TDS + + + + Register for NPS Contribution + + + + Register for Voluntarily Provident Fund + + + + Register for Company Provided Transport Deduction + + + + Register for State Labour Welfare Fund Deduction + + + + Register for Company Provided Group Term Insurance Deduction + + + + Register for Leave Availed Deduction + + + + Register for Company Provided Medical Insurance Deduction + + + + Register for Other Deduction from Employer + + + + + DA + Dearness Allowance + + percentage + contract.wage + + + Dearness allowance (D.A.) is part of a person's salary. It is calculated as a percent of the basic salary. This amount is then added to the basic salary along with house rent allowance to get the total salary. Or you can say that The Dearness Allowance is a part of the total compensation a person receives for having performed his or her job. + + + + HRAMN + code + result = (payslip.company_id.dearness_allowance and +((contract.wage + DA) * contract.house_rent_allowance_metro_nonmetro / 100) +or (contract.wage * contract.house_rent_allowance_metro_nonmetro / 100)) + + House Rent Allowance + + + HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses. + + + + TCA + Transport/Conveyance Allownace + + fix + + + A conveyance allowance refers to an amount of money reimbursed to someone for the operation of a vehicle or the riding of a vehicle. The allowance is typically a designated amount or percentage of total transportation expenses that is referenced in a country's tax laws or code. Organizations and private or public businesses may also offer a conveyance allowance in addition to reimbursing employees or members for transportation expenses. In this instance, the conveyance allowance may identify an unusual transport occurrence that may not be covered by a designated travel expense report such as travel to a specific job site that requires a daily bus or taxi ride. + + + + SA + Grade/Special/Management/Supplementary Allowance + + python + result = bool(contract.supplementary_allowance) + code + result = contract.supplementary_allowance + + This allowance is normally given as an additional benefit to employees and is fully taxable. + + + + CHEA + Child Education Allowance + + python + result = bool(employee.children) + fix + + Per school going child 1200 per annum is non-taxable.Maximum for 2 children, so max 2400 per annum becomes non-taxable. + + + + CHEAH + Child Hostel Allowance + + python + result = bool(employee.children) + fix + In case the children are in hostel, the exemption available for child. + + + + + CBDA + City Compensatory Allowance + + none + + code + result = (payslip.company_id.dearness_allowance and ((contract.wage + DA) * 0.10) +or (contract.wage * 0.10)) + This allowance is paid to Employees who are posted in big cities. The purpose is to compensate the high cost of living in cities like Mumbai, Delhi, etc. However it is Fully Taxable. + + + + CMETRO + City Allowance for Metro city + + none + + fix + 850.0 + + + + CNMETRO + City Allowance for Non Metro city + + none + + fix + 800.0 + + + + ARRE + Arrears + + code + result = inputs.ARS.amount + + + Generally arrears are fully taxable, but employee may claim exemption u/s 89(1). +One would need to compute income tax on the arrears if it would have been received in actual year. +Now difference of income tax between payment year and actual year would be allowed for deduction. + + + + LTA + Leave Travel Allowance + + percentage + contract.wage + + + As per Income tax rules of India, if transport bills for LTA are not provided,the amount will be taxed. E.g. If an employee has LTA allowance as Rs 50,000 in his CTC(cost to company),and he provides proofs of Rs 40,000 (boarding pass,air tickets, taxi vouchers) then income tax will be deducted for rest of the Rs 10,000. Does not matter whats the amount of LTA in an employee’s package, income tax laws only permits domestic air tickets only for LTA claim. + + + + LE + Leave Encashment + + none + code + result = inputs.LE.amount + + Payment by way of leave encashment received by Central and State Govt.employees at the time of retirement in respect of the period of earned leave at credit is fully exempt. In case of other employees, the exemption is to be limited to minimum of all below: + 1.The actual amount received + 2.The cash equivalent of leave balance (max 30 days per year of service) + 3.Maximum of 10 months of leave encashment, based on last 10 months average salary + 4.Rs. 3 Lakh + + + + PI + Performance Incentive + + code + result = inputs.PERF.amount + + This would be fully taxable based on incentive. + + + + BONUS + Bonus + + code + result = inputs.BNS.amount + + This would be fully taxable based on Bonus. + + + + MEDA + Medical Allowance + + fix + + + This component is on-taxable up to 15000 per year (or Rs 1250 per month) on producing medical bills. + + + + MEDA + Medical Reimbursement + + code + result = inputs.MR.amount + + This component is on-taxable up to 15000 per year (or Rs 1250 per month) on producing medical bills. + + + + fix + + worked_days.WORK100.number_of_days + FC + + Food Allowance + + + + + + PERJ + Periodical Journals + + code + result = inputs.PJ.amount + + Some employers may provide component for buying magazines, journals and books as a part of knowledge enhancement for business growth.This part would become non taxable on providing original bills. + + + + UNIFS + Uniform/Dress Allowance for Senior Executive + + fix + + + Some sections of employees mat get allowance for purchase of office dress/uniform.In such case, the component would become non-taxable. + + + + UNIFJ + Uniform/Dress Allowance for Junior Executive + + fix + + + Some sections of employees mat get allowance for purchase of office dress/uniform.In such case, the component would become non-taxable. + + + + TELR + Telephone Reimbursement + + code + result = inputs.TR.amount + + In some of the cases, companies may provide a component for telephone bills.Employees may provide actual phone usage bills to reimburse this component and make it non-taxable. + + + + + PDA + Professional Development Allowance + + fix + + + + + + CAR + Car Expenses Reimbursement + + code + result = inputs.CEI.amount + + In case company provides component for this and employee use self owned car for official and personal purposes, Rs 1800 per month would be non-taxable on showing bills for fuel or can maintenance. This amount would be Rs 2400 in case car is more capacity than 1600cc. + + + + INT + Internet Expense + + code + result = inputs.IE.amount + + Employer may also provide reimbursement of internet expenses and thus this would become non taxable. + + + + DRI + Driver Salary + + python + result = bool(contract.driver_salay) + fix + + + Rs. 900 per month (non taxable) + + + + + + + TDS + Tax Deducted at Source + + python + result = bool(contract.tds) + code + result = -(contract.tds) + + + As per income tax rules, all payment which are taxable in nature should be done after deduction of taxes at the source itself. Hence employer compute income tax on salary payment and deduct it every month. This TDS is based on employee’s saving/investment declaration at the start of year. If investments for tax saving is not done, large amount may be deducted in last few months. + + + + PTD + Professional Tax + + python + result = contract.wage >= 3000 + code + result = (-200 if contract.wage >= 12000 +else -150 if ((contract.wage >= 9000) and (contract.wage <= 11999)) +else -80 if ((contract.wage >= 6000) and (contract.wage <= 8999)) +else -20 if ((contract.wage >= 3000) and (contract.wage <= 5999)) +else -0) + + + Workers living in states that impose the professional tax must submit a payment each half-year for the right to practice a profession or trade. It applies equally to employees who work for the national or state government, and those employed by private corporations. The professional tax uses a six-month accounting system, which divides the year into two periods, beginning on April 1 and October 1. + + + + EPMF + Employee's PF Contribution + + code + result = (payslip.company_id.dearness_allowance and - ((contract.wage + DA) * 0.12) +or - (contract.wage * 0.12)) + Employer contribution does not become part of employee’s income and hence income tax is not payable on this part. + + + + + + ENPFC + Employee's NPS Contribution + + code + result = (payslip.company_id.dearness_allowance and - ((contract.wage + DA) * 0.10) +or - (contract.wage * 0.10)) + + + Employee can claim deduction even of employer's contribution to NPS. + + + + VPF + Voluntarily Provident Fund Contribution + + python + result = bool(contract.voluntary_provident_fund) + code + result = (payslip.company_id.dearness_allowance and +- ((contract.wage + DA) * contract.voluntary_provident_fund / 100) +or - (contract.wage * contract.voluntary_provident_fund / 100)) + + + VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government.This additional amount enjoys all the benefits of PF except that the employer is not liable to contribute any extra amount apart from 12%.An added advantage is that the interest rate is equal to the interest rate of PF and he withdrawal is tax free. Please note that the maximum contribution towards VPF is 100% of your Basic.The highest rate of interest (close to 9%) makes it a very attractive saving scheme. Because of these advantages many employees chose not to close their PF account even after getting employment else where other than India.Employees also get a major tax break on their entire contribution to the fund up to a ceiling of Rs. 70,000/- + + + + CPT + Deduction for Company Provided Transport + + none + fix + + + + + Company provided transport amount is based on company. + + + + fix + + worked_days.WORK100.number_of_days + FD + + Deduction Towards Food Coupons + + + + + + LWFE + Employee's Deduction Towards State Labour Welfare Fund + + fix + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + LWF + Employer's Deduction Towards State Labour Welfare Fund + + fix + + + + + The LWF is applicable to all the members of the organisation except the Management staff (Staffs having authority to sign on the cheque/official documents on behalf of the organisation). for e.x. Employee Contribution is Rs. 3.00 and Employer contribution Rs. 6.00 Total Rs 9.00 and deposited to the LWF office.It is half yearly contribution (June and December). + + + + CGTI + Deduction Towards Company Provided Group Term Insurance + + fix + + + + Group term insurance provides a solid foundation to a comprehensive employee benifit program,backed up by government asistance in the form of valuable tax incentives to both employees and employers. + + + + DLA + Deduction Towards Leave Availed + + none + code + result = - (inputs.LAI.amount) + + + + + + CMT + Deduction Towards Company Provided Medical Insurance + + python + result = bool(contract.medical_insurance) + code + result = - (contract.medical_insurance) + + + + + + + + ODE + Other Deduction from Employer + + fix + + + + + + + + ENPC + Employer's NPS Contribution + + code + result = (payslip.company_id.dearness_allowance and - ((contract.wage + DA) * 0.10) +or - (contract.wage * 0.10)) + + + + Any amount contributed by your employer to your NPS account is treated as part of your salary and is included in your income but you can claim deduction under Section 80C for this too.thus, effectively making it exempt from tax within the limit of 10% of your basic salary. This is very useful and tax efficient for you particularly if you fall in the maximum tax. + + + + EPF + Employer's PF Contribution + + code + result = (payslip.company_id.dearness_allowance and - ((contract.wage + DA) * 0.12) +or - (contract.wage * 0.12)) + + + + Both the employees and employer contribute to the fund at the rate of 12% of the basic wages, dearness allowance and retaining allowance, if any, payable to employees per month. + + + + + + PERF + Performance of Employee + + + + + BNS + Bonus of Employee + + + + + ARS + Arrears + + + + + LE + Leave Encashment + + + + + PJ + Periodical Journals + + + + + TR + Telephone Reimbursement + + + + + CEI + Car Expenses + + + + + IE + Internet Expence + + + + + LAI + Leave Availed + + + + MR + Medical Reimbursement + + + + diff --git a/addons/l10n_in_hr_payroll/i18n/bn.po b/addons/l10n_in_hr_payroll/i18n/bn.po new file mode 100644 index 00000000000..ea9fcfd7bb3 --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/bn.po @@ -0,0 +1,933 @@ +# Bengali Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/i18n/gu.po b/addons/l10n_in_hr_payroll/i18n/gu.po new file mode 100644 index 00000000000..2c321b13191 --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/gu.po @@ -0,0 +1,933 @@ +# Gujarati Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Gujarati \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/i18n/hi.po b/addons/l10n_in_hr_payroll/i18n/hi.po new file mode 100644 index 00000000000..d7cc9dc1519 --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/hi.po @@ -0,0 +1,933 @@ +# Hindi Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Hindi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot b/addons/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot new file mode 100644 index 00000000000..552f85b5997 --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/l10n_in_hr_payroll.pot @@ -0,0 +1,933 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/i18n/ta.po b/addons/l10n_in_hr_payroll/i18n/ta.po new file mode 100644 index 00000000000..98d00c76a33 --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/ta.po @@ -0,0 +1,933 @@ +# Tamil Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Tamil \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/i18n/te.po b/addons/l10n_in_hr_payroll/i18n/te.po new file mode 100644 index 00000000000..0c6f6127c4d --- /dev/null +++ b/addons/l10n_in_hr_payroll/i18n/te.po @@ -0,0 +1,933 @@ +# Telugu Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * l10n_in_hr_payroll +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0alpha\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-08-17 06:46+0000\n" +"PO-Revision-Date: 2012-08-17 06:46+0000\n" +"Last-Translator: <>\n" +"Language-Team: Telugu \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "E-mail Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,employee_bank_no:0 +msgid "Employee Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in draft state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Title" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Payment Advice from" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail +msgid "Hr Salary Employee By Category Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employees Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Allowances with Basic:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Department" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Deductions:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "A/C no." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,driver_salay:0 +msgid "Driver Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail +msgid "Yearly Salary by Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list +msgid "Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "March" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "(" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,company_id:0 +#: field:hr.payroll.advice.line,company_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,company_id:0 +msgid "Company" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "The Manager" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Letter Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "," +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Set to Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,number_of_year:0 +msgid "Total years of work experience" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "to" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Total :" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payslip.run,available_advice:0 +msgid "Made Payment Advice?" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Advices which are paid using NEFT transfer" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,tds:0 +msgid "Amount for Tax Deduction at Source" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip +msgid "Pay Slip" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,day:0 +msgid "Day" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Month of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.payslip:0 +msgid "Payslip 'Date From' must be before 'Date To'." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,batch_id:0 +msgid "Batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Other Information" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Cancelled" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "For" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Details by Salary Rule Category:" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,voluntary_provident_fund:0 +msgid "VPF computed as percentage(%)" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,number:0 +#: report:paylip.details.in:0 +msgid "Reference" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Group By..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,medical_insurance:0 +msgid "Medical Insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Identification No" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.payroll.advice,state:0 +#: selection:payment.advice.report,state:0 +msgid "Confirmed" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,bysal:0 +#: field:payment.advice.report,bysal:0 +#: report:payroll.advice:0 +msgid "By Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Confirm" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,chaque_nos:0 +#: field:payment.advice.report,cheque_nos:0 +msgid "Cheque Numbers" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month +msgid "Yearly Salary by Head" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#, python-format +msgid "You can not confirm Payment advice without advice lines." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,state:0 +#: field:payment.advice.report,state:0 +msgid "State" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Yours Sincerely" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,medical_insurance:0 +msgid "Deduction towards company provided medical insurance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line +msgid "Bank Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Email" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payslip.run,available_advice:0 +msgid "If this box is checked which means that Payment Advice exists for current batch" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Error !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Print" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run +msgid "Payslip Batches" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,debit_credit:0 +#: report:payroll.advice:0 +msgid "C/D" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.employee.bymonth:0 +msgid "Yearly Salary Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice +msgid "Print Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,line_ids:0 +msgid "Employee Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "July" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Configuration" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree +#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice +msgid "Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all +#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice +#: view:payment.advice.report:0 +msgid "Advices Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc:0 +msgid "IFSC" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,tds:0 +msgid "TDS" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,join_date:0 +msgid "Join Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.contract:0 +msgid "Error! Contract start-date must be less than contract end-date." +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:res.company,dearness_allowance:0 +msgid "Dearness Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "August" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Deduction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Search Payment advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "SI. No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Payment Advices which are in confirm state" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "December" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Confirm Sheet" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,month:0 +msgid "Month" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Non Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "or" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month +msgid "Hr Salary Employee By Month Report" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,category_id:0 +msgid "Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240 +#, python-format +msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "To Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.employee,number_of_year:0 +msgid "No. of Years of Service" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Note" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Salary Rule Category" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: selection:hr.payroll.advice,state:0 +#: view:payment.advice.report:0 +#: selection:payment.advice.report,state:0 +msgid "Draft" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Date From" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,voluntary_provident_fund:0 +msgid "Voluntary Provident Fund" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Employee Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report +msgid "Payment Advice Analysis" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:payment.advice.report:0 +msgid "Status" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.contract,city_type:0 +msgid "Type of City" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:res.company,dearness_allowance:0 +msgid "Check this box if your company provide Dearness Allowance to employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,ifsc_code:0 +#: field:payment.advice.report,ifsc_code:0 +#: report:payroll.advice:0 +msgid "IFSC Code" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "June" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,nbr:0 +msgid "# Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report +msgid "PaySlip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Payment Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,date:0 +#: field:payment.advice.report,date:0 +msgid "Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "November" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Extended Filters..." +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all +msgid "This report performs analysis on Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "October" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Designation" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "January" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "Pay Head Employee Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:payroll.advice:0 +msgid "Authorized Signature" +msgstr "" + +#. module: l10n_in_hr_payroll +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract +msgid "Contract" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice.line:0 +msgid "Advice Lines" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "To," +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.contract,driver_salay:0 +msgid "Check this box if you provide allowance for driver" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice.line,advice_id:0 +#: field:hr.payslip,advice_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice +msgid "Bank Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Other No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Draft Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,neft:0 +msgid "Check this box if your company use online transfer for salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "To" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:payment.advice.report,number:0 +msgid "Number" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "September" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: view:hr.salary.employee.month:0 +#: view:yearly.salary.detail:0 +msgid "Cancel" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Day of Payment Advices" +msgstr "" + +#. module: l10n_in_hr_payroll +#: constraint:hr.employee:0 +msgid "Error! You cannot create recursive hierarchy of Employee(s)." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:yearly.salary.detail:0 +msgid "This wizard will print report which display a pay head employee breakup for a specified dates." +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Payslip Batches ready to be Adviced" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Pay Slip Details" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Total Salary" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,employee_id:0 +#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee +#: view:payment.advice.report:0 +#: field:payment.advice.report,employee_id:0 +msgid "Employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +msgid "Compute Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.employee,join_date:0 +msgid "Joining date of employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Dear Sir/Madam," +msgstr "Dear Sir/Madam," + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,note:0 +msgid "Description" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid ")" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:res.company:0 +msgid "Payroll" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "NEFT" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +msgid "Address" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,bank_id:0 +#: view:payment.advice.report:0 +#: field:payment.advice.report,bank_id:0 +#: report:payroll.advice:0 +#: report:salary.detail.byyear:0 +msgid "Bank" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,end_date:0 +#: field:yearly.salary.detail,date_to:0 +msgid "End Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "February" +msgstr "" + +#. module: l10n_in_hr_payroll +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payroll.advice:0 +#: field:hr.payroll.advice,name:0 +#: report:paylip.details.in:0 +#: field:payment.advice.report,name:0 +#: report:salary.employee.bymonth:0 +msgid "Name" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:hr.contract,city_type:0 +msgid "Metro" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +#: field:hr.salary.employee.month,employee_ids:0 +#: view:yearly.salary.detail:0 +#: field:yearly.salary.detail,employee_ids:0 +msgid "Employees" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Bank Account" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "April" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "Name of the Employe" +msgstr "" + +#. module: l10n_in_hr_payroll +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158 +#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257 +#, python-format +msgid "Please define bank account for the %s employee" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.salary.employee.month,start_date:0 +#: field:yearly.salary.detail,date_from:0 +msgid "Start Date" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.contract:0 +msgid "Allowance" +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,bank_id:0 +msgid "Select the Bank from which the salary is going to be paid" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.salary.employee.month:0 +msgid "Employee Pay Head Breakup" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:salary.detail.byyear:0 +msgid "Phone No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +msgid "Credit" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice.line,name:0 +#: report:payroll.advice:0 +msgid "Bank Account No." +msgstr "" + +#. module: l10n_in_hr_payroll +#: help:hr.payroll.advice,date:0 +msgid "Advice Date is used to search Payslips" +msgstr "" + +#. module: l10n_in_hr_payroll +#: selection:payment.advice.report,month:0 +msgid "May" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:hr.payslip.run:0 +msgid "Create Advice" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +#: field:payment.advice.report,year:0 +msgid "Year" +msgstr "" + +#. module: l10n_in_hr_payroll +#: field:hr.payroll.advice,neft:0 +#: field:payment.advice.report,neft:0 +msgid "NEFT Transaction" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:paylip.details.in:0 +#: report:salary.detail.byyear:0 +#: report:salary.employee.bymonth:0 +msgid "Total" +msgstr "" + +#. module: l10n_in_hr_payroll +#: report:payroll.advice:0 +msgid "form period" +msgstr "" + +#. module: l10n_in_hr_payroll +#: view:payment.advice.report:0 +msgid "Year of Payment Advices" +msgstr "" \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py new file mode 100644 index 00000000000..085a2679db2 --- /dev/null +++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py @@ -0,0 +1,283 @@ +#-*- coding:utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2011 OpenERP SA (). All Rights Reserved +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import time +from datetime import datetime +from dateutil.relativedelta import relativedelta +from calendar import isleap + +from tools.translate import _ +from osv import fields, osv +import netsvc +import decimal_precision as dp + +DATETIME_FORMAT = "%Y-%m-%d" + +class hr_contract(osv.osv): + """ + Employee contract allows to add different values in fields. + Fields are used in salary rule computation. + """ + + _inherit = 'hr.contract' + _description = 'HR Contract' + + _columns = { + 'tds': fields.float('TDS', digits_compute=dp.get_precision('Payroll'), help="Amount for Tax Deduction at Source"), + 'driver_salay': fields.boolean('Driver Salary', help="Check this box if you provide allowance for driver"), + 'medical_insurance': fields.float('Medical Insurance', digits_compute=dp.get_precision('Payroll'), help="Deduction towards company provided medical insurance"), + 'voluntary_provident_fund': fields.float('Voluntary Provident Fund (%)', digits_compute=dp.get_precision('Payroll'), help="VPF is a safe option wherein you can contribute more than the PF ceiling of 12% that has been mandated by the government and VPF computed as percentage(%)"), + 'house_rent_allowance_metro_nonmetro': fields.float('House Rent Allowance (%)', digits_compute=dp.get_precision('Payroll'), help="HRA is an allowance given by the employer to the employee for taking care of his rental or accommodation expenses for metro city it is 50 % and for non metro 40%.HRA computed as percentage(%)"), + 'supplementary_allowance': fields.float('Supplementary Allowance', digits_compute=dp.get_precision('Payroll')), + } + +hr_contract() + +class payroll_advice(osv.osv): + ''' + Bank Advice + ''' + _name = 'hr.payroll.advice' + _description = 'Bank Advice' + _columns = { + 'name':fields.char('Name', size=32, readonly=True, required=True, states={'draft': [('readonly', False)]},), + 'note': fields.text('Description'), + 'date': fields.date('Date', readonly=True, required=True, states={'draft': [('readonly', False)]}, help="Advice Date is used to search Payslips"), + 'state':fields.selection([ + ('draft', 'Draft'), + ('confirm', 'Confirmed'), + ('cancel', 'Cancelled'), + ], 'State', select=True, readonly=True), + 'number':fields.char('Reference', size=16, readonly=True), + 'line_ids':fields.one2many('hr.payroll.advice.line', 'advice_id', 'Employee Salary', states={'draft': [('readonly', False)]}, readonly=True), + 'chaque_nos':fields.char('Cheque Numbers', size=256), + 'neft': fields.boolean('NEFT Transaction', help="Check this box if your company use online transfer for salary"), + 'company_id':fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft': [('readonly', False)]}), + 'bank_id':fields.many2one('res.bank', 'Bank', readonly=True, states={'draft': [('readonly', False)]}, help="Select the Bank from which the salary is going to be paid"), + 'batch_id': fields.many2one('hr.payslip.run', 'Batch', readonly=True) + } + + _defaults = { + 'date': lambda * a: time.strftime('%Y-%m-%d'), + 'state': lambda * a: 'draft', + 'company_id': lambda self, cr, uid, context: \ + self.pool.get('res.users').browse(cr, uid, uid, + context=context).company_id.id, + 'note': "Please make the payroll transfer from above account number to the below mentioned account numbers towards employee salaries:" + } + + def compute_advice(self, cr, uid, ids, context=None): + """ + Advice - Create Advice lines in Payment Advice and + compute Advice lines. + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of Advice’s IDs + @return: Advice lines + @param context: A standard dictionary for contextual values + """ + payslip_pool = self.pool.get('hr.payslip') + advice_line_pool = self.pool.get('hr.payroll.advice.line') + payslip_line_pool = self.pool.get('hr.payslip.line') + + for advice in self.browse(cr, uid, ids, context=context): + old_line_ids = advice_line_pool.search(cr, uid, [('advice_id', '=', advice.id)], context=context) + if old_line_ids: + advice_line_pool.unlink(cr, uid, old_line_ids, context=context) + slip_ids = payslip_pool.search(cr, uid, [('date_from', '<=', advice.date), ('date_to', '>=', advice.date), ('state', '=', 'done')], context=context) + for slip in payslip_pool.browse(cr, uid, slip_ids, context=context): + if not slip.employee_id.bank_account_id and not slip.employee_id.bank_account_id.acc_number: + raise osv.except_osv(_('Error !'), _('Please define bank account for the %s employee') % (slip.employee_id.name)) + line_ids = payslip_line_pool.search(cr, uid, [ ('slip_id', '=', slip.id), ('code', '=', 'NET')], context=context) + if line_ids: + line = payslip_line_pool.browse(cr, uid, line_ids, context=context)[0] + advice_line = { + 'advice_id': advice.id, + 'name': slip.employee_id.bank_account_id.acc_number, + 'employee_id': slip.employee_id.id, + 'bysal': line.total + } + advice_line_pool.create(cr, uid, advice_line, context=context) + payslip_pool.write(cr, uid, slip_ids, {'advice_id': advice.id}, context=context) + return True + + def confirm_sheet(self, cr, uid, ids, context=None): + """ + confirm Advice - confirmed Advice after computing Advice Lines.. + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of confirm Advice’s IDs + @return: confirmed Advice lines and set sequence of Advice. + @param context: A standard dictionary for contextual values + """ + seq_obj = self.pool.get('ir.sequence') + for advice in self.browse(cr, uid, ids, context=context): + if not advice.line_ids: + raise osv.except_osv(_('Error !'), _('You can not confirm Payment advice without advice lines.')) + advice_date = datetime.strptime(advice.date, DATETIME_FORMAT) + advice_year = advice_date.strftime('%m') + '-' + advice_date.strftime('%Y') + number = seq_obj.get(cr, uid, 'payment.advice') + sequence_num = 'PAY' + '/' + advice_year + '/' + number + self.write(cr, uid, [advice.id], {'number': sequence_num, 'state': 'confirm'}, context=context) + return True + + def set_to_draft(self, cr, uid, ids, context=None): + """Resets Advice as draft. + """ + return self.write(cr, uid, ids, {'state':'draft'}, context=context) + + def cancel_sheet(self, cr, uid, ids, context=None): + """Marks Advice as cancelled. + """ + return self.write(cr, uid, ids, {'state':'cancel'}, context=context) + + def onchange_company_id(self, cr, uid, ids, company_id=False, context=None): + res = {} + if company_id: + company = self.pool.get('res.company').browse(cr, uid, [company_id], context=context)[0] + if company.partner_id.bank_ids: + res.update({'bank_id': company.partner_id.bank_ids[0].bank.id}) + return { + 'value':res + } +payroll_advice() + +class hr_payslip_run(osv.osv): + + _inherit = 'hr.payslip.run' + _description = 'Payslip Batches' + _columns = { + 'available_advice': fields.boolean('Made Payment Advice?', help="If this box is checked which means that Payment Advice exists for current batch", readonly=False), + } + def copy(self, cr, uid, id, default={}, context=None): + if not default: + default = {} + default.update({'available_advice': False}) + return super(hr_payslip_run, self).copy(cr, uid, id, default, context=context) + + def draft_payslip_run(self, cr, uid, ids, context=None): + res = super(hr_payslip_run, self).draft_payslip_run(cr, uid, ids, context=context) + self.write(cr, uid, ids, {'available_advice': False}, context=context) + return res + + def create_advice(self, cr, uid, ids, context=None): + wf_service = netsvc.LocalService("workflow") + payslip_pool = self.pool.get('hr.payslip') + payslip_line_pool = self.pool.get('hr.payslip.line') + advice_pool = self.pool.get('hr.payroll.advice') + advice_line_pool = self.pool.get('hr.payroll.advice.line') + users = self.pool.get('res.users').browse(cr, uid, [uid], context=context) + for run in self.browse(cr, uid, ids, context=context): + if run.available_advice: + raise osv.except_osv(_('Error !'), _("Payment advice already exists for %s, 'Set to Draft' to create a new advice.") %(run.name)) + advice_data = { + 'batch_id': run.id, + 'company_id': users[0].company_id.id, + 'name': run.name, + 'date': run.date_end, + 'bank_id': users[0].company_id.bank_ids and users[0].company_id.bank_ids[0].id or False + } + advice_id = advice_pool.create(cr, uid, advice_data, context=context) + slip_ids = [] + for slip_id in run.slip_ids: + wf_service.trg_validate(uid, 'hr.payslip', slip_id.id, 'hr_verify_sheet', cr) + wf_service.trg_validate(uid, 'hr.payslip', slip_id.id, 'process_sheet', cr) + slip_ids.append(slip_id.id) + + for slip in payslip_pool.browse(cr, uid, slip_ids, context=context): + if not slip.employee_id.bank_account_id or not slip.employee_id.bank_account_id.acc_number: + raise osv.except_osv(_('Error !'), _('Please define bank account for the %s employee') % (slip.employee_id.name)) + line_ids = payslip_line_pool.search(cr, uid, [('slip_id', '=', slip.id), ('code', '=', 'NET')], context=context) + if line_ids: + line = payslip_line_pool.browse(cr, uid, line_ids, context=context)[0] + advice_line = { + 'advice_id': advice_id, + 'name': slip.employee_id.bank_account_id.acc_number, + 'employee_id': slip.employee_id.id, + 'bysal': line.total + } + advice_line_pool.create(cr, uid, advice_line, context=context) + return self.write(cr, uid, ids, {'available_advice' : True}) + +hr_payslip_run() + +class payroll_advice_line(osv.osv): + ''' + Bank Advice Lines + ''' + def onchange_employee_id(self, cr, uid, ids, employee_id=False, context=None): + res = {} + hr_obj = self.pool.get('hr.employee') + if not employee_id: + return {'value': res} + employee = hr_obj.browse(cr, uid, [employee_id], context=context)[0] + res.update({'name': employee.bank_account_id.acc_number , 'ifsc_code': employee.bank_account_id.bank_bic or ''}) + return {'value': res} + + _name = 'hr.payroll.advice.line' + _description = 'Bank Advice Lines' + _columns = { + 'advice_id': fields.many2one('hr.payroll.advice', 'Bank Advice'), + 'name': fields.char('Bank Account No.', size=25, required=True), + 'ifsc_code': fields.char('IFSC Code', size=16), + 'employee_id': fields.many2one('hr.employee', 'Employee', required=True), + 'bysal': fields.float('By Salary', digits_compute=dp.get_precision('Payroll')), + 'debit_credit': fields.char('C/D', size=3, required=False), + 'company_id': fields.related('advice_id', 'company_id', type='many2one', required=False, relation='res.company', string='Company', store=True), + 'ifsc': fields.related('advice_id', 'neft', type='boolean', string='IFSC'), + } + _defaults = { + 'debit_credit': 'C', + } + +payroll_advice_line() + +class hr_payslip(osv.osv): + ''' + Employee Pay Slip + ''' + _inherit = 'hr.payslip' + _description = 'Pay Slips' + _columns = { + 'advice_id': fields.many2one('hr.payroll.advice', 'Bank Advice') + } + + def copy(self, cr, uid, id, default={}, context=None): + if not default: + default = {} + default.update({'advice_id' : False}) + return super(hr_payslip, self).copy(cr, uid, id, default, context=context) + +hr_payslip() + +class res_company(osv.osv): + + _inherit = 'res.company' + _columns = { + 'dearness_allowance': fields.boolean('Dearness Allowance', help="Check this box if your company provide Dearness Allowance to employee") + } + _defaults = { + 'dearness_allowance': True, + } + +res_company() + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_demo.xml b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_demo.xml new file mode 100644 index 00000000000..bcb168467a9 --- /dev/null +++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_demo.xml @@ -0,0 +1,16 @@ + + + + + + + + NE + Non-Executive Employee + + + + + + + diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_report.xml b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_report.xml new file mode 100644 index 00000000000..7f27291051f --- /dev/null +++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_report.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_sequence.xml b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_sequence.xml new file mode 100644 index 00000000000..3941d6461c9 --- /dev/null +++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_sequence.xml @@ -0,0 +1,17 @@ + + + + + + Payment Advice + payment.advice + + + + Payment Advice + payment.advice + 3 + + + + \ No newline at end of file diff --git a/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_view.xml b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_view.xml new file mode 100644 index 00000000000..37d2f865770 --- /dev/null +++ b/addons/l10n_in_hr_payroll/l10n_in_hr_payroll_view.xml @@ -0,0 +1,220 @@ + + + + + + hr.contract.form.in.inherit + hr.contract + + + + + + + + + + + + + + + + + + + + + + + hr.payslip.run.form.inherit + hr.payslip.run + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mail.mail.tree + mail.mail + + + + + + + + + + + + + - - +
      + +
    @@ -56,22 +47,11 @@ Template used to display the communication history in documents form view. --> -
    +
    -
    -
    - - - -
    -
    -

    Followers

    -
      -
      -
    • - +
      @@ -138,16 +118,15 @@
      -
      - +
      ', message.body, 'mail.message body is incorrect') + # Test: mail.message: attachments + for attach in message.attachment_ids: + self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect') + self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.message attachment res_id incorrect') + self.assertIn((attach.name, attach.datas.decode('base64')), _attachments_test, + 'mail.message attachment name / data incorrect') + + # ---------------------------------------- + # CASE3: mass_mail on Pigs and Bird + # ---------------------------------------- + + # 1. mass_mail on pigs and bird + compose_id = mail_compose.create(cr, uid, + {'subject': _subject, 'body': '${object.description}'}, + {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': -1, + 'active_ids': [self.group_pigs_id, group_bird_id]}) + compose = mail_compose.browse(cr, uid, compose_id) + # Test: content_subtype is html + self.assertEqual(compose.content_subtype, 'html', 'mail.compose.message content_subtype incorrect') + + # 2. Post the comment, get created message for each group + mail_compose.send_mail(cr, uid, [compose_id], + context={'default_res_id': -1, 'active_ids': [self.group_pigs_id, group_bird_id]}) + group_pigs.refresh() + group_bird.refresh() + message1 = group_pigs.message_ids[0] + message2 = group_bird.message_ids[0] + # Test: Pigs and Bird did receive their message + test_msg_ids = self.mail_message.search(cr, uid, [], limit=2) + self.assertIn(message1.id, test_msg_ids, 'Pigs did not receive its mass mailing message') + self.assertIn(message2.id, test_msg_ids, 'Bird did not receive its mass mailing message') + # Test: mail.message: subject, body + self.assertEqual(message1.subject, _subject, 'mail.message subject incorrect') + self.assertEqual(message1.body, group_pigs.description, 'mail.message body incorrect') + self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect') + self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect') + + def test_30_message_read(self): + """ Tests designed for message_read. """ + # TDE NOTE: this test is not finished, as the message_read method is not fully specified. + # It will be updated as soon as we have fixed specs ! + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + def _compare_structures(struct1, struct2, n=0): + # print '%scompare structure' % ('\t' * n) + self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect') + for x in range(len(struct1)): + # print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or '' + self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject')) + _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1) + # print '%send compare' % ('\t' * n) + + # ---------------------------------------- + # CASE1: Flattening test + # ---------------------------------------- + + # Create dummy message structure + import copy + tree = [{'id': 2, 'child_ids': [ + {'id': 6, 'child_ids': [ + {'id': 8, 'child_ids': []}, + ]}, + ]}, + {'id': 1, 'child_ids':[ + {'id': 7, 'child_ids': [ + {'id': 9, 'child_ids': []}, + ]}, + {'id': 4, 'child_ids': [ + {'id': 10, 'child_ids': []}, + {'id': 5, 'child_ids': []}, + ]}, + {'id': 3, 'child_ids': []}, + ]}, + ] + # Test: completely flat + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 0) + self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat') + # Test: 1 thread level + tree_test = [{'id': 2, 'child_ids': [ + {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []}, + ]}, + {'id': 1, 'child_ids': [ + {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []}, + {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []}, + {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []}, + ]}, + ] + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 1) + _compare_structures(new_tree, tree_test) + # Test: 2 thread levels + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 2) + _compare_structures(new_tree, tree) + + # ---------------------------------------- + # CASE2: message_read test + # ---------------------------------------- + + # 1. Add a few messages to pigs group + msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False) + msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1) + msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1) + msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False) + msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2) + msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4) + + # Test: read all messages flat + tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []}, + {'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=0, limit=10) + _compare_structures(tree, tree_test) + # Test: read with 1 level of thread + tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]}, + {'id': msgid1, 'child_ids': [ + {'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': []}, + ]}, + ] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=1, limit=10) + _compare_structures(tree, tree_test) + # Test: read with 2 levels of thread + tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]}, + {'id': msgid1, 'child_ids': [ + {'id': msgid3, 'child_ids': []}, + {'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]}, + ]}, + ] + tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=2, limit=10) + _compare_structures(tree, tree_test) + + # 2. Test expandables + # TDE FIXME: add those tests when expandables are specified and implemented + + def test_40_needaction(self): + """ Tests for mail.message needaction. """ + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + user_admin = self.res_users.browse(cr, uid, uid) + + # Demo values: check unread notification = needaction on mail.message + notif_ids = self.mail_notification.search(cr, uid, [ + ('partner_id', '=', user_admin.partner_id.id), + ('read', '=', False) + ]) + na_count = self.mail_message._needaction_count(cr, uid, domain=[]) + self.assertEqual(len(notif_ids), na_count, 'unread notifications count does not match needaction count') + + # Post 4 message on group_pigs + for dummy in range(4): + group_pigs.message_post(body='My Body') + + # Check there are 4 new needaction on mail.message + notif_ids = self.mail_notification.search(cr, uid, [ + ('partner_id', '=', user_admin.partner_id.id), + ('read', '=', False) + ]) + na_count = self.mail_message._needaction_count(cr, uid, domain=[]) + self.assertEqual(len(notif_ids), na_count, 'unread notifications count does not match needaction count') + + # Check there are 4 needaction on mail.message with particular domain + na_count = self.mail_message._needaction_count(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)]) + self.assertEqual(na_count, 4, 'posted message count does not match needaction count') + + def test_50_thread_parent_resolution(self): + """Verify parent/child relationships are correctly established when processing incoming mails""" + cr, uid = self.cr, self.uid + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + msg1 = group_pigs.message_post(body='My Body', subject='1') + msg2 = group_pigs.message_post(body='My Body', subject='2') + msg1, msg2 = self.mail_message.browse(cr, uid, [msg1, msg2]) + self.assertTrue(msg1.message_id, "New message should have a proper message_id") + + # Reply to msg1, make sure the reply is properly attached using the various reply identification mechanisms + # 1. In-Reply-To header + reply_msg = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', subject='Re: 1', + extra='In-Reply-To: %s' % msg1.message_id) + self.mail_thread.message_process(cr, uid, None, reply_msg) + # 2. References header + reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', subject='Re: Re: 1', + extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id) + self.mail_thread.message_process(cr, uid, None, reply_msg2) + # 3. Subject contains [] + model passed to message+process -> only attached to group, not to mail + reply_msg3 = MAIL_TEMPLATE.format(to='Pretty Pigs , other@gmail.com', + extra='', subject='Re: [%s] 1' % self.group_pigs_id) + self.mail_thread.message_process(cr, uid, 'mail.group', reply_msg3) + group_pigs.refresh() + msg1.refresh() + self.assertEqual(5, len(group_pigs.message_ids), 'group should contain 5 messages') + self.assertEqual(2, len(msg1.child_ids), 'msg1 should have 2 children now') diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index fe87b7584e0..3153ccc2069 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -19,417 +19,289 @@ # ############################################################################## -import ast +import base64 import re - import tools + from osv import osv from osv import fields from tools.safe_eval import safe_eval as eval from tools.translate import _ -from ..mail_message import to_email - # main mako-like expression pattern EXPRESSION_PATTERN = re.compile('(\$\{.+?\})') class mail_compose_message(osv.TransientModel): - """Generic Email composition wizard. This wizard is meant to be inherited - at model and view level to provide specific wizard features. + """ Generic message composition wizard. You may inherit from this wizard + at model and view levels to provide specific features. - The behavior of the wizard can be modified through the use of context - parameters, among which are: - - * mail.compose.message.mode: if set to 'reply', the wizard is in - reply to a previous message mode and pre-populated with the original - quote. If set to 'comment', it means you are writing a new message to - be attached to a document. If set to 'mass_mail', the wizard is in - mass mailing where the mail details can contain template placeholders - that will be merged with actual data before being sent to each - recipient. - * active_model: model name of the document to which the mail being - composed is related - * active_id: id of the document to which the mail being composed is - related, or id of the message to which user is replying, - in case ``mail.compose.message.mode == 'reply'`` - * active_ids: ids of the documents to which the mail being composed is - related, in case ``mail.compose.message.mode == 'mass_mail'``. + The behavior of the wizard depends on the composition_mode field: + - 'reply': reply to a previous message. The wizard is pre-populated + via ``get_message_data``. + - 'comment': new post on a record. The wizard is pre-populated via + ``get_record_data`` + - 'mass_mail': wizard in mass mailing mode where the mail details can + contain template placeholders that will be merged with actual data + before being sent to each recipient. """ _name = 'mail.compose.message' - _inherit = 'mail.message.common' + _inherit = 'mail.message' _description = 'Email composition wizard' + _log_access = True def default_get(self, cr, uid, fields, context=None): - """ Overridden to provide specific defaults depending on the context - parameters. - - Composition mode - - comment: default mode; active_model, active_id = model and ID of a - document we are commenting, - - reply: active_id = ID of a mail.message to which we are replying. - From this message we can find the related model and res_id, - - mass_mailing mode: active_model, active_id = model and ID of a - document we are commenting, - - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. + """ Handle composition mode. Some details about context keys: + - comment: default mode, model and ID of a record the user comments + - default_model or active_model + - default_res_id or active_id + - reply: active_id of a message the user replies to + - default_parent_id or message_id or active_id: ID of the + mail.message we reply to + - message.res_model or default_model + - message.res_id or default_res_id + - mass_mail: model and IDs of records the user mass-mails + - active_ids: record IDs + - default_model or active_model """ if context is None: context = {} - compose_mode = context.get('mail.compose.message.mode', 'comment') - active_model = context.get('active_model') - active_id = context.get('active_id') result = super(mail_compose_message, self).default_get(cr, uid, fields, context=context) + # get some important values from context + composition_mode = context.get('default_composition_mode', context.get('mail.compose.message.mode')) + model = context.get('default_model', context.get('active_model')) + res_id = context.get('default_res_id', context.get('active_id')) + message_id = context.get('default_parent_id', context.get('message_id', context.get('active_id'))) + active_ids = context.get('active_ids') + # get default values according to the composition mode - vals = {} - if compose_mode in ['reply']: - vals = self.get_message_data(cr, uid, int(context['active_id']), context=context) - elif compose_mode in ['comment', 'mass_mail'] and active_model and active_id: - vals = self.get_value(cr, uid, active_model, active_id, context) + if composition_mode == 'reply': + vals = self.get_message_data(cr, uid, message_id, context=context) + elif composition_mode == 'comment' and model and res_id: + vals = self.get_record_data(cr, uid, model, res_id, context=context) + elif composition_mode == 'mass_mail' and model and active_ids: + vals = {'model': model, 'res_id': res_id, 'content_subtype': 'html'} + else: + vals = {'model': model, 'res_id': res_id} + if composition_mode: + vals['composition_mode'] = composition_mode + for field in vals: if field in fields: result[field] = vals[field] - - # link to model and record if not done yet - if not result.get('model') and active_model: - result['model'] = active_model - if not result.get('res_id') and active_id: - result['res_id'] = active_id - - # Try to provide default email_from if not specified yet - if not result.get('email_from'): - current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result['email_from'] = current_user.email or False return result + def _get_composition_mode_selection(self, cr, uid, context=None): + return [('comment', 'Comment a document'), ('reply', 'Reply to a message'), ('mass_mail', 'Mass mailing')] + _columns = { - 'dest_partner_ids': fields.many2many('res.partner', - 'email_message_send_partner_rel', - 'wizard_id', 'partner_id', 'Destination partners', - help="When sending emails through the social network composition wizard"\ - "you may choose to send a copy of the mail to partners."), - 'attachment_ids': fields.many2many('ir.attachment','email_message_send_attachment_rel', 'wizard_id', 'attachment_id', 'Attachments'), - 'auto_delete': fields.boolean('Auto Delete', help="Permanently delete emails after sending"), + 'composition_mode': fields.selection( + lambda s, *a, **k: s._get_composition_mode_selection(*a, **k), + string='Composition mode'), + 'partner_ids': fields.many2many('res.partner', + 'mail_compose_message_res_partner_rel', + 'wizard_id', 'partner_id', 'Additional contacts'), + 'attachment_ids': fields.many2many('ir.attachment', + 'mail_compose_message_ir_attachments_rel', + 'wizard_id', 'attachment_id', 'Attachments'), 'filter_id': fields.many2one('ir.filters', 'Filters'), + 'body_text': fields.text('Plain-text Contents'), + 'content_subtype': fields.char('Message content subtype', size=32, readonly=1, + help="Type of message, usually 'html' or 'plain', used to select "\ + "plain-text or rich-text contents accordingly"), } - def get_value(self, cr, uid, model, res_id, context=None): + _defaults = { + 'composition_mode': 'comment', + 'content_subtype': lambda self, cr, uid, ctx={}: 'plain', + 'body_text': lambda self, cr, uid, ctx={}: False, + 'body': lambda self, cr, uid, ctx={}: '', + 'subject': lambda self, cr, uid, ctx={}: False, + } + + def notify(self, cr, uid, newid, context=None): + """ Override specific notify method of mail.message, because we do + not want that feature in the wizard. """ + return + + def get_record_data(self, cr, uid, model, res_id, context=None): """ Returns a defaults-like dict with initial values for the composition wizard when sending an email related to the document record identified by ``model`` and ``res_id``. - The default implementation returns an empty dictionary, and is meant - to be overridden by subclasses. - :param str model: model name of the document record this mail is related to. - :param int res_id: id of the document record this mail is related to. - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. + :param int res_id: id of the document record this mail is related to """ - result = {} - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result.update({ - 'model': model, - 'res_id': res_id, - 'email_from': user.email or tools.config.get('email_from', False), - 'body_html': False, - 'body_text': False, - 'subject': False, - 'dest_partner_ids': [], - }) - return result - - def onchange_email_mode(self, cr, uid, ids, value, model, res_id, context=None): - """ email_mode (values: True or False). This onchange on the email mode - allows to have some specific behavior when going in email mode, or - when going out of email mode. - Basically, dest_partner_ids is reset when going out of email - mode. - This method can be overridden for models that want to have their - specific behavior. - Note that currently, this onchange is used in mail.js and called - manually on the form instantiated in the Chatter. - """ - if not value: - return {'value': {'dest_partner_ids': []}} - return {'value': {}} - - def onchange_formatting(self, cr, uid, ids, value, model, res_id, context=None): - """ onchange_formatting (values: True or False). This onchange on the - formatting allows to have some specific behavior when going in - formatting mode, or when going out of formatting. - Basically, subject is reset when going out of formatting mode. - This method can be overridden for models that want to have their - specific behavior. - Note that currently, this onchange is used in mail.js and called - manually on the form instantiated in the Chatter. - """ - if not value: - return {'value': {'subject': False}} - return {'value': {}} + return {'model': model, 'res_id': res_id} def get_message_data(self, cr, uid, message_id, context=None): """ Returns a defaults-like dict with initial values for the composition wizard when replying to the given message (e.g. including the quote - of the initial message, and the correct recipient). It should not be - called unless ``context['mail.compose.message.mode'] == 'reply'``. + of the initial message, and the correct recipients). :param int message_id: id of the mail.message to which the user is replying. - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. """ + if not message_id: + return {} if context is None: context = {} - result = {} - if not message_id: - return result + message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context=context) - current_user = self.pool.get('res.users').browse(cr, uid, uid, context) - message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context) - # Form the subject - re_prefix = _("Re:") + # create subject + re_prefix = _('Re:') reply_subject = tools.ustr(message_data.subject or '') if not (reply_subject.startswith('Re:') or reply_subject.startswith(re_prefix)): reply_subject = "%s %s" % (re_prefix, reply_subject) - # Form the bodies (text and html). We use the plain text version of the - # original mail, by default, as it is easier to quote than the HTML - # version. TODO: make it possible to switch to HTML on the fly - sent_date = _('On %(date)s, ') % {'date': message_data.date} if message_data.date else '' - sender = _('%(sender_name)s wrote:') % {'sender_name': tools.ustr(message_data.email_from or _('You'))} - body_text = message_data.body_text or '' - body_html = message_data.body_html or '' - quoted_body_text = '> %s' % tools.ustr(body_text.replace('\n', "\n> ") or '') - quoted_body_html = '
      %s
      ' % (tools.ustr(body_html)), - reply_body_text = '\n%s%s\n%s\n%s' % (sent_date, sender, quoted_body_text, current_user.signature) - reply_body_html = '

      %s%s
      %s
      %s' % (sent_date, sender, quoted_body_html, current_user.signature) - # form dest_partner_ids - dest_partner_ids = [partner.id for partner in message_data.partner_ids] - # Update header and references - reply_headers = {} - reply_references = message_data.references and tools.ustr(message_data.references) or False - reply_message_id = message_data.message_id or False - if reply_message_id: - reply_references = (reply_references or '') + " " + message_data.message_id - reply_headers['In-Reply-To'] = message_data.message_id + # create the reply in the body + reply_body = _('
      On %(date)s, %(sender_name)s wrote:
      %(body)s
      ') % { + 'date': message_data.date if message_data.date else '', + 'sender_name': message_data.author_id.name, + 'body': message_data.body, + } + # get partner_ids from original message + partner_ids = [partner.id for partner in message_data.partner_ids] if message_data.partner_ids else [] + # update the result - result.update({ - 'body_text': reply_body_text, - 'body_html': reply_body_html, + result = { + 'model': message_data.model, + 'res_id': message_data.res_id, + 'parent_id': message_data.id, + 'body': reply_body, 'subject': reply_subject, - 'attachment_ids': [], - 'dest_partner_ids': dest_partner_ids, - 'model': message_data.model or False, - 'res_id': message_data.res_id or False, - 'email_from': current_user.email or message_data.email_to or False, - 'email_to': message_data.reply_to or message_data.email_from or False, - 'email_cc': message_data.email_cc or False, - 'user_id': uid, - # pass msg-id and references of mail we're replying to, to construct the - # new ones later when sending - 'message_id': reply_message_id, - 'references': reply_references, - 'headers': reply_headers, - }) + 'partner_ids': partner_ids, + 'content_subtype': 'html', + } return result - def send_mail(self, cr, uid, ids, context=None): - '''Process the wizard contents and proceed with sending the corresponding - email(s), rendering any template patterns on the fly if needed. - If the wizard is in mass-mail mode (context['mail.compose.message.mode'] is - set to ``'mass_mail'``), the resulting email(s) are scheduled for being - sent the next time the mail.message scheduler runs, or the next time - ``mail.message.process_email_queue`` is called. - Otherwise the new message is sent immediately. + def toggle_content_subtype(self, cr, uid, ids, context=None): + """ hit toggle formatting mode button: calls onchange_formatting to + emulate an on_change, then writes the value to update the form. """ + for record in self.browse(cr, uid, ids, context=context): + content_st_new_value = 'plain' if record.content_subtype == 'html' else 'html' + onchange_res = self.onchange_content_subtype(cr, uid, ids, content_st_new_value, record.model, record.res_id, context=context) + self.write(cr, uid, [record.id], onchange_res['value'], context=context) + return True - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. - ''' + def onchange_content_subtype(self, cr, uid, ids, value, model, res_id, context=None): + """ onchange_content_subtype (values: 'plain' or 'html'). This onchange + on the subtype allows to have some specific behavior when switching + between text or html mode. + This method can be overridden for models that want to have their + specific behavior. """ + return {'value': {'content_subtype': value}} + + def _verify_partner_email(self, cr, uid, partner_ids, context=None): + """ Verify that selected partner_ids have an email_address defined. + Otherwise throw a warning. """ + partner_wo_email_lst = [] + for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context): + if not partner.email: + partner_wo_email_lst.append(partner) + if not partner_wo_email_lst: + return {} + warning_msg = _('The following partners chosen as recipients for the email have no email address linked :') + for partner in partner_wo_email_lst: + warning_msg += '\n- %s' % (partner.name) + return {'warning': { + 'title': _('Partners email addresses not found'), + 'message': warning_msg, + } + } + + def onchange_partner_ids(self, cr, uid, ids, value, context=None): + """ onchange_partner_ids (value format: [[6, 0, [3, 4]]]). The + basic purpose of this method is to check that destination partners + effectively have email addresses. Otherwise a warning is thrown. + """ + res = {'value': {}} + if not value or not value[0] or not value[0][0] == 6: + return + res.update(self._verify_partner_email(cr, uid, value[0][2], context=context)) + return res + + def unlink(self, cr, uid, ids, context=None): + # Cascade delete all attachments, as they are owned by the composition wizard + for wizard in self.read(cr, uid, ids, ['attachment_ids'], context=context): + self.pool.get('ir.attachment').unlink(cr, uid, wizard['attachment_ids'], context=context) + return super(mail_compose_message, self).unlink(cr, uid, ids, context=context) + + def dummy(self, cr, uid, ids, context=None): + """ TDE: defined to have buttons that do basically nothing. It is + currently impossible to have buttons that do nothing special + in views (if type not specified, considered as 'object'). """ + return True + + #------------------------------------------------------ + # Wizard validation and send + #------------------------------------------------------ + + def send_mail(self, cr, uid, ids, context=None): + """ Process the wizard content and proceed with sending the related + email(s), rendering any template patterns on the fly if needed. """ if context is None: context = {} - # composition wizard options - email_mode = context.get('email_mode') - formatting = context.get('formatting') - mass_mail_mode = context.get('mail.compose.message.mode') == 'mass_mail' + active_ids = context.get('active_ids') - mail_message_obj = self.pool.get('mail.message') - for mail_wiz in self.browse(cr, uid, ids, context=context): - # attachments - attachment = {} - for attach in mail_wiz.attachment_ids: - attachment[attach.datas_fname] = attach.datas and attach.datas.decode('base64') + for wizard in self.browse(cr, uid, ids, context=context): + mass_mail_mode = wizard.composition_mode == 'mass_mail' + active_model_pool = self.pool.get(wizard.model if wizard.model else 'mail.thread') - # default values, according to the wizard options - subject = mail_wiz.subject if formatting else False - content_subtype = 'html' if formatting else 'plain' - type = 'email' if email_mode else 'comment' - state = 'outgoing' if email_mode else False - partner_ids = [partner.id for partner in mail_wiz.dest_partner_ids] - references = None - headers = {} - body = mail_wiz.body_html if content_subtype == 'html' else mail_wiz.body_text - - # get model, active_ids, and check if model is openchatter-enabled - if mass_mail_mode and context.get('active_ids') and context.get('active_model'): - active_ids = context['active_ids'] - active_model = context['active_model'] - elif mass_mail_mode: - active_model = mail_wiz.model - active_model_pool = self.pool.get(active_model) - active_ids = active_model_pool.search(cr, uid, ast.literal_eval(mail_wiz.filter_id.domain), context=ast.literal_eval(mail_wiz.filter_id.context)) - else: - active_model = mail_wiz.model - active_ids = [mail_wiz.res_id] - active_model_pool = self.pool.get(active_model) - mail_thread_enabled = hasattr(active_model_pool, 'message_append') - - if context.get('mail.compose.message.mode') == 'mass_mail': - # Mass mailing: must render the template patterns - for active_id in active_ids: - rendered_subject = self.render_template(cr, uid, subject, active_model, active_id) - rendered_body_html = self.render_template(cr, uid, mail_wiz.body_html, active_model, active_id) - rendered_body_text = self.render_template(cr, uid, mail_wiz.body_text, active_model, active_id) - email_from = self.render_template(cr, uid, mail_wiz.email_from, active_model, active_id) - email_to = self.render_template(cr, uid, mail_wiz.email_to, active_model, active_id) - email_cc = self.render_template(cr, uid, mail_wiz.email_cc, active_model, active_id) - email_bcc = self.render_template(cr, uid, mail_wiz.email_bcc, active_model, active_id) - reply_to = self.render_template(cr, uid, mail_wiz.reply_to, active_model, active_id) - - # in mass-mailing mode we only schedule the mail for sending, it will be - # processed as soon as the mail scheduler runs. - if mail_thread_enabled: - active_model_pool.message_append(cr, uid, [active_id], rendered_subject, rendered_body_text, rendered_body_html, - type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids, - email_from=email_from, email_to=email_to, email_cc=email_cc, email_bcc=email_bcc, - reply_to=reply_to, references=references, attachments=attachment, headers=headers, context=context) - else: - mail_message_obj.schedule_with_attach(cr, uid, email_from, to_email(email_to), subject, rendered_body_text, - model=mail_wiz.model, email_cc=to_email(email_cc), email_bcc=to_email(email_bcc), reply_to=reply_to, - attachments=attachment, references=references, res_id=active_id, partner_ids=partner_ids, - content_subtype=mail_wiz.content_subtype, headers=headers, context=context) - else: - # normal mode - no mass-mailing - if mail_thread_enabled: - msg_ids = active_model_pool.message_append(cr, uid, active_ids, subject, mail_wiz.body_text, mail_wiz.body_html, - type=type, content_subtype=content_subtype, state=state, partner_ids=partner_ids, - email_from=mail_wiz.email_from, email_to=mail_wiz.email_to, email_cc=mail_wiz.email_cc, email_bcc=mail_wiz.email_bcc, - reply_to=mail_wiz.reply_to, references=references, attachments=attachment, headers=headers, context=context) - else: - msg_ids = [mail_message_obj.schedule_with_attach(cr, uid, mail_wiz.email_from, to_email(mail_wiz.email_to), subject, mail_wiz.body_text, - type=type, model=mail_wiz.model, email_cc=to_email(mail_wiz.email_cc), email_bcc=to_email(mail_wiz.email_bcc), reply_to=mail_wiz.reply_to, - attachments=attachment, references=references, res_id=int(mail_wiz.res_id), partner_ids=partner_ids, - content_subtype=mail_wiz.content_subtype, headers=headers, context=context)] - # in normal mode, we send the email immediately, as the user expects us to (delay should be sufficiently small) - if type == 'email': - mail_message_obj.send(cr, uid, msg_ids, context=context) + # wizard works in batch mode: [res_id] or active_ids + res_ids = active_ids if mass_mail_mode and wizard.model and active_ids else [wizard.res_id] + for res_id in res_ids: + # default values, according to the wizard options + post_values = { + 'subject': wizard.subject if wizard.content_subtype == 'html' else False, + 'body': wizard.body if wizard.content_subtype == 'html' else '
      %s
      ' % tools.ustr(wizard.body_text), + 'partner_ids': [(4, partner.id) for partner in wizard.partner_ids], + 'attachments': [(attach.datas_fname or attach.name, base64.b64decode(attach.datas)) for attach in wizard.attachment_ids], + } + # mass mailing: render and override default values + if mass_mail_mode and wizard.model: + email_dict = self.render_message(cr, uid, wizard, res_id, context=context) + new_partner_ids = email_dict.pop('partner_ids', []) + post_values['partner_ids'] += [(4, partner_id) for partner_id in new_partner_ids] + new_attachments = email_dict.pop('attachments', []) + post_values['attachments'] += new_attachments + post_values.update(email_dict) + # post the message + active_model_pool.message_post(cr, uid, [res_id], type='comment', context=context, **post_values) return {'type': 'ir.actions.act_window_close'} + def render_message(self, cr, uid, wizard, res_id, context=None): + """ Generate an email from the template for given (wizard.model, res_id) + pair. This method is meant to be inherited by email_template that + will produce a more complete dictionary. """ + return { + 'subject': self.render_template(cr, uid, wizard.subject, wizard.model, res_id, context), + 'body': self.render_template(cr, uid, wizard.body, wizard.model, res_id, context), + } + def render_template(self, cr, uid, template, model, res_id, context=None): - """Render the given template text, replace mako-like expressions ``${expr}`` - with the result of evaluating these expressions with an evaluation context - containing: + """ Render the given template text, replace mako-like expressions ``${expr}`` + with the result of evaluating these expressions with an evaluation context + containing: * ``user``: browse_record of the current user * ``object``: browse_record of the document record this mail is related to * ``context``: the context passed to the mail composition wizard - :param str template: the template text to render - :param str model: model name of the document record this mail is related to. - :param int res_id: id of the document record this mail is related to. + :param str template: the template text to render + :param str model: model name of the document record this mail is related to. + :param int res_id: id of the document record this mail is related to. """ if context is None: context = {} def merge(match): exp = str(match.group()[2:-1]).strip() - result = eval(exp, - { - 'user' : self.pool.get('res.users').browse(cr, uid, uid, context=context), - 'object' : self.pool.get(model).browse(cr, uid, res_id, context=context), - 'context': dict(context), # copy context to prevent side-effects of eval - }) - if result in (None, False): - return "" - return tools.ustr(result) + result = eval(exp, { + 'user': self.pool.get('res.users').browse(cr, uid, uid, context=context), + 'object': self.pool.get(model).browse(cr, uid, res_id, context=context), + 'context': dict(context), # copy context to prevent side-effects of eval + }) + return result and tools.ustr(result) or '' return template and EXPRESSION_PATTERN.sub(merge, template) - - -class mail_compose_message_extended(osv.TransientModel): - """ Extension of 'mail.compose.message' to support default field values related - to CRM-like models that follow the following conventions: - - 1. The model object must have an attribute '_mail_compose_message' equal to True. - - 2. The model should define the following fields: - - 'name' as subject of the message (required); - - 'email_from' as destination email address (required); - - 'email_cc' as cc email addresses (required); - - 'section_id.reply_to' as reply-to address (optional). - """ - _inherit = 'mail.compose.message' - - def get_value(self, cr, uid, model, res_id, context=None): - """ Overrides the default implementation to provide more default field values - related to the corresponding CRM case. - """ - result = super(mail_compose_message_extended, self).get_value(cr, uid, model, res_id, context=context) - model_obj = self.pool.get(model) - if getattr(model_obj, '_mail_compose_message', False) and res_id: - data = model_obj.browse(cr, uid , res_id, context) - result.update({ - 'email_to': data.email_from or False, - 'email_cc': tools.ustr(data.email_cc or ''), - 'subject': data.name or False, - }) - if hasattr(data, 'section_id'): - result['reply_to'] = data.section_id and data.section_id.reply_to or False - return result - - def onchange_email_mode(self, cr, uid, ids, value, model, res_id, context=None): - """ Overrides the default implementation to provide default values for - dest_partner_ids. This method checks that a partner maching the - ``email_from`` of the record exists. It it does not exist, it - creates a new partner. The found or created partner is then added - in dest_partner_ids. - Partner check/creation valid inly if the value is True, and if - the model has the ``_mail_compose_message`` attribute. - """ - result = super(mail_compose_message_extended, self).onchange_email_mode(cr, uid, ids, value, model, res_id, context=context) - model_obj = self.pool.get(model) - if not value or not (getattr(model_obj, '_mail_compose_message', False) and res_id): - return result - data = model_obj.browse(cr, uid , res_id, context=context) - partner_obj = self.pool.get('res.partner') - partner_ids = partner_obj.search(cr, uid, [('email', '=', data.email_from)], context=context) - if partner_ids: - partner_id = partner_ids[0] - else: - partner_id = partner_obj.name_create(cr, uid, data.email_from, context=context)[0] - result['value'].update({ - 'dest_partner_ids': [partner_id], - 'email_cc': tools.ustr(data.email_cc or ''), - }) - if hasattr(data, 'section_id'): - result['value']['reply_to'] = data.section_id and data.section_id.reply_to or False - return result - - def onchange_formatting(self, cr, uid, ids, value, model, res_id, context=None): - """ Overrides the default implementation to provide default values for - the subject. - Subject re-creation valid only if the value is True, and if the - model has the ``_mail_compose_message`` attribute. - """ - result = super(mail_compose_message_extended, self).onchange_formatting(cr, uid, ids, value, model, res_id, context=context) - model_obj = self.pool.get(model) - if not value or not (getattr(model_obj, '_mail_compose_message', False) and res_id): - return result - data = model_obj.browse(cr, uid , res_id, context=context) - result['value'].update({ - 'subject': data.name or False, - }) - return result - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml index 73fb03cdc28..70b50c154ac 100644 --- a/addons/mail/wizard/mail_compose_message_view.xml +++ b/addons/mail/wizard/mail_compose_message_view.xml @@ -6,73 +6,87 @@ mail.compose.message
      + + + + + - - - - - - - - - - - + + - + - + +
      -
      - mail.compose.message.form + mail.compose.message.form.chatter mail.compose.message 18
      + + + + + + + + class="oe_mail_compose_message_subject" + attrs="{'invisible':[('content_subtype', '=', 'plain')]}"/> - - + class="oe_mail_compose_message_body" + attrs="{'invisible':[('content_subtype', '=', 'html')]}"/> + + + + +
      +
      - - - Checklist - - - Attachment - - - Formatting - +
      @@ -97,6 +111,6 @@ target="new" key2="client_action_multi" id="base.action_partner_mass_mail" - context="{'mail.compose.message.mode':'mass_mail'}"/> + context="{'default_composition_mode': 'mass_mail'}"/> diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml index 54897cd111a..92443fe987d 100644 --- a/addons/marketing_campaign/marketing_campaign_demo.xml +++ b/addons/marketing_campaign/marketing_campaign_demo.xml @@ -3,29 +3,29 @@ - Template for New Partner + welcome new partner info@openerp.com - Welcome in OpenERP Partner Channel! + Welcome to the OpenERP Partner Channel! ${object.email or ''} - Hello, We are very happy to send Welcome message. + Hello, you will receive your welcome pack via email shortly. - Template for Silver Partner + congrats silver partner info@openerp.com - Congratulation! You become now our Silver Partner. + Congratulations! You are now a Silver Partner! ${object.email or ''} - Hello, We are happy to announce that you now become our Silver Partner. + Hi, we are delighted to welcome you among our Silver Partners as of today! - Template for Gold Partner + congrats gold partner info@openerp.com - Congratulation! You become our Gold Partner. + Congratulations! You are now one of our Gold Partners! ${object.email or ''} - Hello, We are happy to announce that you become our Gold Partner. + Hi, we are delighted to let you know that you have entered the select circle of our Gold Partners @@ -64,7 +64,7 @@ - + diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml index 04063a6fbc1..3d540b4ccb7 100644 --- a/addons/marketing_campaign/test/marketing_campaign.yml +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -42,7 +42,7 @@ record = self.browse(cr, uid, ids[0]) assert record.state == 'todo' or record.state == 'done' , 'Marketing Workitem shoud be in draft state.' - - I check follow-up detail of first activity. + I process follow-up of first activity. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), @@ -50,12 +50,6 @@ assert ids, 'Follow-up item is not created for first activity.' work_item_id = self.browse(cr ,uid ,ids[0] ,context) assert work_item_id.res_name, 'Resource Name is not defined.' -- - I process follow-up of first activity. -- - !python {model: marketing.campaign.workitem}: | - ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_0'))]) self.process(cr, uid, ids) record = self.browse(cr, uid, ids)[0] assert record.state == "done", "Follow-up item should be closed after process." diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml index 0946ff6e129..141981a21d6 100644 --- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml +++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml @@ -40,7 +40,10 @@ - Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team, + Hello,

      +

      Thanks for the genuine interest you have shown in OpenERP.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      For OpenERP OnDemand Free Trial 2010
      @@ -50,11 +53,11 @@ - Hello,We have very good offer that might suit you. - We propose you to subscribe to the OpenERP Discovery Day on May 2010. - If any further information required kindly revert back. - We really appreciate your co-operation on this. - Regards,OpenERP Team, + Hello,

      +

      We have very good offer that might suit you. + We suggest you subscribe to the OpenERP Discovery Day on May 2010.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      For OpenERP Discovery Day on May 2010
      @@ -65,10 +68,10 @@ - Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, + Hello,

      +

      Thanks for showing interest and for subscribing to the OpenERP Discovery Day.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      For OpenERP Discovery Day @@ -79,10 +82,10 @@ - Hello,Thanks for showing intrest and buying the OpenERP book. + Hello,

      +

      Thanks for showing interest and buying the OpenERP book.

      If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team,
      +

      Regards,OpenERP Team,

      ]]>
      For OpenERP book @@ -92,12 +95,12 @@ - Hello, We have very good offer that might suit you. - For our gold partners,We are arranging free technical training on june,2010. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For technical training to Gold partners + Hello,

      +

      We have very good offer that might suit you. + For our gold partners,We are arranging free technical training on june,2010.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      + technical training to gold partners @@ -107,12 +110,12 @@ - Hello, We have very good offer that might suit you. - For our silver partners,We are paid technical training on june,2010. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For training to Silver partners + Hello,

      +

      We have very good offer that might suit you. + For our silver partners,We are paid technical training on june,2010.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      + training to silver partners
      @@ -122,12 +125,12 @@ - Hello, We have very good offer that might suit you. - For our silver partners,We are offering Gold partnership. - If any further information required kindly revert back. - I really appreciate your co-operation on this. - Regards,OpenERP Team, - For gold partnership to silver partners + Hello,

      +

      We have very good offer that might suit you. + For our silver partners, we are offering Gold partnership.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      + gold partnership to silver partners
      @@ -137,9 +140,12 @@ - Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this. - Regards,OpenERP Team, - For subscribing to technical training + Hello,

      +

      Thanks for showing interest and for subscribing to technical training.

      + If any further information required kindly revert back.I really appreciate your co-operation on this.

      +

      If any further information is required, do not hesitate to reply to this message.

      +

      Regards,OpenERP Team,

      ]]>
      + subscribing to technical training
      diff --git a/addons/mrp/board_manufacturing_view.xml b/addons/mrp/board_manufacturing_view.xml index e7668517a70..cae1fea07dc 100644 --- a/addons/mrp/board_manufacturing_view.xml +++ b/addons/mrp/board_manufacturing_view.xml @@ -9,7 +9,6 @@ - diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 7b8442b4c46..c667daadbec 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -369,7 +369,7 @@ class mrp_bom(osv.osv): prod_obj = self.pool.get('product.product') for obj in self.browse(cr, uid, ids, context=context): for prod in prod_obj.browse(cr, uid, [obj.product_id], context=context): - self.message_append_note(cr, uid, [obj.id], body=_("Bill of Material has been created for %s product.") % (prod.id.name_template), context=context) + self.message_post(cr, uid, [obj.id], body=_("Bill of Material has been created for %s product.") % (prod.id.name_template), context=context) return True mrp_bom() @@ -407,7 +407,7 @@ class mrp_production(osv.osv): _name = 'mrp.production' _description = 'Manufacturing Order' _date_name = 'date_planned' - _inherit = ['ir.needaction_mixin', 'mail.thread'] + _inherit = ['mail.thread', 'ir.needaction_mixin'] def _production_calc(self, cr, uid, ids, prop, unknow_none, context=None): """ Calculates total hours and total no. of cycles for a production order. @@ -1046,33 +1046,28 @@ class mrp_production(osv.osv): # OpenChatter methods and notifications # --------------------------------------------------- - def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): - """ Add 'user_id' to the monitored fields """ - res = super(mrp_production, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) - return res + ['user_id'] - def create_send_note(self, cr, uid, ids, context=None): - self.message_append_note(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) + self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been canceled.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_ready_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is ready to produce.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_in_production_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is in production.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been done.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_confirm_send_note(self, cr, uid, ids, context=None): @@ -1082,7 +1077,7 @@ class mrp_production(osv.osv): obj_datetime = fields.DT.datetime.strptime(obj.date_planned, DEFAULT_SERVER_DATETIME_FORMAT) obj_date_str = fields.datetime.context_timestamp(cr, uid, obj_datetime, context=context).strftime(DATETIME_FORMATS_MAP['%+'] + " (%Z)") message = _("Manufacturing order has been confirmed and is scheduled for the %s.") % (obj_date_str) - self.message_append_note(cr, uid, [obj.id], body=message, context=context) + self.message_post(cr, uid, [obj.id], body=message, context=context) return True diff --git a/addons/mrp/mrp_data.xml b/addons/mrp/mrp_data.xml index e5d5380f96a..0bbf2d3b64c 100644 --- a/addons/mrp/mrp_data.xml +++ b/addons/mrp/mrp_data.xml @@ -2,14 +2,16 @@ - - - - Module MRP has been installed - Manage your manufacturing process in OpenERP by defining bill of materials (BoM), routings and work centers. This module supports complete integration and planification of stockable goods, consumable, and services. + + mail.group + + notification + MRP application installed! + Manage your manufacturing process with OpenERP by defining your bills of materials (BoM), routings and work centers. +This application supports complete integration and production scheduling for stockable goods, consumables, and services. -From the Manufacturing Settings, you can choose to compute production schedules periodically or just-in-time. - +From the Manufacturing Settings, you can choose to compute production schedules periodically or just-in-time.
      + Production order diff --git a/addons/mrp/mrp_demo.xml b/addons/mrp/mrp_demo.xml index d0f05a2aaff..952a5e0e3de 100644 --- a/addons/mrp/mrp_demo.xml +++ b/addons/mrp/mrp_demo.xml @@ -49,7 +49,7 @@ 0.05 - + diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index acb51ea6388..8121f6e84d1 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -579,8 +579,8 @@ mrp.production.tree mrp.production - - + + diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 363f98e35d1..7f417dc18b1 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -43,7 +43,7 @@ class procurement_order(osv.osv): cr.execute('update procurement_order set message=%s where id=%s', (_('No BoM defined for this product !'), procurement.id)) for (id, name) in self.name_get(cr, uid, procurement.id): message = _("Procurement '%s' has an exception: 'No BoM defined for this product !'") % name - self.message_append_note(cr, uid, [procurement.id], body=message, context=context) + self.message_post(cr, uid, [procurement.id], body=message, context=context) return False return True diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index 8692dab5c87..ee2547bc7df 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -224,7 +224,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been created for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_start_send_note(self, cr, uid, ids, context=None): @@ -232,7 +232,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been started for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): @@ -240,7 +240,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been done for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_pending_send_note(self, cr, uid, ids, context=None): @@ -248,7 +248,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order is pending for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): @@ -256,7 +256,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been cancelled for production order %s.") % (prod.id.name) - self.message_append_note(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, context=context) return True mrp_production_workcenter_line() diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index f41abb58c08..c1ac8f809ce 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -571,40 +571,40 @@ class mrp_repair(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been created." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_start_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been started." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_toinvoiced_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Draft Invoice of %s %s waiting for validation.") % (repair.invoice_id.amount_total, repair.invoice_id.currency_id.symbol) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_confirm_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _( "Repair Order for %s has been accepted." % (repair.product_id.name)) - self.message_append_note(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, context=context) return True def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Repair has been cancelled.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def set_ready_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is now ready to repair.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def set_done_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is closed.") - self.message_append_note(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True mrp_repair() diff --git a/addons/note/note.py b/addons/note/note.py index bce54566e64..abc7dca297e 100644 --- a/addons/note/note.py +++ b/addons/note/note.py @@ -64,11 +64,15 @@ class note_note(osv.osv): stage_obj = self.pool.get('note.stage') # only show stage groups not folded and owned by user - search_domain = [('fold', '=', False),('user_id', '=', uid)] + search_domain = [('user_id', '=', uid)] stage_ids = stage_obj._search(cr, uid, search_domain, order=self._order, access_rights_uid=access_rights_uid, context=context) result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context) - return result + + fold = {} + for stage in stage_obj.browse(cr, access_rights_uid, stage_ids, context=context): + fold[stage.id] = stage.fold or False + return result, fold _columns = { 'name': fields.function(_get_note_first_line, fnct_inv=_set_note_first_line, string='Note Summary', type="text"), diff --git a/addons/note/note_demo.xml b/addons/note/note_demo.xml index e322f362ef5..e6ab25198a6 100644 --- a/addons/note/note_demo.xml +++ b/addons/note/note_demo.xml @@ -58,7 +58,7 @@ @@ -93,7 +93,7 @@ @@ -104,7 +104,7 @@ @@ -115,7 +115,7 @@ @@ -127,7 +127,7 @@ @@ -139,7 +139,7 @@ diff --git a/addons/pad/__openerp__.py b/addons/pad/__openerp__.py index 620d677a5bf..50b280d2c32 100644 --- a/addons/pad/__openerp__.py +++ b/addons/pad/__openerp__.py @@ -14,6 +14,7 @@ pads (by default, http://ietherpad.com/). 'website': 'http://openerp.com', 'depends': ['base'], 'data': ['res_company.xml'], + 'demo': ['pad_demo.xml'], 'installable': True, 'auto_install': False, 'web': True, diff --git a/addons/pad/pad_demo.xml b/addons/pad/pad_demo.xml new file mode 100644 index 00000000000..407f90e8242 --- /dev/null +++ b/addons/pad/pad_demo.xml @@ -0,0 +1,9 @@ + + + + + pad.openerp.com + + + + diff --git a/addons/pad/res_company.xml b/addons/pad/res_company.xml index 5a9164db2f4..1e2184c61a3 100644 --- a/addons/pad/res_company.xml +++ b/addons/pad/res_company.xml @@ -7,11 +7,12 @@ - + +
      diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml index e84414dd4e8..ce79df52684 100644 --- a/addons/pad/static/src/xml/pad.xml +++ b/addons/pad/static/src/xml/pad.xml @@ -11,7 +11,6 @@
      - Please configure your etherpad server.
      - OpenERP Entreprise customers may safely use pad.openerp.com
      + You must configure the etherpad through the menu Setting > Companies > Companies, in the configuration tab of your company.
      diff --git a/addons/pad_project/i18n/tr.po b/addons/pad_project/i18n/tr.po new file mode 100644 index 00000000000..a19889de838 --- /dev/null +++ b/addons/pad_project/i18n/tr.po @@ -0,0 +1,38 @@ +# Turkish translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +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-09-07 20:06+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-09-08 04:54+0000\n" +"X-Generator: Launchpad (build 15914)\n" + +#. module: pad_project +#: constraint:project.task:0 +msgid "Error ! Task end-date must be greater then task start-date" +msgstr "Hata! görev bitiş tarihi başlangıç tarihinden sonra olmalı" + +#. module: pad_project +#: model:ir.model,name:pad_project.model_project_task +msgid "Task" +msgstr "Görev" + +#. module: pad_project +#: view:project.task:0 +msgid "Pad" +msgstr "" + +#. module: pad_project +#: constraint:project.task:0 +msgid "Error ! You cannot create recursive tasks." +msgstr "Hata ! Yinelenen görevler oluşturamazsınız." diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py index e497f902dc2..9c582a8e3bf 100644 --- a/addons/plugin/plugin_handler.py +++ b/addons/plugin/plugin_handler.py @@ -44,7 +44,7 @@ class plugin_handler(osv.osv_memory): res_id = 0 url = "" name = "" - msg = mail_message_obj.parse_message(email) + msg = self.pool.get('mail.thread').parse_message(cr, uid, email) references = [msg.get('message-id')] refs = msg.get('references',False) if refs: @@ -91,7 +91,7 @@ class plugin_handler(osv.osv_memory): """ mail_message = self.pool.get('mail.message') model_obj = self.pool.get(model) - msg = mail_message.parse_message(email) + msg = self.pool.get('mail.thread').parse_message(cr, uid, email) message_id = msg.get('message-id') mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)]) @@ -101,16 +101,15 @@ class plugin_handler(osv.osv_memory): notify = "Email already pushed" elif res_id == 0: if model == 'res.partner': - notify = 'User the button Partner to create a new partner' + notify = 'User the Partner button to create a new partner' else: res_id = model_obj.message_new(cr, uid, msg) - notify = "Mail succefully pushed, a new %s has been created " % model + notify = "Mail succesfully pushed, a new %s has been created " % model else: if model == 'res.partner': model_obj = self.pool.get('mail.thread') - res = self.pool.get(model).browse(cr, uid, [res_id]) - model_obj.message_append_dict(cr, uid, res, msg) - notify = "Mail succefully pushed" + model_obj.message_post(cr, uid, [res_id], body=msg) + notify = "Mail succesfully pushed" url = self._make_url(cr, uid, res_id, model) return (model, res_id, url, notify) @@ -133,7 +132,7 @@ class plugin_handler(osv.osv_memory): return ('res.partner', partner_id, url) # Specific to outlook rfc822 is not available so we split in arguments headerd,body,attachemnts - def push_message_outlook(self, cr, uid, model, headers,res_id=0 ,body_text=False, body_html=False, attachments=False): + def push_message_outlook(self, cr, uid, model, headers,res_id=0 ,body=False, body_html=False, attachments=False): # ---------------------------------------- # solution 1 # construct a fake rfc822 from the separated arguement @@ -147,7 +146,7 @@ class plugin_handler(osv.osv_memory): mail_message = self.pool.get('mail.message') ir_attachment_obj = self.pool.get('ir.attachment') attach_ids = [] - msg = mail_message.parse_message(headers) + msg = self.pool.get('mail.thread').parse_message(cr, uid, headers) message_id = msg.get('message-id') push_mail = self.push_message(cr, uid, model, headers, res_id) res_id = push_mail[1] @@ -161,6 +160,6 @@ class plugin_handler(osv.osv_memory): attach_ids.append(ir_attachment_obj.create(cr, uid, vals)) mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)]) if mail_ids: - ids = mail_message.write(cr, uid,mail_ids[0],{ 'attachment_ids': [(6, 0, attach_ids)],'body_text':body_text,'body_html':body_html}) + ids = mail_message.write(cr, uid,mail_ids[0],{ 'attachment_ids': [(6, 0, attach_ids)],'body':body,'body_html':body_html}) url = self._make_url(cr, uid, res_id, model) return (model, res_id, url) diff --git a/addons/plugin_outlook/plugin_outlook.xml b/addons/plugin_outlook/plugin_outlook.xml index c2c035f532d..e99fbf72b6d 100644 --- a/addons/plugin_outlook/plugin_outlook.xml +++ b/addons/plugin_outlook/plugin_outlook.xml @@ -19,7 +19,7 @@

      Click on the link above to download the installer for either 32 or 64 bits, and execute it.

      System requirements:

      -