diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 52bcd29622c..dbe17d1c60a 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1767,6 +1767,7 @@ class mail_compose_message(osv.Model): if context.get('default_model') == 'account.invoice' and context.get('default_res_id') and context.get('mark_invoice_as_sent'): context = dict(context, mail_post_autofollow=True) self.pool.get('account.invoice').write(cr, uid, [context['default_res_id']], {'sent': True}, context=context) + self.pool.get('account.invoice').message_post(cr, uid, [context['default_res_id']], body=_("Invoice sent"), context=context) return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 3ce60902d94..b4260db6b90 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -922,7 +922,7 @@ - + @@ -932,7 +932,7 @@ - + @@ -1039,7 +1039,7 @@ - + @@ -1084,7 +1084,7 @@ - + @@ -1336,7 +1336,7 @@ - + @@ -1355,7 +1355,7 @@ - + diff --git a/addons/account/i18n/ca.po b/addons/account/i18n/ca.po index 570ca0c04c3..c1fe13e89d6 100644 --- a/addons/account/i18n/ca.po +++ b/addons/account/i18n/ca.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2012-05-10 18:27+0000\n" -"Last-Translator: Raphael Collet (OpenERP) \n" +"PO-Revision-Date: 2013-03-01 14:12+0000\n" +"Last-Translator: Florenci Solà - Solatec \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-22 05:29+0000\n" -"X-Generator: Launchpad (build 16378)\n" +"X-Launchpad-Export-Date: 2013-03-02 04:56+0000\n" +"X-Generator: Launchpad (build 16514)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 @@ -26,6 +26,8 @@ msgstr "Sistema de pagaments" msgid "" "An account fiscal position could be defined only once time on same accounts." msgstr "" +"Una posició dels comptes fiscals només es pot definir una sola vegada en el " +"mateix compte." #. module: account #: help:account.tax.code,sequence:0 @@ -33,6 +35,8 @@ msgid "" "Determine the display order in the report 'Accounting \\ Reporting \\ " "Generic Reporting \\ Taxes \\ Taxes Report'" msgstr "" +"Determina l'ordre de presentació en l'informe 'Comptabilitat \\ Informes \\ " +"Informes Generics \\ Impostos \\ Informes d'Impostos'" #. module: account #: view:account.move.reconcile:0 @@ -49,7 +53,7 @@ msgstr "Estadístiques de comptes" #. module: account #: view:account.invoice:0 msgid "Proforma/Open/Paid Invoices" -msgstr "" +msgstr "Factures Proforma / Obertes / Pagades" #. module: account #: field:report.invoice.created,residual:0 @@ -60,7 +64,7 @@ msgstr "Pendent" #: code:addons/account/account_bank_statement.py:368 #, python-format msgid "Journal item \"%s\" is not valid." -msgstr "" +msgstr "L'element del diari \"%s\" no és vàlid." #. module: account #: model:ir.model,name:account.model_report_aged_receivable @@ -78,7 +82,7 @@ msgstr "Importa des de factura o pagament" #: code:addons/account/account_move_line.py:1211 #, python-format msgid "Bad Account!" -msgstr "" +msgstr "Compte erroni!" #. module: account #: view:account.move:0 @@ -92,6 +96,8 @@ msgid "" "Error!\n" "You cannot create recursive account templates." msgstr "" +"Error: \n" +"No es poden crear plantilles de comptes recursives." #. module: account #. openerp-web @@ -153,7 +159,7 @@ msgstr "Avís!" #: code:addons/account/account.py:3149 #, python-format msgid "Miscellaneous Journal" -msgstr "" +msgstr "Diari de diversos" #. module: account #: code:addons/account/wizard/account_open_closed_fiscalyear.py:39 @@ -163,6 +169,9 @@ msgid "" "which is set after generating opening entries from 'Generate Opening " "Entries'." msgstr "" +"Cal establir el 'Diari de comentaris de final d'Any' per aquest any fiscal, " +"que s'estableix després de generar les entrades d'obertura a 'Generar " +"comentaris d'obertura'." #. module: account #: field:account.fiscal.position.account,account_src_id:0 diff --git a/addons/account/i18n/ru.po b/addons/account/i18n/ru.po index 5792fe62493..4c456df9071 100644 --- a/addons/account/i18n/ru.po +++ b/addons/account/i18n/ru.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2012-12-29 11:26+0000\n" +"PO-Revision-Date: 2013-03-01 12:23+0000\n" "Last-Translator: Chertykov Denis \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-30 05:19+0000\n" -"X-Generator: Launchpad (build 16378)\n" +"X-Launchpad-Export-Date: 2013-03-02 04:56+0000\n" +"X-Generator: Launchpad (build 16514)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 @@ -303,6 +303,17 @@ msgid "" "

\n" " " msgstr "" +"

\n" +" Нажмите для создания возврата клиенту.\n" +"

\n" +" Возврат-это документ, который кредитует счет полностью или\n" +" частично.\n" +"

\n" +" Вместо ручного создания возврата, вы\n" +" можете генерировать его непосредственно из связанных с " +"клиентом счетов.\n" +"

\n" +" " #. module: account #: help:account.installer,charts:0 @@ -2058,6 +2069,14 @@ msgid "" "

\n" " " msgstr "" +"

\n" +" Нажмите для создания счета поставщика.\n" +"

\n" +" Вы можете управлять счетом от поставщика в соответствии с\n" +" тем, что вы приобрели. OpenERP также может создавать\n" +" черновые счета автоматически из заказов на закупку.\n" +"

\n" +" " #. module: account #: sql_constraint:account.move.line:0 @@ -3875,6 +3894,20 @@ msgid "" "

\n" " " msgstr "" +"

\n" +" Нажмите для создания счета для клиента.\n" +"

\n" +" Электронное выставление счетов в OpenERP позволяет облегчить " +"и ускорить\n" +" сбор клиентских платежей. Ваш клиент получает\n" +" счет по эл. почте и он может его оплатить онлайн и/или " +"импортировать\n" +" в собственную систему.\n" +"

\n" +" История общения с вашим клиентом автоматически отображается\n" +" в нижней части каждого счета.\n" +"

\n" +" " #. module: account #: field:account.tax.code,name:0 @@ -6135,7 +6168,7 @@ msgstr "" #. module: account #: view:account.config.settings:0 msgid "Select Company" -msgstr "" +msgstr "Выберите компанию" #. module: account #: model:ir.actions.act_window,name:account.action_account_state_open diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index 175a227a9ea..62c8fb37075 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -11,8 +11,8 @@ - + diff --git a/addons/account_accountant/i18n/es_CO.po b/addons/account_accountant/i18n/es_CO.po new file mode 100644 index 00000000000..04a7bfaa493 --- /dev/null +++ b/addons/account_accountant/i18n/es_CO.po @@ -0,0 +1,23 @@ +# Spanish (Colombia) translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-03-11 19:01+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish (Colombia) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-03-12 04:47+0000\n" +"X-Generator: Launchpad (build 16524)\n" + +#. module: account_accountant +#: model:ir.actions.client,name:account_accountant.action_client_account_menu +msgid "Open Accounting Menu" +msgstr "Abrir Menú de Contabilidad" diff --git a/addons/account_accountant/i18n/mk.po b/addons/account_accountant/i18n/mk.po index 196598448ec..3adb976b085 100644 --- a/addons/account_accountant/i18n/mk.po +++ b/addons/account_accountant/i18n/mk.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2011-05-06 12:05+0000\n" -"Last-Translator: FULL NAME \n" +"PO-Revision-Date: 2013-02-25 14:55+0000\n" +"Last-Translator: Софче Димитријева \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-22 06:02+0000\n" -"X-Generator: Launchpad (build 16378)\n" +"X-Launchpad-Export-Date: 2013-02-26 05:09+0000\n" +"X-Generator: Launchpad (build 16506)\n" #. module: account_accountant #: model:ir.actions.client,name:account_accountant.action_client_account_menu msgid "Open Accounting Menu" -msgstr "" +msgstr "Отвори го менито за сметководство" #~ msgid "" #~ "\n" diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index 99e4353afa1..61a92490c47 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -45,6 +45,7 @@ Adds menu to show relevant information to each manager.You can also view the rep 'static/src/css/analytic.css' ], 'demo': ['analytic_account_demo.xml'], + 'test': ['test/account_analytic_analysis.yml'], 'installable': True, 'auto_install': False, } diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 708c4b56629..0a56c80766b 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -18,6 +18,7 @@ # along with this program. If not, see . # ############################################################################## +from dateutil.relativedelta import relativedelta import datetime import logging import time @@ -31,6 +32,58 @@ from openerp.addons.decimal_precision import decimal_precision as dp _logger = logging.getLogger(__name__) +class account_analytic_invoice_line(osv.osv): + _name = "account.analytic.invoice.line" + + def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict, context=None): + res = {} + for line in self.browse(cr, uid, ids, context=context): + res[line.id] = line.quantity * line.price_unit + if line.analytic_account_id.pricelist_id: + cur = line.analytic_account_id.pricelist_id.currency_id + res[line.id] = self.pool.get('res.currency').round(cr, uid, cur, res[line.id]) + return res + + _columns = { + 'product_id': fields.many2one('product.product','Product',required=True), + 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'), + 'name': fields.text('Description', required=True), + 'quantity': fields.float('Quantity', required=True), + 'uom_id': fields.many2one('product.uom', 'Unit of Measure',required=True), + 'price_unit': fields.float('Unit Price', required=True), + 'price_subtotal': fields.function(_amount_line, string='Sub Total', type="float",digits_compute= dp.get_precision('Account')), + } + _defaults = { + 'quantity' : 1, + } + + def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name='', partner_id=False, price_unit=False, pricelist_id=False, company_id=None, context=None): + context = context or {} + uom_obj = self.pool.get('product.uom') + company_id = company_id or False + context.update({'company_id': company_id, 'force_company': company_id, 'pricelist_id': pricelist_id}) + + if not product: + return {'value': {'price_unit': 0.0}, 'domain':{'product_uom':[]}} + if partner_id: + part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) + if part.lang: + context.update({'lang': part.lang}) + + result = {} + res = self.pool.get('product.product').browse(cr, uid, product, context=context) + result.update({'name':res.partner_ref or False,'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0}) + if res.description: + result['name'] += '\n'+res.description + + res_final = {'value':result} + if result['uom_id'] != res.uom_id.id: + selected_uom = uom_obj.browse(cr, uid, result['uom_id'], context=context) + new_price = uom_obj._compute_price(cr, uid, res.uom_id.id, res_final['value']['price_unit'], result['uom_id']) + res_final['value']['price_unit'] = new_price + return res_final + + class account_analytic_account(osv.osv): _name = "account.analytic.account" _inherit = "account.analytic.account" @@ -215,6 +268,8 @@ class account_analytic_account(osv.osv): GROUP BY account_analytic_line.account_id", (child_ids,)) for account_id, sum in cr.fetchall(): res[account_id] = round(sum,2) + for acc in self.browse(cr, uid, res.keys(), context=context): + res[acc.id] = res[acc.id] - (acc.timesheet_ca_invoiced or 0.0) res_final = res return res_final @@ -295,7 +350,7 @@ class account_analytic_account(osv.osv): res = {} for account in self.browse(cr, uid, ids, context=context): res[account.id] = 0.0 - sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('partner_id', '=', account.partner_id.id)], context=context) + sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('state', '=', 'manual')], context=context) for sale in sale_obj.browse(cr, uid, sale_ids, context=context): if not sale.invoiced: res[account.id] += sale.amount_untaxed @@ -456,6 +511,22 @@ class account_analytic_account(osv.osv): 'invoiced_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Invoiced"), 'remaining_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total Remaining", help="Expectation of remaining income for this contract. Computed as the sum of remaining subtotals which, in turn, are computed as the maximum between '(Estimation - Invoiced)' and 'To Invoice' amounts"), 'toinvoice_total' : fields.function(_sum_of_fields, type="float",multi="sum_of_all", string="Total to Invoice", help=" Sum of everything that could be invoiced for this contract."), + 'recurring_invoice_line_ids': fields.one2many('account.analytic.invoice.line', 'analytic_account_id', 'Invoice Lines'), + 'recurring_invoices' : fields.boolean('Generate recurring invoices automatically'), + 'recurring_rule_type': fields.selection([ + ('daily', 'Day(s)'), + ('weekly', 'Week(s)'), + ('monthly', 'Month(s)'), + ('yearly', 'Year(s)'), + ], 'Recurrency', help="Invoice automatically repeat at specified interval"), + 'recurring_interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"), + 'recurring_next_date': fields.date('Date of Next Invoice'), + } + + _defaults = { + 'recurring_interval': 1, + 'recurring_next_date': lambda *a: time.strftime('%Y-%m-%d'), + 'recurring_rule_type':'monthly' } def open_sale_order_lines(self,cr,uid,ids,context=None): @@ -478,17 +549,38 @@ class account_analytic_account(osv.osv): def on_change_template(self, cr, uid, ids, template_id, context=None): if not template_id: return {} + obj_analytic_line = self.pool.get('account.analytic.invoice.line') res = super(account_analytic_account, self).on_change_template(cr, uid, ids, template_id, context=context) - if template_id and 'value' in res: - template = self.browse(cr, uid, template_id, context=context) - res['value']['fix_price_invoices'] = template.fix_price_invoices - res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets - res['value']['hours_qtt_est'] = template.hours_qtt_est - res['value']['amount_max'] = template.amount_max - res['value']['to_invoice'] = template.to_invoice.id - res['value']['pricelist_id'] = template.pricelist_id.id + + template = self.browse(cr, uid, template_id, context=context) + invoice_line_ids = [] + for x in template.recurring_invoice_line_ids: + invoice_line_ids.append((0, 0, { + 'product_id': x.product_id.id, + 'uom_id': x.uom_id.id, + 'name': x.name, + 'quantity': x.quantity, + 'price_unit': x.price_unit, + 'analytic_account_id': x.analytic_account_id and x.analytic_account_id.id or False, + })) + res['value']['fix_price_invoices'] = template.fix_price_invoices + res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets + res['value']['hours_qtt_est'] = template.hours_qtt_est + res['value']['amount_max'] = template.amount_max + res['value']['to_invoice'] = template.to_invoice.id + res['value']['pricelist_id'] = template.pricelist_id.id + res['value']['recurring_invoices'] = template.recurring_invoices + res['value']['recurring_interval'] = template.recurring_interval + res['value']['recurring_rule_type'] = template.recurring_rule_type + res['value']['recurring_invoice_line_ids'] = invoice_line_ids return res + def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None): + value = {} + if date_start and recurring_invoices: + value = {'value': {'recurring_next_date': date_start}} + return value + def cron_account_analytic_account(self, cr, uid, context=None): if context is None: context = {} @@ -527,10 +619,101 @@ class account_analytic_account(osv.osv): for user_id, data in remind.items(): context["data"] = data _logger.debug("Sending reminder to uid %s", user_id) - self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, context=context) + self.pool.get('email.template').send_mail(cr, uid, template_id, user_id, force_send=True, context=context) return True + def onchange_invoice_on_timesheets(self, cr, uid, ids, invoice_on_timesheets, context=None): + if not invoice_on_timesheets: + return {} + result = {'value': {'use_timesheets': True}} + try: + to_invoice = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr_timesheet_invoice', 'timesheet_invoice_factor1') + result['value']['to_invoice'] = to_invoice[1] + except ValueError: + pass + return result + + def _prepare_invoice(self, cr, uid, contract, context=None): + context = context or {} + + inv_obj = self.pool.get('account.invoice') + journal_obj = self.pool.get('account.journal') + fpos_obj = self.pool.get('account.fiscal.position') + + if not contract.partner_id: + raise osv.except_osv(_('No Customer Defined !'),_("You must first select a Customer for Contract %s!") % contract.name ) + + fpos = contract.partner_id.property_account_position.id or False + journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1) + if not journal_ids: + raise osv.except_osv(_('Error!'), + _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', )) + + partner_payment_term = contract.partner_id.property_payment_term and contract.partner_id.property_payment_term.id or False + + + inv_data = { + 'reference': contract.code or False, + 'account_id': contract.partner_id.property_account_receivable.id, + 'type': 'out_invoice', + 'partner_id': contract.partner_id.id, + 'currency_id': contract.partner_id.property_product_pricelist.id or False, + 'journal_id': len(journal_ids) and journal_ids[0] or False, + 'date_invoice': contract.recurring_next_date, + 'origin': contract.name, + 'fiscal_position': fpos, + 'payment_term': partner_payment_term, + 'company_id': contract.company_id.id or False, + } + invoice_id = inv_obj.create(cr, uid, inv_data, context=context) + + for line in contract.recurring_invoice_line_ids: + + res = line.product_id + account_id = res.property_account_income.id + if not account_id: + account_id = res.categ_id.property_account_income_categ.id + account_id = fpos_obj.map_account(cr, uid, fpos, account_id) + + taxes = res.taxes_id and res.taxes_id or False + tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) + + invoice_line_vals = { + 'name': line.name, + 'account_id': account_id, + 'account_analytic_id': contract.id, + 'price_unit': line.price_unit or 0.0, + 'quantity': line.quantity, + 'uos_id': line.uom_id.id or False, + 'product_id': line.product_id.id or False, + 'invoice_id' : invoice_id, + 'invoice_line_tax_id': [(6, 0, tax_id)], + } + self.pool.get('account.invoice.line').create(cr, uid, invoice_line_vals, context=context) + + inv_obj.button_compute(cr, uid, [invoice_id], context=context) + return invoice_id + + def recurring_create_invoice(self, cr, uid, automatic=False, context=None): + context = context or {} + current_date = time.strftime('%Y-%m-%d') + + contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)]) + for contract in self.browse(cr, uid, contract_ids, context=context): + invoice_id = self._prepare_invoice(cr, uid, contract, context=context) + + next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") + interval = contract.recurring_interval + if contract.recurring_rule_type == 'daily': + new_date = next_date+relativedelta(days=+interval) + elif contract.recurring_rule_type == 'weekly': + new_date = next_date+relativedelta(weeks=+interval) + else: + new_date = next_date+relativedelta(months=+interval) + self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) + return True + class account_analytic_account_summary_user(osv.osv): _name = "account_analytic_analysis.summary.user" _description = "Hours Summary by User" diff --git a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml index 311d8708872..14ca1fd2135 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_cron.xml @@ -73,5 +73,16 @@ Hello ${object.name}, + + + Generate Recurring Invoices from Contracts + 1 + days + -1 + + + + + diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index 50cdaff44d1..b4746484e7c 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -5,6 +5,15 @@ Sales Orders sale.order account.analytic.account + +

+ Click to create a quotation that can be converted into a sales + order. +

+ Use sale orders to track everything that should be invoiced + at a fix price on a contract. +

+
@@ -26,6 +35,9 @@ + + {'required': [('type','=','contract'),'|','|',('fix_price_invoices','=',True), ('invoice_on_timesheets', '=', True), ('recurring_invoices', '=', True)]} + @@ -62,20 +74,20 @@ or view - + No order to invoice, create - + + + \ No newline at end of file diff --git a/addons/web_linkedin/web_linkedin.py b/addons/web_linkedin/web_linkedin.py index 62883840f2d..92adb30d3dd 100644 --- a/addons/web_linkedin/web_linkedin.py +++ b/addons/web_linkedin/web_linkedin.py @@ -56,3 +56,39 @@ class web_linkedin_settings(osv.osv_memory): key = self.browse(cr, uid, ids[0], context)["api_key"] or "" self.pool.get("ir.config_parameter").set_param(cr, uid, "web.linkedin.apikey", key) +class web_linkedin_fields(osv.Model): + _inherit = 'res.partner' + + def _get_url(self, cr, uid, ids, name, arg, context=None): + res = dict((id, False) for id in ids) + for partner in self.browse(cr, uid, ids, context=context): + res[partner.id] = partner.linkedin_url + return res + + def linkedin_check_similar_partner(self, cr, uid, linkedin_datas, context=None): + res = [] + res_partner = self.pool.get('res.partner') + for linkedin_data in linkedin_datas: + partner_ids = res_partner.search(cr, uid, ["|", ("linkedin_id", "=", linkedin_data['id']), + "&", ("linkedin_id", "=", False), + "|", ("name", "ilike", linkedin_data['firstName'] + "%" + linkedin_data['lastName']), ("name", "ilike", linkedin_data['lastName'] + "%" + linkedin_data['firstName'])], context=context) + if partner_ids: + partner = res_partner.read(cr, uid, partner_ids[0], ["image", "mobile", "phone", "parent_id", "name", "email", "function", "linkedin_id"], context=context) + if partner['linkedin_id'] and partner['linkedin_id'] != linkedin_data['id']: + partner.pop('id') + if partner['parent_id']: + partner['parent_id'] = partner['parent_id'][0] + for key, val in partner.items(): + if not val: + partner.pop(key) + res.append(partner) + else: + res.append({}) + return res + + _columns = { + 'linkedin_id': fields.char(string="LinkedIn ID", size=50), + 'linkedin_url': fields.char(string="LinkedIn url", size=100, store=True), + 'linkedin_public_url': fields.function(_get_url, type='text', string="LinkedIn url", + help="This url is set automatically when you join the partner with a LinkedIn account."), + } \ No newline at end of file diff --git a/addons/web_linkedin/web_linkedin_view.xml b/addons/web_linkedin/web_linkedin_view.xml index e2d4903a2d6..f7c5dfa0a69 100644 --- a/addons/web_linkedin/web_linkedin_view.xml +++ b/addons/web_linkedin/web_linkedin_view.xml @@ -9,6 +9,10 @@ + + + + @@ -29,8 +33,9 @@
  • Log into LinkedIn.
  • Add a new application and fill the form:
      -
    • JavaScript API Domain:
    • +
    • Website URL:
    • The programming tool is Javascript
    • +
    • Website URL inside "JavaScript API Domains" field
  • Copy the API key here: diff --git a/addons/web_shortcuts/i18n/mk.po b/addons/web_shortcuts/i18n/mk.po new file mode 100644 index 00000000000..81fcd38f0f5 --- /dev/null +++ b/addons/web_shortcuts/i18n/mk.po @@ -0,0 +1,25 @@ +# Macedonian translation for openobject-addons +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:06+0000\n" +"PO-Revision-Date: 2013-03-01 14:20+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Macedonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-03-02 04:57+0000\n" +"X-Generator: Launchpad (build 16514)\n" + +#. module: web_shortcuts +#. openerp-web +#: code:addons/web_shortcuts/static/src/xml/web_shortcuts.xml:21 +#, python-format +msgid "Add / Remove Shortcut..." +msgstr "Додади / Отстрани кратенка"