[MERGE] merge with latest trunk
bzr revid: amb@tinyerp.com-20130829050254-xwt0261q0hdtrwun
This commit is contained in:
commit
18961cfdf5
|
@ -1 +1,2 @@
|
|||
.*
|
||||
**/node_modules
|
||||
|
|
|
@ -561,10 +561,14 @@ class account_invoice(osv.osv):
|
|||
|
||||
def onchange_payment_term_date_invoice(self, cr, uid, ids, payment_term_id, date_invoice):
|
||||
res = {}
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
if not date_invoice:
|
||||
date_invoice = time.strftime('%Y-%m-%d')
|
||||
if not payment_term_id:
|
||||
return {'value':{'date_due': date_invoice}} #To make sure the invoice has a due date when no payment term
|
||||
inv = self.browse(cr, uid, ids[0])
|
||||
#To make sure the invoice due date should contain due date which is entered by user when there is no payment term defined
|
||||
return {'value':{'date_due': inv.date_due and inv.date_due or date_invoice}}
|
||||
pterm_list = self.pool.get('account.payment.term').compute(cr, uid, payment_term_id, value=1, date_ref=date_invoice)
|
||||
if pterm_list:
|
||||
pterm_list = [line[0] for line in pterm_list]
|
||||
|
|
|
@ -800,7 +800,7 @@ class account_move_line(osv.osv):
|
|||
r_id = move_rec_obj.create(cr, uid, {
|
||||
'type': type,
|
||||
'line_partial_ids': map(lambda x: (4,x,False), merges+unmerge)
|
||||
})
|
||||
}, context=context)
|
||||
move_rec_obj.reconcile_partial_check(cr, uid, [r_id] + merges_rec, context=context)
|
||||
return True
|
||||
|
||||
|
|
|
@ -266,7 +266,7 @@ class account_invoice(osv.osv, EDIMixin):
|
|||
params = {
|
||||
"cmd": "_xclick",
|
||||
"business": inv.company_id.paypal_account,
|
||||
"item_name": inv.company_id.name + " Invoice " + inv.number,
|
||||
"item_name": "%s Invoice %s" % (inv.company_id.name, inv.number or ''),
|
||||
"invoice": inv.number,
|
||||
"amount": inv.residual,
|
||||
"currency_code": inv.currency_id.name,
|
||||
|
|
|
@ -25,7 +25,7 @@ from dateutil.relativedelta import relativedelta
|
|||
from operator import itemgetter
|
||||
from os.path import join as opj
|
||||
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT as DF
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as DF
|
||||
from openerp.tools.translate import _
|
||||
from openerp.osv import fields, osv
|
||||
from openerp import tools
|
||||
|
|
|
@ -67,9 +67,10 @@
|
|||
Then I cancel Bank Statements and verifies that it raises a warning
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
from openerp.osv import osv
|
||||
try:
|
||||
self.button_cancel(cr, uid, [ref("account_bank_statement_0")])
|
||||
assert False, "An exception should have been raised, the journal should not let us cancel moves!"
|
||||
except Exception:
|
||||
except osv.except_osv:
|
||||
# exception was raised as expected, as the journal does not allow cancelling moves
|
||||
pass
|
||||
|
|
|
@ -73,14 +73,16 @@
|
|||
I cancel the account move which is in posted state and verifies that it gives warning message
|
||||
-
|
||||
!python {model: account.move}: |
|
||||
from openerp.osv import osv
|
||||
inv_obj = self.pool.get('account.invoice')
|
||||
inv = inv_obj.browse(cr, uid, ref('account_invoice_supplier0'))
|
||||
try:
|
||||
mov_cancel = self.button_cancel(cr, uid, [inv.move_id.id], {'lang': u'en_US', 'tz': False,
|
||||
'active_model': 'ir.ui.menu', 'journal_type': 'purchase', 'active_ids': [ref('menu_action_invoice_tree2')],
|
||||
'type': 'in_invoice', 'active_id': ref('menu_action_invoice_tree2')})
|
||||
except Exception, e:
|
||||
assert e, 'Warning message has not been raised'
|
||||
assert False, "This should never happen!"
|
||||
except osv.except_osv:
|
||||
pass
|
||||
-
|
||||
I verify that 'Period Sum' and 'Year sum' of the tax code are the expected values
|
||||
-
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
<separator string="Aged Partner Balance"/>
|
||||
<label string="Aged Partner Balance is a more detailed report of your receivables by intervals. When opening that report, OpenERP asks for the name of the company, the fiscal period and the size of the interval to be analyzed (in days). OpenERP then calculates a table of credit balance by period. So if you request an interval of 30 days OpenERP generates an analysis of creditors for the past month, past two months, and so on. "/>
|
||||
<group col="4">
|
||||
<field name="chart_account_id" widget='selection'/>
|
||||
<field name="chart_account_id" widget='selection' on_change="onchange_chart_id(chart_account_id, context)"/>
|
||||
<field name="fiscalyear_id" invisible="1"/>
|
||||
<newline/>
|
||||
<field name="date_from"/>
|
||||
<field name="period_length"/>
|
||||
|
|
|
@ -34,7 +34,10 @@ class account_common_report(osv.osv_memory):
|
|||
res = {}
|
||||
if chart_account_id:
|
||||
company_id = self.pool.get('account.account').browse(cr, uid, chart_account_id, context=context).company_id.id
|
||||
res['value'] = {'company_id': company_id}
|
||||
now = time.strftime('%Y-%m-%d')
|
||||
domain = [('company_id', '=', company_id), ('date_start', '<', now), ('date_stop', '>', now)]
|
||||
fiscalyears = self.pool.get('account.fiscalyear').search(cr, uid, domain, limit=1)
|
||||
res['value'] = {'company_id': company_id, 'fiscalyear_id': fiscalyears and fiscalyears[0] or False}
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
|
@ -124,10 +127,11 @@ class account_common_report(osv.osv_memory):
|
|||
now = time.strftime('%Y-%m-%d')
|
||||
company_id = False
|
||||
ids = context.get('active_ids', [])
|
||||
domain = [('date_start', '<', now), ('date_stop', '>', now)]
|
||||
if ids and context.get('active_model') == 'account.account':
|
||||
company_id = self.pool.get('account.account').browse(cr, uid, ids[0], context=context).company_id.id
|
||||
domain += [('company_id', '=', company_id)]
|
||||
else: # use current company id
|
||||
company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
|
||||
domain = [('company_id', '=', company_id), ('date_start', '<', now), ('date_stop', '>', now)]
|
||||
fiscalyears = self.pool.get('account.fiscalyear').search(cr, uid, domain, limit=1)
|
||||
return fiscalyears and fiscalyears[0] or False
|
||||
|
||||
|
|
|
@ -530,7 +530,7 @@ class account_analytic_account(osv.osv):
|
|||
context = {}
|
||||
sale_ids = self.pool.get('sale.order').search(cr,uid,[('project_id','=',context.get('search_default_project_id',False)),('partner_id','in',context.get('search_default_partner_id',False))])
|
||||
names = [record.name for record in self.browse(cr, uid, ids, context=context)]
|
||||
name = _('Sales Order Lines of %s') % ','.join(names)
|
||||
name = _('Sales Order Lines to Invoice of %s') % ','.join(names)
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': name,
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
width: 250px;
|
||||
padding-left: 7px;
|
||||
}
|
||||
.openerp .oe_form table.oe_form_analytic_account th {
|
||||
text-align: right;
|
||||
}
|
||||
.openerp .oe_form table.oe_form_analytic_account .oe_timesheet_grey {
|
||||
background-color: #eeeeee;
|
||||
color: #404040;
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
td.oe_timesheet_action
|
||||
width: 250px
|
||||
padding-left: 7px
|
||||
th
|
||||
text-align: right
|
||||
.oe_timesheet_grey
|
||||
background-color: #eeeeee
|
||||
color: #404040
|
||||
|
|
|
@ -0,0 +1,741 @@
|
|||
# Hungarian 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||
"PO-Revision-Date: 2013-08-22 11:04+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Hungarian <hu@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-23 05:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16737)\n"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Assets in draft and open states"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,method_end:0
|
||||
#: field:account.asset.history,method_end:0
|
||||
#: field:asset.modify,method_end:0
|
||||
msgid "Ending date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,value_residual:0
|
||||
msgid "Residual Value"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,account_expense_depreciation_id:0
|
||||
msgid "Depr. Expense Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Group By..."
|
||||
msgstr "Csoportosítás"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.asset.report,gross_value:0
|
||||
msgid "Gross Amount"
|
||||
msgstr "Bruttó összeg"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: field:account.asset.depreciation.line,asset_id:0
|
||||
#: field:account.asset.history,asset_id:0
|
||||
#: field:account.move.line,asset_id:0
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,asset_id:0
|
||||
#: model:ir.model,name:account_asset.model_account_asset_asset
|
||||
msgid "Asset"
|
||||
msgstr "Eszköz"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,prorata:0
|
||||
#: help:account.asset.category,prorata:0
|
||||
msgid ""
|
||||
"Indicates that the first depreciation entry for this asset have to be done "
|
||||
"from the purchase date instead of the first January"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: selection:account.asset.asset,method:0
|
||||
#: selection:account.asset.category,method:0
|
||||
msgid "Linear"
|
||||
msgstr "Lineáris"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,company_id:0
|
||||
#: field:account.asset.category,company_id:0
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,company_id:0
|
||||
msgid "Company"
|
||||
msgstr "Vállalat"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.modify:0
|
||||
msgid "Modify"
|
||||
msgstr "Módosítás"
|
||||
|
||||
#. module: account_asset
|
||||
#: selection:account.asset.asset,state:0
|
||||
#: view:asset.asset.report:0
|
||||
#: selection:asset.asset.report,state:0
|
||||
msgid "Running"
|
||||
msgstr "Folyamatban lévő"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Set to Draft"
|
||||
msgstr "Beállítás tervezetnek"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
#: model:ir.actions.act_window,name:account_asset.action_asset_asset_report
|
||||
#: model:ir.model,name:account_asset.model_asset_asset_report
|
||||
#: model:ir.ui.menu,name:account_asset.menu_action_asset_asset_report
|
||||
msgid "Assets Analysis"
|
||||
msgstr "Eszközök elemzése"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.modify,name:0
|
||||
msgid "Reason"
|
||||
msgstr "Indoklás"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method_progress_factor:0
|
||||
#: field:account.asset.category,method_progress_factor:0
|
||||
msgid "Degressive Factor"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal
|
||||
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal
|
||||
msgid "Asset Categories"
|
||||
msgstr "Eszköz kategóriák"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: field:account.asset.asset,account_move_line_ids:0
|
||||
#: field:account.move.line,entry_ids:0
|
||||
#: model:ir.actions.act_window,name:account_asset.act_entries_open
|
||||
msgid "Entries"
|
||||
msgstr "Tételek"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: field:account.asset.asset,depreciation_line_ids:0
|
||||
msgid "Depreciation Lines"
|
||||
msgstr "Értékcsökkénés sorai"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,salvage_value:0
|
||||
msgid "It is the amount you plan to have that you cannot depreciate."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,method_period:0
|
||||
msgid "The amount of time between two depreciations, in months"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,depreciation_date:0
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,depreciation_date:0
|
||||
msgid "Depreciation Date"
|
||||
msgstr "Értékcsökkenés dátuma"
|
||||
|
||||
#. module: account_asset
|
||||
#: constraint:account.asset.asset:0
|
||||
msgid "Error ! You cannot create recursive assets."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.asset.report,posted_value:0
|
||||
msgid "Posted Amount"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: view:asset.asset.report:0
|
||||
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form
|
||||
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form
|
||||
#: model:ir.ui.menu,name:account_asset.menu_finance_assets
|
||||
#: model:ir.ui.menu,name:account_asset.menu_finance_config_assets
|
||||
msgid "Assets"
|
||||
msgstr "Eszközök"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,account_depreciation_id:0
|
||||
msgid "Depreciation Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: view:account.asset.category:0
|
||||
#: view:account.asset.history:0
|
||||
#: view:asset.modify:0
|
||||
#: field:asset.modify,note:0
|
||||
msgid "Notes"
|
||||
msgstr "Megjegyzések"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,move_id:0
|
||||
msgid "Depreciation Entry"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,nbr:0
|
||||
msgid "# of Depreciation Lines"
|
||||
msgstr "# értékcsökkenési sorok száma"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method_period:0
|
||||
msgid "Number of Months in a Period"
|
||||
msgstr "Hónapok száma az időszakban"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Assets in draft state"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method_end:0
|
||||
#: selection:account.asset.asset,method_time:0
|
||||
#: selection:account.asset.category,method_time:0
|
||||
#: selection:account.asset.history,method_time:0
|
||||
msgid "Ending Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,code:0
|
||||
msgid "Reference"
|
||||
msgstr "Hivatkozás"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Account Asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.actions.act_window,name:account_asset.action_asset_depreciation_confirmation_wizard
|
||||
#: model:ir.ui.menu,name:account_asset.menu_asset_depreciation_confirmation_wizard
|
||||
msgid "Compute Assets"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,method_period:0
|
||||
#: field:account.asset.history,method_period:0
|
||||
#: field:asset.modify,method_period:0
|
||||
msgid "Period Length"
|
||||
msgstr "Időszak hossza"
|
||||
|
||||
#. module: account_asset
|
||||
#: selection:account.asset.asset,state:0
|
||||
#: view:asset.asset.report:0
|
||||
#: selection:asset.asset.report,state:0
|
||||
msgid "Draft"
|
||||
msgstr "Tervezet"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Date of asset purchase"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Change Duration"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,method_number:0
|
||||
#: help:account.asset.category,method_number:0
|
||||
#: help:account.asset.history,method_number:0
|
||||
msgid "The number of depreciations needed to depreciate your asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.category:0
|
||||
msgid "Analytic Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,account_analytic_id:0
|
||||
msgid "Analytic account"
|
||||
msgstr "Gyűjtőkód"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method:0
|
||||
#: field:account.asset.category,method:0
|
||||
msgid "Computation Method"
|
||||
msgstr "Számítási módszer"
|
||||
|
||||
#. module: account_asset
|
||||
#: constraint:account.asset.asset:0
|
||||
msgid ""
|
||||
"Prorata temporis can be applied only for time method \"number of "
|
||||
"depreciations\"."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,remaining_value:0
|
||||
msgid "Next Period Depreciation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.history,method_period:0
|
||||
msgid "Time in month between two depreciations"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.modify:0
|
||||
#: model:ir.actions.act_window,name:account_asset.action_asset_modify
|
||||
#: model:ir.model,name:account_asset.model_asset_modify
|
||||
msgid "Modify Asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,salvage_value:0
|
||||
msgid "Salvage Value"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,category_id:0
|
||||
#: view:account.asset.category:0
|
||||
#: field:account.invoice.line,asset_category_id:0
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Asset Category"
|
||||
msgstr "Eszköz kategória"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Assets in closed state"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,parent_id:0
|
||||
msgid "Parent Asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.history:0
|
||||
#: model:ir.model,name:account_asset.model_account_asset_history
|
||||
msgid "Asset history"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.category:0
|
||||
msgid "Search Asset Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.modify:0
|
||||
msgid "months"
|
||||
msgstr "hónapok"
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.model,name:account_asset.model_account_invoice_line
|
||||
msgid "Invoice Line"
|
||||
msgstr "Számlasor"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Depreciation Board"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.asset.report,unposted_value:0
|
||||
msgid "Unposted Amount"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method_time:0
|
||||
#: field:account.asset.category,method_time:0
|
||||
#: field:account.asset.history,method_time:0
|
||||
msgid "Time Method"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.depreciation.confirmation.wizard:0
|
||||
#: view:asset.modify:0
|
||||
msgid "or"
|
||||
msgstr "vagy"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,note:0
|
||||
#: field:account.asset.category,note:0
|
||||
#: field:account.asset.history,note:0
|
||||
msgid "Note"
|
||||
msgstr "Jegyzet"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.history,method_time:0
|
||||
msgid ""
|
||||
"The method to use to compute the dates and number of depreciation lines.\n"
|
||||
"Number of Depreciations: Fix the number of depreciation lines and the time "
|
||||
"between 2 depreciations.\n"
|
||||
"Ending Date: Choose the time between 2 depreciations and the date the "
|
||||
"depreciations won't go beyond."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,method_time:0
|
||||
#: help:account.asset.category,method_time:0
|
||||
msgid ""
|
||||
"Choose the method to use to compute the dates and number of depreciation "
|
||||
"lines.\n"
|
||||
" * Number of Depreciations: Fix the number of depreciation lines and the "
|
||||
"time between 2 depreciations.\n"
|
||||
" * Ending Date: Choose the time between 2 depreciations and the date the "
|
||||
"depreciations won't go beyond."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Assets in running state"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Closed"
|
||||
msgstr "Lezárt"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,state:0
|
||||
msgid ""
|
||||
"When an asset is created, the status is 'Draft'.\n"
|
||||
"If the asset is confirmed, the status goes in 'Running' and the depreciation "
|
||||
"lines can be posted in the accounting.\n"
|
||||
"You can manually close an asset when the depreciation is over. If the last "
|
||||
"line of depreciation is posted, the asset automatically goes in that status."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,state:0
|
||||
#: field:asset.asset.report,state:0
|
||||
msgid "Status"
|
||||
msgstr "Státusz"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,partner_id:0
|
||||
#: field:asset.asset.report,partner_id:0
|
||||
msgid "Partner"
|
||||
msgstr "Partner"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Posted depreciation lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,child_ids:0
|
||||
msgid "Children Assets"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Date of depreciation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.history,user_id:0
|
||||
msgid "User"
|
||||
msgstr "Felhasználó"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,account_asset_id:0
|
||||
msgid "Asset Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
msgid "Extended Filters..."
|
||||
msgstr "Kiterjesztett szűrők…"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: view:asset.depreciation.confirmation.wizard:0
|
||||
msgid "Compute"
|
||||
msgstr "Kiszámítás"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.history:0
|
||||
msgid "Asset History"
|
||||
msgstr "Eszköz történet"
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.model,name:account_asset.model_asset_depreciation_confirmation_wizard
|
||||
msgid "asset.depreciation.confirmation.wizard"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,active:0
|
||||
msgid "Active"
|
||||
msgstr "Aktív"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,parent_state:0
|
||||
msgid "State of Asset"
|
||||
msgstr "Eszköz státusza"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,name:0
|
||||
msgid "Depreciation Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
#: field:account.asset.asset,history_ids:0
|
||||
msgid "History"
|
||||
msgstr "Előzmény"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.depreciation.confirmation.wizard:0
|
||||
msgid "Compute Asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.depreciation.confirmation.wizard,period_id:0
|
||||
msgid "Period"
|
||||
msgstr "Időszak"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "General"
|
||||
msgstr "Általános"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,prorata:0
|
||||
#: field:account.asset.category,prorata:0
|
||||
msgid "Prorata Temporis"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.model,name:account_asset.model_account_invoice
|
||||
msgid "Invoice"
|
||||
msgstr "Számla"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Set to Close"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.depreciation.confirmation.wizard:0
|
||||
#: view:asset.modify:0
|
||||
msgid "Cancel"
|
||||
msgstr "Mégsem"
|
||||
|
||||
#. module: account_asset
|
||||
#: selection:account.asset.asset,state:0
|
||||
#: selection:asset.asset.report,state:0
|
||||
msgid "Close"
|
||||
msgstr "Lezár"
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.model,name:account_asset.model_account_move_line
|
||||
msgid "Journal Items"
|
||||
msgstr "Könyvelési tételsorok"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.modify:0
|
||||
msgid "Asset Durations to Modify"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,purchase_date:0
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,purchase_date:0
|
||||
msgid "Purchase Date"
|
||||
msgstr "Vásárlás dátuma"
|
||||
|
||||
#. module: account_asset
|
||||
#: selection:account.asset.asset,method:0
|
||||
#: selection:account.asset.category,method:0
|
||||
msgid "Degressive"
|
||||
msgstr "Degresszív"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:asset.depreciation.confirmation.wizard,period_id:0
|
||||
msgid ""
|
||||
"Choose the period for which you want to automatically post the depreciation "
|
||||
"lines of running assets"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Current"
|
||||
msgstr "Jelenlegi"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.category:0
|
||||
msgid "Depreciation Method"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,amount:0
|
||||
msgid "Current Depreciation"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,name:0
|
||||
msgid "Asset Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,open_asset:0
|
||||
msgid "Skip Draft State"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.category:0
|
||||
msgid "Depreciation Dates"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,currency_id:0
|
||||
msgid "Currency"
|
||||
msgstr "Pénznem"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,journal_id:0
|
||||
msgid "Journal"
|
||||
msgstr "Napló"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.history,name:0
|
||||
msgid "History name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,depreciated_value:0
|
||||
msgid "Amount Already Depreciated"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.asset,method:0
|
||||
#: help:account.asset.category,method:0
|
||||
msgid ""
|
||||
"Choose the method to use to compute the amount of depreciation lines.\n"
|
||||
" * Linear: Calculated on basis of: Gross Value / Number of Depreciations\n"
|
||||
" * Degressive: Calculated on basis of: Residual Value * Degressive Factor"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,move_check:0
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,move_check:0
|
||||
msgid "Posted"
|
||||
msgstr "Könyvelt"
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.actions.act_window,help:account_asset.action_asset_asset_report
|
||||
msgid ""
|
||||
"<p>\n"
|
||||
" From this report, you can have an overview on all depreciation. "
|
||||
"The\n"
|
||||
" tool search can also be used to personalise your Assets reports "
|
||||
"and\n"
|
||||
" so, match this analysis to your needs;\n"
|
||||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,purchase_value:0
|
||||
msgid "Gross Value"
|
||||
msgstr "Bruttó érték"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.category,name:0
|
||||
msgid "Name"
|
||||
msgstr "Név"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.category,open_asset:0
|
||||
msgid ""
|
||||
"Check this if you want to automatically confirm the assets of this category "
|
||||
"when created by invoices."
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:asset.asset.report,name:0
|
||||
msgid "Year"
|
||||
msgstr "Év"
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.model,name:account_asset.model_account_asset_depreciation_line
|
||||
msgid "Asset depreciation line"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.category:0
|
||||
#: field:asset.asset.report,asset_category_id:0
|
||||
#: model:ir.model,name:account_asset.model_account_asset_category
|
||||
msgid "Asset category"
|
||||
msgstr "Eszköz kategória"
|
||||
|
||||
#. module: account_asset
|
||||
#: view:asset.asset.report:0
|
||||
#: field:asset.asset.report,depreciation_value:0
|
||||
msgid "Amount of Depreciation Lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: code:addons/account_asset/wizard/wizard_asset_compute.py:50
|
||||
#, python-format
|
||||
msgid "Created Asset Moves"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.depreciation.line,sequence:0
|
||||
msgid "Sequence"
|
||||
msgstr "Sorszám"
|
||||
|
||||
#. module: account_asset
|
||||
#: help:account.asset.category,method_period:0
|
||||
msgid "State here the time between 2 depreciations, in months"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.history,date:0
|
||||
msgid "Date"
|
||||
msgstr "Dátum"
|
||||
|
||||
#. module: account_asset
|
||||
#: field:account.asset.asset,method_number:0
|
||||
#: selection:account.asset.asset,method_time:0
|
||||
#: field:account.asset.category,method_number:0
|
||||
#: selection:account.asset.category,method_time:0
|
||||
#: field:account.asset.history,method_number:0
|
||||
#: selection:account.asset.history,method_time:0
|
||||
#: field:asset.modify,method_number:0
|
||||
msgid "Number of Depreciations"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Create Move"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: view:account.asset.asset:0
|
||||
msgid "Confirm Asset"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_asset
|
||||
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree
|
||||
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree
|
||||
msgid "Asset Hierarchy"
|
||||
msgstr ""
|
|
@ -31,10 +31,10 @@ from openerp.report import report_sxw
|
|||
class res_currency(osv.osv):
|
||||
_inherit = "res.currency"
|
||||
|
||||
def _get_current_rate(self, cr, uid, ids, name, arg, context=None):
|
||||
def _get_current_rate(self, cr, uid, ids, raise_on_no_rate=True, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
res = super(res_currency, self)._get_current_rate(cr, uid, ids, name, arg, context=context)
|
||||
res = super(res_currency, self)._get_current_rate(cr, uid, ids, raise_on_no_rate, context=context)
|
||||
if context.get('voucher_special_currency') in ids and context.get('voucher_special_currency_rate'):
|
||||
res[context.get('voucher_special_currency')] = context.get('voucher_special_currency_rate')
|
||||
return res
|
||||
|
@ -884,6 +884,8 @@ class account_voucher(osv.osv):
|
|||
return res
|
||||
|
||||
def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, date, amount, ttype, company_id, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
if not journal_id:
|
||||
return False
|
||||
journal_pool = self.pool.get('account.journal')
|
||||
|
@ -932,6 +934,8 @@ class account_voucher(osv.osv):
|
|||
move_pool = self.pool.get('account.move')
|
||||
|
||||
for voucher in self.browse(cr, uid, ids, context=context):
|
||||
# refresh to make sure you don't unlink an already removed move
|
||||
voucher.refresh()
|
||||
recs = []
|
||||
for line in voucher.move_ids:
|
||||
if line.reconcile_id:
|
||||
|
@ -1182,7 +1186,7 @@ class account_voucher(osv.osv):
|
|||
for line in voucher.line_ids:
|
||||
#create one move line per voucher line where amount is not 0.0
|
||||
# AND (second part of the clause) only if the original move line was not having debit = credit = 0 (which is a legal value)
|
||||
if not line.amount and not (line.move_line_id and not float_compare(line.move_line_id.debit, line.move_line_id.credit, precision_rounding=prec) and not float_compare(line.move_line_id.debit, 0.0, precision_rounding=prec)):
|
||||
if not line.amount and not (line.move_line_id and not float_compare(line.move_line_id.debit, line.move_line_id.credit, precision_digits=prec) and not float_compare(line.move_line_id.debit, 0.0, precision_digits=prec)):
|
||||
continue
|
||||
# convert the amount set on the voucher line into the currency of the voucher's company
|
||||
# this calls res_curreny.compute() with the right context, so that it will take either the rate on the voucher if it is relevant or will use the default behaviour
|
||||
|
@ -1282,10 +1286,8 @@ class account_voucher(osv.osv):
|
|||
}
|
||||
new_id = move_line_obj.create(cr, uid, move_line_foreign_currency, context=context)
|
||||
rec_ids.append(new_id)
|
||||
|
||||
if line.move_line_id.id:
|
||||
rec_lst_ids.append(rec_ids)
|
||||
|
||||
return (tot_line, rec_lst_ids)
|
||||
|
||||
def writeoff_move_line_get(self, cr, uid, voucher_id, line_total, move_id, name, company_currency, current_currency, context=None):
|
||||
|
|
|
@ -332,14 +332,15 @@
|
|||
<group>
|
||||
<group>
|
||||
<field name="writeoff_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
|
||||
<field name="payment_option" required="1"/>
|
||||
<field name="payment_option" required="1" attrs="{'invisible':[('writeoff_amount','=',0)]}"/>
|
||||
<field name="writeoff_acc_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
domain="[('type','=','other')]"/>
|
||||
<field name="comment"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)]}"/>
|
||||
<field name="analytic_id"
|
||||
groups="analytic.group_analytic_accounting"/>
|
||||
groups="analytic.group_analytic_accounting"
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
</group>
|
||||
|
@ -494,14 +495,15 @@
|
|||
</group>
|
||||
<group>
|
||||
<field name="writeoff_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
|
||||
<field name="payment_option" required="1"/>
|
||||
<field name="payment_option" required="1" attrs="{'invisible':[('writeoff_amount','=',0)]}"/>
|
||||
<field name="writeoff_acc_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
domain="[('type','=','other')]"/>
|
||||
<field name="comment"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)]}"/>
|
||||
<field name="analytic_id"
|
||||
groups="analytic.group_analytic_accounting"/>
|
||||
groups="analytic.group_analytic_accounting"
|
||||
attrs="{'invisible':['|', ('payment_option','!=','with_writeoff'), ('writeoff_amount','=',0)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
<button
|
||||
name="open_hr_expense"
|
||||
class="oe_link"
|
||||
string="expenses" type="object"/>
|
||||
string="Expenses" type="object"/>
|
||||
</td>
|
||||
</tr>
|
||||
</xpath>
|
||||
|
|
|
@ -42,6 +42,7 @@ class analytic_user_funct_grid(osv.osv):
|
|||
return {}
|
||||
|
||||
value = {}
|
||||
prod = False
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
emp = emp_obj.browse(cr, uid, emp_id[0], context=context)
|
||||
|
|
|
@ -120,7 +120,7 @@ class res_users(osv.osv):
|
|||
def set_pw(self, cr, uid, id, name, value, args, context):
|
||||
if value:
|
||||
encrypted = md5crypt(value, gen_salt())
|
||||
cr.execute('update res_users set password_crypt=%s where id=%s', (encrypted, int(id)))
|
||||
cr.execute("update res_users set password='', password_crypt=%s where id=%s", (encrypted, id))
|
||||
del value
|
||||
|
||||
def get_pw( self, cr, uid, ids, name, args, context ):
|
||||
|
@ -143,7 +143,7 @@ class res_users(osv.osv):
|
|||
cr.execute('SELECT password, password_crypt FROM res_users WHERE id=%s AND active', (uid,))
|
||||
if cr.rowcount:
|
||||
stored_password, stored_password_crypt = cr.fetchone()
|
||||
if password and not stored_password_crypt:
|
||||
if stored_password and not stored_password_crypt:
|
||||
salt = gen_salt()
|
||||
stored_password_crypt = md5crypt(stored_password, salt)
|
||||
cr.execute("UPDATE res_users SET password='', password_crypt=%s WHERE id=%s", (stored_password_crypt, uid))
|
||||
|
@ -151,14 +151,15 @@ class res_users(osv.osv):
|
|||
return super(res_users, self).check_credentials(cr, uid, password)
|
||||
except openerp.exceptions.AccessDenied:
|
||||
# check md5crypt
|
||||
if stored_password_crypt[:len(magic_md5)] == magic_md5:
|
||||
salt = stored_password_crypt[len(magic_md5):11]
|
||||
if stored_password_crypt == md5crypt(password, salt):
|
||||
return
|
||||
elif stored_password_crypt[:len(magic_md5)] == magic_sha256:
|
||||
salt = stored_password_crypt[len(magic_md5):11]
|
||||
if stored_password_crypt == md5crypt(password, salt):
|
||||
return
|
||||
if stored_password_crypt:
|
||||
if stored_password_crypt[:len(magic_md5)] == magic_md5:
|
||||
salt = stored_password_crypt[len(magic_md5):11]
|
||||
if stored_password_crypt == md5crypt(password, salt):
|
||||
return
|
||||
elif stored_password_crypt[:len(magic_md5)] == magic_sha256:
|
||||
salt = stored_password_crypt[len(magic_md5):11]
|
||||
if stored_password_crypt == md5crypt(password, salt):
|
||||
return
|
||||
# Reraise password incorrect
|
||||
raise
|
||||
|
||||
|
|
|
@ -92,11 +92,6 @@ allows pre-setting the default groups and menus of the first-time users.
|
|||
user with the same login (and a blank password), then rename this new
|
||||
user to a username that does not exist in LDAP, and setup its groups
|
||||
the way you want.
|
||||
|
||||
Interaction with base_crypt:
|
||||
----------------------------
|
||||
The base_crypt module is not compatible with this module, and will disable LDAP
|
||||
authentication if installed at the same time.
|
||||
""",
|
||||
'website' : 'http://www.openerp.com',
|
||||
'category' : 'Authentication',
|
||||
|
|
|
@ -26,6 +26,7 @@ import openerp.exceptions
|
|||
from openerp import tools
|
||||
from openerp.osv import fields, osv
|
||||
from openerp import SUPERUSER_ID
|
||||
from openerp.modules.registry import RegistryManager
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class CompanyLDAP(osv.osv):
|
||||
|
@ -190,9 +191,9 @@ class CompanyLDAP(osv.osv):
|
|||
user_obj = self.pool['res.users']
|
||||
values = self.map_ldap_attributes(cr, uid, conf, login, ldap_entry)
|
||||
if conf['user']:
|
||||
values['active'] = True
|
||||
user_id = user_obj.copy(cr, SUPERUSER_ID, conf['user'],
|
||||
default={'active': True})
|
||||
user_obj.write(cr, SUPERUSER_ID, user_id, values)
|
||||
default=values)
|
||||
else:
|
||||
user_id = user_obj.create(cr, SUPERUSER_ID, values)
|
||||
return user_id
|
||||
|
@ -243,41 +244,31 @@ class users(osv.osv):
|
|||
user_id = super(users, self).login(db, login, password)
|
||||
if user_id:
|
||||
return user_id
|
||||
cr = self.pool.db.cursor()
|
||||
ldap_obj = self.pool['res.company.ldap']
|
||||
for conf in ldap_obj.get_ldap_dicts(cr):
|
||||
entry = ldap_obj.authenticate(conf, login, password)
|
||||
if entry:
|
||||
user_id = ldap_obj.get_or_create_user(
|
||||
cr, SUPERUSER_ID, conf, login, entry)
|
||||
if user_id:
|
||||
cr.execute("""UPDATE res_users
|
||||
SET login_date=now() AT TIME ZONE 'UTC'
|
||||
WHERE login=%s""",
|
||||
(tools.ustr(login),))
|
||||
cr.commit()
|
||||
break
|
||||
cr.close()
|
||||
return user_id
|
||||
|
||||
def check(self, db, uid, passwd):
|
||||
try:
|
||||
return super(users,self).check(db, uid, passwd)
|
||||
except openerp.exceptions.AccessDenied:
|
||||
pass
|
||||
|
||||
cr = self.pool.db.cursor()
|
||||
cr.execute('SELECT login FROM res_users WHERE id=%s AND active=TRUE',
|
||||
(int(uid),))
|
||||
res = cr.fetchone()
|
||||
if res:
|
||||
ldap_obj = self.pool['res.company.ldap']
|
||||
registry = RegistryManager.get(db)
|
||||
with registry.cursor() as cr:
|
||||
ldap_obj = registry.get('res.company.ldap')
|
||||
for conf in ldap_obj.get_ldap_dicts(cr):
|
||||
if ldap_obj.authenticate(conf, res[0], passwd):
|
||||
self._uid_cache.setdefault(db, {})[uid] = passwd
|
||||
cr.close()
|
||||
return True
|
||||
cr.close()
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
entry = ldap_obj.authenticate(conf, login, password)
|
||||
if entry:
|
||||
user_id = ldap_obj.get_or_create_user(
|
||||
cr, SUPERUSER_ID, conf, login, entry)
|
||||
if user_id:
|
||||
break
|
||||
return user_id
|
||||
|
||||
def check_credentials(self, cr, uid, password):
|
||||
try:
|
||||
super(users, self).check_credentials(cr, uid, password)
|
||||
except openerp.exceptions.AccessDenied:
|
||||
|
||||
cr.execute('SELECT login FROM res_users WHERE id=%s AND active=TRUE',
|
||||
(int(uid),))
|
||||
res = cr.fetchone()
|
||||
if res:
|
||||
ldap_obj = self.pool['res.company.ldap']
|
||||
for conf in ldap_obj.get_ldap_dicts(cr):
|
||||
if ldap_obj.authenticate(conf, res[0], password):
|
||||
return
|
||||
raise
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
openerp.auth_oauth = function(instance) {
|
||||
var _t = instance.web._t,
|
||||
_lt = instance.web._lt;
|
||||
var QWeb = instance.web.qweb;
|
||||
|
||||
instance.web.Login.include({
|
||||
|
@ -9,9 +11,11 @@ openerp.auth_oauth = function(instance) {
|
|||
this.$el.on('click', 'a.zocial', this.on_oauth_sign_in);
|
||||
this.oauth_providers = [];
|
||||
if(this.params.oauth_error === 1) {
|
||||
this.do_warn("Sign up error.","Sign up is not allowed on this database.");
|
||||
this.do_warn(_t("Sign up error"),_t("Sign up is not allowed on this database."), true);
|
||||
} else if(this.params.oauth_error === 2) {
|
||||
this.do_warn("Authentication error","");
|
||||
this.do_warn(_t("Authentication error"),_t("Access Denied"), true);
|
||||
} else if(this.params.oauth_error === 3) {
|
||||
this.do_warn(_t("Authentication error"),_t("You do not have access to this database or your invitation has expired. Please ask for an invitation and be sure to follow the link in your invitation email."), true);
|
||||
}
|
||||
return d.done(this.do_oauth_load).fail(function() {
|
||||
self.do_oauth_load([]);
|
||||
|
|
|
@ -23,6 +23,7 @@ import logging
|
|||
import simplejson
|
||||
|
||||
import openerp
|
||||
from openerp.addons.auth_signup.res_users import SignupError
|
||||
from openerp.osv import osv, fields
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
@ -35,7 +36,7 @@ class res_users(osv.Model):
|
|||
try:
|
||||
login = super(res_users, self)._auth_oauth_signin(cr, uid, provider, validation, params, context=context)
|
||||
|
||||
except openerp.exceptions.AccessDenied:
|
||||
except openerp.exceptions.AccessDenied, access_denied_exception:
|
||||
if context and context.get('no_user_creation'):
|
||||
return None
|
||||
state = simplejson.loads(params['state'])
|
||||
|
@ -52,6 +53,8 @@ class res_users(osv.Model):
|
|||
'oauth_access_token': params['access_token'],
|
||||
'active': True,
|
||||
}
|
||||
_, login, _ = self.signup(cr, uid, values, token, context=context)
|
||||
|
||||
try:
|
||||
_, login, _ = self.signup(cr, uid, values, token, context=context)
|
||||
except SignupError:
|
||||
raise access_denied_exception
|
||||
return login
|
||||
|
|
|
@ -26,7 +26,7 @@ from urlparse import urljoin
|
|||
from openerp.addons.base.ir.ir_mail_server import MailDeliveryException
|
||||
from openerp.osv import osv, fields
|
||||
from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from openerp.tools.safe_eval import safe_eval
|
||||
from ast import literal_eval
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class SignupError(Exception):
|
||||
|
@ -221,12 +221,12 @@ class res_users(osv.Model):
|
|||
def _signup_create_user(self, cr, uid, values, context=None):
|
||||
""" create a new user from the template user """
|
||||
ir_config_parameter = self.pool.get('ir.config_parameter')
|
||||
template_user_id = safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.template_user_id', 'False'))
|
||||
template_user_id = literal_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.template_user_id', 'False'))
|
||||
assert template_user_id and self.exists(cr, uid, template_user_id, context=context), 'Signup: invalid template user'
|
||||
|
||||
# check that uninvited users may sign up
|
||||
if 'partner_id' not in values:
|
||||
if not safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')):
|
||||
if not literal_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')):
|
||||
raise SignupError('Signup is not allowed for uninvited users')
|
||||
|
||||
assert values.get('login'), "Signup: no login given for new user"
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
{
|
||||
'name': 'Calendar',
|
||||
'version': '1.0',
|
||||
'depends': ['base', 'base_status', 'mail', 'base_action_rule'],
|
||||
'depends': ['base', 'mail', 'base_action_rule'],
|
||||
'summary': 'Personal & Shared Calendar',
|
||||
'description': """
|
||||
This is a full-featured calendar system.
|
||||
|
|
|
@ -1173,8 +1173,8 @@ rule or repeating pattern of time to exclude from the recurring rule."),
|
|||
context = {}
|
||||
|
||||
result = []
|
||||
for data in super(calendar_event, self).read(cr, uid, select, ['rrule', 'exdate', 'exrule', 'date'], context=context):
|
||||
if not data['rrule']:
|
||||
for data in super(calendar_event, self).read(cr, uid, select, ['rrule', 'recurrency', 'exdate', 'exrule', 'date'], context=context):
|
||||
if not data['recurrency'] or not data['rrule']:
|
||||
result.append(data['id'])
|
||||
continue
|
||||
event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
|
||||
|
|
|
@ -25,7 +25,6 @@ from openerp.osv import fields, osv
|
|||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||
from openerp.tools.translate import _
|
||||
from base_calendar import get_real_ids, base_calendar_id2real_id
|
||||
from openerp.addons.base_status.base_state import base_state
|
||||
#
|
||||
# crm.meeting is defined here so that it may be used by modules other than crm,
|
||||
# without forcing the installation of crm.
|
||||
|
@ -38,14 +37,13 @@ class crm_meeting_type(osv.Model):
|
|||
'name': fields.char('Name', size=64, required=True, translate=True),
|
||||
}
|
||||
|
||||
class crm_meeting(base_state, osv.Model):
|
||||
class crm_meeting(osv.Model):
|
||||
""" Model for CRM meetings """
|
||||
_name = 'crm.meeting'
|
||||
_description = "Meeting"
|
||||
_order = "id desc"
|
||||
_inherit = ["calendar.event", "mail.thread", "ir.needaction_mixin"]
|
||||
_columns = {
|
||||
# base_state required fields
|
||||
'create_date': fields.datetime('Creation Date', readonly=True),
|
||||
'write_date': fields.datetime('Write Date', readonly=True),
|
||||
'date_open': fields.datetime('Confirmed', readonly=True),
|
||||
|
@ -79,6 +77,12 @@ class crm_meeting(base_state, osv.Model):
|
|||
default['attendee_ids'] = False
|
||||
return super(crm_meeting, self).copy(cr, uid, id, default, context)
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
""" Override to add case management: open/close dates """
|
||||
if values.get('state')and values.get('state') == 'open':
|
||||
values['date_open'] = fields.datetime.now()
|
||||
return super(crm_meeting, self).write(cr, uid, ids, values, context=context)
|
||||
|
||||
def onchange_partner_ids(self, cr, uid, ids, value, context=None):
|
||||
""" The basic purpose of this method is to check that destination partners
|
||||
effectively have email addresses. Otherwise a warning is thrown.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#########################################################################
|
||||
#
|
||||
# Copyright (c) 2003-2004 Danny Brewer d29583@groovegarden.com
|
||||
# Copyright (C) 2004-2010 OpenERP SA (<http://openerp.com>).
|
||||
# Copyright (C) 2004-2013 OpenERP SA (<http://openerp.com>).
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -78,7 +78,7 @@ class ExportToRML( unohelper.Base, XJobExecutor ):
|
|||
|
||||
res = self.sock.execute(database, uid, self.password, 'ir.actions.report.xml', 'sxwtorml',base64.encodestring(data),file_type)
|
||||
if res['report_rml_content']:
|
||||
write_data_to_file( get_absolute_file_path( filename[7:] ), res['report_rml_content'] )
|
||||
write_data_to_file(get_absolute_file_path(filename), res['report_rml_content'])
|
||||
except Exception,e:
|
||||
import traceback,sys
|
||||
info = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
|
||||
|
@ -99,8 +99,12 @@ class ExportToRML( unohelper.Base, XJobExecutor ):
|
|||
|
||||
oFileDialog.setDefaultName(f_path )
|
||||
|
||||
sPath = oFileDialog.execute() == 1 and oFileDialog.Files[0] or None
|
||||
sPath = oFileDialog.execute() == 1 and oFileDialog.Files[0] or ''
|
||||
oFileDialog.dispose()
|
||||
sPath = sPath[7:]
|
||||
if sPath.startswith('localhost/'):
|
||||
slash = int(os.name == 'nt')
|
||||
sPath = sPath[9 + slash:]
|
||||
return sPath
|
||||
|
||||
if __name__<>"package" and __name__=="__main__":
|
||||
|
|
Binary file not shown.
|
@ -1,201 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-today OpenERP SA (<http://www.openerp.com>)
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import fields, osv
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class base_state(object):
|
||||
""" Base utility mixin class for objects willing to manage their state.
|
||||
Object subclassing this class should define the following colums:
|
||||
- ``date_open`` (datetime field)
|
||||
- ``date_closed`` (datetime field)
|
||||
- ``user_id`` (many2one to res.users)
|
||||
- ``partner_id`` (many2one to res.partner)
|
||||
- ``email_from`` (char field)
|
||||
- ``state`` (selection field)
|
||||
"""
|
||||
|
||||
def _get_default_partner(self, cr, uid, context=None):
|
||||
""" Gives id of partner for current user
|
||||
:param context: if portal not in context returns False
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
if not context or not context.get('portal'):
|
||||
return False
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||
if hasattr(user, 'partner_address_id') and user.partner_address_id:
|
||||
return user.partner_address_id
|
||||
return user.company_id.partner_id.id
|
||||
|
||||
def _get_default_email(self, cr, uid, context=None):
|
||||
""" Gives default email address for current user
|
||||
:param context: if portal not in context returns False
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
if not context or not context.get('portal'):
|
||||
return False
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||
return user.email
|
||||
|
||||
def _get_default_user(self, cr, uid, context=None):
|
||||
""" Gives current user id
|
||||
:param context: if portal not in context returns False
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
if not context or not context.get('portal'):
|
||||
return False
|
||||
return uid
|
||||
|
||||
def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
|
||||
""" This function returns value of partner email based on Partner Address
|
||||
:param add: Id of Partner's address
|
||||
:param email: Partner's email ID
|
||||
"""
|
||||
data = {'value': {'email_from': False, 'phone':False}}
|
||||
if add:
|
||||
address = self.pool.get('res.partner').browse(cr, uid, add)
|
||||
data['value'] = {'email_from': address and address.email or False ,
|
||||
'phone': address and address.phone or False}
|
||||
if 'phone' not in self._columns:
|
||||
del data['value']['phone']
|
||||
return data
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, part, email=False):
|
||||
""" This function returns value of partner address based on partner
|
||||
:param part: Partner's id
|
||||
:param email: Partner's email ID
|
||||
"""
|
||||
data={}
|
||||
if part:
|
||||
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact'])
|
||||
data.update(self.onchange_partner_address_id(cr, uid, ids, addr['contact'])['value'])
|
||||
return {'value': data}
|
||||
|
||||
def case_escalate(self, cr, uid, ids, context=None):
|
||||
""" Escalates case to parent level """
|
||||
cases = self.browse(cr, uid, ids, context=context)
|
||||
cases[0].state # fill browse record cache, for _action having old and new values
|
||||
data = {'active': True}
|
||||
for case in cases:
|
||||
parent_id = case.section_id.parent_id
|
||||
if parent_id:
|
||||
data['section_id'] = parent_id.id
|
||||
if parent_id.change_responsible and parent_id.user_id:
|
||||
data['user_id'] = parent_id.user_id.id
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'), _('You can not escalate, you are already at the top level regarding your sales-team category.'))
|
||||
self.write(cr, uid, [case.id], data, context=context)
|
||||
case.case_escalate_send_note(parent_id, context=context)
|
||||
return True
|
||||
|
||||
def case_open(self, cr, uid, ids, context=None):
|
||||
""" Opens case """
|
||||
cases = self.browse(cr, uid, ids, context=context)
|
||||
for case in cases:
|
||||
values = {'active': True}
|
||||
if case.state == 'draft':
|
||||
values['date_open'] = fields.datetime.now()
|
||||
if not case.user_id:
|
||||
values['user_id'] = uid
|
||||
self.case_set(cr, uid, [case.id], 'open', values, context=context)
|
||||
return True
|
||||
|
||||
def case_close(self, cr, uid, ids, context=None):
|
||||
""" Closes case """
|
||||
return self.case_set(cr, uid, ids, 'done', {'date_closed': fields.datetime.now()}, context=context)
|
||||
|
||||
def case_cancel(self, cr, uid, ids, context=None):
|
||||
""" Cancels case """
|
||||
return self.case_set(cr, uid, ids, 'cancel', {'active': True}, context=context)
|
||||
|
||||
def case_pending(self, cr, uid, ids, context=None):
|
||||
""" Sets case as pending """
|
||||
return self.case_set(cr, uid, ids, 'pending', {'active': True}, context=context)
|
||||
|
||||
def case_reset(self, cr, uid, ids, context=None):
|
||||
""" Resets case as draft """
|
||||
return self.case_set(cr, uid, ids, 'draft', {'active': True}, context=context)
|
||||
|
||||
def case_set(self, cr, uid, ids, state_name, update_values=None, context=None):
|
||||
""" Generic method for setting case. This methods wraps the update
|
||||
of the record, as well as call to _action and browse_record
|
||||
case setting to fill the cache.
|
||||
|
||||
:params: state_name: the new value of the state, such as
|
||||
'draft' or 'close'.
|
||||
:params: update_values: values that will be added with the state
|
||||
update when writing values to the record.
|
||||
"""
|
||||
cases = self.browse(cr, uid, ids, context=context)
|
||||
cases[0].state # fill browse record cache, for _action having old and new values
|
||||
if update_values is None:
|
||||
update_values = {}
|
||||
update_values['state'] = state_name
|
||||
return self.write(cr, uid, ids, update_values, context=context)
|
||||
|
||||
# ******************************
|
||||
# Notifications
|
||||
# ******************************
|
||||
|
||||
def case_get_note_msg_prefix(self, cr, uid, id, context=None):
|
||||
return ''
|
||||
|
||||
def case_open_send_note(self, cr, uid, ids, context=None):
|
||||
for id in ids:
|
||||
msg = _('%s has been <b>opened</b>.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
||||
|
||||
def case_escalate_send_note(self, cr, uid, ids, new_section=None, context=None):
|
||||
for id in ids:
|
||||
if new_section:
|
||||
msg = '%s has been <b>escalated</b> to <b>%s</b>.' % (self.case_get_note_msg_prefix(cr, uid, id, context=context), new_section.name)
|
||||
else:
|
||||
msg = '%s has been <b>escalated</b>.' % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
||||
|
||||
def case_close_send_note(self, cr, uid, ids, context=None):
|
||||
for id in ids:
|
||||
msg = _('%s has been <b>closed</b>.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
||||
|
||||
def case_cancel_send_note(self, cr, uid, ids, context=None):
|
||||
for id in ids:
|
||||
msg = _('%s has been <b>canceled</b>.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
||||
|
||||
def case_pending_send_note(self, cr, uid, ids, context=None):
|
||||
for id in ids:
|
||||
msg = _('%s is now <b>pending</b>.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
||||
|
||||
def case_reset_send_note(self, cr, uid, ids, context=None):
|
||||
for id in ids:
|
||||
msg = _('%s has been <b>renewed</b>.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context))
|
||||
self.message_post(cr, uid, [id], body=msg, context=context)
|
||||
return True
|
|
@ -1,76 +0,0 @@
|
|||
# Arabic 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-01 18:05+0000\n"
|
||||
"Last-Translator: gehad shaat <gehad.shaath@gmail.com>\n"
|
||||
"Language-Team: Arabic <ar@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "خطأ !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "خطأ!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr ""
|
|
@ -1,72 +0,0 @@
|
|||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * base_status
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 7.0alpha\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-21 17:05+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: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "You can not escalate, you are already at the top level regarding your sales-team category."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr ""
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
# Bosnian 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-08-08 22:20+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bosnian <bs@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-09 05:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Greška !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s je bio <b>otvoren</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s je bio <b>obnovljen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Greška!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Ne možete eskalirati, već ste na najvišem nivou u odnosu na kategoriju "
|
||||
"prodajnog tima."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s je sad <b>Na čekanju</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s je bio <b>otkazan</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Već ste na najvišem nivou vaše kategorije prodajnog tima.\n"
|
||||
"Zato ne možete dalje eskalirati."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s je bio <b>zatvoren</b>."
|
|
@ -1,76 +0,0 @@
|
|||
# Czech 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-03-30 12:43+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Czech <cs@li.org>\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-31 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16546)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr ""
|
|
@ -1,81 +0,0 @@
|
|||
# German 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-08 13:50+0000\n"
|
||||
"Last-Translator: Thorsten Vocks (OpenBig.org) <thorsten.vocks@big-"
|
||||
"consulting.net>\n"
|
||||
"Language-Team: German <de@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Fehler !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s wurde <b>eröffnet</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s wurde <b>erneuert</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Fehler !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Keine weitere Eskalation möglich, da Sie bereits die obersten Ebene erreicht "
|
||||
"haben."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s wurde geändert auf <b>Wiedervorlage</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s wurde <b>abgebrochen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Keine weitere Eskalation möglich, da Sie bereits die obersten Ebene erreicht "
|
||||
"haben."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s wurde <b>beendet</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# English (United Kingdom) 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-02-06 15:07+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: English (United Kingdom) <en_GB@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Error !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s has been <b>opened</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s has been <b>renewed</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Error!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s is now <b>pending</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s has been <b>canceled</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s has been <b>closed</b>."
|
|
@ -1,79 +0,0 @@
|
|||
# Spanish 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-10 22:19+0000\n"
|
||||
"Last-Translator: Ana Juaristi Olalde <ajuaristio@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "¡ Error !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s ha sido <b>abierto</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s ha sido <b>renovado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "¡Error!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"No puede escalar, usted está en la categoría más alta de su equipo de ventas"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s está ahora <b>pendiente</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s ha sido <b>cancelado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Está en el nivel más alto de la categoría de su equipo de ventas.\n"
|
||||
"Por lo tanto no puede escalar más allá."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s ha sido <b>cerrado</b>."
|
|
@ -1,81 +0,0 @@
|
|||
# French 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-05 09:30+0000\n"
|
||||
"Last-Translator: Numérigraphe <Unknown>\n"
|
||||
"Language-Team: French <fr@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Erreur !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s a été <b>ouvert(e)</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s a été <b>renouvelé(e)</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Erreur !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas demander d'escalade : vous êtes déjà au plus haut niveau "
|
||||
"possible dans votre catégorie d'équipes de ventes."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s est maintenant <b>en attente</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s a été <b>annulé(e)</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Vous êtes déjà au plus haut niveau possible dans votre catégorie d'équipes "
|
||||
"de ventes.\n"
|
||||
"Par conséquent vous ne pouvez pas demander une escalade au niveau supérieur."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s a été <b>fermé(e)</b>."
|
|
@ -1,78 +0,0 @@
|
|||
# Croatian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-09 19:46+0000\n"
|
||||
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
|
||||
"Language-Team: Croatian <hr@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Greška !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s je <b>otvoren</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s je <b>obnovljen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Greška!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "Ne možete eskaliarati. Vi ste na vrhu hijerarhije prodajnog tima."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s je sada <b>na čekanju</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s je <b>otkazan</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Vi ste na vrhu hijerarhije prodajnog tima.\n"
|
||||
"Stoga ne možete dalje eskalirati."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s je <b>zatvoren</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# Hungarian 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-03-14 10:26+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Hungarian <hu@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Hiba!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s meg lett <b>nyitva</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s meg lett <b>újítva</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Hiba!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Nem tud feljebb lépni, már az értékesítési csoportját illetően a legmagasabb "
|
||||
"fokon áll."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s ez nem <b>elintézetlen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s ez <b>visszavont</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Már az értékesítési csoportjának a legmagasabb szintjén áll.\n"
|
||||
"Ezért nem tud tovább feljebb lépni."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s le lett <b>Zárva</b>."
|
|
@ -1,77 +0,0 @@
|
|||
# Indonesian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-17 00:41+0000\n"
|
||||
"Last-Translator: Riza Kurniawan <rizabisnis@gmail.com>\n"
|
||||
"Language-Team: Indonesian <id@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Ada Kesalahan !!!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s sedang <b>dibuka</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s sedang <b>diperbaharui</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Ada Kesalahan !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Tidak bisa ditingkatkan, anda pada tingkat tertinggi bersama tim sales anda."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s saat ini <b>ditunda</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s sedang = <b>dibatalkan</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s sedang = <b>ditutup</b>."
|
|
@ -1,78 +0,0 @@
|
|||
# Italian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-13 19:22+0000\n"
|
||||
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
|
||||
"Language-Team: Italian <it@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Errore !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s è stato <b>aperto</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s è stato <b>rinnovato</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Errore!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "Impossibile scalare, si è già al livello massimo del team vendite."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s è ora <b>in attesa</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s è stato <b>annullato</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Si è già al massimo livello del team vendita.\n"
|
||||
"Quindi non è possibile scalare ulteriormente."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s è stato <b>chiuso</b>."
|
|
@ -1,76 +0,0 @@
|
|||
# Lithuanian 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-04-29 15:17+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Lithuanian <lt@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-30 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 16580)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr ""
|
|
@ -1,80 +0,0 @@
|
|||
# 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-02-21 13:28+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Macedonian <mk@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Грешка !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s е <b>отворен</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s е <b>обновен</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Грешка!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Неможе да ескалирате, веќе сте на највисокото ниво со оглед на категоријата "
|
||||
"на вашиот продажбен тим."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s е <b>во исчекување</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s е <b>откажан</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Веќе сте на највисокото ниво на вашиот продажбен тим.\n"
|
||||
"Значи понатамошно ескалирање не е можно."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s е <b>затворен</b>."
|
|
@ -1,78 +0,0 @@
|
|||
# Mongolian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-27 16:26+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Mongolian <mn@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Алдаа !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s <b>нээгдлээ</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s <b>шинэчлэгдлээ</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Алдаа!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "Томруулах боломжгүй. Учир нь та багийнхаа хамгийн дээд түвшин байна."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s одоо <b>хүлээгдэж буй</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s <b>цуцлагдлаа</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Та борлуулалтын багийн ангилалынхаа хамгийн дээд түвшин байна.\n"
|
||||
"Тиймээс та дахин томруулах боломжгүй."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s <b>хаагдлаа</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# Dutch 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-20 14:05+0000\n"
|
||||
"Last-Translator: Erwin van der Ploeg (Endian Solutions) <Unknown>\n"
|
||||
"Language-Team: Dutch <nl@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Fout!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s is <b>geopend</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s is <b>vernieuw</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Fout!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Het is niet mogelijk om verder te escaleren. U bent al op het hoogste niveau "
|
||||
"van uw verkoopteam categorieën."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s is nu <b>in afwachting</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s is <b>geannuleerd</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"U bent al op het hoogste niveau van het verkoopteam.\n"
|
||||
"Het is zodoende niet mogelijk om verder te escaleren."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s is <b>gesloten</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# Dutch (Belgium) 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-04-15 16:40+0000\n"
|
||||
"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
|
||||
"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-04-16 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16564)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Fout"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s is <b>geopend</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s is <b>vernieuwd</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Fout"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"U kunt niet escaleren; u heeft het hoogste niveau in de verkoopteams al "
|
||||
"bereikt."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s is <b>wachtend</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s is <b>geannuleerd</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"U bent al op het hoogste niveau van uw verkoopteam.\n"
|
||||
"U kunt dus niet verder escaleren."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s is <b>gesloten</b>."
|
|
@ -1,79 +0,0 @@
|
|||
# Polish 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-16 11:12+0000\n"
|
||||
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.pl>\n"
|
||||
"Language-Team: Polish <pl@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Błąd !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s zostało <b>otwarte</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s zostało <b>odnowione</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Błąd!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Nie możesz przekazywać nadrzędnym, bo jesteś na górze w kategorii zespołu."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s <b>oczekuje</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s zostało <b>anulowane</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Jesteś na najwyższym poziomie kategorii zespołów.\n"
|
||||
"Więc nie możesz przekazywać wyżej."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s zostało <b>zamknięte</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# Portuguese 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-13 16:39+0000\n"
|
||||
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
|
||||
"Language-Team: Portuguese <pt@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Erro!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s foi <b>aberto</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s foi <b>renovado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Erro!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Não pode subir de grau porque já está no topo no que concerne à categoria da "
|
||||
"sua equipa de vendas."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s agora está <b>pendente</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s foi <b>cancelado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Já está no topo no que concerne à categoria da sua equipa de vendas.\n"
|
||||
"Não pode subir mais."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s foi <b>fechado</b>."
|
|
@ -1,81 +0,0 @@
|
|||
# Brazilian Portuguese 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-16 23:52+0000\n"
|
||||
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
|
||||
"<webmaster@guaru.net>\n"
|
||||
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Erro!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s foi <b>aberta</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s foi <b>renovado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Erro!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Você não pode escalar, você já está no nível mais alto em relação a sua "
|
||||
"categoria de equipe de vendas."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s está agora <b>pendente</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s foi <b>cancelado</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Você já está no nível mais alto de sua categoria de equipe de vendas.\n"
|
||||
"Portanto, você não pode escalar além disso."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s foi <b>fechado</b>."
|
|
@ -1,81 +0,0 @@
|
|||
# Romanian 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-01-23 18:23+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Romanian <ro@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Eroare !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s a fost <b>deschis</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s a fost <b>reinnoit</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Eroare!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Nu puteti avansa, sunteti deja la cel mai inalt nivel in ceea ce priveste "
|
||||
"categoria echipei d-voastra de vanzari."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s este acum <b>in asteptare</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s a fost <b>anulat</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Sunteti deja la cel mai inalt nivel al categoriei echipei dumneavoastra de "
|
||||
"vanzari.\n"
|
||||
"Prin urmare nu mai puteti avansa."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s a fost <b>inchis</b>."
|
|
@ -1,80 +0,0 @@
|
|||
# Russian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-06-05 07:16+0000\n"
|
||||
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
|
||||
"Language-Team: Russian <ru@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-06-06 05:21+0000\n"
|
||||
"X-Generator: Launchpad (build 16667)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Ошибка !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s было <b>открыто</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s было <b>обновлено</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Ошибка!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Вы не можете обострить, вы уже на высшем уровне относительно вашей категории "
|
||||
"отдела продаж."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s сейчас <b>в ожидании</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s было <b>отменено</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Вы уже на высшем уровне категории вашей команды продаж.\n"
|
||||
"Поэтому вы не можете обострить."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s было <b>закрыто</b>."
|
|
@ -1,76 +0,0 @@
|
|||
# Slovenian 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-12-29 12:12+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Slovenian <sl@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Napaka!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s je bil <b>od</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s je <b>obnovljen</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Napaka!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "Ste že na vrhu hierarhije vaših skupin prodaje."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s je na <b>čakanju</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s je <b>preklican</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr "Ste že na vrhu hierarhije vaših skupin prodaje."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s je <b>zaprt</b>."
|
|
@ -1,79 +0,0 @@
|
|||
# Swedish 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-07-08 15:10+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Swedish <sv@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-07-09 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16696)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Fel !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s har <b>öppnats</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s har <b>förnyats</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Fel!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Du kan inte eskalera längre, du har nått toppen för denna säljlags-kategori."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s är nu <b>pågående</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s har <b>avbrutits</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Du har nått översta nivån för din säljlagskategori.\n"
|
||||
"Det går därför inte att eskalera ytterligare."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s har <b>stängts</b>."
|
|
@ -1,79 +0,0 @@
|
|||
# Turkish 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-02-03 12:04+0000\n"
|
||||
"Last-Translator: Ahmet Altınışık <Unknown>\n"
|
||||
"Language-Team: Turkish <tr@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "Hata !"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s <b>açıldı</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s <b>yenilendi</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "Hata!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr ""
|
||||
"Yükseltemezsiniz, satış-takımı kategorisine göre zaten en üst düzeydesiniz."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s şimdi <b>bekliyor</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s <b>iptal edildi</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"Zaten satış takımı kategorisinin en üst düzeyindesiniz.\n"
|
||||
"Yani daha fazla yükseltemezsiniz."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s <b>kapatıldı</b>."
|
|
@ -1,78 +0,0 @@
|
|||
# Chinese (Simplified) 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 <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2012-11-28 07:43+0000\n"
|
||||
"Last-Translator: 盈通 ccdos <ccdos@163.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "错误!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s 已经被 <b>打开</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s 已经被 <b>更新</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "错误!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "不能上报,你已经在您销售团队类别中的最高级了。"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s 现在 <b>待定</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s 已经被 <b>取消</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr ""
|
||||
"你已经在您销售团队类别中的最高级了。\n"
|
||||
"因此,你不能再上报了。"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s 已经被 <b>关闭</b>."
|
|
@ -1,76 +0,0 @@
|
|||
# Chinese (Traditional) 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-01-30 14:21+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Chinese (Traditional) <zh_TW@li.org>\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-16 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16532)\n"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid "Error !"
|
||||
msgstr "錯誤!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:166
|
||||
#, python-format
|
||||
msgid "%s has been <b>opened</b>."
|
||||
msgstr "%s 已經 <b>開立</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:199
|
||||
#, python-format
|
||||
msgid "%s has been <b>renewed</b>."
|
||||
msgstr "%s 已經 <b>更新</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid "Error!"
|
||||
msgstr "錯誤!"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:107
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can not escalate, you are already at the top level regarding your sales-"
|
||||
"team category."
|
||||
msgstr "您不能升級,您已經是您銷售團隊類別中的最高等級了。"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:193
|
||||
#, python-format
|
||||
msgid "%s is now <b>pending</b>."
|
||||
msgstr "%s 現在是 <b>暫停</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:187
|
||||
#, python-format
|
||||
msgid "%s has been <b>canceled</b>."
|
||||
msgstr "%s 已經 <b>取消</b>."
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_stage.py:210
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You are already at the top level of your sales-team category.\n"
|
||||
"Therefore you cannot escalate furthermore."
|
||||
msgstr "您已經是您銷售團隊類別中的最高等級了。因此您不能再升級了。"
|
||||
|
||||
#. module: base_status
|
||||
#: code:addons/base_status/base_state.py:181
|
||||
#, python-format
|
||||
msgid "%s has been <b>closed</b>."
|
||||
msgstr "%s 已經 <b>關閉</b>."
|
|
@ -381,6 +381,10 @@ instance.board.AddToDashboard = instance.web.search.Input.extend({
|
|||
_.each(data.contexts, context.add, context);
|
||||
_.each(data.domains, domain.add, domain);
|
||||
|
||||
context.add({
|
||||
group_by: instance.web.pyeval.eval('groupbys', data.groupbys || [])
|
||||
});
|
||||
|
||||
var c = instance.web.pyeval.eval('context', context);
|
||||
for(var k in c) {
|
||||
if (c.hasOwnProperty(k) && /^search_default_/.test(k)) {
|
||||
|
|
|
@ -51,7 +51,6 @@ Dashboard for CRM will include:
|
|||
'depends': [
|
||||
'base_action_rule',
|
||||
'base_setup',
|
||||
'base_status',
|
||||
'process',
|
||||
'mail',
|
||||
'email_template',
|
||||
|
|
|
@ -830,9 +830,9 @@ class crm_lead(format_address, osv.osv):
|
|||
'priority': lead.priority,
|
||||
}
|
||||
new_id = phonecall.create(cr, uid, vals, context=context)
|
||||
phonecall.case_open(cr, uid, [new_id], context=context)
|
||||
phonecall.write(cr, uid, [new_id], {'state': 'open'}, context=context)
|
||||
if action == 'log':
|
||||
phonecall.case_close(cr, uid, [new_id], context=context)
|
||||
phonecall.write(cr, uid, [new_id], {'state': 'done'}, context=context)
|
||||
phonecall_dict[lead.id] = new_id
|
||||
self.schedule_phonecall_send_note(cr, uid, [lead.id], new_id, action, context=context)
|
||||
return phonecall_dict
|
||||
|
@ -955,10 +955,8 @@ class crm_lead(format_address, osv.osv):
|
|||
"""
|
||||
if custom_values is None:
|
||||
custom_values = {}
|
||||
desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
|
||||
defaults = {
|
||||
'name': msg.get('subject') or _("No Subject"),
|
||||
'description': desc,
|
||||
'email_from': msg.get('from'),
|
||||
'email_cc': msg.get('cc'),
|
||||
'partner_id': msg.get('author_id', False),
|
||||
|
|
|
@ -19,21 +19,19 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.addons.base_status.base_state import base_state
|
||||
import crm
|
||||
from datetime import datetime
|
||||
from openerp.osv import fields, osv
|
||||
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class crm_phonecall(base_state, osv.osv):
|
||||
class crm_phonecall(osv.osv):
|
||||
""" Model for CRM phonecalls """
|
||||
_name = "crm.phonecall"
|
||||
_description = "Phonecall"
|
||||
_order = "id desc"
|
||||
_inherit = ['mail.thread']
|
||||
_columns = {
|
||||
# base_state required fields
|
||||
'date_action_last': fields.datetime('Last Action', readonly=1),
|
||||
'date_action_next': fields.datetime('Next Action', readonly=1),
|
||||
'create_date': fields.datetime('Creation Date' , readonly=True),
|
||||
|
@ -43,22 +41,21 @@ class crm_phonecall(base_state, osv.osv):
|
|||
'partner_id': fields.many2one('res.partner', 'Contact'),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
'description': fields.text('Description'),
|
||||
'state': fields.selection([ ('draft', 'Draft'),
|
||||
('open', 'Confirmed'),
|
||||
('pending', 'Not Held'),
|
||||
('cancel', 'Cancelled'),
|
||||
('done', 'Held'),],
|
||||
string='Status', size=16, readonly=True, track_visibility='onchange',
|
||||
help='The status is set to \'Todo\', when a case is created.\
|
||||
If the case is in progress the status is set to \'Open\'.\
|
||||
When the call is over, the status is set to \'Held\'.\
|
||||
If the call needs to be done then the status is set to \'Not Held\'.'),
|
||||
'state': fields.selection(
|
||||
[('open', 'Confirmed'),
|
||||
('cancel', 'Cancelled'),
|
||||
('pending', 'Pending'),
|
||||
('done', 'Held')
|
||||
], string='Status', readonly=True, track_visibility='onchange',
|
||||
help='The status is set to Confirmed, when a case is created.\n'
|
||||
'When the call is over, the status is set to Held.\n'
|
||||
'If the callis not applicable anymore, the status can be set to Cancelled.'),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
'date_open': fields.datetime('Opened', readonly=True),
|
||||
# phonecall fields
|
||||
'name': fields.char('Call Summary', size=64, required=True),
|
||||
'active': fields.boolean('Active', required=False),
|
||||
'duration': fields.float('Duration', help="Duration in Minutes"),
|
||||
'duration': fields.float('Duration', help='Duration in minutes and seconds.'),
|
||||
'categ_id': fields.many2one('crm.case.categ', 'Category', \
|
||||
domain="['|',('section_id','=',section_id),('section_id','=',False),\
|
||||
('object_id.model', '=', 'crm.phonecall')]"),
|
||||
|
@ -71,7 +68,7 @@ class crm_phonecall(base_state, osv.osv):
|
|||
}
|
||||
|
||||
def _get_default_state(self, cr, uid, context=None):
|
||||
if context and context.get('default_state', False):
|
||||
if context and context.get('default_state'):
|
||||
return context.get('default_state')
|
||||
return 'open'
|
||||
|
||||
|
@ -79,29 +76,38 @@ class crm_phonecall(base_state, osv.osv):
|
|||
'date': fields.datetime.now,
|
||||
'priority': crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'state': _get_default_state,
|
||||
'user_id': lambda self,cr,uid,ctx: uid,
|
||||
'user_id': lambda self, cr, uid, ctx: uid,
|
||||
'active': 1
|
||||
}
|
||||
|
||||
def case_close(self, cr, uid, ids, context=None):
|
||||
""" Overrides close for crm_case for setting duration """
|
||||
res = True
|
||||
for phone in self.browse(cr, uid, ids, context=context):
|
||||
phone_id = phone.id
|
||||
data = {}
|
||||
if phone.duration <=0:
|
||||
duration = datetime.now() - datetime.strptime(phone.date, DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
data['duration'] = duration.seconds/float(60)
|
||||
res = super(crm_phonecall, self).case_close(cr, uid, [phone_id], context=context)
|
||||
self.write(cr, uid, [phone_id], data, context=context)
|
||||
return res
|
||||
def on_change_partner_id(self, cr, uid, ids, partner_id, context=None):
|
||||
values = {}
|
||||
if partner_id:
|
||||
partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
|
||||
values = {
|
||||
'partner_phone': partner.phone,
|
||||
'partner_mobile': partner.mobile,
|
||||
}
|
||||
return {'value': values}
|
||||
|
||||
def case_reset(self, cr, uid, ids, context=None):
|
||||
"""Resets case as Todo
|
||||
"""
|
||||
res = super(crm_phonecall, self).case_reset(cr, uid, ids, context)
|
||||
self.write(cr, uid, ids, {'duration': 0.0, 'state':'open'}, context=context)
|
||||
return res
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
""" Override to add case management: open/close dates """
|
||||
if values.get('state'):
|
||||
if values.get('state') == 'done':
|
||||
values['date_closed'] = fields.datetime.now()
|
||||
self.compute_duration(cr, uid, ids, context=context)
|
||||
elif values.get('state') == 'open':
|
||||
values['date_open'] = fields.datetime.now()
|
||||
values['duration'] = 0.0
|
||||
return super(crm_phonecall, self).write(cr, uid, ids, values, context=context)
|
||||
|
||||
def compute_duration(self, cr, uid, ids, context=None):
|
||||
for phonecall in self.browse(cr, uid, ids, context=context):
|
||||
if phonecall.duration <= 0:
|
||||
duration = datetime.now() - datetime.strptime(phonecall.date, DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
values = {'duration': duration.seconds/float(60)}
|
||||
self.write(cr, uid, [phonecall.id], values, context=context)
|
||||
return True
|
||||
|
||||
def schedule_another_phonecall(self, cr, uid, ids, schedule_time, call_summary, \
|
||||
user_id=False, section_id=False, categ_id=False, action='schedule', context=None):
|
||||
|
@ -135,7 +141,7 @@ class crm_phonecall(base_state, osv.osv):
|
|||
}
|
||||
new_id = self.create(cr, uid, vals, context=context)
|
||||
if action == 'log':
|
||||
self.case_close(cr, uid, [new_id])
|
||||
self.write(cr, uid, [new_id], {'state': 'done'}, context=context)
|
||||
phonecall_dict[call.id] = new_id
|
||||
return phonecall_dict
|
||||
|
||||
|
@ -243,12 +249,11 @@ class crm_phonecall(base_state, osv.osv):
|
|||
'email_from': default_contact and default_contact.email,
|
||||
})
|
||||
vals = {
|
||||
'partner_id': partner_id,
|
||||
'opportunity_id' : opportunity_id,
|
||||
'partner_id': partner_id,
|
||||
'opportunity_id': opportunity_id,
|
||||
'state': 'done',
|
||||
}
|
||||
self.write(cr, uid, [call.id], vals)
|
||||
self.case_close(cr, uid, [call.id])
|
||||
opportunity.case_open(cr, uid, [opportunity_id])
|
||||
self.write(cr, uid, [call.id], vals, context=context)
|
||||
opportunity_dict[call.id] = opportunity_id
|
||||
return opportunity_dict
|
||||
|
||||
|
|
|
@ -50,14 +50,6 @@
|
|||
<field name="create_date" invisible="1"/>
|
||||
<field name="opportunity_id" invisible="1"/>
|
||||
<field name="state"/>
|
||||
<button name="case_open" string="Confirm" type="object"
|
||||
states="draft,pending" icon="gtk-go-forward"/>
|
||||
<button name="case_close" string="Held" type="object"
|
||||
states="open,pending" icon="gtk-jump-to"/>
|
||||
<button name="case_cancel" string="Cancel" type="object"
|
||||
states="draft,open,pending" icon="gtk-cancel"/>
|
||||
<button name="case_reset" string="Reset to Todo" type="object"
|
||||
states="cancel" icon="gtk-convert"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -69,13 +61,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Phone Call" version="7.0">
|
||||
<header>
|
||||
<button name="case_close" string="Call Done" type="object" class="oe_highlight"
|
||||
states="open,pending"/>
|
||||
<button name="case_reset" string="Reset to Todo" type="object"
|
||||
states="cancel"/>
|
||||
<button name="case_cancel" string="Cancel Call" type="object"
|
||||
states="draft,open,pending"/>
|
||||
<field name="state" widget="statusbar" nolabel="1" statusbar_visible="open,done"/>
|
||||
<field name="state" nolabel="1" widget="statusbar" clickable="True"/>
|
||||
</header>
|
||||
<sheet string="Phone Call">
|
||||
<div class="oe_right">
|
||||
|
@ -102,11 +88,13 @@
|
|||
<group col="4">
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
<field name="duration" widget="float_time"/>
|
||||
<label for="duration"/>
|
||||
<div>
|
||||
<field name="duration" widget="float_time" class="oe_inline" style="vertical-align:baseline"/> <b> min(s)</b>
|
||||
</div>
|
||||
<field name="section_id" colspan="1" widget="selection"
|
||||
groups="base.group_multi_salesteams"/>
|
||||
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
|
||||
<field name="email_from" invisible="1"/> <!--not needed because of the chatter, thus invisible, but must be in the view as it's returned by onchange_partner_id()-->
|
||||
<field name="partner_id" on_change="on_change_partner_id(partner_id)"/>
|
||||
<field name="categ_id" widget="selection"
|
||||
domain="[('object_id.model', '=', 'crm.phonecall')]"/>
|
||||
<field name="partner_mobile"/>
|
||||
|
|
|
@ -8,6 +8,7 @@ Changelog
|
|||
|
||||
- Stage/state update
|
||||
|
||||
- ``crm.phonecall``: removed inheritance towards ``base_state``.
|
||||
- ``crm.lead``: removed ``state`` field. Added ``date_last_stage_update`` field
|
||||
holding last stage_id modification. Updated reports.
|
||||
- ``crm.case.stage``: removed ``state`` field.
|
||||
|
|
|
@ -8,13 +8,13 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||
"PO-Revision-Date: 2013-08-13 02:17+0000\n"
|
||||
"PO-Revision-Date: 2013-08-15 15:46+0000\n"
|
||||
"Last-Translator: Laureano Kloss <Unknown>\n"
|
||||
"Language-Team: Spanish (Argentina) <es_AR@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-13 05:00+0000\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-16 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16723)\n"
|
||||
|
||||
#. module: crm
|
||||
|
@ -540,7 +540,7 @@ msgstr "Crear oportunidad"
|
|||
#. module: crm
|
||||
#: view:sale.config.settings:0
|
||||
msgid "Configure"
|
||||
msgstr ""
|
||||
msgstr "Configurar"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
|
@ -550,19 +550,19 @@ msgstr "Escalar"
|
|||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Mailings"
|
||||
msgstr ""
|
||||
msgstr "Mailings"
|
||||
|
||||
#. module: crm
|
||||
#: model:mail.message.subtype,description:crm.mt_lead_stage
|
||||
msgid "Stage changed"
|
||||
msgstr ""
|
||||
msgstr "Etapa cambiada"
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead.report,creation_month:0
|
||||
#: selection:crm.lead.report,deadline_month:0
|
||||
#: selection:crm.phonecall.report,month:0
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
msgstr "Junio"
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.segmentation,state:0
|
||||
|
@ -572,19 +572,19 @@ msgstr "No está en ejecución"
|
|||
#. module: crm
|
||||
#: field:crm.lead.report,planned_revenue:0
|
||||
msgid "Planned Revenue"
|
||||
msgstr "Ingreso planeado"
|
||||
msgstr "Ingreso previsto"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,planned_revenue:0
|
||||
msgid "Expected Revenue"
|
||||
msgstr ""
|
||||
msgstr "Ingreso esperado"
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead.report,creation_month:0
|
||||
#: selection:crm.lead.report,deadline_month:0
|
||||
#: selection:crm.phonecall.report,month:0
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
msgstr "Octubre"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation:0
|
||||
|
@ -600,23 +600,27 @@ msgid ""
|
|||
" If the call needs to be done then the status is set "
|
||||
"to 'Not Held'."
|
||||
msgstr ""
|
||||
"El estado se establece a 'Para hacer', cuando un caso es creado. Si el caso "
|
||||
"está en progreso el estado se establece a 'Abierto'. Cuando la llamada "
|
||||
"finaliza, el estado se establece a 'Realizada'. si la llamada requiere ser "
|
||||
"realizada entonces el estado se establece a 'No realizada'"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.case.section,message_summary:0
|
||||
#: field:crm.lead,message_summary:0
|
||||
#: field:crm.phonecall,message_summary:0
|
||||
msgid "Summary"
|
||||
msgstr ""
|
||||
msgstr "Resumen"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.merge.opportunity:0
|
||||
msgid "Merge"
|
||||
msgstr ""
|
||||
msgstr "Fusionar"
|
||||
|
||||
#. module: crm
|
||||
#: model:email.template,subject:crm.email_template_opportunity_mail
|
||||
msgid "Opportunity ${object.name | h})"
|
||||
msgstr ""
|
||||
msgstr "Oportunidad ${object.name | h})"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.case.categ:0
|
||||
|
@ -626,7 +630,7 @@ msgstr "Categoría del caso"
|
|||
#. module: crm
|
||||
#: field:crm.lead,partner_address_name:0
|
||||
msgid "Partner Contact Name"
|
||||
msgstr ""
|
||||
msgstr "Nombre del contacto de la empresa"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.actions.server,subject:crm.action_email_reminder_lead
|
||||
|
@ -634,6 +638,8 @@ msgid ""
|
|||
"Reminder on Lead: [[object.id ]] [[object.partner_id and 'of ' "
|
||||
"+object.partner_id.name or '']]"
|
||||
msgstr ""
|
||||
"Recordatorio en iniciativa: [[object.id ]] [[object.partner_id and 'of ' "
|
||||
"+object.partner_id.name or '']]"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation:0
|
||||
|
@ -643,24 +649,24 @@ msgstr "Opciones de perfiles"
|
|||
#. module: crm
|
||||
#: view:crm.phonecall.report:0
|
||||
msgid "#Phone calls"
|
||||
msgstr ""
|
||||
msgstr "#Llamadas telefónicas"
|
||||
|
||||
#. module: crm
|
||||
#: sql_constraint:crm.case.section:0
|
||||
msgid "The code of the sales team must be unique !"
|
||||
msgstr ""
|
||||
msgstr "¡El código del equipo de ventas debe ser único!"
|
||||
|
||||
#. module: crm
|
||||
#: help:crm.lead,email_from:0
|
||||
msgid "Email address of the contact"
|
||||
msgstr ""
|
||||
msgstr "Dirección de correo electrónico del contacto"
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.case.stage,state:0
|
||||
#: view:crm.lead:0
|
||||
#: selection:crm.lead,state:0
|
||||
msgid "In Progress"
|
||||
msgstr ""
|
||||
msgstr "En proceso"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.actions.act_window,help:crm.crm_phonecall_categ_action
|
||||
|
@ -674,6 +680,13 @@ msgid ""
|
|||
" </p>\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p class=\"oe_view_nocontent_create\">\n"
|
||||
"Pulse para añadir una nueva categoría.\n"
|
||||
"</p><p>\n"
|
||||
"Cree categorías específicas de llamadas telefónicas para definir mejor el "
|
||||
"tipo de llamadas registradas en el sistema.\n"
|
||||
"</p>\n"
|
||||
" "
|
||||
|
||||
#. module: crm
|
||||
#: help:crm.case.section,reply_to:0
|
||||
|
@ -681,54 +694,57 @@ msgid ""
|
|||
"The email address put in the 'Reply-To' of all emails sent by OpenERP about "
|
||||
"cases in this sales team"
|
||||
msgstr ""
|
||||
"La dirección de correo electrónico usada como \"Responder a\" de todos los "
|
||||
"correos electrónicos enviados por OpenERP para los casos de este equipo de "
|
||||
"ventas."
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead.report,creation_month:0
|
||||
msgid "Creation Month"
|
||||
msgstr ""
|
||||
msgstr "Mes de creación"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.case.section,resource_calendar_id:0
|
||||
#: model:ir.ui.menu,name:crm.menu_action_resource_calendar_form
|
||||
msgid "Working Time"
|
||||
msgstr ""
|
||||
msgstr "Horario de trabajo"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation.line:0
|
||||
msgid "Partner Segmentation Lines"
|
||||
msgstr "Líneas de Segmentación de Empresa"
|
||||
msgstr "Líneas de segmentación de empresa"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.actions.act_window,name:crm.action_report_crm_phonecall
|
||||
#: model:ir.ui.menu,name:crm.menu_report_crm_phonecalls_tree
|
||||
msgid "Phone Calls Analysis"
|
||||
msgstr ""
|
||||
msgstr "Análisis de llamadas"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Leads Form"
|
||||
msgstr ""
|
||||
msgstr "Formulario de iniciativas"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation:0
|
||||
#: model:ir.model,name:crm.model_crm_segmentation
|
||||
msgid "Partner Segmentation"
|
||||
msgstr "Segmentación de Empresa"
|
||||
msgstr "Segmentación de empresa"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,company_currency:0
|
||||
msgid "Currency"
|
||||
msgstr ""
|
||||
msgstr "Moneda"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead.report,probable_revenue:0
|
||||
msgid "Probable Revenue"
|
||||
msgstr ""
|
||||
msgstr "Ingreso estimado"
|
||||
|
||||
#. module: crm
|
||||
#: help:crm.lead.report,creation_month:0
|
||||
msgid "Creation month"
|
||||
msgstr ""
|
||||
msgstr "Mes de creación"
|
||||
|
||||
#. module: crm
|
||||
#: help:crm.segmentation,name:0
|
||||
|
@ -743,17 +759,17 @@ msgstr "Probabilidad (%)"
|
|||
#. module: crm
|
||||
#: sql_constraint:crm.lead:0
|
||||
msgid "The probability of closing the deal should be between 0% and 100%!"
|
||||
msgstr ""
|
||||
msgstr "¡La probabilidad de cierre debería estar entre 0% y 100%!"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Leads Generation"
|
||||
msgstr ""
|
||||
msgstr "Generación de iniciativas"
|
||||
|
||||
#. module: crm
|
||||
#: view:board.board:0
|
||||
msgid "Statistics Dashboard"
|
||||
msgstr ""
|
||||
msgstr "Tablero de estadísticas"
|
||||
|
||||
#. module: crm
|
||||
#: code:addons/crm/crm_lead.py:878
|
||||
|
@ -767,48 +783,50 @@ msgstr ""
|
|||
#: field:res.partner,opportunity_count:0
|
||||
#, python-format
|
||||
msgid "Opportunity"
|
||||
msgstr ""
|
||||
msgstr "Oportunidad"
|
||||
|
||||
#. module: crm
|
||||
#: model:crm.case.resource.type,name:crm.type_lead7
|
||||
msgid "Television"
|
||||
msgstr ""
|
||||
msgstr "Televisión"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.actions.act_window,name:crm.action_crm_send_mass_convert
|
||||
msgid "Convert to opportunities"
|
||||
msgstr ""
|
||||
msgstr "Convertir a oportunidad"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.model,name:crm.model_sale_config_settings
|
||||
msgid "sale.config.settings"
|
||||
msgstr ""
|
||||
msgstr "sale.config.settings"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.segmentation:0
|
||||
msgid "Stop Process"
|
||||
msgstr "Detener Proceso"
|
||||
msgstr "Detener el proceso"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.case.section,alias_id:0
|
||||
msgid "Alias"
|
||||
msgstr ""
|
||||
msgstr "Alias"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.phonecall:0
|
||||
msgid "Search Phonecalls"
|
||||
msgstr ""
|
||||
msgstr "Buscar llamadas"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead.report:0
|
||||
msgid ""
|
||||
"Leads/Opportunities that are assigned to one of the sale teams I manage"
|
||||
msgstr ""
|
||||
"Iniciativas/Oportunidades que están asignadas a uno de los equipos de venta "
|
||||
"que gestiono"
|
||||
|
||||
#. module: crm
|
||||
#: field:calendar.attendee,categ_id:0
|
||||
msgid "Event Type"
|
||||
msgstr ""
|
||||
msgstr "Tipo de evento"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.segmentation,exclusif:0
|
||||
|
@ -819,12 +837,12 @@ msgstr "Exclusivo"
|
|||
#: code:addons/crm/crm_lead.py:600
|
||||
#, python-format
|
||||
msgid "From %s : %s"
|
||||
msgstr ""
|
||||
msgstr "Desde %s : %s"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead2opportunity.partner.mass:0
|
||||
msgid "Convert to Opportunities"
|
||||
msgstr ""
|
||||
msgstr "Convertir a oportunidad"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead2opportunity.partner:0
|
||||
|
@ -833,13 +851,13 @@ msgstr ""
|
|||
#: view:crm.opportunity2phonecall:0
|
||||
#: view:crm.phonecall2phonecall:0
|
||||
msgid "or"
|
||||
msgstr ""
|
||||
msgstr "o"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead.report,create_date:0
|
||||
#: field:crm.phonecall.report,create_date:0
|
||||
msgid "Create Date"
|
||||
msgstr ""
|
||||
msgstr "Fecha de creación"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,ref2:0
|
||||
|
@ -852,22 +870,24 @@ msgid ""
|
|||
"Link between stages and sales teams. When set, this limitate the current "
|
||||
"stage to the selected sales teams."
|
||||
msgstr ""
|
||||
"Enlace entre etapas y equipos de ventas. Cuando se asigna, las etapas están "
|
||||
"limitadas al equipo de venta seleccionado."
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.case.stage:0
|
||||
#: field:crm.case.stage,requirements:0
|
||||
msgid "Requirements"
|
||||
msgstr ""
|
||||
msgstr "Requisitos"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,zip:0
|
||||
msgid "Zip"
|
||||
msgstr ""
|
||||
msgstr "Código postal"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.phonecall:0
|
||||
msgid "Unassigned Phonecalls"
|
||||
msgstr ""
|
||||
msgstr "Llamadas sin asignar"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
|
@ -880,17 +900,17 @@ msgstr ""
|
|||
#: model:process.node,name:crm.process_node_opportunities0
|
||||
#: view:res.partner:0
|
||||
msgid "Opportunities"
|
||||
msgstr ""
|
||||
msgstr "Oportunidades"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.segmentation,categ_id:0
|
||||
msgid "Partner Category"
|
||||
msgstr "Categoría de partner"
|
||||
msgstr "Categoría de empresa"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,probability:0
|
||||
msgid "Success Rate (%)"
|
||||
msgstr ""
|
||||
msgstr "Tasa de éxito (%)"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.segmentation,sales_purchase_active:0
|
||||
|
@ -900,50 +920,50 @@ msgstr "Utiliza las reglas de compra-ventas"
|
|||
#. module: crm
|
||||
#: model:crm.case.categ,name:crm.categ_phone2
|
||||
msgid "Outbound"
|
||||
msgstr ""
|
||||
msgstr "Saliente"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Mark Won"
|
||||
msgstr ""
|
||||
msgstr "Marcar como ganado"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.filters,name:crm.filter_usa_lead
|
||||
msgid "Leads from USA"
|
||||
msgstr ""
|
||||
msgstr "Iniciativas de EEUU"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Mark Lost"
|
||||
msgstr ""
|
||||
msgstr "Marcar perdido"
|
||||
|
||||
#. module: crm
|
||||
#: model:ir.filters,name:crm.filter_draft_lead
|
||||
msgid "Draft Leads"
|
||||
msgstr ""
|
||||
msgstr "Iniciativas borrador"
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead.report,creation_month:0
|
||||
#: selection:crm.lead.report,deadline_month:0
|
||||
#: selection:crm.phonecall.report,month:0
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
msgstr "Marzo"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
msgid "Send Email"
|
||||
msgstr ""
|
||||
msgstr "Enviar correo electrónico"
|
||||
|
||||
#. module: crm
|
||||
#: code:addons/crm/wizard/crm_lead_to_opportunity.py:89
|
||||
#, python-format
|
||||
msgid "Warning !"
|
||||
msgstr "Atención !"
|
||||
msgstr "Alerta!"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,day_open:0
|
||||
msgid "Days to Open"
|
||||
msgstr ""
|
||||
msgstr "Días para abrir"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead,mobile:0
|
||||
|
|
|
@ -104,7 +104,7 @@
|
|||
-
|
||||
!python {model: crm.meeting}: |
|
||||
context.update({'active_model': 'crm.meeting'})
|
||||
self.case_open(cr, uid, [ref('base_calendar.crm_meeting_4')])
|
||||
self.write(cr, uid, [ref('base_calendar.crm_meeting_4')], {'state': 'open'})
|
||||
-
|
||||
I invite a user for meeting.
|
||||
-
|
||||
|
|
|
@ -10,43 +10,3 @@
|
|||
-
|
||||
!python {model: crm.phonecall}: |
|
||||
self.action_make_meeting(cr, uid, [ref("crm.crm_phonecall_6")])
|
||||
-
|
||||
I set the phone call to not held.
|
||||
-
|
||||
!python {model: crm.phonecall}: |
|
||||
self.case_pending(cr, uid, [ref("crm.crm_phonecall_6")])
|
||||
-
|
||||
I check that the phone call is in 'Not Held' state.
|
||||
-
|
||||
!assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call held.}:
|
||||
- state == "pending"
|
||||
-
|
||||
I cancel the phone call.
|
||||
-
|
||||
!python {model: crm.phonecall}: |
|
||||
self.case_cancel(cr, uid, [ref("crm.crm_phonecall_6")])
|
||||
-
|
||||
I check that the phone call is in 'Cancelled' state.
|
||||
-
|
||||
!assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not cancelled.}:
|
||||
- state == "cancel"
|
||||
-
|
||||
I reset the phone call.
|
||||
-
|
||||
!python {model: crm.phonecall}: |
|
||||
self.case_reset(cr, uid, [ref("crm.crm_phonecall_6")])
|
||||
-
|
||||
I check that the phone call is reset.
|
||||
-
|
||||
!assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not reset.}:
|
||||
- state == "open"
|
||||
-
|
||||
I set phone call to held (done).
|
||||
-
|
||||
!python {model: crm.phonecall}: |
|
||||
self.case_close(cr, uid, [ref("crm.crm_phonecall_6")])
|
||||
-
|
||||
I check that the phone call is in 'Held' state.
|
||||
-
|
||||
!assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not held.}:
|
||||
- state == "done"
|
||||
|
|
|
@ -19,23 +19,14 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.addons.base_status.base_state import base_state
|
||||
from openerp.addons.crm import crm
|
||||
from openerp.osv import fields, osv
|
||||
from openerp import tools
|
||||
from openerp.tools.translate import _
|
||||
from openerp.tools import html2plaintext
|
||||
|
||||
AVAILABLE_STATES = [
|
||||
('draft', 'New'),
|
||||
('cancel', 'Cancelled'),
|
||||
('open', 'In Progress'),
|
||||
('pending', 'Pending'),
|
||||
('done', 'Closed')
|
||||
]
|
||||
|
||||
|
||||
class crm_helpdesk(base_state, osv.osv):
|
||||
class crm_helpdesk(osv.osv):
|
||||
""" Helpdesk Cases """
|
||||
|
||||
_name = "crm.helpdesk"
|
||||
|
@ -73,7 +64,12 @@ class crm_helpdesk(base_state, osv.osv):
|
|||
domain="['|',('section_id','=',False),('section_id','=',section_id),\
|
||||
('object_id.model', '=', 'crm.helpdesk')]"),
|
||||
'duration': fields.float('Duration', states={'done': [('readonly', True)]}),
|
||||
'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True,
|
||||
'state': fields.selection(
|
||||
[('draft', 'New'),
|
||||
('open', 'In Progress'),
|
||||
('pending', 'Pending'),
|
||||
('done', 'Closed'),
|
||||
('cancel', 'Cancelled')], 'Status', size=16, readonly=True, track_visibility='onchange',
|
||||
help='The status is set to \'Draft\', when a case is created.\
|
||||
\nIf the case is in progress the status is set to \'Open\'.\
|
||||
\nWhen the case is over, the status is set to \'Done\'.\
|
||||
|
@ -89,6 +85,38 @@ class crm_helpdesk(base_state, osv.osv):
|
|||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
}
|
||||
|
||||
def on_change_partner_id(self, cr, uid, ids, partner_id, context=None):
|
||||
values = {}
|
||||
if partner_id:
|
||||
partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
|
||||
values = {
|
||||
'email_from': partner.email,
|
||||
}
|
||||
return {'value': values}
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
""" Override to add case management: open/close dates """
|
||||
if values.get('state'):
|
||||
if values.get('state') in ['draft', 'open'] and not values.get('date_open'):
|
||||
values['date_open'] = fields.datetime.now()
|
||||
elif values.get('state') == 'close' and not values.get('date_closed'):
|
||||
values['date_closed'] = fields.datetime.now()
|
||||
return super(crm_helpdesk, self).write(cr, uid, ids, values, context=context)
|
||||
|
||||
def case_escalate(self, cr, uid, ids, context=None):
|
||||
""" Escalates case to parent level """
|
||||
data = {'active': True}
|
||||
for case in self.browse(cr, uid, ids, context=context):
|
||||
if case.section_id and case.section_id.parent_id:
|
||||
parent_id = case.section_id.parent_id
|
||||
data['section_id'] = parent_id.id
|
||||
if parent_id.change_responsible and parent_id.user_id:
|
||||
data['user_id'] = parent_id.user_id.id
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'), _('You can not escalate, you are already at the top level regarding your sales-team category.'))
|
||||
self.write(cr, uid, [case.id], data, context=context)
|
||||
return True
|
||||
|
||||
# -------------------------------------------------------
|
||||
# Mail gateway
|
||||
# -------------------------------------------------------
|
||||
|
|
|
@ -29,21 +29,10 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Helpdesk Support" version="7.0">
|
||||
<header>
|
||||
<button name="case_open" string="Open" type="object" class="oe_highlight"
|
||||
states="draft,pending"/>
|
||||
<button name="case_close" string="Close Case" type="object" states="draft,pending"/>
|
||||
<button name="case_close" string="Close Case" type="object" states="open" class="oe_highlight"/>
|
||||
<button name="case_pending" string="Pending" type="object"
|
||||
states="draft"/>
|
||||
<button name="case_pending" string="Pending" type="object"
|
||||
states="open"/>
|
||||
<button name="case_reset" string="Reset to Draft" type="object"
|
||||
states="cancel,done"/>
|
||||
<button name="case_escalate" string="Escalate" type="object"
|
||||
states="open,draft,pending"/>
|
||||
<button name="case_cancel" string="Cancel Case" type="object"
|
||||
states="draft,open,pending"/>
|
||||
<field name="state" nolabel="1" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}'/>
|
||||
<field name="state" nolabel="1" widget="statusbar" clickable="True"
|
||||
statusbar_colors='{"pending":"blue"}'/>
|
||||
</header>
|
||||
<sheet string="Helpdesk Support">
|
||||
<group col="4" class="oe_header">
|
||||
|
@ -58,8 +47,7 @@
|
|||
<group>
|
||||
<group string="Communication">
|
||||
<field name="partner_id"
|
||||
on_change="onchange_partner_id(partner_id, email_from)"
|
||||
/>
|
||||
on_change="on_change_partner_id(partner_id)"/>
|
||||
<field name="email_from"/>
|
||||
</group>
|
||||
<group string="Categorization">
|
||||
|
|
|
@ -68,11 +68,14 @@ class document_file(osv.osv):
|
|||
]
|
||||
|
||||
def check(self, cr, uid, ids, mode, context=None, values=None):
|
||||
"""Check access wrt. res_model, relax the rule of ir.attachment parent
|
||||
With 'document' installed, everybody will have access to attachments of
|
||||
any resources they can *read*.
|
||||
"""
|
||||
return super(document_file, self).check(cr, uid, ids, mode='read', context=context, values=values)
|
||||
"""Overwrite check to verify access on directory to validate specifications of doc/access_permissions.rst"""
|
||||
super(document_file, self).check(cr, uid, ids, mode, context=context, values=values)
|
||||
if ids:
|
||||
self.pool.get('ir.model.access').check(cr, uid, 'document.directory', mode)
|
||||
|
||||
# use SQL to avoid recursive loop on read
|
||||
cr.execute('SELECT DISTINCT parent_id from ir_attachment WHERE id in %s AND parent_id is not NULL', (tuple(ids),))
|
||||
self.pool.get('document.directory').check_access_rule(cr, uid, [parent_id for (parent_id,) in cr.fetchall()], mode, context=context)
|
||||
|
||||
def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
|
||||
# Grab ids, bypassing 'count'
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
# English (United Kingdom) 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 <EMAIL@ADDRESS>, 2013.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
|
||||
"PO-Revision-Date: 2013-08-23 16:43+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2013-08-24 05:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16738)\n"
|
||||
|
||||
#. module: edi
|
||||
#. openerp-web
|
||||
#: code:addons/edi/static/src/js/edi.js:67
|
||||
#, python-format
|
||||
msgid "Reason:"
|
||||
msgstr "Reason:"
|
||||
|
||||
#. module: edi
|
||||
#. openerp-web
|
||||
#: code:addons/edi/static/src/js/edi.js:60
|
||||
#, python-format
|
||||
msgid "The document has been successfully imported!"
|
||||
msgstr "The document has been successfully imported!"
|
||||
|
||||
#. module: edi
|
||||
#. openerp-web
|
||||
#: code:addons/edi/static/src/js/edi.js:65
|
||||
#, python-format
|
||||
msgid "Sorry, the document could not be imported."
|
||||
msgstr "Sorry, the document could not be imported."
|
||||
|
||||
#. module: edi
|
||||
#: model:ir.model,name:edi.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Companies"
|
||||
|
||||
#. module: edi
|
||||
#: model:ir.model,name:edi.model_res_currency
|
||||
msgid "Currency"
|
||||
msgstr "Currency"
|
||||
|
||||
#. module: edi
|
||||
#. openerp-web
|
||||
#: code:addons/edi/static/src/js/edi.js:71
|
||||
#, python-format
|
||||
msgid "Document Import Notification"
|
||||
msgstr "Document Import Notification"
|
||||
|
||||
#. module: edi
|
||||
#: code:addons/edi/models/edi.py:130
|
||||
#, python-format
|
||||
msgid "Missing application."
|
||||
msgstr "Missing application."
|
||||
|
||||
#. module: edi
|
||||
#: code:addons/edi/models/edi.py:131
|
||||
#, 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 ""
|
||||
"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."
|
||||
|
||||
#. module: edi
|
||||
#: code:addons/edi/models/edi.py:47
|
||||
#, python-format
|
||||
msgid "'%s' is an invalid external ID"
|
||||
msgstr "'%s' is an invalid external ID"
|
||||
|
||||
#. module: edi
|
||||
#: model:ir.model,name:edi.model_res_partner
|
||||
msgid "Partner"
|
||||
msgstr "Partner"
|
||||
|
||||
#. module: edi
|
||||
#: model:ir.model,name:edi.model_edi_edi
|
||||
msgid "EDI Subsystem"
|
||||
msgstr "EDI Subsystem"
|
|
@ -157,7 +157,8 @@ class mail_compose_message(osv.TransientModel):
|
|||
values['body'] = values.pop('body_html', '')
|
||||
|
||||
# transform email_to, email_cc into partner_ids
|
||||
partner_ids = self._get_or_create_partners_from_values(cr, uid, values, context=context)
|
||||
ctx = dict((k, v) for k, v in (context or {}).items() if not k.startswith('default_'))
|
||||
partner_ids = self._get_or_create_partners_from_values(cr, uid, values, context=ctx)
|
||||
# legacy template behavior: void values do not erase existing values and the
|
||||
# related key is removed from the values dict
|
||||
if partner_ids:
|
||||
|
|
|
@ -351,7 +351,7 @@ class fleet_vehicle(osv.Model):
|
|||
'fuel_type': fields.selection([('gasoline', 'Gasoline'), ('diesel', 'Diesel'), ('electric', 'Electric'), ('hybrid', 'Hybrid')], 'Fuel Type', help='Fuel Used by the vehicle'),
|
||||
'horsepower': fields.integer('Horsepower'),
|
||||
'horsepower_tax': fields.float('Horsepower Taxation'),
|
||||
'power': fields.integer('Power (kW)', help='Power in kW of the vehicle'),
|
||||
'power': fields.integer('Power', help='Power in kW of the vehicle'),
|
||||
'co2': fields.float('CO2 Emissions', help='CO2 emissions of the vehicle'),
|
||||
'image': fields.related('model_id', 'image', type="binary", string="Logo"),
|
||||
'image_medium': fields.related('model_id', 'image_medium', type="binary", string="Logo - medium"),
|
||||
|
@ -392,9 +392,12 @@ class fleet_vehicle(osv.Model):
|
|||
}
|
||||
|
||||
def create(self, cr, uid, data, context=None):
|
||||
if not context:
|
||||
context = {}
|
||||
context.update({'mail_create_nolog': True})
|
||||
vehicle_id = super(fleet_vehicle, self).create(cr, uid, data, context=context)
|
||||
vehicle = self.browse(cr, uid, vehicle_id, context=context)
|
||||
self.message_post(cr, uid, [vehicle_id], body=_('Vehicle %s has been added to the fleet!') % (vehicle.license_plate), context=context)
|
||||
self.message_post(cr, uid, [vehicle_id], body=_('%s %s has been added to the fleet!') % (vehicle.model_id.name,vehicle.license_plate), context=context)
|
||||
return vehicle_id
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<h1>
|
||||
<field name="modelname" />
|
||||
</h1>
|
||||
<label for="brand" class="oe_edit_only"/>
|
||||
<label for="brand_id" class="oe_edit_only"/>
|
||||
<h2>
|
||||
<field name="brand_id" on_change="on_change_brand(brand_id)"/>
|
||||
</h2>
|
||||
|
@ -242,11 +242,17 @@
|
|||
<group string="Engine Options">
|
||||
<field name="transmission" />
|
||||
<field name="fuel_type" />
|
||||
<field name="co2" />
|
||||
<label for="co2"/>
|
||||
<div>
|
||||
<field name="co2" class="oe_inline"/> g/km
|
||||
</div>
|
||||
<field name="horsepower" />
|
||||
<field name="horsepower_tax" />
|
||||
<field name="power" />
|
||||
</group>
|
||||
<label for="power"/>
|
||||
<div>
|
||||
<field name="power" class="oe_inline"/> kW
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
|
@ -287,6 +293,10 @@
|
|||
<field name="location"/>
|
||||
<field name="state_id" />
|
||||
<filter name="alert_true" domain="['|',('contract_renewal_due_soon','=',True),('contract_renewal_overdue','=',True)]" string="Has Alert(s)"/>
|
||||
<group expand="1" string="Group By...">
|
||||
<filter name="groupby_status" context="{'group_by' : 'state_id'}" string="Status"/>
|
||||
<filter name="groupby_model" context="{'group_by' : 'model_id'}" string="Model"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -400,7 +410,7 @@
|
|||
<group string="Contract details">
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<field name="cost_subtype_id" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
|
||||
<field name="amount" string="Activation Cost"/>
|
||||
<field name="amount" string="Activation Cost" help="Cost that is paid only once at the creation of the contract"/>
|
||||
<label for="cost_generated"/>
|
||||
<div>
|
||||
<field name="cost_generated" class="oe_inline" attrs="{'invisible': [('cost_frequency','=','no')]}" />
|
||||
|
@ -440,7 +450,7 @@
|
|||
</group>
|
||||
<div class="oe_right"><group><field name="sum_cost" string="Indicative Costs Total"/></group></div>
|
||||
</page>
|
||||
<page string="Generated Costs">
|
||||
<page string="Generated Recurring Costs">
|
||||
<group>
|
||||
<field name="generated_cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" sum="amount">
|
||||
<tree version="7.0" editable="bottom" >
|
||||
|
@ -704,7 +714,7 @@
|
|||
<group string="Services Details">
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<field name="cost_subtype_id" string="Service Type" domain="['|',('category','=','service'),('category','=','both')]" required="1"/>
|
||||
<field name="amount" string="Price"/>
|
||||
<field name="amount"/>
|
||||
</group>
|
||||
<group string="Odometer Details">
|
||||
<label for="odometer"/>
|
||||
|
@ -726,7 +736,7 @@
|
|||
<field name="cost_ids" nolabel="1">
|
||||
<tree string="Included Services" version="7.0" editable="bottom">
|
||||
<field name="cost_subtype_id" string="Service" domain="[('category','=','service')]"/>
|
||||
<field name="amount" sum="Price" string="Cost"/>
|
||||
<field name="amount" sum="Price" string="Indicative Cost"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
|
@ -767,6 +777,17 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_services_search'>
|
||||
<field name="name">fleet.vehicle.log.services.search</field>
|
||||
<field name="model">fleet.vehicle.log.services</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Services Logs" >
|
||||
<field name="vehicle_id"/>
|
||||
<field name="cost_subtype_id"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_log_services_act'>
|
||||
<field name="name">Vehicles Services Logs</field>
|
||||
<field name="res_model">fleet.vehicle.log.services</field>
|
||||
|
@ -789,7 +810,7 @@
|
|||
<field name="name">fleet.service.type.tree</field>
|
||||
<field name="model">fleet.service.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Service types" editable="bottom">
|
||||
<tree string="Service types" editable="top">
|
||||
<field name="name" />
|
||||
<field name="category"/>
|
||||
</tree>
|
||||
|
|
|
@ -192,7 +192,7 @@ class hr_employee(osv.osv):
|
|||
'child_ids': fields.one2many('hr.employee', 'parent_id', 'Subordinates'),
|
||||
'resource_id': fields.many2one('resource.resource', 'Resource', ondelete='cascade', required=True),
|
||||
'coach_id': fields.many2one('hr.employee', 'Coach'),
|
||||
'job_id': fields.many2one('hr.job', 'Job'),
|
||||
'job_id': fields.many2one('hr.job', 'Job Title'),
|
||||
# image: all image fields are base64 encoded and PIL-supported
|
||||
'image': fields.binary("Photo",
|
||||
help="This field holds the image used as photo for the employee, limited to 1024x1024px."),
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -380,10 +380,9 @@
|
|||
<tree string="Job">
|
||||
<field name="name"/>
|
||||
<field name="department_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="expected_employees"/>
|
||||
<field name="no_of_employee"/>
|
||||
<field name="no_of_recruitment"/>
|
||||
<field name="expected_employees"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
|
|
@ -88,6 +88,15 @@ class hr_contract(osv.osv):
|
|||
'type_id': _get_type
|
||||
}
|
||||
|
||||
def onchange_employee_id(self, cr, uid, ids, employee_id, context=None):
|
||||
if not employee_id:
|
||||
return {'value': {'job_id': False}}
|
||||
emp_obj = self.pool.get('hr.employee').browse(cr, uid, employee_id, context=context)
|
||||
job_id = False
|
||||
if emp_obj.job_id:
|
||||
job_id = emp_obj.job_id.id
|
||||
return {'value': {'job_id': job_id}}
|
||||
|
||||
def _check_dates(self, cr, uid, ids, context=None):
|
||||
for contract in self.read(cr, uid, ids, ['date_start', 'date_end'], context=context):
|
||||
if contract['date_start'] and contract['date_end'] and contract['date_start'] > contract['date_end']:
|
||||
|
|
|
@ -73,14 +73,15 @@
|
|||
<form string="Contract" version="7.0">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1>
|
||||
<field name="name" placeholder="Contract Reference"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="employee_id"/>
|
||||
<field name="job_id"/>
|
||||
<field name="employee_id" on_change="onchange_employee_id(employee_id)"/>
|
||||
<field name="job_id" context="{'form_view_ref': 'hr.view_hr_job_employee_form'}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="type_id"/>
|
||||
|
|
|
@ -70,8 +70,8 @@
|
|||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="code"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Salary Rules">
|
||||
|
@ -227,13 +227,12 @@
|
|||
<div class="oe_title">
|
||||
<label for="employee_id" class="oe_edit_only"/>
|
||||
<h1><field name="employee_id" on_change="onchange_employee_id(date_from, date_to, employee_id, contract_id)"/></h1>
|
||||
<label for="date_from" class="oe_edit_only" string="Period"/>
|
||||
<h2>
|
||||
From <field name="date_from" on_change="onchange_employee_id(date_from, date_to, employee_id, contract_id)"/>
|
||||
to <field name="date_to"/>
|
||||
</h2>
|
||||
</div>
|
||||
<group col="4">
|
||||
<label for="date_from" string="Period"/>
|
||||
<div>
|
||||
<field name="date_from" on_change="onchange_employee_id(date_from, date_to, employee_id, contract_id)" class="oe_inline"/> - <field name="date_to" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="contract_id" domain="[('employee_id','=',employee_id),('date_start','<=',date_to),'|',('date_end','>=',date_from),('date_end','=',False)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
|
||||
<field name="number"/>
|
||||
<field name="struct_id" attrs="{'required':[('contract_id','<>',False)]}"/>
|
||||
|
@ -592,8 +591,8 @@
|
|||
<field name="amount_percentage_base" attrs="{'invisible':[('amount_select','<>','percentage')], 'required': [('amount_select','=','percentage')]}"/><newline/>
|
||||
<field name="quantity" attrs="{'invisible':[('amount_select','=','code')], 'required':[('amount_select','!=','code')]}"/><newline/>
|
||||
<field name="amount_fix" attrs="{'invisible':[('amount_select','<>','fix')], 'required':[('amount_select','=','fix')]}"/><newline/>
|
||||
<field name="amount_percentage" attrs="{'invisible':[('amount_select','<>','percentage')], 'required':[('amount_select','=','percentage')]}"/>
|
||||
<field colspan="4" name="amount_python_compute" attrs="{'invisible':[('amount_select','<>','code')], 'required':[('amount_select','=','code')]}"/>
|
||||
<field name="amount_percentage" attrs="{'invisible':[('amount_select','<>','percentage')], 'required':[('amount_select','=','percentage')]}"/>
|
||||
<separator colspan="4" string="Company Contribution"/>
|
||||
<field name="register_id"/>
|
||||
</group>
|
||||
|
@ -699,13 +698,11 @@
|
|||
<h1>
|
||||
<field name="name"/>
|
||||
</h1>
|
||||
<h2>
|
||||
Period from
|
||||
<field name="date_start"/>
|
||||
to
|
||||
<field name="date_end"/>
|
||||
</h2>
|
||||
<group col="4">
|
||||
<label for="date_start" string="Period"/>
|
||||
<div>
|
||||
<field name="date_start" class="oe_inline"/> - <field name="date_end" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="credit_note"/>
|
||||
</group>
|
||||
<separator string="Payslips"/>
|
||||
|
|
|
@ -7,14 +7,16 @@
|
|||
<field name="model">payslip.lines.contribution.register</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contribution Register's Payslip Lines" version="7.0">
|
||||
<header>
|
||||
<button name="print_report" string="Print" type="object" icon="gtk-print" class="oe_highlight"/>
|
||||
</header>
|
||||
<group col="4" colspan="6">
|
||||
<field name="date_from"/>
|
||||
<newline/>
|
||||
<field name="date_to"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="print_report" string="Print" type="object" class="oe_highlight"/>
|
||||
or
|
||||
<button string="Cancel" class="oe_link" special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -39,7 +39,6 @@ You can define the different phases of interviews and easily rate the applicant
|
|||
'website': 'http://www.openerp.com',
|
||||
'images': ['images/hr_recruitment_analysis.jpeg','images/hr_recruitment_applicants.jpeg'],
|
||||
'depends': [
|
||||
'base_status',
|
||||
'decimal_precision',
|
||||
'hr',
|
||||
'survey',
|
||||
|
|
|
@ -331,10 +331,8 @@ class hr_applicant(osv.Model):
|
|||
"""
|
||||
if custom_values is None: custom_values = {}
|
||||
val = msg.get('from').split('<')[0]
|
||||
desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
|
||||
defaults = {
|
||||
'name': msg.get('subject') or _("No Subject"),
|
||||
'description': desc,
|
||||
'partner_name':val,
|
||||
'email_from': msg.get('from'),
|
||||
'email_cc': msg.get('cc'),
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
name="Meetings"
|
||||
res_model="crm.meeting"
|
||||
src_model="hr.applicant"
|
||||
view_mode="tree,form,calendar,graph"
|
||||
view_mode="calendar,tree,form,graph"
|
||||
view_type="form"/>
|
||||
|
||||
<!-- Stage -->
|
||||
|
|
|
@ -66,8 +66,6 @@ class hr_recruitment_partner_create(osv.osv_memory):
|
|||
case_obj.write(cr, uid, [case.id], {
|
||||
'partner_id': partner_id,
|
||||
}, context=context)
|
||||
if data['close']:
|
||||
case_obj.case_close(cr, uid, context['active_ids'])
|
||||
|
||||
return {
|
||||
'domain': "[]",
|
||||
|
|
|
@ -29,7 +29,7 @@ class hr_employee(osv.osv):
|
|||
_name = "hr.employee"
|
||||
_inherit = "hr.employee"
|
||||
_columns = {
|
||||
'product_id': fields.many2one('product.product', 'Product', help="Specifies employee's designation as a product with type 'service'."),
|
||||
'product_id': fields.many2one('product.product', 'Product', help="If you want to reinvoice working time of employees, link this employee to a service to determinate the cost price of the job."),
|
||||
'journal_id': fields.many2one('account.analytic.journal', 'Analytic Journal'),
|
||||
'uom_id': fields.related('product_id', 'uom_id', type='many2one', relation='product.uom', string='Unit of Measure', store=True, readonly=True)
|
||||
}
|
||||
|
|
|
@ -173,10 +173,9 @@ class account_analytic_line(osv.osv):
|
|||
data = {}
|
||||
|
||||
journal_types = {}
|
||||
price = 0.0
|
||||
|
||||
# prepare for iteration on journal and accounts
|
||||
for line in self.pool.get('account.analytic.line').browse(cr, uid, ids, context=context):
|
||||
price += line.amount*-1
|
||||
line_name = line.name
|
||||
if line.journal_id.type not in journal_types:
|
||||
journal_types[line.journal_id.type] = set()
|
||||
journal_types[line.journal_id.type].add(line.account_id.id)
|
||||
|
@ -217,53 +216,56 @@ class account_analytic_line(osv.osv):
|
|||
last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context2)
|
||||
invoices.append(last_invoice)
|
||||
|
||||
cr.execute("""SELECT product_id, user_id, to_invoice, sum(unit_amount), product_uom_id
|
||||
cr.execute("""SELECT product_id, user_id, to_invoice, sum(amount), sum(unit_amount), product_uom_id
|
||||
FROM account_analytic_line as line LEFT JOIN account_analytic_journal journal ON (line.journal_id = journal.id)
|
||||
WHERE account_id = %s
|
||||
AND line.id IN %s AND journal.type = %s AND to_invoice IS NOT NULL
|
||||
GROUP BY product_id, user_id, to_invoice, product_uom_id""", (account.id, tuple(ids), journal_type))
|
||||
|
||||
for product_id, user_id, factor_id, qty, uom in cr.fetchall():
|
||||
for product_id, user_id, factor_id, total_price, qty, uom in cr.fetchall():
|
||||
context2.update({'uom': uom})
|
||||
|
||||
if data.get('product'):
|
||||
# force product, use its public price
|
||||
product_id = data['product'][0]
|
||||
product = product_obj.browse(cr, uid, product_id, context=context2)
|
||||
unit_price = self._get_invoice_price(cr, uid, account, product_id, user_id, qty, context2)
|
||||
elif journal_type == 'general' and product_id:
|
||||
# timesheets, use sale price
|
||||
unit_price = self._get_invoice_price(cr, uid, account, product_id, user_id, qty, context2)
|
||||
else:
|
||||
# expenses, using price from amount field
|
||||
unit_price = total_price*-1.0 / qty
|
||||
|
||||
factor = invoice_factor_obj.browse(cr, uid, factor_id, context=context2)
|
||||
factor_name = factor.customer_name and line_name + ' - ' + factor.customer_name or line_name
|
||||
# factor_name = factor.customer_name and line_name + ' - ' + factor.customer_name or line_name
|
||||
factor_name = factor.customer_name
|
||||
curr_line = {
|
||||
'price_unit': price,
|
||||
'price_unit': unit_price,
|
||||
'quantity': qty,
|
||||
'product_id': product_id or False,
|
||||
'discount': factor.factor,
|
||||
'invoice_id': last_invoice,
|
||||
'name': factor_name,
|
||||
'uos_id': uom,
|
||||
'account_analytic_id': account.id,
|
||||
}
|
||||
product = product_obj.browse(cr, uid, product_id, context=context2)
|
||||
if product:
|
||||
factor_name = product_obj.name_get(cr, uid, [product_id], context=context2)[0][1]
|
||||
if factor.customer_name:
|
||||
factor_name += ' - ' + factor.customer_name
|
||||
|
||||
ctx = context.copy()
|
||||
ctx.update({'uom': uom})
|
||||
|
||||
# check force product
|
||||
if data.get('product'):
|
||||
price = self._get_invoice_price(cr, uid, account, product_id, user_id, qty, ctx)
|
||||
|
||||
general_account = product.property_account_income or product.categ_id.property_account_income_categ
|
||||
if not general_account:
|
||||
raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name)
|
||||
taxes = product.taxes_id or general_account.tax_ids
|
||||
tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes)
|
||||
curr_line.update({
|
||||
'price_unit': price,
|
||||
'invoice_line_tax_id': [(6,0,tax )],
|
||||
'name': factor_name,
|
||||
'product_id': product_id,
|
||||
'invoice_line_tax_id': [(6,0,tax)],
|
||||
'account_id': general_account.id,
|
||||
})
|
||||
|
||||
#
|
||||
# Compute for lines
|
||||
#
|
||||
|
@ -284,7 +286,6 @@ class account_analytic_line(osv.osv):
|
|||
if data.get('name', False):
|
||||
details.append(line['name'])
|
||||
note.append(u' - '.join(map(lambda x: unicode(x) or '',details)))
|
||||
|
||||
if note:
|
||||
curr_line['name'] += "\n" + ("\n".join(map(lambda x: unicode(x) or '',note)))
|
||||
invoice_line_obj.create(cr, uid, curr_line, context=context)
|
||||
|
|
|
@ -61,12 +61,13 @@
|
|||
!python {model: hr_timesheet_sheet.sheet}: |
|
||||
uid = ref('base.user_root')
|
||||
from openerp import netsvc
|
||||
from openerp.osv import osv
|
||||
try:
|
||||
self.button_confirm(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], {"active_ids":
|
||||
[ref("hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form")],"active_id": ref("hr_timesheet_sheet.menu_act_hr_timesheet_sheet_form"),
|
||||
})
|
||||
assert True, "The validation of the timesheet was unexpectedly accepted despite the 2:30 hours of difference"
|
||||
except:
|
||||
assert False, "The validation of the timesheet was unexpectedly accepted despite the 2:30 hours of difference"
|
||||
except osv.except_osv:
|
||||
pass
|
||||
-
|
||||
I Modified the timesheet record and make the difference less than 1 hour.
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
module.exports = function(grunt) {
|
||||
|
||||
grunt.initConfig({
|
||||
jshint: {
|
||||
src: ['static/src/js/*.js'],
|
||||
options: {
|
||||
sub: true, //[] instead of .
|
||||
evil: true, //eval
|
||||
laxbreak: true, //unsafe line breaks
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
|
||||
grunt.registerTask('test', []);
|
||||
|
||||
grunt.registerTask('default', ['jshint']);
|
||||
|
||||
};
|
|
@ -18,7 +18,10 @@ chat in real time. It support several chats in parallel.
|
|||
'security/im_security.xml',
|
||||
],
|
||||
'depends' : ['base', 'web'],
|
||||
'js': ['static/src/js/*.js'],
|
||||
'js': [
|
||||
'static/src/js/im_common.js',
|
||||
'static/src/js/im.js',
|
||||
],
|
||||
'css': ['static/src/css/*.css'],
|
||||
'qweb': ['static/src/xml/*.xml'],
|
||||
'installable': True,
|
||||
|
|
|
@ -109,7 +109,7 @@ class LongPollingController(http.Controller):
|
|||
registry = openerp.modules.registry.RegistryManager.get(db)
|
||||
with registry.cursor() as cr:
|
||||
registry.get('im.user').im_connect(cr, uid, uuid=uuid, context=request.context)
|
||||
my_id = registry.get('im.user').get_by_user_id(cr, uid, uuid or uid, request.context)["id"]
|
||||
my_id = registry.get('im.user').get_my_id(cr, uid, uuid, request.context)
|
||||
num = 0
|
||||
while True:
|
||||
with registry.cursor() as cr:
|
||||
|
@ -130,7 +130,7 @@ class LongPollingController(http.Controller):
|
|||
return "%s" % uuid.uuid1()
|
||||
|
||||
def assert_uuid(uuid):
|
||||
if not isinstance(uuid, (str, unicode, type(None))):
|
||||
if not isinstance(uuid, (str, unicode, type(None))) and uuid != False:
|
||||
raise Exception("%s is not a uuid" % uuid)
|
||||
|
||||
|
||||
|
@ -156,7 +156,7 @@ class im_message(osv.osv):
|
|||
|
||||
# complex stuff to determine the last message to show
|
||||
users = self.pool.get("im.user")
|
||||
my_id = users.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
my_id = users.get_my_id(cr, uid, uuid, context=context)
|
||||
c_user = users.browse(cr, openerp.SUPERUSER_ID, my_id, context=context)
|
||||
if last:
|
||||
if c_user.im_last_received < last:
|
||||
|
@ -181,7 +181,7 @@ class im_message(osv.osv):
|
|||
|
||||
def post(self, cr, uid, message, to_user_id, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
my_id = self.pool.get('im.user').get_by_user_id(cr, uid, uuid or uid)["id"]
|
||||
my_id = self.pool.get('im.user').get_my_id(cr, uid, uuid)
|
||||
self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from_id': my_id, 'to_id': to_user_id}, context=context)
|
||||
notify_channel(cr, "im_channel", {'type': 'message', 'receiver': to_user_id})
|
||||
return False
|
||||
|
@ -199,10 +199,9 @@ class im_user(osv.osv):
|
|||
res[obj["id"]] = obj["im_last_status"] and (last_update + delta) > current
|
||||
return res
|
||||
|
||||
def search_users(self, cr, uid, domain, fields, limit, context=None):
|
||||
# do not user openerp.SUPERUSER_ID, reserved to normal users
|
||||
found = self.pool.get('res.users').search(cr, uid, domain, limit=limit, context=context)
|
||||
found = self.get_by_user_ids(cr, uid, found, context=context)
|
||||
def search_users(self, cr, uid, text_search, fields, limit, context=None):
|
||||
my_id = self.get_my_id(cr, uid, None, context)
|
||||
found = self.search(cr, uid, [["name", "ilike", text_search], ["id", "<>", my_id], ["uuid", "=", False]], limit=limit, context=context)
|
||||
return self.read(cr, uid, found, fields, context=context)
|
||||
|
||||
def im_connect(self, cr, uid, uuid=None, context=None):
|
||||
|
@ -215,7 +214,7 @@ class im_user(osv.osv):
|
|||
|
||||
def _im_change_status(self, cr, uid, new_one, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
id = self.get_my_id(cr, uid, uuid, context=context)
|
||||
current_status = self.read(cr, openerp.SUPERUSER_ID, id, ["im_status"], context=None)["im_status"]
|
||||
self.write(cr, openerp.SUPERUSER_ID, id, {"im_last_status": new_one,
|
||||
"im_last_status_update": datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
|
||||
|
@ -223,37 +222,20 @@ class im_user(osv.osv):
|
|||
notify_channel(cr, "im_channel", {'type': 'status', 'user': id})
|
||||
return True
|
||||
|
||||
def get_by_user_id(self, cr, uid, id, context=None):
|
||||
ids = self.get_by_user_ids(cr, uid, [id], context=context)
|
||||
return ids[0]
|
||||
|
||||
def get_by_user_ids(self, cr, uid, ids, context=None):
|
||||
user_ids = [x for x in ids if isinstance(x, int)]
|
||||
uuids = [x for x in ids if isinstance(x, (str, unicode))]
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, ["|", ["user", "in", user_ids], ["uuid", "in", uuids]], context=None)
|
||||
records = self.read(cr, openerp.SUPERUSER_ID, users, ["user", "uuid"], context=None)
|
||||
inside = {}
|
||||
for i in records:
|
||||
if i["user"]:
|
||||
inside[i["user"][0]] = True
|
||||
elif ["uuid"]:
|
||||
inside[i["uuid"]] = True
|
||||
not_inside = {}
|
||||
for i in ids:
|
||||
if not (i in inside):
|
||||
not_inside[i] = True
|
||||
for to_create in not_inside.keys():
|
||||
if isinstance(to_create, int):
|
||||
created = self.create(cr, openerp.SUPERUSER_ID, {"user": to_create}, context=context)
|
||||
records.append({"id": created, "user": [to_create, ""]})
|
||||
else:
|
||||
created = self.create(cr, openerp.SUPERUSER_ID, {"uuid": to_create}, context=context)
|
||||
records.append({"id": created, "uuid": to_create})
|
||||
return records
|
||||
def get_my_id(self, cr, uid, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
if uuid:
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, [["uuid", "=", uuid]], context=None)
|
||||
else:
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, [["user_id", "=", uid]], context=None)
|
||||
my_id = users[0] if len(users) >= 1 else False
|
||||
if not my_id:
|
||||
my_id = self.create(cr, openerp.SUPERUSER_ID, {"user_id": uid if not uuid else False, "uuid": uuid if uuid else False}, context=context)
|
||||
return my_id
|
||||
|
||||
def assign_name(self, cr, uid, uuid, name, context=None):
|
||||
assert_uuid(uuid)
|
||||
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
id = self.get_my_id(cr, uid, uuid, context=context)
|
||||
self.write(cr, openerp.SUPERUSER_ID, id, {"assigned_name": name}, context=context)
|
||||
return True
|
||||
|
||||
|
@ -261,16 +243,16 @@ class im_user(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = record.assigned_name
|
||||
if record.user:
|
||||
res[record.id] = record.user.name
|
||||
if record.user_id:
|
||||
res[record.id] = record.user_id.name
|
||||
continue
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.function(_get_name, type='char', size=200, string="Name", store=True, readonly=True),
|
||||
'assigned_name': fields.char(string="Assigned Name", size=200, required=False),
|
||||
'image': fields.related('user', 'image_small', type='binary', string="Image", readonly=True),
|
||||
'user': fields.many2one("res.users", string="User", select=True, ondelete='cascade'),
|
||||
'image': fields.related('user_id', 'image_small', type='binary', string="Image", readonly=True),
|
||||
'user_id': fields.many2one("res.users", string="User", select=True, ondelete='cascade'),
|
||||
'uuid': fields.char(string="UUID", size=50, select=True),
|
||||
'im_last_received': fields.integer(string="Instant Messaging Last Received Message"),
|
||||
'im_last_status': fields.boolean(strint="Instant Messaging Last Status"),
|
||||
|
@ -283,3 +265,8 @@ class im_user(osv.osv):
|
|||
'im_last_status': False,
|
||||
'im_last_status_update': lambda *args: datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
('user_uniq', 'unique (user_id)', 'Only one chat user per OpenERP user.'),
|
||||
('uuid_uniq', 'unique (uuid)', 'Chat identifier already used.'),
|
||||
]
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"devDependencies": {
|
||||
"grunt": "*",
|
||||
"grunt-contrib-jshint": "*"
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@
|
|||
<field name="name">Can only read messages that you sent or messages sent to you</field>
|
||||
<field name="model_id" ref="model_im_message"/>
|
||||
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
|
||||
<field name="domain_force">["|", ('to_id.user', '=', user.id), ('from_id.user', '=', user.id)]</field>
|
||||
<field name="domain_force">["|", ('to_id.user_id', '=', user.id), ('from_id.user_id', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="0"/>
|
||||
<field name="perm_write" eval="0"/>
|
||||
<field name="perm_read" eval="1"/>
|
||||
|
@ -16,11 +16,11 @@
|
|||
<field name="name">Can only modify your user</field>
|
||||
<field name="model_id" ref="model_im_user"/>
|
||||
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
|
||||
<field name="domain_force">[('user', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="0"/>
|
||||
<field name="domain_force">[('user_id', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="1"/>
|
||||
<field name="perm_write" eval="1"/>
|
||||
<field name="perm_read" eval="0"/>
|
||||
<field name="perm_create" eval="0"/>
|
||||
<field name="perm_create" eval="1"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -105,160 +105,3 @@
|
|||
vertical-align: middle;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* conversations */
|
||||
|
||||
.openerp .oe_im_chatview {
|
||||
position: fixed;
|
||||
overflow: hidden;
|
||||
bottom: 6px;
|
||||
margin-right: 6px;
|
||||
background: rgba(60, 60, 60, 0.8);
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
-moz-box-shadow: 0 0 3px rgba(0,0,0,0.3), 0 2px 4px rgba(0,0,0,0.3);
|
||||
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||
width: 240px;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_disconnected {
|
||||
display:none;
|
||||
z-index: 100;
|
||||
width: 100%;
|
||||
background: #E8EBEF;
|
||||
padding: 5px;
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
line-height: 14px;
|
||||
height: 28px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_disconnected {
|
||||
display: block;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_header {
|
||||
padding: 3px 6px 2px;
|
||||
background: #DEDEDE;
|
||||
background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
|
||||
-moz-border-radius: 3px 3px 0 0;
|
||||
-webkit-border-radius: 3px 3px 0 0;
|
||||
border-radius: 3px 3px 0 0;
|
||||
border-bottom: 1px solid #AEB9BD;
|
||||
cursor: pointer;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_close {
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
font-size: 18px;
|
||||
line-height: 16px;
|
||||
float: right;
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
text-shadow: 0 1px 0 white;
|
||||
opacity: 0.2;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_content {
|
||||
overflow: auto;
|
||||
height: 287px;
|
||||
}
|
||||
.openerp .oe_im_chatview.oe_im_chatview_disconnected_status .oe_im_chatview_content {
|
||||
height: 249px;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_footer {
|
||||
position: relative;
|
||||
padding: 3px;
|
||||
border-top: 1px solid #AEB9BD;
|
||||
background: #DEDEDE;
|
||||
background: -moz-linear-gradient(#FCFCFC, #DEDEDE);
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(#FCFCFC), to(#DEDEDE));
|
||||
-moz-border-radius: 0 0 3px 3px;
|
||||
-webkit-border-radius: 0 0 3px 3px;
|
||||
border-radius: 0 0 3px 3px;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_input {
|
||||
width: 222px;
|
||||
font-family: Lato, Helvetica, sans-serif;
|
||||
font-size: 13px;
|
||||
color: #333;
|
||||
padding: 1px 5px;
|
||||
border: 1px solid #AEB9BD;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
-moz-box-shadow: inset 0 1px 4px rgba(0,0,0,0.2);
|
||||
-webkit-box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_bubble {
|
||||
background: white;
|
||||
position: relative;
|
||||
padding: 3px;
|
||||
margin: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_clip {
|
||||
position: relative;
|
||||
float: left;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
margin-right: 4px;
|
||||
-moz-box-shadow: 0 0 2px 1px rgba(0,0,0,0.25);
|
||||
-webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
|
||||
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_avatar {
|
||||
float: left;
|
||||
width: 26px;
|
||||
height: auto;
|
||||
clip: rect(0, 26px, 26px, 0);
|
||||
max-width: 100%;
|
||||
width: auto 9;
|
||||
height: auto;
|
||||
vertical-align: middle;
|
||||
border: 0;
|
||||
-ms-interpolation-mode: bicubic;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_time {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
margin: 3px;
|
||||
text-align: right;
|
||||
line-height: 13px;
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
width: 60px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_from {
|
||||
margin: 0 0 2px 0;
|
||||
line-height: 14px;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
width: 140px;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
color: #3A87AD;
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_bubble_list {
|
||||
}
|
||||
.openerp .oe_im_chatview .oe_im_chatview_bubble_item {
|
||||
margin: 0 0 2px 30px;
|
||||
line-height: 14px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.openerp .oe_im_chatview_online {
|
||||
display: none;
|
||||
margin-top: -4px;
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
.oe_im_chatview {
|
||||
position: fixed;
|
||||
overflow: hidden;
|
||||
bottom: 42px;
|
||||
margin-bottom: 5px;
|
||||
margin-right: 6px;
|
||||
background: rgba(60, 60, 60, 0.8);
|
||||
-moz-border-radius: 3px;
|
|
@ -1,17 +1,25 @@
|
|||
|
||||
openerp.im = function(instance) {
|
||||
(function() {
|
||||
"use strict";
|
||||
|
||||
var instance = openerp;
|
||||
|
||||
openerp.im = {};
|
||||
|
||||
var USERS_LIMIT = 20;
|
||||
var ERROR_DELAY = 5000;
|
||||
|
||||
var _t = instance.web._t,
|
||||
_lt = instance.web._lt;
|
||||
var _t = instance.web._t;
|
||||
var QWeb = instance.web.qweb;
|
||||
|
||||
instance.web.UserMenu.include({
|
||||
do_update: function(){
|
||||
var self = this;
|
||||
this.update_promise.then(function() {
|
||||
im_common.notification = function(message) {
|
||||
instance.client.do_warn(message);
|
||||
};
|
||||
im_common.connection = openerp.session;
|
||||
|
||||
var im = new instance.im.InstantMessaging(self);
|
||||
im.appendTo(instance.client.$el);
|
||||
var button = new instance.im.ImTopButton(this);
|
||||
|
@ -45,7 +53,7 @@ openerp.im = function(instance) {
|
|||
this.set("right_offset", 0);
|
||||
this.set("current_search", "");
|
||||
this.users = [];
|
||||
this.c_manager = new instance.im.ConversationManager(this);
|
||||
this.c_manager = new im_common.ConversationManager(this);
|
||||
this.on("change:right_offset", this.c_manager, _.bind(function() {
|
||||
this.c_manager.set("right_offset", this.get("right_offset"));
|
||||
}, this));
|
||||
|
@ -77,9 +85,8 @@ openerp.im = function(instance) {
|
|||
search_changed: function(e) {
|
||||
var users = new instance.web.Model("im.user");
|
||||
var self = this;
|
||||
return this.user_search_dm.add(users.call("search_users",
|
||||
[[["name", "ilike", this.get("current_search")], ["id", "<>", instance.session.uid]],
|
||||
["name", "user", "uuid", "im_status"], USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
|
||||
return this.user_search_dm.add(users.call("search_users", [this.get("current_search"), ["name", "user_id", "uuid", "im_status"],
|
||||
USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
|
||||
self.c_manager.add_to_user_cache(result);
|
||||
self.$(".oe_im_input").val("");
|
||||
var old_users = self.users;
|
||||
|
@ -148,323 +155,4 @@ openerp.im = function(instance) {
|
|||
},
|
||||
});
|
||||
|
||||
instance.im.ImUser = instance.web.Class.extend(instance.web.PropertiesMixin, {
|
||||
init: function(parent, user_rec) {
|
||||
instance.web.PropertiesMixin.init.call(this, parent);
|
||||
user_rec.image_url = instance.session.url("/im/static/src/img/avatar/avatar.jpeg");
|
||||
if (user_rec.user)
|
||||
user_rec.image_url = instance.session.url('/web/binary/image', {model:'res.users', field: 'image_small', id: user_rec.user[0]});
|
||||
this.set(user_rec);
|
||||
this.set("watcher_count", 0);
|
||||
this.on("change:watcher_count", this, function() {
|
||||
if (this.get("watcher_count") === 0)
|
||||
this.destroy();
|
||||
});
|
||||
},
|
||||
destroy: function() {
|
||||
this.trigger("destroyed");
|
||||
instance.web.PropertiesMixin.destroy.call(this);
|
||||
},
|
||||
add_watcher: function() {
|
||||
this.set("watcher_count", this.get("watcher_count") + 1);
|
||||
},
|
||||
remove_watcher: function() {
|
||||
this.set("watcher_count", this.get("watcher_count") - 1);
|
||||
},
|
||||
});
|
||||
|
||||
instance.im.ConversationManager = instance.web.Controller.extend({
|
||||
init: function(parent) {
|
||||
this._super(parent);
|
||||
this.set("right_offset", 0);
|
||||
this.conversations = [];
|
||||
this.users = {};
|
||||
this.on("change:right_offset", this, this.calc_positions);
|
||||
this.set("window_focus", true);
|
||||
this.set("waiting_messages", 0);
|
||||
this.focus_hdl = _.bind(function() {
|
||||
this.set("window_focus", true);
|
||||
}, this);
|
||||
$(window).bind("focus", this.focus_hdl);
|
||||
this.blur_hdl = _.bind(function() {
|
||||
this.set("window_focus", false);
|
||||
}, this);
|
||||
$(window).bind("blur", this.blur_hdl);
|
||||
this.on("change:window_focus", this, this.window_focus_change);
|
||||
this.window_focus_change();
|
||||
this.on("change:waiting_messages", this, this.messages_change);
|
||||
this.messages_change();
|
||||
this.create_ting();
|
||||
this.activated = false;
|
||||
this.users_cache = {};
|
||||
this.last = null;
|
||||
this.unload_event_handler = _.bind(this.unload, this);
|
||||
},
|
||||
start_polling: function() {
|
||||
var self = this;
|
||||
return new instance.web.Model("im.user").call("get_by_user_id", [instance.session.uid]).then(function(my_id) {
|
||||
self.my_id = my_id["id"];
|
||||
return self.ensure_users([self.my_id]).then(function() {
|
||||
var me = self.users_cache[self.my_id];
|
||||
delete self.users_cache[self.my_id];
|
||||
self.me = me;
|
||||
self.rpc("/longpolling/im/activated", {}, {shadow: true}).then(function(activated) {
|
||||
if (activated) {
|
||||
self.activated = true;
|
||||
$(window).on("unload", self.unload_event_handler);
|
||||
self.poll();
|
||||
}
|
||||
}, function(a, e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
unload: function() {
|
||||
return new instance.web.Model("im.user").call("im_disconnect", [], {context: new instance.web.CompoundContext()});
|
||||
},
|
||||
ensure_users: function(user_ids) {
|
||||
var no_cache = {};
|
||||
_.each(user_ids, function(el) {
|
||||
if (! this.users_cache[el])
|
||||
no_cache[el] = el;
|
||||
}, this);
|
||||
var self = this;
|
||||
if (_.size(no_cache) === 0)
|
||||
return $.when();
|
||||
else
|
||||
return new instance.web.Model("im.user").call("read", [_.values(no_cache), ["name", "user", "uuid", "im_status"]],
|
||||
{context: new instance.web.CompoundContext()}).then(function(users) {
|
||||
self.add_to_user_cache(users);
|
||||
});
|
||||
},
|
||||
add_to_user_cache: function(user_recs) {
|
||||
_.each(user_recs, function(user_rec) {
|
||||
if (! this.users_cache[user_rec.id]) {
|
||||
var user = new instance.im.ImUser(this, user_rec);
|
||||
this.users_cache[user_rec.id] = user;
|
||||
user.on("destroyed", this, function() {
|
||||
delete this.users_cache[user_rec.id];
|
||||
});
|
||||
}
|
||||
}, this);
|
||||
},
|
||||
get_user: function(user_id) {
|
||||
return this.users_cache[user_id];
|
||||
},
|
||||
poll: function() {
|
||||
var self = this;
|
||||
var user_ids = _.map(this.users_cache, function(el) {
|
||||
return el.get("id");
|
||||
});
|
||||
this.rpc("/longpolling/im/poll", {
|
||||
last: this.last,
|
||||
users_watch: user_ids,
|
||||
context: instance.web.pyeval.eval('context', {}),
|
||||
}, {shadow: true}).then(function(result) {
|
||||
_.each(result.users_status, function(el) {
|
||||
if (self.get_user(el.id))
|
||||
self.get_user(el.id).set(el);
|
||||
});
|
||||
self.last = result.last;
|
||||
var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0);
|
||||
self.ensure_users(user_ids).then(function() {
|
||||
_.each(result.res, function(mes) {
|
||||
var user = self.get_user(mes.from_id[0]);
|
||||
self.received_message(mes, user);
|
||||
});
|
||||
self.poll();
|
||||
});
|
||||
}, function(unused, e) {
|
||||
e.preventDefault();
|
||||
setTimeout(_.bind(self.poll, self), ERROR_DELAY);
|
||||
});
|
||||
},
|
||||
get_activated: function() {
|
||||
return this.activated;
|
||||
},
|
||||
create_ting: function() {
|
||||
if (typeof(Audio) === "undefined") {
|
||||
this.ting = {play: function() {}};
|
||||
return;
|
||||
}
|
||||
var kitten = jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined;
|
||||
this.ting = new Audio(instance.webclient.session.origin + "/im/static/src/audio/" + (kitten ? "purr" : "Ting") +
|
||||
(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg" : ".mp3"));
|
||||
},
|
||||
window_focus_change: function() {
|
||||
if (this.get("window_focus")) {
|
||||
this.set("waiting_messages", 0);
|
||||
}
|
||||
},
|
||||
messages_change: function() {
|
||||
if (! instance.webclient.set_title_part)
|
||||
return;
|
||||
instance.webclient.set_title_part("aa_im_messages", this.get("waiting_messages") === 0 ? undefined :
|
||||
_.str.sprintf(_t("%d Messages"), this.get("waiting_messages")));
|
||||
},
|
||||
activate_user: function(user, focus) {
|
||||
var conv = this.users[user.get('id')];
|
||||
if (! conv) {
|
||||
conv = new instance.im.Conversation(this, user, this.me);
|
||||
conv.appendTo(instance.client.$el);
|
||||
conv.on("destroyed", this, function() {
|
||||
this.conversations = _.without(this.conversations, conv);
|
||||
delete this.users[conv.user.get('id')];
|
||||
this.calc_positions();
|
||||
});
|
||||
this.conversations.push(conv);
|
||||
this.users[user.get('id')] = conv;
|
||||
this.calc_positions();
|
||||
}
|
||||
if (focus)
|
||||
conv.focus();
|
||||
return conv;
|
||||
},
|
||||
received_message: function(message, user) {
|
||||
if (! this.get("window_focus")) {
|
||||
this.set("waiting_messages", this.get("waiting_messages") + 1);
|
||||
this.ting.play();
|
||||
this.create_ting();
|
||||
}
|
||||
var conv = this.activate_user(user);
|
||||
conv.received_message(message);
|
||||
},
|
||||
calc_positions: function() {
|
||||
var current = this.get("right_offset");
|
||||
_.each(_.range(this.conversations.length), function(i) {
|
||||
this.conversations[i].set("right_position", current);
|
||||
current += this.conversations[i].$el.outerWidth(true);
|
||||
}, this);
|
||||
},
|
||||
destroy: function() {
|
||||
$(window).off("unload", this.unload_event_handler);
|
||||
$(window).unbind("blur", this.blur_hdl);
|
||||
$(window).unbind("focus", this.focus_hdl);
|
||||
this._super();
|
||||
},
|
||||
});
|
||||
|
||||
instance.im.Conversation = instance.web.Widget.extend({
|
||||
"template": "Conversation",
|
||||
events: {
|
||||
"keydown input": "send_message",
|
||||
"click .oe_im_chatview_close": "destroy",
|
||||
"click .oe_im_chatview_header": "show_hide",
|
||||
},
|
||||
init: function(parent, user, me) {
|
||||
this._super(parent);
|
||||
this.me = me;
|
||||
this.user = user;
|
||||
this.user.add_watcher();
|
||||
this.set("right_position", 0);
|
||||
this.shown = true;
|
||||
this.set("pending", 0);
|
||||
},
|
||||
start: function() {
|
||||
var change_status = function() {
|
||||
this.$el.toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false);
|
||||
this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true);
|
||||
this._go_bottom();
|
||||
};
|
||||
this.user.on("change:im_status", this, change_status);
|
||||
change_status.call(this);
|
||||
|
||||
this.on("change:right_position", this, this.calc_pos);
|
||||
this.full_height = this.$el.height();
|
||||
this.calc_pos();
|
||||
this.on("change:pending", this, _.bind(function() {
|
||||
if (this.get("pending") === 0) {
|
||||
this.$(".oe_im_chatview_nbr_messages").text("");
|
||||
} else {
|
||||
this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")");
|
||||
}
|
||||
}, this));
|
||||
},
|
||||
show_hide: function() {
|
||||
if (this.shown) {
|
||||
this.$el.animate({
|
||||
height: this.$(".oe_im_chatview_header").outerHeight(),
|
||||
});
|
||||
} else {
|
||||
this.$el.animate({
|
||||
height: this.full_height,
|
||||
});
|
||||
}
|
||||
this.shown = ! this.shown;
|
||||
if (this.shown) {
|
||||
this.set("pending", 0);
|
||||
}
|
||||
},
|
||||
calc_pos: function() {
|
||||
this.$el.css("right", this.get("right_position"));
|
||||
},
|
||||
received_message: function(message) {
|
||||
if (this.shown) {
|
||||
this.set("pending", 0);
|
||||
} else {
|
||||
this.set("pending", this.get("pending") + 1);
|
||||
}
|
||||
this._add_bubble(this.user, message.message, message.date);
|
||||
},
|
||||
send_message: function(e) {
|
||||
if(e && e.which !== 13) {
|
||||
return;
|
||||
}
|
||||
var mes = this.$("input").val();
|
||||
if (! mes.trim()) {
|
||||
return;
|
||||
}
|
||||
this.$("input").val("");
|
||||
var send_it = _.bind(function() {
|
||||
var model = new instance.web.Model("im.message");
|
||||
return model.call("post", [mes, this.user.get('id')],
|
||||
{context: new instance.web.CompoundContext()});
|
||||
}, this);
|
||||
var tries = 0;
|
||||
send_it().then(_.bind(function() {
|
||||
this._add_bubble(this.me, mes, instance.web.datetime_to_str(new Date()));
|
||||
}, this), function(error, e) {
|
||||
e.preventDefault();
|
||||
tries += 1;
|
||||
if (tries < 3)
|
||||
return send_it();
|
||||
});
|
||||
},
|
||||
_add_bubble: function(user, item, date) {
|
||||
var items = [item];
|
||||
if (user === this.last_user) {
|
||||
this.last_bubble.remove();
|
||||
items = this.last_items.concat(items);
|
||||
}
|
||||
this.last_user = user;
|
||||
this.last_items = items;
|
||||
date = instance.web.str_to_datetime(date);
|
||||
var now = new Date();
|
||||
var diff = now - date;
|
||||
if (diff > (1000 * 60 * 60 * 24)) {
|
||||
date = $.timeago(date);
|
||||
} else {
|
||||
date = date.toString(Date.CultureInfo.formatPatterns.shortTime);
|
||||
}
|
||||
|
||||
this.last_bubble = $(QWeb.render("Conversation.bubble", {"items": items, "user": user, "time": date}));
|
||||
$(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble);
|
||||
this._go_bottom();
|
||||
},
|
||||
_go_bottom: function() {
|
||||
this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height());
|
||||
},
|
||||
focus: function() {
|
||||
this.$(".oe_im_chatview_input").focus();
|
||||
if (! this.shown)
|
||||
this.show_hide();
|
||||
},
|
||||
destroy: function() {
|
||||
this.user.remove_watcher();
|
||||
this.trigger("destroyed");
|
||||
return this._super();
|
||||
},
|
||||
});
|
||||
|
||||
}
|
||||
})();
|
|
@ -0,0 +1,396 @@
|
|||
|
||||
/*
|
||||
This file must compile in EcmaScript 3 and work in IE7.
|
||||
|
||||
Prerequisites to use this module:
|
||||
- load the im_common.xml qweb template into openerp.qweb
|
||||
- implement all the stuff defined later
|
||||
*/
|
||||
|
||||
(function() {
|
||||
|
||||
function declare($, _, openerp) {
|
||||
/* jshint es3: true */
|
||||
"use strict";
|
||||
|
||||
var im_common = {};
|
||||
|
||||
/*
|
||||
All of this must be defined to use this module
|
||||
*/
|
||||
_.extend(im_common, {
|
||||
notification: function(message) {
|
||||
throw new Error("Not implemented");
|
||||
},
|
||||
connection: null
|
||||
});
|
||||
|
||||
var _t = openerp._t;
|
||||
|
||||
var ERROR_DELAY = 5000;
|
||||
|
||||
im_common.ImUser = openerp.Class.extend(openerp.PropertiesMixin, {
|
||||
init: function(parent, user_rec) {
|
||||
openerp.PropertiesMixin.init.call(this, parent);
|
||||
|
||||
user_rec.image_url = im_common.connection.url('/web/binary/image', {model:'im.user', field: 'image', id: user_rec.id});
|
||||
|
||||
this.set(user_rec);
|
||||
this.set("watcher_count", 0);
|
||||
this.on("change:watcher_count", this, function() {
|
||||
if (this.get("watcher_count") === 0)
|
||||
this.destroy();
|
||||
});
|
||||
},
|
||||
destroy: function() {
|
||||
this.trigger("destroyed");
|
||||
openerp.PropertiesMixin.destroy.call(this);
|
||||
},
|
||||
add_watcher: function() {
|
||||
this.set("watcher_count", this.get("watcher_count") + 1);
|
||||
},
|
||||
remove_watcher: function() {
|
||||
this.set("watcher_count", this.get("watcher_count") - 1);
|
||||
}
|
||||
});
|
||||
|
||||
im_common.ConversationManager = openerp.Class.extend(openerp.PropertiesMixin, {
|
||||
init: function(parent, options) {
|
||||
openerp.PropertiesMixin.init.call(this, parent);
|
||||
this.options = _.clone(options) || {};
|
||||
_.defaults(this.options, {
|
||||
inputPlaceholder: _t("Say something..."),
|
||||
defaultMessage: null,
|
||||
userName: _t("Anonymous"),
|
||||
anonymous_mode: false
|
||||
});
|
||||
this.set("right_offset", 0);
|
||||
this.set("bottom_offset", 0);
|
||||
this.conversations = [];
|
||||
this.users = {};
|
||||
this.on("change:right_offset", this, this.calc_positions);
|
||||
this.on("change:bottom_offset", this, this.calc_positions);
|
||||
this.set("window_focus", true);
|
||||
this.set("waiting_messages", 0);
|
||||
this.focus_hdl = _.bind(function() {
|
||||
this.set("window_focus", true);
|
||||
}, this);
|
||||
$(window).bind("focus", this.focus_hdl);
|
||||
this.blur_hdl = _.bind(function() {
|
||||
this.set("window_focus", false);
|
||||
}, this);
|
||||
$(window).bind("blur", this.blur_hdl);
|
||||
this.on("change:window_focus", this, this.window_focus_change);
|
||||
this.window_focus_change();
|
||||
this.on("change:waiting_messages", this, this.messages_change);
|
||||
this.messages_change();
|
||||
this.create_ting();
|
||||
this.activated = false;
|
||||
this.users_cache = {};
|
||||
this.last = null;
|
||||
this.unload_event_handler = _.bind(this.unload, this);
|
||||
},
|
||||
start_polling: function() {
|
||||
var self = this;
|
||||
var def = $.when();
|
||||
var uuid = false;
|
||||
|
||||
if (this.options.anonymous_mode) {
|
||||
uuid = localStorage["oe_livesupport_uuid"] || false;
|
||||
|
||||
if (! uuid) {
|
||||
def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}).then(function(my_uuid) {
|
||||
uuid = my_uuid;
|
||||
localStorage["oe_livesupport_uuid"] = uuid;
|
||||
});
|
||||
}
|
||||
def = def.then(function() {
|
||||
return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]);
|
||||
});
|
||||
}
|
||||
|
||||
return def.then(function() {
|
||||
return im_common.connection.model("im.user").call("get_my_id", [uuid]);
|
||||
}).then(function(my_user_id) {
|
||||
self.my_id = my_user_id;
|
||||
return self.ensure_users([self.my_id]);
|
||||
}).then(function() {
|
||||
var me = self.users_cache[self.my_id];
|
||||
delete self.users_cache[self.my_id];
|
||||
self.me = me;
|
||||
me.set("name", _t("You"));
|
||||
return im_common.connection.rpc("/longpolling/im/activated", {}, {shadow: true});
|
||||
}).then(function(activated) {
|
||||
if (activated) {
|
||||
self.activated = true;
|
||||
$(window).on("unload", self.unload_event_handler);
|
||||
self.poll();
|
||||
} else {
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
}, function(a, e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
},
|
||||
unload: function() {
|
||||
return im_common.connection.model("im.user").call("im_disconnect", [], {uuid: this.me.get("uuid"), context: {}});
|
||||
},
|
||||
ensure_users: function(user_ids) {
|
||||
var no_cache = {};
|
||||
_.each(user_ids, function(el) {
|
||||
if (! this.users_cache[el])
|
||||
no_cache[el] = el;
|
||||
}, this);
|
||||
var self = this;
|
||||
if (_.size(no_cache) === 0)
|
||||
return $.when();
|
||||
else
|
||||
return im_common.connection.model("im.user").call("read", [_.values(no_cache), []]).then(function(users) {
|
||||
self.add_to_user_cache(users);
|
||||
});
|
||||
},
|
||||
add_to_user_cache: function(user_recs) {
|
||||
_.each(user_recs, function(user_rec) {
|
||||
if (! this.users_cache[user_rec.id]) {
|
||||
var user = new im_common.ImUser(this, user_rec);
|
||||
this.users_cache[user_rec.id] = user;
|
||||
user.on("destroyed", this, function() {
|
||||
delete this.users_cache[user_rec.id];
|
||||
});
|
||||
}
|
||||
}, this);
|
||||
},
|
||||
get_user: function(user_id) {
|
||||
return this.users_cache[user_id];
|
||||
},
|
||||
poll: function() {
|
||||
var self = this;
|
||||
var user_ids = _.map(this.users_cache, function(el) {
|
||||
return el.get("id");
|
||||
});
|
||||
im_common.connection.rpc("/longpolling/im/poll", {
|
||||
last: this.last,
|
||||
users_watch: user_ids,
|
||||
uuid: self.me.get("uuid")
|
||||
}, {shadow: true}).then(function(result) {
|
||||
_.each(result.users_status, function(el) {
|
||||
if (self.get_user(el.id))
|
||||
self.get_user(el.id).set(el);
|
||||
});
|
||||
self.last = result.last;
|
||||
var user_ids = _.pluck(_.pluck(result.res, "from_id"), 0);
|
||||
self.ensure_users(user_ids).then(function() {
|
||||
_.each(result.res, function(mes) {
|
||||
var user = self.get_user(mes.from_id[0]);
|
||||
self.received_message(mes, user);
|
||||
});
|
||||
self.poll();
|
||||
});
|
||||
}, function(unused, e) {
|
||||
e.preventDefault();
|
||||
setTimeout(_.bind(self.poll, self), ERROR_DELAY);
|
||||
});
|
||||
},
|
||||
get_activated: function() {
|
||||
return this.activated;
|
||||
},
|
||||
create_ting: function() {
|
||||
if (typeof(Audio) === "undefined") {
|
||||
this.ting = {play: function() {}};
|
||||
return;
|
||||
}
|
||||
var kitten = jQuery.deparam !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined;
|
||||
this.ting = new Audio(im_common.connection.url(
|
||||
"/im/static/src/audio/" +
|
||||
(kitten ? "purr" : "Ting") +
|
||||
(new Audio().canPlayType("audio/ogg; codecs=vorbis") ? ".ogg": ".mp3")
|
||||
));
|
||||
},
|
||||
window_focus_change: function() {
|
||||
if (this.get("window_focus")) {
|
||||
this.set("waiting_messages", 0);
|
||||
}
|
||||
},
|
||||
messages_change: function() {
|
||||
if (! openerp.webclient || !openerp.webclient.set_title_part)
|
||||
return;
|
||||
openerp.webclient.set_title_part("im_messages", this.get("waiting_messages") === 0 ? undefined :
|
||||
_.str.sprintf(_t("%d Messages"), this.get("waiting_messages")));
|
||||
},
|
||||
activate_user: function(user, focus) {
|
||||
var conv = this.users[user.get('id')];
|
||||
if (! conv) {
|
||||
conv = new im_common.Conversation(this, user, this.me, this.options);
|
||||
conv.appendTo($("body"));
|
||||
conv.on("destroyed", this, function() {
|
||||
this.conversations = _.without(this.conversations, conv);
|
||||
delete this.users[conv.user.get('id')];
|
||||
this.calc_positions();
|
||||
});
|
||||
this.conversations.push(conv);
|
||||
this.users[user.get('id')] = conv;
|
||||
this.calc_positions();
|
||||
}
|
||||
if (focus)
|
||||
conv.focus();
|
||||
return conv;
|
||||
},
|
||||
received_message: function(message, user) {
|
||||
if (! this.get("window_focus")) {
|
||||
this.set("waiting_messages", this.get("waiting_messages") + 1);
|
||||
this.ting.play();
|
||||
this.create_ting();
|
||||
}
|
||||
var conv = this.activate_user(user);
|
||||
conv.received_message(message);
|
||||
},
|
||||
calc_positions: function() {
|
||||
var current = this.get("right_offset");
|
||||
_.each(_.range(this.conversations.length), function(i) {
|
||||
this.conversations[i].set("bottom_position", this.get("bottom_offset"));
|
||||
this.conversations[i].set("right_position", current);
|
||||
current += this.conversations[i].$().outerWidth(true);
|
||||
}, this);
|
||||
},
|
||||
destroy: function() {
|
||||
$(window).off("unload", this.unload_event_handler);
|
||||
$(window).unbind("blur", this.blur_hdl);
|
||||
$(window).unbind("focus", this.focus_hdl);
|
||||
openerp.PropertiesMixin.destroy.call(this);
|
||||
}
|
||||
});
|
||||
|
||||
im_common.Conversation = openerp.Widget.extend({
|
||||
className: "openerp_style oe_im_chatview",
|
||||
events: {
|
||||
"keydown input": "send_message",
|
||||
"click .oe_im_chatview_close": "destroy",
|
||||
"click .oe_im_chatview_header": "show_hide"
|
||||
},
|
||||
init: function(parent, user, me, options) {
|
||||
this._super(parent);
|
||||
this.options = options;
|
||||
this.me = me;
|
||||
this.user = user;
|
||||
this.user.add_watcher();
|
||||
this.set("right_position", 0);
|
||||
this.set("bottom_position", 0);
|
||||
this.shown = true;
|
||||
this.set("pending", 0);
|
||||
this.inputPlaceholder = this.options.defaultInputPlaceholder;
|
||||
},
|
||||
start: function() {
|
||||
this.$().append(openerp.qweb.render("im_common.conversation", {widget: this, to_url: _.bind(im_common.connection.url, im_common.connection)}));
|
||||
var change_status = function() {
|
||||
this.$().toggleClass("oe_im_chatview_disconnected_status", this.user.get("im_status") === false);
|
||||
this.$(".oe_im_chatview_online").toggle(this.user.get("im_status") === true);
|
||||
this._go_bottom();
|
||||
};
|
||||
this.user.on("change:im_status", this, change_status);
|
||||
change_status.call(this);
|
||||
|
||||
this.on("change:right_position", this, this.calc_pos);
|
||||
this.on("change:bottom_position", this, this.calc_pos);
|
||||
this.full_height = this.$().height();
|
||||
this.calc_pos();
|
||||
this.on("change:pending", this, _.bind(function() {
|
||||
if (this.get("pending") === 0) {
|
||||
this.$(".oe_im_chatview_nbr_messages").text("");
|
||||
} else {
|
||||
this.$(".oe_im_chatview_nbr_messages").text("(" + this.get("pending") + ")");
|
||||
}
|
||||
}, this));
|
||||
},
|
||||
show_hide: function() {
|
||||
if (this.shown) {
|
||||
this.$().animate({
|
||||
height: this.$(".oe_im_chatview_header").outerHeight()
|
||||
});
|
||||
} else {
|
||||
this.$().animate({
|
||||
height: this.full_height
|
||||
});
|
||||
}
|
||||
this.shown = ! this.shown;
|
||||
if (this.shown) {
|
||||
this.set("pending", 0);
|
||||
}
|
||||
},
|
||||
calc_pos: function() {
|
||||
this.$().css("right", this.get("right_position"));
|
||||
this.$().css("bottom", this.get("bottom_position"));
|
||||
},
|
||||
received_message: function(message) {
|
||||
if (this.shown) {
|
||||
this.set("pending", 0);
|
||||
} else {
|
||||
this.set("pending", this.get("pending") + 1);
|
||||
}
|
||||
this._add_bubble(this.user, message.message, openerp.str_to_datetime(message.date));
|
||||
},
|
||||
send_message: function(e) {
|
||||
if(e && e.which !== 13) {
|
||||
return;
|
||||
}
|
||||
var mes = this.$("input").val();
|
||||
if (! mes.trim()) {
|
||||
return;
|
||||
}
|
||||
this.$("input").val("");
|
||||
var send_it = _.bind(function() {
|
||||
var model = im_common.connection.model("im.message");
|
||||
return model.call("post", [mes, this.user.get('id')], {uuid: this.me.get("uuid"), context: {}});
|
||||
}, this);
|
||||
var tries = 0;
|
||||
send_it().then(_.bind(function() {
|
||||
this._add_bubble(this.me, mes, new Date());
|
||||
}, this), function(error, e) {
|
||||
e.preventDefault();
|
||||
tries += 1;
|
||||
if (tries < 3)
|
||||
return send_it();
|
||||
});
|
||||
},
|
||||
_add_bubble: function(user, item, date) {
|
||||
var items = [item];
|
||||
if (user === this.last_user) {
|
||||
this.last_bubble.remove();
|
||||
items = this.last_items.concat(items);
|
||||
}
|
||||
this.last_user = user;
|
||||
this.last_items = items;
|
||||
var zpad = function(str, size) {
|
||||
str = "" + str;
|
||||
return new Array(size - str.length + 1).join('0') + str;
|
||||
};
|
||||
date = "" + zpad(date.getHours(), 2) + ":" + zpad(date.getMinutes(), 2);
|
||||
|
||||
this.last_bubble = $(openerp.qweb.render("im_common.conversation_bubble", {"items": items, "user": user, "time": date}));
|
||||
$(this.$(".oe_im_chatview_content").children()[0]).append(this.last_bubble);
|
||||
this._go_bottom();
|
||||
},
|
||||
_go_bottom: function() {
|
||||
this.$(".oe_im_chatview_content").scrollTop($(this.$(".oe_im_chatview_content").children()[0]).height());
|
||||
},
|
||||
focus: function() {
|
||||
this.$(".oe_im_chatview_input").focus();
|
||||
if (! this.shown)
|
||||
this.show_hide();
|
||||
},
|
||||
destroy: function() {
|
||||
this.user.remove_watcher();
|
||||
this.trigger("destroyed");
|
||||
return this._super();
|
||||
}
|
||||
});
|
||||
|
||||
return im_common;
|
||||
}
|
||||
|
||||
if (typeof(define) !== "undefined") {
|
||||
define(["jquery", "underscore", "openerp"], declare);
|
||||
} else {
|
||||
window.im_common = declare($, _, openerp);
|
||||
}
|
||||
|
||||
})();
|
|
@ -27,37 +27,4 @@
|
|||
<img t-att-src="_s +'/im/static/src/img/green.png'" class="oe_im_user_online"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="Conversation">
|
||||
<div class="oe_im_chatview">
|
||||
<div class="oe_im_chatview_header">
|
||||
<img t-att-src="_s +'/im/static/src/img/green.png'" class="oe_im_chatview_online"/>
|
||||
<t t-esc="widget.user.get('name') || 'Anonymous'"/>
|
||||
<scan class="oe_im_chatview_nbr_messages" />
|
||||
<button class="oe_im_chatview_close">×</button>
|
||||
</div>
|
||||
<div class="oe_im_chatview_disconnected">
|
||||
<t t-esc='_.str.sprintf(_t("%s is offline. He/She will receive your messages on his/her next connection."), widget.user.get("name") || "Anonymous")'/>
|
||||
</div>
|
||||
<div class="oe_im_chatview_content">
|
||||
<div></div>
|
||||
</div>
|
||||
<div class="oe_im_chatview_footer">
|
||||
<input class="oe_im_chatview_input" t-att-placeholder="_t('Say something...')" />
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="Conversation.bubble">
|
||||
<div class="oe_im_chatview_bubble">
|
||||
<div class="oe_im_chatview_clip">
|
||||
<img class="oe_im_chatview_avatar" t-att-src='user.get("image_url")'/>
|
||||
</div>
|
||||
<div class="oe_im_chatview_from"><t t-esc="user.get('name') || 'Anonymous'"/></div>
|
||||
<div class="oe_im_chatview_bubble_list">
|
||||
<t t-foreach="items" t-as="item">
|
||||
<div class="oe_im_chatview_bubble_item"><t t-esc="item"/></div>
|
||||
</t>
|
||||
</div>
|
||||
<div class="oe_im_chatview_time"><t t-esc="time"/></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<templates>
|
||||
<t t-name="im_common.conversation">
|
||||
<div class="oe_im_chatview_header">
|
||||
<img t-att-src="to_url('/im/static/src/img/green.png')" class="oe_im_chatview_online"/>
|
||||
<t t-esc="widget.user.get('name')"/>
|
||||
<scan class="oe_im_chatview_nbr_messages" />
|
||||
<button class="oe_im_chatview_close">×</button>
|
||||
</div>
|
||||
<div class="oe_im_chatview_disconnected">
|
||||
<t t-esc='widget.user.get("name") + _t(" is offline. He/She will receive your messages on his/her next connection.")'/>
|
||||
</div>
|
||||
<div class="oe_im_chatview_content">
|
||||
<div></div>
|
||||
</div>
|
||||
<div class="oe_im_chatview_footer">
|
||||
<input class="oe_im_chatview_input" t-att-placeholder="widget.inputPlaceholder" />
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="im_common.conversation_bubble">
|
||||
<div class="oe_im_chatview_bubble">
|
||||
<div class="oe_im_chatview_clip">
|
||||
<img class="oe_im_chatview_avatar" t-att-src="user.get('image_url')"/>
|
||||
</div>
|
||||
<div class="oe_im_chatview_from"><t t-esc="user.get('name')"/></div>
|
||||
<div class="oe_im_chatview_bubble_list">
|
||||
<t t-foreach="items" t-as="item">
|
||||
<div class="oe_im_chatview_bubble_item"><t t-esc="item"/></div>
|
||||
</t>
|
||||
</div>
|
||||
<div class="oe_im_chatview_time"><t t-esc="time"/></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
|
@ -161,9 +161,9 @@ class im_livechat_channel(osv.osv):
|
|||
|
||||
def get_available_user(self, cr, uid, channel_id, context=None):
|
||||
channel = self.browse(cr, openerp.SUPERUSER_ID, channel_id, context=context)
|
||||
im_user_ids = self.pool.get("im.user").search(cr, uid, [["user_id", "in", [user.id for user in channel.user_ids]]], context=context)
|
||||
users = []
|
||||
for user in channel.user_ids:
|
||||
iuid = self.pool.get("im.user").get_by_user_id(cr, uid, user.id, context=context)["id"]
|
||||
for iuid in im_user_ids:
|
||||
imuser = self.pool.get("im.user").browse(cr, uid, iuid, context=context)
|
||||
if imuser.im_status:
|
||||
users.append(imuser)
|
||||
|
@ -206,12 +206,12 @@ class im_message(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = False
|
||||
if record.to_id.user and record.from_id.user:
|
||||
if record.to_id.user_id and record.from_id.user_id:
|
||||
continue
|
||||
elif record.to_id.user:
|
||||
res[record.id] = record.to_id.user.id
|
||||
elif record.from_id.user:
|
||||
res[record.id] = record.from_id.user.id
|
||||
elif record.to_id.user_id:
|
||||
res[record.id] = record.to_id.user_id.id
|
||||
elif record.from_id.user_id:
|
||||
res[record.id] = record.from_id.user_id.id
|
||||
return res
|
||||
|
||||
def _customer(self, cr, uid, ids, name, arg, context=None):
|
||||
|
@ -230,11 +230,11 @@ class im_message(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = False
|
||||
if not not record.to_id.user and not not record.from_id.user:
|
||||
if not not record.to_id.user_id and not not record.from_id.user_id:
|
||||
continue
|
||||
elif not not record.to_id.user:
|
||||
elif not not record.to_id.user_id:
|
||||
res[record.id] = "c2s"
|
||||
elif not not record.from_id.user:
|
||||
elif not not record.from_id.user_id:
|
||||
res[record.id] = "s2c"
|
||||
return res
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
<field name="name">History</field>
|
||||
<field name="res_model">im.message</field>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="domain">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
|
||||
<field name="domain">["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]</field>
|
||||
</record>
|
||||
<menuitem name="History" parent="im_livechat" id="history" action="action_history" groups="group_im_livechat_manager"/>
|
||||
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
<script type="text/javascript" src="{{url}}/im_livechat/static/ext/static/js/require.js"></script>
|
||||
<script type="text/javascript" src="{{url}}/im_livechat/static/ext/static/lib/requirejs/require.js"></script>
|
||||
<script type="text/javascript" src='{{url}}/im_livechat/loader?p={{parameters | json | escape}}'></script>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue