diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index e06e41cf001..17c0a77c30f 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -154,12 +154,11 @@ for a particular financial year and for preparation of vouchers there is a modul
'test/account_period_close.yml',
'test/account_use_model.yml',
'test/account_validate_account_move.yml',
- 'test/account_fiscalyear_close.yml',
#'test/account_bank_statement.yml',
#'test/account_cash_statement.yml',
'test/test_edi_invoice.yml',
'test/account_report.yml',
- 'test/account_fiscalyear_close_state.yml', #last test, as it will definitively close the demo fiscalyear
+ 'test/account_fiscalyear_close.yml', #last test, as it will definitively close the demo fiscalyear
],
'installable': True,
'auto_install': False,
diff --git a/addons/account/account.py b/addons/account/account.py
index 21a5ce992d7..75936320e58 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -3047,6 +3047,20 @@ class wizard_multi_charts_accounts(osv.osv_memory):
'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sales and purchase rates or use the usual m2o fields. This last choice assumes that the set of tax defined for the chosen template is complete'),
}
+
+ def _get_chart_parent_ids(self, cr, uid, chart_template, context=None):
+ """ Returns the IDs of all ancestor charts, including the chart itself.
+ (inverse of child_of operator)
+
+ :param browse_record chart_template: the account.chart.template record
+ :return: the IDS of all ancestor charts, including the chart itself.
+ """
+ result = [chart_template.id]
+ while chart_template.parent_id:
+ chart_template = chart_template.parent_id
+ result.append(chart_template.id)
+ return result
+
def onchange_tax_rate(self, cr, uid, ids, rate=False, context=None):
return {'value': {'purchase_tax_rate': rate or False}}
@@ -3060,12 +3074,17 @@ class wizard_multi_charts_accounts(osv.osv_memory):
res['value'].update({'complete_tax_set': data.complete_tax_set, 'currency_id': currency_id})
if data.complete_tax_set:
# default tax is given by the lowest sequence. For same sequence we will take the latest created as it will be the case for tax created while isntalling the generic chart of account
- sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id"
- , "=", chart_template_id), ('type_tax_use', 'in', ('sale','all'))], order="sequence, id desc")
- purchase_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id"
- , "=", chart_template_id), ('type_tax_use', 'in', ('purchase','all'))], order="sequence, id desc")
- res['value'].update({'sale_tax': sale_tax_ids and sale_tax_ids[0] or False, 'purchase_tax': purchase_tax_ids and purchase_tax_ids[0] or False})
-
+ chart_ids = self._get_chart_parent_ids(cr, uid, data, context=context)
+ base_tax_domain = [("chart_template_id", "in", chart_ids), ('parent_id', '=', False)]
+ sale_tax_domain = base_tax_domain + [('type_tax_use', 'in', ('sale','all'))]
+ purchase_tax_domain = base_tax_domain + [('type_tax_use', 'in', ('purchase','all'))]
+ sale_tax_ids = tax_templ_obj.search(cr, uid, sale_tax_domain, order="sequence, id desc")
+ purchase_tax_ids = tax_templ_obj.search(cr, uid, purchase_tax_domain, order="sequence, id desc")
+ res['value'].update({'sale_tax': sale_tax_ids and sale_tax_ids[0] or False,
+ 'purchase_tax': purchase_tax_ids and purchase_tax_ids[0] or False})
+ res.setdefault('domain', {})
+ res['domain']['sale_tax'] = repr(sale_tax_domain)
+ res['domain']['purchase_tax'] = repr(purchase_tax_domain)
if data.code_digits:
res['value'].update({'code_digits': data.code_digits})
return res
@@ -3073,6 +3092,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
def default_get(self, cr, uid, fields, context=None):
res = super(wizard_multi_charts_accounts, self).default_get(cr, uid, fields, context=context)
tax_templ_obj = self.pool.get('account.tax.template')
+ account_chart_template = self.pool['account.chart.template']
if 'bank_accounts_id' in fields:
res.update({'bank_accounts_id': [{'acc_name': _('Cash'), 'account_type': 'cash'},{'acc_name': _('Bank'), 'account_type': 'bank'}]})
@@ -3086,23 +3106,28 @@ class wizard_multi_charts_accounts(osv.osv_memory):
currency_id = company_obj.on_change_country(cr, uid, company_id, country_id, context=context)['value']['currency_id']
res.update({'currency_id': currency_id})
- ids = self.pool.get('account.chart.template').search(cr, uid, [('visible', '=', True)], context=context)
+ ids = account_chart_template.search(cr, uid, [('visible', '=', True)], context=context)
if ids:
+ #in order to set default chart which was last created set max of ids.
+ chart_id = max(ids)
+ if context.get("default_charts"):
+ model_data = self.pool.get('ir.model.data').search_read(cr, uid, [('model','=','account.chart.template'),('module','=',context.get("default_charts"))], ['res_id'], context=context)
+ if model_data:
+ chart_id = model_data[0]['res_id']
+ chart = account_chart_template.browse(cr, uid, chart_id, context=context)
+ chart_hierarchy_ids = self._get_chart_parent_ids(cr, uid, chart, context=context)
if 'chart_template_id' in fields:
- #in order to get set default chart which was last created set max of ids.
- chart_id = max(ids)
- if context.get("default_charts"):
- model_data = self.pool.get('ir.model.data').search_read(cr, uid, [('model','=','account.chart.template'),('module','=',context.get("default_charts"))], ['res_id'], context=context)
- if model_data:
- chart_id = model_data[0]['res_id']
- res.update({'only_one_chart_template': len(ids) == 1, 'chart_template_id': chart_id})
+ res.update({'only_one_chart_template': len(ids) == 1,
+ 'chart_template_id': chart_id})
if 'sale_tax' in fields:
- sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id"
- , "=", ids[0]), ('type_tax_use', 'in', ('sale','all'))], order="sequence")
+ sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id", "in", chart_hierarchy_ids),
+ ('type_tax_use', 'in', ('sale','all'))],
+ order="sequence")
res.update({'sale_tax': sale_tax_ids and sale_tax_ids[0] or False})
if 'purchase_tax' in fields:
- purchase_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id"
- , "=", ids[0]), ('type_tax_use', 'in', ('purchase','all'))], order="sequence")
+ purchase_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id", "in", chart_hierarchy_ids),
+ ('type_tax_use', 'in', ('purchase','all'))],
+ order="sequence")
res.update({'purchase_tax': purchase_tax_ids and purchase_tax_ids[0] or False})
res.update({
'purchase_tax_rate': 15.0,
@@ -3370,12 +3395,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
obj_tax_temp = self.pool.get('account.tax.template')
chart_template = obj_wizard.chart_template_id
vals = {}
- # get the ids of all the parents of the selected account chart template
- current_chart_template = chart_template
- all_parents = [current_chart_template.id]
- while current_chart_template.parent_id:
- current_chart_template = current_chart_template.parent_id
- all_parents.append(current_chart_template.id)
+ all_parents = self._get_chart_parent_ids(cr, uid, chart_template, context=context)
# create tax templates and tax code templates from purchase_tax_rate and sale_tax_rate fields
if not chart_template.complete_tax_set:
value = obj_wizard.sale_tax_rate
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 1b7bd658faf..3cf10f477e2 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -463,7 +463,7 @@
-
+
diff --git a/addons/account/partner.py b/addons/account/partner.py
index a7df31b2f32..d0db2ed4f6c 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -113,7 +113,8 @@ class res_partner(osv.osv):
LEFT JOIN account_account a ON (l.account_id=a.id)
WHERE a.type IN ('receivable','payable')
AND l.partner_id IN %s
- AND l.reconcile_id IS NULL
+ AND (l.reconcile_id IS NULL OR
+ reconcile_id in (SELECT id FROM account_move_reconcile WHERE opening_reconciliation is TRUE))
AND """ + query + """
GROUP BY l.partner_id, a.type
""",
diff --git a/addons/account/static/src/js/account_move_line_quickadd.js b/addons/account/static/src/js/account_move_line_quickadd.js
index 0b904e19da6..997b2b03bb6 100644
--- a/addons/account/static/src/js/account_move_line_quickadd.js
+++ b/addons/account/static/src/js/account_move_line_quickadd.js
@@ -84,7 +84,7 @@ openerp.account.quickadd = function (instance) {
},
search_by_journal_period: function() {
var self = this;
- var domain = ['|',['debit', '!=', 0], ['credit', '!=', 0]];
+ var domain = [];
if (self.current_journal !== null) domain.push(["journal_id", "=", self.current_journal]);
if (self.current_period !== null) domain.push(["period_id", "=", self.current_period]);
self.last_context["journal_id"] = self.current_journal === null ? false : self.current_journal;
diff --git a/addons/account/test/account_fiscalyear_close.yml b/addons/account/test/account_fiscalyear_close.yml
index 1c3547ccefd..cc683ca8d46 100644
--- a/addons/account/test/account_fiscalyear_close.yml
+++ b/addons/account/test/account_fiscalyear_close.yml
@@ -4,20 +4,29 @@
!record {model: account.fiscalyear, id: account_fiscalyear_fiscalyear0}:
code: !eval "'FY%s'% (datetime.now().year+1)"
company_id: base.main_company
- date_start: !eval "'%s-01-01' %(datetime.now().year+1)"
- date_stop: !eval "'%s-12-31' %(datetime.now().year+1)"
- name: !eval "'Fiscal Year %s' %(datetime.now().year+1)"
+ date_start: !eval "'%s-01-01' %(datetime.now().year-1)"
+ date_stop: !eval "'%s-12-31' %(datetime.now().year-1)"
+ name: !eval "'Fiscal Year %s' %(datetime.now().year-1)"
-
- I create a period for the opening entries for the new fiscalyear
+ I generate periods for the new fiscalyear
-
- !record {model: account.period, id: account_period_jan11}:
- company_id: base.main_company
- date_start: !eval "'%s-01-01'% (datetime.now().year+1)"
- date_stop: !eval "'%s-01-01'% (datetime.now().year+1)"
- fiscalyear_id: account_fiscalyear_fiscalyear0
- name: !eval "'OP %s' %(datetime.now().year+1)"
- special: 1
-
+ !python {model: account.fiscalyear}: |
+ self.create_period(cr, uid, [ref("account_fiscalyear_fiscalyear0")])
+-
+ I create a new account invoice in the created fiscalyear
+-
+ !record {model: account.invoice, id: account_invoice_current1}:
+ partner_id: base.res_partner_2
+ date_invoice: !eval "'%s-01-02' %(datetime.now().year-1)"
+ invoice_line:
+ - partner_id: base.res_partner_2
+ quantity: 1.0
+ price_unit: 15.00
+ name: Bying stuff
+-
+ I validate the invoice
+-
+ !workflow {model: account.invoice, action: invoice_open, ref: account.account_invoice_current1}
-
I made modification in journal so it can move entries
-
@@ -31,19 +40,40 @@
company_id: base.main_company
centralisation: 1
-
- I called the Generate Fiscalyear Opening Entries wizard
+ I call the Generate Fiscalyear Opening Entries wizard
-
!record {model: account.fiscalyear.close, id: account_fiscalyear_close_0}:
- fy2_id: account_fiscalyear_fiscalyear0
- fy_id: account.data_fiscalyear
+ fy2_id: account.data_fiscalyear
+ fy_id: account_fiscalyear_fiscalyear0
journal_id: account.close_journal
- period_id: account_period_jan11
+ period_id: account.period_1
report_name: End of Fiscal Year Entry
-
I clicked on create Button
-
-
!python {model: account.fiscalyear.close}: |
self.data_save(cr, uid, [ref("account_fiscalyear_close_0")], {"lang": 'en_US',
"active_model": "ir.ui.menu", "active_ids": [ref("account.menu_wizard_fy_close")],
- "tz": False, "active_id": ref("account.menu_wizard_fy_close"), })
\ No newline at end of file
+ "tz": False, "active_id": ref("account.menu_wizard_fy_close"), })
+-
+ I close the previous fiscalyear
+-
+ !record {model: account.fiscalyear.close.state, id: account_fiscalyear_close_state_0}:
+ fy_id: account_fiscalyear_fiscalyear0
+-
+ I clicked on Close States Button to close fiscalyear
+-
+ !python {model: account.fiscalyear.close.state}: |
+ self.data_save(cr, uid, [ref("account_fiscalyear_close_state_0")], {"lang": 'en_US',
+ "active_model": "ir.ui.menu", "active_ids": [ref("account.menu_wizard_fy_close_state")],
+ "tz": False, "active_id": ref("account.menu_wizard_fy_close_state"), })
+-
+ I check that the fiscalyear state is now "Done"
+-
+ !assert {model: account.fiscalyear, id: account_fiscalyear_fiscalyear0, string: Fiscal Year is in Done state}:
+ - state == 'done'
+-
+ I check that the past accounts are taken into account in partner credit
+-
+ !assert {model: res.partner, id: base.res_partner_2, string: Total Receivable does not takes unreconciled moves of previous years}:
+ - credit == 15.0
diff --git a/addons/account/test/account_fiscalyear_close_state.yml b/addons/account/test/account_fiscalyear_close_state.yml
deleted file mode 100644
index 18c7dd570ed..00000000000
--- a/addons/account/test/account_fiscalyear_close_state.yml
+++ /dev/null
@@ -1,19 +0,0 @@
--
- I run the Close a Fiscalyear wizard to close the demo fiscalyear
--
- !record {model: account.fiscalyear.close.state, id: account_fiscalyear_close_state_0}:
- fy_id: data_fiscalyear
--
- I clicked on Close States Button to close fiscalyear
-
--
- !python {model: account.fiscalyear.close.state}: |
- self.data_save(cr, uid, [ref("account_fiscalyear_close_state_0")], {"lang": 'en_US',
- "active_model": "ir.ui.menu", "active_ids": [ref("account.menu_wizard_fy_close_state")],
- "tz": False, "active_id": ref("account.menu_wizard_fy_close_state"), })
--
- I check that the fiscalyear state is now "Done"
--
- !assert {model: account.fiscalyear, id: data_fiscalyear, string: Fiscal Year is in Done state}:
- - state == 'done'
-
diff --git a/addons/account_analytic_analysis/i18n/zh_CN.po b/addons/account_analytic_analysis/i18n/zh_CN.po
index 7df872756b7..3bcf3f4406b 100644
--- a/addons/account_analytic_analysis/i18n/zh_CN.po
+++ b/addons/account_analytic_analysis/i18n/zh_CN.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
-"PO-Revision-Date: 2013-01-30 03:58+0000\n"
-"Last-Translator: Wei \"oldrev\" Li \n"
+"PO-Revision-Date: 2013-10-18 02:59+0000\n"
+"Last-Translator: padola \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2013-09-12 05:47+0000\n"
-"X-Generator: Launchpad (build 16761)\n"
+"X-Launchpad-Export-Date: 2013-10-19 04:59+0000\n"
+"X-Generator: Launchpad (build 16807)\n"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -67,6 +67,10 @@ msgid ""
"to\n"
" define the customer invoice price rate."
msgstr ""
+"当发票符合计工单,OpenERP将使用\n"
+" 合同使用价目表价格\n"
+" 产品设置应用到每个员工\n"
+" 指定客户发票价格率。"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -144,6 +148,15 @@ msgid ""
"
\n"
" "
msgstr ""
+"\n"
+" 点击以确立一个新合同\n"
+"
\n"
+" 你将发现合同已经更新,由于已过期或者工作流\n"
+" 授权超过最大数\n"
+"
\n"
+" OpenERP会自动更新挂起状态的合同,商谈结束,\n"
+" 销售员必须关闭或更新挂起的合同.\n"
+" "
#. module: account_analytic_analysis
#: view:account.analytic.account:0
@@ -153,7 +166,7 @@ msgstr "截止日期"
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Account Manager"
-msgstr "会计经理"
+msgstr "分管会计"
#. module: account_analytic_analysis
#: help:account.analytic.account,remaining_hours_to_invoice:0
@@ -595,7 +608,7 @@ msgstr "总时间"
#: model:res.groups,comment:account_analytic_analysis.group_template_required
msgid ""
"the field template of the analytic accounts and contracts will be required."
-msgstr ""
+msgstr "这个分析账户和合同的字段模板是必填的"
#. module: account_analytic_analysis
#: field:account.analytic.account,invoice_on_timesheets:0
diff --git a/addons/account_followup/account_followup.py b/addons/account_followup/account_followup.py
index 715860cab83..9237282ad80 100644
--- a/addons/account_followup/account_followup.py
+++ b/addons/account_followup/account_followup.py
@@ -185,7 +185,7 @@ class res_partner(osv.osv):
return {}
data['partner_ids'] = wizard_partner_ids
datas = {
- 'ids': [],
+ 'ids': wizard_partner_ids,
'model': 'account_followup.followup',
'form': data
}
diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py
index c14b5c071f6..00ecab7b860 100644
--- a/addons/account_followup/wizard/account_followup_print.py
+++ b/addons/account_followup/wizard/account_followup_print.py
@@ -50,9 +50,9 @@ class account_followup_stat_by_partner(osv.osv):
# to send him follow-ups separately . An assumption that the number of companies will not
# reach 10 000 records is made, what should be enough for a time.
cr.execute("""
- create or replace view account_followup_stat_by_partner as (
+ create view account_followup_stat_by_partner as (
SELECT
- l.partner_id * 10000 + l.company_id as id,
+ l.partner_id * 10000::bigint + l.company_id as id,
l.partner_id AS partner_id,
min(l.date) AS date_move,
max(l.date) AS date_move_last,
@@ -67,11 +67,10 @@ class account_followup_stat_by_partner(osv.osv):
a.active AND
a.type = 'receivable' AND
l.reconcile_id is NULL AND
- l.partner_id IS NOT NULL AND
- (l.blocked = False)
+ l.partner_id IS NOT NULL
GROUP BY
l.partner_id, l.company_id
- )""") #Blocked is to take into account litigation
+ )""")
class account_followup_sending_results(osv.osv_memory):
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 4674d62b6a0..41d3c6fc1f6 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -130,7 +130,7 @@
-
+
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 5d259772363..1169d5ef7c3 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -12,7 +12,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index dc732129803..e35061e1836 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -11,7 +11,7 @@
-
+
@@ -33,7 +33,7 @@
-
+
diff --git a/addons/auth_signup/auth_signup_data.xml b/addons/auth_signup/auth_signup_data.xml
index 31e3b61a9f6..1b4e3e05502 100644
--- a/addons/auth_signup/auth_signup_data.xml
+++ b/addons/auth_signup/auth_signup_data.xml
@@ -22,7 +22,7 @@
Reset Password
- ]]>
+ ]]>
${object.email}
Password reset
OpenERP Enterprise Connection
- ]]>
+ ]]>
${object.email}
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 3497255fa76..59d61ba5b67 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -63,7 +63,10 @@ class base_action_rule(osv.osv):
'sequence': fields.integer('Sequence',
help="Gives the sequence order when displaying a list of rules."),
'kind': fields.selection(
- [('on_create', 'On Creation'), ('on_write', 'On Update'), ('on_time', 'Based on Timed Condition')],
+ [('on_create', 'On Creation'),
+ ('on_write', 'On Update'),
+ ('on_create_or_write', 'On Creation & Update'),
+ ('on_time', 'Based on Timed Condition')],
string='When to Run'),
'trg_date_id': fields.many2one('ir.model.fields', string='Trigger Date',
help="When should the condition be triggered. If present, will be checked by the scheduler. If empty, will be checked at creation and update.",
@@ -97,9 +100,9 @@ class base_action_rule(osv.osv):
def onchange_kind(self, cr, uid, ids, kind, context=None):
clear_fields = []
- if kind == 'on_create':
+ if kind in ['on_create', 'on_create_or_write']:
clear_fields = ['filter_pre_id', 'trg_date_id', 'trg_date_range', 'trg_date_range_type']
- elif kind == 'on_write':
+ elif kind in ['on_write', 'on_create_or_write']:
clear_fields = ['trg_date_id', 'trg_date_range', 'trg_date_range_type']
elif kind == 'on_time':
clear_fields = ['filter_pre_id']
@@ -156,7 +159,7 @@ class base_action_rule(osv.osv):
new_id = old_create(cr, uid, vals, context=context)
# retrieve the action rules to run on creation
- action_dom = [('model', '=', model), ('kind', '=', 'on_create')]
+ action_dom = [('model', '=', model), ('kind', 'in', ['on_create', 'on_create_or_write'])]
action_ids = self.search(cr, uid, action_dom, context=context)
# check postconditions, and execute actions on the records that satisfy them
@@ -180,7 +183,7 @@ class base_action_rule(osv.osv):
ids = [ids] if isinstance(ids, (int, long, str)) else ids
# retrieve the action rules to run on update
- action_dom = [('model', '=', model), ('kind', '=', 'on_write')]
+ action_dom = [('model', '=', model), ('kind', 'in', ['on_write', 'on_create_or_write'])]
action_ids = self.search(cr, uid, action_dom, context=context)
actions = self.browse(cr, uid, action_ids, context=context)
diff --git a/addons/contacts/i18n/ja.po b/addons/contacts/i18n/ja.po
new file mode 100644
index 00000000000..bffe561379e
--- /dev/null
+++ b/addons/contacts/i18n/ja.po
@@ -0,0 +1,37 @@
+# Japanese translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2013-10-22 03:49+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Japanese \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-10-22 04:44+0000\n"
+"X-Generator: Launchpad (build 16807)\n"
+
+#. module: contacts
+#: model:ir.actions.act_window,help:contacts.action_contacts
+msgid ""
+"\n"
+" Click to add a contact in your address book.\n"
+"
\n"
+" OpenERP helps you easily track all activities related to\n"
+" a customer; discussions, history of business opportunities,\n"
+" documents, etc.\n"
+"
\n"
+" "
+msgstr ""
+
+#. module: contacts
+#: model:ir.actions.act_window,name:contacts.action_contacts
+#: model:ir.ui.menu,name:contacts.menu_contacts
+msgid "Contacts"
+msgstr "連絡先"
diff --git a/addons/crm/base_partner_merge.py b/addons/crm/base_partner_merge.py
index 42e1ab7c7ec..c73b5fdf599 100644
--- a/addons/crm/base_partner_merge.py
+++ b/addons/crm/base_partner_merge.py
@@ -235,9 +235,12 @@ class MergePartnerAutomatic(osv.TransientModel):
record_ids = proxy.search(cr, openerp.SUPERUSER_ID, domain, context=context)
for record in proxy.browse(cr, openerp.SUPERUSER_ID, record_ids, context=context):
- proxy_model = self.pool[record.model]
-
- field_type = proxy_model._columns.get(record.name).__class__._type
+ try:
+ proxy_model = self.pool[record.model]
+ field_type = proxy_model._columns[record.name].__class__._type
+ except KeyError:
+ # unknown model or field => skip
+ continue
if field_type == 'function':
continue
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index bb080a95399..c580fd728e2 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -352,10 +352,14 @@ class crm_lead(format_address, osv.osv):
"""
if isinstance(cases, (int, long)):
cases = self.browse(cr, uid, cases, context=context)
+ if context is None:
+ context = {}
+ # check whether we should try to add a condition on type
+ avoid_add_type_term = any([term for term in domain if len(term) == 3 if term[0] == 'type'])
# collect all section_ids
section_ids = set()
types = ['both']
- if not cases:
+ if not cases and context.get('default_type'):
ctx_type = context.get('default_type')
types += [ctx_type]
if section_id:
@@ -373,7 +377,8 @@ class crm_lead(format_address, osv.osv):
search_domain.append(('section_ids', '=', section_id))
search_domain.append(('case_default', '=', True))
# AND with cases types
- search_domain.append(('type', 'in', types))
+ if not avoid_add_type_term:
+ search_domain.append(('type', 'in', types))
# AND with the domain in parameter
search_domain += list(domain)
# perform search, return the first found
@@ -607,10 +612,12 @@ class crm_lead(format_address, osv.osv):
opportunities = self.browse(cr, uid, ids, context=context)
sequenced_opps = []
+ # Sorting the leads/opps according to the confidence level of its stage, which relates to the probability of winning it
+ # The confidence level increases with the stage sequence, except when the stage probability is 0.0 (Lost cases)
+ # An Opportunity always has higher confidence level than a lead, unless its stage probability is 0.0
for opportunity in opportunities:
sequence = -1
- # TDE: was "if opportunity.stage_id and opportunity.stage_id.state != 'cancel':"
- if opportunity.probability == 0 and opportunity.stage_id and opportunity.stage_id.sequence != 1 and opportunity.stage_id.fold:
+ if opportunity.stage_id and (opportunity.stage_id.probability != 0 or opportunity.stage_id.sequence == 1):
sequence = opportunity.stage_id.sequence
sequenced_opps.append(((int(sequence != -1 and opportunity.type == 'opportunity'), sequence, -opportunity.id), opportunity))
diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml
index 3b253b1c3d4..7550396e886 100644
--- a/addons/crm_partner_assign/crm_lead_view.xml
+++ b/addons/crm_partner_assign/crm_lead_view.xml
@@ -8,7 +8,7 @@
-
+
@@ -78,7 +78,7 @@
-
+
diff --git a/addons/crm_partner_assign/crm_portal_view.xml b/addons/crm_partner_assign/crm_portal_view.xml
index ab4cf8868db..2b2b61c8425 100644
--- a/addons/crm_partner_assign/crm_portal_view.xml
+++ b/addons/crm_partner_assign/crm_portal_view.xml
@@ -59,6 +59,10 @@
+
+
+
+
@@ -145,6 +149,10 @@
+
+
+
+
diff --git a/addons/crm_partner_assign/res_partner_view.xml b/addons/crm_partner_assign/res_partner_view.xml
index 6823c262f02..734d5a31e95 100644
--- a/addons/crm_partner_assign/res_partner_view.xml
+++ b/addons/crm_partner_assign/res_partner_view.xml
@@ -138,6 +138,7 @@
+
+ icon="gtk-convert"
+ attrs="{'invisible':[('type','=','opportunity')]}" />
HR - Employess Kanban
hr.employee
+ 10
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 008c711a1f0..1af2fc00193 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -26,6 +26,7 @@ import math
import time
from operator import attrgetter
+from openerp.exceptions import Warning
from openerp import tools
from openerp.osv import fields, osv
from openerp.tools.translate import _
@@ -149,6 +150,8 @@ class hr_holidays(osv.osv):
return False
return True
+ _check_holidays = lambda self, cr, uid, ids, context=None: self.check_holidays(cr, uid, ids, context=context)
+
_columns = {
'name': fields.char('Description', size=64),
'state': fields.selection([('draft', 'To Submit'), ('cancel', 'Cancelled'),('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')],
@@ -188,6 +191,7 @@ class hr_holidays(osv.osv):
}
_constraints = [
(_check_date, 'You can not have 2 leaves that overlaps on same day!', ['date_from','date_to']),
+ (_check_holidays, 'The number of remaining leaves is not sufficient for this leave type', ['state','number_of_days_temp'])
]
_sql_constraints = [
@@ -314,7 +318,6 @@ class hr_holidays(osv.osv):
context = {}
context = dict(context, mail_create_nolog=True)
hol_id = super(hr_holidays, self).create(cr, uid, values, context=context)
- self.check_holidays(cr, uid, [hol_id], context=context)
return hol_id
def holidays_reset(self, cr, uid, ids, context=None):
@@ -333,7 +336,6 @@ class hr_holidays(osv.osv):
return True
def holidays_first_validate(self, cr, uid, ids, context=None):
- self.check_holidays(cr, uid, ids, context=context)
obj_emp = self.pool.get('hr.employee')
ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)])
manager = ids2 and ids2[0] or False
@@ -341,7 +343,6 @@ class hr_holidays(osv.osv):
return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager})
def holidays_validate(self, cr, uid, ids, context=None):
- self.check_holidays(cr, uid, ids, context=context)
obj_emp = self.pool.get('hr.employee')
ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)])
manager = ids2 and ids2[0] or False
@@ -393,7 +394,6 @@ class hr_holidays(osv.osv):
return True
def holidays_confirm(self, cr, uid, ids, context=None):
- self.check_holidays(cr, uid, ids, context=context)
for record in self.browse(cr, uid, ids, context=context):
if record.employee_id and record.employee_id.parent_id and record.employee_id.parent_id.user_id:
self.message_subscribe_users(cr, uid, [record.id], user_ids=[record.employee_id.parent_id.user_id.id], context=context)
@@ -429,12 +429,10 @@ class hr_holidays(osv.osv):
if record.holiday_type != 'employee' or record.type != 'remove' or not record.employee_id or record.holiday_status_id.limit:
continue
leave_days = self.pool.get('hr.holidays.status').get_days(cr, uid, [record.holiday_status_id.id], record.employee_id.id, context=context)[record.holiday_status_id.id]
- if leave_days['remaining_leaves'] < record.number_of_days_temp:
- raise osv.except_osv(_('Warning!'),
- _('There are not enough remaining days available in %s for employee %s.') % (record.holiday_status_id.name, record.employee_id.name))
- if leave_days['virtual_remaining_leaves'] < record.number_of_days_temp:
- raise osv.except_osv(_('Warning!'),
- _('Other pending requests already book too much days in %s for employee %s.') % (record.holiday_status_id.name, record.employee_id.name))
+ if leave_days['remaining_leaves'] < 0 or leave_days['virtual_remaining_leaves'] < 0:
+ # Raising a warning gives a more user-friendly feedback than the default constraint error
+ raise Warning(_('The number of remaining leaves is not sufficient for this leave type.\n'
+ 'Please verify also the leaves waiting for validation.'))
return True
# -----------------------------
diff --git a/addons/hr_holidays/hr_holidays_workflow.xml b/addons/hr_holidays/hr_holidays_workflow.xml
index 14cbc48138a..b563dbf68d4 100644
--- a/addons/hr_holidays/hr_holidays_workflow.xml
+++ b/addons/hr_holidays/hr_holidays_workflow.xml
@@ -23,6 +23,7 @@
draft
+
function
holidays_reset()
@@ -30,7 +31,7 @@
confirm
- True
+
function
holidays_confirm()
OR
diff --git a/addons/hr_holidays/tests/test_holidays_flow.py b/addons/hr_holidays/tests/test_holidays_flow.py
index caa6e14f2db..9b678e426d0 100644
--- a/addons/hr_holidays/tests/test_holidays_flow.py
+++ b/addons/hr_holidays/tests/test_holidays_flow.py
@@ -23,6 +23,7 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta
from openerp.addons.hr_holidays.tests.common import TestHrHolidaysBase
+from openerp.exceptions import Warning
from openerp.osv.orm import except_orm
from openerp.tools import mute_logger
@@ -203,5 +204,5 @@ class TestHolidaysFlow(TestHrHolidaysBase):
'date_to': (datetime.today() + relativedelta(days=7)),
'number_of_days_temp': 4,
})
- with self.assertRaises(except_orm):
+ with self.assertRaises(Warning):
self.hr_holidays.signal_confirm(cr, self.user_hrmanager_id, [hol2_id])
diff --git a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml
index 05326bb19c1..49243e501f2 100644
--- a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml
+++ b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice.yml
@@ -79,7 +79,15 @@
I click on "Create Invoice" button of "Invoice analytic Line" wizard to create invoice.
-
!python {model: hr.timesheet.invoice.create}: |
- self.do_create(cr, uid, [ref("hr_timesheet_invoice_create_0")], {"active_ids": [ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule0")]})
+ action_result = self.do_create(cr, uid, [ref("hr_timesheet_invoice_create_0")], {
+ "active_ids": [ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule0")]
+ })
+ invoice_pool = self.pool.get('account.invoice')
+ invoice_domain = action_result['domain']
+ invoice_ids = invoice_pool.search(cr, uid, invoice_domain)
+ invoice_pool.write(cr, uid, invoice_ids, {'origin': 'test-hrtsic0_id_'+str( ref("hr_timesheet_invoice_create_0")) \
+ + '_aaldyfhrm0_id_'+str( ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule0") ) })
+
-
I check that Invoice is created for this timesheet.
-
@@ -90,7 +98,9 @@
partner = aline.account_id.partner_id.id
invoice_obj = self.pool.get('account.invoice')
- invoice_ids = invoice_obj.search(cr, uid, [('partner_id', '=', partner)])
+ invoice_ids = invoice_obj.search(cr, uid, [('partner_id', '=', partner),
+ ('origin', '=', 'test-hrtsic0_id_'+str( ref("hr_timesheet_invoice_create_0")) + '_aaldyfhrm0_id_'+str( ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule0") ))
+ ])
invoice_id = invoice_obj.browse(cr, uid, invoice_ids)[0]
for invoice in invoice_id.invoice_line:
@@ -102,4 +112,4 @@
assert aline.invoice_id, "Invoice created, but analytic line wasn't updated."
assert aline.invoice_id == invoice_id, "Invoice doesn't match the one at analytic line"
assert invoice_id.amount_untaxed == 187.5, "Invoice amount mismatch: %s" % invoice_id.amount_untaxed
- assert invoice_id.amount_tax == 50, "Invoice tax mismatch: %s" % invoice_id.amount_tax
\ No newline at end of file
+ assert invoice_id.amount_tax == 50, "Invoice tax mismatch: %s" % invoice_id.amount_tax
diff --git a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice_no_prod_tax.yml b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice_no_prod_tax.yml
index 88675f3042f..c3a5fae866c 100644
--- a/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice_no_prod_tax.yml
+++ b/addons/hr_timesheet_invoice/test/test_hr_timesheet_invoice_no_prod_tax.yml
@@ -78,7 +78,14 @@
I click on "Create Invoice" button of "Invoice analytic Line" wizard to create invoice.
-
!python {model: hr.timesheet.invoice.create}: |
- self.do_create(cr, uid, [ref("hr_timesheet_invoice_create_0")], {"active_ids": [ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule1")]})
+ action_result = self.do_create(cr, uid, [ref("hr_timesheet_invoice_create_0")], {
+ "active_ids": [ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule1")]
+ })
+ invoice_pool = self.pool.get('account.invoice')
+ invoice_domain = action_result['domain']
+ invoice_ids = invoice_pool.search(cr, uid, invoice_domain)
+ invoice_pool.write(cr, uid, invoice_ids, {'origin': 'test-hrtsic0_id_'+str( ref("hr_timesheet_invoice_create_0"))\
+ + '_aaldyfhrm1_id_'+str( ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule1") ) })
-
I check that Invoice is created for this timesheet.
-
@@ -89,7 +96,10 @@
partner = aline.account_id.partner_id.id
invoice_obj = self.pool.get('account.invoice')
- invoice_ids = invoice_obj.search(cr, uid, [('partner_id', '=', partner)])
+ invoice_ids = invoice_obj.search(cr, uid, [('partner_id', '=', partner),
+ ('origin', '=', 'test-hrtsic0_id_'+str( ref("hr_timesheet_invoice_create_0")) + '_aaldyfhrm1_id_'+str( ref("hr_timesheet_invoice.account_analytic_line_developyamlforhrmodule1") ))
+ ])
+
invoice_id = invoice_obj.browse(cr, uid, invoice_ids)[0]
for invoice in invoice_id.invoice_line:
@@ -101,4 +111,4 @@
assert aline.invoice_id, "Invoice created, but analytic line wasn't updated."
assert aline.invoice_id == invoice_id, "Invoice doesn't match the one at analytic line"
assert invoice_id.amount_untaxed == 187.5, "Invoice amount mismatch: %s" % invoice_id.amount_untaxed
- assert invoice_id.amount_tax == 40, "Invoice tax mismatch: %s" % invoice_id.amount_tax
\ No newline at end of file
+ assert invoice_id.amount_tax == 40, "Invoice tax mismatch: %s" % invoice_id.amount_tax
diff --git a/addons/l10n_br/data/account_tax_template.xml b/addons/l10n_br/data/account_tax_template.xml
index 1e6efd5c616..c3ecf449838 100644
--- a/addons/l10n_br/data/account_tax_template.xml
+++ b/addons/l10n_br/data/account_tax_template.xml
@@ -242,6 +242,22 @@
+
+ IPI 24%
+ IPI Saída 24%
+ 0.24
+ sale
+
+
+
+
+
+
+
+
+
+
+
IPI 25%
IPI Saída 25%
@@ -386,6 +402,22 @@
+
+ IPI 300%
+ IPI Saída 300%
+ 3.00
+ sale
+
+
+
+
+
+
+
+
+
+
+
IPI 330%
IPI Saída 330%
@@ -642,6 +674,22 @@
+
+ IPI 24%
+ IPI Entrada 24%
+ 0.24
+ purchase
+
+
+
+
+
+
+
+
+
+
+
IPI 25%
IPI Entrada 25%
@@ -786,6 +834,22 @@
+
+ IPI 300%
+ IPI Entrada 300%
+ 3.00
+ purchase
+
+
+
+
+
+
+
+
+
+
+
IPI 330%
IPI Entrada 330%
diff --git a/addons/l10n_fr/fr_fiscal_templates.xml b/addons/l10n_fr/fr_fiscal_templates.xml
index a7e202d47b8..bf49d15e08c 100644
--- a/addons/l10n_fr/fr_fiscal_templates.xml
+++ b/addons/l10n_fr/fr_fiscal_templates.xml
@@ -2,6 +2,12 @@
+
+
+
+
@@ -28,38 +34,53 @@
-
+
-
+
+
+
+
+
+
-
-
+
+
-
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
@@ -70,7 +91,18 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -81,18 +113,29 @@
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -103,7 +146,18 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -117,31 +171,46 @@
-
+
-
+
+
+
+
+
+
-
-
+
+
-
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
@@ -149,31 +218,47 @@
-
+
-
+
+
+
+
+
+
-
-
+
+
-
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
diff --git a/addons/l10n_fr/fr_pcg_taxes.xml b/addons/l10n_fr/fr_pcg_taxes.xml
index 2279b077383..a64f1d0087c 100644
--- a/addons/l10n_fr/fr_pcg_taxes.xml
+++ b/addons/l10n_fr/fr_pcg_taxes.xml
@@ -4,11 +4,11 @@
Plan de Taxes France
@@ -20,24 +20,42 @@
1.00
+
+ Base H.T. 20.0%
+ TVA collectée 20.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 19.6%
TVA collectée 19.6% (Base H.T.)
1.00
-
+
Base H.T. 8.5%
TVA collectée 8.5% (Base H.T.)
1.00
+
+ Base H.T. 10.0%
+ TVA collectée 10.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 7.0%
TVA collectée 7.0% (Base H.T.)
1.00
+
+ Base H.T. 5.0%
+ TVA collectée 5.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 5.5%
TVA collectée 5.5% (Base H.T.)
@@ -57,6 +75,12 @@
1.00
+
+ TVA 20.0%
+ TVA collectée 20.0%
+
+ 1.00
+
TVA 19.6%
TVA collectée 19.6%
@@ -68,6 +92,12 @@
TVA collectée 8.5%
1.00
+
+
+ TVA 10.0%
+ TVA collectée 10.0%
+
+ 1.00
TVA 7.0%
@@ -75,6 +105,12 @@
1.00
+
+ TVA 5.0%
+ TVA collectée 5.0%
+
+ 1.00
+
TVA 5.5%
TVA collectée 5.5%
@@ -88,14 +124,18 @@
1.00
-
-
Base H.T. TVA acquittée
c)
1.00
+
+ Base H.T. 20.0%
+ TVA acquittée 20.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 19.6%
TVA acquittée 19.6% (Base H.T.)
@@ -108,12 +148,24 @@
1.00
+
+ Base H.T. 10.0%
+ TVA acquittée 10.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 7.0%
TVA acquittée 7.0% (Base H.T.)
1.00
+
+ Base H.T. 5.0%
+ TVA acquittée 5.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 5.5%
TVA acquittée 5.5% (Base H.T.)
@@ -133,6 +185,12 @@
1.00
+
+ TVA 20.0%
+ TVA acquittée 20.0%
+
+ 1.00
+
TVA 19.6%
TVA acquittée 19.6%
@@ -145,12 +203,24 @@
1.00
+
+ TVA 10.0%
+ TVA acquittée 10.0%
+
+ 1.00
+
TVA 7.0%
TVA acquittée 7.0%
1.00
+
+ TVA 5.0%
+ TVA acquittée 5.0%
+
+ 1.00
+
TVA 5.5%
TVA acquittée 5.5%
@@ -171,7 +241,13 @@
e)
1.00
-
+
+
+ Base H.T. 20.0%
+ TVA acquittée sur immobilisations 20.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 19.6%
TVA acquittée sur immobilisations 19.6% (Base H.T.)
@@ -184,12 +260,24 @@
1.00
+
+ Base H.T. 10.0%
+ TVA acquittée sur immobilisations 10.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 7.0%
TVA acquittée sur immobilisations 7.0% (Base H.T.)
1.00
+
+ Base H.T. 5.0%
+ TVA acquittée sur immobilisations 5.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 5.5%
TVA acquittée sur immobilisations 5.5% (Base H.T.)
@@ -209,7 +297,13 @@
f)
1.00
-
+
+
+ TVA 20.0%
+ TVA acquittée sur immobilisations 20.0%
+
+ 1.00
+
TVA 19.6%
TVA acquittée sur immobilisations 19.6%
@@ -222,12 +316,24 @@
1.00
+
+ TVA 10.0%
+ TVA acquittée sur immobilisations 10.0%
+
+ 1.00
+
TVA 7.0%
TVA acquittée sur immobilisations 7.0%
1.00
+
+ TVA 5.0%
+ TVA acquittée sur immobilisations 5.0%
+
+ 1.00
+
TVA 5.5%
TVA acquittée sur immobilisations 5.5%
@@ -246,7 +352,13 @@
g)
1.00
-
+
+
+ Base H.T. 20.0%
+ TVA due intracommunautaire 20.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 19.6%
TVA due intracommunautaire 19.6% (Base H.T.)
@@ -259,12 +371,24 @@
1.00
+
+ Base H.T. 10.0%
+ TVA due intracommunautaire 10.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 7.0%
TVA due intracommunautaire 7.0% (Base H.T.)
1.00
+
+ Base H.T. 5.0%
+ TVA due intracommunautaire 5.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 5.5%
TVA due intracommunautaire 5.5% (Base H.T.)
@@ -283,7 +407,13 @@
h)
1.00
-
+
+
+ TVA 20.0%
+ TVA due intracommunautaire 20.0%
+
+ 1.00
+
TVA 19.6%
TVA due intracommunautaire 19.6%
@@ -296,12 +426,24 @@
1.00
+
+ TVA 10.0%
+ TVA due intracommunautaire 10.0%
+
+ 1.00
+
TVA 7.0%
TVA due intracommunautaire 7.0%
1.00
+
+ TVA 5.0%
+ TVA due intracommunautaire 5.0%
+
+ 1.00
+
TVA 5.5%
TVA due intracommunautaire 5.5%
@@ -321,7 +463,13 @@
i)
1.00
-
+
+
+ Base H.T. 20.0%
+ TVA déductible intracommunautaire 20.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 19.6%
TVA déductible intracommunautaire 19.6% (Base H.T.)
@@ -334,12 +482,24 @@
1.00
+
+ Base H.T. 10.0%
+ TVA déductible intracommunautaire 10.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 7.0%
TVA déductible intracommunautaire 7.0% (Base H.T.)
1.00
+
+ Base H.T. 5.0%
+ TVA déductible intracommunautaire 5.0% (Base H.T.)
+
+ 1.00
+
Base H.T. 5.5%
TVA déductible intracommunautaire 5.5% (Base H.T.)
@@ -358,7 +518,13 @@
j)
1.00
-
+
+
+ TVA 20.0%
+ TVA déductible intracommunautaire 20.0%
+
+ 1.00
+
TVA 19.6%
TVA déductible intracommunautaire 19.6%
@@ -371,12 +537,24 @@
1.00
+
+ TVA 10.0%
+ TVA déductible intracommunautaire 10.0%
+
+ 1.00
+
TVA 7.0%
TVA déductible intracommunautaire 7.0%
1.00
+
+ TVA 5.0%
+ TVA déductible intracommunautaire 5.0%
+
+ 1.00
+
TVA 5.5%
TVA déductible intracommunautaire 5.5%
diff --git a/addons/l10n_fr/fr_tax.xml b/addons/l10n_fr/fr_tax.xml
index 7cd3a36f54a..7c75136bdd3 100644
--- a/addons/l10n_fr/fr_tax.xml
+++ b/addons/l10n_fr/fr_tax.xml
@@ -9,6 +9,28 @@
+
+ TVA collectée (vente) 20,0%
+ 20.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sale
+
+
+
TVA collectée (vente) 19,6%
19.6
@@ -26,7 +48,7 @@
-
+
sale
@@ -52,7 +74,29 @@
sale
-
+
+
+ TVA collectée (vente) 10,0%
+ 10.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sale
+
+
+
TVA collectée (vente) 7,0%
7.0
@@ -63,8 +107,8 @@
-
-
+
+
@@ -75,6 +119,28 @@
+
+ TVA collectée (vente) 5,0%
+ 5.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sale
+
+
+
TVA collectée (vente) 5,5%
5.5
@@ -85,8 +151,8 @@
-
-
+
+
@@ -121,6 +187,28 @@
+
+ TVA déductible (achat) 20,0%
+ ACH-20.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 19,6%
ACH-19.6
@@ -138,7 +226,7 @@
-
+
purchase
@@ -164,7 +252,29 @@
purchase
-
+
+
+ TVA déductible (achat) 10,0%
+ ACH-10.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 7,0%
ACH-7.0
@@ -187,6 +297,28 @@
+
+ TVA déductible (achat) 5,0%
+ ACH-5.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 5,5%
ACH-5.5
@@ -233,6 +365,29 @@
+
+ TVA déductible (achat) 20,0% TTC
+ ACH-20.0-TTC
+
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 19,6% TTC
ACH-19.6-TTC
@@ -278,7 +433,30 @@
purchase
-
+
+
+ TVA déductible (achat) 10,0% TTC
+ ACH-10.0-TTC
+
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 7,0% TTC
ACH-7.0-TTC
@@ -302,6 +480,29 @@
+
+ TVA déductible (achat) 5,0% TTC
+ ACH-5.0-TTC
+
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déductible (achat) 5,5% TTC
ACH-5.5-TTC
@@ -351,6 +552,28 @@
+
+ TVA déd./immobilisation (achat) 20,0%
+ IMMO-20.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd./immobilisation (achat) 19,6%
IMMO-19.6
@@ -394,7 +617,29 @@
purchase
-
+
+
+ TVA déd./immobilisation (achat) 10,0%
+ IMMO-10.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd./immobilisation (achat) 7,0%
IMMO-7.0
@@ -417,6 +662,28 @@
+
+ TVA déd./immobilisation (achat) 5,0%
+ IMMO-5.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd./immobilisation (achat) 5,5%
IMMO-5.5
@@ -463,6 +730,28 @@
+
+ TVA due s/ acq. intracommunautaire (achat) 20,0%
+ ACH_UE_due-20.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA due s/ acq. intracommunautaire (achat) 19,6%
ACH_UE_due-19.6
@@ -506,7 +795,29 @@
purchase
-
+
+
+ TVA due s/ acq. intracommunautaire (achat) 10,0%
+ ACH_UE_due-10.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA due s/ acq. intracommunautaire (achat) 7,0%
ACH_UE_due-7.0
@@ -517,8 +828,8 @@
-
-
+
+
@@ -529,6 +840,28 @@
+
+ TVA due s/ acq. intracommunautaire (achat) 5,0%
+ ACH_UE_due-5.0
+
+ percent
+
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA due s/ acq. intracommunautaire (achat) 5,5%
ACH_UE_due-5.5
@@ -539,8 +872,8 @@
-
-
+
+
@@ -575,6 +908,24 @@
+
+ TVA déd. s/ acq. intracommunautaire (achat) 20,0%
+ ACH_UE_ded.-20.0
+
+ percent
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd. s/ acq. intracommunautaire (achat) 19,6%
ACH_UE_ded.-19.6
@@ -610,7 +961,25 @@
purchase
-
+
+
+ TVA déd. s/ acq. intracommunautaire (achat) 10,0%
+ ACH_UE_ded.-10.0
+
+ percent
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd. s/ acq. intracommunautaire (achat) 7,0%
ACH_UE_ded.-7.0
@@ -629,6 +998,24 @@
+
+ TVA déd. s/ acq. intracommunautaire (achat) 5,0%
+ ACH_UE_ded.-5.0
+
+ percent
+
+
+
+
+
+
+
+
+
+ purchase
+
+
+
TVA déd. s/ acq. intracommunautaire (achat) 5,5%
ACH_UE_ded.-5.5
diff --git a/addons/l10n_fr/plan_comptable_general.xml b/addons/l10n_fr/plan_comptable_general.xml
index c68e0a88a4c..a029e101d07 100644
--- a/addons/l10n_fr/plan_comptable_general.xml
+++ b/addons/l10n_fr/plan_comptable_general.xml
@@ -3584,7 +3584,7 @@
- TVA due intracommunautaire 19,6%
+ TVA due intracommunautaire (Taux Normal)
445201
other
@@ -3592,7 +3592,7 @@
- TVA due intracommunautaire 5,5%
+ TVA due intracommunautaire (Taux Intermédiaire)
445202
other
@@ -3600,7 +3600,7 @@
- TVA due intracommunautaire (autre taux)
+ TVA due intracommunautaire (Autre taux)
445203
other
@@ -3712,7 +3712,7 @@
- TVA collectée 19,6%
+ TVA collectée (Taux Normal)
445711
other
@@ -3720,7 +3720,7 @@
- TVA collectée 5,5%
+ TVA collectée (Taux Intermédiaire)
445712
other
@@ -3728,7 +3728,7 @@
- TVA collectée (autre taux)
+ TVA collectée (Autre taux)
445713
other
diff --git a/addons/l10n_it/data/account.tax.code.template.csv b/addons/l10n_it/data/account.tax.code.template.csv
index e5435945556..18c00b12777 100644
--- a/addons/l10n_it/data/account.tax.code.template.csv
+++ b/addons/l10n_it/data/account.tax.code.template.csv
@@ -75,3 +75,21 @@ IVC21Idet40,template_impcode_pagata_21det40,IVA a credito 21% detraibile 40% (im
IVC21det50,template_ivacode_pagata_21det50,IVA a credito 21% detraibile 50%,template_ivacode_pagata
IVC21Ndet50,template_ivacode_pagata_21det50ind,IVA a credito 21% detraibile 50% (indetraibile),template_ivacode_pagata_ind
IVC21Idet50,template_impcode_pagata_21det50,IVA a credito 21% detraibile 50% (imponibile),template_impcode_pagata
+IVC22,template_ivacode_pagata_22,IVA a credito 22%,template_ivacode_pagata
+IVC22I,template_impcode_pagata_22,IVA a credito 22% (imponibile),template_impcode_pagata
+IVD22,template_ivacode_riscossa_22,IVA a debito 22%,template_ivacode_riscossa
+IVD22I,template_impcode_riscossa_22,IVA a debito 22% (imponibile),template_impcode_riscossa
+IVC22ind,template_ivacode_pagata_22ind,IVA a credito 22% indetraibile,template_ivacode_pagata_ind
+IVC22Iind,template_impcode_pagata_22ind,IVA a credito 22% indetraibile (imponibile),template_impcode_pagata
+IVC22det10,template_ivacode_pagata_22det10,IVA a credito 22% detraibile 10%,template_ivacode_pagata
+IVC22Ndet10,template_ivacode_pagata_22det10ind,IVA a credito 22% detraibile 10% (indetraibile),template_ivacode_pagata_ind
+IVC22Idet10,template_impcode_pagata_22det10,IVA a credito 22% detraibile 10% (imponibile),template_impcode_pagata
+IVC22det15,template_ivacode_pagata_22det15,IVA a credito 22% detraibile 15%,template_ivacode_pagata
+IVC22Ndet15,template_ivacode_pagata_22det15ind,IVA a credito 22% detraibile 15% (indetraibile),template_ivacode_pagata_ind
+IVC22Idet15,template_impcode_pagata_22det15,IVA a credito 22% detraibile 15% (imponibile),template_impcode_pagata
+IVC22det40,template_ivacode_pagata_22det40,IVA a credito 22% detraibile 40%,template_ivacode_pagata
+IVC22Ndet40,template_ivacode_pagata_22det40ind,IVA a credito 22% detraibile 40% (indetraibile),template_ivacode_pagata_ind
+IVC22Idet40,template_impcode_pagata_22det40,IVA a credito 22% detraibile 40% (imponibile),template_impcode_pagata
+IVC22det50,template_ivacode_pagata_22det50,IVA a credito 22% detraibile 50%,template_ivacode_pagata
+IVC22Ndet50,template_ivacode_pagata_22det50ind,IVA a credito 22% detraibile 50% (indetraibile),template_ivacode_pagata_ind
+IVC22Idet50,template_impcode_pagata_22det50,IVA a credito 22% detraibile 50% (imponibile),template_impcode_pagata
diff --git a/addons/l10n_it/data/account.tax.template.csv b/addons/l10n_it/data/account.tax.template.csv
index 5654b32e5e9..67daee0eeef 100644
--- a/addons/l10n_it/data/account.tax.template.csv
+++ b/addons/l10n_it/data/account.tax.template.csv
@@ -1,6 +1,8 @@
id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depend,type,account_collected_id:id,account_paid_id:id,type_tax_use,base_code_id:id,tax_code_id:id,ref_base_code_id:id,ref_tax_code_id:id,ref_base_sign,ref_tax_sign,price_include,base_sign,tax_sign
-21v,21v,l10n_it_chart_template_generic,Iva al 21% (debito),1,0.21,,False,percent,2601,2601,sale,template_impcode_riscossa_21,template_ivacode_riscossa_21,template_impcode_riscossa_21,template_ivacode_riscossa_21,-1,-1,False,1,1
-21a,21a,l10n_it_chart_template_generic,Iva al 21% (credito),2,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,1,1,False,-1,-1
+22v,22v,l10n_it_chart_template_generic,Iva al 22% (debito),1,0.22,,False,percent,2601,2601,sale,template_impcode_riscossa_22,template_ivacode_riscossa_22,template_impcode_riscossa_22,template_ivacode_riscossa_22,-1,-1,False,1,1
+22a,22a,l10n_it_chart_template_generic,Iva al 22% (credito),2,0.22,,False,percent,1601,1601,purchase,template_impcode_pagata_22,template_ivacode_pagata_22,template_impcode_pagata_22,template_ivacode_pagata_22,1,1,False,-1,-1
+21v,21v,l10n_it_chart_template_generic,Iva al 21% (debito),3,0.21,,False,percent,2601,2601,sale,template_impcode_riscossa_21,template_ivacode_riscossa_21,template_impcode_riscossa_21,template_ivacode_riscossa_21,-1,-1,False,1,1
+21a,21a,l10n_it_chart_template_generic,Iva al 21% (credito),4,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,1,1,False,-1,-1
20v,20v,l10n_it_chart_template_generic,Iva al 20% (debito),3,0.2,,False,percent,2601,2601,sale,template_impcode_riscossa_20,template_ivacode_riscossa_20,template_impcode_riscossa_20,template_ivacode_riscossa_20,-1,-1,False,1,1
20a,20a,l10n_it_chart_template_generic,Iva al 20% (credito),4,0.2,,False,percent,1601,1601,purchase,template_impcode_pagata_20,template_ivacode_pagata_20,template_impcode_pagata_20,template_ivacode_pagata_20,1,1,False,-1,-1
10v,10v,l10n_it_chart_template_generic,Iva al 10% (debito),5,0.1,,False,percent,2601,2601,sale,template_impcode_riscossa_10,template_ivacode_riscossa_10,template_impcode_riscossa_10,template_ivacode_riscossa_10,-1,-1,False,1,1
@@ -25,8 +27,8 @@ id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depe
20I5,20I5,l10n_it_chart_template_generic,IVA al 20% detraibile al 50%,14,0.2,,True,percent,,,purchase,template_impcode_pagata_20det50,,template_impcode_pagata_20det50,,1,1,False,-1,-1
20I5b,20I5b,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (D),200,0,20I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det50,,template_ivacode_pagata_20det50,1,1,False,-1,-1
20I5a,20I5a,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (I),100,0.5,20I5,False,percent,,,purchase,,template_ivacode_pagata_20det50ind,,template_ivacode_pagata_20det50ind,1,1,False,-1,-1
-22v,22v,l10n_it_chart_template_generic,Iva 2% (debito),15,0.02,,False,percent,2601,2601,sale,template_impcode_riscossa_2,template_ivacode_riscossa_2,template_impcode_riscossa_2,template_ivacode_riscossa_2,-1,-1,False,1,1
-22a,22a,l10n_it_chart_template_generic,Iva 2% (credito),16,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,1,1,False,-1,-1
+2v,2v,l10n_it_chart_template_generic,Iva 2% (debito),15,0.02,,False,percent,2601,2601,sale,template_impcode_riscossa_2,template_ivacode_riscossa_2,template_impcode_riscossa_2,template_ivacode_riscossa_2,-1,-1,False,1,1
+2a,2a,l10n_it_chart_template_generic,Iva 2% (credito),16,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,1,1,False,-1,-1
4v,4v,l10n_it_chart_template_generic,Iva 4% (debito),17,0.04,,False,percent,2601,2601,sale,template_impcode_riscossa_4,template_ivacode_riscossa_4,template_impcode_riscossa_4,template_ivacode_riscossa_4,-1,-1,False,1,1
4a,4a,l10n_it_chart_template_generic,Iva 4% (credito),18,0.04,,False,percent,1601,1601,purchase,template_impcode_pagata_4,template_ivacode_pagata_4,template_impcode_pagata_4,template_ivacode_pagata_4,1,1,False,-1,-1
4AO,4AO,l10n_it_chart_template_generic,Iva al 4% indetraibile,19,0.04,,True,percent,,,purchase,template_impcode_pagata_4ind,,template_impcode_pagata_4ind,,1,1,False,-1,-1
@@ -42,11 +44,12 @@ id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depe
00a,00a,l10n_it_chart_template_generic,Fuori Campo IVA (credito),23,0,,False,percent,1601,1601,purchase,template_impcode_pagata_0,template_ivacode_pagata_0,template_impcode_pagata_0,template_ivacode_pagata_0,1,1,False,-1,-1
00art15v,00art15v,l10n_it_chart_template_generic,Imponibile Escluso Art.15 (debito),22,0,,False,percent,2601,2601,sale,template_impcode_riscossa_art15,template_ivacode_riscossa_art15,template_impcode_riscossa_art15,template_ivacode_riscossa_art15,-1,-1,False,1,1
00art15a,00art15a,l10n_it_chart_template_generic,Imponibile Escluso Art.15 (credito),23,0,,False,percent,1601,1601,purchase,template_impcode_pagata_art15,template_ivacode_pagata_art15,template_impcode_pagata_art15,template_ivacode_pagata_art15,1,1,False,-1,-1
-21v INC,21v INC,l10n_it_chart_template_generic,Iva al 21% (debito) INC,24,0.21,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,-1,-1,True,1,1
+22v INC,22v INC,l10n_it_chart_template_generic,Iva al 22% (debito) INC,24,0.22,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_22,l10n_it.template_ivacode_riscossa_22,l10n_it.template_impcode_riscossa_22,l10n_it.template_ivacode_riscossa_22,-1,-1,True,1,1
+21v INC,21v INC,l10n_it_chart_template_generic,Iva al 21% (debito) INC,25,0.21,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,-1,-1,True,1,1
20v INC,20v INC,l10n_it_chart_template_generic,Iva al 20% (debito) INC,25,0.2,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,-1,-1,True,1,1
10v INC,10v INC,l10n_it_chart_template_generic,Iva al 10% (debito) INC,26,0.1,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,-1,-1,True,1,1
12v INC,12v INC,l10n_it_chart_template_generic,Iva 12% (debito) INC,27,0.12,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,-1,-1,True,1,1
-22v INC,22v INC,l10n_it_chart_template_generic,Iva 2% (debito) INC,28,0.02,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,-1,-1,True,1,1
+2v INC,2v INC,l10n_it_chart_template_generic,Iva 2% (debito) INC,28,0.02,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,-1,-1,True,1,1
4v INC,4v INC,l10n_it_chart_template_generic,Iva 4% (debito) INC,29,0.04,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,-1,-1,True,1,1
00v INC,00v INC,l10n_it_chart_template_generic,Fuori Campo IVA (debito) INC,30,0,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,-1,-1,True,1,1
2110,2110,l10n_it_chart_template_generic,Iva al 21% detraibile 10%,31,0.21,,True,percent,,,purchase,template_impcode_pagata_21det10,,template_impcode_pagata_21det10,,1,1,False,-1,-1
@@ -64,3 +67,18 @@ id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depe
21I5,21I5,l10n_it_chart_template_generic,IVA al 21% detraibile al 50%,35,0.21,,True,percent,,,purchase,template_impcode_pagata_21det50,,template_impcode_pagata_21det50,,1,1,False,-1,-1
21I5b,21I5b,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (D),200,0,21I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det50,,template_ivacode_pagata_21det50,1,1,False,-1,-1
21I5a,21I5a,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (I),100,0.5,21I5,False,percent,,,purchase,,template_ivacode_pagata_21det50ind,,template_ivacode_pagata_21det50ind,1,1,False,-1,-1
+2210,2210,l10n_it_chart_template_generic,Iva al 22% detraibile 10%,31,0.22,,True,percent,,,purchase,template_impcode_pagata_22det10,,template_impcode_pagata_22det10,,1,1,False,-1,-1
+2210b,2210b,l10n_it_chart_template_generic,Iva al 22% detraibile 10% (D),200,0,2210,False,balance,1601,1601,purchase,,template_ivacode_pagata_22det10,,template_ivacode_pagata_22det10,1,1,False,-1,-1
+2210a,2210a,l10n_it_chart_template_generic,Iva al 22% detraibile 10% (I),100,0.9,2210,False,percent,,,purchase,,template_ivacode_pagata_22det10ind,,template_ivacode_pagata_22det10ind,1,1,False,-1,-1
+2215,2215,l10n_it_chart_template_generic,Iva al 22% detraibile 15%,32,0.22,,True,percent,,,purchase,template_impcode_pagata_22det15,,template_impcode_pagata_22det15,,1,1,False,-1,-1
+2215b,2215b,l10n_it_chart_template_generic,Iva al 22% detraibile 15% (D),200,0,2215,False,balance,1601,1601,purchase,,template_ivacode_pagata_22det15,,template_ivacode_pagata_22det15,1,1,False,-1,-1
+2215a,2215a,l10n_it_chart_template_generic,Iva al 22% detraibile 15% (I),100,0.85,2215,False,percent,,,purchase,,template_ivacode_pagata_22det15ind,,template_ivacode_pagata_22det15ind,1,1,False,-1,-1
+2240,2240,l10n_it_chart_template_generic,Iva al 22% detraibile 40%,33,0.22,,True,percent,,,purchase,template_impcode_pagata_22det40,,template_impcode_pagata_22det40,,1,1,False,-1,-1
+2240b,2240b,l10n_it_chart_template_generic,Iva al 22% detraibile 40% (D),200,0,2240,False,balance,1601,1601,purchase,,template_ivacode_pagata_22det40,,template_ivacode_pagata_22det40,1,1,False,-1,-1
+2240a,2240a,l10n_it_chart_template_generic,Iva al 22% detraibile 40% (I),100,0.6,2240,False,percent,,,purchase,,template_ivacode_pagata_22det40ind,,template_ivacode_pagata_22det40ind,1,1,False,-1,-1
+22AO,22AO,l10n_it_chart_template_generic,Iva al 22% indetraibile,34,0.22,,True,percent,,,purchase,template_impcode_pagata_22ind,,template_impcode_pagata_22ind,,1,1,False,-1,-1
+22AOb,22AOb,l10n_it_chart_template_generic,Iva al 22% indetraibile (D),200,0,22AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_22ind,,template_ivacode_pagata_22ind,1,1,False,-1,-1
+22AOa,22AOa,l10n_it_chart_template_generic,Iva al 22% indetraibile (I),100,1,22AO,False,percent,,,purchase,,template_ivacode_pagata_22ind,,template_ivacode_pagata_22ind,1,1,False,-1,-1
+22I5,22I5,l10n_it_chart_template_generic,IVA al 22% detraibile al 50%,35,0.22,,True,percent,,,purchase,template_impcode_pagata_22det50,,template_impcode_pagata_22det50,,1,1,False,-1,-1
+22I5b,22I5b,l10n_it_chart_template_generic,IVA al 22% detraibile al 50% (D),200,0,22I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_22det50,,template_ivacode_pagata_22det50,1,1,False,-1,-1
+22I5a,22I5a,l10n_it_chart_template_generic,IVA al 22% detraibile al 50% (I),100,0.5,22I5,False,percent,,,purchase,,template_ivacode_pagata_22det50ind,,template_ivacode_pagata_22det50ind,1,1,False,-1,-1
diff --git a/addons/mail/controllers/main.py b/addons/mail/controllers/main.py
index 959877ad098..c5ef8bac92d 100644
--- a/addons/mail/controllers/main.py
+++ b/addons/mail/controllers/main.py
@@ -10,8 +10,9 @@ from openerp.addons.web.controllers.main import content_disposition
class MailController(http.Controller):
_cp_path = '/mail'
- @http.httprequest
+ @http.route('/mail/download_attachment', type='http', auth='user')
def download_attachment(self, req, model, id, method, attachment_id, **kw):
+ # FIXME use /web/binary/saveas directly
Model = req.session.model(model)
res = getattr(Model, method)(int(id), int(attachment_id))
if res:
@@ -20,10 +21,10 @@ class MailController(http.Controller):
if filecontent and filename:
return req.make_response(filecontent,
headers=[('Content-Type', 'application/octet-stream'),
- ('Content-Disposition', content_disposition(filename, req))])
+ ('Content-Disposition', content_disposition(filename))])
return req.not_found()
- @http.jsonrequest
+ @http.route('/mail/receive', type='json', auth='none')
def receive(self, req):
""" End-point to receive mail from an external SMTP server. """
dbs = req.jsonrequest.get('databases')
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index 91799b0ac63..8e99655dddb 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -157,9 +157,9 @@ class mail_mail(osv.Model):
'action': 'mail.action_mail_redirect',
}
if mail.notification:
- fragment.update({
- 'message_id': mail.mail_message_id.id,
- })
+ fragment['message_id'] = mail.mail_message_id.id
+ elif mail.model and mail.res_id:
+ fragment.update(model=mail.model, res_id=mail.res_id)
url = urljoin(base_url, "?%s#%s" % (urlencode(query), urlencode(fragment)))
return _("""Access your messages and documents in OpenERP """) % url
else:
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index d217df5ed9b..99b874c3620 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -567,29 +567,37 @@ class mail_thread(osv.AbstractModel):
self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
act_model, act_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, *self._get_inbox_action_xml_id(cr, uid, context=context))
action = self.pool.get(act_model).read(cr, uid, act_id, [])
+ params = context.get('params')
+ msg_id = model = res_id = None
- # if msg_id specified: try to redirect to the document or fallback on the Inbox
- msg_id = context.get('params', {}).get('message_id')
- if not msg_id:
+ if params:
+ msg_id = params.get('message_id')
+ model = params.get('model')
+ res_id = params.get('res_id')
+ if not msg_id and not (model and res_id):
return action
- msg = self.pool.get('mail.message').browse(cr, uid, msg_id, context=context)
- if msg.model and msg.res_id:
- action.update({
- 'context': {
- 'search_default_model': msg.model,
- 'search_default_res_id': msg.res_id,
- }
- })
- if self.pool.get(msg.model).check_access_rights(cr, uid, 'read', raise_exception=False):
+ if msg_id and not (model and res_id):
+ msg = self.pool.get('mail.message').browse(cr, uid, msg_id, context=context)
+ model, res_id = msg.model, msg.res_id
+
+ # if model + res_id found: try to redirect to the document or fallback on the Inbox
+ if model and res_id:
+ model_obj = self.pool.get(model)
+ if model_obj.check_access_rights(cr, uid, 'read', raise_exception=False):
try:
- model_obj = self.pool.get(msg.model)
- model_obj.check_access_rule(cr, uid, [msg.res_id], 'read', context=context)
+ model_obj.check_access_rule(cr, uid, [res_id], 'read', context=context)
if not hasattr(model_obj, '_get_formview_action'):
- action = self.pool.get('mail.thread')._get_formview_action(cr, uid, msg.res_id, model=msg.model, context=context)
+ action = self.pool.get('mail.thread')._get_formview_action(cr, uid, res_id, model=model, context=context)
else:
- action = model_obj._get_formview_action(cr, uid, msg.res_id, context=context)
+ action = model_obj._get_formview_action(cr, uid, res_id, context=context)
except (osv.except_osv, orm.except_orm):
pass
+ action.update({
+ 'context': {
+ 'search_default_model': model,
+ 'search_default_res_id': res_id,
+ }
+ })
return action
#------------------------------------------------------
@@ -1176,7 +1184,7 @@ class mail_thread(osv.AbstractModel):
# get partner info from email
partner_info = self.message_partner_info_from_emails(cr, uid, obj.id, [email], context=context)[0]
if partner_info.get('partner_id'):
- partner = self.pool.get('res.partner').browse(cr, SUPERUSER_ID, [partner_info.get('partner_id')], context=context)[0]
+ partner = self.pool.get('res.partner').browse(cr, SUPERUSER_ID, [partner_info['partner_id']], context=context)[0]
if email and email in [val[1] for val in result[obj.id]]: # already existing email -> skip
return result
if partner and partner in obj.message_follower_ids: # recipient already in the followers -> skip
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index a0dad1fcdbc..53cab629d79 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -151,7 +151,7 @@ openerp_mail_followers = function(session, mail) {
},
fetch_followers: function (value_) {
- this.value = value_ || {};
+ this.value = value_ || [];
return this.ds_model.call('read_followers_data', [this.value])
.then(this.proxy('display_followers'), this.proxy('fetch_generic'))
.then(this.proxy('display_buttons'))
diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py
index 0688bf02606..62c76db5a40 100644
--- a/addons/mail/tests/test_mail_features.py
+++ b/addons/mail/tests/test_mail_features.py
@@ -231,6 +231,8 @@ class test_mail(TestMail):
def test_11_notification_url(self):
""" Tests designed to test the URL added in notification emails. """
cr, uid, group_pigs = self.cr, self.uid, self.group_pigs
+ # Test URL formatting
+ base_url = self.registry('ir.config_parameter').get_param(cr, uid, 'web.base.url')
# Partner data
partner_raoul = self.res_partner.browse(cr, uid, self.partner_raoul_id)
@@ -243,19 +245,59 @@ class test_mail(TestMail):
# Test: link for nobody -> None
url = mail_mail._get_partner_access_link(self.mail_mail, cr, uid, mail)
self.assertEqual(url, None,
- 'notification email: mails not send to a specific partner should not have any URL')
+ 'notification email: mails not send to a specific partner should not have any URL')
# Test: link for partner -> None
url = mail_mail._get_partner_access_link(self.mail_mail, cr, uid, mail, partner=partner_bert)
self.assertEqual(url, None,
- 'notification email: mails send to a not-user partner should not have any URL')
+ 'notification email: mails send to a not-user partner should not have any URL')
# Test: link for user -> signin
url = mail_mail._get_partner_access_link(self.mail_mail, cr, uid, mail, partner=partner_raoul)
+ self.assertIn(base_url, url,
+ 'notification email: link should contain web.base.url')
+ self.assertIn('db=%s' % cr.dbname, url,
+ 'notification email: link should contain database name')
self.assertIn('action=mail.action_mail_redirect', url,
- 'notification email: link should contain the redirect action')
+ 'notification email: link should contain the redirect action')
self.assertIn('login=%s' % partner_raoul.user_ids[0].login, url,
- 'notification email: link should contain the user login')
+ 'notification email: link should contain the user login')
+
+ # Test: link for user -> with model and res_id
+ mail_mail_id = self.mail_mail.create(cr, uid, {'model': 'mail.group', 'res_id': group_pigs.id})
+ mail = self.mail_mail.browse(cr, uid, mail_mail_id)
+ url = mail_mail._get_partner_access_link(self.mail_mail, cr, uid, mail, partner=partner_raoul)
+ self.assertIn(base_url, url,
+ 'notification email: link should contain web.base.url')
+ self.assertIn('db=%s' % cr.dbname, url,
+ 'notification email: link should contain database name')
+ self.assertIn('action=mail.action_mail_redirect', url,
+ 'notification email: link should contain the redirect action')
+ self.assertIn('login=%s' % partner_raoul.user_ids[0].login, url,
+ 'notification email: link should contain the user login')
+ self.assertIn('model=mail.group', url,
+ 'notification email: link should contain the model when having not notification email on a record')
+ self.assertIn('res_id=%s' % group_pigs.id, url,
+ 'notification email: link should contain the res_id when having not notification email on a record')
+
+ # Test: link for user -> with model and res_id
+ mail_mail_id = self.mail_mail.create(cr, uid, {'notification': True, 'model': 'mail.group', 'res_id': group_pigs.id})
+ mail = self.mail_mail.browse(cr, uid, mail_mail_id)
+ url = mail_mail._get_partner_access_link(self.mail_mail, cr, uid, mail, partner=partner_raoul)
+ self.assertIn(base_url, url,
+ 'notification email: link should contain web.base.url')
+ self.assertIn('db=%s' % cr.dbname, url,
+ 'notification email: link should contain database name')
+ self.assertIn('action=mail.action_mail_redirect', url,
+ 'notification email: link should contain the redirect action')
+ self.assertIn('login=%s' % partner_raoul.user_ids[0].login, url,
+ 'notification email: link should contain the user login')
+ self.assertIn('message_id=%s' % mail.mail_message_id.id, url,
+ 'notification email: link based on message should contain the mail_message id')
+ self.assertNotIn('model', url,
+ 'notification email: link based on message should not contain model')
+ self.assertNotIn('res_id', url,
+ 'notification email: link based on message should not contain res_id')
@mute_logger('openerp.addons.mail.mail_thread', 'openerp.osv.orm')
def test_12_inbox_redirection(self):
@@ -267,24 +309,54 @@ class test_mail(TestMail):
# No specific parameters -> should redirect to Inbox
action = mail_thread.message_redirect_action(self.mail_thread, cr, self.user_raoul_id, {'params': {}})
- self.assertEqual(action.get('type'), 'ir.actions.client',
- 'URL redirection: action without parameters should redirect to client action Inbox')
- self.assertEqual(action.get('id'), act_id,
- 'URL redirection: action without parameters should redirect to client action Inbox')
+ self.assertEqual(
+ action.get('type'), 'ir.actions.client',
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
+ self.assertEqual(
+ action.get('id'), act_id,
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
- # Bert has read access to Pigs -> should redirect to form view of Pigs
+ # Raoul has read access to Pigs -> should redirect to form view of Pigs
action = mail_thread.message_redirect_action(self.mail_thread, cr, self.user_raoul_id, {'params': {'message_id': msg_id}})
- self.assertEqual(action.get('type'), 'ir.actions.act_window',
- 'URL redirection: action with message_id for read-accredited user should redirect to Pigs')
- self.assertEqual(action.get('res_id'), group_pigs.id,
- 'URL redirection: action with message_id for read-accredited user should redirect to Pigs')
+ self.assertEqual(
+ action.get('type'), 'ir.actions.act_window',
+ 'URL redirection: action with message_id for read-accredited user should redirect to Pigs'
+ )
+ self.assertEqual(
+ action.get('res_id'), group_pigs.id,
+ 'URL redirection: action with message_id for read-accredited user should redirect to Pigs'
+ )
+ action = mail_thread.message_redirect_action(self.mail_thread, cr, self.user_raoul_id, {'params': {'model': 'mail.group', 'res_id': group_pigs.id}})
+ self.assertEqual(
+ action.get('type'), 'ir.actions.act_window',
+ 'URL redirection: action with message_id for read-accredited user should redirect to Pigs'
+ )
+ self.assertEqual(
+ action.get('res_id'), group_pigs.id,
+ 'URL redirection: action with message_id for read-accredited user should redirect to Pigs'
+ )
# Bert has no read access to Pigs -> should redirect to Inbox
action = mail_thread.message_redirect_action(self.mail_thread, cr, self.user_bert_id, {'params': {'message_id': msg_id}})
- self.assertEqual(action.get('type'), 'ir.actions.client',
- 'URL redirection: action without parameters should redirect to client action Inbox')
- self.assertEqual(action.get('id'), act_id,
- 'URL redirection: action without parameters should redirect to client action Inbox')
+ self.assertEqual(
+ action.get('type'), 'ir.actions.client',
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
+ self.assertEqual(
+ action.get('id'), act_id,
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
+ action = mail_thread.message_redirect_action(self.mail_thread, cr, self.user_bert_id, {'params': {'model': 'mail.group', 'res_id': group_pigs.id}})
+ self.assertEqual(
+ action.get('type'), 'ir.actions.client',
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
+ self.assertEqual(
+ action.get('id'), act_id,
+ 'URL redirection: action without parameters should redirect to client action Inbox'
+ )
def test_20_message_post(self):
""" Tests designed for message_post. """
diff --git a/addons/mail/update.py b/addons/mail/update.py
index 94416aeb356..bcf9bb8c7c9 100644
--- a/addons/mail/update.py
+++ b/addons/mail/update.py
@@ -6,8 +6,8 @@ import urllib
import urllib2
import openerp
-from openerp import release
-from openerp.osv import fields, osv
+from openerp import release, SUPERUSER_ID
+from openerp.osv import osv
from openerp.tools.translate import _
from openerp.tools.safe_eval import safe_eval
from openerp.tools.config import config
@@ -86,25 +86,26 @@ class publisher_warranty_contract(osv.osv):
try:
try:
result = get_sys_logs(self, cr, uid)
- except Exception, ex:
+ except Exception:
if cron_mode: # we don't want to see any stack trace in cron
return False
_logger.debug("Exception while sending a get logs messages", exc_info=1)
raise osv.except_osv(_("Error"), _("Error during communication with the publisher warranty server."))
- limit_date = (datetime.datetime.now() - _PREVIOUS_LOG_CHECK).strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT)
# old behavior based on res.log; now on mail.message, that is not necessarily installed
- proxy = self.pool.get('mail.message')
-
- model, res_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees')
-
+ IMD = self.pool['ir.model.data']
+ user = self.pool['res.users'].browse(cr, SUPERUSER_ID, SUPERUSER_ID)
+ try:
+ poster = IMD.get_object(cr, SUPERUSER_ID, 'mail', 'group_all_employees')
+ except ValueError:
+ # Cannot found group, post the message on the wall of the admin
+ poster = user
+ if not poster.exists():
+ return True
for message in result["messages"]:
- values = {
- 'body' : message,
- 'model' : 'mail.group',
- 'res_id' : res_id,
- 'user_id' : False,
- }
- proxy.create(cr, uid, values, context=context)
+ try:
+ poster.message_post(body=message, subtype='mt_comment', partner_ids=[user.partner_id.id])
+ except Exception:
+ _logger.warning('Cannot send ping message', exc_info=True)
except Exception:
if cron_mode:
return False # we don't want to see any stack trace in cron
diff --git a/addons/mail/wizard/mail_compose_message_view.xml b/addons/mail/wizard/mail_compose_message_view.xml
index 0c86bae7e5f..948d9b3832c 100644
--- a/addons/mail/wizard/mail_compose_message_view.xml
+++ b/addons/mail/wizard/mail_compose_message_view.xml
@@ -13,8 +13,17 @@
+
-
+
+
+ All records matching your current search filter will be mailed,
+ not only the ids selected in the list view.
+ If you want to work only with selected ids, please uncheck the
+ list header checkbox.
+
+
diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py
index 9d812e06547..f04aa68ca6a 100644
--- a/addons/mrp_repair/mrp_repair.py
+++ b/addons/mrp_repair/mrp_repair.py
@@ -518,8 +518,9 @@ class mrp_repair(osv.osv):
'location_dest_id': move.location_dest_id.id,
'tracking_id': False,
'prodlot_id': move.prodlot_id and move.prodlot_id.id or False,
- 'state': 'done',
+ 'state': 'assigned',
})
+ move_obj.action_done(cr, uid, [move_id], context=context)
repair_line_obj.write(cr, uid, [move.id], {'move_id': move_id, 'state': 'done'}, context=context)
if repair.deliver_bool:
pick_name = seq_obj.get(cr, uid, 'stock.picking.out')
diff --git a/addons/note/note.py b/addons/note/note.py
index eb9a6397d18..95fe8f97cdf 100644
--- a/addons/note/note.py
+++ b/addons/note/note.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from openerp import SUPERUSER_ID
from openerp.osv import osv, fields
from openerp.tools import html2plaintext
@@ -188,18 +189,15 @@ class res_users(osv.Model):
_inherit = ['res.users']
def create(self, cr, uid, data, context=None):
user_id = super(res_users, self).create(cr, uid, data, context=context)
- user = self.browse(cr, uid, uid, context=context)
- note_obj = self.pool.get('note.stage')
- data_obj = self.pool.get('ir.model.data')
- model_id = data_obj.get_object_reference(cr, uid, 'base', 'group_user') #Employee Group
- group_id = model_id and model_id[1] or False
- if group_id in [x.id for x in user.groups_id]:
- for note_xml_id in ['note_stage_00','note_stage_01','note_stage_02','note_stage_03','note_stage_04']:
+ note_obj = self.pool['note.stage']
+ data_obj = self.pool['ir.model.data']
+ is_employee = self.has_group(cr, user_id, 'base.group_user')
+ if is_employee:
+ for n in range(5):
+ xmlid = 'note_stage_%02d' % (n,)
try:
- data_id = data_obj._get_id(cr, uid, 'note', note_xml_id)
+ _model, stage_id = data_obj.get_object_reference(cr, SUPERUSER_ID, 'note', xmlid)
except ValueError:
continue
- stage_id = data_obj.browse(cr, uid, data_id, context=context).res_id
- note_obj.copy(cr, uid, stage_id, default = {
- 'user_id': user_id}, context=context)
+ note_obj.copy(cr, SUPERUSER_ID, stage_id, default={'user_id': user_id}, context=context)
return user_id
diff --git a/addons/note/tests/__init__.py b/addons/note/tests/__init__.py
new file mode 100644
index 00000000000..4a9f12c80b2
--- /dev/null
+++ b/addons/note/tests/__init__.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+from . import test_note
+
+checks = [
+ test_note,
+]
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/note/tests/test_note.py b/addons/note/tests/test_note.py
new file mode 100644
index 00000000000..4300009981e
--- /dev/null
+++ b/addons/note/tests/test_note.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2013-TODAY OpenERP S.A.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.tests import common
+
+class TestNote(common.TransactionCase):
+
+ def test_bug_lp_1156215(self):
+ """ensure any users can create new users"""
+ cr, uid = self.cr, self.uid
+ IMD = self.registry('ir.model.data')
+ Users = self.registry('res.users')
+
+ _, demo_user = IMD.get_object_reference(cr, uid, 'base', 'user_demo')
+ _, group_id = IMD.get_object_reference(cr, uid, 'base', 'group_erp_manager')
+
+ Users.write(cr, uid, [demo_user], {
+ 'groups_id': [(4, group_id)],
+ })
+
+ # must not fail
+ Users.create(cr, demo_user, {
+ 'name': 'test bug lp:1156215',
+ 'login': 'lp_1156215',
+ })
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index f200d636268..d32b8e91d3a 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -280,7 +280,7 @@ class pos_session(osv.osv):
# open if there is no session in 'opening_control', 'opened', 'closing_control' for one user
domain = [
('state', 'not in', ('closed','closing_control')),
- ('user_id', '=', uid)
+ ('user_id', '=', session.user_id.id)
]
count = self.search_count(cr, uid, domain, context=context)
if count>1:
diff --git a/addons/portal/mail_message.py b/addons/portal/mail_message.py
index d6a38f27378..9699b3a9ef6 100644
--- a/addons/portal/mail_message.py
+++ b/addons/portal/mail_message.py
@@ -35,7 +35,7 @@ class mail_message(osv.Model):
group_ids = self.pool.get('res.users').browse(cr, uid, uid, context=context).groups_id
group_user_id = self.pool.get("ir.model.data").get_object_reference(cr, uid, 'base', 'group_user')[1]
if group_user_id not in [group.id for group in group_ids]:
- args = ['&', '|', ('type', '!=', 'comment'), ('subtype_id', '!=', False)] + list(args)
+ args = [('subtype_id', '!=', False)] + list(args)
return super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
context=context, count=False, access_rights_uid=access_rights_uid)
diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py
index 4d301458365..f5eeba0aa62 100644
--- a/addons/portal/tests/test_portal.py
+++ b/addons/portal/tests/test_portal.py
@@ -210,11 +210,11 @@ class test_portal(TestMail):
msg2_id = self.mail_group.message_post(cr, uid, group_port_id, body='Body2', type='comment', subtype='mail.mt_group_public')
msg3_id = self.mail_group.message_post(cr, uid, group_port_id, body='Body3', type='comment', subtype='mail.mt_comment')
msg4_id = self.mail_group.message_post(cr, uid, group_port_id, body='Body4', type='comment')
- msg5_id = self.mail_group.message_post(cr, uid, group_port_id, body='Body5', type='notification')
+ # msg5_id = self.mail_group.message_post(cr, uid, group_port_id, body='Body5', type='notification')
# Do: Chell search messages: should not see internal notes (comment without subtype)
msg_ids = self.mail_message.search(cr, self.user_chell_id, [('model', '=', 'mail.group'), ('res_id', '=', group_port_id)])
- self.assertEqual(set(msg_ids), set([msg1_id, msg2_id, msg3_id, msg5_id]),
+ self.assertEqual(set(msg_ids), set([msg1_id, msg2_id, msg3_id]),
'mail_message: portal user has access to messages he should not read')
# Do: Chell read messages she can read
diff --git a/addons/portal_hr_employees/hr_employee_view.xml b/addons/portal_hr_employees/hr_employee_view.xml
index 7b038747c60..8e8cece12c8 100644
--- a/addons/portal_hr_employees/hr_employee_view.xml
+++ b/addons/portal_hr_employees/hr_employee_view.xml
@@ -33,8 +33,9 @@
- HR - Employees Kanban
+ HR - Employees Kanban (Portal)
hr.employee
+ 32
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index 93b9417bded..032952aa511 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -127,6 +127,22 @@ class procurement_order(osv.osv):
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'procurement.order', context=c)
}
+ def message_track(self, cr, uid, ids, tracked_fields, initial_values, context=None):
+ """ Overwrite message_track to avoid tracking more than once the confirm-exception loop
+ Add '_first_pass_done_' to the note field only the first time stuck in exception state
+ Will avoid getting furthur confirmed and exception change of state messages
+
+ TODO: this hack is necessary for a stable version but should be avoided for the next release.
+ Instead find a more elegant way to prevent redundant messages or entirely stop tracking states on procurement orders
+ """
+ for proc in self.browse(cr, uid, ids, context=context):
+ if not proc.note or '_first_pass_done_' not in proc.note or proc.state not in ('confirmed', 'exception'):
+ super(procurement_order, self).message_track(cr, uid, [proc.id], tracked_fields, initial_values, context=context)
+ if proc.state == 'exception':
+ cr.execute("""UPDATE procurement_order set note = TRIM(both E'\n' FROM COALESCE(note, '') || %s) WHERE id = %s""", ('\n\n_first_pass_done_',proc.id))
+
+ return True
+
def unlink(self, cr, uid, ids, context=None):
procurements = self.read(cr, uid, ids, ['state'], context=context)
unlink_ids = []
@@ -371,7 +387,6 @@ class procurement_order(osv.osv):
ctx_wkf = dict(context or {})
ctx_wkf['workflow.trg_write.%s' % self._name] = False
self.write(cr, uid, [procurement.id], {'message': message},context=ctx_wkf)
- self.message_post(cr, uid, [procurement.id], body=message, context=context)
return ok
def step_workflow(self, cr, uid, ids, context=None):
diff --git a/addons/product/product_demo.xml b/addons/product/product_demo.xml
index fead62f8521..bba5d6139ca 100644
--- a/addons/product/product_demo.xml
+++ b/addons/product/product_demo.xml
@@ -64,7 +64,7 @@
-
+
On Site Monitoring
20.5
@@ -75,8 +75,12 @@
This type of service include basic monitoring of products.
This type of service include basic monitoring of products.
+
+
+
-
+
+
On Site Assistance
25.5
@@ -86,10 +90,13 @@
This type of service include assistance for security questions, system configuration requirements, implementation or special needs.
+
+
+
-
+
+
PC Assemble SC234
- PCSC234
450.0
300.0
@@ -101,10 +108,14 @@ Processor AMD 8-Core
512MB RAM
HDD SH-1
+
+
+ PCSC234
+
-
+
+
PC Assemble SC349
- PCSC349
500.0
750.0
@@ -117,10 +128,14 @@ Processor Core i5 2.70 Ghz
2GB RAM
HDD SH-1
+
+
+ PCSC349
+
-
+
+
PC Assemble + Custom (PC on Demand)
- PC-DEM
600.0
900.0
@@ -129,10 +144,14 @@ HDD SH-1
Custom computer assembled on order based on customer's requirement.
+
+
+ PC-DEM
+
-
+
+
15” LCD Monitor
- LCD15
800.0
1200.0
@@ -140,9 +159,13 @@ HDD SH-1
-
+
+
+ LCD15
+
+
+
17” LCD Monitor
- LCD17
880.0
1350.0
@@ -150,9 +173,27 @@ HDD SH-1
-
+
+
+ LCD17
+
+
+
USB Keyboard, QWERTY
+
+ 10.0
+ 13.0
+ consu
+
+
+
+
+
KeyQ
+
+
+
+ USB Keyboard, AZERTY
10.0
13.0
@@ -161,18 +202,12 @@ HDD SH-1
- USB Keyboard, AZERTY
+
KeyA
-
- 10.0
- 13.0
- consu
-
-
-
+
+
Mouse, Optical
- M-Opt
12.50
14
@@ -180,9 +215,13 @@ HDD SH-1
-
+
+
+ M-Opt
+
+
+
Mouse, Laser
- M-Las
14
16.50
@@ -190,9 +229,13 @@ HDD SH-1
-
+
+
+ M-Las
+
+
+
Mouse, Wireless
- M-Wir
18
12.50
@@ -200,9 +243,13 @@ HDD SH-1
-
+
+
+ M-Wir
+
+
+
RAM SR5
- RAM-SR5
78.0
85.0
@@ -210,9 +257,13 @@ HDD SH-1
-
+
+
+ RAM-SR5
+
+
+
RAM SR2
- RAM-SR2
87.0
95.0
@@ -220,9 +271,13 @@ HDD SH-1
-
+
+
+ RAM-SR2
+
+
+
RAM SR3
- RAM-SR3
80.0
85.0
@@ -230,9 +285,13 @@ HDD SH-1
-
+
+
+ RAM-SR3
+
+
+
Computer Case
- C-Case
20.0
25.0
@@ -240,9 +299,13 @@ HDD SH-1
-
+
+
+ C-Case
+
+
+
HDD SH-1
- HDD-SH1
860.0
975.0
@@ -250,9 +313,13 @@ HDD SH-1
-
+
+
+ HDD-SH1
+
+
+
HDD SH-2
- HDD-SH2
1020.0
1150.0
@@ -260,9 +327,13 @@ HDD SH-1
-
+
+
+ HDD-SH2
+
+
+
HDD on Demand
- HDD-DEM
1100.0
1250.0
@@ -271,9 +342,13 @@ HDD SH-1
On demand hard-disk having capacity based on requirement.
-
+
+
+ HDD-DEM
+
+
+
Motherboard I9P57
- MBi9
1700.0
1950.0
@@ -281,9 +356,13 @@ HDD SH-1
-
+
+
+ MBi9
+
+
+
Motherboard A20Z7
- MBa20
1790.0
2000.0
@@ -291,9 +370,13 @@ HDD SH-1
-
+
+
+ MBa20
+
+
+
Processor Core i5 2.70 Ghz
- CPUi5
2010.0
2100.0
@@ -301,9 +384,13 @@ HDD SH-1
-
+
+
+ CPUi5
+
+
+
Processor AMD 8-Core
- CPUa8
1910.0
1980.0
@@ -311,9 +398,13 @@ HDD SH-1
-
+
+
+ CPUa8
+
+
+
Graphics Card
- CARD
876.0
885.0
@@ -321,9 +412,13 @@ HDD SH-1
-
+
+
+ CARD
+
+
+
Laptop E5023
- LAP-E5
2870.0
2950.0
@@ -335,9 +430,13 @@ HDD SH-1
Standard-1294P Processor
QWERTY keyboard
-
+
+
+ LAP-E5
+
+
+
Laptop S3450
- LAP-S3
3000.0
3245.0
@@ -349,9 +448,13 @@ QWERTY keyboard
Hi-Speed 234Q Processor
QWERTY keyboard
-
+
+
+ LAP-S3
+
+
+
Laptop Customized
- LAP-CUS
3300.0
3645.0
@@ -360,9 +463,13 @@ QWERTY keyboard
Custom Laptop based on customer's requirement.
-
+
+
+ LAP-CUS
+
+
+
External Hard disk
- EXT-HDD
390.0
405.0
@@ -370,10 +477,14 @@ QWERTY keyboard
+
+
+ EXT-HDD
+
-
+
+
Pen drive, SP-2
- PD-SP2
90.0
100.0
@@ -381,10 +492,14 @@ QWERTY keyboard
+
+
+ PD-SP2
+
-
+
+
Pen drive, SP-4
- PD-SP4
126.0
145.0
@@ -392,9 +507,13 @@ QWERTY keyboard
-
+
+
+ PD-SP4
+
+
+
Multimedia Speakers
- MM-SPK
134.0
150.0
@@ -403,9 +522,13 @@ QWERTY keyboard
.
-
+
+
+ MM-SPK
+
+
+
Headset standard
- HEAD
57.0
62.0
@@ -414,9 +537,13 @@ QWERTY keyboard
Hands free headset for laptop PC with in-line microphone and headphone plug.
-
+
+
+ HEAD
+
+
+
Headset USB
- HEAD-USB
60.0
65.0
@@ -425,10 +552,14 @@ QWERTY keyboard
Headset for laptop PC with USB connector.
+
+
+ HEAD-USB
+
-
+
+
Webcam
- WCAM
38.0
45.0
@@ -436,10 +567,14 @@ QWERTY keyboard
+
+
+ WCAM
+
-
+
+
Blank CD
- CD
18.40
20.0
@@ -447,10 +582,14 @@ QWERTY keyboard
+
+
+ CD
+
-
+
+
Blank DVD-RW
- DVD
21.60
24.0
@@ -458,10 +597,14 @@ QWERTY keyboard
+
+
+ DVD
+
-
+
+
Printer, All-in-one
- PRINT
4258.0
4410.0
@@ -470,10 +613,14 @@ QWERTY keyboard
All in one hi-speed printer with fax and scanner.
+
+
+ PRINT
+
-
+
+
Ink Cartridge
- INK
60.0
65.0
@@ -481,10 +628,14 @@ QWERTY keyboard
+
+
+ INK
+
-
+
+
Toner Cartridge
- TONER
66.0
70.0
@@ -492,10 +643,14 @@ QWERTY keyboard
+
+
+ TONER
+
-
+
+
Windows 7 Professional
- Win7
330.0
470.0
@@ -503,10 +658,14 @@ QWERTY keyboard
+
+
+ Win7
+
-
+
+
Windows Home Server 2011
- WServer
540.0
620.0
@@ -514,10 +673,14 @@ QWERTY keyboard
+
+
+ WServer
+
-
+
+
Office Suite
- OSuite
110.0
170.0
@@ -526,10 +689,14 @@ QWERTY keyboard
Office Editing Software with word processing, spreadsheets, presentations, graphics, and databases...
+
+
+ OSuite
+
-
+
+
Zed+ Antivirus
- Zplus
235.0
280.0
@@ -537,10 +704,14 @@ QWERTY keyboard
+
+
+ Zplus
+
-
+
+
GrapWorks Software
- GRAPs/w
155.0
173.0
@@ -549,10 +720,14 @@ QWERTY keyboard
Full featured image editing software.
+
+
+ GRAPs/w
+
-
+
+
Router R430
- ROUT_430
55.0
60.0
@@ -560,10 +735,14 @@ QWERTY keyboard
+
+
+ ROUT_430
+
-
+
+
Datacard
- DC
35.0
40.0
@@ -571,10 +750,14 @@ QWERTY keyboard
+
+
+ DC
+
-
+
+
Switch, 24 ports
- SW24
55.0
70.0
@@ -582,10 +765,14 @@ QWERTY keyboard
+
+
+ SW24
+
-
+
+
USB Adapter
- ADPT
13.0
18.0
@@ -593,328 +780,333 @@ QWERTY keyboard
+
+
+ ADPT
+
+
-
+
3
1
-
+
3
1
-
+
3
1
-
+
3
1
-
+
2
5
-
+
4
1
-
+
2
1
-
+
2
1
-
+
5
1
-
+
5
1
-
+
5
1
-
+
1
1
-
+
1
1
-
+
3
1
-
+
3
1
-
+
4
5
-
+
3
1
-
+
2
1
-
+
3
1
-
+
3
1
-
+
3
1
-
+
8
1
-
+
8
1
-
+
4
1
-
+
5
1
-
+
2
12
-
+
2
12
-
+
2
5
-
+
2
12
-
+
2
5
-
+
2
1
-
+
2
1
-
+
4
1
-
+
4
1
-
+
5
1
-
+
5
1
-
+
7
1
-
+
7
1
-
+
4
1
-
+
4
0
-
+
5
0
-
+
2
0
-
+
4
0
-
+
10
0
-
+
3
0
-
+
5
0
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index 0256b9f3d53..889e7eb5d13 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -15,7 +15,7 @@
-
+
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index d90d7676ddb..351b55fdcfc 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -407,6 +407,16 @@ class project_issue(osv.Model):
task = self.pool.get('project.task').browse(cr, uid, task_id, context=context)
return {'value': {'user_id': task.user_id.id, }}
+ def onchange_partner_id(self, cr, uid, ids, partner_id, context=None):
+ """ This function returns value of partner email address based on partner
+ :param part: Partner's id
+ """
+ result = {}
+ if partner_id:
+ partner = self.pool['res.partner'].browse(cr, uid, partner_id, context)
+ result['email_from'] = partner.email
+ return {'value': result}
+
def get_empty_list_help(self, cr, uid, help, context=None):
context['empty_list_help_model'] = 'project.project'
context['empty_list_help_id'] = context.get('default_project_id')
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 9222d954001..3e90a2a43d6 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -65,7 +65,7 @@
-
+
diff --git a/addons/project_issue_sheet/i18n/sl.po b/addons/project_issue_sheet/i18n/sl.po
new file mode 100644
index 00000000000..8ead63388b9
--- /dev/null
+++ b/addons/project_issue_sheet/i18n/sl.po
@@ -0,0 +1,72 @@
+# Slovenian translation for openobject-addons
+# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-10-20 08:52+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Slovenian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2013-10-21 04:36+0000\n"
+"X-Generator: Launchpad (build 16807)\n"
+
+#. module: project_issue_sheet
+#: code:addons/project_issue_sheet/project_issue_sheet.py:57
+#, python-format
+msgid "The Analytic Account is pending !"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_account_analytic_line
+msgid "Analytic Line"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_project_issue
+msgid "Project Issue"
+msgstr ""
+
+#. module: project_issue_sheet
+#: model:ir.model,name:project_issue_sheet.model_hr_analytic_timesheet
+msgid "Timesheet Line"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+msgid "on_change_project(project_id)"
+msgstr ""
+
+#. module: project_issue_sheet
+#: code:addons/project_issue_sheet/project_issue_sheet.py:57
+#: field:project.issue,analytic_account_id:0
+#, python-format
+msgid "Analytic Account"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+msgid "Worklogs"
+msgstr ""
+
+#. module: project_issue_sheet
+#: field:account.analytic.line,create_date:0
+msgid "Create Date"
+msgstr ""
+
+#. module: project_issue_sheet
+#: view:project.issue:0
+#: field:project.issue,timesheet_ids:0
+msgid "Timesheets"
+msgstr ""
+
+#. module: project_issue_sheet
+#: field:hr.analytic.timesheet,issue_id:0
+msgid "Issue"
+msgstr ""
diff --git a/addons/project_long_term/i18n/es_MX.po b/addons/project_long_term/i18n/es_MX.po
index 0b930ae70a6..f3e591746da 100644
--- a/addons/project_long_term/i18n/es_MX.po
+++ b/addons/project_long_term/i18n/es_MX.po
@@ -1,168 +1,329 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# Spanish (Mexico) 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 , 2010.
+# FIRST AUTHOR , 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-18 09:17+0000\n"
-"Last-Translator: Borja López Soilán (NeoPolus) \n"
-"Language-Team: Spanish \n"
+"POT-Creation-Date: 2012-12-21 17:06+0000\n"
+"PO-Revision-Date: 2013-10-21 16:57+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Spanish (Mexico) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:54+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2013-10-22 04:44+0000\n"
+"X-Generator: Launchpad (build 16807)\n"
#. module: project_long_term
-#: model:ir.module.module,shortdesc:project_long_term.module_meta_information
-msgid "Long Term Project Management"
-msgstr "Gestión de proyectos a largo plazo"
+#: help:project.phase,constraint_date_end:0
+msgid "force the phase to finish before this date"
+msgstr ""
#. module: project_long_term
-#: view:project.compute.phases:0
-msgid "Compute Scheduling of Phases"
-msgstr "Calcular planificación de fases"
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "In Progress"
+msgstr ""
+
+#. module: project_long_term
+#: field:account.analytic.account,use_phases:0
+#: model:ir.actions.act_window,name:project_long_term.act_project_phases
+#: view:project.project:0
+msgid "Phases"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation
+#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation
+#: view:project.phase:0
+#: view:project.user.allocation:0
+msgid "Team Planning"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,user_ids:0
+msgid "Assigned Users"
+msgstr ""
#. module: project_long_term
#: view:project.phase:0
#: field:project.phase,next_phase_ids:0
msgid "Next Phases"
-msgstr "Siguientes fases"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_user_allocation
+msgid "Phase User Allocation"
+msgstr ""
#. module: project_long_term
#: view:project.phase:0
msgid "Project's Tasks"
-msgstr "Tareas del proyecto"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.act_project_phases
-msgid "Phases"
-msgstr "Fases"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: view:project.resource.allocation:0
-msgid "Group By..."
-msgstr "Agrupar por..."
-
-#. module: project_long_term
-#: constraint:project.project:0
-msgid "Error! project start-date must be lower then project end-date."
msgstr ""
-"¡Error! La fecha de inicio del proyecto debe ser anterior a la fecha final "
-"del proyecto."
#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.act_resouce_allocation
-#: view:project.resource.allocation:0
-msgid "Resources Allocation"
-msgstr "Asignación de recursos"
+#: model:ir.actions.act_window,help:project_long_term.action_project_compute_phases
+msgid ""
+"To schedule phases of all or a specified project. It then open a gantt "
+"view.\n"
+" "
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,task_ids:0
+msgid "Project Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases
+#: model:ir.ui.menu,name:project_long_term.menu_compute_phase
+#: view:project.compute.phases:0
+msgid "Schedule Phases"
+msgstr ""
#. module: project_long_term
#: view:project.phase:0
-msgid "Displaying Settings"
-msgstr "Mostrando configuración"
+#: field:project.phase,state:0
+msgid "Status"
+msgstr ""
#. module: project_long_term
#: field:project.compute.phases,target_project:0
-msgid "Schedule"
-msgstr "Programa"
-
-#. module: project_long_term
-#: model:ir.module.module,description:project_long_term.module_meta_information
-msgid ""
-"\n"
-"\n"
-" Long Term Project management module that tracks planning, "
-"scheduling, resources allocation.\n"
-" Mainly used with Big project management.\n"
-" - Project Phases will be maintained by Manager of the project\n"
-" - Compute Phase Scheduling: Compute start date and end date of "
-"the phases which are in draft,open and pending state of the project given.\n"
-" If no project given then all the "
-"draft,open and pending state phases will be taken\n"
-" - Compute Task Scheduling: This works same as the scheduler "
-"button on project.phase. It takes the project as argument and computes all "
-"the open,draft and pending tasks\n"
-" - Schedule Tasks: All the tasks which are in draft,pending and "
-"open state are scheduled with taking the phase's start date\n"
-"\n"
-" "
+msgid "Action"
msgstr ""
-"\n"
-"\n"
-" Módulo de Gestión de Proyectos a Largo Plazo que realiza el "
-"seguimiento de planeamiento, programación, asignación de recursos.\n"
-" Utilizado principalmente con la gestión de proyectos grandes.\n"
-" - Las Fases del Proyecto serán gestionadas por el Administrador "
-"del proyecto\n"
-" - Calcula la Programación de Fases: Calcula la fecha de inicio y "
-"fecha de finalización de las fases del proyecto en estado borrador, abierto "
-"y pendiente.\n"
-" Si no hay ningún proyecto concreto, "
-"entonces se llevarán todas las fases en estado borrador, abierto y "
-"pendiente\n"
-" - Calcula la Programación de Tareas: Esto funciona igual que el "
-"botón programador de project.phase. Toma el proyecto como argumento y "
-"calcula todas las tareas abiertas, en borrador y pendientes.\n"
-" - Programa tareas: Todas las tareas en estado borrador, "
-"pendiente y abierto se programan desde la fecha de inicio de la fase\n"
-"\n"
-" "
#. module: project_long_term
-#: constraint:project.task:0
-msgid "Error ! You cannot create recursive tasks."
-msgstr "¡Error! No se pueden crear tareas recursivas."
-
-#. module: project_long_term
-#: model:ir.ui.menu,name:project_long_term.menu_resouce_allocation
-msgid "Resource Allocations"
-msgstr "Asignación de recursos"
-
-#. module: project_long_term
-#: constraint:project.project:0
-msgid "Error! You cannot assign escalation to the same project!"
-msgstr "¡Error! No puede asignar un escalado al mismo proyecto."
-
-#. module: project_long_term
-#: code:addons/project_long_term/project_long_term.py:128
-#, python-format
-msgid "Day"
-msgstr "Día"
+#: view:project.phase:0
+msgid "Start Phase"
+msgstr ""
#. module: project_long_term
#: model:ir.model,name:project_long_term.model_project_task
msgid "Task"
-msgstr "Tarea"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Draft"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "C_ompute"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "New"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,product_uom:0
+msgid "Duration Unit of Measure"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves
+msgid "Resource Leaves"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: selection:project.phase,state:0
+msgid "Pending"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,progress:0
+msgid "Computed based on related tasks"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "In Progress Phases"
+msgstr ""
+
+#. module: project_long_term
+#: code:addons/project_long_term/project_long_term.py:140
+#, python-format
+msgid "%s (copy)"
+msgstr ""
+
+#. module: project_long_term
+#: code:addons/project_long_term/wizard/project_compute_phases.py:48
+#, python-format
+msgid "Please specify a project to schedule."
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: view:project.user.allocation:0
+msgid "Group By..."
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Remaining Hours"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,constraint_date_start:0
+msgid "Minimum Start Date"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,product_uom:0
+msgid ""
+"Unit of Measure (Unit of Measure) is the unit of measurement for Duration"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,user_ids:0
+msgid ""
+"The resources on the project can be computed automatically by the scheduler."
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: project_long_term
+#: help:account.analytic.account,use_phases:0
+msgid "Check this field if you plan to use phase-based scheduling"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,state:0
+msgid ""
+"If the phase is created the status 'Draft'.\n"
+" If the phase is started, the status becomes 'In Progress'.\n"
+" If review is needed the phase is in 'Pending' status. "
+" \n"
+" If the phase is over, the status is set to 'Done'."
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,progress:0
+msgid "Progress"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_pm_users_project1
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource
+msgid "Resources"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "My Projects"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.project:0
+#: view:project.user.allocation:0
+msgid "Phase"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,duration:0
+msgid "By default in days"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar
+msgid "Working Time"
+msgstr "Horario de trabajo"
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Pending Phases"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.user.allocation,date_start:0
+msgid "Starting Date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Related Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Start Month"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,date_end:0
+#: field:project.user.allocation,date_end:0
+msgid "End Date"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_compute_tasks
+msgid "Project Compute Tasks"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,help:project_long_term.act_project_phase
+msgid ""
+"A project can be split into the different phases. For each phase, you can "
+"define your users allocation, describe different tasks and link your phase "
+"to previous and next phases, add date constraints for the automated "
+"scheduling. Use the long term planning in order to planify your available "
+"users, convert your phases into a series of tasks when you start working on "
+"the project."
+msgstr ""
#. module: project_long_term
#: selection:project.compute.phases,target_project:0
msgid "Compute a Single Project"
-msgstr "Calcular un sólo proyecto"
+msgstr ""
#. module: project_long_term
#: view:project.phase:0
#: field:project.phase,previous_phase_ids:0
msgid "Previous Phases"
-msgstr "Fases previas"
+msgstr ""
#. module: project_long_term
-#: help:project.phase,product_uom:0
-msgid "UoM (Unit of Measure) is the unit of measurement for Duration"
-msgstr "UdM (Unidad de Medida) es la unidad de medida para la duración"
+#: view:project.phase:0
+msgid "New Phases"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Tasks Details"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.project,phase_count:0
+msgid "Open Phases"
+msgstr ""
#. module: project_long_term
#: help:project.phase,date_end:0
msgid ""
" It's computed by the scheduler according to the start date and the duration."
msgstr ""
-" Es calculado por el planificador en fucnión de la fecha de inicio y la "
-"duración"
+
+#. module: project_long_term
+#: constraint:project.phase:0
+msgid "Loops in phases not allowed"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+#: field:project.user.allocation,user_id:0
+msgid "User"
+msgstr ""
#. module: project_long_term
#: model:ir.model,name:project_long_term.model_project_project
@@ -170,175 +331,88 @@ msgstr ""
#: field:project.compute.tasks,project_id:0
#: view:project.phase:0
#: field:project.phase,project_id:0
-#: view:project.resource.allocation:0
-#: field:project.resource.allocation,project_id:0
#: view:project.task:0
+#: view:project.user.allocation:0
+#: field:project.user.allocation,project_id:0
msgid "Project"
-msgstr "Proyecto"
+msgstr ""
#. module: project_long_term
-#: code:addons/project_long_term/wizard/project_compute_phases.py:50
-#, python-format
-msgid "Error!"
-msgstr "¡Error!"
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "Cancel"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Project Users"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_project_phase
+#: view:project.phase:0
+#: view:project.task:0
+#: field:project.task,phase_id:0
+#: field:project.user.allocation,phase_id:0
+msgid "Project Phase"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule
+msgid "Scheduling"
+msgstr ""
+
+#. module: project_long_term
+#: constraint:project.phase:0
+msgid "Phase start-date must be lower than phase end-date."
+msgstr ""
#. module: project_long_term
#: selection:project.phase,state:0
msgid "Cancelled"
-msgstr "Cancelado"
-
-#. module: project_long_term
-#: help:project.resource.allocation,date_end:0
-msgid "Ending Date"
-msgstr "Fecha de fin"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Planning"
-msgstr "Planificación"
-
-#. module: project_long_term
-#: field:project.phase,constraint_date_end:0
-msgid "Deadline"
-msgstr "Fecha límite"
-
-#. module: project_long_term
-#: view:project.compute.phases:0
-#: view:project.compute.tasks:0
-msgid "_Cancel"
-msgstr "_Cancelar"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.action_project_compute_phases
-#: model:ir.ui.menu,name:project_long_term.menu_compute_phase
-msgid "Compute Phase Scheduling"
-msgstr "Calcular planificación de fases"
-
-#. module: project_long_term
-#: code:addons/project_long_term/project_long_term.py:190
-#, python-format
-msgid " (copy)"
-msgstr " (copia)"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: view:project.resource.allocation:0
-#: field:project.resource.allocation,useability:0
-msgid "Availability"
-msgstr "Disponibilidad"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: field:project.phase,state:0
-msgid "State"
-msgstr "Estado"
-
-#. module: project_long_term
-#: view:project.compute.phases:0
-#: view:project.compute.tasks:0
-msgid "C_ompute"
-msgstr "C_alcular"
-
-#. module: project_long_term
-#: view:project.compute.phases:0
-msgid "Compute Scheduling of phases for all or specified project"
msgstr ""
-"Calcular planificación de fases para todos o el proyecto especificado"
#. module: project_long_term
-#: field:project.phase,product_uom:0
-msgid "Duration UoM"
-msgstr "UdM duración"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks
-#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks
-msgid "Compute Task Scheduling"
-msgstr "Calcular planificación de tareas"
-
-#. module: project_long_term
-#: field:project.phase,constraint_date_start:0
-msgid "Minimum Start Date"
-msgstr "Fecha de inicio mínima"
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_project_resource_allocation
#: view:project.phase:0
-#: view:project.resource.allocation:0
-msgid "Project Resource Allocation"
-msgstr "Asignación de recursos de proyecto"
-
-#. module: project_long_term
-#: view:project.compute.tasks:0
-msgid "Compute Scheduling of Task"
-msgstr "Calcular planificación de tarea"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.act_project_resource
-#: model:ir.ui.menu,name:project_long_term.menu_pm_resources_project1
-#: model:ir.ui.menu,name:project_long_term.menu_view_resource
-#: view:project.resource.allocation:0
-msgid "Resources"
-msgstr "Recursos"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,help:project_long_term.action_project_compute_phases
-msgid ""
-"To schedule phases of all or a specified project. It then open a gantt "
-"view.\n"
-"\t "
+msgid "Total Hours"
msgstr ""
-"Para programar las fases de todos los proyectos, o uno específico. A "
-"continuación, abrirá una vista de Gantt.\n"
-"\t "
#. module: project_long_term
-#: help:project.resource.allocation,date_start:0
-msgid "Starting Date"
-msgstr "Fecha de inicio"
+#: model:ir.model,name:project_long_term.model_project_compute_phases
+msgid "Project Compute Phases"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,date_start:0
+#: field:project.user.allocation,date_start:0
+msgid "Start Date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Constraints"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,sequence:0
+msgid "Gives the sequence order when displaying a list of phases."
+msgstr ""
#. module: project_long_term
#: model:ir.actions.act_window,name:project_long_term.project_phase_task_list
-msgid "Related Tasks"
-msgstr "Tareas relacionadas"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Dates"
-msgstr "Fechas"
-
-#. module: project_long_term
-#: help:project.resource.allocation,useability:0
-msgid ""
-"Availability of this resource for this project phase in percentage (=50%)"
+msgid "Tasks"
msgstr ""
-"La disponibilidad de este recurso para esta fase de proyecto en porcentaje "
-"(=50%)"
#. module: project_long_term
-#: help:project.phase,constraint_date_start:0
-msgid "force the phase to start after this date"
-msgstr "Forzar que la fase epiece después de esta fecha"
+#: help:project.user.allocation,date_end:0
+msgid "Ending Date"
+msgstr ""
#. module: project_long_term
-#: field:project.phase,task_ids:0
-msgid "Project Tasks"
-msgstr "Tareas de proyecto"
-
-#. module: project_long_term
-#: field:project.phase,resource_ids:0
-msgid "Project Resources"
-msgstr "Recursos de proyecto"
-
-#. module: project_long_term
-#: view:project.schedule.tasks:0
-msgid "_Ok"
-msgstr "_Aceptar"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Schedule and Display info"
-msgstr "Planificar y mostrar información"
+#: code:addons/project_long_term/wizard/project_compute_phases.py:48
+#, python-format
+msgid "Error!"
+msgstr ""
#. module: project_long_term
#: help:project.phase,date_start:0
@@ -346,103 +420,6 @@ msgid ""
"It's computed by the scheduler according the project date or the end date of "
"the previous phase."
msgstr ""
-"Es calculado por el planificador en función de la fecha inicio o fecha fin "
-"de la fase anterior"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Month"
-msgstr "Mes"
-
-#. module: project_long_term
-#: constraint:project.phase:0
-msgid "Phase start-date must be lower than phase end-date."
-msgstr "La fecha-inicio de la fase debe ser anterior a la fecha-fin."
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_project_schedule_tasks
-msgid "project.schedule.tasks"
-msgstr "proyecto.planificar.tareas"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,help:project_long_term.act_project_phase
-msgid ""
-"A project can be split into the different phases. For each phase, you can "
-"define your resources allocation, describe different tasks and link your "
-"phase to previous and next phases, add date constraints for the automated "
-"scheduling. Use the long term planning in order to planify your available "
-"human resources, convert your phases into a series of tasks when you start "
-"working on the project."
-msgstr ""
-"Un proyecto se puede dividir en diferentes fases. Para cada fase, puede "
-"definir su asignación de recursos, describir diferentes tareas y vincular su "
-"fase a fases previas y posteriores, añadir restricciones de fecha para la "
-"programación automática. Cuando empiece a trabajar en el proyecto, use el "
-"planeamiento a largo plazo para planificar sus recursos humanos disponibles "
-"y convertir sus fases en una serie de tareas."
-
-#. module: project_long_term
-#: field:project.phase,date_start:0
-#: field:project.resource.allocation,date_start:0
-msgid "Start Date"
-msgstr "Fecha inicio"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Resource Allocation"
-msgstr "Asignación de recursos"
-
-#. module: project_long_term
-#: help:project.phase,constraint_date_end:0
-msgid "force the phase to finish before this date"
-msgstr "Forzar que la fase termine antes de esta fecha"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: selection:project.phase,state:0
-msgid "Draft"
-msgstr "Borrador"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: selection:project.phase,state:0
-msgid "Pending"
-msgstr "Pendiente"
-
-#. module: project_long_term
-#: field:project.resource.allocation,name:0
-msgid "unknown"
-msgstr "desconocido"
-
-#. module: project_long_term
-#: field:project.resource.allocation,user_id:0
-msgid "User"
-msgstr "Usuario"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Task Detail"
-msgstr "Detalles tarea"
-
-#. module: project_long_term
-#: help:project.project,resource_calendar_id:0
-msgid "Timetable working hours to adjust the gantt diagram report"
-msgstr "Horario de trabajo para ajustar el informe del diagrama de Gantt"
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_project_compute_tasks
-msgid "Project Compute Tasks"
-msgstr "Calcular tareas proyecto"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Constraints"
-msgstr "Restricciones"
-
-#. module: project_long_term
-#: help:project.phase,sequence:0
-msgid "Gives the sequence order when displaying a list of phases."
-msgstr "Indica el orden cuando se muestra la lista de fases"
#. module: project_long_term
#: model:ir.actions.act_window,name:project_long_term.act_project_phase
@@ -452,182 +429,74 @@ msgstr "Indica el orden cuando se muestra la lista de fases"
#: view:project.phase:0
#: field:project.project,phase_ids:0
msgid "Project Phases"
-msgstr "Fases proyecto"
+msgstr ""
+
+#. module: project_long_term
+#: help:project.phase,constraint_date_start:0
+msgid "force the phase to start after this date"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+msgid "Month"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.model,name:project_long_term.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: project_long_term
+#: field:project.phase,constraint_date_end:0
+msgid "Deadline"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+msgid "Project User Allocation"
+msgstr ""
+
+#. module: project_long_term
+#: model:ir.actions.act_window,name:project_long_term.action_project_compute_tasks
+#: model:ir.ui.menu,name:project_long_term.menu_compute_tasks
+#: view:project.compute.tasks:0
+msgid "Schedule Tasks"
+msgstr ""
#. module: project_long_term
#: view:project.phase:0
#: selection:project.phase,state:0
msgid "Done"
-msgstr "Hecho"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Cancel"
-msgstr "Cancelar"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: selection:project.phase,state:0
-msgid "In Progress"
-msgstr "En proceso"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Remaining Hours"
-msgstr "Horas restantes"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: field:project.phase,responsible_id:0
-msgid "Responsible"
-msgstr "Responsable"
-
-#. module: project_long_term
-#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar
-#: field:project.project,resource_calendar_id:0
-msgid "Working Time"
-msgstr "Horario de trabajo"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Current"
-msgstr "Actual"
-
-#. module: project_long_term
-#: view:project.phase:0
-msgid "Start Phase"
-msgstr "Comenzar fase"
-
-#. module: project_long_term
-#: code:addons/project_long_term/wizard/project_compute_phases.py:50
-#, python-format
-msgid "Please Specify Project to be schedule"
-msgstr "Por favor seleccione el proyecto a planificar"
-
-#. module: project_long_term
-#: view:project.phase:0
-#: field:project.phase,total_hours:0
-msgid "Total Hours"
-msgstr "Total horas"
-
-#. module: project_long_term
-#: view:project.schedule.tasks:0
-msgid "Task Scheduling completed successfully."
-msgstr "Planificación de tareas completada satisfactoriamente."
-
-#. module: project_long_term
-#: view:project.compute.tasks:0
-msgid "Compute Scheduling of Task for specified project."
-msgstr "Calcular planificación de tareas para un proyecto específico"
-
-#. module: project_long_term
-#: view:project.resource.allocation:0
-msgid "Phase"
-msgstr "Fase"
-
-#. module: project_long_term
-#: help:project.phase,state:0
-msgid ""
-"If the phase is created the state 'Draft'.\n"
-" If the phase is started, the state becomes 'In Progress'.\n"
-" If review is needed the phase is in 'Pending' state. "
-" \n"
-" If the phase is over, the states is set to 'Done'."
msgstr ""
-"Si la fase se crea, el estado es \"Borrador\".\n"
-" Si la fase comienza, el estado cambia a \"En Proceso\".\n"
-" Si se necesita revisión, la fase está en estado \"Pendiente\".\n"
-" Si la fase está terminada, el estado se fija en \"Hecho\"."
#. module: project_long_term
-#: field:project.phase,date_end:0
-#: field:project.resource.allocation,date_end:0
-msgid "End Date"
-msgstr "Fecha de fin"
+#: selection:project.compute.phases,target_project:0
+msgid "Compute All My Projects"
+msgstr ""
#. module: project_long_term
-#: view:project.resource.allocation:0
-#: field:project.resource.allocation,resource_id:0
-msgid "Resource"
-msgstr "Recurso"
+#: field:project.phase,user_force_ids:0
+msgid "Force Assigned Users"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.phase:0
+#: field:project.phase,duration:0
+msgid "Duration"
+msgstr ""
+
+#. module: project_long_term
+#: view:project.user.allocation:0
+msgid "Users"
+msgstr ""
#. module: project_long_term
#: field:project.phase,name:0
msgid "Name"
-msgstr "Nombre"
+msgstr ""
#. module: project_long_term
-#: view:project.phase:0
-msgid "Tasks Details"
-msgstr "Detalles tareas"
-
-#. module: project_long_term
-#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar
-msgid "Working Period"
-msgstr "Periodo de trabajo"
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_resource_resource
-msgid "Resource Detail"
-msgstr "Detalle recurso"
-
-#. module: project_long_term
-#: model:ir.ui.menu,name:project_long_term.menu_phase_schedule
-msgid "Scheduling"
-msgstr "Planificación"
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_project_phase
-#: view:project.phase:0
-#: field:project.resource.allocation,phase_id:0
-#: view:project.task:0
-#: field:project.task,phase_id:0
-msgid "Project Phase"
-msgstr "Fase proyecto"
-
-#. module: project_long_term
-#: model:ir.model,name:project_long_term.model_project_compute_phases
-msgid "Project Compute Phases"
-msgstr "Calcular fases del proyecto"
-
-#. module: project_long_term
-#: field:project.schedule.tasks,msg:0
-msgid "Message"
-msgstr "Mensaje"
-
-#. module: project_long_term
-#: constraint:project.phase:0
-msgid "Loops in phases not allowed"
-msgstr "No se permiten bucles en fases"
-
-#. module: project_long_term
-#: field:project.phase,sequence:0
-msgid "Sequence"
-msgstr "Secuencia"
-
-#. module: project_long_term
-#: selection:project.compute.phases,target_project:0
-msgid "Compute All Projects"
-msgstr "Calcular todos los proyectos"
-
-#. module: project_long_term
-#: model:ir.ui.menu,name:project_long_term.menu_view_resource_calendar_leaves
-msgid "Resource Leaves"
-msgstr "Ausencias recursos"
-
-#. module: project_long_term
-#: model:ir.actions.act_window,name:project_long_term.action_project_schedule_tasks
-#: view:project.phase:0
-#: view:project.schedule.tasks:0
-msgid "Schedule Tasks"
-msgstr "Planificar tareas"
-
-#. module: project_long_term
-#: help:project.phase,duration:0
-msgid "By default in days"
-msgstr "Por defecto en días"
-
-#. module: project_long_term
-#: field:project.phase,duration:0
-msgid "Duration"
-msgstr "Duración"
+#: view:project.compute.phases:0
+#: view:project.compute.tasks:0
+msgid "or"
+msgstr ""
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index a45afd1c5bc..e551eb40396 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -1041,28 +1041,25 @@ class procurement_order(osv.osv):
partner_obj = self.pool.get('res.partner')
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
for procurement in self.browse(cr, uid, ids, context=context):
- if not procurement.product_id.seller_ids:
- message = _('No supplier defined for this product !')
- self.message_post(cr, uid, [procurement.id], body=message)
- cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id))
- return False
+ message = ''
partner = procurement.product_id.seller_id #Taken Main Supplier of Product of Procurement.
- if not partner:
+ if not procurement.product_id.seller_ids:
+ message = _('No supplier defined for this product !')
+ elif not partner:
message = _('No default supplier defined for this product')
- self.message_post(cr, uid, [procurement.id], body=message)
- cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id))
+ elif not partner_obj.address_get(cr, uid, [partner.id], ['delivery'])['delivery']:
+ message = _('No address defined for the supplier')
+
+ if message:
+ if procurement.message != message:
+ cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id))
return False
+
if user.company_id and user.company_id.partner_id:
if partner.id == user.company_id.partner_id.id:
raise osv.except_osv(_('Configuration Error!'), _('The product "%s" has been defined with your company as reseller which seems to be a configuration error!' % procurement.product_id.name))
- address_id = partner_obj.address_get(cr, uid, [partner.id], ['delivery'])['delivery']
- if not address_id:
- message = _('No address defined for the supplier')
- self.message_post(cr, uid, [procurement.id], body=message)
- cr.execute('update procurement_order set message=%s where id=%s', (message, procurement.id))
- return False
return True
diff --git a/addons/sale/security/sale_security.xml b/addons/sale/security/sale_security.xml
index 710fbdcc207..557562275d7 100644
--- a/addons/sale/security/sale_security.xml
+++ b/addons/sale/security/sale_security.xml
@@ -36,7 +36,6 @@
Properties on lines
-
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index 16b25c6dbda..5388e76fe6d 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 1e032626194..d818ca794d5 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -73,6 +73,8 @@ class stock_location(osv.osv):
_parent_order = 'posz,name'
_order = 'parent_left'
+ # TODO: implement name_search() in a way that matches the results of name_get!
+
def name_get(self, cr, uid, ids, context=None):
# always return the full hierarchical name
res = self._complete_name(cr, uid, ids, 'complete_name', None, context=context)
@@ -399,14 +401,15 @@ class stock_location(osv.osv):
uom_rounding = uom_obj.browse(cr, uid, context.get('uom'), context=context).rounding
locations_ids = self.search(cr, uid, [('location_id', 'child_of', ids)])
- # Fetch only the locations in which this product has ever been processed (in or out)
- cr.execute("""SELECT l.id FROM stock_location l WHERE l.id in %s AND
- EXISTS (SELECT 1 FROM stock_move m WHERE m.product_id = %s
- AND ((state = 'done' AND m.location_dest_id = l.id)
- OR (state in ('done','assigned') AND m.location_id = l.id)))
- """, (tuple(locations_ids), product_id,))
-
- for id in [i for (i,) in cr.fetchall()]:
+ if locations_ids:
+ # Fetch only the locations in which this product has ever been processed (in or out)
+ cr.execute("""SELECT l.id FROM stock_location l WHERE l.id in %s AND
+ EXISTS (SELECT 1 FROM stock_move m WHERE m.product_id = %s
+ AND ((state = 'done' AND m.location_dest_id = l.id)
+ OR (state in ('done','assigned') AND m.location_id = l.id)))
+ """, (tuple(locations_ids), product_id,))
+ locations_ids = [i for (i,) in cr.fetchall()]
+ for id in locations_ids:
if lock:
try:
# Must lock with a separate select query because FOR UPDATE can't be used with