summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-03-28 17:27:19 +0200
committerChristophe Simonis <chs@odoo.com>2017-03-28 17:27:19 +0200
commit2f68e9e93a11f37241c1be2835e74ff8be95db1d (patch)
tree74dd3d3ae1bbca5b87f2b5715c2e4a3d1baf457b /addons
parent55895c7de10592751058b02c01eed39f2d3cffe9 (diff)
parent72fa3e8bdae7b339c75294de51ce261b7a9da173 (diff)
[MERGE] forward port branch 10.0 up to 72fa3e8bdae
Diffstat (limited to 'addons')
-rw-r--r--addons/account/demo/account_bank_statement.yml9
-rw-r--r--addons/account/demo/account_invoice_demo.yml36
-rw-r--r--addons/account/models/account.py11
-rw-r--r--addons/account/models/account_bank_statement.py2
-rw-r--r--addons/account/models/account_invoice.py2
-rw-r--r--addons/account/models/account_journal_dashboard.py2
-rw-r--r--addons/account/models/company.py9
-rw-r--r--addons/account/tests/test_account_move_closed_period.py9
-rw-r--r--addons/account/views/account_view.xml2
-rw-r--r--addons/account_asset/models/account_invoice.py2
-rw-r--r--addons/account_check_printing/models/account_payment.py1
-rw-r--r--addons/barcodes/static/src/js/barcode_events.js1
-rw-r--r--addons/barcodes/static/src/js/field_float_scannable.js4
-rw-r--r--addons/base_automation/data/base_automation_demo.xml27
-rw-r--r--addons/base_automation/models/base_automation.py13
-rw-r--r--addons/base_automation/tests/test_base_automation.py24
-rw-r--r--addons/base_automation/tests/test_models.py14
-rw-r--r--addons/calendar/models/calendar.py2
-rw-r--r--addons/calendar/tests/test_calendar_recurrent_event_case2.py24
-rw-r--r--addons/hr_attendance/models/hr_attendance.py14
-rw-r--r--addons/hr_expense/models/hr_expense.py36
-rw-r--r--addons/hr_holidays/models/hr_holidays.py3
-rw-r--r--addons/hr_maintenance/views/maintenance_views.xml6
-rw-r--r--addons/hr_timesheet_attendance/report/hr_timesheet_attendance_report_view.xml2
-rw-r--r--addons/hw_posbox_homepage/controllers/main.py5
-rw-r--r--addons/hw_screen/__init__.py4
-rw-r--r--addons/hw_screen/__openerp__.py21
-rw-r--r--addons/hw_screen/controllers/__init__.py4
-rw-r--r--addons/hw_screen/controllers/main.py166
-rw-r--r--addons/hw_screen/static/src/css/cust_css.css21
-rw-r--r--addons/hw_screen/static/src/js/worker.js60
-rw-r--r--addons/l10n_be/data/account_tax_template_data.xml6
-rw-r--r--addons/l10n_ch/i18n_extra/de.po607
-rw-r--r--addons/l10n_do/__init__.py2
-rw-r--r--addons/l10n_do/__manifest__.py106
-rw-r--r--addons/l10n_do/data/account.account.template.csv450
-rw-r--r--addons/l10n_do/data/account.account.type.csv17
-rw-r--r--addons/l10n_do/data/account.fiscal.position.tax.template.csv4
-rw-r--r--addons/l10n_do/data/account.fiscal.position.template.csv18
-rw-r--r--addons/l10n_do/data/account.tax.template.csv19
-rw-r--r--addons/l10n_do/data/account.tax.template.xml364
-rw-r--r--addons/l10n_do/data/account_chart_template_data.xml21
-rw-r--r--addons/l10n_do/data/account_chart_template_data.yml2
-rw-r--r--addons/l10n_do/data/fiscal_position_template.xml146
-rw-r--r--addons/l10n_do/data/l10n_do_chart_data.xml42
-rw-r--r--addons/l10n_do/data/l10n_do_state_data.xml103
-rw-r--r--addons/l10n_do/models/__init__.py4
-rw-r--r--addons/l10n_do/models/chart_template.py18
-rw-r--r--addons/mail/static/src/js/client_action.js2
-rw-r--r--addons/mail/static/src/js/many2many_tags_email.js71
-rw-r--r--addons/mrp/models/mrp_production.py11
-rw-r--r--addons/mrp/models/product.py7
-rw-r--r--addons/mrp/models/stock_move.py4
-rw-r--r--addons/mrp/security/ir.model.access.csv1
-rw-r--r--addons/mrp/views/mrp_production_views.xml5
-rw-r--r--addons/point_of_sale/static/src/js/gui.js13
-rwxr-xr-xaddons/point_of_sale/tools/posbox/configuration/setup_ramdisks.sh2
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/etc/lightdm/lightdm.conf8
-rwxr-xr-xaddons/point_of_sale/tools/posbox/overwrite_after_init/etc/xdg/openbox/autostart6
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/manifest.mf32
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.rsabin0 -> 4197 bytes
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.sf4
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/README3
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/chrome.manifest4
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.js34
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.xul175
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskunknownContentType.xul9
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskxpinstallConfirm.xul9
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/install.rdf19
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_after_init/usr/share/firefox-esr/browser/defaults/preferences/all-posbox.js7
-rwxr-xr-xaddons/point_of_sale/tools/posbox/overwrite_before_init/etc/init.d/odoo2
-rwxr-xr-xaddons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh47
-rw-r--r--addons/point_of_sale/tools/posbox/overwrite_before_init/etc/udev/rules.d/99-z-input.rules2
-rwxr-xr-xaddons/point_of_sale/tools/posbox/posbox_create_image.sh23
-rw-r--r--addons/purchase/models/purchase.py17
-rw-r--r--addons/purchase/tests/test_purchase_order.py2
-rw-r--r--addons/rating_project/data/project_data.xml2
-rw-r--r--addons/report/static/src/js/report.editor.js4
-rw-r--r--addons/sale/models/sale.py1
-rw-r--r--addons/stock/models/stock_move.py8
-rw-r--r--addons/stock/security/ir.model.access.csv2
-rw-r--r--addons/theme_default/static/src/less/option_layout_boxed.less8
-rw-r--r--addons/web/static/src/js/framework/pyeval.js45
-rw-r--r--addons/web/static/src/js/views/form_relational_widgets.js3
-rw-r--r--addons/web/static/src/js/views/form_view.js33
-rw-r--r--addons/web/static/src/js/views/list_view.js8
-rw-r--r--addons/web/static/src/js/views/list_view_editable.js6
-rw-r--r--addons/web/static/src/less/tooltip.less2
-rw-r--r--addons/web/static/test/evals.js5
-rw-r--r--addons/web_calendar/static/src/js/web_calendar.js8
-rw-r--r--addons/web_editor/models/ir_ui_view.py2
-rw-r--r--addons/web_editor/static/src/js/transcoder.js2
-rw-r--r--addons/web_editor/static/src/js/widgets.js1
-rw-r--r--addons/web_kanban/static/src/js/kanban_view.js2
-rw-r--r--addons/website_forum/views/website_forum.xml6
-rw-r--r--addons/website_quote/models/sale_quote.py2
-rw-r--r--addons/website_sale/controllers/main.py11
-rw-r--r--addons/website_sale/models/sale_order.py16
98 files changed, 2607 insertions, 554 deletions
diff --git a/addons/account/demo/account_bank_statement.yml b/addons/account/demo/account_bank_statement.yml
index 2275b3b9bd3..ec1d97b411f 100644
--- a/addons/account/demo/account_bank_statement.yml
+++ b/addons/account/demo/account_bank_statement.yml
@@ -2,7 +2,8 @@
Create demo bank statement
-
!python {model: ir.model.data, id: False} : |
- journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
+ default_company = self.env['res.company']._company_default_get('account.journal')
+ journal = self.env['account.journal'].search([('type', '=', 'bank'), ('company_id', '=', default_company.id)], limit=1)
import time
if journal:
vals = {
@@ -11,7 +12,6 @@
'date': time.strftime('%Y')+'-01-01',
'name': "BNK/2014/001",
'balance_end_real': '8998.2',
- 'company_id': ref('base.main_company'),
'balance_start': 5103.0
}
self._update('account.bank.statement', 'account', vals, 'demo_bank_statement_1')
@@ -19,7 +19,6 @@
'ref': '',
'statement_id': ref('account.demo_bank_statement_1'),
'sequence': 1,
- 'company_id': ref('base.main_company'),
'name': "SAJ/2014/002 and SAJ/2014/003",
'journal_id': journal.id,
'amount': 1175.0,
@@ -31,7 +30,6 @@
'ref': '',
'statement_id': ref('account.demo_bank_statement_1'),
'sequence': 2,
- 'company_id': ref('base.main_company'),
'name': "Bank fees",
'journal_id': journal.id,
'amount': -32.58,
@@ -42,7 +40,6 @@
'ref': '',
'statement_id': ref('account.demo_bank_statement_1'),
'sequence': 3,
- 'company_id': ref('base.main_company'),
'name': "Prepayment",
'journal_id': journal.id,
'amount': 650.0,
@@ -54,7 +51,6 @@
'ref': '',
'statement_id': ref('account.demo_bank_statement_1'),
'sequence': 4,
- 'company_id': ref('base.main_company'),
'name': "First 2000 € of SAJ/2014/001",
'journal_id': journal.id,
'amount': 2000.0,
@@ -66,7 +62,6 @@
'ref': '',
'statement_id': ref('account.demo_bank_statement_1'),
'sequence': 5,
- 'company_id': ref('base.main_company'),
'name': "Last Year Interests",
'journal_id': journal.id,
'amount': 102.78,
diff --git a/addons/account/demo/account_invoice_demo.yml b/addons/account/demo/account_invoice_demo.yml
index e131aec2292..262c35e3666 100644
--- a/addons/account/demo/account_invoice_demo.yml
+++ b/addons/account/demo/account_invoice_demo.yml
@@ -2,7 +2,6 @@
Set the context for customer invoices because the 'type' field is readonly in invoice form views, so it value won't be considered by the yaml import
-
!record {model: account.invoice, id: demo_invoice_1}:
- company_id: base.main_company
partner_id: base.res_partner_12
user_id: base.user_demo
reference_type: none
@@ -21,7 +20,6 @@
self.action_invoice_open()
-
!record {model: account.invoice, id: demo_invoice_2}:
- company_id: base.main_company
partner_id: base.res_partner_2
type: 'out_invoice'
date_invoice: !eval time.strftime('%Y-%m')+'-08'
@@ -37,7 +35,6 @@
self.action_invoice_open()
-
!record {model: account.invoice, id: demo_invoice_3}:
- company_id: base.main_company
partner_id: base.res_partner_2
type: 'out_invoice'
date_invoice: !eval time.strftime('%Y-%m')+'-08'
@@ -79,7 +76,6 @@
type: 'in_invoice'
-
!record {model: account.invoice, id: demo_invoice_0}:
- company_id: base.main_company
partner_id: base.res_partner_12
user_id: base.user_demo
reference_type: none
@@ -97,7 +93,6 @@
uom_id: product.product_uom_unit
-
!record {model: account.invoice, id: demo_invoice_january_wages}:
- company_id: base.main_company
partner_id: base.res_partner_12
type: 'in_invoice'
date_invoice: !eval time.strftime('%Y-%m')+'-01'
@@ -108,16 +103,16 @@
'name': "CEO wages",
'price_unit': 10000,
}
- account = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_ceo_wages_account')])], limit=1)
+ default_company = self.env['res.company']._company_default_get('account.account')
+ account = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_ceo_wages_account')]), ('company_id', '=', default_company.id)], limit=1)
if not account:
- account = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses'))], limit=1)
+ account = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses')), ('company_id', '=', default_company.id)], limit=1)
if account:
line_vals['account_id'] = account.id
self._update('account.invoice.line', 'account', line_vals, 'ceo_wages_line')
self.env['account.invoice'].browse(ref('demo_invoice_january_wages')).action_invoice_open()
-
!record {model: account.invoice, id: demo_invoice_equipment_purchase}:
- company_id: base.main_company
partner_id: base.res_partner_1
type: 'in_invoice'
date_invoice: !eval time.strftime('%Y-%m')+'-15'
@@ -128,22 +123,27 @@
'name': "Coffee Machine with huge 'employee\'s performances boosting perk'",
'price_unit': 4999.99,
}
- account_id = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_coffee_machine_account')])], limit=1).id
+ account_default_company = self.env['res.company']._company_default_get('account.account')
+ account_id = self.env['account.account'].search([('tag_ids', 'in', [ref('account.demo_coffee_machine_account')]), ('company_id', '=', account_default_company.id)], limit=1).id
if not account_id:
- account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses'))], limit=1).id
+ account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_expenses')), ('company_id', '=', account_default_company.id)], limit=1).id
if account_id:
line_vals['account_id'] = account_id
- tax_id = self.env['account.tax'].search([('type_tax_use', '=', 'purchase'), ('amount', '>', 0)], limit=1).id
+ tax_default_company = self.env['res.company']._company_default_get('account.tax')
+ tax_id = self.env['account.tax'].search([('type_tax_use', '=', 'purchase'), ('amount', '>', 0), ('company_id', '=', tax_default_company.id)], limit=1).id
if tax_id:
line_vals['invoice_line_tax_ids'] = [(6, 0, [tax_id])]
self._update('account.invoice.line', 'account', line_vals, 'coffee_machine_line')
self.env['account.invoice'].browse(ref('demo_invoice_equipment_purchase'))._onchange_invoice_line_ids()
self.env['account.invoice'].browse(ref('demo_invoice_equipment_purchase')).action_invoice_open()
+
-
!python {model: account.bank.statement.line, id: False} : |
+ default_company = self.env['res.company']._company_default_get('account.account')
account = self.env['account.account'].search([
('user_type_id', '=', ref('account.data_account_type_revenue')),
- ('tag_ids', 'in', [ref('account.account_tag_financing')])], limit=1)
+ ('tag_ids', 'in', [ref('account.account_tag_financing')]),
+ ('company_id', '=', default_company.id)], limit=1)
line = self.env.ref('account.demo_bank_statement_line_5')
if not line.journal_entry_ids and account:
line.write({'account_id': account.id})
@@ -152,20 +152,22 @@
!python {model: ir.model.data, id: False} : |
from datetime import datetime
from dateutil.relativedelta import relativedelta
+ default_company = self.env['res.company']._company_default_get('account.journal')
vals = {
- 'company_id': ref('base.main_company'),
- 'journal_id': self.env['account.journal'].search([('type', '=', 'general')], limit=1).id,
+ 'journal_id': self.env['account.journal'].search([('type', '=', 'general'), ('company_id', '=', default_company.id)], limit=1).id,
'date': datetime.now().replace(day=1,month=1) - relativedelta(days=1),
'ref': 'Company Creation',
}
self._update('account.move', 'account', vals, 'demo_opening_move')
-
!python {model: ir.model.data, id: False} : |
- bank_journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1)
+ journal_default_company = self.env['res.company']._company_default_get('account.journal')
+ bank_journal = self.env['account.journal'].search([('type', '=', 'bank'), ('company_id', '=', journal_default_company.id)], limit=1)
if bank_journal:
bank_account_id = bank_journal.default_debit_account_id.id
- fixed_asset_account_id = self.env['account.account'].search([('user_type_id', 'in', (ref('account.data_account_type_fixed_assets'),ref('account.data_account_type_current_assets')))], limit=1).id
- equity_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_equity')), ('tag_ids', 'in', [ref('account.demo_capital_account')])], limit=1).id
+ account_default_company = self.env['res.company']._company_default_get('account.account')
+ fixed_asset_account_id = self.env['account.account'].search([('user_type_id', 'in', (ref('account.data_account_type_fixed_assets'),ref('account.data_account_type_current_assets'))), ('company_id', '=', account_default_company.id)], limit=1).id
+ equity_account_id = self.env['account.account'].search([('user_type_id', '=', ref('account.data_account_type_equity')), ('tag_ids', 'in', [ref('account.demo_capital_account')]), ('company_id', '=', account_default_company.id)], limit=1).id
if bank_account_id and fixed_asset_account_id and equity_account_id:
self.with_context({'check_move_validity': False})._update('account.move.line', 'account', {
'move_id': ref('account.demo_opening_move'),
diff --git a/addons/account/models/account.py b/addons/account/models/account.py
index 454837119b9..1c16f0fe497 100644
--- a/addons/account/models/account.py
+++ b/addons/account/models/account.py
@@ -327,6 +327,15 @@ class AccountJournal(models.Model):
if 'bank_acc_number' in vals:
for journal in self.filtered(lambda r: r.type == 'bank' and not r.bank_account_id):
journal.set_bank_account(vals.get('bank_acc_number'), vals.get('bank_id'))
+ # create the relevant refund sequence
+ if vals.get('refund_sequence'):
+ for journal in self.filtered(lambda j: j.type in ('sale', 'purchase') and not j.refund_sequence_id):
+ journal_vals = {
+ 'name': journal.name,
+ 'company_id': journal.company_id.id,
+ 'code': journal.code
+ }
+ journal.refund_sequence_id = self.sudo()._create_sequence(journal_vals, refund=True).id
return result
@@ -342,7 +351,7 @@ class AccountJournal(models.Model):
""" Create new no_gap entry sequence for every new Journal"""
prefix = self._get_sequence_prefix(vals['code'], refund)
seq = {
- 'name': vals['name'],
+ 'name': refund and vals['name'] + _(': Refund') or vals['name'],
'implementation': 'no_gap',
'prefix': prefix,
'padding': 4,
diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py
index 2b3b9a83e60..0915e4c9f90 100644
--- a/addons/account/models/account_bank_statement.py
+++ b/addons/account/models/account_bank_statement.py
@@ -560,7 +560,7 @@ class AccountBankStatementLine(models.Model):
domain_reconciliation = ['&', '&', ('statement_line_id', '=', False), ('account_id', 'in', reconciliation_aml_accounts), ('payment_id','<>', False)]
# Black lines = unreconciled & (not linked to a payment or open balance created by statement
- domain_matching = ['&', ('reconciled', '=', False), '|', ('payment_id','=',False), ('statement_id', '<>', False)]
+ domain_matching = [('reconciled', '=', False)]
if self.partner_id.id or overlook_partner:
domain_matching = expression.AND([domain_matching, [('account_id.internal_type', 'in', ['payable', 'receivable'])]])
else:
diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py
index 26577eaade2..fadd4a6028c 100644
--- a/addons/account/models/account_invoice.py
+++ b/addons/account/models/account_invoice.py
@@ -314,7 +314,7 @@ class AccountInvoice(models.Model):
default=lambda self: self.env.user)
fiscal_position_id = fields.Many2one('account.fiscal.position', string='Fiscal Position', oldname='fiscal_position',
readonly=True, states={'draft': [('readonly', False)]})
- commercial_partner_id = fields.Many2one('res.partner', string='Commercial Entity',
+ commercial_partner_id = fields.Many2one('res.partner', string='Commercial Entity', compute_sudo=True,
related='partner_id.commercial_partner_id', store=True, readonly=True,
help="The commercial entity that will be used on Journal Entries for this invoice")
diff --git a/addons/account/models/account_journal_dashboard.py b/addons/account/models/account_journal_dashboard.py
index d70eaa807bb..e0df2075a29 100644
--- a/addons/account/models/account_journal_dashboard.py
+++ b/addons/account/models/account_journal_dashboard.py
@@ -307,6 +307,8 @@ class account_journal(models.Model):
[action] = self.env.ref('account.%s' % action_name).read()
action['context'] = ctx
action['domain'] = self._context.get('use_domain', [])
+ action['views'] = False
+ action['view_id'] = False
return action
@api.multi
diff --git a/addons/account/models/company.py b/addons/account/models/company.py
index 6d49b37728e..a87e906c074 100644
--- a/addons/account/models/company.py
+++ b/addons/account/models/company.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from odoo import fields, models, api, _
+from odoo.exceptions import ValidationError
from datetime import timedelta
@@ -79,6 +80,14 @@ Best Regards,''')
@api.multi
def write(self, values):
+ #restrict the closing of FY if there are still unposted entries
+ if values.get('fiscalyear_lock_date'):
+ nb_draft_entries = self.env['account.move'].search([
+ ('company_id', 'in', [c.id for c in self]),
+ ('state', '=', 'draft'),
+ ('date', '<=', values['fiscalyear_lock_date'])])
+ if nb_draft_entries:
+ raise ValidationError(_('There are still unposted entries in the period you want to lock. You should either post or delete them.'))
# Reflect the change on accounts
for company in self:
digits = values.get('accounts_code_digits') or company.accounts_code_digits
diff --git a/addons/account/tests/test_account_move_closed_period.py b/addons/account/tests/test_account_move_closed_period.py
index 120b7cbb556..f0b700247f8 100644
--- a/addons/account/tests/test_account_move_closed_period.py
+++ b/addons/account/tests/test_account_move_closed_period.py
@@ -10,10 +10,15 @@ class TestPeriodState(AccountingTestCase):
def setUp(self):
super(TestPeriodState, self).setUp()
+ self.user_id = self.env.user
self.day_before_yesterday = datetime.now() - timedelta(2)
self.yesterday = datetime.now() - timedelta(1)
- self.user_id = self.env.user
- self.user_id.company_id.write({'fiscalyear_lock_date': self.yesterday.strftime(DEFAULT_SERVER_DATE_FORMAT)})
+ self.yesterday_str = self.yesterday.strftime(DEFAULT_SERVER_DATE_FORMAT)
+ #make sure there is no unposted entry
+ draft_entries = self.env['account.move'].search([('date', '<=', self.yesterday_str), ('state', '=', 'draft')])
+ if draft_entries:
+ draft_entries.post()
+ self.user_id.company_id.write({'fiscalyear_lock_date': self.yesterday_str})
self.sale_journal_id = self.env['account.journal'].search([('type', '=', 'sale')])[0]
self.account_id = self.env['account.account'].search([('internal_type', '=', 'receivable')])[0]
diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml
index 0e71985b557..0a0ec39363d 100644
--- a/addons/account/views/account_view.xml
+++ b/addons/account/views/account_view.xml
@@ -268,7 +268,7 @@
<field name="code"/>
<field name="refund_sequence" attrs="{'invisible': [('type', 'not in', ['sale', 'purchase'])]}" groups="base.group_no_one"/>
<field name="sequence_id" required="0" attrs="{'readonly': 1}" groups="base.group_no_one"/>
- <field name="refund_sequence_id" attrs="{'invisible': ['|',('type', 'not in', ['sale', 'purchase']), ('refund_sequence', '!=', True)], 'required': [('type', 'in', ['sale', 'purchase']), ('refund_sequence', '=', True)]}"/>
+ <field name="refund_sequence_id" required="0" attrs="{'readonly': 1, 'invisible': ['|',('type', 'not in', ['sale', 'purchase']), ('refund_sequence', '!=', True)]}" groups="base.group_no_one"/>
</group>
<group>
<field name="default_debit_account_id" domain="[('deprecated', '=', False)]" />
diff --git a/addons/account_asset/models/account_invoice.py b/addons/account_asset/models/account_invoice.py
index d6fb00358c9..4d6e3590037 100644
--- a/addons/account_asset/models/account_invoice.py
+++ b/addons/account_asset/models/account_invoice.py
@@ -80,8 +80,6 @@ class AccountInvoiceLine(models.Model):
@api.onchange('asset_category_id')
def onchange_asset_category_id(self):
- if not self.asset_category_id:
- self.account_id = self.get_invoice_line_account(self.invoice_id.type, self.product_id, self.invoice_id.fiscal_position_id, self.invoice_id.company_id)
if self.invoice_id.type == 'out_invoice' and self.asset_category_id:
self.account_id = self.asset_category_id.account_asset_id.id
elif self.invoice_id.type == 'in_invoice' and self.asset_category_id:
diff --git a/addons/account_check_printing/models/account_payment.py b/addons/account_check_printing/models/account_payment.py
index 8ee9a40a11f..13b9e39cb22 100644
--- a/addons/account_check_printing/models/account_payment.py
+++ b/addons/account_check_printing/models/account_payment.py
@@ -123,7 +123,6 @@ class AccountPayment(models.Model):
}
else:
self.filtered(lambda r: r.state == 'draft').post()
- self.write({'state': 'sent'})
return self.do_print_checks()
@api.multi
diff --git a/addons/barcodes/static/src/js/barcode_events.js b/addons/barcodes/static/src/js/barcode_events.js
index 3c5cb289232..0adff5f8e1b 100644
--- a/addons/barcodes/static/src/js/barcode_events.js
+++ b/addons/barcodes/static/src/js/barcode_events.js
@@ -113,6 +113,7 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, {
if (e.key === "ArrowLeft" || e.key === "ArrowRight" ||
e.key === "ArrowUp" || e.key === "ArrowDown" ||
e.key === "Escape" || e.key === "Tab" ||
+ e.key === "Backspace" || e.key === "Delete" ||
/F\d\d?/.test(e.key)) {
return true;
} else {
diff --git a/addons/barcodes/static/src/js/field_float_scannable.js b/addons/barcodes/static/src/js/field_float_scannable.js
index 79022362251..801cf32b5e2 100644
--- a/addons/barcodes/static/src/js/field_float_scannable.js
+++ b/addons/barcodes/static/src/js/field_float_scannable.js
@@ -23,6 +23,10 @@ var FieldFloatScannable = form_widgets.FieldFloat.extend({
},
simulateKeypress: function (e) {
+ /* only simulate a keypress if it has been previously prevented */
+ if (e.originalEvent.dispatched_by_barcode_reader !== true) {
+ return;
+ }
var character = String.fromCharCode(e.which);
var current_str = e.target.value;
var str_before_carret = current_str.substring(0, e.target.selectionStart);
diff --git a/addons/base_automation/data/base_automation_demo.xml b/addons/base_automation/data/base_automation_demo.xml
index a4014a64c3e..e8f3553063c 100644
--- a/addons/base_automation/data/base_automation_demo.xml
+++ b/addons/base_automation/data/base_automation_demo.xml
@@ -52,6 +52,19 @@
<field name="filter_domain">[('customer', '=', True)]</field>
</record>
+ <record id="test_rule_recursive" model="base.automation">
+ <field name="name">Base Automation: test recursive rule</field>
+ <field name="model_id" ref="base_automation.model_base_automation_lead_test"/>
+ <field name="trigger">on_write</field>
+ <field name="active" eval="True"/>
+ <field name="state">code</field>
+ <field name="code">
+record = model.browse(env.context['active_id'])
+if 'partner_id' in env.context['old_values'][record.id]:
+ record.write({'state': 'draft'})
+ </field>
+ </record>
+
<record id="test_rule_on_line" model="base.automation">
<field name="name">Base Automation: test rule on secondary model</field>
<field name="model_id" ref="base_automation.model_base_automation_line_test"/>
@@ -61,4 +74,18 @@
<field name="active" eval="True"/>
<field name="model_id" ref="base_automation.model_base_automation_line_test"/>
</record>
+
+ <record id="test_rule_on_write_check_context" model="base.automation">
+ <field name="name">Base Automation: test rule on write check context</field>
+ <field name="model_id" ref="base_automation.model_base_automation_lead_test"/>
+ <field name="trigger">on_write</field>
+ <field name="active" eval="True"/>
+ <field name="state">code</field>
+ <field name="code">
+record = model.browse(env.context['active_id'])
+if 'user_id' in env.context['old_values'][record.id]:
+ record.write({'is_assigned_to_admin': (record.user_id.id == 1)})
+ </field>
+ </record>
+
</odoo>
diff --git a/addons/base_automation/models/base_automation.py b/addons/base_automation/models/base_automation.py
index 051198edc17..a2cc6fb10e6 100644
--- a/addons/base_automation/models/base_automation.py
+++ b/addons/base_automation/models/base_automation.py
@@ -179,13 +179,18 @@ class BaseAutomation(models.Model):
def _process(self, records):
""" Process action ``self`` on the ``records`` that have not been done yet. """
- # filter out the records on which self has already been done, then mark
- # remaining records as done (to avoid recursive processing)
+ # filter out the records on which self has already been done
action_done = self._context['__action_done']
- records -= action_done.setdefault(self, records.browse())
+ records_done = action_done.get(self, records.browse())
+ records -= records_done
if not records:
return
- action_done[self] |= records
+
+ # mark the remaining records as done (to avoid recursive processing)
+ action_done = dict(action_done)
+ action_done[self] = records_done + records
+ self = self.with_context(__action_done=action_done)
+ records = records.with_context(__action_done=action_done)
# modify records
values = {}
diff --git a/addons/base_automation/tests/test_base_automation.py b/addons/base_automation/tests/test_base_automation.py
index 9fddfad983d..2bea32ec57c 100644
--- a/addons/base_automation/tests/test_base_automation.py
+++ b/addons/base_automation/tests/test_base_automation.py
@@ -92,6 +92,30 @@ class base_automation_test(common.TransactionCase):
self.assertTrue(lead.customer, "Customer field should updated to True")
self.assertEqual(lead.user_id, self.user_demo, "Responsible should be change on write of Lead when Customer becomes True.")
+ def test_11_recomputed_field(self):
+ """
+ Check that a rule is executed whenever a field is recomputed and the
+ context contains the target field
+ """
+ partner = self.env.ref('base.res_partner_1')
+ lead = self.create_lead(state='draft', partner_id=partner.id)
+ self.assertFalse(lead.deadline, 'There should not be a deadline defined')
+ # change priority and user; this triggers deadline recomputation, and
+ # the server action should set the boolean field to True
+ lead.write({'priority': True, 'user_id': self.user_admin.id})
+ self.assertTrue(lead.deadline, 'Deadline should be defined')
+ self.assertTrue(lead.is_assigned_to_admin, 'Lead should be assigned to admin')
+
+ def test_12_recursive(self):
+ """ Check that a rule is executed recursively by a secondary change. """
+ lead = self.create_lead(state='open')
+ self.assertEqual(lead.state, 'open')
+ self.assertEqual(lead.user_id, self.user_admin)
+ # change partner; this should trigger the rule that modifies the state
+ partner = self.env.ref('base.res_partner_1')
+ lead.write({'partner_id': partner.id})
+ self.assertEqual(lead.state, 'draft')
+
def test_20_direct_line(self):
"""
Check that a rule is executed after creating a line record.
diff --git a/addons/base_automation/tests/test_models.py b/addons/base_automation/tests/test_models.py
index 36893e37447..fd2255dff6f 100644
--- a/addons/base_automation/tests/test_models.py
+++ b/addons/base_automation/tests/test_models.py
@@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-from odoo import fields, models
+from dateutil import relativedelta
+from odoo import fields, models, api
class LeadTest(models.Model):
@@ -19,6 +20,17 @@ class LeadTest(models.Model):
customer = fields.Boolean(related='partner_id.customer', readonly=True, store=True)
line_ids = fields.One2many('base.automation.line.test', 'lead_id')
+ priority = fields.Boolean()
+ deadline = fields.Boolean(compute='_compute_deadline', store=True)
+ is_assigned_to_admin = fields.Boolean(string='Assigned to admin user')
+
+ @api.depends('priority')
+ def _compute_deadline(self):
+ for record in self:
+ if not record.priority:
+ record.deadline = False
+ else:
+ record.deadline = fields.Datetime.from_string(record.create_date) + relativedelta.relativedelta(days=3)
class LineTest(models.Model):
_name = "base.automation.line.test"
diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py
index 2c3fa12fa5e..c543f5ea830 100644
--- a/addons/calendar/models/calendar.py
+++ b/addons/calendar/models/calendar.py
@@ -1066,7 +1066,7 @@ class Meeting(models.Model):
if [True for item in new_pile if not item]:
continue
- result_data.append(meeting.get_search_fields(order_fields, r_date=r_date))
+ result_data.append(meeting.get_search_fields(order_fields, r_date=r_start_date))
if order_fields:
uniq = lambda it: collections.OrderedDict((id(x), x) for x in it).values()
diff --git a/addons/calendar/tests/test_calendar_recurrent_event_case2.py b/addons/calendar/tests/test_calendar_recurrent_event_case2.py
index e05428593ae..892c0ffe2aa 100644
--- a/addons/calendar/tests/test_calendar_recurrent_event_case2.py
+++ b/addons/calendar/tests/test_calendar_recurrent_event_case2.py
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.tests import common
+from odoo.addons.calendar.models.calendar import calendar_id2real_id
class TestRecurrentEvent(common.TransactionCase):
@@ -145,3 +146,26 @@ class TestRecurrentEvent(common.TransactionCase):
('start', '>=', '2017-06-30 08:00:00'), ('name', '=', 'Review code with programmer')
])
self.assertEqual(meetings_count, 1, "Last recurrent weekly meetings are not found without stop filter !")
+
+ def test_recurrent_meeting5(self):
+ # I create a recurrent event and I check if the virtual_id are correct
+ self.CalendarEvent.create({
+ 'count': 5,
+ 'start': '2012-04-13 11:00:00',
+ 'stop': '2012-04-13 12:00:00',
+ 'duration': 1.0,
+ 'name': 'Test Meeting',
+ 'recurrency': True,
+ 'rrule_type': 'daily'
+ })
+ # I search for the first recurrent meeting
+ meeting = self.CalendarEvent.with_context({'virtual_id': True}).search([
+ ('start', '=', '2012-04-13 11:00:00'), ('stop', '=', '2012-04-13 12:00:00')
+ ])
+ virutal_dates = calendar_id2real_id(meeting.id, with_date=True)
+
+ # virtual_dates are used by the calendar view and I check if the start date for the first virtual event is correct.
+ self.assertEqual(virutal_dates[1], '2012-04-13 11:00:00', "The virtual event doesn't have the correct start date !")
+
+ # virtual_dates are used by the calendar view and I check if the stop date for the first virtual event is correct.
+ self.assertEqual(virutal_dates[2], '2012-04-13 12:00:00', "The virtual event doesn't have the correct stop date !")
diff --git a/addons/hr_attendance/models/hr_attendance.py b/addons/hr_attendance/models/hr_attendance.py
index f078b6037fd..e3211fceb00 100644
--- a/addons/hr_attendance/models/hr_attendance.py
+++ b/addons/hr_attendance/models/hr_attendance.py
@@ -26,15 +26,15 @@ class HrAttendance(models.Model):
result = []
for attendance in self:
if not attendance.check_out:
- result.append((self.id, _("%(empl_name)s from %(check_in)s") % {
- 'empl_name': self.employee_id.name_related,
- 'check_in': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(self.check_in))),
+ result.append((attendance.id, _("%(empl_name)s from %(check_in)s") % {
+ 'empl_name': attendance.employee_id.name_related,
+ 'check_in': fields.Datetime.to_string(fields.Datetime.context_timestamp(attendance, fields.Datetime.from_string(attendance.check_in))),
}))
else:
- result.append((self.id, _("%(empl_name)s from %(check_in)s to %(check_out)s") % {
- 'empl_name': self.employee_id.name_related,
- 'check_in': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(self.check_in))),
- 'check_out': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(self.check_out))),
+ result.append((attendance.id, _("%(empl_name)s from %(check_in)s to %(check_out)s") % {
+ 'empl_name': attendance.employee_id.name_related,
+ 'check_in': fields.Datetime.to_string(fields.Datetime.context_timestamp(attendance, fields.Datetime.from_string(attendance.check_in))),
+ 'check_out': fields.Datetime.to_string(fields.Datetime.context_timestamp(attendance, fields.Datetime.from_string(attendance.check_out))),
}))
return result
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index 085ff53bda3..95d4ad23324 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -172,19 +172,24 @@ class HrExpense(models.Model):
'''
main function that is called when trying to create the accounting entries related to an expense
'''
+ move_group_by_sheet = {}
for expense in self:
journal = expense.sheet_id.bank_journal_id if expense.payment_mode == 'company_account' else expense.sheet_id.journal_id
#create the move that will contain the accounting entries
acc_date = expense.sheet_id.accounting_date or expense.date
- move = self.env['account.move'].create({
- 'journal_id': journal.id,
- 'company_id': self.env.user.company_id.id,
- 'date': acc_date,
- 'ref': expense.sheet_id.name,
- # force the name to the default value, to avoid an eventual 'default_name' in the context
- # to set it to '' which cause no number to be given to the account.move when posted.
- 'name': '/',
- })
+ if not expense.sheet_id.id in move_group_by_sheet:
+ move = self.env['account.move'].create({
+ 'journal_id': journal.id,
+ 'company_id': self.env.user.company_id.id,
+ 'date': acc_date,
+ 'ref': expense.sheet_id.name,
+ # force the name to the default value, to avoid an eventual 'default_name' in the context
+ # to set it to '' which cause no number to be given to the account.move when posted.
+ 'name': '/',
+ })
+ move_group_by_sheet[expense.sheet_id.id] = move
+ else:
+ move = move_group_by_sheet[expense.sheet_id.id]
company_currency = expense.company_id.currency_id
diff_currency_p = expense.currency_id != company_currency
#one account.move.line per expense (+taxes..)
@@ -235,9 +240,10 @@ class HrExpense(models.Model):
lines = map(lambda x: (0, 0, expense._prepare_move_line(x)), move_lines)
move.with_context(dont_create_taxes=True).write({'line_ids': lines})
expense.sheet_id.write({'account_move_id': move.id})
- move.post()
if expense.payment_mode == 'company_account':
expense.sheet_id.paid_expense_sheets()
+ for move in move_group_by_sheet.values():
+ move.post()
return True
@api.multi
@@ -272,7 +278,7 @@ class HrExpense(models.Model):
# Calculate tax lines and adjust base line
taxes = expense.tax_ids.compute_all(expense.unit_amount, expense.currency_id, expense.quantity, expense.product_id)
account_move[-1]['price'] = taxes['total_excluded']
- account_move[-1]['tax_ids'] = expense.tax_ids.ids
+ account_move[-1]['tax_ids'] = [(6, 0, expense.tax_ids.ids)]
for tax in taxes['taxes']:
account_move.append({
'type': 'tax',
@@ -511,14 +517,14 @@ class HrExpenseSheet(models.Model):
if any(not sheet.journal_id for sheet in self):
raise UserError(_("Expenses must have an expense journal specified to generate accounting entries."))
- res = self.mapped('expense_line_ids')\
- .filtered(lambda r: not float_is_zero(r.total_amount, precision_rounding=(r.currency_id or self.env.user.company_id.currency_id).rounding))\
- .action_move_create()
+ expense_line_ids = self.mapped('expense_line_ids')\
+ .filtered(lambda r: not float_is_zero(r.total_amount, precision_rounding=(r.currency_id or self.env.user.company_id.currency_id).rounding))
+ res = expense_line_ids.action_move_create()
if not self.accounting_date:
self.accounting_date = self.account_move_id.date
- if self.payment_mode=='own_account':
+ if self.payment_mode == 'own_account' and expense_line_ids:
self.write({'state': 'post'})
else:
self.write({'state': 'done'})
diff --git a/addons/hr_holidays/models/hr_holidays.py b/addons/hr_holidays/models/hr_holidays.py
index 837537e8c22..9cf166a911f 100644
--- a/addons/hr_holidays/models/hr_holidays.py
+++ b/addons/hr_holidays/models/hr_holidays.py
@@ -241,6 +241,7 @@ class Holidays(models.Model):
('date_to', '>=', holiday.date_from),
('employee_id', '=', holiday.employee_id.id),
('id', '!=', holiday.id),
+ ('type', '=', holiday.type),
('state', 'not in', ['cancel', 'refuse']),
]
nholidays = self.search_count(domain)
@@ -283,7 +284,7 @@ class Holidays(models.Model):
if employee_id:
employee = self.env['hr.employee'].browse(employee_id)
- resource = employee.resource_id
+ resource = employee.resource_id.sudo()
if resource and resource.calendar_id:
hours = resource.calendar_id.get_working_hours(from_dt, to_dt, resource_id=resource.id, compute_leaves=True)
uom_hour = resource.calendar_id.uom_id
diff --git a/addons/hr_maintenance/views/maintenance_views.xml b/addons/hr_maintenance/views/maintenance_views.xml
index 58dec50bc2f..2c56a9f2538 100644
--- a/addons/hr_maintenance/views/maintenance_views.xml
+++ b/addons/hr_maintenance/views/maintenance_views.xml
@@ -79,6 +79,12 @@
<xpath expr="//img[@t-att-title='record.owner_user_id.value']" position='replace'>
<img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="27" height="27" class="oe_kanban_avatar"/>
</xpath>
+ <div t-if="!record.owner_user_id.raw_value" position='replace'/>
+ <div t-if="record.owner_user_id.raw_value" position='replace'>
+ <div t-if="record.employee_id.value"><field name="employee_id"/></div>
+ <div t-if="record.department_id.value"><field name="department_id"/>
+ </div>
+ </div>
</field>
</record>
diff --git a/addons/hr_timesheet_attendance/report/hr_timesheet_attendance_report_view.xml b/addons/hr_timesheet_attendance/report/hr_timesheet_attendance_report_view.xml
index ba48dceb8f2..a307bd47ddd 100644
--- a/addons/hr_timesheet_attendance/report/hr_timesheet_attendance_report_view.xml
+++ b/addons/hr_timesheet_attendance/report/hr_timesheet_attendance_report_view.xml
@@ -29,6 +29,8 @@
<field name="user_id" type="row"/>
<field name="date" interval="day" type="col"/>
<field name="total_difference" type="measure" widget="float_time"/>
+ <field name="total_timesheet" type="measure" widget="float_time"/>
+ <field name="total_attendance" type="measure" widget="float_time"/>
</pivot>
</field>
</record>
diff --git a/addons/hw_posbox_homepage/controllers/main.py b/addons/hw_posbox_homepage/controllers/main.py
index 09ba008d430..f43e585fcba 100644
--- a/addons/hw_posbox_homepage/controllers/main.py
+++ b/addons/hw_posbox_homepage/controllers/main.py
@@ -56,7 +56,10 @@ index_template = """
If you need to grant remote debugging access to a developer, you can do it <a href='/remote_connect'>here</a>.
</p>
<p>
- The PosBox software installed on this posbox is <b>version 15</b>,
+ If you need to display the current customer basket on another device, you can do it <a href='/point_of_sale/display'>here</a>.
+ </p>
+ <p>
+ The PosBox software installed on this posbox is <b>version 16</b>,
the posbox version number is independent from Odoo. You can upgrade
the software on the <a href='/hw_proxy/upgrade/'>upgrade page</a>.
</p>
diff --git a/addons/hw_screen/__init__.py b/addons/hw_screen/__init__.py
new file mode 100644
index 00000000000..bf7fb7b45c1
--- /dev/null
+++ b/addons/hw_screen/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import controllers
diff --git a/addons/hw_screen/__openerp__.py b/addons/hw_screen/__openerp__.py
new file mode 100644
index 00000000000..8ed5711b836
--- /dev/null
+++ b/addons/hw_screen/__openerp__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+{
+ 'name': 'Screen Driver',
+ 'version': '1.0',
+ 'category': 'Hardware Drivers',
+ 'sequence': 6,
+ 'summary': 'Provides support for customer facing displays',
+ 'website': 'https://www.odoo.com/page/point-of-sale',
+ 'description': """
+Screen Driver
+=============
+
+This module allows the POS client to send rendered HTML to a remotely
+installed screen. This module then displays this HTML using a web
+browser.
+""",
+ 'depends': ['hw_proxy'],
+ 'installable': False,
+ 'auto_install': False,
+}
diff --git a/addons/hw_screen/controllers/__init__.py b/addons/hw_screen/controllers/__init__.py
new file mode 100644
index 00000000000..f48716d3a69
--- /dev/null
+++ b/addons/hw_screen/controllers/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import main
diff --git a/addons/hw_screen/controllers/main.py b/addons/hw_screen/controllers/main.py
new file mode 100644
index 00000000000..f6101e7c8ca
--- /dev/null
+++ b/addons/hw_screen/controllers/main.py
@@ -0,0 +1,166 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import http
+from odoo.tools import config
+from odoo.addons.web.controllers import main as web
+
+import logging
+import netifaces as ni
+import os
+from subprocess import call
+import time
+import threading
+
+self_port = str(config['xmlrpc_port'] or 8069)
+
+_logger = logging.getLogger(__name__)
+
+
+class HardwareScreen(web.Home):
+
+ event_data = threading.Event()
+ pos_client_data = {'rendered_html': False,
+ 'ip_from': False}
+ display_in_use = ''
+ failure_count = {}
+
+ def _call_xdotools(self, keystroke):
+ os.environ['DISPLAY'] = ":0.0"
+ os.environ['XAUTHORITY'] = "/run/lightdm/pi/xauthority"
+ try:
+ call(['xdotool', 'key', keystroke])
+ return "xdotool succeeded in stroking " + keystroke
+ except:
+ return "xdotool threw an error, maybe it is not installed on the posbox"
+
+ @http.route('/hw_proxy/display_refresh', type='json', auth='none', cors='*')
+ def display_refresh(self):
+ return self._call_xdotools('F5')
+
+ # POS CASHIER'S ROUTES
+ @http.route('/hw_proxy/customer_facing_display', type='json', auth='none', cors='*')
+ def update_user_facing_display(self, html=None):
+ request_ip = http.request.httprequest.remote_addr
+ if request_ip == HardwareScreen.pos_client_data.get('ip_from', ''):
+ HardwareScreen.pos_client_data['rendered_html'] = html
+ HardwareScreen.event_data.set()
+
+ return {'status': 'updated'}
+ else:
+ return {'status': 'failed'}
+
+ @http.route('/hw_proxy/take_control', type='json', auth='none', cors='*')
+ def take_control(self, html=None):
+ # ALLOW A CASHIER TO TAKE CONTROL OVER THE POSBOX, IN CASE OF MULTIPLE CASHIER PER POSBOX
+ HardwareScreen.pos_client_data['rendered_html'] = html
+ HardwareScreen.pos_client_data['ip_from'] = http.request.httprequest.remote_addr
+ HardwareScreen.event_data.set()
+
+ return {'status': 'success',
+ 'message': 'You now have access to the display'}
+
+ @http.route('/hw_proxy/test_ownership', type='json', auth='none', cors='*')
+ def test_ownership(self):
+ if HardwareScreen.pos_client_data.get('ip_from') == http.request.httprequest.remote_addr:
+ return {'status': 'OWNER'}
+ else:
+ return {'status': 'NOWNER'}
+
+ # POSBOX ROUTES (SELF)
+ @http.route('/point_of_sale/display', type='http', auth='none')
+ def render_main_display(self):
+ return self._get_html()
+
+ @http.route('/point_of_sale/get_serialized_order', type='json', auth='none')
+ def get_serialized_order(self):
+ request_addr = http.request.httprequest.remote_addr
+ result = HardwareScreen.pos_client_data
+ if HardwareScreen.display_in_use and request_addr != HardwareScreen.display_in_use:
+ if not HardwareScreen.failure_count.get(request_addr):
+ HardwareScreen.failure_count[request_addr] = 0
+ if HardwareScreen.failure_count[request_addr] > 0:
+ time.sleep(10)
+ HardwareScreen.failure_count[request_addr] += 1
+ return {'rendered_html': """<div class="pos-customer_facing_display"><p>Not Authorized. Another browser is in use to display for the client. Please refresh.</p></div> """,
+ 'stop_longpolling': True,
+ 'ip_from': request_addr}
+
+ # IMPLEMENTATION OF LONGPOLLING
+ # Times out 2 seconds before the JS request does
+ if HardwareScreen.event_data.wait(28):
+ HardwareScreen.event_data.clear()
+ HardwareScreen.failure_count[request_addr] = 0
+ return result
+ return {'rendered_html': False,
+ 'ip_from': HardwareScreen.pos_client_data['ip_from']}
+
+ def _get_html(self):
+ cust_js = None
+ interfaces = ni.interfaces()
+ my_ip = '127.0.0.1'
+ HardwareScreen.display_in_use = http.request.httprequest.remote_addr
+
+ with open(os.path.join(os.path.dirname(__file__), "../static/src/js/worker.js")) as js:
+ cust_js = js.read()
+
+ with open(os.path.join(os.path.dirname(__file__), "../static/src/css/cust_css.css")) as css:
+ cust_css = css.read()
+
+ display_ifaces = ""
+ for iface_id in interfaces:
+ iface_obj = ni.ifaddresses(iface_id)
+ ifconfigs = iface_obj.get(ni.AF_INET, [])
+ for conf in ifconfigs:
+ if conf.get('addr'):
+ display_ifaces += "<tr><td>" + iface_id + "</td>"
+ display_ifaces += "<td>" + conf.get('addr') + "</td>"
+ display_ifaces += "<td>" + conf.get('netmask') + "</td></tr>"
+ # What is my external IP ?
+ if iface_id != 'lo':
+ my_ip = conf.get('addr')
+
+ my_ip_port = my_ip + ":" + self_port
+
+ html = """
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title class="origin">Odoo -- Point of Sale</title>
+ <script type="text/javascript" class="origin" src="http://""" + my_ip_port + """/web/static/lib/jquery/jquery.js" >
+ </script>
+ <script type="text/javascript" class="origin">
+ """ + cust_js + """
+ </script>
+ <link rel="stylesheet" class="origin" href="http://""" + my_ip_port + """/web/static/lib/bootstrap/css/bootstrap.css" >
+ </link>
+ <script class="origin" src="http://""" + my_ip_port + """/web/static/lib/bootstrap/js/bootstrap.min.js"></script>
+ <style class="origin">
+ """ + cust_css + """
+ </style>
+ </head>
+ <body class="original_body">
+ <div hidden class="shadow"></div>
+ <div class="container">
+ <div class="row">
+ <div class="col-md-4 col-md-offset-4">
+ <h1>Odoo Point of Sale</h1>
+ <h2>POSBox Client display</h2>
+ <h3>My IPs</h3>
+ <table id="table_ip" class="table table-condensed">
+ <tr>
+ <th>Interface</th>
+ <th>IP</th>
+ <th>Netmask</th>
+ </tr>
+ """ + display_ifaces + """
+ </table>
+ <p>The customer cart will be displayed here once a Point of Sale session is started.</p>
+ <p>Odoo version 11 or above is required.</p>
+ </div>
+ </div>
+ </div>
+ </body>
+ </html>
+ """
+ return html
diff --git a/addons/hw_screen/static/src/css/cust_css.css b/addons/hw_screen/static/src/css/cust_css.css
new file mode 100644
index 00000000000..69fddb25457
--- /dev/null
+++ b/addons/hw_screen/static/src/css/cust_css.css
@@ -0,0 +1,21 @@
+html {
+ width: 100%;
+ height: 100%;
+ font-size: 11px;
+}
+
+body {
+ width: 100%;
+ height: 100%;
+ font-size: 14px;
+ margin: 0;
+}
+
+.original_body {
+ background-color: #797083;
+ color: white;
+}
+
+.ajax_got_body {
+ color: black;
+} \ No newline at end of file
diff --git a/addons/hw_screen/static/src/js/worker.js b/addons/hw_screen/static/src/js/worker.js
new file mode 100644
index 00000000000..55e389e78ab
--- /dev/null
+++ b/addons/hw_screen/static/src/js/worker.js
@@ -0,0 +1,60 @@
+ $(function() {
+ "use strict";
+ // mergedHead will be turned to true the first time we receive something from a new host
+ // It allows to transform the <head> only once
+ var mergedHead = false;
+ var current_client_url = "";
+ var stop_longpolling = false;
+
+ function longpolling() {
+ $.ajax({
+ type: 'POST',
+ url: 'http://'+window.location.host+'/point_of_sale/get_serialized_order',
+ dataType: 'json',
+ beforeSend: function(xhr){xhr.setRequestHeader('Content-Type', 'application/json');},
+ data: JSON.stringify({jsonrpc: '2.0'}),
+
+ success: function(data) {
+ if (typeof data.result.stop_longpolling !== 'undefined') {
+ stop_longpolling = data.result.stop_longpolling;
+ }
+ if (data.result.ip_from && data.result.rendered_html) {
+ var trimmed = $.trim(data.result.rendered_html);
+ var $parsedHTML = $('<div>').html($.parseHTML(trimmed,true)); // WARNING: the true here will executes any script present in the string to parse
+ var new_client_url = $parsedHTML.find(".resources > base").attr('href');
+
+ if (!mergedHead || (current_client_url !== new_client_url)) {
+
+ mergedHead = true;
+ current_client_url = new_client_url;
+ $("body").removeClass('original_body').addClass('ajax_got_body');
+ $("head").children().not('.origin').remove();
+ $("head").append($parsedHTML.find(".resources").html());
+ }
+
+ $(".container").html($parsedHTML.find('.pos-customer_facing_display').html());
+ $(".container").attr('class', 'container').addClass($parsedHTML.find('.pos-customer_facing_display').attr('class'));
+
+ var d = $('.pos_orderlines_list');
+ d.scrollTop(d.prop("scrollHeight"));
+
+ // Here we execute the code coming from the pos, apparently $.parseHTML() executes scripts right away,
+ // Since we modify the dom afterwards, the script might not have any effect
+ if (typeof foreign_js !== 'undefined' && $.isFunction(foreign_js)) {
+ foreign_js();
+ }
+ }
+ },
+
+ complete: function(jqXHR,err) {
+ if (!stop_longpolling) {
+ longpolling();
+ }
+ },
+
+ timeout: 30000,
+ });
+ };
+
+ longpolling();
+ }); \ No newline at end of file
diff --git a/addons/l10n_be/data/account_tax_template_data.xml b/addons/l10n_be/data/account_tax_template_data.xml
index 30a8a1b5312..e7a3de02628 100644
--- a/addons/l10n_be/data/account_tax_template_data.xml
+++ b/addons/l10n_be/data/account_tax_template_data.xml
@@ -278,7 +278,7 @@
<field name="price_include" eval="0"/>
<field name="amount">0</field>
<field name="amount_type">percent</field>
- <field name="type_tax_use">none</field>
+ <field name="type_tax_use">sale</field>
<field name="chart_template_id" ref="l10nbe_chart_template"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_46L'), ref('tax_tag_48s46L')])]"/>
</record>
@@ -291,7 +291,7 @@
<field name="account_id" ref="a451054"/>
<field name="amount">0</field>
<field name="amount_type">percent</field>
- <field name="type_tax_use">none</field>
+ <field name="type_tax_use">sale</field>
<field name="chart_template_id" ref="l10nbe_chart_template"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_46T'), ref('tax_tag_48s46T')])]"/>
</record>
@@ -369,7 +369,7 @@
<field name="price_include" eval="1"/>
<field name="amount">21</field>
<field name="amount_type">percent</field>
- <field name="type_tax_use">none</field>
+ <field name="type_tax_use">purchase</field>
<field name="chart_template_id" ref="l10nbe_chart_template"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_82'), ref('tax_tag_85'), ref('tax_tag_63'), ref('tax_tag_59')])]"/>
</record>
diff --git a/addons/l10n_ch/i18n_extra/de.po b/addons/l10n_ch/i18n_extra/de.po
index 1562904d951..fba9e54525a 100644
--- a/addons/l10n_ch/i18n_extra/de.po
+++ b/addons/l10n_ch/i18n_extra/de.po
@@ -6,711 +6,995 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-12-14 14:10+0000\n"
+"POT-Creation-Date: 2017-03-14 15:52+0000\n"
"PO-Revision-Date: 2016-12-15 14:35+0100\n"
-"Last-Translator: <>\n"
+"Last-Translator: <didier.donze@camptocamp.com>\n"
"Language-Team: \n"
+"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
-"Language: de\n"
-"X-Generator: Poedit 1.8.7.1\n"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_O_exclude
#: model:account.tax.template,description:l10n_ch.vat_O_exclude
msgid "0% excl."
msgstr "0% Exkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_O_import
#: model:account.tax.template,description:l10n_ch.vat_O_import
msgid "0% import."
msgstr "0% Import."
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_100_import
#: model:account.tax.template,name:l10n_ch.vat_100_import
msgid "100% dédouanement TVA"
msgstr "100% Verzollung MwSt."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_100_import
#: model:account.tax.template,description:l10n_ch.vat_100_import
msgid "100% imp."
msgstr "100% Imp."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25
#: model:account.tax.template,description:l10n_ch.vat_25
msgid "2.5%"
msgstr "2.5%"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25_incl
#: model:account.tax.template,description:l10n_ch.vat_25_incl
msgid "2.5% Incl."
msgstr "2.5% Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25_purchase
#: model:account.tax.template,description:l10n_ch.vat_25_purchase
msgid "2.5% achat"
msgstr "2.5% Einkauf"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25_purchase_incl
#: model:account.tax.template,description:l10n_ch.vat_25_purchase_incl
msgid "2.5% achat Incl."
msgstr "2.5% Einkauf Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25_invest
#: model:account.tax.template,description:l10n_ch.vat_25_invest
msgid "2.5% invest."
msgstr "2.5% Invest."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_25_invest_incl
#: model:account.tax.template,description:l10n_ch.vat_25_invest_incl
msgid "2.5% invest. Incl."
-msgstr "2.5% Invest. Incl."
+msgstr "2.5% Invest. Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38
#: model:account.tax.template,description:l10n_ch.vat_38
msgid "3.8%"
msgstr "3.8%"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38_incl
#: model:account.tax.template,description:l10n_ch.vat_38_incl
msgid "3.8% Incl."
msgstr "3.8% Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38_purchase
#: model:account.tax.template,description:l10n_ch.vat_38_purchase
msgid "3.8% achat"
msgstr "3.8% Einkauf"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38_purchase_incl
#: model:account.tax.template,description:l10n_ch.vat_38_purchase_incl
msgid "3.8% achat Incl."
msgstr "3.8% Einkauf Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38_invest
#: model:account.tax.template,description:l10n_ch.vat_38_invest
msgid "3.8% invest"
-msgstr "3.8% Invest"
+msgstr "3.8% Invest."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_38_invest_incl
#: model:account.tax.template,description:l10n_ch.vat_38_invest_incl
msgid "3.8% invest Incl."
-msgstr "3.8% Invest Incl."
+msgstr "3.8% Invest. Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80
#: model:account.tax.template,description:l10n_ch.vat_80
msgid "8.0%"
msgstr "8.0%"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80_incl
#: model:account.tax.template,description:l10n_ch.vat_80_incl
msgid "8.0% Incl."
msgstr "8.0% Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80_purchase
#: model:account.tax.template,description:l10n_ch.vat_80_purchase
msgid "8.0% achat"
msgstr "8.0% Einkauf"
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80_purchase_incl
#: model:account.tax.template,description:l10n_ch.vat_80_purchase_incl
msgid "8.0% achat Incl."
msgstr "8.0% Einkauf Inkl."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80_invest
#: model:account.tax.template,description:l10n_ch.vat_80_invest
msgid "8.0% invest."
msgstr "8.0% Invest."
#. module: l10n_ch
+#: model:account.tax,description:l10n_ch.1_vat_80_invest_incl
#: model:account.tax.template,description:l10n_ch.vat_80_invest_incl
msgid "8.0% invest. Incl."
msgstr "8.0% Invest. Inkl."
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4200
#: model:account.account.template,name:l10n_ch.ch_coa_4200
msgid "Achats de marchandises destinées à la revente"
msgstr "Handelswarenaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2030
#: model:account.account.template,name:l10n_ch.ch_coa_2030
msgid "Acomptes de clients"
msgstr "Erhaltene Anzahlungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1208
#: model:account.account.template,name:l10n_ch.ch_coa_1208
msgid "Acomptes sur les marchandises commerciales"
-msgstr ""
+msgstr "Akonto auf Zwischenhandelswaren"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1218
#: model:account.account.template,name:l10n_ch.ch_coa_1218
msgid "Acomptes sur matières premières"
-msgstr ""
+msgstr "Akonto auf Rohstoffe"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1149
#: model:account.account.template,name:l10n_ch.ch_coa_1149
msgid "Ajustement de la valeur des avances et des prêts"
msgstr "Wertberichtigungen Vorschüsse und Darlehen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1199
#: model:account.account.template,name:l10n_ch.ch_coa_1199
msgid "Ajustement de la valeur des créances à court terme"
msgstr "Wertberichtigungen sonstige kurzfristige Forderungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1449
#: model:account.account.template,name:l10n_ch.ch_coa_1449
msgid "Ajustement de la valeur des créances à long terme"
msgstr "Wertberichtigungen langfristige Forderungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1779
#: model:account.account.template,name:l10n_ch.ch_coa_1779
msgid "Ajustement de la valeur des goodwill"
msgstr "Wertberichtigungen Goodwill"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1489
#: model:account.account.template,name:l10n_ch.ch_coa_1489
msgid "Ajustement de la valeur des participations"
msgstr "Wertberichtigungen Beteiligungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1069
+#: model:account.account,name:l10n_ch.1_ch_coa_1409
#: model:account.account.template,name:l10n_ch.ch_coa_1069
#: model:account.account.template,name:l10n_ch.ch_coa_1409
msgid "Ajustement de la valeur des titres"
msgstr "Wertberichtigungen Wertschriften"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6800
#: model:account.account.template,name:l10n_ch.ch_coa_6800
-msgid "Amortissements et ajustements de valeur des postes sur immobilisations corporelles"
-msgstr "Abschreibungen und Wertberichtigungen auf Positionen des Anlagevermögens"
+msgid ""
+"Amortissements et ajustements de valeur des postes sur immobilisations "
+"corporelles"
+msgstr ""
+"Abschreibungen und Wertberichtigungen auf Positionen des Anlagevermögens"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1519
#: model:account.account.template,name:l10n_ch.ch_coa_1519
msgid "Amortissements sur le mobilier et les installations"
msgstr "Abschreibungen auf Mobiliar und Einrichtungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1599
#: model:account.account.template,name:l10n_ch.ch_coa_1599
msgid "Amortissements sur les autres immobilisations corporelles meubles"
-msgstr ""
+msgstr "Abschreibungen andere Sachanlagen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1709
#: model:account.account.template,name:l10n_ch.ch_coa_1709
msgid "Amortissements sur les brevets, know-how, licences, droits, dév."
msgstr "Abschreibungen auf Patente, Know-how, Lizenzen, Rechte, Entwicklungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1609
#: model:account.account.template,name:l10n_ch.ch_coa_1609
msgid "Amortissements sur les immeubles d’exploitation"
msgstr "Abschreibungen auf Geschäftsliegenschaften"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1559
#: model:account.account.template,name:l10n_ch.ch_coa_1559
msgid "Amortissements sur les installations de stockage"
-msgstr ""
+msgstr "Abschreibungen und Wertberichtigungen Lagereinrichtungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1529
#: model:account.account.template,name:l10n_ch.ch_coa_1529
msgid "Amortissements sur les machines de bureau, inf. et syst. comm."
msgstr "Abschreibungen auf Büromaschinen, Informatik, Kommunikationstechnologie"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1509
#: model:account.account.template,name:l10n_ch.ch_coa_1509
msgid "Amortissements sur les machines et appareils"
msgstr "Abschreibungen auf Maschinen und Apparate"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1549
#: model:account.account.template,name:l10n_ch.ch_coa_1549
msgid "Amortissements sur les outillages et appareils"
msgstr "Abschreibungen auf Werkzeuge und Geräte"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1539
#: model:account.account.template,name:l10n_ch.ch_coa_1539
msgid "Amortissements sur les véhicules"
msgstr "Abschreibungen auf Fahrzeuge"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1579
#: model:account.account.template,name:l10n_ch.ch_coa_1579
msgid "Amortissements sur les équipements et installations"
-msgstr ""
+msgstr "Abschreibungen und Wertberichtigungen feste Einrichtungen und Installationen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2270
#: model:account.account.template,name:l10n_ch.ch_coa_2270
msgid "Assurances sociales et institutions de prévoyance"
msgstr "Sozialversicherungen und Vorsorgeeinrichtungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6300
#: model:account.account.template,name:l10n_ch.ch_coa_6300
msgid "Assurances-choses, droits, taxes, autorisations"
msgstr "Sachversicherungen, Abgaben, Gebühren, Bewilligungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_5800
#: model:account.account.template,name:l10n_ch.ch_coa_5800
msgid "Autres charges du personnel"
msgstr "Übriger Personalaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6700
#: model:account.account.template,name:l10n_ch.ch_coa_6700
msgid "Autres charges d‘exploitation"
msgstr "Übriger betrieblicher Aufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1190
#: model:account.account.template,name:l10n_ch.ch_coa_1190
msgid "Autres créances à court terme"
msgstr "Übrige kurzfristige Forderungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2210
#: model:account.account.template,name:l10n_ch.ch_coa_2210
msgid "Autres dettes à court terme"
msgstr "Übrige kurzfristige Verbindlichkeiten"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2140
#: model:account.account.template,name:l10n_ch.ch_coa_2140
msgid "Autres dettes à court terme rémunérées"
msgstr "Übrige verzinsliche Verbindlichkeiten"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2500
#: model:account.account.template,name:l10n_ch.ch_coa_2500
msgid "Autres dettes à long terme"
msgstr "Übrige langfristige Verbindlichkeiten"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1590
#: model:account.account.template,name:l10n_ch.ch_coa_1590
msgid "Autres immobilisations corporelles meubles"
msgstr "Autres immobilisations corporelles meubles"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3600
#: model:account.account.template,name:l10n_ch.ch_coa_3600
msgid "Autres ventes et prestations de services"
msgstr "Übrige Erlöse aus Lieferungen und Leistungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1140
#: model:account.account.template,name:l10n_ch.ch_coa_1140
msgid "Avances et prêts"
msgstr "Vorschüsse und Darlehen"
#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_res_bank
+msgid "Bank"
+msgstr "Bank"
+
+#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr "Bankkonten"
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_config_settings_l10n_ch_isr_print_bank_location
+#: model:ir.model.fields,help:l10n_ch.field_res_company_l10n_ch_isr_print_bank_location
+msgid ""
+"Boolean option field indicating whether or not the alternate layout (the one "
+"printing bank name and address) must be used when generating an ISR."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_sent
+msgid ""
+"Boolean value telling whether or not the ISR corresponding to this invoice "
+"has already been printed or sent by mail."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_valid
+msgid ""
+"Boolean value. True iff all the data required to generate the ISR are present"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1700
#: model:account.account.template,name:l10n_ch.ch_coa_1700
msgid "Brevets, know-how, licences, droits, développement"
msgstr "Patente, Know-how, Lizenzen, Rechte, Entwicklungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2979
#: model:account.account.template,name:l10n_ch.ch_coa_2979
msgid "Bénéfice / perte de l’exercice"
msgstr "Jahresgewinn oder Jahresverlust"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2970
#: model:account.account.template,name:l10n_ch.ch_coa_2970
msgid "Bénéfice / perte reporté"
msgstr "Gewinnvortrag oder Verlustvortrag"
#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_res_bank_l10n_ch_postal_chf
+msgid "CHF ISR reference"
+msgstr "CHF ESR Referenznummer"
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1850
#: model:account.account.template,name:l10n_ch.ch_coa_1850
-msgid "Capital actions, capital social, droits de participations ou capital de fondation non versés"
+msgid ""
+"Capital actions, capital social, droits de participations ou capital de "
+"fondation non versés"
msgstr "Nicht einbezahltes Aktien-, Stamm-, Anteilschein- oder"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2800
#: model:account.account.template,name:l10n_ch.ch_coa_2800
msgid "Capital-actions, capital social, capital de fondation"
msgstr "Aktien-, Stamm-, Anteilschein- oder Stiftungskapital"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4521
#: model:account.account.template,name:l10n_ch.ch_coa_4521
msgid "Charbon, briquettes, bois"
-msgstr ""
+msgstr "Kohle, Briketts, Holz"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_7010
#: model:account.account.template,name:l10n_ch.ch_coa_7010
msgid "Charges accessoires"
msgstr "Aufwand Nebenbetrieb"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6000
#: model:account.account.template,name:l10n_ch.ch_coa_6000
msgid "Charges de locaux"
msgstr "Raumaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4000
#: model:account.account.template,name:l10n_ch.ch_coa_4000
msgid "Charges de matériel de l‘atelier"
msgstr "Materialaufwand Produktion"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_5900
#: model:account.account.template,name:l10n_ch.ch_coa_5900
msgid "Charges de personnels temporaires"
msgstr "Leistungen Dritter"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6200
#: model:account.account.template,name:l10n_ch.ch_coa_6200
msgid "Charges de véhicules et de transport"
msgstr "Fahrzeug- und Transportaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_7510
#: model:account.account.template,name:l10n_ch.ch_coa_7510
msgid "Charges des immeubles d‘exploitation"
msgstr "Aufwand betriebliche Liegenschaft"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6500
#: model:account.account.template,name:l10n_ch.ch_coa_6500
msgid "Charges d‘administration"
msgstr "Verwaltungsaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6400
#: model:account.account.template,name:l10n_ch.ch_coa_6400
msgid "Charges d’énergie et évacuation des déchets"
msgstr "Energie- und Entsorgungsaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6570
#: model:account.account.template,name:l10n_ch.ch_coa_6570
msgid "Charges et leasing d’informatique"
msgstr "Informatikaufwand inkl. Leasing"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_8500
#: model:account.account.template,name:l10n_ch.ch_coa_8500
msgid "Charges extraordinaires, exceptionnelles ou hors période"
msgstr "Ausserordentlicher, einmaliger oder periodenfremder Aufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6900
#: model:account.account.template,name:l10n_ch.ch_coa_6900
msgid "Charges financières"
msgstr "Finanzaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_8000
#: model:account.account.template,name:l10n_ch.ch_coa_8000
msgid "Charges hors exploitation"
msgstr "Betriebsfremder Aufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1300
#: model:account.account.template,name:l10n_ch.ch_coa_1300
msgid "Charges payées d‘avance"
msgstr "Bezahlter Aufwand des Folgejahres"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_5700
#: model:account.account.template,name:l10n_ch.ch_coa_5700
msgid "Charges sociales"
msgstr "Sozialversicherungsaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2300
#: model:account.account.template,name:l10n_ch.ch_coa_2300
msgid "Charges à payer"
msgstr "Noch nicht bezahlter Aufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3803
#: model:account.account.template,name:l10n_ch.ch_coa_3803
msgid "Commissions de tiers"
-msgstr ""
+msgstr "Provisionen an Dritte"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4903
#: model:account.account.template,name:l10n_ch.ch_coa_4903
msgid "Commissions obtenues sur achats"
-msgstr ""
+msgstr "Einkaufsprovisionen"
+
+#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_res_company
+msgid "Companies"
+msgstr "Unternehmen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1099
#: model:account.account.template,name:l10n_ch.ch_coa_1099
msgid "Compte d'attente autre"
-msgstr ""
+msgstr "Unklare Beträge"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1091
#: model:account.account.template,name:l10n_ch.ch_coa_1091
msgid "Compte d'attente pour salaires"
-msgstr ""
+msgstr "Lohndurchlaufkonto"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3710
#: model:account.account.template,name:l10n_ch.ch_coa_3710
msgid "Consommations propres"
msgstr "Eigenverbrauch"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1269
#: model:account.account.template,name:l10n_ch.ch_coa_1269
msgid "Correction de la valeur de stocks de produits finis"
-msgstr ""
+msgstr "Wertberichtigungen fertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1279
#: model:account.account.template,name:l10n_ch.ch_coa_1279
msgid "Corrections de la valeur des stock produits semi-ouvrés"
-msgstr ""
+msgstr "Wertberichtigungen unfertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1209
#: model:account.account.template,name:l10n_ch.ch_coa_1209
msgid "Corrections de la valeur des stocks de marchandises"
-msgstr ""
+msgstr "Wertberichtigungen Handelswaren"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1289
#: model:account.account.template,name:l10n_ch.ch_coa_1289
msgid "Corrections de la valeur des travaux en cours"
-msgstr ""
+msgstr "Wertberichtigungen nicht fakturierte Dienstleistungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1219
#: model:account.account.template,name:l10n_ch.ch_coa_1219
msgid "Corrections de la valeur sur matières premières"
-msgstr ""
+msgstr "Wertberichtigungen Rohstoffe"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1180
#: model:account.account.template,name:l10n_ch.ch_coa_1180
msgid "Créances envers les assurances sociales et institutions de prévoyance"
msgstr "Forderungen gegenüber Sozialversicherungen und Vorsorgeeinrichtungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2000
#: model:account.account.template,name:l10n_ch.ch_coa_2000
msgid "Créanciers"
msgstr "Verbindlichkeiten aus Lieferungen und Leistungen (Kreditoren)"
#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_currency_name
+msgid "Currency"
+msgstr "Währung"
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2100
+#: model:account.account,name:l10n_ch.1_ch_coa_2400
#: model:account.account.template,name:l10n_ch.ch_coa_2100
#: model:account.account.template,name:l10n_ch.ch_coa_2400
msgid "Dettes bancaires"
msgstr "Bankverbindlichkeiten"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2160
#: model:account.account.template,name:l10n_ch.ch_coa_2160
msgid "Dettes envers l'actionnaire"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3806
+#: model:account.account,name:l10n_ch.1_ch_coa_4906
#: model:account.account.template,name:l10n_ch.ch_coa_3806
#: model:account.account.template,name:l10n_ch.ch_coa_4906
msgid "Différences de change"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2261
#: model:account.account.template,name:l10n_ch.ch_coa_2261
msgid "Dividendes"
msgstr "Beschlossene Ausschüttungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4071
#: model:account.account.template,name:l10n_ch.ch_coa_4071
msgid "Droits de douanes à l'importation"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1109
#: model:account.account.template,name:l10n_ch.ch_coa_1109
msgid "Ducroire"
msgstr "Delkredere"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1100
#: model:account.account.template,name:l10n_ch.ch_coa_1100
msgid "Débiteurs"
msgstr "Forderungen aus Lieferungen und Leistungen (Debitoren)"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2201
#: model:account.account.template,name:l10n_ch.ch_coa_2201
msgid "Décompte TVA"
msgstr "Abrechnungskonto MWST"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4009
#: model:account.account.template,name:l10n_ch.ch_coa_4009
msgid "Déductions obtenues sur achats"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3009
#: model:account.account.template,name:l10n_ch.ch_coa_3009
msgid "Déductions sur ventes"
msgstr "Erlösminderungen"
#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_res_bank_l10n_ch_postal_eur
+msgid "EUR ISR reference"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4540
#: model:account.account.template,name:l10n_ch.ch_coa_4540
msgid "Eau"
msgstr "Wasser"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4500
#: model:account.account.template,name:l10n_ch.ch_coa_4500
msgid "Electricité"
msgstr "Strom"
#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_mail_template
+msgid "Email Templates"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_mail_compose_message
+msgid "Email composition wizard"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2450
#: model:account.account.template,name:l10n_ch.ch_coa_2450
msgid "Emprunts"
msgstr "Darlehen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2430
#: model:account.account.template,name:l10n_ch.ch_coa_2430
msgid "Emprunts obligataires"
msgstr "Obligationenanleihen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2120
+#: model:account.account,name:l10n_ch.1_ch_coa_2420
#: model:account.account.template,name:l10n_ch.ch_coa_2120
#: model:account.account.template,name:l10n_ch.ch_coa_2420
msgid "Engagements de financement par leasing"
msgstr "Verbindlichkeiten aus Finanzierungsleasing"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6100
#: model:account.account.template,name:l10n_ch.ch_coa_6100
-msgid "Entretien, réparations et remplacement des inst. servant à l’exploitation"
+msgid ""
+"Entretien, réparations et remplacement des inst. servant à l’exploitation"
msgstr "Unterhalt, Reparaturen, Ersatz mobile Sachanlagen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1570
#: model:account.account.template,name:l10n_ch.ch_coa_1570
msgid "Equipements et Installations"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3800
+#: model:account.account,name:l10n_ch.1_ch_coa_4900
#: model:account.account.template,name:l10n_ch.ch_coa_3800
#: model:account.account.template,name:l10n_ch.ch_coa_4900
msgid "Escomptes"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4530
#: model:account.account.template,name:l10n_ch.ch_coa_4530
msgid "Essence"
msgstr "Benzin"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3804
#: model:account.account.template,name:l10n_ch.ch_coa_3804
msgid "Frais d'encaissement"
msgstr "Frais d'encaissement"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3807
#: model:account.account.template,name:l10n_ch.ch_coa_3807
msgid "Frais d'expédition"
msgstr "Frais d'expédition"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4072
#: model:account.account.template,name:l10n_ch.ch_coa_4072
msgid "Frais de transport à l'achat"
msgstr "Frais de transport à l'achat"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4070
#: model:account.account.template,name:l10n_ch.ch_coa_4070
msgid "Frêts à l'achat"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4510
#: model:account.account.template,name:l10n_ch.ch_coa_4510
msgid "Gaz"
msgstr "Gaz"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1770
#: model:account.account.template,name:l10n_ch.ch_coa_1770
msgid "Goodwill"
msgstr "Goodwill"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1441
+#: model:account.account,name:l10n_ch.1_ch_coa_2451
#: model:account.account.template,name:l10n_ch.ch_coa_1441
#: model:account.account.template,name:l10n_ch.ch_coa_2451
msgid "Hypothèques"
msgstr "Hypotheken"
#. module: l10n_ch
+#: model:ir.actions.report.xml,name:l10n_ch.l10n_ch_isr_report
+msgid "ISR"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.ui.view,arch_db:l10n_ch.l10n_ch_isr_report_template
+msgid "ISR for invoice"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_number_spaced
+msgid ""
+"ISR number split in blocks of 5 characters (right-justified), to generate "
+"ISR report."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.ui.view,arch_db:l10n_ch.isr_invoice_search_view
+msgid "ISR reference number"
+msgstr ""
+
+#. module: l10n_ch
+#: code:addons/l10n_ch/models/mail_compose_message.py:23
+#, python-format
+msgid "ISR sent"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1600
#: model:account.account.template,name:l10n_ch.ch_coa_1600
msgid "Immeubles d’exploitation"
msgstr "Geschäftsliegenschaften"
#. module: l10n_ch
+#: model:account.fiscal.position,name:l10n_ch.1_fiscal_position_template_import
#: model:account.fiscal.position.template,name:l10n_ch.fiscal_position_template_import
msgid "Import/Export"
msgstr "Import/Export"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1176
#: model:account.account.template,name:l10n_ch.ch_coa_1176
msgid "Impôt anticipé"
msgstr "Verrechnungssteuer"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2206
#: model:account.account.template,name:l10n_ch.ch_coa_2206
msgid "Impôt anticipé dû"
msgstr "Verrechnungssteuer"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1171
#: model:account.account.template,name:l10n_ch.ch_coa_1171
msgid "Impôt préalable: TVA s/investissements et autres charges d’exploitation"
msgstr "Vorsteuer MWST Investitionen, übriger Betriebsaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1170
#: model:account.account.template,name:l10n_ch.ch_coa_1170
msgid "Impôt préalable: TVA s/matériel, marchandises, prestations et énergie"
msgstr "Vorsteuer MWST Material, Waren, Dienstleistungen, Energie"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1189
+#: model:account.account,name:l10n_ch.1_ch_coa_2279
#: model:account.account.template,name:l10n_ch.ch_coa_1189
#: model:account.account.template,name:l10n_ch.ch_coa_2279
msgid "Impôt à la source"
msgstr "Quellensteuer"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2208
+#: model:account.account,name:l10n_ch.1_ch_coa_8900
#: model:account.account.template,name:l10n_ch.ch_coa_2208
#: model:account.account.template,name:l10n_ch.ch_coa_8900
msgid "Impôts directs"
msgstr "Direkte Steuern"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1550
#: model:account.account.template,name:l10n_ch.ch_coa_1550
msgid "Installations de stockage"
msgstr "Installations de stockage"
#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_account_invoice
+msgid "Invoice"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_number
+msgid "L10N Ch Isr Number"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_number_spaced
+msgid "L10N Ch Isr Number Spaced"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_optical_line
+msgid "L10N Ch Isr Optical Line"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_postal
+msgid "L10N Ch Isr Postal"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_postal_formatted
+msgid "L10N Ch Isr Postal Formatted"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_sent
+msgid "L10N Ch Isr Sent"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_invoice_l10n_ch_isr_valid
+msgid "L10N Ch Isr Valid"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_res_partner_bank_l10n_ch_postal
+msgid "L10N Ch Postal"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6260
#: model:account.account.template,name:l10n_ch.ch_coa_6260
msgid "Leasing et location de véhicules"
msgstr "Fahrzeugleasing und -mieten"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6105
#: model:account.account.template,name:l10n_ch.ch_coa_6105
msgid "Leasing immobilisations corporelles meubles"
msgstr "Leasingaufwand mobile Sachanlagen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1520
#: model:account.account.template,name:l10n_ch.ch_coa_1520
msgid "Machines de bureau, informatique, systèmes de communication"
msgstr "Büromaschinen, Informatik, Kommunikationstechnologie"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1500
#: model:account.account.template,name:l10n_ch.ch_coa_1500
msgid "Machines et appareils"
msgstr "Maschinen und Apparate"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1200
#: model:account.account.template,name:l10n_ch.ch_coa_1200
msgid "Marchandises commerciales"
msgstr "Handelswaren"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1250
#: model:account.account.template,name:l10n_ch.ch_coa_1250
msgid "Marchandises en consignation"
msgstr "Handelswaren in Konsignation"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1220
#: model:account.account.template,name:l10n_ch.ch_coa_1220
msgid "Matières auxiliaires"
msgstr "Werkstoffe"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1230
#: model:account.account.template,name:l10n_ch.ch_coa_1230
msgid "Matières consommables"
msgstr "Hilfs- und Verbrauchsmaterial"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1210
#: model:account.account.template,name:l10n_ch.ch_coa_1210
msgid "Matières premières"
msgstr "Rohstoffe"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4520
#: model:account.account.template,name:l10n_ch.ch_coa_4520
msgid "Mazout"
msgstr "Heizöl"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1510
#: model:account.account.template,name:l10n_ch.ch_coa_1510
msgid "Mobilier et installations"
msgstr "Mobiliar und Einrichtungen"
#. module: l10n_ch
-#: model:ir.actions.client,name:l10n_ch.action_client_l10n_ch_menu
-msgid "Open Account Dashboard Menu"
-msgstr " Buchführungsübersicht öffnen"
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_optical_line
+msgid "Optical reading line, as it will be printed on ISR"
+msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1540
#: model:account.account.template,name:l10n_ch.ch_coa_1540
msgid "Outillages et appareils"
msgstr "Werkzeuge und Geräte"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1480
#: model:account.account.template,name:l10n_ch.ch_coa_1480
msgid "Participations"
msgstr "Beteiligungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4086
#: model:account.account.template,name:l10n_ch.ch_coa_4086
msgid "Pertes de matières"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3805
#: model:account.account.template,name:l10n_ch.ch_coa_3805
msgid "Pertes sur créances clients, variation ducroire"
msgstr "Verluste Forderungen (Debitoren), Veränderung Delkredere"
@@ -721,122 +1005,179 @@ msgid "Plan comptable 2015"
msgstr "Kontenrahmen 2015"
#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_postal_formatted
+msgid ""
+"Postal reference of the bank, formated with '-' and without the padding "
+"zeros, to generate ISR report."
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4400
#: model:account.account.template,name:l10n_ch.ch_coa_4400
msgid "Prestations / travaux de tiers"
msgstr "Aufwand für bezogene Dienstleistungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3700
#: model:account.account.template,name:l10n_ch.ch_coa_3700
msgid "Prestations propres"
msgstr "Eigenleistungen"
#. module: l10n_ch
+#: model:ir.ui.view,arch_db:l10n_ch.isr_invoice_form
+msgid "Print ISR"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_res_company_l10n_ch_isr_print_bank_location
+msgid "Print bank location"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,field_description:l10n_ch.field_account_config_settings_l10n_ch_isr_print_bank_location
+msgid "Print bank on ISR"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.ui.view,arch_db:l10n_ch.l10n_ch-isr_account_config_settings
+msgid ""
+"Print the coordinates of your bank under the 'Payment for' title of the "
+"ISR.\n"
+" Your address will be moved to the 'in favour "
+"of' section."
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_7000
#: model:account.account.template,name:l10n_ch.ch_coa_7000
msgid "Produits accessoires"
msgstr "Ertrag Nebenbetrieb"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_7500
#: model:account.account.template,name:l10n_ch.ch_coa_7500
msgid "Produits des immeubles d‘exploitation"
msgstr "Ertrag betriebliche Liegenschaft"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2301
#: model:account.account.template,name:l10n_ch.ch_coa_2301
msgid "Produits encaissés d’avance"
msgstr "Erhaltener Ertrag des Folgejahres"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_8510
#: model:account.account.template,name:l10n_ch.ch_coa_8510
msgid "Produits extraordinaires, exceptionnels ou hors période"
msgstr "Ausserordentlicher, einmaliger oder periodenfremder Ertrag"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6950
#: model:account.account.template,name:l10n_ch.ch_coa_6950
msgid "Produits financiers"
msgstr "Finanzertrag"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_8100
#: model:account.account.template,name:l10n_ch.ch_coa_8100
msgid "Produits hors exploitation"
msgstr "Betriebsfremder Ertrag"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1301
#: model:account.account.template,name:l10n_ch.ch_coa_1301
msgid "Produits à recevoir"
msgstr "Noch nicht erhaltener Ertrag"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2980
#: model:account.account.template,name:l10n_ch.ch_coa_2980
-msgid "Propres actions, parts sociales, droits de participations (poste négatif)"
+msgid ""
+"Propres actions, parts sociales, droits de participations (poste négatif)"
msgstr "Eigene Aktien, Stammanteile oder Anteilscheine (Minusposten)"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2600
#: model:account.account.template,name:l10n_ch.ch_coa_2600
msgid "Provisions"
msgstr "Rückstellungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2330
#: model:account.account.template,name:l10n_ch.ch_coa_2330
msgid "Provisions à court terme"
msgstr "Kurzfristige Rückstellungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1440
#: model:account.account.template,name:l10n_ch.ch_coa_1440
msgid "Prêts"
msgstr "Darlehen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_6600
#: model:account.account.template,name:l10n_ch.ch_coa_6600
msgid "Publicité"
msgstr "Werbeaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3801
#: model:account.account.template,name:l10n_ch.ch_coa_3801
msgid "Rabais et réduction de prix"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4901
#: model:account.account.template,name:l10n_ch.ch_coa_4901
msgid "Rabais et réductions de prix"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3802
+#: model:account.account,name:l10n_ch.1_ch_coa_4092
#: model:account.account.template,name:l10n_ch.ch_coa_3802
#: model:account.account.template,name:l10n_ch.ch_coa_4092
msgid "Ristournes"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2940
#: model:account.account.template,name:l10n_ch.ch_coa_2940
msgid "Réserves d‘évaluation"
msgstr "Aufwertungsreserve"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2960
#: model:account.account.template,name:l10n_ch.ch_coa_2960
msgid "Réserves libres"
msgstr "Freiwillige Gewinnreserven"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2950
#: model:account.account.template,name:l10n_ch.ch_coa_2950
msgid "Réserves légales issues du bénéfice"
msgstr "Gesetzliche Gewinnreserve"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2900
#: model:account.account.template,name:l10n_ch.ch_coa_2900
msgid "Réserves légales issues du capital"
msgstr "Gesetzliche Kapitalreserve"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_5000
#: model:account.account.template,name:l10n_ch.ch_coa_5000
msgid "Salaires"
msgstr "Lohnaufwand"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1260
#: model:account.account.template,name:l10n_ch.ch_coa_1260
msgid "Stocks de produits finis"
msgstr "Fertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1270
#: model:account.account.template,name:l10n_ch.ch_coa_1270
msgid "Stocks de produits semi-ouvrés"
msgstr ""
@@ -847,203 +1188,409 @@ msgid "Swiss Statements"
msgstr "CH Bilanz- und Erfolgsrechnungen"
#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_dedouanement
+msgid "Switzerland VAT Form: 100% dédouanement (base in grid 400)"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_200
+msgid "Switzerland VAT Form: grid 200"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_220
+msgid "Switzerland VAT Form: grid 220"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_221
+msgid "Switzerland VAT Form: grid 221"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_225
+msgid "Switzerland VAT Form: grid 225"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_230
+msgid "Switzerland VAT Form: grid 230"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_235
+msgid "Switzerland VAT Form: grid 235"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_280
+msgid "Switzerland VAT Form: grid 280"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_301_a
+msgid "Switzerland VAT Form: grid 301 base"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_301_b
+msgid "Switzerland VAT Form: grid 301 tax"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_311_a
+msgid "Switzerland VAT Form: grid 311 base"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_311_b
+msgid "Switzerland VAT Form: grid 311 tax"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_341_a
+msgid "Switzerland VAT Form: grid 341 base"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_341_b
+msgid "Switzerland VAT Form: grid 341 tax"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_381_a
+msgid "Switzerland VAT Form: grid 381 base"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_381_b
+msgid "Switzerland VAT Form: grid 381 tax"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_400
+msgid "Switzerland VAT Form: grid 400"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_405
+msgid "Switzerland VAT Form: grid 405"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_410
+msgid "Switzerland VAT Form: grid 410"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_415
+msgid "Switzerland VAT Form: grid 415"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account.tag,name:l10n_ch.vat_tag_420
+msgid "Switzerland VAT Form: grid 420"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_O_import
#: model:account.tax.template,name:l10n_ch.vat_O_import
msgid "TVA 0% Importations de biens et services"
msgstr "MwSt. 0% auf Importe von Gütern und Dienstleistungen"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_O_exclude
#: model:account.tax.template,name:l10n_ch.vat_O_exclude
msgid "TVA 0% exclue"
msgstr "MwSt. 0% ausgeschlossen"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25_purchase_incl
#: model:account.tax.template,name:l10n_ch.vat_25_purchase_incl
msgid "TVA 2.5% sur achat B&S (Incl. TR)"
msgstr "MwSt. 2,5 % auf Einkäufe B&S (inkl. USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25_purchase
#: model:account.tax.template,name:l10n_ch.vat_25_purchase
msgid "TVA 2.5% sur achat B&S (TR)"
msgstr "MwSt. 2,5 % auf Einkäufe B&S (USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25_invest_incl
#: model:account.tax.template,name:l10n_ch.vat_25_invest_incl
msgid "TVA 2.5% sur invest. et autres ch. (Incl. TR)"
msgstr "MwSt. 2,5% auf Invest. und sonst. Aufw. (inkl. USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25_invest
#: model:account.tax.template,name:l10n_ch.vat_25_invest
msgid "TVA 2.5% sur invest. et autres ch. (TR)"
msgstr "MwSt. 2,5% auf Invest. und sonst. Aufw. (USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38_purchase_incl
#: model:account.tax.template,name:l10n_ch.vat_38_purchase_incl
msgid "TVA 3.8% sur achat B&S (Incl. TS)"
msgstr "MwSt. 3,8% auf Einkäufe B&S (inkl. LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38_purchase
#: model:account.tax.template,name:l10n_ch.vat_38_purchase
msgid "TVA 3.8% sur achat B&S (TS)"
msgstr "MwSt. 3,8% auf Einkäufe B&S (LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38_invest_incl
#: model:account.tax.template,name:l10n_ch.vat_38_invest_incl
msgid "TVA 3.8% sur invest. et autres ch. (Incl. TS)"
msgstr "MwSt. 3,8% auf Invest. und sonst. Aufw. (inkl. LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38_invest
#: model:account.tax.template,name:l10n_ch.vat_38_invest
msgid "TVA 3.8% sur invest. et autres ch. (TS)"
msgstr "MwSt. 3,8% auf Invest. und sonst. Aufw. (LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80_purchase_incl
#: model:account.tax.template,name:l10n_ch.vat_80_purchase_incl
msgid "TVA 8.0% sur achat B&S (Incl. TN)"
msgstr "MwSt. 8.0% auf Einkäufe B&S (inkl. NRZ)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80_purchase
#: model:account.tax.template,name:l10n_ch.vat_80_purchase
msgid "TVA 8.0% sur achat B&S (TN)"
msgstr "MwSt. 8,0% auf Einkäufe B&S (NRZ)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80_invest_incl
#: model:account.tax.template,name:l10n_ch.vat_80_invest_incl
msgid "TVA 8.0% sur invest. et autres ch. (Incl. TN)"
msgstr "MwSt. 8,0% auf Invest. und sonst. Aufw. (inkl. NRZ)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80_invest
#: model:account.tax.template,name:l10n_ch.vat_80_invest
msgid "TVA 8.0% sur invest. et autres ch. (TN)"
msgstr "MwSt. 8,0% auf Invest. und sonst. Aufw. (NRZ)"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_2200
#: model:account.account.template,name:l10n_ch.ch_coa_2200
msgid "TVA due"
msgstr "Geschuldete MwSt. (Umsatzsteuer)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_XO
#: model:account.tax.template,name:l10n_ch.vat_XO
msgid "TVA due a 0% (Exportations)"
msgstr "Zu zahlende MwSt. bei 0% (Exporte)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25
#: model:account.tax.template,name:l10n_ch.vat_25
msgid "TVA due a 2.5% (TR)"
msgstr "Zu zahlende MwSt. bei 2,5% (USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38
#: model:account.tax.template,name:l10n_ch.vat_38
msgid "TVA due a 3.8% (TS)"
msgstr "Zu zahlende MwSt. bei 3,8% (LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80
#: model:account.tax.template,name:l10n_ch.vat_80
msgid "TVA due a 8.0% (TN)"
msgstr "Zu zahlende MwSt. bei 8,0% (NRZ)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_25_incl
#: model:account.tax.template,name:l10n_ch.vat_25_incl
msgid "TVA due à 2.5% (Incl. TR)"
msgstr "Zu zahlende MwSt. bei 2,5% (inkl. USt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_38_incl
#: model:account.tax.template,name:l10n_ch.vat_38_incl
msgid "TVA due à 3.8% (Incl. TS)"
msgstr "Zu zahlende MwSt. bei 3,8% (inkl. LSt)"
#. module: l10n_ch
+#: model:account.tax,name:l10n_ch.1_vat_80_incl
#: model:account.tax.template,name:l10n_ch.vat_80_incl
msgid "TVA due à 8.0% (Incl. TN)"
msgstr "Zu zahlende MwSt. bei 8,0% (inkl. NRZ)"
#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_res_partner_bank_l10n_ch_postal
+msgid "The ISR number of the company within the bank"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_currency_name
+msgid "The name of this invoice's currency"
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_postal
+msgid "The postal reference identifying the bank managing this ISR."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_res_bank_l10n_ch_postal_chf
+msgid ""
+"The postal reference of the bank, used to generate ISR payment slips in CHF."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_res_bank_l10n_ch_postal_eur
+msgid ""
+"The postal reference of the bank, used to generate ISR payment slips in EUR."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model.fields,help:l10n_ch.field_account_invoice_l10n_ch_isr_number
+msgid "The reference number associated with this invoice"
+msgstr ""
+
+#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1060
#: model:account.account.template,name:l10n_ch.ch_coa_1060
msgid "Titres"
msgstr "Wertschriften"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1400
#: model:account.account.template,name:l10n_ch.ch_coa_1400
msgid "Titres à long terme"
msgstr "Wertschriften"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_transfer_account_id
#: model:account.account.template,name:l10n_ch.transfer_account_id
msgid "Transferts internes"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1280
#: model:account.account.template,name:l10n_ch.ch_coa_1280
msgid "Travaux en cours"
msgstr "Unfertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3940
#: model:account.account.template,name:l10n_ch.ch_coa_3940
msgid "Variation de la valeur des prestations non facturées"
msgstr "Bestandesänderungen nicht fakturierte Dienstleistungen"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1287
#: model:account.account.template,name:l10n_ch.ch_coa_1287
msgid "Variation de la valeur des travaux en cours"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1277
#: model:account.account.template,name:l10n_ch.ch_coa_1277
msgid "Variation de stock produits semi-ouvrés"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1267
#: model:account.account.template,name:l10n_ch.ch_coa_1267
msgid "Variation de stocks de produits finis"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1207
+#: model:account.account,name:l10n_ch.1_ch_coa_4800
#: model:account.account.template,name:l10n_ch.ch_coa_1207
#: model:account.account.template,name:l10n_ch.ch_coa_4800
msgid "Variation des stocks de marchandises"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4801
#: model:account.account.template,name:l10n_ch.ch_coa_4801
msgid "Variation des stocks de matières premières"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3901
#: model:account.account.template,name:l10n_ch.ch_coa_3901
msgid "Variation des stocks de produits finis"
msgstr "Bestandesänderungen fertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3900
#: model:account.account.template,name:l10n_ch.ch_coa_3900
msgid "Variation des stocks de produits semi-finis"
msgstr "Bestandesänderungen unfertige Erzeugnisse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1217
#: model:account.account.template,name:l10n_ch.ch_coa_1217
msgid "Variation des stocks des matières premières"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_4008
+#: model:account.account,name:l10n_ch.1_ch_coa_4080
#: model:account.account.template,name:l10n_ch.ch_coa_4008
#: model:account.account.template,name:l10n_ch.ch_coa_4080
msgid "Variations de stocks"
msgstr ""
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3200
#: model:account.account.template,name:l10n_ch.ch_coa_3200
msgid "Ventes de marchandises"
msgstr "Handelserlöse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3400
#: model:account.account.template,name:l10n_ch.ch_coa_3400
msgid "Ventes de prestations"
msgstr "Dienstleistungserlöse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_3000
#: model:account.account.template,name:l10n_ch.ch_coa_3000
msgid "Ventes de produits fabriqués"
msgstr "Produktionserlöse"
#. module: l10n_ch
+#: model:account.account,name:l10n_ch.1_ch_coa_1530
#: model:account.account.template,name:l10n_ch.ch_coa_1530
msgid "Véhicules"
msgstr "Fahrzeuge"
+
+#. module: l10n_ch
+#: code:addons/l10n_ch/models/account_invoice.py:153
+#, python-format
+msgid ""
+"You cannot generate an ISR yet.\n"
+"\n"
+" For this, you need to :\n"
+"\n"
+" - set a valid postal account number (or "
+"an IBAN referencing one) for your company\n"
+"\n"
+" - define its bank\n"
+"\n"
+" - associate this bank with a postal "
+"reference for the currency used in this invoice\n"
+"\n"
+" - fill the 'bank account' field of the "
+"invoice with the postal to be used to receive the related payment. A default "
+"account will be automatically set for all invoices created after you defined "
+"a postal account for your company."
+msgstr ""
+
+#. module: l10n_ch
+#: model:ir.model,name:l10n_ch.model_account_config_settings
+msgid "account.config.settings"
+msgstr ""
diff --git a/addons/l10n_do/__init__.py b/addons/l10n_do/__init__.py
index 67dee8c60db..dc5e6b693d1 100644
--- a/addons/l10n_do/__init__.py
+++ b/addons/l10n_do/__init__.py
@@ -1,2 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import models
diff --git a/addons/l10n_do/__manifest__.py b/addons/l10n_do/__manifest__.py
index ba049cf6f99..cf4af681219 100644
--- a/addons/l10n_do/__manifest__.py
+++ b/addons/l10n_do/__manifest__.py
@@ -1,37 +1,103 @@
# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-# First author: Jose Ernesto Mendez <tecnologia@obsdr.com> (Open Business Solutions SRL.)
-# Copyright (c) 2012 -TODAY Open Business Solutions, SRL. (http://obsdr.com). All rights reserved.
-# This is a fork to upgrade to odoo 8.0
-# by Marcos Organizador de Negocios - Eneldo Serrata - www.marcos.org.do
+# Author: Gustavo Valverde <gvalverde@iterativo.do> iterativo | Consultores
+# Contributors: Edser Solis - iterativo
+
+# Odoo 8.0 author: Eneldo Serrata <eneldo@marcos.do>
+# (Marcos Organizador de Negocios SRL..)
+# Odoo 7.0 author: Jose Ernesto Mendez <tecnologia@obsdr.com>
+# (Open Business Solutions SRL.)
+
+# Copyright (c) 2016 - Present | iterativo, SRL. - http://iterativo.do
+# All rights reserved.
{
'name': 'Dominican Republic - Accounting',
- 'version': '1.0',
+ 'version': '2.0',
'category': 'Localization',
'description': """
-This is the base module to manage the accounting chart for Dominican Republic.
-==============================================================================
-
-* Chart of Accounts.
-* The Tax Code Chart for Domincan Republic
-* The main taxes used in Domincan Republic
-* Fiscal position for local """,
- 'author': 'Eneldo Serrata - Marcos Organizador de Negocios, SRL.',
- 'website': 'http://marcos.do',
- 'depends': ['account', 'base_iban'],
+
+Localization Module for Dominican Republic
+===========================================
+
+Catálogo de Cuentas e Impuestos para República Dominicana, Compatible para
+**Internacionalización** con **NIIF** y alineado a las normas y regulaciones
+de la Dirección General de Impuestos Internos (**DGII**).
+
+**Este módulo consiste de:**
+
+- Catálogo de Cuentas Estándar (alineado a DGII y NIIF)
+- Catálogo de Impuestos con la mayoría de Impuestos Preconfigurados
+ - ITBIS para compras y ventas
+ - Retenciones de ITBIS
+ - Retenciones de ISR
+ - Grupos de Impuestos y Retenciones:
+ - Telecomunicaiones
+ - Proveedores de Materiales de Construcción
+ - Personas Físicas Proveedoras de Servicios
+ - Otros impuestos
+- Secuencias Preconfiguradas para manejo de todos los NCF
+ - Facturas con Valor Fiscal (para Ventas)
+ - Facturas para Consumidores Finales
+ - Notas de Débito y Crédito
+ - Registro de Proveedores Informales
+ - Registro de Ingreso Único
+ - Registro de Gastos Menores
+ - Gubernamentales
+- Posiciones Fiscales para automatización de impuestos y retenciones
+ - Cambios de Impuestos a Exenciones (Ej. Ventas al Estado)
+ - Cambios de Impuestos a Retenciones (Ej. Compra Servicios al Exterior)
+ - Entre otros
+
+**Nota:**
+Esta localización, aunque posee las secuencias para NCF, las mismas no pueden
+ser utilizadas sin la instalación de módulos de terceros o desarrollo
+adicional.
+
+Estructura de Codificación del Catálogo de Cuentas:
+===================================================
+
+**Un dígito** representa la categoría/tipo de cuenta del del estado financiero.
+**1** - Activo **4** - Cuentas de Ingresos y Ganancias
+**2** - Pasivo **5** - Costos, Gastos y Pérdidas
+**3** - Capital **6** - Cuentas Liquidadoras de Resultados
+
+**Dos dígitos** representan los rubros de agrupación:
+11- Activo Corriente
+21- Pasivo Corriente
+31- Capital Contable
+
+**Cuatro dígitos** se asignan a las cuentas de mayor: cuentas de primer orden
+1101- Efectivo y Equivalentes de Efectivo
+2101- Cuentas y Documentos por pagar
+3101- Capital Social
+
+**Seis dígitos** se asignan a las sub-cuentas: cuentas de segundo orden
+110101 - Caja
+210101 - Proveedores locales
+
+**Ocho dígitos** son para las cuentas de tercer orden (las visualizadas
+en Odoo):
+1101- Efectivo y Equivalentes
+110101- Caja
+11010101 Caja General
+ """,
+ 'author': 'Gustavo Valverde - iterativo | Consultores de Odoo',
+ 'website': 'http://iterativo.do',
+ 'depends': ['account',
+ 'base_iban'
+ ],
'data': [
- # basic accounting data
+ # Basic accounting data
'data/l10n_do_chart_data.xml',
'data/account.account.template.csv',
'data/account_chart_template_data.xml',
'data/account_account_tag_data.xml',
- 'data/account.tax.template.csv',
+ 'data/account.tax.template.xml',
+ # Country States
'data/l10n_do_state_data.xml',
# Adds fiscal position
- 'data/account.fiscal.position.template.csv',
- 'data/account.fiscal.position.tax.template.csv',
+ 'data/fiscal_position_template.xml',
# configuration wizard, views, reports...
'data/account_chart_template_data.yml',
],
diff --git a/addons/l10n_do/data/account.account.template.csv b/addons/l10n_do/data/account.account.template.csv
index ed6b2ba91a8..2879acc2e86 100644
--- a/addons/l10n_do/data/account.account.template.csv
+++ b/addons/l10n_do/data/account.account.template.csv
@@ -1,198 +1,254 @@
id,code,name,user_type_id/id,reconcile,chart_template_id/id
-default_chart_a_account_528,61121,"Agua, Luz y Basura",account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_529,61122,Telecomunicaciones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_721,61123,Otros Gastos Administrativos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_531,61131,Depreciación Edificio,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_532,61132,Depreciación Mobiliario y Equipos de Oficina,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_533,61133,Depreciación Equipos de Cómputos y Telecomunicaciones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_534,61134,Depreciación Equipos de Transporte,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_535,61135,Depreciación Maquinarias y Equipos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_536,61136,Depreciación Otros Activos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_537,61137,Amortización Mejoras en Propiedad Arrendada,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_538,61138,Amortización Gastos de Organización y Constitución,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_539,61139,Amortización Patentes y Derechos de Explotación,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_542,61141,Alquiler de Locales ,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_543,61142,Alquiler de Equipos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_544,61143,Alquiler de Vehículos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_545,61144,Alquileres Generales,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_722,61160,Otras Deducciones Admitidas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_586,61161,Impuesto de Fiscalización,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_587,61162,Retenciones de Impuesto sobre la Rentas Asumidas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_588,61163,"Penalidades, Mora e Interés Indemnizatorios",account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_589,61164,Gastos Sin Comprobantes No Admitidos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_590,61165,Gastos de Años Anteriores No Admitidos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_591,61166,Otros Gastos No Deducible ISR,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_592,61167,Otros Gastos Generales y Administrativos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_594,61171,Cargos Bancarios,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_595,61172,Cargos Carnet,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_596,61173,Pérdida en Ajuste por Tipo de Cambio,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_597,61174,Intereses sobre Prestamos Bancarios,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_598,61175,Intereses sobre Prestamos Particulares,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_600,61181,Impuestos sobre la Renta Corrientes,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_601,61182,Impuestos sobre Activos Corrientes,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_602,61183,Impuestos Sobre la Renta Diferidos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_603,61184,Crédito Fiscal por Retención de Dividendos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_604,61185,Impuestos de años anteriores,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_605,61186,Impuestos sobre Activos de años anteriores,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_152,112050,Efectivo en transito,account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_13,113010,Cuentas por Cobrar Clientes,account.data_account_type_receivable,true,l10n_do.default_chart_a
-default_chart_a_account_14,113020,Cuentas por Cobrar Funcionarios y Empleados,account.data_account_type_receivable,true,l10n_do.default_chart_a
-default_chart_a_account_15,113030,Otras Cuentas por Cobrar,account.data_account_type_receivable,true,l10n_do.default_chart_a
-default_chart_a_account_707,113040,Pendientes de conciliar,account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_709,113050,Operaciones bancarias en transito,account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_716,113060,Gastos Pagados Por Adelantado,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_17,114010,Mercancias,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_18,114020,Materia Prima,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_19,114030,Productos en procesos,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_20,114040,Productos terminados,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_22,115010,Seguros,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_23,115020,Placas y Patentes,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_24,115030,I.S.R.,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_25,115040,Intereses cobrados por adelantados,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_26,115050,Otros,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_182,123100,Mobiliario y Equipos de Oficina,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_183,123200,Deprec. Acumulada Mobiliario y Equipos de Oficina,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_184,124100,Equipos de Cómputos y Telecomunicaciones,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_185,124200,Deprec. Acumulada Equipos de Cómputos y Telecomunicaciones,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_187,125100,Equipos de Transporte Livianos,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_188,125200,Deprec. Acumulada Equipos de Transporte Livianos,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_190,125300,Equipos de Transporte Pesados,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_191,125400,Deprec. Acumulada Equipos de Transporte Pesados,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_194,127100,Otros Activos Depreciables,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_195,127200,Deprec. Acumulada Otros Activos Depreciables,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_197,128100,Mejoras en Propiedad Arrendada,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_198,128200,Amortización Mejoras en Propiedad Arrendada,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_200,129100,Terreno en Proceso de Capitalización,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_201,129200,Edificio en Proceso de Capitalización,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_203,129400,Equipos de Cómputos y Telecom. en Proceso de Instalación,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_204,129500,Equipos de Transporte en Proceso de Liquidación,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_205,129700,Otros Activos Depreciables en Proceso de Instalación,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_38,131000,Mejoras Propiedad Arrendadas,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_39,132000,Gastos de Organizacion,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_40,133000,Gastos Legales,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_42,141000,Acciones,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_43,142000,bonos,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_44,143000,Bienes Muebles e Inmuebles,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_46,151000,Fianzas,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_47,152000,Depositos,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_48,153000,Codetel,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_49,154000,CDEEE,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_50,155000,CAASD,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_51,156000,Telecable Nacional,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_719,157000,Obras de Arte,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_53,161000,ITBIS Pagado en compras,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_54,162000,Anticipos ISR,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_55,163000,ITBIS retenido cobros con tarjetas,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_56,164000,ITBIS Pagado en importaciones,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_57,165000,ITBIS por servicios deducibles,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_70,201050,Retencion Empleados SFS,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_61,211010,Suplidores,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_62,211020,Proveedores,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_63,211030,Instituciones Estatales,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_64,211040,Prestamos por Pagar,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_713,211050,Cheques popular en transito,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_714,211060,Caja Chica por pagar,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_715,211070,Sueldo y Salarios por Pagar,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_717,211080,Otras Cuentas Por Pagar,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_718,211090,Cobros anticipados,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_66,212010,Retención Empleados SVDS,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_67,212020,I.S.R.,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_723,212021,I.S.R. RETENCIONES DE ASALARIADOS,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_68,212030,Infotep,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_69,212040,TSS,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_71,212060,ITBIS,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_163,212061,ITBIS 18% retenido a personas fisicas,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_712,212062,ISR 10% retenido a personas fisicas,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_72,212070,Otras Retenciones,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_720,212080,Otros Impuestos Por Pagar,account.data_account_type_payable,true,l10n_do.default_chart_a
-default_chart_a_account_75,311000,Capital Autorizado,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_76,312000,Acciones no emitidas,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_77,313000,Capital Social,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_79,321000,Reserva Legal,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_80,322000,Reservas para Contingencias,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_82,331000,Ganancias retenidas años anteriores,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_83,332000,Ajustes años anteriores,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_84,333000,Ganancia del periodo,account.data_account_type_equity,false,l10n_do.default_chart_a
-default_chart_a_account_87,411000,Ventas,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_89,421000,Ingresos por Servicios,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_90,422000,Intereses Cobrados,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_91,423000,Donaciones,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_92,424000,Ingresos en Ventas de Activos Fijos,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_93,430000,Devoluciones en Ventas,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_94,440000,Descuentos en Ventas,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_148,450000,Ingresos por diferencia de cambio,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_724,460000,Otros Ingresos,account.data_account_type_revenue,false,l10n_do.default_chart_a
-default_chart_a_account_97,511000,Materiales Directos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_98,512000,Mano de Obra Directa,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_99,513000,Costos Indirectos de Fabricacion,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_101,521000,Compras de mercancias,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_162,522000,Compras de mercancías en US,account.data_account_type_expenses,true,l10n_do.default_chart_a
-default_chart_a_account_102,523000,Devoluciones en compras,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_103,524000,Descuentos en Compras,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_104,525000,Transporte en Compras,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_150,526000,Costo en ventas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_507,611110,Salarios,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_516,611111,Infotep,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_517,611112,Aporte Plan Básico de Salud (SFS),account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_518,611113,Aporte Plan de Pensiones (AFP),account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_519,611114,Aporte Riesgos Laborales (ARL) ,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_520,611115,Seguro Medico y de Vida Privado,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_521,611116,Uniforme,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_522,611117,Dietas y Viáticos a Empleados,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_523,611118,Actividades Sociales Empleados,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_525,611120,Impuesto de Retribuciones Complementarias,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_508,611121,Comisiones Funcionarios y Empleados,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_526,611122,Otros Beneficios Empleados,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_509,611123,Incentivos y Horas Extras,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_510,611124,Bonificación,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_511,611125,Salario de Navidad,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_512,611126,Vacaciones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_513,611127,Preaviso y Cesantía,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_514,611128,Compensación uso de vehículos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_515,611129,Entrenamiento y Capacitación,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_524,611130,Gasto de Retribuciones Complementarias,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_547,611501,Honorarios por Servicios Profesionales Sociedades,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_548,611502,Honorarios por Servicios Profesionales Personas Físicas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_549,611503,Comisiones por Venta a Terceros Personas Físicas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_550,611504,Transporte y Acarreo,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_551,611505,Combustible y Lubricantes Vehículos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_552,611506,Combustible Planta Eléctrica,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_553,611507,Estadía Hoteles,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_554,611508,Gastos por Cuentas Malas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_555,611509,Reparaciones de Edificio,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_556,611510,Reparaciones de Activos Fijos Categoría 2 y 3,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_557,611511,Mantenimiento de Activos Fijos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_558,611512,Promociones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_559,611513,Publicidad,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_560,611514,Viáticos y Representación,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_561,611515,Patrocinio y aportes,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_562,611516,Participación en concursos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_563,611517,Material Gastable y Papelería,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_564,611518,Material de Limpieza,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_565,611519,Atenciones a Clientes,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_566,611520,Gastos de Correo y Envíos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_567,611521,Gastos Legales,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_568,611522,Seguridad Electrónica,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_569,611523,Guardianes y Vigilancia,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_570,611524,Fumigación y Control de Plagas,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_571,611525,Suscripciones y Membresías,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_572,611526,Donaciones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_573,611527,Gastos de Representación,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_574,611528,Pérdida por Obsolescencia de Inventarios,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_575,611529,Pérdida en Venta de Inversiones,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_576,611530,Pérdida en Venta de Activos Fijos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_577,611531,Pérdida en Venta de Terreno,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_578,611532,Pérdida en Venta de Edificio,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_579,611533,Pérdida en Venta de Mobiliario y Equipos de Oficina,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_580,611534,Pérdida en Venta de Maquinarias y Equipos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_581,611535,Pérdida en Venta de Otros Activos Fijos,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_582,611536,Pérdida en Participación Patrimonial en Subsidiarias,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_583,611537,Pérdida en Indemnización de Seguros,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_584,611538,Consulta de Datos e Formación Crediticia,account.data_account_type_expenses,false,l10n_do.default_chart_a
-default_chart_a_account_143,711000,"Beneficio en retiro de Propiedad, Planta y Equipos",account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_144,712000,"Perdida en retiro de Propiedad, Planta y Equipos",account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_145,720000,Resumen de Ganancias y Perdidas,account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_173,11103002,Cheques en caja,account.data_account_type_current_assets,true,l10n_do.default_chart_a
-default_chart_a_account_174,11103003,Diferencia en caja,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_175,11103004,Sobrante en caja,account.data_account_type_current_assets,false,l10n_do.default_chart_a
-default_chart_a_account_176,11103005,Caja en transito,account.data_account_type_current_assets,true,l10n_do.default_chart_a
+do_niif_11010301,11010301,Depósitos a Corto Plazo,account.data_account_type_liquidity,FALSE,do_chart_template
+do_niif_11020100,11020100,Bonos y Acciones Temporales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11020200,11020200,Operaciones en Bolsa,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11020300,11020300,Otros Valores Negociables,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11030101,11030101,Cheques Devueltos por Cobrar,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030102,11030102,Intereses por Cobrar,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030201,11030201,Cuenta por Cobrar a Clientes,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030202,11030202,Cuenta por Cobrar a Funcionarios y Empleados,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030203,11030203,Cuenta por Cobrar a Afiliadas,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030204,11030204,Cuenta por Cobrar a Accionistas,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11030205,11030205,Otras Cuentas por Cobrar,account.data_account_type_receivable,TRUE,do_chart_template
+do_niif_11040100,11040100,Provisión Incobrables a Clientes,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11040200,11040200,Provisión Incobrables a Funcionarios y Empleados,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11040300,11040300,Provisión Incobrables a Afiliadas,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11040400,11040400,Provisión Incobrables a Accionistas,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11040500,11040500,Provisión Otras Cuentas Incobrables,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11050100,11050100,Inventario de Mercancías o Productos Terminados,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11050200,11050200,Inventario de Materia Prima,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11050300,11050300,Inventario en Tránsito,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11050400,11050400,Materiales y Suministros en Inventario,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11050500,11050500,Combustibles en Inventario,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11060100,11060100,Deterioro Acum. de Inventario en Almacen,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11060200,11060200,Deterioro Acum. de Materiales y Suministros,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11060300,11060300,Deterioro Acum. de Combustibles,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11070100,11070100,Obsolescencia Inventario en Almacen,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11070200,11070200,Obsolescencia Materiales y Suministros,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11070300,11070300,Obsolescencia Combustibles,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080101,11080101,ITBIS Pagado en Compras Locales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080102,11080102,ITBIS Pagado en Servicios Locales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080103,11080103,ITBIS Pagado por Importaciones,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080301,11080301,ITBIS Pagado en Ventas con Tarjeta de Crédito (Norma 08-04),account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080302,11080302,Saldo a Favor ITBIS,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11080303,11080303,Saldo a Favor ISR,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11090100,11090100,Acciones Temporales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11090200,11090200,Depósitos a Plazo Temporales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11090300,11090300,Bonos Temporales,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_11100100,11100100,Gastos Pagados por Anticipado,account.data_account_type_prepayments,FALSE,do_chart_template
+do_niif_11100200,11100200,Renta Pagada por Anticipado,account.data_account_type_prepayments,FALSE,do_chart_template
+do_niif_11100300,11100300,Seguros Pagados por Anticipado,account.data_account_type_prepayments,FALSE,do_chart_template
+do_niif_11100400,11100400,Anticipos ISR,account.data_account_type_prepayments,FALSE,do_chart_template
+do_niif_11100500,11100500,Anticipos Gastos,account.data_account_type_prepayments,FALSE,do_chart_template
+do_niif_12010101,12010101,Terrenos,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010102,12010102,Edificaciones,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010201,12010201,Equipo de Transporte,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010202,12010202,Mobiliario y Equipos,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010301,12010301,Maquinaria,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010302,12010302,Herramientas,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010303,12010303,Instalaciones,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12010304,12010304,Misceláneos u otros activos,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12020100,12020100,Depreciación Acum. de Edificios,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12020200,12020200,Depreciación Acum. de Equipo de Transporte,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12020300,12020300,Depreciación Acum. de Mobiliario y Equipos,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12020400,12020400,Depreciación Acum. de Maquinaria,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12020500,12020500,Depreciación Acum. de Herramientas,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12020600,12020600,Depreciación Acum. de Instalaciones,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12040100,12040100,Marcas y Patentes,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12040200,12040200,Programas Informáticos,account.data_account_type_fixed_assets,FALSE,do_chart_template
+do_niif_12050100,12050100,Edificios y Locales Arrendados,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_12050200,12050200,Maquinaria y Equipo Arrendados,account.data_account_type_current_assets,FALSE,do_chart_template
+do_niif_12050300,12050300,Instalaciones Arrendadas,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12060100,12060100,Depreciación Acum. Edificios y Locales,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12060200,12060200,Depreciación Acum. Maquinaria y Equipo,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12060300,12060300,Depreciación Acum. Instalaciones,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12070100,12070100,Deterioro Valor Acum. Edificios y Locales,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12070200,12070200,Deterioro Valor Acum. Maquinaria y Equipo,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12070300,12070300,Deterioro Valor Acum. Instalaciones,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12080100,12080100,Acciones en otras sociedades,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12090100,12090100,Diferencias temporales deducibles,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12090200,12090200,Gastos Organizacionales Diferidos,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_12090300,12090300,ISR Deducible,account.data_account_type_non_current_assets,FALSE,do_chart_template
+do_niif_21010100,21010100,Préstamos Bancarios por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21010200,21010200,Cuenta por Pagar Proveedores Locales,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21010300,21010300,Cuenta por Pagar Proveedores del Exterior,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21010400,21010400,Nóminas por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21010500,21010500,Intereses por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21010600,21010600,Otras Cuentas por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21020100,21020100,Dividendos por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21020200,21020200,Comisiones por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21020300,21020300,Bonificaciones por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21020400,21020400,Regalía Pascual por Pagar,account.data_account_type_payable,TRUE,do_chart_template
+do_niif_21030101,21030101,ITBIS por Venta Servicios,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030102,21030102,ITBIS por Venta Bienes,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030103,21030103,ITBIS por Venta Bienes - al Exterior,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030201,21030201,ITBIS Retenido Persona Jurídica (N 02-05),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030202,21030202,ITBIS Retenido Persona Física (R 293-11),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030203,21030203,ITBIS Retenido a Entidades No Lucrativas (N 01-2011),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030204,21030204,ITBIS Retenido por Servicios Profesionales Liberales (N 02-05),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030205,21030205,ITBIS Retenido a Proveedores Informales de Bienes (N 08-10),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030301,21030301,ISR Retenido por Honorarios Profesionales de Personas Físicas,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030302,21030302,ISR Retenido por Alquileres Pagados a Personas Físicas,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030303,21030303,ISR Retenido por Dividendos Pagados,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030304,21030304,ISR Retenido por Intereses Pagados al Exterior,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030305,21030305,ISR Retenido por Intereses Pagados,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030306,21030306,ISR Retenido por Transferencias de Títulos y Propiedades,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030307,21030307,ISR Retenido por Remesas al Exterior (Ley 253-12),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030308,21030308,Otras Retenciones (N 07-07),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030309,21030309,Otras Retenciones,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030401,21030401,Retención de Seguro Familiar de Salud (SFS),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030402,21030402,"Seguro de vejez, Discapacidad y Sobre Vivencia (AFP)",account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030404,21030404,Impuesto al Salario (ISR),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030501,21030501,ISR por Pagar,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030502,21030502,Anticipos ISR por Pagar,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030503,21030503,Seguro de Riesgo Laboral (SRL),account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030504,21030504,INFOTEP,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21030505,21030505,Otros Impuestos por Pagar,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21040100,21040100,Provisión Pago Alquileres,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21040200,21040200,Provisión Arrendamiento Financiero,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21040300,21040300,Provisión Gastos Fijos,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21050100,21050100,Tarjeta de Crédito Empresarial,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_21050200,21050200,Prima de Tarjetas de Crédito,account.data_account_type_current_liabilities,FALSE,do_chart_template
+do_niif_22010100,22010100,Préstamos Bancarios Largo Plazo,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22010200,22010200,Préstamos Hipotecarios LP,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22012300,22012300,Otros Préstamos LP,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22020100,22020100,Provisión Beneficios de Empleados LP,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22020200,22020200,Provisión Prestaciones Laborales,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22020300,22020300,Provisión Indemnizaciones,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22030100,22030100,Anticipos de Clientes,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22030200,22030200,Garantías de Clientes,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_22040100,22040100,Provisión Arrendamiento Financiero LP,account.data_account_type_non_current_liabilities,FALSE,do_chart_template
+do_niif_31010100,31010100,Capital Social Autorizado,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31010200,31010200,Capital Social en Acciones no Emitidas,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31010300,31010300,Capital Social Pagado,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31010400,31010400,Capital Social No Pagado,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31010500,31010500,Acciones o Participaciones en Tesorería,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31020100,31020100,Superávit por Revaluación de Terrenos,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31020200,31020200,Superávit por Revaluación de Edificaciones,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31020300,31020300,Superávit por Revaluación de Instalaciones,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_31020400,31020400,Superávit por Revaluación de Mobiliario y Equipo,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_32010100,32010100,Reserva Legal,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33010100,33010100,Utilidades de Ejercicios Anteriores,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33010200,33010200,Pérdidas de Ejercicios Anteriores,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33020100,33020100,Utilidad del Ejercicio,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33020200,33020200,Pérdidas del Ejercicio,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33040100,33040100,Superávit en Reserva,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_33040200,33040200,Déficit en Reserva,account.data_account_type_equity,FALSE,do_chart_template
+do_niif_41010100,41010100,Ventas Bienes,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41010200,41010200,Ventas Bienes - Al Exterior,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41020100,41020100,Ventas Servicios,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41020200,41020200,Ventas Servicios - Al Exterior,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41030100,41030100,Devoluciones de Bienes,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41030200,41030200,Devoluciones por Servicios,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_41040100,41040100,Descuentos por Ventas (por NC),account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42010100,42010100,Intereses sobre Certificados,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42010200,42010200,Intereses en Cuentas Bancarias,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42010300,42010300,Intereses por Financiamientos,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42020100,42020100,Ingresos por Ventas de Activos,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42030100,42030100,Ingresos por Dividendos Ganados,account.data_account_type_revenue,FALSE,do_chart_template
+do_niif_42040100,42040100,Ingresos por Diferencia Cambiaria,account.data_account_type_other_income,FALSE,do_chart_template
+do_niif_42040200,42040200,Cobro de Cuentas Incobrables,account.data_account_type_other_income,FALSE,do_chart_template
+do_niif_42040300,42040300,Otros Ingresos,account.data_account_type_other_income,FALSE,do_chart_template
+do_niif_51010100,51010100,Costos de Bienes,account.data_account_type_direct_costs,FALSE,do_chart_template
+do_niif_51010200,51010200,Otros Costos de Venta,account.data_account_type_direct_costs,FALSE,do_chart_template
+do_niif_51020100,51020100,Materia Prima,account.data_account_type_direct_costs,FALSE,do_chart_template
+do_niif_51020200,51020200,Mano de Obra,account.data_account_type_direct_costs,FALSE,do_chart_template
+do_niif_51020300,51020300,Costos Indirectos,account.data_account_type_direct_costs,FALSE,do_chart_template
+do_niif_52010100,52010100,Sueldos y Salarios,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010200,52010200,Regalía Pascual,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010300,52010300,Retribuciones Complementarias,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010400,52010400,Bono Vacacional,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010500,52010500,Bono por Desempeño,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010600,52010600,Comisiones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010700,52010700,Indemnizaciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010800,52010800,Bonificaciones y Gratificaciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010900,52010900,Dietas al Personal,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52011000,52011000,Cursos y Entrenamientos,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52011100,52011100,Prestaciones Laborales (Preaviso y Cesantia),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52011200,52011200,Incentivos,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52011300,52011300,Horas Extras,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52011400,52011400,Otros Gastos de Personal,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010102,52010102,Aportes a la Administradora de Fondos de Pensiones (AFP),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010103,52010103,Aportes al Seguro Riesgo Laboral (SRL),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010104,52010104,Seguro Familiar de Salud (SFS),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010201,52010201,Aportes a la Administradora de Riesgos de Salud (ARS),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010202,52010202,Seguros al Personal,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010203,52010203,Planes Complementarios de Salud,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010204,52010204,Seguros de Vida,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52010205,52010205,Aportes al Infotep,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020100,52020100,Energía Eléctrica,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020200,52020200,Comunicaciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020300,52020300,Papelería y útiles,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020400,52020400,Útiles de Aseo y Limpieza,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020500,52020500,Material de Empaque,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020600,52020600,Seguro de Edificio,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020700,52020700,Combustibles y Lubricantes,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020800,52020800,Alquileres,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52020900,52020900,Franquicias,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021000,52021000,Inducción a Vendedores,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021100,52021100,Seguros,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021200,52021200,Servicios de Mensajería,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021300,52021300,Flete y Carga,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021400,52021400,Cuotas y Suscripciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52021500,52021500,Otros Gastos de Administración,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030101,52030101,Legales (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030102,52030102,Contabilidad y Auditoría (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030103,52030103,Tecnología (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030104,52030104,Mantenimiento de Planta (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030105,52030105,Mantenimiento del Local (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030106,52030106,Mantenimiento Mobiliario y Equipos (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030107,52030107,Asesorías (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030108,52030108,Fumigaciones (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030109,52030109,Copias y Escaneos (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030110,52030110,Servicios de Vigilancia (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030111,52030111,Otros Servicios Profesionales (P. Física),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030201,52030201,Legales (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030202,52030202,Contabilidad y Auditoría (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030203,52030203,Tecnología (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030204,52030204,Mantenimiento de Planta (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030205,52030205,Mantenimiento del Local (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030206,52030206,Mantenimiento Mobiliario y Equipos (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030207,52030207,Asesorías (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030208,52030208,Fumigaciones (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030209,52030209,Copias y Escaneos (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030210,52030210,Servicios de Vigilancia (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030211,52030211,Otros Servicios Profesionales (P. Jurídica),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030301,52030301,Honorarios por Servicios del Exterior - Relacionadas,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52030302,52030302,Honorarios por Servicios del Exterior - Terceros,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52040100,52040100,Gastos por Depreciación de Edificios,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52040200,52040200,Gastos por Depreciación de Equipo de Transporte,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52040300,52040300,Gastos por Depreciación de Mobiliario y Equipos,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52040400,52040400,Gastos por Depreciación de Maquinaria,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52040500,52040500,Gastos por Depreciación de Herramientas,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52040600,52040600,Gastos por Depreciación de Instalaciones,account.data_account_type_depreciation,FALSE,do_chart_template
+do_niif_52050100,52050100,Gastos por Reparación de Edificios,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52050200,52050200,Gastos por Reparación de Equipo de Transporte,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52050300,52050300,Gastos por Reparación de Mobiliario y Equipos,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52050400,52050400,Gastos por Reparación de Maquinaria,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52050500,52050500,Gastos por Reparación de Herramientas,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52050600,52050600,Gastos por Reparación de Instalaciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060100,52060100,Relaciones Públicas,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060200,52060200,Publicidad,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060300,52060300,Viajes,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060400,52060400,Donaciones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060500,52060500,Donaciones a ProIndustria (Ley 392-07),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060600,52060600,Promociones,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52060700,52060700,Otros Gastos de Representación,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070100,52070100,Gastos por Préstamos Bancarios,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070200,52070200,Retención por Cheques y Transacciones Electrónicas (0.015%),account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070300,52070300,Intereses Bancarios,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070400,52070400,Comisiones Bancarias,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070500,52070500,Comisión de Tarjeta de Crédito,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070600,52070600,Nota de Cargos por Banco,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070700,52070700,Seguro sobre Préstamos Bancarios,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070800,52070800,Diferencia Negativa Cambiaria,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52070900,52070900,Otro Gastos Financieros,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080100,52080100,Gastos por Siniestros,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080200,52080200,Pérdidas por Ventas de Activos Fijos,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080300,52080300,Pérdidas por Cuentas Incobrables,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080400,52080400,Gastos por ISR,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080500,52080500,Impuestos a los Activos,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080600,52080600,Penalidades/Recargos de DGII,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080700,52080700,Penalidades/Recargos de TSS,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_52080800,52080800,Gastos Sin Comprobante,account.data_account_type_expenses,FALSE,do_chart_template
+do_niif_61010100,61010100,Pérdidas y Ganancias,account.data_unaffected_earnings,FALSE,do_chart_template
diff --git a/addons/l10n_do/data/account.account.type.csv b/addons/l10n_do/data/account.account.type.csv
deleted file mode 100644
index ecc5c031e9e..00000000000
--- a/addons/l10n_do/data/account.account.type.csv
+++ /dev/null
@@ -1,17 +0,0 @@
-id,name,report_type
-default_chart_a_type_1,Root/View,none
-default_chart_a_type_2,Receivable,asset
-default_chart_a_type_3,Payable,liability
-default_chart_a_type_4,Bank,asset
-default_chart_a_type_5,Cash,asset
-default_chart_a_type_6,Asset,asset
-default_chart_a_type_7,Liability,liability
-default_chart_a_type_8,Income,income
-default_chart_a_type_9,Expense,expense
-default_chart_a_type_10,Income View,income
-default_chart_a_type_11,Expense View,expense
-default_chart_a_type_12,Asset View,asset
-default_chart_a_type_13,Liability View,liability
-default_chart_a_type_14,Tax,expense
-default_chart_a_type_15,Equity,liability
-default_chart_a_type_16,Check,asset
diff --git a/addons/l10n_do/data/account.fiscal.position.tax.template.csv b/addons/l10n_do/data/account.fiscal.position.tax.template.csv
deleted file mode 100644
index 8d0f2b6590d..00000000000
--- a/addons/l10n_do/data/account.fiscal.position.tax.template.csv
+++ /dev/null
@@ -1,4 +0,0 @@
-id,position_id:id,tax_src_id:id,tax_dest_id:id
-default_chart_a_position_tax_1,default_chart_a_position_4,default_chart_a_tax_14,default_chart_a_tax_7
-default_chart_a_position_tax_2,default_chart_a_position_17,default_chart_a_tax_8,default_chart_a_tax_15
-default_chart_a_position_tax_3,default_chart_a_position_13,default_chart_a_tax_15,
diff --git a/addons/l10n_do/data/account.fiscal.position.template.csv b/addons/l10n_do/data/account.fiscal.position.template.csv
deleted file mode 100644
index 926f8f2f915..00000000000
--- a/addons/l10n_do/data/account.fiscal.position.template.csv
+++ /dev/null
@@ -1,18 +0,0 @@
-id,name,chart_template_id:id
-default_chart_a_position_1,"Para Crédito Fiscal",default_chart_a,
-default_chart_a_position_2,"Cosumidor Final",default_chart_a,
-default_chart_a_position_3,Gubernamental,default_chart_a,
-default_chart_a_position_4,"Regímenes Especiales",default_chart_a,
-default_chart_a_position_5,"Gastos de personal",default_chart_a,
-default_chart_a_position_6,"Gastos por trabajo, suministros y servicios",default_chart_a,
-default_chart_a_position_7,Arrendamientos,default_chart_a,
-default_chart_a_position_8,"Gastos de Activos Fijos",default_chart_a,
-default_chart_a_position_9,"Gastos de Representación",default_chart_a,
-default_chart_a_position_10,"Otras Deducciones Admitidas",default_chart_a,
-default_chart_a_position_11,"Gastos Financieros",default_chart_a,
-default_chart_a_position_12,"Gastos Extraordinarios",default_chart_a,
-default_chart_a_position_13,"Proveedores de mercancía impuesto no incluido",default_chart_a,
-default_chart_a_position_14,"Adquisiciones de Activos",default_chart_a,
-default_chart_a_position_15,"Gastos Menores",default_chart_a,
-default_chart_a_position_16,"Gastos de Seguro",default_chart_a,
-default_chart_a_position_17,"Proveedores de mercancía impuesto incluido",default_chart_a,
diff --git a/addons/l10n_do/data/account.tax.template.csv b/addons/l10n_do/data/account.tax.template.csv
deleted file mode 100644
index cd144c6b56c..00000000000
--- a/addons/l10n_do/data/account.tax.template.csv
+++ /dev/null
@@ -1,19 +0,0 @@
-id,name,description,type_tax_use,amount_type,amount,sequence,refund_account_id:id,account_id:id,chart_template_id:id,tag_ids:id
-default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_ISR_10
-default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,tag_C_EXENTA
-default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_8
-default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_8
-default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_11
-default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_11
-default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tag_V_EXENTA
-default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18
-default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tag_CS_ITBIS_18
-default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tag_IMP_ITBIS_18
-default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,tag_R_ISR_2
-default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tag_R_ITBIS_18
-default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tag_V_ITBIS_18
-default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18_Incluido
-default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tag_CS_ITBIS_18_Incluido
-default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,tag_TELE_ISC
-default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,tag_TELE_CDT
-default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_Alquileres_10
diff --git a/addons/l10n_do/data/account.tax.template.xml b/addons/l10n_do/data/account.tax.template.xml
new file mode 100644
index 00000000000..166bb85294b
--- /dev/null
+++ b/addons/l10n_do/data/account.tax.template.xml
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data noupdate="1">
+ <!-- Chart template for Taxes -->
+ <!-- Taxes Groups -->
+ <record id="group_itbis" model="account.tax.group">
+ <field name="name">ITBIS</field>
+ </record>
+ <record id="group_ret" model="account.tax.group">
+ <field name="name">Retenciones</field>
+ </record>
+ <record id="group_tax" model="account.tax.group">
+ <field name="name">Otros Impuestos</field>
+ </record>
+ <!-- Taxes Template -->
+ <record id="tax_0_sale" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">50</field>
+ <field name="name">Exento ITBIS Ventas</field>
+ <field name="description">Exento</field>
+ <field name="amount">0</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">sale</field>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_V_EXENTA')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_0_purch" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">50</field>
+ <field name="name">Exento ITBIS Compras</field>
+ <field name="description">Exento</field>
+ <field name="amount">0</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_C_EXENTA')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_sale" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">1</field>
+ <field name="name">18% ITBIS Ventas</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">sale</field>
+ <field name="account_id" ref="do_niif_21030102"/>
+ <field name="refund_account_id" ref="do_niif_21030102"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_V_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_sale_incl" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">10</field>
+ <field name="name">18% ITBIS Incl. Ventas</field>
+ <field name="description">18% Incl</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">sale</field>
+ <field name="account_id" ref="do_niif_21030102"/>
+ <field name="refund_account_id" ref="do_niif_21030102"/>
+ <field eval="1" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_V_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_purch" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">18% ITBIS Compras</field>
+ <field name="sequence">2</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080101"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_C_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_purch_incl" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">20</field>
+ <field name="name">18% ITBIS Incl. Compras</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080101"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="1" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_C_ITBIS_18_Incluido')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_purch_serv" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">20</field>
+ <field name="name">18% ITBIS Compras - Servicios</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080102"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_C_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_purch_serv_incl" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">20</field>
+ <field name="name">18% ITBIS Incl. Compras - Servicios</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080102"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="1" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_C_ITBIS_18_Incluido')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_importation" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">20</field>
+ <field name="name">18% ITBIS - Importaciones</field>
+ <field name="description">18%</field>
+ <field name="amount">18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080103"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_IMP_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_18_of_10" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">20</field>
+ <field name="name">18% ITBIS sobre el 10% del Monto Total</field>
+ <field name="description">18% del 10%</field>
+ <field name="amount">1.8</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_11080101"/>
+ <field name="refund_account_id" ref="do_niif_11080302"/>
+ <field eval="0" name="price_include"/>
+ </record>
+ <record id="tax_0015_bank" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">30</field>
+ <field name="name">Impuesto 0.15% Transferencia Bancaria</field>
+ <field name="description">0.15%</field>
+ <field name="amount">0.0015</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_52070200"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="1" name="price_include"/>
+ </record>
+ <record id="tax_10_telco" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">30</field>
+ <field name="name">Impuesto 10% Telecomunicaciones (ISC)</field>
+ <field name="description">ISC</field>
+ <field name="amount">10</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_52020200"/>
+ <field name="refund_account_id" ref="do_niif_52020200"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_TELE_ISC')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_2_telco" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">30</field>
+ <field name="name">Impuesto 2% Telecomunicaciones (CDT)</field>
+ <field name="description">CDT</field>
+ <field name="amount">2</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_52020200"/>
+ <field name="refund_account_id" ref="do_niif_52020200"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_TELE_CDT')])]" name="tag_ids"/>
+ </record>
+ <record id="tax_group_telco" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">30</field>
+ <field name="name">Impuestos a las Telecomunicaciones</field>
+ <field eval="0" name="amount"/>
+ <field name="amount_type">group</field>
+ <field name="type_tax_use">purchase</field>
+ <field eval="[(6, 0, [ref('tax_10_telco'), ref('tax_2_telco')])]" name="children_tax_ids"/>
+ </record>
+ <record id="ret_100_tax_nonprofit" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ITBIS 100% a No Lucrativas (Servicios)</field>
+ <field name="description">100% del ITBIS</field>
+ <field name="amount">-18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030203"/>
+ <field name="refund_account_id" ref="do_niif_21030203"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_100_tax_person" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ITBIS 100% a Persona Física</field>
+ <field name="description">100% del ITBIS</field>
+ <field name="amount">-18</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030202"/>
+ <field name="refund_account_id" ref="do_niif_21030202"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ITBIS_18')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_30_tax_moral" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ITBIS 30% a Persona Jurídica (Construcción)</field>
+ <field name="description">30% del ITBIS</field>
+ <field name="amount">-5.4</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030201"/>
+ <field name="refund_account_id" ref="do_niif_21030201"/>
+ <field eval="0" name="price_include"/>
+ </record>
+ <record id="ret_30_tax_freelance" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ITBIS 30% a Profesionales Liberales (Servicios)</field>
+ <field name="description">30% del ITBIS</field>
+ <field name="amount">-5.4</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030204"/>
+ <field name="refund_account_id" ref="do_niif_21030204"/>
+ <field eval="0" name="price_include"/>
+ </record>
+ <record id="ret_75_tax_nonformal" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ITBIS 75% a Proveedores Informales (Bienes)</field>
+ <field name="description">75% del ITBIS</field>
+ <field name="amount">-13.5</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030205"/>
+ <field name="refund_account_id" ref="do_niif_21030205"/>
+ <field eval="0" name="price_include"/>
+ </record>
+ <record id="ret_10_income_person" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 10% Honorarios a Persona Física (Servicios)</field>
+ <field name="description">10% ISR</field>
+ <field name="amount">-10</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030301"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ISR_10')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_10_income_rent" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 10% a Persona Física (Alquiler)</field>
+ <field name="description">10% ISR</field>
+ <field name="amount">-10</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030302"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ISR_10')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_10_income_dividend" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 10% por Dividendos</field>
+ <field name="description">10% ISR</field>
+ <field name="amount">-10</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030303"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ISR_10')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_2_income_person" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 2% a Persona Física (Servicios)</field>
+ <field name="description">2% ISR (N 07-07)</field>
+ <field name="amount">-2</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030308"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ISR_2')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_2_income_transfer" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 2% por Transferencia de Títulos</field>
+ <field name="description">2% ISR</field>
+ <field name="amount">-2</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030306"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ <field eval="[(6,0,[ref('tag_R_ISR_2')])]" name="tag_ids"/>
+ </record>
+ <record id="ret_27_income_remittance" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">40</field>
+ <field name="name">Retención ISR 27% por Remesas al Exterior</field>
+ <field name="description">27% ISR</field>
+ <field name="amount">-27</field>
+ <field name="amount_type">percent</field>
+ <field name="type_tax_use">purchase</field>
+ <field name="account_id" ref="do_niif_21030307"/>
+ <field name="refund_account_id" ref="do_niif_11080303"/>
+ <field eval="0" name="price_include"/>
+ </record>
+ <record id="tax_group_nonformal" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">60</field>
+ <field name="name">Retención a Proveedores Informales (Bienes)</field>
+ <field name="amount_type">group</field>
+ <field eval="0" name="amount"/>
+ <field name="type_tax_use">purchase</field>
+ <field eval="[(6, 0, [ref('ret_75_tax_nonformal'), ref('tax_18_purch')])]" name="children_tax_ids"/>
+ </record>
+ <record id="tax_group_person_construction" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">60</field>
+ <field name="name">Retención a Persona Física (Servicios Construcción con Materiales)</field>
+ <field name="amount_type">group</field>
+ <field eval="0" name="amount"/>
+ <field name="type_tax_use">purchase</field>
+ <field eval="[(6, 0, [ref('tax_18_of_10'), ref('ret_2_income_person'), ref('ret_100_tax_person')])]" name="children_tax_ids"/>
+ </record>
+ <record id="tax_group_moral_construction" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">60</field>
+ <field name="name">Retención a Jurídica (Servicios Construcción con Materiales)</field>
+ <field name="amount_type">group</field>
+ <field eval="0" name="amount"/>
+ <field name="type_tax_use">purchase</field>
+ <field eval="[(6, 0, [ref('ret_30_tax_moral'), ref('tax_18_of_10')])]" name="children_tax_ids"/>
+ </record>
+ <record id="tax_group_person_services" model="account.tax.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="sequence">60</field>
+ <field name="name">Retención a Persona Física por Servicios Profesionales</field>
+ <field name="amount_type">group</field>
+ <field eval="0" name="amount"/>
+ <field name="type_tax_use">purchase</field>
+ <field eval="[(6, 0, [ref('ret_2_income_person'), ref('ret_100_tax_person')])]" name="children_tax_ids"/>
+ </record>
+ </data>
+</odoo>
diff --git a/addons/l10n_do/data/account_chart_template_data.xml b/addons/l10n_do/data/account_chart_template_data.xml
index 3cfff934abb..0123c1d897b 100644
--- a/addons/l10n_do/data/account_chart_template_data.xml
+++ b/addons/l10n_do/data/account_chart_template_data.xml
@@ -1,11 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
- <record id="default_chart_a" model="account.chart.template">
- <field name="property_account_receivable_id" ref="default_chart_a_account_13"/>
- <field name="property_account_payable_id" ref="default_chart_a_account_61"/>
- <field name="property_account_expense_categ_id" ref="default_chart_a_account_101"/>
- <field name="property_account_income_categ_id" ref="default_chart_a_account_87"/>
- <field name="income_currency_exchange_account_id" ref="default_chart_a_account_148"/>
- <field name="expense_currency_exchange_account_id" ref="default_chart_a_account_596"/>
- </record>
+ <!-- Chart Template for Defaults -->
+ <record id="do_chart_template" model="account.chart.template">
+ <field name="property_account_receivable_id" ref="do_niif_11030201"/>
+ <field name="property_account_payable_id" ref="do_niif_21010200"/>
+ <field name="property_account_expense_categ_id" ref="do_niif_52021500"/>
+ <field name="property_account_income_categ_id" ref="do_niif_41010100"/>
+ <field eval="False" name="use_anglo_saxon"/>
+ <field name="property_stock_account_input_categ_id" ref="do_niif_11050300"/>
+ <field name="property_stock_account_output_categ_id" ref="do_niif_11050300"/>
+ <field name="property_stock_valuation_account_id" ref="do_niif_11060100"/>
+ <field name="expense_currency_exchange_account_id" ref="do_niif_52070800"/>
+ <field name="income_currency_exchange_account_id" ref="do_niif_42040100"/>
+ </record>
</odoo>
diff --git a/addons/l10n_do/data/account_chart_template_data.yml b/addons/l10n_do/data/account_chart_template_data.yml
index bbae47a8ee6..bfea5da2ff5 100644
--- a/addons/l10n_do/data/account_chart_template_data.yml
+++ b/addons/l10n_do/data/account_chart_template_data.yml
@@ -1,3 +1,3 @@
-
- !python {model: account.chart.template, id: default_chart_a}: |
+ !python {model: account.chart.template, id: do_chart_template}: |
self[0].try_loading_for_current_company()
diff --git a/addons/l10n_do/data/fiscal_position_template.xml b/addons/l10n_do/data/fiscal_position_template.xml
new file mode 100644
index 00000000000..7179966d999
--- /dev/null
+++ b/addons/l10n_do/data/fiscal_position_template.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data noupdate="1">
+ <!-- = = = = = = = = = = = = = = = -->
+ <!-- Fiscal Position Templates -->
+ <!-- = = = = = = = = = = = = = = = -->
+ <!-- Principal Fiscal Position for Dominican Republic internally -->
+ <record id="position_buyer_final" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Consumidor Final</field>
+ </record>
+ <record id="position_buyer_moral" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Crédito Fiscal</field>
+ </record>
+ <record id="position_provider_moral" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Proveedor Fiscal</field>
+ </record>
+ <record id="position_construction_moral" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Proveedor Fiscal (Construcción)</field>
+ </record>
+ <record id="position_construction_person" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Persona Física (Construcción)</field>
+ </record>
+ <record id="position_person" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Persona Física</field>
+ </record>
+ <record id="position_nonformal" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Proveedor Informal (Bienes)</field>
+ </record>
+ <record id="position_exterior" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Proveedor del Exterior</field>
+ </record>
+ <record id="position_expenses" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Gastos Menores</field>
+ </record>
+ <record id="position_gov" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Gubernamental</field>
+ </record>
+ <record id="position_nonprofit" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">No lucrativas</field>
+ </record>
+ <record id="position_especial" model="account.fiscal.position.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ <field name="name">Regímenes Especiales</field>
+ </record>
+ <!-- = = = = = = = = = = = = = = = -->
+ <!-- Fiscal Position Tax Templates -->
+ <!-- = = = = = = = = = = = = = = = -->
+ <!-- Locales -->
+ <!-- Proveedor Informal Bienes -->
+ <record id="fiscal_position_tax_3" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_nonformal"/>
+ <field name="tax_dest_id" ref="tax_group_nonformal"/>
+ </record>
+ <record id="fiscal_position_tax_4" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch_incl"/>
+ <field name="position_id" ref="position_nonformal"/>
+ <field name="tax_dest_id" ref="tax_group_nonformal"/>
+ </record>
+ <!-- Persona Física>-->
+ <record id="fiscal_position_tax_9" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_person"/>
+ <field name="tax_dest_id" ref="tax_group_person_services"/>
+ </record>
+ <record id="fiscal_position_tax_10" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch_serv"/>
+ <field name="position_id" ref="position_person"/>
+ <field name="tax_dest_id" ref="tax_group_person_services"/>
+ </record>
+ <!-- Gubernamental -->
+ <record id="fiscal_position_tax_1" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_sale"/>
+ <field name="position_id" ref="position_gov"/>
+ <field name="tax_dest_id" ref="tax_0_sale"/>
+ </record>
+ <record id="fiscal_position_tax_2" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_gov"/>
+ <field name="tax_dest_id" ref="tax_0_purch"/>
+ </record>
+ <!-- No Lucrativas -->
+ <record id="fiscal_position_tax_12" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_nonprofit"/>
+ <field name="tax_dest_id" ref="tax_0_purch"/>
+ </record>
+ <record id="fiscal_position_tax_13" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch_serv"/>
+ <field name="position_id" ref="position_nonprofit"/>
+ <field name="tax_dest_id" ref="ret_100_tax_nonprofit"/>
+ </record>
+ <!-- Proveedor Moral Construcción -->
+ <record id="fiscal_position_tax_8" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_construction_moral"/>
+ <field name="tax_dest_id" ref="tax_group_moral_construction"/>
+ </record>
+ <!-- Persona Física Construcción -->
+ <record id="fiscal_position_tax_7" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_construction_person"/>
+ <field name="tax_dest_id" ref="tax_group_person_construction"/>
+ </record>
+ <!-- Importación / Exportación -->
+ <!-- Proveedo del Exterior -->
+ <record id="fiscal_position_tax_5" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch_serv"/>
+ <field name="position_id" ref="position_exterior"/>
+ <field name="tax_dest_id" ref="ret_27_income_remittance"/>
+ </record>
+ <record id="fiscal_position_tax_6" model="account.fiscal.position.tax.template">
+ <field name="tax_src_id" ref="tax_18_purch"/>
+ <field name="position_id" ref="position_exterior"/>
+ <field name="tax_dest_id" ref="tax_0_purch"/>
+ </record>
+ <!-- = = = = = = = = = = = = = = = = = -->
+ <!-- Fiscal Position Accounts Template -->
+ <!-- = = = = = = = = = = = = = = = = = -->
+ <!-- Locales -->
+ <!-- Persona Física de Servicios -->
+ <record id="fiscal_position_account_2" model="account.fiscal.position.account.template">
+ <field name="position_id" ref="position_person"/>
+ <field name="account_dest_id" ref="do_niif_52030111"/>
+ <field name="account_src_id" ref="do_niif_52021500"/>
+ </record>
+ <!-- Importación / Exportación -->
+ <!-- Proveedor del Exterior -->
+ <record id="fiscal_position_account_1" model="account.fiscal.position.account.template">
+ <field name="position_id" ref="position_exterior"/>
+ <field name="account_dest_id" ref="do_niif_21010300"/>
+ <field name="account_src_id" ref="do_niif_21010200"/>
+ </record>
+ </data>
+</odoo>
diff --git a/addons/l10n_do/data/l10n_do_chart_data.xml b/addons/l10n_do/data/l10n_do_chart_data.xml
index 300fada848a..9075d92a621 100644
--- a/addons/l10n_do/data/l10n_do_chart_data.xml
+++ b/addons/l10n_do/data/l10n_do_chart_data.xml
@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="account_reports_do_statements_menu" name="Dominican Statements" parent="account.menu_finance_reports" sequence="3" groups="account.group_account_user"/>
-
- <record model="account.account.template" id="default_chart_a_account_152">
- <field name="name">Efectivo en transito</field>
- <field name="code">112050</field>
- <field name="reconcile" eval="True"/>
- <field name="user_type_id" ref="account.data_account_type_current_assets"/>
- </record>
-
-
- <record id="default_chart_a" model="account.chart.template">
- <field name="name">Catálogo de Cuentas Empresas Privadas</field>
- <field name="currency_id" ref="base.DOP"/>
- <field name="code_digits" eval="8"/>
- <field name="transfer_account_id" ref="default_chart_a_account_152"/>
- <field name="bank_account_code_prefix">112</field>
- <field name="cash_account_code_prefix">111</field>
- </record>
-
- <record model="account.account.template" id="default_chart_a_account_152">
- <field name="chart_template_id" ref="default_chart_a"/>
- </record>
+ <data noupdate="1">
+ <!-- Chart of Accounts Template -->
+ <record id="cash_transfer_account" model="account.account.template">
+ <field name="name">Transferencias de Efectivo</field>
+ <field name="code">11010100</field>
+ <field eval="True" name="reconcile"/>
+ <field name="user_type_id" ref="account.data_account_type_current_assets"/>
+ </record>
+ <record id="do_chart_template" model="account.chart.template">
+ <field name="name">Catálogo de Cuentas Dominicano (NIIF)</field>
+ <field name="code_digits">8</field>
+ <field name="cash_account_code_prefix">110101</field>
+ <field name="bank_account_code_prefix">110102</field>
+ <field name="transfer_account_id" ref="cash_transfer_account"/>
+ <field name="currency_id" ref="base.DOP"/>
+ <field name="spoken_languages" eval="'es_DO'"/>
+ </record>
+ <record id="cash_transfer_account" model="account.account.template">
+ <field name="chart_template_id" ref="do_chart_template"/>
+ </record>
+ </data>
</odoo>
diff --git a/addons/l10n_do/data/l10n_do_state_data.xml b/addons/l10n_do/data/l10n_do_state_data.xml
index 63c061e8749..322e27b3b4c 100644
--- a/addons/l10n_do/data/l10n_do_state_data.xml
+++ b/addons/l10n_do/data/l10n_do_state_data.xml
@@ -1,173 +1,177 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
+ <data noupdate="1">
<!--
- Resource: res.country.state
- Update states using ISO 3166-2:DO codes
- -->
+ Resource: res.country.state
+ Update states. This one is not using ISO 3166-2:DO codes,
+ as those codes are not used or known in Dominican Republic.
+ The new codes are more friendly and easier to identify by
+ the users.
+ -->
<record id="state_DO_01" model="res.country.state">
- <field name="code">01</field>
+ <field name="code">DN</field>
<field name="name">Distrito Nacional</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_02" model="res.country.state">
- <field name="code">02</field>
+ <field name="code">AZU</field>
<field name="name">Azua</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_03" model="res.country.state">
- <field name="code">03</field>
+ <field name="code">BAH</field>
<field name="name">Bahoruco</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_4" model="res.country.state">
- <field name="code">04</field>
+ <field name="code">BAR</field>
<field name="name">Barahona</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_05" model="res.country.state">
- <field name="code">05</field>
- <field name="name">Dajabon</field>
+ <field name="code">DAJ</field>
+ <field name="name">Dajabón</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_06" model="res.country.state">
- <field name="code">06</field>
+ <field name="code">DUA</field>
<field name="name">Duarte</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_07" model="res.country.state">
- <field name="code">07</field>
- <field name="name">Elias Piña</field>
+ <field name="code">ELP</field>
+ <field name="name">Elías Piña</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_08" model="res.country.state">
- <field name="code">08</field>
- <field name="name">El Seybo</field>
+ <field name="code">ELS</field>
+ <field name="name">El Seibo</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_09" model="res.country.state">
- <field name="code">09</field>
+ <field name="code">ESP</field>
<field name="name">Espaillat</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_10" model="res.country.state">
- <field name="code">10</field>
+ <field name="code">IND</field>
<field name="name">Independencia</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_11" model="res.country.state">
- <field name="code">11</field>
+ <field name="code">LA</field>
<field name="name">La Altagracia</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_12" model="res.country.state">
- <field name="code">12</field>
+ <field name="code">LR</field>
<field name="name">La Romana</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_13" model="res.country.state">
- <field name="code">13</field>
+ <field name="code">LV</field>
<field name="name">La Vega</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_14" model="res.country.state">
- <field name="code">14</field>
- <field name="name">Maria Trinidad Sanchez</field>
+ <field name="code">MTS</field>
+ <field name="name">María Trinidad Sánchez</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_15" model="res.country.state">
- <field name="code">15</field>
+ <field name="code">MC</field>
<field name="name">Monte Cristi</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_16" model="res.country.state">
- <field name="code">16</field>
+ <field name="code">PED</field>
<field name="name">Pedernales</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_17" model="res.country.state">
- <field name="code">17</field>
+ <field name="code">PER</field>
<field name="name">Peravia</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_18" model="res.country.state">
- <field name="code">18</field>
+ <field name="code">PP</field>
<field name="name">Puerto Plata</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_19" model="res.country.state">
- <field name="code">19</field>
+ <field name="code">HEM</field>
<field name="name">Hermanas Mirabal</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_20" model="res.country.state">
- <field name="code">20</field>
- <field name="name">Samana</field>
+ <field name="code">SAM</field>
+ <field name="name">Samaná</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_21" model="res.country.state">
- <field name="code">21</field>
- <field name="name">San Cristobal</field>
+ <field name="code">SC</field>
+ <field name="name">San Cristóbal</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_22" model="res.country.state">
- <field name="code">22</field>
- <field name="name">San Juan de la Maguana</field>
+ <field name="code">SJ</field>
+ <field name="name">San Juan</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_23" model="res.country.state">
- <field name="code">23</field>
- <field name="name">San Pedro de Macoris</field>
+ <field name="code">SPM</field>
+ <field name="name">San Pedro de Macorís</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_24" model="res.country.state">
- <field name="code">24</field>
- <field name="name">Sanchez Ramirez</field>
+ <field name="code">SRA</field>
+ <field name="name">Sánchez Ramírez</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_25" model="res.country.state">
- <field name="code">25</field>
+ <field name="code">STGO</field>
<field name="name">Santiago</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_26" model="res.country.state">
- <field name="code">26</field>
- <field name="name">Santiago Rodriguez</field>
+ <field name="code">SRO</field>
+ <field name="name">Santiago Rodríguez</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_27" model="res.country.state">
- <field name="code">27</field>
+ <field name="code">VAL</field>
<field name="name">Valverde</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_28" model="res.country.state">
- <field name="code">28</field>
+ <field name="code">MON</field>
<field name="name">Monseñor Nouel</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_29" model="res.country.state">
- <field name="code">29</field>
+ <field name="code">MP</field>
<field name="name">Monte Plata</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_30" model="res.country.state">
- <field name="code">30</field>
+ <field name="code">HAM</field>
<field name="name">Hato Mayor</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_31" model="res.country.state">
- <field name="code">31</field>
- <field name="name">San Jose de Ocoa</field>
+ <field name="code">SJO</field>
+ <field name="name">San José de Ocoa</field>
<field name="country_id" ref="base.do"/>
</record>
<record id="state_DO_32" model="res.country.state">
- <field name="code">32</field>
+ <field name="code">SD</field>
<field name="name">Santo Domingo</field>
<field name="country_id" ref="base.do"/>
</record>
<!--
- Resource: res.partner.title
- Update partner titles
- -->
+ Resource: res.partner.title
+ Update partner titles
+ -->
<record id="base.res_partner_title_dra" model="res.partner.title">
<field name="name">Doctora</field>
<field name="shortcut">Dra.</field>
@@ -192,4 +196,5 @@
<field name="name">Ingeniero/a</field>
<field name="shortcut">Ing.</field>
</record>
+ </data>
</odoo>
diff --git a/addons/l10n_do/models/__init__.py b/addons/l10n_do/models/__init__.py
new file mode 100644
index 00000000000..88065f98bba
--- /dev/null
+++ b/addons/l10n_do/models/__init__.py
@@ -0,0 +1,4 @@
+# coding: utf-8
+# Copyright 2016 iterativo (https://www.iterativo.do) <info@iterativo.do>
+
+from . import chart_template
diff --git a/addons/l10n_do/models/chart_template.py b/addons/l10n_do/models/chart_template.py
new file mode 100644
index 00000000000..ddbc17b8f92
--- /dev/null
+++ b/addons/l10n_do/models/chart_template.py
@@ -0,0 +1,18 @@
+# coding: utf-8
+# Copyright 2016 iterativo (https://www.iterativo.do) <info@iterativo.do>
+
+from openerp import models, api, _
+
+
+class WizardMultiChartsAccounts(models.TransientModel):
+ _inherit = 'wizard.multi.charts.accounts'
+
+ @api.model
+ def _get_default_bank_account_ids(self):
+ if self.env.user.company_id.country_id and self.env.user.company_id.country_id.code.upper() == 'DO':
+ return [
+ {'acc_name': _('Cash'), 'account_type': 'cash'},
+ {'acc_name': _('Caja Chica'), 'account_type': 'cash'},
+ {'acc_name': _('Bank'), 'account_type': 'bank'}
+ ]
+ return super(WizardMultiChartsAccounts, self)._get_default_bank_account_ids()
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 822f87dc0a2..de4dda4c8fc 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -590,7 +590,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
var self = this;
var options = this.selected_message ? {} : {channel_id: this.channel.id};
if (this.selected_message) {
- message.subtype = 'mail.mt_comment';
+ message.subtype = this.selected_message.is_note ? 'mail.mt_note': 'mail.mt_comment';
message.subtype_id = false;
message.message_type = 'comment';
message.content_subtype = 'html';
diff --git a/addons/mail/static/src/js/many2many_tags_email.js b/addons/mail/static/src/js/many2many_tags_email.js
index a9fd41a3cd7..4b273b456e1 100644
--- a/addons/mail/static/src/js/many2many_tags_email.js
+++ b/addons/mail/static/src/js/many2many_tags_email.js
@@ -5,6 +5,7 @@ var core = require('web.core');
var form_common = require('web.form_common');
var form_relational = require('web.form_relational');
var Model = require('web.DataModel');
+var utils = require('web.utils');
var _t = core._t;
@@ -16,51 +17,49 @@ var _t = core._t;
var FieldMany2ManyTagsEmail = form_relational.FieldMany2ManyTags.extend({
start: function() {
- this.values = [];
- this.values_checking = [];
+ this.mutex = new utils.Mutex();
- this.on("change:value", this, this.on_change_value_check);
- this.trigger("change:value");
+ // This widget will indirectly trigger a change:value to it's parent widget
+ // when setting the value of valid partners. For this reason we have to keep an
+ // internal state of the last value in order to compute the effective value changes.
+ this.last_processed_value = [];
+ this.on("change:value", this, this.on_change_value_check);
this._super.apply(this, arguments);
},
on_change_value_check : function () {
- this.values = _.uniq(this.values);
-
- // filter for removed values
- var values_removed = _.difference(this.values, this.get('value'));
- if (values_removed.length) {
- this.values = _.difference(this.values, values_removed);
- this.set({'value': this.values});
- return false;
- }
+ var self = this;
+ var values = this.get('value').slice(0); // Clone the array
- // find not checked values that are not currently on checking
- var not_checked = _.difference(this.get('value'), this.values, this.values_checking);
- if (not_checked.length) {
- // remember values on checking for cheked only one time
- this.values_checking = this.values_checking.concat(not_checked);
- // check values
- this._check_email_popup(not_checked);
+ // We only validate partners emails in case the value is not empty
+ // and is different from the last processed value
+ var effective_change = _.difference(values, self.last_processed_value).length;
+ if (values.length && effective_change) {
+ this.mutex.exec(function() {
+ return self._check_email_popup(values);
+ });
}
},
_check_email_popup: function (ids) {
var self = this;
- new Model('res.partner').call("search", [[
- ["id", "in", ids],
- ["email", "=", false],
- ["notify_email", "=", 'always'] ]],
+ var valid_partners;
+
+ return new Model('res.partner').call("search", [[
+ ["id", "in", ids],
+ ["email", "=", false],
+ ["notify_email", "=", 'always'] ]],
{context: this.build_context()})
.then(function (record_ids) {
- // valid partner
- var valid_partner = _.difference(ids, record_ids);
- self.values = self.values.concat(valid_partner);
- self.values_checking = _.difference(self.values_checking, valid_partner);
+ var popups_deferreds = [];
+ self.valid_partners = _.difference(ids, record_ids);
- // unvalid partner
+ // Propose the user to correct invalid partners
_.each(record_ids, function (id) {
+ var popup_def = $.Deferred();
+ popups_deferreds.push(popup_def);
+
var pop = new form_common.FormViewDialog(self, {
res_model: 'res.partner',
res_id: id,
@@ -68,15 +67,19 @@ var FieldMany2ManyTagsEmail = form_relational.FieldMany2ManyTags.extend({
title: _t("Please complete partner's informations and Email"),
}).open();
pop.on('write_completed', self, function () {
- this.values.push(id);
- this.values_checking = _.without(this.values_checking, id);
- this.set({'value': this.values});
+ self.valid_partners.push(id);
});
pop.on('closed', self, function () {
- this.values_checking = _.without(this.values_checking, id);
- this.set({'value': this.values});
+ popup_def.resolve();
});
});
+ return $.when.apply($, popups_deferreds).then(function() {
+ // All popups have been processed for the given ids
+ // It is now time to set the final value with valid partners ids.
+ var filtered_value = _.uniq(self.valid_partners);
+ self.last_processed_value = filtered_value;
+ self.set({'value': filtered_value});
+ });
});
},
});
diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index 41d84f1cd8a..ca74fb8e53f 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -126,6 +126,9 @@ class MrpProduction(models.Model):
('none', 'None')], string='Availability',
compute='_compute_availability', store=True)
+ unreserve_visible = fields.Boolean(
+ 'Inventory Unreserve Visible', compute='_compute_unreserve_visible',
+ help='Technical field to check when we can unreserve')
post_visible = fields.Boolean(
'Inventory Post Visible', compute='_compute_post_visible',
help='Technical field to check when we can post')
@@ -193,6 +196,14 @@ class MrpProduction(models.Model):
assigned_list = [x.state in ('assigned', 'done', 'cancel') for x in order.move_raw_ids]
order.availability = (all(assigned_list) and 'assigned') or (any(partial_list) and 'partially_available') or 'waiting'
+ @api.depends('state', 'move_raw_ids.reserved_quant_ids')
+ def _compute_unreserve_visible(self):
+ for order in self:
+ if order.state in ['done', 'cancel'] or not order.move_raw_ids.mapped('reserved_quant_ids'):
+ order.unreserve_visible = False
+ else:
+ order.unreserve_visible = True
+
@api.multi
@api.depends('move_raw_ids.quantity_done', 'move_finished_ids.quantity_done')
def _compute_post_visible(self):
diff --git a/addons/mrp/models/product.py b/addons/mrp/models/product.py
index c3f457adb56..7ecc6274636 100644
--- a/addons/mrp/models/product.py
+++ b/addons/mrp/models/product.py
@@ -37,8 +37,15 @@ class ProductTemplate(models.Model):
class ProductProduct(models.Model):
_inherit = "product.product"
+ bom_count = fields.Integer('# Bill of Material', compute='_compute_bom_count')
mo_count = fields.Integer('# Manufacturing Orders', compute='_compute_mo_count')
+ def _compute_bom_count(self):
+ read_group_res = self.env['mrp.bom'].read_group([('product_id', 'in', self.ids)], ['product_id'], ['product_id'])
+ mapped_data = dict([(data['product_id'][0], data['product_id_count']) for data in read_group_res])
+ for product in self:
+ product.bom_count = mapped_data.get(product.id, 0)
+
def _compute_mo_count(self):
read_group_res = self.env['mrp.production'].read_group([('product_id', 'in', self.ids)], ['product_id'], ['product_id'])
mapped_data = dict([(data['product_id'][0], data['product_id_count']) for data in read_group_res])
diff --git a/addons/mrp/models/stock_move.py b/addons/mrp/models/stock_move.py
index 9b2ff511a33..df46c2461aa 100644
--- a/addons/mrp/models/stock_move.py
+++ b/addons/mrp/models/stock_move.py
@@ -29,13 +29,15 @@ class StockMoveLots(models.Model):
plus_visible = fields.Boolean("Plus Visible", compute='_compute_plus')
@api.one
- @api.constrains('lot_id')
+ @api.constrains('lot_id', 'quantity_done')
def _check_lot_id(self):
if self.move_id.product_id.tracking == 'serial':
lots = set([])
for move_lot in self.move_id.move_lot_ids.filtered(lambda r: not r.lot_produced_id):
if move_lot.lot_id in lots:
raise exceptions.UserError(_('You cannot use the same serial number in two different lines.'))
+ if float_compare(move_lot.quantity_done, 1.0, precision_rounding=move_lot.product_id.uom_id.rounding) == 1:
+ raise exceptions.UserError(_('You can only produce 1.0 %s for products with unique serial number.') % move_lot.product_id.uom_id.name)
lots.add(move_lot.lot_id)
def _compute_plus(self):
diff --git a/addons/mrp/security/ir.model.access.csv b/addons/mrp/security/ir.model.access.csv
index 7a384a01b2e..47a7e677285 100644
--- a/addons/mrp/security/ir.model.access.csv
+++ b/addons/mrp/security/ir.model.access.csv
@@ -57,5 +57,6 @@ access_resource_calendar_manufacturinguser,resource.calendar manufacturing.user,
access_mrp_unbuild,mrp.unbuild,model_mrp_unbuild,group_mrp_user,1,0,0,0
access_mrp_unbuild_manager,mrp.unbuild manager,model_mrp_unbuild,group_mrp_manager,1,1,1,1
access_mrp_message_mrp_user,mrp.message,model_mrp_message,group_mrp_user,1,0,0,0
+access_mrp_message_mrp_manager,mrp.message,model_mrp_message,group_mrp_manager,1,1,1,1
access_stock_move_lots,stock.move.lots,model_stock_move_lots,group_mrp_user,1,1,1,0
access_stock_move_lots_manager,stock.move.lots,model_stock_move_lots,group_mrp_manager,1,1,1,1
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index 5203bebcb59..6c8ffea7fa7 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -51,12 +51,13 @@
<button name="post_inventory" string="Post Inventory" type="object" attrs="{'invisible': [('post_visible', '=', False)]}"/>
<button name="action_cancel" type="object" string="Cancel" attrs="{'invisible': ['|', ('state', 'in', ('done','cancel')), ('check_to_done', '=', True)]}"/>
<button name="button_scrap" type="object" string="Scrap" attrs="{'invisible': ['|', ('availability', '=', 'none'), ('state', 'in', ('cancel'))]}"/>
- <button name="button_unreserve" type="object" string="Unreserve" attrs="{'invisible': ['|', ('state', 'in', ['done', 'cancel']), ('availability', 'in', ['none', 'waiting'])]}"/>
+ <button name="button_unreserve" type="object" string="Unreserve" attrs="{'invisible': [('unreserve_visible', '=', False)]}"/>
<span class="label label-danger" attrs="{'invisible': ['|', ('availability', 'in', ('assigned', 'none')), ('state', 'not in', ('confirmed','progress'))]}">Raw materials not available!</span>
<field name="state" widget="statusbar" statusbar_visible="confirmed,progress,done"/>
</header>
<sheet>
<field name="post_visible" invisible="1"/>
+ <field name="unreserve_visible" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="%(action_mrp_workorder_production_specific)d" type="action" attrs="{'invisible': [('workorder_count', '=', 0)]}" class="oe_stat_button" icon="fa-play-circle-o">
<div class="o_form_field o_stat_info">
@@ -264,7 +265,7 @@
<separator/>
<filter string="No Routing" domain="[('routing_id','=', False)]" name="norouting" groups="mrp.group_mrp_routings"/>
<field name="product_id"/>
- <field name="product_id" string="Raw Material" filter_domain="[('move_raw_ids.product_id','ilike',self)]"/>
+ <field name="move_raw_ids" string="Raw Material" filter_domain="[('move_raw_ids.product_id','ilike',self)]"/>
<field name="name" string="Work Center" filter_domain="[('routing_id.operation_ids.workcenter_id','ilike',self)]"/>
<field name="routing_id" groups="mrp.group_mrp_routings"/>
<separator/>
diff --git a/addons/point_of_sale/static/src/js/gui.js b/addons/point_of_sale/static/src/js/gui.js
index 87cb30caf78..6107d3a979e 100644
--- a/addons/point_of_sale/static/src/js/gui.js
+++ b/addons/point_of_sale/static/src/js/gui.js
@@ -184,12 +184,22 @@ var Gui = core.Class.extend({
close_other_tabs: function() {
var self = this;
+ // avoid closing itself
+ var now = Date.now();
+
localStorage['message'] = '';
localStorage['message'] = JSON.stringify({
'message':'close_tabs',
'session': this.pos.pos_session.id,
+ 'window_uid': now,
});
+ // storage events are (most of the time) triggered only when the
+ // localstorage is updated in a different tab.
+ // some browsers (e.g. IE) does trigger an event in the same tab
+ // This may be a browser bug or a different interpretation of the HTML spec
+ // cf https://connect.microsoft.com/IE/feedback/details/774798/localstorage-event-fired-in-source-window
+ // Use window_uid parameter to exclude the current window
window.addEventListener("storage", function(event) {
var msg = event.data;
@@ -197,7 +207,8 @@ var Gui = core.Class.extend({
var msg = JSON.parse(event.newValue);
if ( msg.message === 'close_tabs' &&
- msg.session == self.pos.pos_session.id ) {
+ msg.session == self.pos.pos_session.id &&
+ msg.window_uid != now) {
console.info('POS / Session opened in another window. EXITING POS')
self._close();
diff --git a/addons/point_of_sale/tools/posbox/configuration/setup_ramdisks.sh b/addons/point_of_sale/tools/posbox/configuration/setup_ramdisks.sh
index ce2f2e633e6..618c4b1fd48 100755
--- a/addons/point_of_sale/tools/posbox/configuration/setup_ramdisks.sh
+++ b/addons/point_of_sale/tools/posbox/configuration/setup_ramdisks.sh
@@ -11,7 +11,7 @@ create_ramdisk () {
echo "Creating ramdisk for ${1} of size ${SIZE}..."
mount -t tmpfs -o size="${SIZE}" tmpfs "${RAMDISK}"
- rsync -a --exclude="swap" --exclude="apt" --exclude="dpkg" "${ORIGINAL}/" "${RAMDISK}/"
+ rsync -a --exclude="swap" --exclude="apt" --exclude="dpkg" --exclude=".mozilla" "${ORIGINAL}/" "${RAMDISK}/"
mount --bind "${RAMDISK}" "${ORIGINAL}"
}
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/lightdm/lightdm.conf b/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/lightdm/lightdm.conf
new file mode 100644
index 00000000000..977903c1c90
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/lightdm/lightdm.conf
@@ -0,0 +1,8 @@
+
+[LightDM]
+user-authority-in-system-dir=true
+
+[SeatDefaults]
+xserver-command=/usr/bin/X -s 0 dpms -nolisten tcp
+greeter-hide-users=false
+autologin-user=pi \ No newline at end of file
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/xdg/openbox/autostart b/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/xdg/openbox/autostart
new file mode 100755
index 00000000000..e2b61e2f591
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/etc/xdg/openbox/autostart
@@ -0,0 +1,6 @@
+#!/bin/bash
+xset s off
+xset -dpms
+
+export HOME=/tmp
+/usr/bin/firefox http://localhost:8069/point_of_sale/display &
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/manifest.mf b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/manifest.mf
new file mode 100644
index 00000000000..63a9098e00d
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/manifest.mf
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xnFKNbJgc33dy/FJ+4cmHA==
+SHA1-Digest: 4YLgHgdgCw4lGCfsX7+r4zVmKJ4=
+
+Name: chrome.manifest
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: O5ce4bajAqUxG6iVul0K2w==
+SHA1-Digest: wb6VleWnV5GgLypmg1ij9TfmPLE=
+
+Name: content/rkioskbrowser.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /cF15tfVnbkfbxRVTL5N+g==
+SHA1-Digest: lvbY92PbsjwY+0TguEYoXWw0lxQ=
+
+Name: content/rkioskbrowser.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: NFOIpAmZtn20Y+XfTo4cpw==
+SHA1-Digest: VVIo7GdG+4mvAOtgR0DJUsSc/yg=
+
+Name: content/rkioskunknownContentType.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6cNGoHJS9Xvm+wmvo4IesQ==
+SHA1-Digest: T8i1MkMKjmn5HICqWv+iXSPRKIU=
+
+Name: content/rkioskxpinstallConfirm.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SxN1YnRJiuood2WhU85v9g==
+SHA1-Digest: Msj21u4bTAKUi496xld5YCGdjiA=
+
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.rsa b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.rsa
new file mode 100644
index 00000000000..521b08d182a
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.rsa
Binary files differ
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.sf b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.sf
new file mode 100644
index 00000000000..37eae3e21fb
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: 7hFyhNW67+H+rf9OhWGDkA==
+SHA1-Digest-Manifest: HvfAQQLXphSZ9m8KBorJMX8MUnE=
+
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/README b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/README
new file mode 100644
index 00000000000..c8c1ce58823
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/README
@@ -0,0 +1,3 @@
+The R-kiosk module has been downloaded from https://addons.mozilla.org/en-US/firefox/addon/r-kiosk/
+It is in the public domain as stated on https://addons.mozilla.org/en-US/firefox/addon/r-kiosk/eula/
+This mozilla module is shipped by Odoo to provide out of the box Client facing display to Odoo's Posbox \ No newline at end of file
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/chrome.manifest b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/chrome.manifest
new file mode 100644
index 00000000000..e4957b8d5e8
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/chrome.manifest
@@ -0,0 +1,4 @@
+content RKiosk content/
+overlay chrome://browser/content/browser.xul chrome://rkiosk/content/rkioskbrowser.xul
+overlay chrome://mozapps/content/xpinstall/xpinstallConfirm.xul chrome://rkiosk/content/rkioskxpinstallConfirm.xul
+overlay chrome://mozapps/content/downloads/unknownContentType.xul chrome://rkiosk/content/rkioskunknownContentType.xul
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.js b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.js
new file mode 100644
index 00000000000..5ece9a9e06b
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.js
@@ -0,0 +1,34 @@
+function Rkiosk_donothing()
+{
+
+
+}
+
+function rkioskclose()
+{
+ close();
+}
+
+function Rkiosk_navbar_setting()
+{
+ var rkiosk_navbar_enable="true";
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].
+ getService(Components.interfaces.nsIPrefBranch);
+ if (prefs.getPrefType("rkiosk.navbar") == prefs.PREF_BOOL){
+ if (prefs.getBoolPref("rkiosk.navbar")) rkiosk_navbar_enable = "false";
+ }
+ var rkiosk_element = document.getElementById("navigator-toolbox");
+ rkiosk_element.setAttribute("hidden", rkiosk_navbar_enable);
+}
+
+function RkioskBrowserStartup()
+{
+ Rkiosk_navbar_setting();
+ BrowserStartup();
+ setTimeout(RkioskdelayedStartup, 1000);
+}
+
+function RkioskdelayedStartup()
+{
+ window.fullScreen = true;
+}
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.xul b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.xul
new file mode 100644
index 00000000000..d5fb0c140d1
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskbrowser.xul
@@ -0,0 +1,175 @@
+<?xml version="1.0"?>
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<window id="main-window"
+ onload="RkioskBrowserStartup()">
+</window>
+
+<script type="application/x-javascript" src="rkioskbrowser.js"/>
+
+ <menubar id="main-menubar" hidden="true" fullscreentoolbar="false" disabled="true">
+ <menuitem id="menu_preferences" disabled="true"/>
+ </menubar>
+
+ <popup id="contentAreaContextMenu"
+ onpopupshowing="if (event.target != this) return true; return false;"
+ onpopuphiding="if (event.target == this) gContextMenu = null;">
+ </popup>
+
+ <commandset id="mainCommandSet">
+ <command id="cmd_newNavigator" disabled="true"/>
+ <command id="cmd_handleBackspace" disabled="true"/>
+ <command id="cmd_handleShiftBackspace" disabled="true"/>
+ <command id="cmd_newNavigatorTab" disabled="true"/>
+ <command id="Browser:OpenFile" disabled="true"/>
+ <command id="Browser:SavePage" disabled="true"/>
+ <command id="Browser:SaveFrame" disabled="true"/>
+ <command id="Browser:SendLink" disabled="true"/>
+ <command id="cmd_pageSetup" disabled="true"/>
+ <command id="cmd_print" oncommand="PrintUtils.print();"/>
+ <command id="cmd_printPreview" disabled="true"/>
+ <command id="cmd_close" disabled="true"/>
+ <command id="cmd_closeWindow" disabled="true"/>
+ <command id="cmd_ToggleTabsOnTop" disabled="true"/>
+ <command id="cmd_quitApplication" disabled="true"/>
+ <command id="cmd_toggleTaskbar" disabled="true"/>
+ <command id="cmd_CustomizeToolbars" disabled="true"/>
+ <commandset id="editMenuCommands"/>
+ <command id="View:PageSource" disabled="true"/>
+ <command id="View:PageInfo" disabled="true"/>
+ <command id="View:FullScreen" disabled="true"/>
+ <command id="cmd_find" disabled="true"/>
+ <command id="cmd_findAgain" disabled="true"/>
+ <command id="cmd_findPrevious" disabled="true"/>
+ <command id="Browser:AddBookmarkAs" disabled="true"/>
+ <command id="Browser:BookmarkAllTabs" disabled="true"/>
+ <command id="Browser:Home" oncommand="BrowserHome();"/>
+ <command id="Browser:Back" disabled="true"/>
+ <command id="Browser:Forward" disabled="true"/>
+ <command id="Browser:Stop" disabled="true"/>
+ <command id="Browser:Reload" disabled="true"/>
+ <command id="Browser:ReloadSkipCache" disabled="true"/>
+ <command id="Browser:BackOrBackDuplicate" disabled="true"/>
+ <command id="Browser:Forward" disabled="true"/>
+ <command id="Browser:ForwardOrForwardDuplicate" disabled="true"/>
+ <command id="Browser:ReloadOrDuplicate" disabled="true"/>
+ <command id="Browser:NextTab" disabled="true"/>
+ <command id="Browser:PrevTab" disabled="true"/>
+ <command id="Browser:ShowAllTabs" disabled="true"/>
+ <command id="Browser:ToggleTabView" disabled="true"/>
+ <command id="Browser:ToggleAddonBar" disabled="true"/>
+ <command id="cmd_fullZoomReduce" disabled="true"/>
+ <command id="cmd_fullZoomEnlarge" disabled="true"/>
+ <command id="cmd_fullZoomReset" disabled="true"/>
+ <command id="cmd_fullZoomToggle" disabled="true"/>
+ <command id="Browser:OpenLocation" disabled="true"/>
+ <command id="Tools:Search" disabled="true"/>
+ <command id="Tools:Downloads" disabled="true"/>
+ <command id="Tools:Addons" disabled="true"/>
+ <command id="Tools:Sanitize" disabled="true"/>
+ <command id="Tools:Inspect" disabled="true"/>
+ <command id="Tools:PrivateBrowsing" disabled="true"/>
+ <command id="History:UndoCloseTab" disabled="true"/>
+ <command id="History:UndoCloseWindow" disabled="true"/>
+ <command id="cmd_bm_open" disabled="true"/>
+ <command id="cmd_bm_openinnewwindow" disabled="true"/>
+ <command id="cmd_bm_openinnewtab" disabled="true"/>
+ <command id="cmd_bm_openfolder" disabled="true"/>
+ <command id="cmd_bm_managefolder" disabled="true"/>
+ <command id="cmd_bm_newfolder" disabled="true"/>
+ <command id="cmd_bm_newbookmark" disabled="true"/>
+ <command id="cmd_bm_newseparator" disabled="true"/>
+ <command id="cmd_bm_properties" disabled="true"/>
+ <command id="cmd_bm_refreshlivemark" disabled="true"/>
+ <command id="cmd_bm_refreshmicrosummary" disabled="true"/>
+ <command id="cmd_bm_rename" disabled="true"/>
+ <command id="cmd_bm_moveBookmark" disabled="true"/>
+ <command id="cmd_bm_sortbyname" disabled="true"/>
+ <command id="cmd_copyLink" disabled="true"/>
+ <command id="cmd_copyImageLocation" disabled="true"/>
+ <command id="cmd_copyImageContents" disabled="true"/>
+ <command id="cmd_undo" disabled="true"/>
+ <command id="cmd_redo" disabled="true"/>
+ <command id="cmd_cut" disabled="true"/>
+ <command id="cmd_copy" disabled="true"/>
+ <command id="cmd_paste" disabled="true"/>
+ <command id="cmd_delete" disabled="true"/>
+ <command id="cmd_selectAll" disabled="true"/>
+ <command id="cmd_switchTextDirection" disabled="true"/>
+ <command id="cmd_textZoomReduce" disabled="true"/>
+ <command id="cmd_textZoomEnlarge" disabled="true"/>
+ <command id="cmd_textZoomReset" disabled="true"/>
+ </commandset>
+ <commandset id="placesCommands">
+ <command id="Browser:ShowAllBookmarks" disabled="true"/>
+ <command id="Browser:ShowAllHistory" disabled="true"/>
+ </commandset>
+
+ <keyset id="mainKeyset">
+ <key id="rkiosk_f1" keycode="VK_F1" oncommand="Rkiosk_donothing();"/>
+ <key id="key_newNavigator" disabled="true"/>
+ <key id="key_newNavigatorTab" disabled="true"/>
+ <key id="focusURLBar" disabled="true"/>
+ <key id="focusURLBar2" disabled="true"/>
+ <key id="key_search" disabled="true"/>
+ <key id="key_search2" disabled="true"/>
+ <key id="key_openDownloads" disabled="true"/>
+ <key id="openFileKb" disabled="true"/>
+ <key id="key_savePage" disabled="true"/>
+ <key id="printKb" disabled="true"/>
+ <key id="key_close" disabled="true"/>
+ <key id="key_closeWindow" disabled="true"/>
+ <key id="key_undo" disabled="true"/>
+ <key id="key_redo" disabled="true"/>
+ <key id="key_cut" disabled="true"/>
+ <key id="key_copy" disabled="true"/>
+ <key id="key_paste" disabled="true"/>
+ <key id="key_delete" disabled="true"/>
+ <key id="key_selectAll" disabled="true"/>
+ <key id="goBackKb" disabled="true"/>
+ <key id="goForwardKb" disabled="true"/>
+ <key id="goHome" keycode="VK_HOME" command="Browser:Home" modifiers="alt"/>
+ <key id="key_viewSource" disabled="true"/>
+ <key id="key_find" disabled="true"/>
+ <key id="key_findAgain" disabled="true"/>
+ <key id="key_findPrevious" disabled="true"/>
+ <key id="addBookmarkAsKb" disabled="true"/>
+ <key id="bookmarkAllTabsKb" disabled="true"/>
+ <key id="key_stop" disabled="true"/>
+ <key id="key_gotoHistory" command="Rkiosk_donothing();"/>
+ <key id="key_switchTextDirection" disabled="true"/>
+ <key id="key_sanitize" disabled="true"/>
+ <key id="key_undoCloseTab" disabled="true"/>
+ <key id="viewBookmarksSidebarKb" command="Rkiosk_donothing();"/>
+ <key id="viewBookmarksSidebarWinKb" command="Rkiosk_donothing();"/>
+ <key id="key_fullScreen" disabled="true"/>
+ <key id="key_textZoomReduce" disabled="true"/>
+ <key id="key_textZoomEnlarge" disabled="true"/>
+ <key id="key_textZoomReset" disabled="true"/>
+ <key id="showAllHistoryKb" disabled="true"/>
+ <key id="key_errorConsole" disabled="true"/>
+ <key id="manBookmarkKb" disabled="true"/>
+ <key id="key_fullZoomReduce" disabled="true"/>
+ <key id="key_fullZoomEnlarge" disabled="true"/>
+ <key id="key_fullZoomReset" disabled="true"/>
+ <key id="key_openAddons" disabled="true"/>
+ <key id="key_webConsole" disabled="true"/>
+ <key id="key_inspect" disabled="true"/>
+ <key id="key_scratchpad" disabled="true"/>
+ <key id="key_showAllTabs" disabled="true"/>
+ <key id="key_tabview" disabled="true"/>
+ <key id="key_privatebrowsing" disabled="true"/>
+ <key id="key_undoCloseWindow" disabled="true"/>
+ <key id="key_selectTab1" disabled="true"/>
+ <key id="key_selectTab2" disabled="true"/>
+ <key id="key_selectTab3" disabled="true"/>
+ <key id="key_selectTab4" disabled="true"/>
+ <key id="key_selectTab5" disabled="true"/>
+ <key id="key_selectTab6" disabled="true"/>
+ <key id="key_selectTab7" disabled="true"/>
+ <key id="key_selectTab8" disabled="true"/>
+ <key id="key_selectLastTab" disabled="true"/>
+ <key id="key_toggleAddonBar" disabled="true"/>
+ </keyset>
+</overlay> \ No newline at end of file
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskunknownContentType.xul b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskunknownContentType.xul
new file mode 100644
index 00000000000..faf2381d1fa
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskunknownContentType.xul
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<overlay>
+ <dialog id="unknownContentType"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ onload="rkioskclose();">
+ <script src="rkioskbrowser.js"/>
+ </dialog>
+</overlay>
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskxpinstallConfirm.xul b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskxpinstallConfirm.xul
new file mode 100644
index 00000000000..b96deadeee6
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/content/rkioskxpinstallConfirm.xul
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<overlay>
+ <dialog id="xpinstallConfirm"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ onload="rkioskclose();">
+ <script src="rkioskbrowser.js"/>
+ </dialog>
+</overlay>
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/install.rdf b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/install.rdf
new file mode 100644
index 00000000000..5be400e52e8
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/lib/firefox-esr/browser/extensions/{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}/install.rdf
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+
+ <em:id>{4D498D0A-05AD-4fdb-97B5-8A0AABC1FC5B}</em:id>
+ <em:name>R-kiosk</em:name>
+ <em:version>0.9.0.1-signed.1-signed</em:version>
+ <em:description>RKiosk (Real Kiosk), fullscreen kiosk mode: all menus, keys etc. disabled</em:description>
+ <em:creator>Kimmo Heinaaro</em:creator>
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>2.0</em:minVersion>
+ <em:maxVersion>6.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF> \ No newline at end of file
diff --git a/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/share/firefox-esr/browser/defaults/preferences/all-posbox.js b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/share/firefox-esr/browser/defaults/preferences/all-posbox.js
new file mode 100644
index 00000000000..8de5d5d60a4
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_after_init/usr/share/firefox-esr/browser/defaults/preferences/all-posbox.js
@@ -0,0 +1,7 @@
+// Preferences to allow unattended install of R-Kiosk extension
+// Needed for Odoo posbox Client display
+pref("app.update.checkInstallTime", false);
+pref("devtools.webide.widget.autoinstall", false);
+pref("xpinstall.customConfirmationUI", false);
+pref("xpinstall.signatures.required", false);
+pref("browser.shell.checkDefaultBrowser",false)
diff --git a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init.d/odoo b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init.d/odoo
index 30be4bd26d3..4ab50a456a1 100755
--- a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init.d/odoo
+++ b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init.d/odoo
@@ -26,7 +26,7 @@ test -x $DAEMON || exit 0
set -e
function _start() {
- start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $USER:$USER --background --make-pidfile --exec $DAEMON -- --config $CONFIG --logfile $LOGFILE --load=web,hw_proxy,hw_posbox_homepage,hw_posbox_upgrade,hw_scale,hw_scanner,hw_escpos,hw_blackbox_be
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid $USER:$USER --background --make-pidfile --exec $DAEMON -- --config $CONFIG --logfile $LOGFILE --load=web,hw_proxy,hw_posbox_homepage,hw_posbox_upgrade,hw_scale,hw_scanner,hw_escpos,hw_blackbox_be,hw_screen
}
function _stop() {
diff --git a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
index a05dfc897ae..00058bef68c 100755
--- a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
+++ b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/init_posbox_image.sh
@@ -8,17 +8,25 @@ __dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
__base="$(basename ${__file} .sh)"
+# Since we are emulating, the real /boot is not mounted,
+# leading to mismatch between kernel image and modules.
+mount /dev/sda1 /boot
+
# Recommends: antiword, graphviz, ghostscript, postgresql, python-gevent, poppler-utils
export DEBIAN_FRONTEND=noninteractive
+echo "nameserver 8.8.8.8" >> /etc/resolv.conf
-mount /dev/sda1 /boot
apt-get update
apt-get -y dist-upgrade
+# Do not be too fast to upgrade to more recent firmware and kernel than 4.38
+# Firmware 4.44 seems to prevent the LED mechanism from working
-PKGS_TO_INSTALL="adduser postgresql-client python python-dateutil python-decorator python-docutils python-feedparser python-imaging python-jinja2 python-ldap python-libxslt1 python-lxml python-mako python-mock python-openid python-passlib python-psutil python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-pypdf python-reportlab python-requests python-tz python-vatnumber python-vobject python-werkzeug python-xlwt python-yaml postgresql python-gevent python-serial python-pip python-dev localepurge vim mc mg screen iw hostapd isc-dhcp-server git rsync console-data"
+PKGS_TO_INSTALL="adduser postgresql-client python python-dateutil python-decorator python-docutils python-feedparser python-imaging python-jinja2 python-ldap python-libxslt1 python-lxml python-mako python-mock python-openid python-passlib python-psutil python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-pypdf python-reportlab python-requests python-tz python-vatnumber python-vobject python-werkzeug python-xlwt python-yaml postgresql python-gevent python-serial python-pip python-dev localepurge vim mc mg screen iw hostapd isc-dhcp-server git rsync console-data lightdm xserver-xorg-video-fbdev xserver-xorg-input-evdev iceweasel xdotool unclutter x11-utils openbox python-netifaces rpi-update"
-apt-get -y install ${PKGS_TO_INSTALL}
+# KEEP OWN CONFIG FILES DURING PACKAGE CONFIGURATION
+# http://serverfault.com/questions/259226/automatically-keep-current-version-of-config-files-when-apt-get-install
+apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" --force-yes install ${PKGS_TO_INSTALL}
apt-get clean
localepurge
@@ -32,13 +40,20 @@ pip install pyusb==1.0.0b1
pip install qrcode
pip install evdev
+# --upgrade because websocket_client in wheezy is bad:
+# https://github.com/docker/compose/issues/1288
+pip install --upgrade websocket_client
+
groupadd usbusers
usermod -a -G usbusers pi
usermod -a -G lp pi
+usermod -a -G input lightdm
sudo -u postgres createuser -s pi
mkdir /var/log/odoo
chown pi:pi /var/log/odoo
+chown pi:pi -R /home/pi/odoo/
+chmod 770 -R /home/pi/odoo/
# logrotate is very picky when it comes to file permissions
chown -R root:root /etc/logrotate.d/
@@ -54,6 +69,31 @@ update-rc.d -f isc-dhcp-server remove
systemctl daemon-reload
systemctl enable ramdisks.service
systemctl disable dphys-swapfile.service
+systemctl enable ssh
+
+# USER PI AUTO LOGIN (from nano raspi-config)
+# We take the whole algorithm from raspi-config in order to stay compatible with raspbian infrastructure
+if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
+ SYSTEMD=1
+elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
+ SYSTEMD=0
+else
+ echo "Unrecognised init system"
+ return 1
+fi
+if [ $SYSTEMD -eq 1 ]; then
+ systemctl set-default graphical.target
+ ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
+else
+ update-rc.d lightdm enable 2
+fi
+
+# disable overscan in /boot/config.txt, we can't use
+# overwrite_after_init because it's on a different device
+# (/dev/mmcblk0p1) and we don't mount that afterwards.
+# This option disables any black strips around the screen
+# cf: https://www.raspberrypi.org/documentation/configuration/raspi-config.md
+echo "disable_overscan=1" >> /boot/config.txt
# https://www.raspberrypi.org/forums/viewtopic.php?p=79249
# to not have "setting up console font and keymap" during boot take ages
@@ -68,5 +108,6 @@ create_ramdisk_dir "/var"
create_ramdisk_dir "/etc"
create_ramdisk_dir "/tmp"
mkdir /root_bypass_ramdisks
+umount /dev/sda1
reboot
diff --git a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/udev/rules.d/99-z-input.rules b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/udev/rules.d/99-z-input.rules
new file mode 100644
index 00000000000..aab19f2d1c7
--- /dev/null
+++ b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/udev/rules.d/99-z-input.rules
@@ -0,0 +1,2 @@
+SUBSYSTEM=="input", GROUP="input", MODE="0660"
+KERNEL=="tty[0-9]*", GROUP="tty", MODE="0660" \ No newline at end of file
diff --git a/addons/point_of_sale/tools/posbox/posbox_create_image.sh b/addons/point_of_sale/tools/posbox/posbox_create_image.sh
index 1e4c9d1277c..a9ec8bc102d 100755
--- a/addons/point_of_sale/tools/posbox/posbox_create_image.sh
+++ b/addons/point_of_sale/tools/posbox/posbox_create_image.sh
@@ -36,20 +36,25 @@ fi
cp -a *raspbian*.img posbox.img
CLONE_DIR="${OVERWRITE_FILES_BEFORE_INIT_DIR}/home/pi/odoo"
+
rm -rf "${CLONE_DIR}"
-mkdir "${CLONE_DIR}"
-git clone -b 8.0 --no-checkout --depth 1 https://github.com/odoo/odoo.git "${CLONE_DIR}"
-cd "${CLONE_DIR}"
-git config core.sparsecheckout true
-echo "addons/web
+
+if [ ! -d $CLONE_DIR ]; then
+ echo "Clone Github repo"
+ mkdir -p "${CLONE_DIR}"
+ git clone -b 8.0 --no-local --no-checkout --depth 1 https://github.com/odoo/odoo.git "${CLONE_DIR}"
+ cd "${CLONE_DIR}"
+ git config core.sparsecheckout true
+ echo "addons/web
addons/web_kanban
addons/hw_*
addons/point_of_sale/tools/posbox/configuration
openerp/
odoo.py" | tee --append .git/info/sparse-checkout > /dev/null
-git read-tree -mu HEAD
-cd "${__dir}"
+ git read-tree -mu HEAD
+fi
+cd "${__dir}"
USR_BIN="${OVERWRITE_FILES_BEFORE_INIT_DIR}/usr/bin/"
mkdir -p "${USR_BIN}"
cd "/tmp"
@@ -60,9 +65,11 @@ cd "${__dir}"
mv /tmp/ngrok "${USR_BIN}"
# zero pad the image to be around 3.5 GiB, by default the image is only ~1.3 GiB
+echo "Enlarging the image..."
dd if=/dev/zero bs=1M count=2048 >> posbox.img
# resize partition table
+echo "Fdisking"
START_OF_ROOT_PARTITION=$(fdisk -l posbox.img | tail -n 1 | awk '{print $2}')
(echo 'p'; # print
echo 'd'; # delete
@@ -75,7 +82,7 @@ START_OF_ROOT_PARTITION=$(fdisk -l posbox.img | tail -n 1 | awk '{print $2}')
echo 'p'; # print
echo 'w') | fdisk posbox.img # write and quit
-LOOP_MAPPER_PATH=$(kpartx -av posbox.img | tail -n 1 | cut -d ' ' -f 3)
+LOOP_MAPPER_PATH=$(kpartx -avs posbox.img | tail -n 1 | cut -d ' ' -f 3)
LOOP_MAPPER_PATH="/dev/mapper/${LOOP_MAPPER_PATH}"
sleep 5
diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py
index f9250471af0..006a24889d7 100644
--- a/addons/purchase/models/purchase.py
+++ b/addons/purchase/models/purchase.py
@@ -42,7 +42,7 @@ class PurchaseOrder(models.Model):
if min_date:
order.date_planned = min_date
- @api.depends('state', 'order_line.qty_invoiced', 'order_line.product_qty')
+ @api.depends('state', 'order_line.qty_invoiced', 'order_line.qty_received', 'order_line.product_qty')
def _get_invoiced(self):
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
for order in self:
@@ -50,9 +50,9 @@ class PurchaseOrder(models.Model):
order.invoice_status = 'no'
continue
- if any(float_compare(line.qty_invoiced, line.product_qty, precision_digits=precision) == -1 for line in order.order_line):
+ if any(float_compare(line.qty_invoiced, line.product_qty if line.product_id.purchase_method == 'purchase' else line.qty_received, precision_digits=precision) == -1 for line in order.order_line):
order.invoice_status = 'to invoice'
- elif all(float_compare(line.qty_invoiced, line.product_qty, precision_digits=precision) >= 0 for line in order.order_line):
+ elif all(float_compare(line.qty_invoiced, line.product_qty if line.product_id.purchase_method == 'purchase' else line.qty_received, precision_digits=precision) >= 0 for line in order.order_line):
order.invoice_status = 'invoiced'
else:
order.invoice_status = 'no'
@@ -521,7 +521,10 @@ class PurchaseOrderLine(models.Model):
qty = 0.0
for inv_line in line.invoice_lines:
if inv_line.invoice_id.state not in ['cancel']:
- qty += inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom)
+ if inv_line.invoice_id.type == 'in_invoice':
+ qty += inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom)
+ elif inv_line.invoice_id.type == 'in_refund':
+ qty -= inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom)
line.qty_invoiced = qty
@api.depends('order_id.state', 'move_ids.state')
@@ -579,8 +582,8 @@ class PurchaseOrderLine(models.Model):
invoice_lines = fields.One2many('account.invoice.line', 'purchase_line_id', string="Bill Lines", readonly=True, copy=False)
# Replace by invoiced Qty
- qty_invoiced = fields.Float(compute='_compute_qty_invoiced', string="Billed Qty", store=True)
- qty_received = fields.Float(compute='_compute_qty_received', string="Received Qty", store=True)
+ qty_invoiced = fields.Float(compute='_compute_qty_invoiced', string="Billed Qty", digits=dp.get_precision('Product Unit of Measure'), store=True)
+ qty_received = fields.Float(compute='_compute_qty_received', string="Received Qty", digits=dp.get_precision('Product Unit of Measure'), store=True)
partner_id = fields.Many2one('res.partner', related='order_id.partner_id', string='Partner', readonly=True, store=True)
currency_id = fields.Many2one(related='order_id.currency_id', store=True, string='Currency', readonly=True)
@@ -1041,7 +1044,7 @@ class ProductTemplate(models.Model):
@api.model
def _get_buy_route(self):
- buy_route = self.env.ref('purchase.route_warehouse0_buy')
+ buy_route = self.env.ref('purchase.route_warehouse0_buy', raise_if_not_found=False)
if buy_route:
return buy_route.ids
return []
diff --git a/addons/purchase/tests/test_purchase_order.py b/addons/purchase/tests/test_purchase_order.py
index 5f1c1f3f645..a7b83a0e237 100644
--- a/addons/purchase/tests/test_purchase_order.py
+++ b/addons/purchase/tests/test_purchase_order.py
@@ -22,6 +22,7 @@ class TestPurchaseOrder(AccountingTestCase):
self.product_id_1 = self.env.ref('product.product_product_8')
self.product_id_2 = self.env.ref('product.product_product_11')
+ (self.product_id_1 | self.product_id_2).write({'purchase_method': 'purchase'})
# Ensure product_id_2 doesn't have res_partner_1 as supplier
if self.partner_id in self.product_id_2.seller_ids.mapped('name'):
id_to_remove = self.product_id_2.seller_ids.filtered(lambda r: r.name == self.partner_id).ids[0] if self.product_id_2.seller_ids.filtered(lambda r: r.name == self.partner_id) else False
@@ -80,6 +81,7 @@ class TestPurchaseOrder(AccountingTestCase):
'partner_id': self.partner_id.id,
'purchase_id': self.po.id,
'account_id': self.partner_id.property_account_payable_id.id,
+ 'type': 'in_invoice',
})
self.invoice.purchase_order_change()
self.assertEqual(self.po.order_line.mapped('qty_invoiced'), [5.0, 5.0], 'Purchase: all products should be invoiced"')
diff --git a/addons/rating_project/data/project_data.xml b/addons/rating_project/data/project_data.xml
index babd6e68694..be5b222fe26 100644
--- a/addons/rating_project/data/project_data.xml
+++ b/addons/rating_project/data/project_data.xml
@@ -88,7 +88,7 @@
</tr>
</table>
</td></tr>
- <tr><td style="padding:15px 20px 10px 20px;">${object.user_id.signature or ''| safe}</td></tr>
+ <tr><td style="padding:15px 20px 10px 20px;">${(object.user_id.signature or '')| safe}</td></tr>
</tbody>
</table>
<table style="width:600px;margin:auto;text-align:center;font-size:12px;">
diff --git a/addons/report/static/src/js/report.editor.js b/addons/report/static/src/js/report.editor.js
index 5b58793bbf5..57942f9b79c 100644
--- a/addons/report/static/src/js/report.editor.js
+++ b/addons/report/static/src/js/report.editor.js
@@ -1,6 +1,8 @@
odoo.define('report.editor', function (require) {
'use strict';
+var ajax = require('web.ajax');
+var core = require('web.core');
var utils = require('report.utils');
var editor = require('web_editor.editor');
var options = require('web_editor.snippets.options');
@@ -10,6 +12,8 @@ var trusted_host = utils.get_host_from_url(web_base_url);
var trusted_protocol = utils.get_protocol_from_url(web_base_url);
var trusted_origin = utils.build_origin(trusted_protocol, trusted_host);
+ajax.loadXML('/web/static/src/xml/base_common.xml', core.qweb);
+
// Patch the editor's behavior when it is launched inside an iframe.
if (window.self !== window.top) {
$(document.body).addClass('o_in_iframe'); // in order to apply css rules
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index 2c2f7048d8d..2e0d017c8c2 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -820,6 +820,7 @@ class SaleOrderLine(models.Model):
@api.multi
def _get_display_price(self, product):
+ # TO DO: move me in master/saas-16 on sale.order
if self.order_id.pricelist_id.discount_policy == 'without_discount':
from_currency = self.order_id.company_id.currency_id
return from_currency.compute(product.lst_price, self.order_id.pricelist_id.currency_id)
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py
index d88ad3229f2..0978adaec8a 100644
--- a/addons/stock/models/stock_move.py
+++ b/addons/stock/models/stock_move.py
@@ -375,7 +375,7 @@ class StockMove(models.Model):
rules = Push.search(domain + [('route_id', 'in', move.picking_id.picking_type_id.warehouse_id.route_ids.ids)], order='route_sequence, sequence', limit=1)
if not rules:
# if no specialized push rule has been found yet, we try to find a general one (without route)
- rules = Push.search(domain + [('route_id', '=', False)], order='sequence')
+ rules = Push.search(domain + [('route_id', '=', False)], order='sequence', limit=1)
# Make sure it is not returning the return
if rules and (not move.origin_returned_move_id or move.origin_returned_move_id.location_dest_id.id != rules.location_dest_id.id):
rules._apply(move)
@@ -564,6 +564,7 @@ class StockMove(models.Model):
moves_to_assign = self.env['stock.move']
moves_to_do = self.env['stock.move']
operations = self.env['stock.pack.operation']
+ ancestors_list = {}
# work only on in progress moves
moves = self.filtered(lambda move: move.state in ['confirmed', 'waiting', 'assigned'])
@@ -586,6 +587,7 @@ class StockMove(models.Model):
# we always search for yet unassigned quants
main_domain[move.id] = [('reservation_id', '=', False), ('qty', '>', 0)]
+ ancestors_list[move.id] = True if ancestors else False
if move.state == 'waiting' and not ancestors:
# if the waiting move hasn't yet any ancestor (PO/MO not confirmed yet), don't find any quant available in stock
main_domain[move.id] += [('id', '=', False)]
@@ -629,7 +631,9 @@ class StockMove(models.Model):
lot_qty[lot] -= qty
move_qty -= qty
- for move in moves_to_do:
+ # Sort moves to reserve first the ones with ancestors, in case the same product is listed in
+ # different stock moves.
+ for move in sorted(moves_to_do, key=lambda x: -1 if ancestors_list.get(x.id) else 0):
# then if the move isn't totally assigned, try to find quants without any specific domain
if move.state != 'assigned' and not self.env.context.get('reserve_only_ops'):
qty_already_assigned = move.reserved_availability
diff --git a/addons/stock/security/ir.model.access.csv b/addons/stock/security/ir.model.access.csv
index 090c74ab74c..17993221052 100644
--- a/addons/stock/security/ir.model.access.csv
+++ b/addons/stock/security/ir.model.access.csv
@@ -74,4 +74,4 @@ access_barcode_rule_stock_user,barcode.rule.stock.user,barcodes.model_barcode_ru
access_barcode_rule_stock_manager,barcode.rule.stock.manager,barcodes.model_barcode_rule,stock.group_stock_manager,1,1,1,1
access_stock_forecast_user,report.stock.forecast.user,model_report_stock_forecast,stock.group_stock_user,1,0,0,0
access_stock_forecast_manager,report.stock.forecast.manager,model_report_stock_forecast,stock.group_stock_manager,1,1,1,1
-access_stock_scrap_user,stock.scrap.user,model_stock_scrap,stock.group_stock_user,1,0,0,0
+access_stock_scrap_user,stock.scrap.user,model_stock_scrap,stock.group_stock_user,1,1,1,0
diff --git a/addons/theme_default/static/src/less/option_layout_boxed.less b/addons/theme_default/static/src/less/option_layout_boxed.less
index db449d79b4d..4e258175923 100644
--- a/addons/theme_default/static/src/less/option_layout_boxed.less
+++ b/addons/theme_default/static/src/less/option_layout_boxed.less
@@ -1,4 +1,6 @@
#wrapwrap {
- width: 85%;
- margin: 0 auto;
-} \ No newline at end of file
+ @media (min-width: @screen-sm-min){
+ width: 85%;
+ margin: 0 auto;
+ }
+}
diff --git a/addons/web/static/src/js/framework/pyeval.js b/addons/web/static/src/js/framework/pyeval.js
index d0708bdf356..bcab0b0717f 100644
--- a/addons/web/static/src/js/framework/pyeval.js
+++ b/addons/web/static/src/js/framework/pyeval.js
@@ -850,31 +850,62 @@ function eval_contexts (contexts, evaluation_context) {
function eval_domains (domains, evaluation_context) {
evaluation_context = _.extend(pycontext(), evaluation_context || {});
var result_domain = [];
+ // Normalize only if the first domain is the array ["|"] or ["!"]
+ var need_normalization = (
+ domains &&
+ domains.length > 0 &&
+ domains[0].length === 1 &&
+ (domains[0][0] === "|" || domains[0][0] === "!")
+ );
_(domains).each(function (domain) {
if (_.isString(domain)) {
// wrap raw strings in domain
domain = { __ref: 'domain', __debug: domain };
}
+ var domain_array_to_combine;
switch(domain.__ref) {
case 'domain':
evaluation_context.context = evaluation_context;
- result_domain.push.apply(
- result_domain, py.eval(domain.__debug, wrap_context(evaluation_context)));
+ domain_array_to_combine = py.eval(domain.__debug, wrap_context(evaluation_context));
break;
case 'compound_domain':
var eval_context = eval_contexts([domain.__eval_context]);
- result_domain.push.apply(
- result_domain, eval_domains(
- domain.__domains, _.extend(
- {}, evaluation_context, eval_context)));
+ domain_array_to_combine = eval_domains(
+ domain.__domains, _.extend({}, evaluation_context, eval_context)
+ );
break;
default:
- result_domain.push.apply(result_domain, domain);
+ domain_array_to_combine = domain;
+ }
+ if (need_normalization) {
+ domain_array_to_combine = get_normalized_domain(domain_array_to_combine);
}
+ result_domain.push.apply(result_domain, domain_array_to_combine);
});
return result_domain;
}
+/**
+ * Returns a normalized copy of the given domain array. Normalization is
+ * is making the implicit "&" at the start of the domain explicit, e.g.
+ * [A, B, C] would become ["&", "&", A, B, C].
+ *
+ * @param {Array} domain_array
+ * @returns {Array} normalized copy of the given array
+ */
+function get_normalized_domain(domain_array) {
+ var expected = 1; // Holds the number of expected domain expressions
+ _.each(domain_array, function (item) {
+ if (item === "&" || item === "|") {
+ expected++;
+ } else if (item !== "!") {
+ expected--;
+ }
+ });
+ var new_explicit_ands = _.times(-expected, _.constant("&"));
+ return new_explicit_ands.concat(domain_array);
+}
+
function eval_groupbys (contexts, evaluation_context) {
evaluation_context = _.extend(pycontext(), evaluation_context || {});
var result_group = [];
diff --git a/addons/web/static/src/js/views/form_relational_widgets.js b/addons/web/static/src/js/views/form_relational_widgets.js
index 6a6c258f8f9..2517b3c57b8 100644
--- a/addons/web/static/src/js/views/form_relational_widgets.js
+++ b/addons/web/static/src/js/views/form_relational_widgets.js
@@ -959,7 +959,8 @@ var X2ManyListView = ListView.extend({
field.no_rerender = true;
current_values[field.name] = field.get('value');
});
- var cached_records = _.filter(this.dataset.cache, function(item){return !_.isEmpty(item.values) && !item.to_delete;});
+ var ids = _.map(this.records.records, function (item) { return item.attributes.id; });
+ var cached_records = _.filter(this.dataset.cache, function(item){return _.contains(ids, item.id) && !_.isEmpty(item.values) && !item.to_delete;});
var valid = _.every(cached_records, function(record){
_.each(fields, function(field){
var value = record.values[field.name];
diff --git a/addons/web/static/src/js/views/form_view.js b/addons/web/static/src/js/views/form_view.js
index b1638436742..93c9ceeac1b 100644
--- a/addons/web/static/src/js/views/form_view.js
+++ b/addons/web/static/src/js/views/form_view.js
@@ -55,7 +55,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.fields = {};
this.fields_order = [];
this.datarecord = {};
- this._onchange_specs = {};
this.onchanges_mutex = new utils.Mutex();
this.default_focus_field = null;
this.default_focus_button = null;
@@ -75,7 +74,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.rendering_engine = new FormRenderingEngine(this);
this.set({actual_mode: this.options.initial_mode});
this.has_been_loaded.done(function() {
- self._build_onchange_specs();
self.on("change:actual_mode", self, self.toggle_buttons);
self.on("change:actual_mode", self, self.toggle_sidebar);
});
@@ -318,8 +316,11 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.update_pager(); // the mode must be actualized before updating the pager
return $.when.apply(null, set_values).then(function() {
if (!record.id) {
- // trigger onchanges
- self.do_onchange(null);
+ // trigger onchange for new record after x2many with non-embedded views are loaded
+ var fields_loaded = _.pluck(self.fields, 'is_loaded');
+ $.when.apply(null, fields_loaded).done(function() {
+ self.do_onchange(null);
+ });
}
self.on_form_changed();
self.rendering_engine.init_fields().then(function() {
@@ -333,7 +334,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
} else {
self.do_push_state({});
}
- self.$el.removeClass('oe_form_dirty');
+ self.$el.removeClass('oe_form_dirty');
});
});
},
@@ -381,7 +382,24 @@ var FormView = View.extend(common.FieldManagerMixin, {
_.each(this.fields, function(field, name) {
self._onchange_fields.push(name);
self._onchange_specs[name] = find(name, field.node);
- _.each(field.field.views, function(view) {
+
+ // we get the list of first-level fields of x2many firstly by
+ // getting them from the field embedded views, then if no embedded
+ // view is present for a loaded view, we get them from the default
+ // view that has been loaded
+
+ // gather embedded view objects
+ var views = _.clone(field.field.views);
+ // also gather default view objects
+ if (field.viewmanager) {
+ _.each(field.viewmanager.views, function(view, view_type) {
+ // add default view if it was not embedded and it is loaded
+ if (views[view_type] === undefined && view.controller) {
+ views[view_type] = view.controller.fields_view;
+ }
+ });
+ }
+ _.each(views, function(view) {
_.each(view.fields, function(_, subname) {
self._onchange_specs[name + '.' + subname] = find(subname, view.arch);
});
@@ -410,6 +428,9 @@ var FormView = View.extend(common.FieldManagerMixin, {
do_onchange: function(widget) {
var self = this;
+ if (self._onchange_specs === undefined) {
+ self._build_onchange_specs();
+ }
var onchange_specs = self._onchange_specs;
try {
var def = $.when({});
diff --git a/addons/web/static/src/js/views/list_view.js b/addons/web/static/src/js/views/list_view.js
index b02c91ed147..83e1b7bf900 100644
--- a/addons/web/static/src/js/views/list_view.js
+++ b/addons/web/static/src/js/views/list_view.js
@@ -948,9 +948,11 @@ ListView.List = Class.extend({
$row = self.$current.children(
'[data-id=' + record.get('id') + ']');
}
- var $newRow = $(self.render_record(record));
- $newRow.find('.o_list_record_selector input').prop('checked', !!$row.find('.o_list_record_selector input').prop('checked'));
- $row.replaceWith($newRow);
+ if ($row.length) {
+ var $newRow = $(self.render_record(record));
+ $newRow.find('.o_list_record_selector input').prop('checked', !!$row.find('.o_list_record_selector input').prop('checked'));
+ $row.replaceWith($newRow);
+ }
},
'add': function (ev, records, record, index) {
var $new_row = $(self.render_record(record));
diff --git a/addons/web/static/src/js/views/list_view_editable.js b/addons/web/static/src/js/views/list_view_editable.js
index c3b2209c477..6beb6a7a044 100644
--- a/addons/web/static/src/js/views/list_view_editable.js
+++ b/addons/web/static/src/js/views/list_view_editable.js
@@ -828,6 +828,10 @@ ListView.List.include(/** @lends instance.web.ListView.List# */{
if (!this.view.editable() || !this.view.is_action_enabled('edit')) {
return this._super.apply(this, arguments);
}
+ if (this.__is_starting_edition) {
+ return;
+ }
+ this.__is_starting_edition = true;
var self = this;
var args = arguments;
@@ -839,6 +843,8 @@ ListView.List.include(/** @lends instance.web.ListView.List# */{
focus_field: $(event.target).not(".o_readonly").data('field'),
}).fail(function() {
return _super.apply(self, args); // The record can't be edited so open it in a modal (use-case: readonly mode)
+ }).always(function () {
+ self.__is_starting_edition = false;
});
},
/**
diff --git a/addons/web/static/src/less/tooltip.less b/addons/web/static/src/less/tooltip.less
index dad63e374fa..e071bf04a40 100644
--- a/addons/web/static/src/less/tooltip.less
+++ b/addons/web/static/src/less/tooltip.less
@@ -5,6 +5,8 @@
opacity: 1;
.tooltip-inner {
+ max-width: 300px; // fallback for browsers which do not support "vw" unit
+ max-width: 100vw;
background-color: @odoo-tooltip-background-color;
color: @odoo-tooltip-color;
border-radius: @border-radius-base;
diff --git a/addons/web/static/test/evals.js b/addons/web/static/test/evals.js
index df58cab75d2..b6a3b4177e8 100644
--- a/addons/web/static/test/evals.js
+++ b/addons/web/static/test/evals.js
@@ -534,7 +534,7 @@ odoo.define_section('eval.edc.nonliterals', ['web.pyeval', 'web.session'], funct
var result = pyeval.sync_eval_domains_and_contexts({
domains: [
[['type', '=', 'contract']],
- { "__domains": [["|"], [["state", "in", ["open", "draft"]]], [["state", "=", "pending"]]],
+ { "__domains": [["|"], [["state", "in", ["open", "draft"]]], [["type", "=", "contract"], ["state", "=", "pending"]]],
"__eval_context": null,
"__ref": "compound_domain"
},
@@ -550,7 +550,8 @@ odoo.define_section('eval.edc.nonliterals', ['web.pyeval', 'web.session'], funct
assert.deepEqual(result.domain, [
["type", "=", "contract"],
"|", ["state", "in", ["open", "draft"]],
- ["state", "=", "pending"],
+ "&", ["type", "=", "contract"],
+ ["state", "=", "pending"],
"|",
"&", ["date", "!=", false],
["date", "<=", today],
diff --git a/addons/web_calendar/static/src/js/web_calendar.js b/addons/web_calendar/static/src/js/web_calendar.js
index 799bf2f567a..d44abbe4545 100644
--- a/addons/web_calendar/static/src/js/web_calendar.js
+++ b/addons/web_calendar/static/src/js/web_calendar.js
@@ -332,7 +332,7 @@ var CalendarView = View.extend({
self.proxy('update_record')(event._id, data);
},
eventRender: function (event, element, view) {
- element.find('.fc-event-title').html(event.title);
+ element.find('.fc-event-title').html(event.title + event.attendee_avatars);
},
eventAfterRender: function (event, element, view) {
if ((view.name !== 'month') && (((event.end-event.start)/60000)<=30)) {
@@ -633,7 +633,6 @@ var CalendarView = View.extend({
if (attendee_other.length>2) {
the_title_avatar += '<span class="o_attendee_head" title="' + attendee_other.slice(0, -2) + '">+</span>';
}
- the_title = the_title_avatar + the_title;
}
}
@@ -642,9 +641,10 @@ var CalendarView = View.extend({
date_stop = m_start.toDate();
}
var r = {
- 'start': moment(date_start).toISOString(),
- 'end': moment(date_stop).toISOString(),
+ 'start': moment(date_start).toString(),
+ 'end': moment(date_stop).toString(),
'title': the_title,
+ 'attendee_avatars': the_title_avatar,
'allDay': (this.fields[this.date_start].type == 'date' || (this.all_day && evt[this.all_day]) || false),
'id': evt.id,
'attendees':attendees
diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py
index 2b0af052c23..c50922bdce3 100644
--- a/addons/web_editor/models/ir_ui_view.py
+++ b/addons/web_editor/models/ir_ui_view.py
@@ -182,7 +182,7 @@ class IrUiView(models.Model):
"""
user_groups = set(self.env.user.groups_id)
views = self.with_context(active_test=False)._views_get(key, bundles=bundles)
- views = views.filtered(lambda v: user_groups.issuperset(v.groups_id))
+ views = views.filtered(lambda v: not v.groups_id or len(user_groups.intersection(v.groups_id)))
return views
@api.model
diff --git a/addons/web_editor/static/src/js/transcoder.js b/addons/web_editor/static/src/js/transcoder.js
index fa7b4023377..05068972532 100644
--- a/addons/web_editor/static/src/js/transcoder.js
+++ b/addons/web_editor/static/src/js/transcoder.js
@@ -131,7 +131,7 @@ var font_to_img = function ($editable) {
var icon, content;
_.find(widget.fontIcons, function (font) {
return _.find(widget.getCssSelectors(font.parser), function (css) {
- if ($font.is(css[0].replace(/::?before$/, ''))) {
+ if ($font.is(css[0].replace(/::?before/g, ''))) {
icon = css[2].split("-").shift();
content = css[1].match(/content:\s*['"]?(.)['"]?/)[1];
return true;
diff --git a/addons/web_editor/static/src/js/widgets.js b/addons/web_editor/static/src/js/widgets.js
index 0b634b45b36..44b6b9502d1 100644
--- a/addons/web_editor/static/src/js/widgets.js
+++ b/addons/web_editor/static/src/js/widgets.js
@@ -564,6 +564,7 @@ var getCssSelectors = function (filter) {
if (!data) {
data = [match[1], rules[r].cssText.replace(/(^.*\{\s*)|(\s*\}\s*$)/g, ''), clean, [clean]];
} else {
+ data[0] += (", " + match[1]);
data[3].push(clean);
}
}
diff --git a/addons/web_kanban/static/src/js/kanban_view.js b/addons/web_kanban/static/src/js/kanban_view.js
index 8c382caacf4..9cd35c687c9 100644
--- a/addons/web_kanban/static/src/js/kanban_view.js
+++ b/addons/web_kanban/static/src/js/kanban_view.js
@@ -230,7 +230,7 @@ var KanbanView = View.extend({
// fetch group data (display information)
var group_ids = _.without(_.map(groups, function (elem) { return elem.attributes.value[0];}), undefined);
- if (options.grouped_by_m2o && group_ids.length) {
+ if (options.grouped_by_m2o && group_ids.length && group_by_fields_to_read.length) {
return new data.DataSet(self, options.relation)
.read_ids(group_ids, _.union(['display_name'], group_by_fields_to_read))
.then(function(results) {
diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml
index 05faca8c2f6..74df06b10cb 100644
--- a/addons/website_forum/views/website_forum.xml
+++ b/addons/website_forum/views/website_forum.xml
@@ -566,9 +566,11 @@
<ul>
<li>Set a clear, explicit and concise question title
(check
- <a href="#" data-placement="top" data-trigger="focus" data-toggle="popover" data-content="Inventory Date Problem, Task remaining hours, Can you help solve solve my tax computation problem in Canada?" title="Click to get bad question samples">bad examples</a>
+ <t t-set="message_content_01">Inventory Date Problem, Task remaining hours, Can you help solve solve my tax computation problem in Canada?</t>
+ <a href="#" data-placement="top" data-trigger="focus" data-toggle="popover" t-att-data-content="message_content_01" title="Click to get bad question samples">bad examples</a>
and
- <a href="#" data-placement="bottom" data-trigger="focus" data-toggle="popover" data-content="How to create a physical inventory at an anterior date?, How is the 'remaining hours' field computed on tasks?, How to configure TPS and TVQ's canadian taxes?" title="Click to get good question titles">good examples</a>
+ <t t-set="message_content_02">How to create a physical inventory at an anterior date?, How is the 'remaining hours' field computed on tasks?, How to configure TPS and TVQ's canadian taxes?</t>
+ <a href="#" data-placement="bottom" data-trigger="focus" data-toggle="popover" t-att-data-content="message_content_02" title="Click to get good question titles">good examples</a>
),
</li>
<li>Avoid unnecessary introductions (Hi,... Please... Thanks...),</li>
diff --git a/addons/website_quote/models/sale_quote.py b/addons/website_quote/models/sale_quote.py
index 817df1e087c..e65f6ed905f 100644
--- a/addons/website_quote/models/sale_quote.py
+++ b/addons/website_quote/models/sale_quote.py
@@ -58,7 +58,7 @@ class SaleQuoteLine(models.Model):
def _onchange_product_id(self):
self.ensure_one()
if self.product_id:
- name = self.product_id.name
+ name = self.product_id.name_get()[0][1]
if self.product_id.description_sale:
name += '\n' + self.product_id.description_sale
self.name = name
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 75ff784675a..0c8b7629af0 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -530,17 +530,18 @@ class WebsiteSale(http.Controller):
@http.route(['/shop/address'], type='http', methods=['GET', 'POST'], auth="public", website=True)
def address(self, **kw):
Partner = request.env['res.partner'].with_context(show_address=1).sudo()
- order = request.website.sale_get_order(force_create=1)
+ order = request.website.sale_get_order()
+
+ redirection = self.checkout_redirection(order)
+ if redirection:
+ return redirection
+
mode = (False, False)
def_country_id = order.partner_id.country_id
values, errors = {}, {}
partner_id = int(kw.get('partner_id', -1))
- redirection = self.checkout_redirection(order)
- if redirection:
- return redirection
-
# IF PUBLIC ORDER
if order.partner_id.id == request.website.user_id.sudo().partner_id.id:
mode = ('new', 'billing')
diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py
index 7af22085041..7be62cd91d1 100644
--- a/addons/website_sale/models/sale_order.py
+++ b/addons/website_sale/models/sale_order.py
@@ -68,12 +68,18 @@ class SaleOrder(models.Model):
})
product = self.env['product.product'].with_context(product_context).browse(product_id)
+ pu = product.price
+ if order.pricelist_id and order.partner_id:
+ order_line = order._cart_find_product_line(product.id)
+ if order_line:
+ pu = self.env['account.tax']._fix_tax_included_price(order_line._get_display_price(product), product.taxes_id, order_line.tax_id)
+
return {
'product_id': product_id,
'product_uom_qty': qty,
'order_id': order_id,
'product_uom': product.uom_id.id,
- 'price_unit': product.price,
+ 'price_unit': pu,
}
@api.multi
@@ -144,10 +150,12 @@ class SaleOrder(models.Model):
# update line
values = self._website_product_id_change(self.id, product_id, qty=quantity)
-
-
if self.pricelist_id.discount_policy == 'with_discount' and not self.env.context.get('fixed_price'):
- values['price_unit'] = order_line._get_display_price(order_line.product_id)
+ values['price_unit'] = self.env['account.tax']._fix_tax_included_price(
+ order_line._get_display_price(order_line.product_id),
+ order_line.product_id.taxes_id,
+ order_line.tax_id
+ )
order_line.write(values)