diff options
217 files changed, 6042 insertions, 2840 deletions
diff --git a/.tx/config b/.tx/config index 01696fa99b7..3a276d80eb4 100644 --- a/.tx/config +++ b/.tx/config @@ -682,9 +682,9 @@ file_filter = addons/stock_landed_costs/i18n/<lang>.po source_file = addons/stock_landed_costs/i18n/stock_landed_costs.pot source_lang = en -[odoo-master.stock_picking_wave] -file_filter = addons/stock_picking_wave/i18n/<lang>.po -source_file = addons/stock_picking_wave/i18n/stock_picking_wave.pot +[odoo-master.stock_picking_batch] +file_filter = addons/stock_picking_batch/i18n/<lang>.po +source_file = addons/stock_picking_batch/i18n/stock_picking_batch.pot source_lang = en [odoo-master.survey] diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 825588aceba..3cc8ae14a7f 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -355,22 +355,19 @@ class AccountInvoice(models.Model): has_outstanding = fields.Boolean(compute='_get_outstanding_info_JSON', groups="account.group_account_invoice") #fields use to set the sequence, on the first invoice of the journal - sequence_number_next = fields.Char(string='Next Number', compute="_get_sequence_prefix", inverse="_set_sequence_next") + sequence_number_next = fields.Char(string='Next Number', compute="_get_sequence_number_next", inverse="_set_sequence_next") sequence_number_next_prefix = fields.Char(string='Next Number', compute="_get_sequence_prefix") _sql_constraints = [ ('number_uniq', 'unique(number, company_id, journal_id, type)', 'Invoice Number must be unique per Company!'), ] - def _compute_portal_url(self): - super(AccountInvoice, self)._compute_portal_url() - for order in self: - order.portal_url = '/my/invoices/%s' % (order.id) - - def _no_existing_validated_invoice(self): + def _get_seq_number_next_stuff(self): self.ensure_one() + journal_sequence = self.journal_id.sequence_id if self.journal_id.refund_sequence: domain = [('type', '=', self.type)] + journal_sequence = self.type in ['in_refund', 'out_refund'] and self.journal_id.refund_sequence_id or self.journal_id.sequence_id elif self.type in ['in_invoice', 'in_refund']: domain = [('type', 'in', ['in_invoice', 'in_refund'])] else: @@ -378,11 +375,16 @@ class AccountInvoice(models.Model): if self.id: domain += [('id', '<>', self.id)] domain += [('journal_id', '=', self.journal_id.id), ('state', 'not in', ['draft', 'cancel'])] - return not self.search(domain, limit=1) + return journal_sequence, domain + + def _compute_portal_url(self): + super(AccountInvoice, self)._compute_portal_url() + for order in self: + order.portal_url = '/my/invoices/%s' % (order.id) @api.depends('state', 'journal_id', 'date_invoice') def _get_sequence_prefix(self): - """ computes the number that will be assigned to the first invoice/bill/refund of a journal, in order to + """ computes the prefix of the number that will be assigned to the first invoice/bill/refund of a journal, in order to let the user manually change it. """ if not self.env.user._is_admin(): @@ -391,18 +393,25 @@ class AccountInvoice(models.Model): invoice.sequence_number_next = '' return for invoice in self: - if invoice.journal_id.refund_sequence: - journal_sequence = invoice.type in ['in_refund', 'out_refund'] and invoice.journal_id.refund_sequence_id or invoice.journal_id.sequence_id + journal_sequence, domain = invoice._get_seq_number_next_stuff() + if (invoice.state == 'draft') and not self.search(domain, limit=1): + prefix, dummy = journal_sequence.with_context(ir_sequence_date=invoice.date_invoice, + ir_sequence_date_range=invoice.date_invoice)._get_prefix_suffix() + invoice.sequence_number_next_prefix = prefix else: - journal_sequence = invoice.journal_id.sequence_id + invoice.sequence_number_next_prefix = False - if (invoice.state == 'draft') and self._no_existing_validated_invoice(): - prefix, dummy = journal_sequence.with_context(ir_sequence_date=invoice.date_invoice)._get_prefix_suffix() - invoice.sequence_number_next_prefix = prefix + @api.depends('state', 'journal_id') + def _get_sequence_number_next(self): + """ computes the number that will be assigned to the first invoice/bill/refund of a journal, in order to + let the user manually change it. + """ + for invoice in self: + journal_sequence, domain = invoice._get_seq_number_next_stuff() + if (invoice.state == 'draft') and not self.search(domain, limit=1): number_next = journal_sequence._get_current_sequence().number_next_actual invoice.sequence_number_next = '%%0%sd' % journal_sequence.padding % number_next else: - invoice.sequence_number_next_prefix = False invoice.sequence_number_next = '' @api.multi diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 184bad0184c..21d1fad78d6 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -627,19 +627,40 @@ class AccountMoveLine(models.Model): @api.model def get_reconciliation_proposition(self, account_id, partner_id=False): """ Returns two lines whose amount are opposite """ + + target_currency = (self.currency_id and self.amount_currency) and self.currency_id or self.company_id.currency_id + partner_id_condition = partner_id and 'AND a.partner_id = %(partner_id)s' or '' + rec_prop = self.env['account.move.line'] # Get pairs - partner_id_condition = partner_id and 'AND a.partner_id = %(partner_id)s AND b.partner_id = %(partner_id)s' or '' - query = """ - SELECT a.id, b.id - FROM account_move_line a, account_move_line b - WHERE a.amount_residual = -b.amount_residual - AND NOT a.reconciled AND NOT b.reconciled - AND a.account_id = %(account_id)s AND b.account_id = %(account_id)s - {partner_id_condition} - ORDER BY a.date desc - LIMIT 10 - """.format(**locals()) + move_line_id = self.env.context.get('move_line_id', False) + if move_line_id: + move_line = self.env['account.move.line'].browse(move_line_id) + amount = move_line.amount_residual; + rec_prop = move_line + query = """ + SELECT a.id, a.id FROM account_move_line a + WHERE a.amount_residual = -%(amount)s + AND NOT a.reconciled + AND a.account_id = %(account_id)s + AND a.id != %(move_line_id)s + {partner_id_condition} + ORDER BY a.date desc + LIMIT 10 + """.format(**locals()) + else: + partner_id_condition = partner_id_condition and partner_id_condition+' AND b.partner_id = %(partner_id)s' or '' + query = """ + SELECT a.id, b.id + FROM account_move_line a, account_move_line b + WHERE a.amount_residual = -b.amount_residual + AND NOT a.reconciled AND NOT b.reconciled + AND a.account_id = %(account_id)s AND b.account_id = %(account_id)s + {partner_id_condition} + ORDER BY a.date desc + LIMIT 10 + """.format(**locals()) + self.env.cr.execute(query, locals()) pairs = self.env.cr.fetchall() @@ -648,11 +669,12 @@ class AccountMoveLine(models.Model): allowed_ids = set(self.env['account.move.line'].browse(all_pair_ids).ids) pairs = [pair for pair in pairs if pair[0] in allowed_ids and pair[1] in allowed_ids] - # Return lines formatted if len(pairs) > 0: - target_currency = (self.currency_id and self.amount_currency) and self.currency_id or self.company_id.currency_id - lines = self.browse(list(pairs[0])) - return lines.prepare_move_lines_for_reconciliation_widget(target_currency=target_currency) + rec_prop += self.browse(list(set(pairs[0]))) + + if len(rec_prop) > 0: + # Return lines formatted + return rec_prop.prepare_move_lines_for_reconciliation_widget(target_currency=target_currency) return [] @api.model diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py index d43d767ee69..4bae1793ddd 100644 --- a/addons/account/models/account_payment.py +++ b/addons/account/models/account_payment.py @@ -298,11 +298,18 @@ class account_payment(models.Model): def open_payment_matching_screen(self): # Open reconciliation view for customers/suppliers - action_context = {'show_mode_selector': False, 'company_ids': [self.company_id.id], 'partner_ids': [self.partner_id.commercial_partner_id.id]} + move_line_id = False + for move_line in self.move_line_ids: + if move_line.account_id.reconcile: + move_line_id = move_line.id + break; + action_context = {'company_ids': [self.company_id.id], 'partner_ids': [self.partner_id.commercial_partner_id.id]} if self.partner_type == 'customer': action_context.update({'mode': 'customers'}) elif self.partner_type == 'supplier': action_context.update({'mode': 'suppliers'}) + if move_line_id: + action_context.update({'move_line_id': move_line_id}) return { 'type': 'ir.actions.client', 'tag': 'manual_reconciliation_view', diff --git a/addons/account/static/src/js/reconciliation/reconciliation_action.js b/addons/account/static/src/js/reconciliation/reconciliation_action.js index 8763d5acaa1..fabfee1ad00 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_action.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_action.js @@ -201,7 +201,10 @@ var StatementAction = Widget.extend(ControlPanelMixin, { _.each(self.model.lines, function (line, _handle) { if (line.mode !== 'inactive' && _handle !== handle) { self.model.changeMode(_handle, 'inactive'); - self._getWidget(_handle).update(line); + var widget = self._getWidget(_handle); + if (widget) { + widget.update(line); + } } }); } diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js index 019e761f3d3..864037a65ef 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_model.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js @@ -1061,6 +1061,7 @@ var ManualModel = StatementModel.extend({ model: 'account.move.line', method: 'get_data_for_manual_reconciliation', args: args, + context: context, }) .then(function (result) { var defs = _.map(result, self._formatLine.bind(self, context.mode)); @@ -1073,6 +1074,7 @@ var ManualModel = StatementModel.extend({ model: 'account.move.line', method: 'get_data_for_manual_reconciliation', args: ['account', self.account_ids], + context: context, }) .then(function (result) { var defs = _.map(result, self._formatLine.bind(self, 'accounts')); @@ -1091,6 +1093,7 @@ var ManualModel = StatementModel.extend({ model: 'account.move.line', method: 'get_data_for_manual_reconciliation_widget', args: [partner_ids, account_ids], + context: context, }) .then(function (result) { var defs = _.map(result.accounts, self._formatLine.bind(self, 'accounts')); @@ -1269,6 +1272,10 @@ var ManualModel = StatementModel.extend({ this._super(line, props); if (props.length) { _.each(props, function (prop) { + var tmp_value = prop.debit || prop.credit; + prop.credit = prop.credit !== 0 ? 0 : tmp_value; + prop.debit = prop.debit !== 0 ? 0 : tmp_value; + prop.amount = -prop.amount; prop.journal_id = self._formatNameGet(prop.journal_id || line.journal_id); }); } diff --git a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js index 2530a6043c2..d9f1f8ad5a4 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js @@ -260,10 +260,13 @@ var LineRenderer = Widget.extend(FieldManagerMixin, { 'click .accounting_view .line_info_button.fa-exclamation-triangle': '_onTogglePartialReconcile', 'click .reconcile_model_create': '_onCreateReconcileModel', 'click .reconcile_model_edit': '_onEditReconcileModel', + 'keyup input': '_onInputKeyup', + 'blur input': '_onInputKeyup', }, custom_events: _.extend({}, FieldManagerMixin.custom_events, { 'field_changed': '_onFieldChanged', }), + _avoidFieldUpdate: {}, /** * create partner_id field in editable mode @@ -407,6 +410,7 @@ var LineRenderer = Widget.extend(FieldManagerMixin, { this.model.notifyChanges(this.handleCreateRecord, state.createForm); var record = this.model.get(this.handleCreateRecord); _.each(this.fields, function (field, fieldName) { + if (self._avoidFieldUpdate[fieldName]) return; if (fieldName === "partner_id") return; if ((data[fieldName] || state.createForm[fieldName]) && !_.isEqual(state.createForm[fieldName], data[fieldName])) { field.reset(record); @@ -600,6 +604,32 @@ var LineRenderer = Widget.extend(FieldManagerMixin, { }, /** * @private + * @param {keyup event} event + */ + _onInputKeyup: function (event) { + if(event.keyCode === 13) { + if (_.findWhere(this.model.lines, {mode: 'create'}).balance.amount) { + this._onCreateProposition(); + } + return; + } + + var self = this; + for (var fieldName in this.fields) { + var field = this.fields[fieldName]; + if (!field.$el.is(event.target)) { + continue; + } + this._avoidFieldUpdate[field.name] = event.type !== 'focusout'; + field.value = false; + field._setValue($(event.target).val()).then(function () { + self._avoidFieldUpdate[field.name] = false; + }); + break; + } + }, + /** + * @private */ _onPrevious: function () { this.trigger_up('change_offset', {'data': -5}); diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js index 511656906d9..cdf32c4010e 100644 --- a/addons/account/static/tests/reconciliation_tests.js +++ b/addons/account/static/tests/reconciliation_tests.js @@ -995,9 +995,9 @@ QUnit.module('account', { " Agrolait 101200 ", "should display the partner and the account code as title"); - assert.strictEqual(clientAction.$('.o_reconciliation_line:first .match tr:first .cell_left').text(), + assert.strictEqual(clientAction.$('.o_reconciliation_line:first .match tr:first .cell_right').text(), "$ 11,000.00", "sould display the line in $"); - assert.strictEqual(clientAction.$('.o_reconciliation_line:first .match tr:first .cell_left .o_multi_currency').data('content'), + assert.strictEqual(clientAction.$('.o_reconciliation_line:first .match tr:first .cell_right .o_multi_currency').data('content'), "10,222.00 €", "sould display the monetary information in €"); assert.strictEqual(clientAction.$('.accounting_view:first .o_no_valid:visible').length, 1, "should display the skip button"); @@ -1005,7 +1005,6 @@ QUnit.module('account', { clientAction.destroy(); }); - QUnit.test('Reconciliation pager', function (assert) { assert.expect(6); @@ -1219,9 +1218,11 @@ QUnit.module('account', { assert.strictEqual(clientAction.$('.o_reconciliation_line').length, 10, "should display 10 lines"); assert.strictEqual(clientAction.$('.js_load_more:visible').length, 1, "should display the load more button"); + clientAction.$('.accounting_view:has(.o_reconcile:visible) thead .cell_action').click(); clientAction.$('.o_reconcile:visible').click(); assert.strictEqual(clientAction.$('.o_reconcile:visible').length, 0, "should remove the reconciled line"); assert.strictEqual(clientAction.$('.o_reconciliation_line').length, 10, "should load one line to complete the 10"); + clientAction.$('thead .cell_action:eq(1)').click(); clientAction.$('.js_load_more').click(); assert.strictEqual(clientAction.$('.o_reconciliation_line').length, 11, "should load the last record"); assert.strictEqual(clientAction.$('.js_load_more:visible').length, 0, "should hide the load more button"); diff --git a/addons/barcodes/static/src/js/barcode_events.js b/addons/barcodes/static/src/js/barcode_events.js index 04c03a41308..0f13c59fe66 100644 --- a/addons/barcodes/static/src/js/barcode_events.js +++ b/addons/barcodes/static/src/js/barcode_events.js @@ -77,13 +77,7 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { 'bubbles': old_event.bubbles, 'cancelable': old_event.cancelable, }; - try { - new_event = new Event("keypress", params); - } catch(error) { - // For IE >= 9, use new CustomEvent(), instead of new Event() - new_event = new CustomEvent("keypress", params); - } - + new_event = $.Event('keypress', params); new_event.viewArg = old_event.viewArg; new_event.ctrl = old_event.ctrl; new_event.alt = old_event.alt; @@ -96,7 +90,7 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { new_event.which = old_event.which; new_event.dispatched_by_barcode_reader = true; - old_event.target.dispatchEvent(new_event); + $(old_event.target).trigger(new_event); } } }, @@ -173,17 +167,17 @@ var BarcodeEvents = core.Class.extend(mixins.PropertiesMixin, { }, start: function(prevent_key_repeat){ - document.body.addEventListener('keypress', this.__handler, true); + $('body').bind("keypress", this.__handler); if (prevent_key_repeat === true) { - document.body.addEventListener('keydown', this.__keydown_handler, true); - document.body.addEventListener('keyup', this.__keyup_handler, true); + $('body').bind("keydown", this.__keydown_handler); + $('body').bind('keyup', this.__keyup_handler); } }, stop: function(){ - document.body.removeEventListener('keypress', this.__handler, true); - document.body.removeEventListener('keydown', this.__keydown_handler, true); - document.body.removeEventListener('keyup', this.__keyup_handler, true); + $('body').unbind("keypress", this.__handler); + $('body').unbind("keydown", this.__keydown_handler); + $('body').unbind('keyup', this.__keyup_handler); }, }); diff --git a/addons/barcodes/static/src/js/barcode_field.js b/addons/barcodes/static/src/js/barcode_field.js index aa31b4d8261..7b9b29aa4c8 100644 --- a/addons/barcodes/static/src/js/barcode_field.js +++ b/addons/barcodes/static/src/js/barcode_field.js @@ -8,12 +8,12 @@ var fieldRegistry = require('web.field_registry'); // Field in which the user can both type normally and scan barcodes var FieldFloatScannable = basicFields.FieldFloat.extend({ - events: { + events: _.extend({}, basicFields.FieldFloat.prototype.events, { // The barcode_events component intercepts keypresses and releases them when it // appears they are not part of a barcode. But since released keypresses don't // trigger native behaviour (like characters input), we must simulate it. 'keypress': '_onKeypress', - }, + }), //-------------------------------------------------------------------------- // Private @@ -40,9 +40,8 @@ var FieldFloatScannable = basicFields.FieldFloat.extend({ */ _onKeypress: function (e) { /* only simulate a keypress if it has been previously prevented */ - if (e.originalEvent.dispatched_by_barcode_reader !== true) { + if (e.dispatched_by_barcode_reader !== true) { e.preventDefault(); - this.$input.blur(); return; } var character = String.fromCharCode(e.which); @@ -52,23 +51,12 @@ var FieldFloatScannable = basicFields.FieldFloat.extend({ e.target.value = str_before_carret + character + str_after_carret; var new_carret_index = str_before_carret.length + character.length; e.target.setSelectionRange(new_carret_index, new_carret_index); - // Note: FieldChar (that FieldFloat extends) calls store_dom_value upon change - // event, which is triggered when the input loses focus and its internal dirty - // flag is set. But here, we directly modify the value property of the input, - // which doesn't set the dirty flag. So we could call store_dom_value upon blur. - // But we also want the DOM value to be stored when a barcode_event occurs and - // triggers an onchange. We could listen to barcode_event in order to call - // store_dom_value, but that would have to happen before the onchange is triggered. - // So the safest method is still to store the value each time it changes. - // This long explanation is here to avoid having to do the thinking all over agan - // in case this strategy doesn't work / breaks. - // TL;DR Safest way not to lose the value when a barcode scan triggers an onchange. - this._setValue(e.target.value); + // trigger an 'input' event to notify the widget that it's value changed + $(e.target).trigger('input'); }, }); // Field to use scan barcodes - var FormViewBarcodeHandler = AbstractField.extend({ /** * @override @@ -78,8 +66,6 @@ var FormViewBarcodeHandler = AbstractField.extend({ this.trigger_up('activeBarcode', { name: this.name, - fieldName: 'pack_operation_product_ids', - quantity: 'qty_done', commands: { barcode: '_barcodeAddX2MQuantity', } diff --git a/addons/barcodes/static/src/js/barcode_form_view.js b/addons/barcodes/static/src/js/barcode_form_view.js index 73df8a3c03f..da90b198352 100644 --- a/addons/barcodes/static/src/js/barcode_form_view.js +++ b/addons/barcodes/static/src/js/barcode_form_view.js @@ -26,19 +26,23 @@ FormController.include({ this.activeBarcode = { form_view: { commands: { - 'O-CMD.NEW': 'createRecord', - 'O-CMD.EDIT': 'toEditMode', - 'O-CMD.CANCEL': 'discardChange', - 'O-CMD.SAVE': function () { return this.saveRecord({reload: true}); }, - // 'O-CMD.PAGER-PREV': - // 'O-CMD.PAGER-NEXT': - } - } + 'O-CMD.EDIT': this._barcodeEdit.bind(this), + 'O-CMD.CANCEL': this._barcodeDiscard.bind(this), + 'O-CMD.SAVE': this._barcodeSave.bind(this), + 'O-CMD.PAGER-PREV': this._barcodePagerPrevious.bind(this), + 'O-CMD.PAGER-NEXT': this._barcodePagerNext.bind(this), + 'O-CMD.PAGER-FIRST': this._barcodePagerFirst.bind(this), + 'O-CMD.PAGER-LAST': this._barcodePagerLast.bind(this), + }, + }, }; this.barcodeMutex = new concurrency.Mutex(); this._barcodeStartListening(); }, + /** + * @override + */ destroy: function () { this._barcodeStopListening(); this._super(); @@ -71,6 +75,55 @@ FormController.include({ }, /** * @private + */ + _barcodeDiscard: function () { + return this.discardChanges(); + }, + /** + * @private + */ + _barcodeEdit: function () { + return this._setMode('edit'); + }, + /** + * @private + */ + _barcodePagerFirst: function () { + var self = this; + return this.mutex.exec(function () {}).then(function () { + self.pager.updateState({ + current_min: 1, + }, {notifyChange: true}); + }); + }, + /** + * @private + */ + _barcodePagerLast: function () { + var self = this; + return this.mutex.exec(function () {}).then(function () { + var state = self.model.get(self.handle, {raw: true}); + self.pager.updateState({ + current_min: state.count, + }, {notifyChange: true}); + }); + }, + /** + * @private + */ + _barcodePagerNext: function () { + return this.mutex.exec(function () {}).then(this.pager.next.bind(this.pager)); + }, + /** + * @private + */ + _barcodePagerPrevious: function () { + return this.mutex.exec(function () {}).then(this.pager.previous.bind(this.pager)); + }, + /** + * Returns true iff the given barcode matches the given record (candidate). + * + * @private * @param {Object} candidate: record in the x2m * @param {string} barcode sent by the scanner (string generate from keypress series) * @param {Object} activeBarcode: options sent by the field who use barcode features @@ -81,6 +134,12 @@ FormController.include({ }, /** * @private + */ + _barcodeSave: function () { + return this.saveRecord(); + }, + /** + * @private * @param {Object} candidate: record in the x2m * @param {Object} current record * @param {string} barcode sent by the scanner (string generate from keypress series) @@ -89,8 +148,14 @@ FormController.include({ */ _barcodeSelectedCandidate: function (candidate, record, barcode, activeBarcode) { var changes = {}; - changes[activeBarcode.quantity] = candidate.data[activeBarcode.quantity] + 1; - return this.model.notifyChanges(candidate.id, changes); + var candidateChanges = {}; + candidateChanges[activeBarcode.quantity] = candidate.data[activeBarcode.quantity] + 1; + changes[activeBarcode.fieldName] = { + operation: 'UPDATE', + id: candidate.id, + data: candidateChanges, + }; + return this.model.notifyChanges(this.handle, changes); }, /** * @private @@ -99,7 +164,6 @@ FormController.include({ core.bus.on('barcode_scanned', this, this._barcodeScanned); core.bus.on('keypress', this, this._quantityListener); }, - /** * @private */ @@ -128,7 +192,7 @@ FormController.include({ */ _getBarCodeRecord: function (record, barcode, activeBarcode) { var self = this; - if (!activeBarcode.fieldName) { + if (!activeBarcode.fieldName || !record.data[activeBarcode.fieldName]) { return; } return _.find(record.data[activeBarcode.fieldName].data, function (record) { @@ -167,6 +231,10 @@ FormController.include({ candidate: this.activeBarcode[name] && this.activeBarcode[name].handle === this.handle ? this.activeBarcode[name].candidate : null, }; + + // we want to disable autofocus when activating the barcode to avoid + // putting the scanned value in the focused field + this.disableAutofocus = true; }, /** * @private @@ -232,8 +300,13 @@ FormController.include({ if (prefixed && !hasCommand) { self.do_warn(_t('Error : Barcode command is undefined'), barcode); } - return $.when.apply($, defs).then(function () { - self.update({}, {reload: false}); + return self.alive($.when.apply($, defs)).then(function () { + if (!prefixed) { + // redraw the view if we scanned a real barcode (required if + // we manually apply the change in JS, e.g. incrementing the + // quantity) + self.update({}, {reload: false}); + } }); }); }, @@ -321,8 +394,6 @@ FormRenderer.include({ commands['O-BTN.' + node.attrs.barcode_trigger] = function () { if (!$button.hasClass('o_invisible_modifier')) { $button.click(); - } else { - this.do_warn(_t('Action currently unavailable')); } return $.when(); }; @@ -361,6 +432,21 @@ FormRenderer.include({ } return $button; }, + /** + * Add barcode event handler + * + * @override + * @private + * @param {Object} node + * @returns {jQueryElement} + */ + _renderTagButton: function (node) { + var $button = this._super.apply(this, arguments); + if (node.attrs.barcode_trigger) { + this._barcodeButtonHandler($button, node); + } + return $button; + } }); BarcodeEvents.ReservedBarcodePrefixes.push('O-BTN'); diff --git a/addons/barcodes/static/tests/barcode_tests.js b/addons/barcodes/static/tests/barcode_tests.js new file mode 100644 index 00000000000..7487972ea62 --- /dev/null +++ b/addons/barcodes/static/tests/barcode_tests.js @@ -0,0 +1,406 @@ +odoo.define('barcodes.tests', function (require) { +"use strict"; + +var barcodeEvents = require('barcodes.BarcodeEvents'); + +var AbstractField = require('web.AbstractField'); +var fieldRegistry = require('web.field_registry'); +var FormController = require('web.FormController'); +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; +var triggerKeypressEvent = testUtils.triggerKeypressEvent; + +QUnit.module('Barcodes', { + beforeEach: function () { + this.data = { + order: { + fields: { + _barcode_scanned: {string: 'Barcode scanned', type: 'char'}, + line_ids: {string: 'Order lines', type: 'one2many', relation: 'order_line'}, + }, + records: [ + {id: 1, line_ids: [1, 2]}, + ], + }, + order_line: { + fields: { + product_id: {string: 'Product', type: 'many2one', relation: 'product'}, + product_barcode: {string: 'Product Barcode', type: 'char'}, + quantity: {string: 'Quantity', type: 'integer'}, + }, + records: [ + {id: 1, product_id: 1, quantity: 0, product_barcode: '1234567890'}, + {id: 2, product_id: 2, quantity: 0, product_barcode: '0987654321'}, + ], + }, + product: { + fields: { + name: {string : "Product name", type: "char"}, + int_field: {string : "Integer", type: "integer"}, + barcode: {string: "Barcode", type: "char"}, + }, + records: [ + {id: 1, name: "iPad Mini", barcode: '1234567890'}, + {id: 2, name: "Mouse, Optical", barcode: '0987654321'}, + ], + }, + }; + } +}); + +QUnit.test('Button with barcode_trigger', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form>' + + '<header>' + + '<button name="do_something" string="Validate" type="object" barcode_trigger="doit"/>' + + '<button name="do_something_else" string="Validate" type="object" invisible="1" barcode_trigger="dothat"/>' + + '</header>' + + '</form>', + res_id: 2, + intercepts: { + execute_action: function (event) { + assert.strictEqual(event.data.action_data.name, 'do_something', + "do_something method call verified"); + }, + warning: function () { + assert.step('warn'); + }, + }, + }); + + // O-BTN.doit + _.each(['O','-','B','T','N','.','d','o','i','t','Enter'], triggerKeypressEvent); + // O-BTN.dothat (should not call execute_action as the button isn't visible) + _.each(['O','-','B','T','N','.','d','o','t','h','a','t','Enter'], triggerKeypressEvent); + + assert.verifySteps([], "no warning should be displayed"); + + form.destroy(); +}); + +QUnit.test('edit, save and cancel buttons', function (assert) { + assert.expect(6); + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form><field name="display_name"/></form>', + mockRPC: function (route, args) { + if (args.method === 'write') { + assert.step('save'); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + }); + + // O-CMD.EDIT + _.each(["O","-","C","M","D",".","E","D","I","T","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$(".o_form_editable").length, 1, + "should have switched to 'edit' mode"); + // dummy change to check that it actually saves + form.$('.o_field_widget').val('test').trigger('input'); + // O-CMD.SAVE + _.each(["O","-","C","M","D",".","S","A","V","E","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$(".o_form_readonly").length, 1, + "should have switched to 'readonly' mode"); + assert.verifySteps(['save'], 'should have saved'); + + // O-CMD.EDIT + _.each(["O","-","C","M","D",".","E","D","I","T","Enter"], triggerKeypressEvent); + // dummy change to check that it correctly discards + form.$('.o_field_widget').val('test').trigger('input'); + // O-CMD.CANCEL + _.each(["O","-","C","M","D",".","C","A","N","C","E","L","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$(".o_form_readonly").length, 1, + "should have switched to 'readonly' mode"); + assert.verifySteps(['save'], 'should not have saved'); + + form.destroy(); +}); + +QUnit.test('pager buttons', function (assert) { + assert.expect(5); + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form><field name="display_name"/></form>', + res_id: 1, + viewOptions: { + ids: [1, 2], + index: 0, + }, + }); + + assert.strictEqual(form.$('.o_field_widget').text(), 'iPad Mini'); + // O-CMD.PAGER-NEXT + _.each(["O","-","C","M","D",".","P","A","G","E","R","-","N","E","X","T","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$('.o_field_widget').text(), 'Mouse, Optical'); + // O-CMD.PAGER-PREV + _.each(["O","-","C","M","D",".","P","A","G","E","R","-","P","R","E","V","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$('.o_field_widget').text(), 'iPad Mini'); + // O-CMD.PAGER-LAST + _.each(["O","-","C","M","D",".","P","A","G","E","R","-","L","A","S","T","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$('.o_field_widget').text(), 'Mouse, Optical'); + // O-CMD.PAGER-FIRST + _.each(["O","-","C","M","D",".","P","A","G","E","R","-","F","I","R","S","T","Enter"], triggerKeypressEvent); + assert.strictEqual(form.$('.o_field_widget').text(), 'iPad Mini'); + + form.destroy(); +}); + +QUnit.test('do no update form twice after a command barcode scanned', function (assert) { + assert.expect(7); + + var delay = barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms; + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = 0; + var formUpdate = FormController.prototype.update; + FormController.prototype.update = function () { + assert.step('update'); + return formUpdate.apply(this, arguments); + }; + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form>' + + '<field name="display_name"/>' + + '<field name="int_field" widget="field_float_scannable"/>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'read') { + assert.step('read'); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: { + ids: [1, 2], + index: 0, + }, + }); + + assert.verifySteps(['read'], "update should not have been called yet"); + + // switch to next record + _.each(["O","-","C","M","D",".","P","A","G","E","R","-","N","E","X","T","Enter"], triggerKeypressEvent); + // a first update is done to reload the data (thus followed by a read), but + // update shouldn't be called afterwards + assert.verifySteps(['read', 'update', 'read']); + + _.each(['5','4','3','9','8','2','6','7','1','2','5','2','Enter'], triggerKeypressEvent); + // a real barcode has been scanned -> an update should be requested (with + // option reload='false', so it isn't followed by a read) + assert.verifySteps(['read', 'update', 'read', 'update']); + + form.destroy(); + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay; + FormController.prototype.update = formUpdate; +}); + +QUnit.test('widget field_float_scannable', function (assert) { + var done = assert.async(); + assert.expect(11); + + var delay = barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms; + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = 0; + + this.data.product.records[0].int_field = 4; + this.data.product.onchanges = { + int_field: function () {}, + }; + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form>' + + '<field name="display_name"/>' + + '<field name="int_field" widget="field_float_scannable"/>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'onchange') { + assert.step('onchange'); + assert.strictEqual(args.args[1].int_field, 426, + "should send correct value for int_field"); + } + return this._super.apply(this, arguments); + }, + fieldDebounce: 1000, + res_id: 1, + }); + + assert.strictEqual(form.$('.o_field_widget[name=int_field]').text(), '4', + "should display the correct value in readonly"); + + form.$buttons.find('.o_form_button_edit').click(); + + assert.strictEqual(form.$('.o_field_widget[name=int_field]').val(), '4', + "should display the correct value in edit"); + + // simulates keypress events in the input to replace 0.00 by 26 (should not trigger onchanges) + form.$('.o_field_widget[name=int_field]').focus(); + assert.strictEqual(form.$('.o_field_widget[name=int_field]').get(0), document.activeElement, + "int field should be focused"); + form.$('.o_field_widget[name=int_field]').trigger({type: 'keypress', which: 50, keyCode: 50}); // 2 + assert.strictEqual(form.$('.o_field_widget[name=int_field]').get(0), document.activeElement, + "int field should still be focused"); + form.$('.o_field_widget[name=int_field]').trigger({type: 'keypress', which: 54, keyCode: 54}); // 6 + assert.strictEqual(form.$('.o_field_widget[name=int_field]').get(0), document.activeElement, + "int field should still be focused"); + + setTimeout(function () { + assert.strictEqual(form.$('.o_field_widget[name=int_field]').val(), '426', + "should display the correct value in edit"); + assert.strictEqual(form.$('.o_field_widget[name=int_field]').get(0), document.activeElement, + "int field should still be focused"); + + assert.verifySteps([], 'should not have done any onchange RPC'); + + form.$('.o_field_widget[name=int_field]').trigger('change'); // should trigger the onchange + + assert.verifySteps(['onchange'], 'should have done the onchange RPC'); + + form.destroy(); + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay; + done(); + }); +}); + +QUnit.test('widget barcode_handler', function (assert) { + assert.expect(4); + + var delay = barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms; + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = 0; + + this.data.product.fields.barcode_scanned = {string : "Scanned barcode", type: "char"}; + this.data.product.onchanges = { + barcode_scanned: function (obj) { + // simulate an onchange that increment the int_field value + // at each barcode scanned + obj.int_field = obj.int_field + 1; + }, + }; + + var form = createView({ + View: FormView, + model: 'product', + data: this.data, + arch: '<form>' + + '<field name="display_name"/>' + + '<field name="int_field"/>' + + '<field name="barcode_scanned" widget="barcode_handler" invisible="1"/>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'onchange') { + assert.step('onchange'); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + assert.strictEqual(form.$('.o_field_widget[name=int_field]').val(), '0', + "initial value should be correct"); + + _.each(['5','4','3','9','8','2','6','7','1','2','5','2','Enter'], triggerKeypressEvent); + assert.strictEqual(form.$('.o_field_widget[name=int_field]').val(), '1', + "value should have been incremented"); + + assert.verifySteps(['onchange'], "an onchange should have been done"); + + form.destroy(); + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay; +}); + +QUnit.test('specification of widget barcode_handler', function (assert) { + assert.expect(5); + + var delay = barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms; + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = 0; + + // Define a specific barcode_handler widget for this test case + var TestBarcodeHandler = AbstractField.extend({ + init: function () { + this._super.apply(this, arguments); + + this.trigger_up('activeBarcode', { + name: 'test', + fieldName: 'line_ids', + quantity: 'quantity', + commands: { + barcode: '_barcodeAddX2MQuantity', + } + }); + }, + }); + fieldRegistry.add('test_barcode_handler', TestBarcodeHandler); + + var form = createView({ + View: FormView, + model: 'order', + data: this.data, + arch: '<form>' + + '<field name="_barcode_scanned" widget="test_barcode_handler"/>' + + '<field name="line_ids">' + + '<tree>' + + '<field name="product_id"/>' + + '<field name="product_barcode" invisible="1"/>' + + '<field name="quantity"/>' + + '</tree>' + + '</field>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'onchange') { + assert.notOK(true, "should not do any onchange RPC"); + } + if (args.method === 'write') { + assert.deepEqual(args.args[1].line_ids, [ + [1, 1, {quantity: 2}], [1, 2, {quantity: 1}], + ], "should have generated the correct commands"); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + assert.strictEqual(form.$('.o_data_row').length, 2, + "one2many should contain 2 rows"); + + // scan twice product 1 + _.each(['1','2','3','4','5','6','7','8','9','0','Enter'], triggerKeypressEvent); + assert.strictEqual(form.$('.o_data_row:first .o_data_cell:nth(1)').text(), '1', + "quantity of line one should have been incremented"); + _.each(['1','2','3','4','5','6','7','8','9','0','Enter'], triggerKeypressEvent); + assert.strictEqual(form.$('.o_data_row:first .o_data_cell:nth(1)').text(), '2', + "quantity of line one should have been incremented"); + + // scan once product 2 + _.each(['0','9','8','7','6','5','4','3','2','1','Enter'], triggerKeypressEvent); + assert.strictEqual(form.$('.o_data_row:nth(1) .o_data_cell:nth(1)').text(), '1', + "quantity of line one should have been incremented"); + + form.$buttons.find('.o_form_button_save').click(); + + form.destroy(); + barcodeEvents.BarcodeEvents.max_time_between_keys_in_ms = delay; + delete fieldRegistry.map.test_barcode_handler; +}); +}); diff --git a/addons/barcodes/views/barcodes_templates.xml b/addons/barcodes/views/barcodes_templates.xml index 420a069a491..cb16a40c178 100644 --- a/addons/barcodes/views/barcodes_templates.xml +++ b/addons/barcodes/views/barcodes_templates.xml @@ -10,4 +10,10 @@ </xpath> </template> + <template id="qunit_suite" name="barcode_tests" inherit_id="web.qunit_suite"> + <xpath expr="//t[@t-set='head']" position="inside"> + <script type="text/javascript" src="/barcodes/static/tests/barcode_tests.js"/> + </xpath> + </template> + </odoo> diff --git a/addons/base_automation/models/base_automation.py b/addons/base_automation/models/base_automation.py index 9896a9706d8..268ae7e76f0 100644 --- a/addons/base_automation/models/base_automation.py +++ b/addons/base_automation/models/base_automation.py @@ -12,6 +12,7 @@ from dateutil.relativedelta import relativedelta from odoo import api, fields, models, SUPERUSER_ID from odoo.modules.registry import Registry +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT from odoo.tools.safe_eval import safe_eval _logger = logging.getLogger(__name__) @@ -350,7 +351,7 @@ class BaseAutomation(models.Model): except Exception: _logger.error(traceback.format_exc()) - action.write({'last_run': fields.Datetime.now()}) + action.write({'last_run': now.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}) if automatic: # auto-commit for batch processing diff --git a/addons/board/static/src/less/dashboard.less b/addons/board/static/src/less/dashboard.less index 5b53c583604..6d3aaef7716 100644 --- a/addons/board/static/src/less/dashboard.less +++ b/addons/board/static/src/less/dashboard.less @@ -117,6 +117,11 @@ .o_kanban_view .o_kanban_record .oe_kanban_list_many2many .o_field_many2manytags { border: none; } + + // Override height of graph. min-height doesn't do the trick + .o_graph { + height: 500px; + } } } } diff --git a/addons/stock_picking_wave/models/__init__.py b/addons/hr_contract/tests/__init__.py index cfd8cec597b..6f1832811c2 100644 --- a/addons/stock_picking_wave/models/__init__.py +++ b/addons/hr_contract/tests/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import stock_picking_wave +from . import test_auto_status diff --git a/addons/hr_contract/tests/test_auto_status.py b/addons/hr_contract/tests/test_auto_status.py new file mode 100644 index 00000000000..fb755bdb82f --- /dev/null +++ b/addons/hr_contract/tests/test_auto_status.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from datetime import datetime +from odoo.tests.common import TransactionCase +from dateutil.relativedelta import relativedelta + + +class TestHrContracts(TransactionCase): + + def setUp(self): + super(TestHrContracts, self).setUp() + self.contracts = self.env['hr.contract'].with_context(tracking_disable=True) + self.employee = self.env.ref('hr.employee_root') + self.test_contract = dict(name='Test', wage=1, employee_id=self.employee.id, state='open') + + def apply_cron(self): + self.env.ref('hr_contract.ir_cron_data_contract_update_state').method_direct_trigger() + + def test_contract_enddate(self): + self.test_contract.update(dict(date_end=datetime.now() + relativedelta(days=100))) + self.contract = self.contracts.create(self.test_contract) + self.apply_cron() + self.assertEquals(self.contract.state, 'open') + + self.test_contract.update(dict(date_end=datetime.now() + relativedelta(days=5))) + self.contract.write(self.test_contract) + self.apply_cron() + self.assertEquals(self.contract.state, 'pending') + + self.test_contract.update({ + 'date_start': datetime.now() + relativedelta(days=-50), + 'date_end': datetime.now() + relativedelta(days=-1), + 'state': 'pending', + }) + self.contract.write(self.test_contract) + self.apply_cron() + self.assertEquals(self.contract.state, 'close') + + def test_contract_pending_visa_expire(self): + self.employee.visa_expire = datetime.now() + relativedelta(days=30) + self.test_contract.update(dict(date_end=False)) + self.contract = self.contracts.create(self.test_contract) + self.apply_cron() + self.assertEquals(self.contract.state, 'pending') + + self.employee.visa_expire = datetime.now() + relativedelta(days=-5) + self.test_contract.update({ + 'date_start': datetime.now() + relativedelta(days=-50), + 'state': 'pending', + }) + self.contract.write(self.test_contract) + self.apply_cron() + self.assertEquals(self.contract.state, 'close') diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index dca8da92fb2..a5a26185b50 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -404,7 +404,7 @@ class HrExpenseSheet(models.Model): journal_id = fields.Many2one('account.journal', string='Expense Journal', states={'done': [('readonly', True)], 'post': [('readonly', True)]}, default=lambda self: self.env['ir.model.data'].xmlid_to_object('hr_expense.hr_expense_account_journal') or self.env['account.journal'].search([('type', '=', 'purchase')], limit=1), help="The journal used when the expense is done.") - bank_journal_id = fields.Many2one('account.journal', string='Bank Journal', states={'done': [('readonly', True)], 'post': [('readonly', True)]}, default=lambda self: self.env['account.journal'].search([('type', 'in', ['case', 'bank'])], limit=1), help="The payment method used when the expense is paid by the company.") + bank_journal_id = fields.Many2one('account.journal', string='Bank Journal', states={'done': [('readonly', True)], 'post': [('readonly', True)]}, default=lambda self: self.env['account.journal'].search([('type', 'in', ['cash', 'bank'])], limit=1), help="The payment method used when the expense is paid by the company.") accounting_date = fields.Date(string="Date") account_move_id = fields.Many2one('account.move', string='Journal Entry', ondelete='restrict', copy=False) department_id = fields.Many2one('hr.department', string='Department', states={'post': [('readonly', True)], 'done': [('readonly', True)]}) diff --git a/addons/hr_expense/security/ir_rule.xml b/addons/hr_expense/security/ir_rule.xml index 61aba78d7ed..e86d91211d8 100644 --- a/addons/hr_expense/security/ir_rule.xml +++ b/addons/hr_expense/security/ir_rule.xml @@ -26,6 +26,26 @@ <field eval="True" name="global"/> <field name="domain_force">['|',('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]</field> </record> + <record id="hr_expense_report_prevent_unlink" model="ir.rule"> + <field name="name">Expense Report Prevent Delete Employee</field> + <field name="model_id" ref="model_hr_expense_sheet"/> + <field name="domain_force">[('state', '=', 'submit')]</field> + <field name="groups" eval="[(4, ref('base.group_user'))]"/> + <field name="perm_read" eval="False"/> + <field name="perm_write" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="True"/> + </record> + <record id="hr_expense_report_auth_unlink" model="ir.rule"> + <field name="name">Expense Report Authorize Delete Officer</field> + <field name="model_id" ref="model_hr_expense_sheet"/> + <field name="domain_force">[(1, '=', 1)]</field> + <field name="groups" eval="[(4, ref('hr_expense.group_hr_expense_user'))]"/> + <field name="perm_read" eval="False"/> + <field name="perm_write" eval="False"/> + <field name="perm_create" eval="False"/> + <field name="perm_unlink" eval="True"/> + </record> </data> </odoo> diff --git a/addons/hr_payroll/views/hr_salary_rule_views.xml b/addons/hr_payroll/views/hr_salary_rule_views.xml index a086dfb795d..b69efd1f14f 100644 --- a/addons/hr_payroll/views/hr_salary_rule_views.xml +++ b/addons/hr_payroll/views/hr_salary_rule_views.xml @@ -201,6 +201,7 @@ <form string="Contribution"> <group> <field name="name"/> + <field name="partner_id"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" class="oe_inline"/> </group> <newline/> @@ -353,4 +354,4 @@ view_id="hr_salary_rule_list" id="act_children_salary_rules"/> -</odoo>
\ No newline at end of file +</odoo> diff --git a/addons/l10n_be/migrations/2.0/post-migrate_tags_on_taxes.py b/addons/l10n_be/migrations/9.0.2.0/post-migrate_tags_on_taxes.py index 404cdd185d4..404cdd185d4 100644 --- a/addons/l10n_be/migrations/2.0/post-migrate_tags_on_taxes.py +++ b/addons/l10n_be/migrations/9.0.2.0/post-migrate_tags_on_taxes.py diff --git a/addons/l10n_lu/__manifest__.py b/addons/l10n_lu/__manifest__.py index ed85f97e018..f7f40c5848a 100644 --- a/addons/l10n_lu/__manifest__.py +++ b/addons/l10n_lu/__manifest__.py @@ -7,7 +7,7 @@ { 'name': 'Luxembourg - Accounting', - 'version': '1.0', + 'version': '2.0', 'category': 'Localization', 'description': """ This is the base module to manage the accounting chart for Luxembourg. diff --git a/addons/l10n_lu/data/account.account.tag.csv b/addons/l10n_lu/data/account.account.tag.csv index e0200291232..93c9c280973 100644 --- a/addons/l10n_lu/data/account.account.tag.csv +++ b/addons/l10n_lu/data/account.account.tag.csv @@ -1,407 +1,601 @@ id,name,applicability -tag_AB_EC_0,AB-EC-0,taxes -tag_AB_EC_12_n,AB-EC-12-n,taxes -tag_AB_EC_12_p,AB-EC-12-p,taxes -tag_AB_EC_12,AB-EC-12,taxes -tag_AB_EC_14_n,AB-EC-14-n,taxes -tag_AB_EC_14_p,AB-EC-14-p,taxes -tag_AB_EC_14,AB-EC-14,taxes -tag_AB_EC_15_n,AB-EC-15-n,taxes -tag_AB_EC_15_p,AB-EC-15-p,taxes -tag_AB_EC_15,AB-EC-15,taxes -tag_AB_EC_17_n,AB-EC-17-n,taxes -tag_AB_EC_17_p,AB-EC-17-p,taxes -tag_AB_EC_17,AB-EC-17,taxes -tag_AB_EC_3_n,AB-EC-3-n,taxes -tag_AB_EC_3_p,AB-EC-3-p,taxes -tag_AB_EC_3,AB-EC-3,taxes -tag_AB_EC_6_n,AB-EC-6-n,taxes -tag_AB_EC_6_p,AB-EC-6-p,taxes -tag_AB_EC_6,AB-EC-6,taxes -tag_AB_EC_8_n,AB-EC-8-n,taxes -tag_AB_EC_8_p,AB-EC-8-p,taxes -tag_AB_EC_8,AB-EC-8,taxes -tag_AB_ECP_0,AB-ECP-0,taxes -tag_AB_ECP_12_n,AB-ECP-12-n,taxes -tag_AB_ECP_12_p,AB-ECP-12-p,taxes -tag_AB_ECP_12,AB-ECP-12,taxes -tag_AB_ECP_14_n,AB-ECP-14-n,taxes -tag_AB_ECP_14_p,AB-ECP-14-p,taxes -tag_AB_ECP_14,AB-ECP-14,taxes -tag_AB_ECP_15_n,AB-ECP-15-n,taxes -tag_AB_ECP_15_p,AB-ECP-15-p,taxes -tag_AB_ECP_15,AB-ECP-15,taxes -tag_AB_ECP_17_n,AB-ECP-17-n,taxes -tag_AB_ECP_17_p,AB-ECP-17-p,taxes -tag_AB_ECP_17,AB-ECP-17,taxes -tag_AB_ECP_3_n,AB-ECP-3-n,taxes -tag_AB_ECP_3_p,AB-ECP-3-p,taxes -tag_AB_ECP_3,AB-ECP-3,taxes -tag_AB_ECP_6_n,AB-ECP-6-n,taxes -tag_AB_ECP_6_p,AB-ECP-6-p,taxes -tag_AB_ECP_6,AB-ECP-6,taxes -tag_AB_ECP_8_n,AB-ECP-8-n,taxes -tag_AB_ECP_8_p,AB-ECP-8-p,taxes -tag_AB_ECP_8,AB-ECP-8,taxes -tag_AB_IC_0,AB-IC-0,taxes -tag_AB_IC_12_n,AB-IC-12-n,taxes -tag_AB_IC_12_p,AB-IC-12-p,taxes -tag_AB_IC_12,AB-IC-12,taxes -tag_AB_IC_14_n,AB-IC-14-n,taxes -tag_AB_IC_14_p,AB-IC-14-p,taxes -tag_AB_IC_14,AB-IC-14,taxes -tag_AB_IC_15_n,AB-IC-15-n,taxes -tag_AB_IC_15_p,AB-IC-15-p,taxes -tag_AB_IC_15,AB-IC-15,taxes -tag_AB_IC_17_n,AB-IC-17-n,taxes -tag_AB_IC_17_p,AB-IC-17-p,taxes -tag_AB_IC_17,AB-IC-17,taxes -tag_AB_IC_3_n,AB-IC-3-n,taxes -tag_AB_IC_3_p,AB-IC-3-p,taxes -tag_AB_IC_3,AB-IC-3,taxes -tag_AB_IC_6_n,AB-IC-6-n,taxes -tag_AB_IC_6_p,AB-IC-6-p,taxes -tag_AB_IC_6,AB-IC-6,taxes -tag_AB_IC_8_n,AB-IC-8-n,taxes -tag_AB_IC_8_p,AB-IC-8-p,taxes -tag_AB_IC_8,AB-IC-8,taxes -tag_AB_PA_0,AB-PA-0,taxes -tag_AB_PA_12,AB-PA-12,taxes -tag_AB_PA_14,AB-PA-14,taxes -tag_AB_PA_15,AB-PA-15,taxes -tag_AB_PA_17,AB-PA-17,taxes -tag_AB_PA_3,AB-PA-3,taxes -tag_AB_PA_6,AB-PA-6,taxes -tag_AB_PA_8,AB-PA-8,taxes -tag_AP_EC_0,AP-EC-0,taxes -tag_AP_EC_12_n,AP-EC-12-n,taxes -tag_AP_EC_12_p,AP-EC-12-p,taxes -tag_AP_EC_12,AP-EC-12,taxes -tag_AP_EC_14_n,AP-EC-14-n,taxes -tag_AP_EC_14_p,AP-EC-14-p,taxes -tag_AP_EC_14,AP-EC-14,taxes -tag_AP_EC_15_n,AP-EC-15-n,taxes -tag_AP_EC_15_p,AP-EC-15-p,taxes -tag_AP_EC_15,AP-EC-15,taxes -tag_AP_EC_17_n,AP-EC-17-n,taxes -tag_AP_EC_17_p,AP-EC-17-p,taxes -tag_AP_EC_17,AP-EC-17,taxes -tag_AP_EC_3_n,AP-EC-3-n,taxes -tag_AP_EC_3_p,AP-EC-3-p,taxes -tag_AP_EC_3,AP-EC-3,taxes -tag_AP_EC_6_n,AP-EC-6-n,taxes -tag_AP_EC_6_p,AP-EC-6-p,taxes -tag_AP_EC_6,AP-EC-6,taxes -tag_AP_EC_8_n,AP-EC-8-n,taxes -tag_AP_EC_8_p,AP-EC-8-p,taxes -tag_AP_EC_8,AP-EC-8,taxes -tag_AP_IC_0,AP-IC-0,taxes -tag_AP_IC_12_n,AP-IC-12-n,taxes -tag_AP_IC_12_p,AP-IC-12-p,taxes -tag_AP_IC_12,AP-IC-12,taxes -tag_AP_IC_14_n,AP-IC-14-n,taxes -tag_AP_IC_14_p,AP-IC-14-p,taxes -tag_AP_IC_14,AP-IC-14,taxes -tag_AP_IC_15_n,AP-IC-15-n,taxes -tag_AP_IC_15_p,AP-IC-15-p,taxes -tag_AP_IC_15,AP-IC-15,taxes -tag_AP_IC_17_n,AP-IC-17-n,taxes -tag_AP_IC_17_p,AP-IC-17-p,taxes -tag_AP_IC_17,AP-IC-17,taxes -tag_AP_IC_3_n,AP-IC-3-n,taxes -tag_AP_IC_3_p,AP-IC-3-p,taxes -tag_AP_IC_3,AP-IC-3,taxes -tag_AP_IC_6_n,AP-IC-6-n,taxes -tag_AP_IC_6_p,AP-IC-6-p,taxes -tag_AP_IC_6,AP-IC-6,taxes -tag_AP_IC_8_n,AP-IC-8-n,taxes -tag_AP_IC_8_p,AP-IC-8-p,taxes -tag_AP_IC_8,AP-IC-8,taxes -tag_AP_PA_0,AP-PA-0,taxes -tag_AP_PA_12,AP-PA-12,taxes -tag_AP_PA_14,AP-PA-14,taxes -tag_AP_PA_15,AP-PA-15,taxes -tag_AP_PA_17,AP-PA-17,taxes -tag_AP_PA_3,AP-PA-3,taxes -tag_AP_PA_6,AP-PA-6,taxes -tag_AP_PA_8,AP-PA-8,taxes -tag_FB_EC_0,FB-EC-0,taxes -tag_FB_EC_12_n,FB-EC-12-n,taxes -tag_FB_EC_12_p,FB-EC-12-p,taxes -tag_FB_EC_12,FB-EC-12,taxes -tag_FB_EC_14_n,FB-EC-14-n,taxes -tag_FB_EC_14_p,FB-EC-14-p,taxes -tag_FB_EC_14,FB-EC-14,taxes -tag_FB_EC_15_n,FB-EC-15-n,taxes -tag_FB_EC_15_p,FB-EC-15-p,taxes -tag_FB_EC_15,FB-EC-15,taxes -tag_FB_EC_17_n,FB-EC-17-n,taxes -tag_FB_EC_17_p,FB-EC-17-p,taxes -tag_FB_EC_17,FB-EC-17,taxes -tag_FB_EC_3_n,FB-EC-3-n,taxes -tag_FB_EC_3_p,FB-EC-3-p,taxes -tag_FB_EC_3,FB-EC-3,taxes -tag_FB_EC_6_n,FB-EC-6-n,taxes -tag_FB_EC_6_p,FB-EC-6-p,taxes -tag_FB_EC_6,FB-EC-6,taxes -tag_FB_EC_8_n,FB-EC-8-n,taxes -tag_FB_EC_8_p,FB-EC-8-p,taxes -tag_FB_EC_8,FB-EC-8,taxes -tag_FB_ECP_0,FB-ECP-0,taxes -tag_FB_ECP_12_n,FB-ECP-12-n,taxes -tag_FB_ECP_12_p,FB-ECP-12-p,taxes -tag_FB_ECP_12,FB-ECP-12,taxes -tag_FB_ECP_14_n,FB-ECP-14-n,taxes -tag_FB_ECP_14_p,FB-ECP-14-p,taxes -tag_FB_ECP_14,FB-ECP-14,taxes -tag_FB_ECP_15_n,FB-ECP-15-n,taxes -tag_FB_ECP_15_p,FB-ECP-15-p,taxes -tag_FB_ECP_15,FB-ECP-15,taxes -tag_FB_ECP_17_n,FB-ECP-17-n,taxes -tag_FB_ECP_17_p,FB-ECP-17-p,taxes -tag_FB_ECP_17,FB-ECP-17,taxes -tag_FB_ECP_3_n,FB-ECP-3-n,taxes -tag_FB_ECP_3_p,FB-ECP-3-p,taxes -tag_FB_ECP_3,FB-ECP-3,taxes -tag_FB_ECP_6_n,FB-ECP-6-n,taxes -tag_FB_ECP_6_p,FB-ECP-6-p,taxes -tag_FB_ECP_6,FB-ECP-6,taxes -tag_FB_ECP_8_n,FB-ECP-8-n,taxes -tag_FB_ECP_8_p,FB-ECP-8-p,taxes -tag_FB_ECP_8,FB-ECP-8,taxes -tag_FB_IC_0,FB-IC-0,taxes -tag_FB_IC_12_n,FB-IC-12-n,taxes -tag_FB_IC_12_p,FB-IC-12-p,taxes -tag_FB_IC_12,FB-IC-12,taxes -tag_FB_IC_14_n,FB-IC-14-n,taxes -tag_FB_IC_14_p,FB-IC-14-p,taxes -tag_FB_IC_14,FB-IC-14,taxes -tag_FB_IC_15_n,FB-IC-15-n,taxes -tag_FB_IC_15_p,FB-IC-15-p,taxes -tag_FB_IC_15,FB-IC-15,taxes -tag_FB_IC_17_n,FB-IC-17-n,taxes -tag_FB_IC_17_p,FB-IC-17-p,taxes -tag_FB_IC_17,FB-IC-17,taxes -tag_FB_IC_3_n,FB-IC-3-n,taxes -tag_FB_IC_3_p,FB-IC-3-p,taxes -tag_FB_IC_3,FB-IC-3,taxes -tag_FB_IC_6_n,FB-IC-6-n,taxes -tag_FB_IC_6_p,FB-IC-6-p,taxes -tag_FB_IC_6,FB-IC-6,taxes -tag_FB_IC_8_n,FB-IC-8-n,taxes -tag_FB_IC_8_p,FB-IC-8-p,taxes -tag_FB_IC_8,FB-IC-8,taxes -tag_FB_PA_0,FB-PA-0,taxes -tag_FB_PA_12,FB-PA-12,taxes -tag_FB_PA_14,FB-PA-14,taxes -tag_FB_PA_15,FB-PA-15,taxes -tag_FB_PA_17,FB-PA-17,taxes -tag_FB_PA_3,FB-PA-3,taxes -tag_FB_PA_6,FB-PA-6,taxes -tag_FB_PA_8,FB-PA-8,taxes -tag_FP_EC_0,FP-EC-0,taxes -tag_FP_EC_12_n,FP-EC-12-n,taxes -tag_FP_EC_12_p,FP-EC-12-p,taxes -tag_FP_EC_12,FP-EC-12,taxes -tag_FP_EC_14_n,FP-EC-14-n,taxes -tag_FP_EC_14_p,FP-EC-14-p,taxes -tag_FP_EC_14,FP-EC-14,taxes -tag_FP_EC_15_n,FP-EC-15-n,taxes -tag_FP_EC_15_p,FP-EC-15-p,taxes -tag_FP_EC_15,FP-EC-15,taxes -tag_FP_EC_17_n,FP-EC-17-n,taxes -tag_FP_EC_17_p,FP-EC-17-p,taxes -tag_FP_EC_17,FP-EC-17,taxes -tag_FP_EC_3_n,FP-EC-3-n,taxes -tag_FP_EC_3_p,FP-EC-3-p,taxes -tag_FP_EC_3,FP-EC-3,taxes -tag_FP_EC_6_n,FP-EC-6-n,taxes -tag_FP_EC_6_p,FP-EC-6-p,taxes -tag_FP_EC_6,FP-EC-6,taxes -tag_FP_EC_8_n,FP-EC-8-n,taxes -tag_FP_EC_8_p,FP-EC-8-p,taxes -tag_FP_EC_8,FP-EC-8,taxes -tag_FP_IC_0,FP-IC-0,taxes -tag_FP_IC_12_n,FP-IC-12-n,taxes -tag_FP_IC_12_p,FP-IC-12-p,taxes -tag_FP_IC_12,FP-IC-12,taxes -tag_FP_IC_14_n,FP-IC-14-n,taxes -tag_FP_IC_14_p,FP-IC-14-p,taxes -tag_FP_IC_14,FP-IC-14,taxes -tag_FP_IC_15_n,FP-IC-15-n,taxes -tag_FP_IC_15_p,FP-IC-15-p,taxes -tag_FP_IC_15,FP-IC-15,taxes -tag_FP_IC_17_n,FP-IC-17-n,taxes -tag_FP_IC_17_p,FP-IC-17-p,taxes -tag_FP_IC_17,FP-IC-17,taxes -tag_FP_IC_3_n,FP-IC-3-n,taxes -tag_FP_IC_3_p,FP-IC-3-p,taxes -tag_FP_IC_3,FP-IC-3,taxes -tag_FP_IC_6_n,FP-IC-6-n,taxes -tag_FP_IC_6_p,FP-IC-6-p,taxes -tag_FP_IC_6,FP-IC-6,taxes -tag_FP_IC_8_n,FP-IC-8-n,taxes -tag_FP_IC_8_p,FP-IC-8-p,taxes -tag_FP_IC_8,FP-IC-8,taxes -tag_FP_PA_0,FP-PA-0,taxes -tag_FP_PA_12,FP-PA-12,taxes -tag_FP_PA_14,FP-PA-14,taxes -tag_FP_PA_15,FP-PA-15,taxes -tag_FP_PA_17,FP-PA-17,taxes -tag_FP_PA_3,FP-PA-3,taxes -tag_FP_PA_6,FP-PA-6,taxes -tag_FP_PA_8,FP-PA-8,taxes -tag_IB_EC_0,IB-EC-0,taxes -tag_IB_EC_12_n,IB-EC-12-n,taxes -tag_IB_EC_12_p,IB-EC-12-p,taxes -tag_IB_EC_12,IB-EC-12,taxes -tag_IB_EC_14_n,IB-EC-14-n,taxes -tag_IB_EC_14_p,IB-EC-14-p,taxes -tag_IB_EC_14,IB-EC-14,taxes -tag_IB_EC_15_n,IB-EC-15-n,taxes -tag_IB_EC_15_p,IB-EC-15-p,taxes -tag_IB_EC_15,IB-EC-15,taxes -tag_IB_EC_17_n,IB-EC-17-n,taxes -tag_IB_EC_17_p,IB-EC-17-p,taxes -tag_IB_EC_17,IB-EC-17,taxes -tag_IB_EC_3_n,IB-EC-3-n,taxes -tag_IB_EC_3_p,IB-EC-3-p,taxes -tag_IB_EC_3,IB-EC-3,taxes -tag_IB_EC_6_n,IB-EC-6-n,taxes -tag_IB_EC_6_p,IB-EC-6-p,taxes -tag_IB_EC_6,IB-EC-6,taxes -tag_IB_EC_8_n,IB-EC-8-n,taxes -tag_IB_EC_8_p,IB-EC-8-p,taxes -tag_IB_EC_8,IB-EC-8,taxes -tag_IB_ECP_0,IB-ECP-0,taxes -tag_IB_ECP_12_n,IB-ECP-12-n,taxes -tag_IB_ECP_12_p,IB-ECP-12-p,taxes -tag_IB_ECP_12,IB-ECP-12,taxes -tag_IB_ECP_14_n,IB-ECP-14-n,taxes -tag_IB_ECP_14_p,IB-ECP-14-p,taxes -tag_IB_ECP_14,IB-ECP-14,taxes -tag_IB_ECP_15_n,IB-ECP-15-n,taxes -tag_IB_ECP_15_p,IB-ECP-15-p,taxes -tag_IB_ECP_15,IB-ECP-15,taxes -tag_IB_ECP_17_n,IB-ECP-17-n,taxes -tag_IB_ECP_17_p,IB-ECP-17-p,taxes -tag_IB_ECP_17,IB-ECP-17,taxes -tag_IB_ECP_3_n,IB-ECP-3-n,taxes -tag_IB_ECP_3_p,IB-ECP-3-p,taxes -tag_IB_ECP_3,IB-ECP-3,taxes -tag_IB_ECP_6_n,IB-ECP-6-n,taxes -tag_IB_ECP_6_p,IB-ECP-6-p,taxes -tag_IB_ECP_6,IB-ECP-6,taxes -tag_IB_ECP_8_n,IB-ECP-8-n,taxes -tag_IB_ECP_8_p,IB-ECP-8-p,taxes -tag_IB_ECP_8,IB-ECP-8,taxes -tag_IB_IC_0,IB-IC-0,taxes -tag_IB_IC_12_n,IB-IC-12-n,taxes -tag_IB_IC_12_p,IB-IC-12-p,taxes -tag_IB_IC_12,IB-IC-12,taxes -tag_IB_IC_14_n,IB-IC-14-n,taxes -tag_IB_IC_14_p,IB-IC-14-p,taxes -tag_IB_IC_14,IB-IC-14,taxes -tag_IB_IC_15_n,IB-IC-15-n,taxes -tag_IB_IC_15_p,IB-IC-15-p,taxes -tag_IB_IC_15,IB-IC-15,taxes -tag_IB_IC_17_n,IB-IC-17-n,taxes -tag_IB_IC_17_p,IB-IC-17-p,taxes -tag_IB_IC_17,IB-IC-17,taxes -tag_IB_IC_3_n,IB-IC-3-n,taxes -tag_IB_IC_3_p,IB-IC-3-p,taxes -tag_IB_IC_3,IB-IC-3,taxes -tag_IB_IC_6_n,IB-IC-6-n,taxes -tag_IB_IC_6_p,IB-IC-6-p,taxes -tag_IB_IC_6,IB-IC-6,taxes -tag_IB_IC_8_n,IB-IC-8-n,taxes -tag_IB_IC_8_p,IB-IC-8-p,taxes -tag_IB_IC_8,IB-IC-8,taxes -tag_IB_PA_0,IB-PA-0,taxes -tag_IB_PA_12,IB-PA-12,taxes -tag_IB_PA_14,IB-PA-14,taxes -tag_IB_PA_15,IB-PA-15,taxes -tag_IB_PA_17,IB-PA-17,taxes -tag_IB_PA_3,IB-PA-3,taxes -tag_IB_PA_6,IB-PA-6,taxes -tag_IB_PA_8,IB-PA-8,taxes -tag_IP_EC_0,IP-EC-0,taxes -tag_IP_EC_12_n,IP-EC-12-n,taxes -tag_IP_EC_12_p,IP-EC-12-p,taxes -tag_IP_EC_12,IP-EC-12,taxes -tag_IP_EC_14_n,IP-EC-14-n,taxes -tag_IP_EC_14_p,IP-EC-14-p,taxes -tag_IP_EC_14,IP-EC-14,taxes -tag_IP_EC_15_n,IP-EC-15-n,taxes -tag_IP_EC_15_p,IP-EC-15-p,taxes -tag_IP_EC_15,IP-EC-15,taxes -tag_IP_EC_17_n,IP-EC-17-n,taxes -tag_IP_EC_17_p,IP-EC-17-p,taxes -tag_IP_EC_17,IP-EC-17,taxes -tag_IP_EC_3_n,IP-EC-3-n,taxes -tag_IP_EC_3_p,IP-EC-3-p,taxes -tag_IP_EC_3,IP-EC-3,taxes -tag_IP_EC_6_n,IP-EC-6-n,taxes -tag_IP_EC_6_p,IP-EC-6-p,taxes -tag_IP_EC_6,IP-EC-6,taxes -tag_IP_EC_8_n,IP-EC-8-n,taxes -tag_IP_EC_8_p,IP-EC-8-p,taxes -tag_IP_EC_8,IP-EC-8,taxes -tag_IP_IC_0,IP-IC-0,taxes -tag_IP_IC_12_n,IP-IC-12-n,taxes -tag_IP_IC_12_p,IP-IC-12-p,taxes -tag_IP_IC_12,IP-IC-12,taxes -tag_IP_IC_14_n,IP-IC-14-n,taxes -tag_IP_IC_14_p,IP-IC-14-p,taxes -tag_IP_IC_14,IP-IC-14,taxes -tag_IP_IC_15_n,IP-IC-15-n,taxes -tag_IP_IC_15_p,IP-IC-15-p,taxes -tag_IP_IC_15,IP-IC-15,taxes -tag_IP_IC_17_n,IP-IC-17-n,taxes -tag_IP_IC_17_p,IP-IC-17-p,taxes -tag_IP_IC_17,IP-IC-17,taxes -tag_IP_IC_3_n,IP-IC-3-n,taxes -tag_IP_IC_3_p,IP-IC-3-p,taxes -tag_IP_IC_3,IP-IC-3,taxes -tag_IP_IC_6_n,IP-IC-6-n,taxes -tag_IP_IC_6_p,IP-IC-6-p,taxes -tag_IP_IC_6,IP-IC-6,taxes -tag_IP_IC_8_n,IP-IC-8-n,taxes -tag_IP_IC_8_p,IP-IC-8-p,taxes -tag_IP_IC_8,IP-IC-8,taxes -tag_IP_PA_0,IP-PA-0,taxes -tag_IP_PA_12,IP-PA-12,taxes -tag_IP_PA_14,IP-PA-14,taxes -tag_IP_PA_15,IP-PA-15,taxes -tag_IP_PA_17,IP-PA-17,taxes -tag_IP_PA_3,IP-PA-3,taxes -tag_IP_PA_6,IP-PA-6,taxes -tag_IP_PA_8,IP-PA-8,taxes -tag_V_ART_43_60b,V-ART-43_60b,taxes -tag_V_ART_44_56q,V-ART-44_56q,taxes -tag_VB_EC_0,VB-EC-0,taxes -tag_VB_EC_Tab,VB-EC-Tab,taxes -tag_VB_IC_0,VB-IC-0,taxes -tag_VB_IC_Tab,VB-IC-Tab,taxes -tag_VB_PA_0,VB-PA-0,taxes -tag_VB_PA_12,VB-PA-12,taxes -tag_VB_PA_14,VB-PA-14,taxes -tag_VB_PA_15,VB-PA-15,taxes -tag_VB_PA_17,VB-PA-17,taxes -tag_VB_PA_3,VB-PA-3,taxes -tag_VB_PA_6,VB-PA-6,taxes -tag_VB_PA_8,VB-PA-8,taxes -tag_VB_PA_Tab,VB-PA-Tab,taxes -tag_VB_TR_0,VB-TR-0,taxes -tag_VP_EC_0,VP-EC-0,taxes -tag_VP_IC_0,VP-IC-0,taxes -tag_VP_IC_EX,VP-IC-EX,taxes -tag_VP_PA_0,VP-PA-0,taxes -tag_VP_PA_12,VP-PA-12,taxes -tag_VP_PA_14,VP-PA-14,taxes -tag_VP_PA_15,VP-PA-15,taxes -tag_VP_PA_17,VP-PA-17,taxes -tag_VP_PA_3,VP-PA-3,taxes -tag_VP_PA_6,VP-PA-6,taxes -tag_VP_PA_8,VP-PA-8,taxes -tag_VP_PA_SANS,VP-PA-SANS,taxes +tag_lu_01,II. AUTRES BASES,taxes +tag_lu_02,II.B. Acquisitions intracommunautaires de biens – base,taxes +tag_lu_03,II.B. base 15%,taxes +tag_lu_04,Base - Achat Biens 15% - Intracommunautaire (+),taxes +tag_lu_05,Base - Frais Biens 15% - Intracommunautaire (+),taxes +tag_lu_06,Base - Investissement Biens 15% - Intracommunautaire (+),taxes +tag_lu_07,II.B. base 6%,taxes +tag_lu_08,Base - Achat Biens 6% - Intracommunautaire (+),taxes +tag_lu_09,Base - Frais Biens 6% - Intracommunautaire (+),taxes +tag_lu_10,Base - Investissement Biens 6% - Intracommunautaire (+),taxes +tag_lu_11,II.B. base 3%,taxes +tag_lu_12,Base - Achat Biens 3% - Intracommunautaire (+),taxes +tag_lu_13,Base - Frais Biens 3% - Intracommunautaire (+),taxes +tag_lu_14,Base - Investissement Biens 3% - Intracommunautaire (+),taxes +tag_lu_15,II.B. base 12%,taxes +tag_lu_16,Base - Achat Biens 12% - Intracommunautaire (+),taxes +tag_lu_17,Base - Frais Biens 12% - Intracommunautaire (+),taxes +tag_lu_18,Base - Investissement Biens 12% - Intracommunautaire (+),taxes +tag_lu_19,II.B. base exonérée,taxes +tag_lu_20,Base - Achat Biens Exonéré - Intracommunautaire,taxes +tag_lu_21,Base - Frais Biens Exonéré - Intracommunautaire,taxes +tag_lu_22,Base - Investissement Biens Exonéré - Intracommunautaire,taxes +tag_lu_23,II.B. base 17%,taxes +tag_lu_24,Base - Achat Biens 17% - Intracommunautaire (+),taxes +tag_lu_25,Base - Frais Biens 17% - Intracommunautaire (+),taxes +tag_lu_26,Base - Investissement Biens 17% - Intracommunautaire (+),taxes +tag_lu_27,II.B. base 14%,taxes +tag_lu_28,Base - Achat Biens 14% - Intracommunautaire (+),taxes +tag_lu_29,Base - Frais Biens 14% - Intracommunautaire (+),taxes +tag_lu_30,Base - Investissement Biens 14% - Intracommunautaire (+),taxes +tag_lu_31,II.B. base 8%,taxes +tag_lu_32,Base - Achat Biens 8% - Intracommunautaire (+),taxes +tag_lu_33,Base - Frais Biens 8% - Intracommunautaire (+),taxes +tag_lu_34,Base - Investissement Biens 8% - Intracommunautaire (+),taxes +tag_lu_35,II.D. Importations de biens – base,taxes +tag_lu_36,II.D.1. base 15%,taxes +tag_lu_37,Base - Achat Biens 15% - Extracommunautaire (+),taxes +tag_lu_38,Base - Frais Biens 15% - Extracommunautaire (+),taxes +tag_lu_39,Base - Investissement Biens 15% - Extracommunautaire (+),taxes +tag_lu_40,II.D.1. base 6%,taxes +tag_lu_41,Base - Achat Biens 6% - Extracommunautaire (+),taxes +tag_lu_42,Base - Frais Biens 6% - Extracommunautaire (+),taxes +tag_lu_43,Base - Investissement Biens 6% - Extracommunautaire (+),taxes +tag_lu_44,II.D.1. base 3%,taxes +tag_lu_45,Base - Achat Biens 3% - Extracommunautaire (+),taxes +tag_lu_46,Base - Frais Biens 3% - Extracommunautaire (+),taxes +tag_lu_47,Base - Investissement Biens 3% - Extracommunautaire (+),taxes +tag_lu_48,II.D.1. base 12%,taxes +tag_lu_49,Base - Achat Biens 12% - Extracommunautaire (+),taxes +tag_lu_50,Base - Frais Biens 12% - Extracommunautaire (+),taxes +tag_lu_51,Base - Investissement Biens 12% - Extracommunautaire (+),taxes +tag_lu_52,II.D.2.. base 15%,taxes +tag_lu_53,Base - Achat Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_54,Base - Frais Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_55,Base - Investissement Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_56,II.D.2.. base 6%,taxes +tag_lu_57,Base - Achat Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_58,Base - Frais Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_59,Base - Investissement Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_60,II.D.2.. base 3%,taxes +tag_lu_61,Base - Achat Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_62,Base - Frais Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_63,Base - Investissement Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_64,II.D.2.. base 12%,taxes +tag_lu_65,Base - Achat Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_66,Base - Frais Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_67,Base - Investissement Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_68,II.D.1. base exonérée,taxes +tag_lu_69,Base - Achat Biens Exonéré - Extracommunautaire,taxes +tag_lu_70,Base - Frais Biens Exonéré - Extracommunautaire,taxes +tag_lu_71,Base - Investissement Biens Exonéré - Extracommunautaire,taxes +tag_lu_72,II.D.2.. base exonérée,taxes +tag_lu_73,Base - Achat Biens Exonéré - Extracommunautaire fin privées,taxes +tag_lu_74,Base - Frais Biens Exonéré - Extracommunautaire fin privées,taxes +tag_lu_75,Base - Investissement Biens Exonéré - Extracommunautaire fin privées,taxes +tag_lu_76,II.D.1. base 17%,taxes +tag_lu_77,Base - Achat Biens 17% - Extracommunautaire (+),taxes +tag_lu_78,Base - Frais Biens 17% - Extracommunautaire (+),taxes +tag_lu_79,Base - Investissement Biens 17% - Extracommunautaire (+),taxes +tag_lu_80,II.D.1. base 14%,taxes +tag_lu_81,Base - Achat Biens 14% - Extracommunautaire (+),taxes +tag_lu_82,Base - Frais Biens 14% - Extracommunautaire (+),taxes +tag_lu_83,Base - Investissement Biens 14% - Extracommunautaire (+),taxes +tag_lu_84,II.D.1. base 8%,taxes +tag_lu_85,Base - Achat Biens 8% - Extracommunautaire (+),taxes +tag_lu_86,Base - Frais Biens 8% - Extracommunautaire (+),taxes +tag_lu_87,Base - Investissement Biens 8% - Extracommunautaire (+),taxes +tag_lu_88,II.D.2.. base 17%,taxes +tag_lu_89,Base - Achat Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_90,Base - Frais Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_91,Base - Investissement Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_92,II.D.2.. base 14%,taxes +tag_lu_93,Base - Achat Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_94,Base - Frais Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_95,Base - Investissement Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_96,II.D.2.. base 8%,taxes +tag_lu_97,Base - Achat Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_98,Base - Frais Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_99,Base - Investissement Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_100,II.C. Acquisitions effectuées dans le cadre d'opérations triangulaires – base,taxes +tag_lu_101,II.E. Prestations de services à déclarer par le preneur redevable de la taxe – base,taxes +tag_lu_102,II.E.1. base,taxes +tag_lu_103,II.E.1.a) base 15%,taxes +tag_lu_104,Base - Achat Prestations 15% - Intracommunautaire (+),taxes +tag_lu_105,Base - Frais Prestations 15% - Intracommunautaire (+),taxes +tag_lu_106,Base - Investissement Prestations 15% - Intracommunautaire (+),taxes +tag_lu_107,II.E.1.a) base 6%,taxes +tag_lu_108,Base - Achat Prestations 6% - Intracommunautaire (+),taxes +tag_lu_109,Base - Frais Prestations 6% - Intracommunautaire (+),taxes +tag_lu_110,Base - Investissement Prestations 6% - Intracommunautaire (+),taxes +tag_lu_111,II.E.1.a) base 3%,taxes +tag_lu_112,Base - Achat Prestations 3% - Intracommunautaire (+),taxes +tag_lu_113,Base - Frais Prestations 3% - Intracommunautaire (+),taxes +tag_lu_114,Base - Investissement Prestations 3% - Intracommunautaire (+),taxes +tag_lu_115,II.E.1.a) base 12%,taxes +tag_lu_116,Base - Achat Prestations 12% - Intracommunautaire (+),taxes +tag_lu_117,Base - Frais Prestations 12% - Intracommunautaire (+),taxes +tag_lu_118,Base - Investissement Prestations 12% - Intracommunautaire (+),taxes +tag_lu_119,II.E.1.b) exonérées,taxes +tag_lu_120,Base - Achat Prestations Exonérées - Intracommunautaire,taxes +tag_lu_121,Base - Frais Prestations Exonérées - Intracommunautaire,taxes +tag_lu_122,Base - Investissement Prestations Exonérées - Intracommunautaire,taxes +tag_lu_123,II.E.1.a) base 17%,taxes +tag_lu_124,Base - Achat Prestations 17% - Intracommunautaire (+),taxes +tag_lu_125,Base - Frais Prestations 17% - Intracommunautaire (+),taxes +tag_lu_126,Base - Investissement Prestations 17% - Intracommunautaire (+),taxes +tag_lu_127,II.E.1.a) base 14%,taxes +tag_lu_128,Base - Achat Prestations 14% - Intracommunautaire (+),taxes +tag_lu_129,Base - Frais Prestations 14% - Intracommunautaire (+),taxes +tag_lu_130,Base - Investissement Prestations 14% - Intracommunautaire (+),taxes +tag_lu_131,II.E.1.a) base 8%,taxes +tag_lu_132,Base - Achat Prestations 8% - Intracommunautaire (+),taxes +tag_lu_133,Base - Frais Prestations 8% - Intracommunautaire (+),taxes +tag_lu_134,Base - Investissement Prestations 8% - Intracommunautaire (+),taxes +tag_lu_135,II.E.2. base,taxes +tag_lu_136,II.E.2. base 15%,taxes +tag_lu_137,Base - Achat Prestations 15% - Extracommunautaire (+),taxes +tag_lu_138,Base - Frais Prestations 15% - Extracommunautaire (+),taxes +tag_lu_139,Base - Investissement Prestations 15% - Extracommunautaire (+),taxes +tag_lu_140,II.E.2. base 6%,taxes +tag_lu_141,Base - Achat Prestations 6% - Extracommunautaire (+),taxes +tag_lu_142,Base - Frais Prestations 6% - Extracommunautaire (+),taxes +tag_lu_143,Base - Investissement Prestations 6% - Extracommunautaire (+),taxes +tag_lu_144,II.E.2. base 3%,taxes +tag_lu_145,Base - Achat Prestations 3% - Extracommunautaire (+),taxes +tag_lu_146,Base - Frais Prestations 3% - Extracommunautaire (+),taxes +tag_lu_147,Base - Investissement Prestations 3% - Extracommunautaire (+),taxes +tag_lu_148,II.E.2. base 12%,taxes +tag_lu_149,Base - Achat Prestations 12% - Extracommunautaire (+),taxes +tag_lu_150,Base - Frais Prestations 12% - Extracommunautaire (+),taxes +tag_lu_151,Base - Investissement Prestations 12% - Extracommunautaire (+),taxes +tag_lu_152,II.E.2. exonérées,taxes +tag_lu_153,Base - Achat Prestations Exonérées - Extracommunautaire,taxes +tag_lu_154,Base - Frais Prestations Exonérées - Extracommunautaire,taxes +tag_lu_155,Base - Investissement Prestations Exonérées - Extracommunautaire,taxes +tag_lu_156,II.E.2. base 17%,taxes +tag_lu_157,Base - Achat Prestations 17% - Extracommunautaire (+),taxes +tag_lu_158,Base - Frais Prestations 17% - Extracommunautaire (+),taxes +tag_lu_159,Base - Investissement Prestations 17% - Extracommunautaire (+),taxes +tag_lu_160,II.E.2. base 14%,taxes +tag_lu_161,Base - Achat Prestations 14% - Extracommunautaire (+),taxes +tag_lu_162,Base - Frais Prestations 14% - Extracommunautaire (+),taxes +tag_lu_163,Base - Investissement Prestations 14% - Extracommunautaire (+),taxes +tag_lu_164,II.E.2. base 8%,taxes +tag_lu_165,Base - Achat Prestations 8% - Extracommunautaire (+),taxes +tag_lu_166,Base - Frais Prestations 8% - Extracommunautaire (+),taxes +tag_lu_167,Base - Investissement Prestations 8% - Extracommunautaire (+),taxes +tag_lu_168,I.-II. CALCUL DU CHIFFRE D'AFFAIRE IMPOSABLE,taxes +tag_lu_169,I.A. Chiffre d'affaires global,taxes +tag_lu_170,I.B. Exonérations et montants déductibles,taxes +tag_lu_171,I.B.2. Exportations (art.43/1/a et b),taxes +tag_lu_172,Base - Vente Biens - Extracommunautaire,taxes +tag_lu_173,I.B.3. Autres exonérations (art.43 et 60bis),taxes +tag_lu_174,Base - Vente - Autres Exonérations (Article 43 et 60 bis),taxes +tag_lu_175,I.B.4. Autres exonérations (art.44 et 56quater),taxes +tag_lu_176,Base - Vente - Autres Exonérations (Article 44 et 56 quarter),taxes +tag_lu_177,I.B.5. Tabacs fabriqués,taxes +tag_lu_178,Base - Vente Biens Tabacs - Extracommunautaire,taxes +tag_lu_179,Base - Vente Biens Tabacs - Intracommunautaire,taxes +tag_lu_180,Base - Vente Biens Tabacs - Pays,taxes +tag_lu_181,I.B.6.a) Livraisons subséquentes à des acquisitions intracommunautaires dans +le cadre d'opérations triangulaires, lorsque le destinataire identifié à la TVA dans l'Etat membre de destination des biens y est le redevable de la taxe (4),taxes +tag_lu_182,Base - Vente Biens – Triangulaire Intracommunautaire,taxes +tag_lu_183,I.B.6.d) Autres opérations réalisées (imposables) à l'étranger,taxes +tag_lu_184,Base - Vente Prestations - Extracommunautaire,taxes +tag_lu_185,I.B.6.c) Opérations réalisées dans le cadre du régime particulier de l'article 56sexies,taxes +tag_lu_186,I.B.7. Opérations à l'intérieur du pays pour lesquelles le preneur est le redevable,taxes +tag_lu_187,I.B.6.b)1) Prestations de services à des identifiés à la TVA dans un autre +Etat membre non exonérées dans l'Etat membre du preneur redevable (art.17/1/b) (5),taxes +tag_lu_188,Base - Vente Prestations - Intracommunautaire,taxes +tag_lu_189,I.B.6.b)2) Prestations de services à des identifiés à la TVA dans un autre +Etat membre exonérées dans l'Etat membre du preneur (art.17/1/b),taxes +tag_lu_190,Base - Vente Prestations - Intracommunautaire exonérées dans l'état membre,taxes +tag_lu_191,I.B.1. Livraisons intracommunautaires de biens à des personnes identifiées à la TVA dans unautre Etat membre (art.43/1/d e et f) (3),taxes +tag_lu_192,Base - Vente Biens - Intracommunautaire,taxes +tag_lu_193,I.C. Chiffre d'affaires imposable,taxes +tag_lu_194,II.A. Ventilation du chiffre d'affaires imposable – base,taxes +tag_lu_195,II.A. base 15%,taxes +tag_lu_196,Base - Vente Biens 15% - Pays,taxes +tag_lu_197,Base - Vente Prestations 15% - Pays,taxes +tag_lu_198,II.A. base 6%,taxes +tag_lu_199,Base - Vente Biens 6% - Pays,taxes +tag_lu_200,Base - Vente Prestations 6% - Pays,taxes +tag_lu_201,II.A. base 3%,taxes +tag_lu_202,Base - Vente Biens 3% - Pays,taxes +tag_lu_203,Base - Vente Prestations 3% - Pays,taxes +tag_lu_204,II.A. base 12%,taxes +tag_lu_205,Base - Vente Biens 12% - Pays,taxes +tag_lu_206,Base - Vente Prestations 12% - Pays,taxes +tag_lu_207,II.A. base 0%,taxes +tag_lu_208,Base - Vente Biens 0% - Pays,taxes +tag_lu_209,Base - Vente Prestations 0% - Pays,taxes +tag_lu_210,II.A. base 17%,taxes +tag_lu_211,Base - Vente Biens 17% - Pays,taxes +tag_lu_212,Base - Vente Prestations 17% - Pays,taxes +tag_lu_213,II.A. base 14%,taxes +tag_lu_214,Base - Vente Biens 14% - Pays,taxes +tag_lu_215,Base - Vente Prestations 14% - Pays,taxes +tag_lu_216,II.A. base 8%,taxes +tag_lu_217,Base - Vente Biens 8% - Pays,taxes +tag_lu_218,Base - Vente Prestations 8% - Pays,taxes +tag_lu_219,Codes non assignés,taxes +tag_lu_220,Base - Achat Biens 0% - Pays,taxes +tag_lu_221,Base - Achat Biens 12% - Pays,taxes +tag_lu_222,Base - Achat Biens 14% - Pays,taxes +tag_lu_223,Base - Achat Biens 15% - Pays,taxes +tag_lu_224,Base - Achat Biens 17% - Pays,taxes +tag_lu_225,Base - Achat Biens 3% - Pays,taxes +tag_lu_226,Base - Achat Biens 6% - Pays,taxes +tag_lu_227,Base - Achat Biens 8% - Pays,taxes +tag_lu_228,Base - Achat Prestations 0% - Pays,taxes +tag_lu_229,Base - Achat Prestations 12% - Pays,taxes +tag_lu_230,Base - Achat Prestations 14% - Pays,taxes +tag_lu_231,Base - Achat Prestations 15% - Pays,taxes +tag_lu_232,Base - Achat Prestations 17% - Pays,taxes +tag_lu_233,Base - Achat Prestations 3% - Pays,taxes +tag_lu_234,Base - Achat Prestations 6% - Pays,taxes +tag_lu_235,Base - Achat Prestations 8% - Pays,taxes +tag_lu_236,Base - Frais Biens 0% - Pays,taxes +tag_lu_237,Base - Frais Biens 12% - Pays,taxes +tag_lu_238,Base - Frais Biens 14% - Pays,taxes +tag_lu_239,Base - Frais Biens 15% - Pays,taxes +tag_lu_240,Base - Frais Biens 17% - Pays,taxes +tag_lu_241,Base - Frais Biens 3% - Pays,taxes +tag_lu_242,Base - Frais Biens 6% - Pays,taxes +tag_lu_243,Base - Frais Biens 8% - Pays,taxes +tag_lu_244,Base - Frais Prestations 0% - Pays,taxes +tag_lu_245,Base - Frais Prestations 12% - Pays,taxes +tag_lu_246,Base - Frais Prestations 14% - Pays,taxes +tag_lu_247,Base - Frais Prestations 15% - Pays,taxes +tag_lu_248,Base - Frais Prestations 17% - Pays,taxes +tag_lu_249,Base - Frais Prestations 3% - Pays,taxes +tag_lu_250,Base - Frais Prestations 6% - Pays,taxes +tag_lu_251,Base - Frais Prestations 8% - Pays,taxes +tag_lu_252,Base - Investissement Biens 0% - Pays,taxes +tag_lu_253,Base - Investissement Biens 12% - Pays,taxes +tag_lu_254,Base - Investissement Biens 14% - Pays,taxes +tag_lu_255,Base - Investissement Biens 15% - Pays,taxes +tag_lu_256,Base - Investissement Biens 17% - Pays,taxes +tag_lu_257,Base - Investissement Biens 3% - Pays,taxes +tag_lu_258,Base - Investissement Biens 6% - Pays,taxes +tag_lu_259,Base - Investissement Biens 8% - Pays,taxes +tag_lu_260,Base - Investissement Prestations 0% - Pays,taxes +tag_lu_261,Base - Investissement Prestations 12% - Pays,taxes +tag_lu_262,Base - Investissement Prestations 14% - Pays,taxes +tag_lu_263,Base - Investissement Prestations 15% - Pays,taxes +tag_lu_264,Base - Investissement Prestations 17% - Pays,taxes +tag_lu_265,Base - Investissement Prestations 3% - Pays,taxes +tag_lu_266,Base - Investissement Prestations 6% - Pays,taxes +tag_lu_267,Base - Investissement Prestations 8% - Pays,taxes +tag_lu_268,II.-III.-IV. CALCUL DE LA TAXE,taxes +tag_lu_269,IV.C. Excédent,taxes +tag_lu_270,IV.A. Total de la taxe en aval,taxes +tag_lu_271,II.H. Total de la taxe en aval,taxes +tag_lu_272,II.A. Ventilation du chiffre d'affaires imposable – taxe,taxes +tag_lu_273,II.A. taxe 15%,taxes +tag_lu_274,Taxe - Vente Biens 15% - Pays,taxes +tag_lu_275,Taxe - Vente Prestations 15% - Pays,taxes +tag_lu_276,II.A. taxe 6%,taxes +tag_lu_277,Taxe - Vente Biens 6% - Pays,taxes +tag_lu_278,Taxe - Vente Prestations 6% - Pays,taxes +tag_lu_279,II.A. taxe 3%,taxes +tag_lu_280,Taxe - Vente Biens 3% - Pays,taxes +tag_lu_281,Taxe - Vente Prestations 3% - Pays,taxes +tag_lu_282,II.A. taxe 12%,taxes +tag_lu_283,Taxe - Vente Biens 12% - Pays,taxes +tag_lu_284,Taxe - Vente Prestations 12% - Pays,taxes +tag_lu_285,II.A. taxe 0%,taxes +tag_lu_286,II.A. taxe 17%,taxes +tag_lu_287,Taxe - Vente Biens 17% - Pays,taxes +tag_lu_288,Taxe - Vente Prestations 17% - Pays,taxes +tag_lu_289,II.A. taxe 14%,taxes +tag_lu_290,Taxe - Vente Biens 14% - Pays,taxes +tag_lu_291,Taxe - Vente Prestations 14% - Pays,taxes +tag_lu_292,II.A. taxe 8%,taxes +tag_lu_293,Taxe - Vente Biens 8% - Pays,taxes +tag_lu_294,Taxe - Vente Prestations 8% - Pays,taxes +tag_lu_295,II.B. Acquisitions intracommunautaires de biens – taxe,taxes +tag_lu_296,II.B. taxe 15%,taxes +tag_lu_297,Taxe - Achat Biens 15% - Intracommunautaire (+),taxes +tag_lu_298,Taxe - Frais Biens 15% - Intracommunautaire (+),taxes +tag_lu_299,Taxe - Investissement Biens 15% - Intracommunautaire (+),taxes +tag_lu_300,II.B. taxe 6%,taxes +tag_lu_301,Taxe - Achat Biens 6% - Intracommunautaire (+),taxes +tag_lu_302,Taxe - Frais Biens 6% - Intracommunautaire (+),taxes +tag_lu_303,Taxe - Investissement Biens 6% - Intracommunautaire (+),taxes +tag_lu_304,II.B. taxe 3%,taxes +tag_lu_305,Taxe - Achat Biens 3% - Intracommunautaire (+),taxes +tag_lu_306,Taxe - Frais Biens 3% - Intracommunautaire (+),taxes +tag_lu_307,Taxe - Investissement Biens 3% - Intracommunautaire (+),taxes +tag_lu_308,II.B. taxe 12%,taxes +tag_lu_309,Taxe - Achat Biens 12% - Intracommunautaire (+),taxes +tag_lu_310,Taxe - Frais Biens 12% - Intracommunautaire (+),taxes +tag_lu_311,Taxe - Investissement Biens 12% - Intracommunautaire (+),taxes +tag_lu_312,II.B. taxe 17%,taxes +tag_lu_313,Taxe - Achat Biens 17% - Intracommunautaire (+),taxes +tag_lu_314,Taxe - Frais Biens 17% - Intracommunautaire (+),taxes +tag_lu_315,Taxe - Investissement Biens 17% - Intracommunautaire (+),taxes +tag_lu_316,II.B. taxe 14%,taxes +tag_lu_317,Taxe - Achat Biens 14% - Intracommunautaire (+),taxes +tag_lu_318,Taxe - Frais Biens 14% - Intracommunautaire (+),taxes +tag_lu_319,Taxe - Investissement Biens 14% - Intracommunautaire (+),taxes +tag_lu_320,II.B. taxe 8%,taxes +tag_lu_321,Taxe - Achat Biens 8% - Intracommunautaire (+),taxes +tag_lu_322,Taxe - Frais Biens 8% - Intracommunautaire (+),taxes +tag_lu_323,Taxe - Investissement Biens 8% - Intracommunautaire (+),taxes +tag_lu_324,II.D. Importations de biens – taxe,taxes +tag_lu_325,II.D.1. taxe 15%,taxes +tag_lu_326,Taxe - Achat Biens 15% - Extracommunautaire (+),taxes +tag_lu_327,Taxe - Frais Biens 15% - Extracommunautaire (+),taxes +tag_lu_328,Taxe - Investissement Biens 15% - Extracommunautaire (+),taxes +tag_lu_329,II.D.1. taxe 6%,taxes +tag_lu_330,Taxe - Achat Biens 6% - Extracommunautaire (+),taxes +tag_lu_331,Taxe - Frais Biens 6% - Extracommunautaire (+),taxes +tag_lu_332,Taxe - Investissement Biens 6% - Extracommunautaire (+),taxes +tag_lu_333,II.D.1. taxe 3%,taxes +tag_lu_334,Taxe - Achat Biens 3% - Extracommunautaire (+),taxes +tag_lu_335,Taxe - Frais Biens 3% - Extracommunautaire (+),taxes +tag_lu_336,Taxe - Investissement Biens 3% - Extracommunautaire (+),taxes +tag_lu_337,II.D.1. taxe 12%,taxes +tag_lu_338,Taxe - Achat Biens 12% - Extracommunautaire (+),taxes +tag_lu_339,Taxe - Frais Biens 12% - Extracommunautaire (+),taxes +tag_lu_340,Taxe - Investissement Biens 12% - Extracommunautaire (+),taxes +tag_lu_341,II.D.2.. taxe 15%,taxes +tag_lu_342,Taxe - Achat Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_343,Taxe - Frais Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_344,Taxe - Investissement Biens 15% - Extracommunautaire fin privées (+),taxes +tag_lu_345,II.D.2.. taxe 6%,taxes +tag_lu_346,Taxe - Achat Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_347,Taxe - Frais Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_348,Taxe - Investissement Biens 6% - Extracommunautaire fin privées (+),taxes +tag_lu_349,II.D.2.. taxe 3%,taxes +tag_lu_350,Taxe - Achat Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_351,Taxe - Frais Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_352,Taxe - Investissement Biens 3% - Extracommunautaire fin privées (+),taxes +tag_lu_353,II.D.2.. taxe 12%,taxes +tag_lu_354,Taxe - Achat Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_355,Taxe - Frais Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_356,Taxe - Investissement Biens 12% - Extracommunautaire fin privées (+),taxes +tag_lu_357,II.D.1. taxe 17%,taxes +tag_lu_358,Taxe - Achat Biens 17% - Extracommunautaire (+),taxes +tag_lu_359,Taxe - Frais Biens 17% - Extracommunautaire (+),taxes +tag_lu_360,Taxe - Investissement Biens 17% - Extracommunautaire (+),taxes +tag_lu_361,II.D.1. taxe 14%,taxes +tag_lu_362,Taxe - Achat Biens 14% - Extracommunautaire (+),taxes +tag_lu_363,Taxe - Frais Biens 14% - Extracommunautaire (+),taxes +tag_lu_364,Taxe - Investissement Biens 14% - Extracommunautaire (+),taxes +tag_lu_365,II.D.1. taxe 8%,taxes +tag_lu_366,Taxe - Achat Biens 8% - Extracommunautaire (+),taxes +tag_lu_367,Taxe - Frais Biens 8% - Extracommunautaire (+),taxes +tag_lu_368,Taxe - Investissement Biens 8% - Extracommunautaire (+),taxes +tag_lu_369,II.D.2.. taxe 17%,taxes +tag_lu_370,Taxe - Achat Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_371,Taxe - Frais Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_372,Taxe - Investissement Biens 17% - Extracommunautaire fin privées (+),taxes +tag_lu_373,II.D.2.. taxe 14%,taxes +tag_lu_374,Taxe - Achat Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_375,Taxe - Frais Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_376,Taxe - Investissement Biens 14% - Extracommunautaire fin privées (+),taxes +tag_lu_377,II.D.2.. taxe 8%,taxes +tag_lu_378,Taxe - Achat Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_379,Taxe - Frais Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_380,Taxe - Investissement Biens 8% - Extracommunautaire fin privées (+),taxes +tag_lu_381,II.E. Prestations de services à déclarer par le preneur redevable de la taxe– base,taxes +tag_lu_382,II.E.1.a) taxe,taxes +tag_lu_383,II.E.1.a) taxe 15%,taxes +tag_lu_384,Taxe - Achat Prestations 15% - Intracommunautaire (+),taxes +tag_lu_385,Taxe - Frais Prestations 15% - Intracommunautaire (+),taxes +tag_lu_386,Taxe - Investissement Prestations 15% - Intracommunautaire (+),taxes +tag_lu_387,II.E.1.a) taxe 6%,taxes +tag_lu_388,Taxe - Achat Prestations 6% - Intracommunautaire (+),taxes +tag_lu_389,Taxe - Frais Prestations 6% - Intracommunautaire (+),taxes +tag_lu_390,Taxe - Investissement Prestations 6% - Intracommunautaire (+),taxes +tag_lu_391,II.E.1.a) taxe 3%,taxes +tag_lu_392,Taxe - Achat Prestations 3% - Intracommunautaire (+),taxes +tag_lu_393,Taxe - Frais Prestations 3% - Intracommunautaire (+),taxes +tag_lu_394,Taxe - Investissement Prestations 3% - Intracommunautaire (+),taxes +tag_lu_395,II.E.1.a) taxe 12%,taxes +tag_lu_396,Taxe - Achat Prestations 12% - Intracommunautaire (+),taxes +tag_lu_397,Taxe - Frais Prestations 12% - Intracommunautaire (+),taxes +tag_lu_398,Taxe - Investissement Prestations 12% - Intracommunautaire (+),taxes +tag_lu_399,II.E.1.a) taxe 17%,taxes +tag_lu_400,Taxe - Achat Prestations 17% - Intracommunautaire (+),taxes +tag_lu_401,Taxe - Frais Prestations 17% - Intracommunautaire (+),taxes +tag_lu_402,Taxe - Investissement Prestations 17% - Intracommunautaire (+),taxes +tag_lu_403,II.E.1.a) taxe 14%,taxes +tag_lu_404,Taxe - Achat Prestations 14% - Intracommunautaire (+),taxes +tag_lu_405,Taxe - Frais Prestations 14% - Intracommunautaire (+),taxes +tag_lu_406,Taxe - Investissement Prestations 14% - Intracommunautaire (+),taxes +tag_lu_407,II.E.1.a) taxe 8%,taxes +tag_lu_408,Taxe - Achat Prestations 8% - Intracommunautaire (+),taxes +tag_lu_409,Taxe - Frais Prestations 8% - Intracommunautaire (+),taxes +tag_lu_410,Taxe - Investissement Prestations 8% - Intracommunautaire (+),taxes +tag_lu_411,II.E.2. taxe,taxes +tag_lu_412,II.E.2. taxe 15%,taxes +tag_lu_413,Taxe - Achat Prestations 15% - Extracommunautaire (+),taxes +tag_lu_414,Taxe - Frais Prestations 15% - Extracommunautaire (+),taxes +tag_lu_415,Taxe - Investissement Prestations 15% - Extracommunautaire (+),taxes +tag_lu_416,II.E.2. taxe 6%,taxes +tag_lu_417,Taxe - Achat Prestations 6% - Extracommunautaire (+),taxes +tag_lu_418,Taxe - Frais Prestations 6% - Extracommunautaire (+),taxes +tag_lu_419,Taxe - Investissement Prestations 6% - Extracommunautaire (+),taxes +tag_lu_420,II.E.2. taxe 3%,taxes +tag_lu_421,Taxe - Achat Prestations 3% - Extracommunautaire (+),taxes +tag_lu_422,Taxe - Frais Prestations 3% - Extracommunautaire (+),taxes +tag_lu_423,Taxe - Investissement Prestations 3% - Extracommunautaire (+),taxes +tag_lu_424,II.E.2. taxe 12%,taxes +tag_lu_425,Taxe - Achat Prestations 12% - Extracommunautaire (+),taxes +tag_lu_426,Taxe - Frais Prestations 12% - Extracommunautaire (+),taxes +tag_lu_427,Taxe - Investissement Prestations 12% - Extracommunautaire (+),taxes +tag_lu_428,II.E.2. taxe 17%,taxes +tag_lu_429,Taxe - Achat Prestations 17% - Extracommunautaire (+),taxes +tag_lu_430,Taxe - Frais Prestations 17% - Extracommunautaire (+),taxes +tag_lu_431,Taxe - Investissement Prestations 17% - Extracommunautaire (+),taxes +tag_lu_432,II.E.2. taxe 14%,taxes +tag_lu_433,Taxe - Achat Prestations 14% - Extracommunautaire (+),taxes +tag_lu_434,Taxe - Frais Prestations 14% - Extracommunautaire (+),taxes +tag_lu_435,Taxe - Investissement Prestations 14% - Extracommunautaire (+),taxes +tag_lu_436,II.E.2. taxe 8%,taxes +tag_lu_437,Taxe - Achat Prestations 8% - Extracommunautaire (+),taxes +tag_lu_438,Taxe - Frais Prestations 8% - Extracommunautaire (+),taxes +tag_lu_439,Taxe - Investissement Prestations 8% - Extracommunautaire (+),taxes +tag_lu_440,IV.A. Total de la taxe en amont déductible,taxes +tag_lu_441,III.C. Total de la taxe en amont déductible,taxes +tag_lu_442,III.A. Total de la taxe en amont,taxes +tag_lu_443,III.A.4. Affectations de biens (art.48/1/d),taxes +tag_lu_444,III.A.6. Taxe acquittée comme caution solidaire,taxes +tag_lu_445,III.A.7. Taxe régularisée - régime particulier suspensif (art.60bis/9 al. 2),taxes +tag_lu_446,III.A.1. Achats de biens et de services à l'intérieur du pays (art.48/1/a),taxes +tag_lu_447,Taxe - Achat Biens 12% - Pays,taxes +tag_lu_448,Taxe - Achat Biens 14% - Pays,taxes +tag_lu_449,Taxe - Achat Biens 15% - Pays,taxes +tag_lu_450,Taxe - Achat Biens 17% - Pays,taxes +tag_lu_451,Taxe - Achat Biens 3% - Pays,taxes +tag_lu_452,Taxe - Achat Biens 6% - Pays,taxes +tag_lu_453,Taxe - Achat Biens 8% - Pays,taxes +tag_lu_454,Taxe - Achat Prestations 12% - Pays,taxes +tag_lu_456,Taxe - Achat Prestations 14% - Pays,taxes +tag_lu_457,Taxe - Achat Prestations 15% - Pays,taxes +tag_lu_458,Taxe - Achat Prestations 17% - Pays,taxes +tag_lu_459,Taxe - Achat Prestations 3% - Pays,taxes +tag_lu_460,Taxe - Achat Prestations 6% - Pays,taxes +tag_lu_461,Taxe - Achat Prestations 8% - Pays,taxes +tag_lu_462,Taxe - Frais Biens 12% - Pays,taxes +tag_lu_463,Taxe - Frais Biens 14% - Pays,taxes +tag_lu_464,Taxe - Frais Biens 15% - Pays,taxes +tag_lu_465,Taxe - Frais Biens 17% - Pays,taxes +tag_lu_466,Taxe - Frais Biens 3% - Pays,taxes +tag_lu_467,Taxe - Frais Biens 6% - Pays,taxes +tag_lu_468,Taxe - Frais Biens 8% - Pays,taxes +tag_lu_469,Taxe - Frais Prestations 12% - Pays,taxes +tag_lu_470,Taxe - Frais Prestations 14% - Pays,taxes +tag_lu_471,Taxe - Frais Prestations 15% - Pays,taxes +tag_lu_472,Taxe - Frais Prestations 17% - Pays,taxes +tag_lu_473,Taxe - Frais Prestations 3% - Pays,taxes +tag_lu_474,Taxe - Frais Prestations 6% - Pays,taxes +tag_lu_475,Taxe - Frais Prestations 8% - Pays,taxes +tag_lu_476,Taxe - Investissement Biens 12% - Pays,taxes +tag_lu_477,Taxe - Investissement Biens 14% - Pays,taxes +tag_lu_478,Taxe - Investissement Biens 15% - Pays,taxes +tag_lu_479,Taxe - Investissement Biens 17% - Pays,taxes +tag_lu_480,Taxe - Investissement Biens 3% - Pays,taxes +tag_lu_481,Taxe - Investissement Biens 6% - Pays,taxes +tag_lu_482,Taxe - Investissement Biens 8% - Pays,taxes +tag_lu_483,Taxe - Investissement Prestations 12% - Pays,taxes +tag_lu_484,Taxe - Investissement Prestations 14% - Pays,taxes +tag_lu_485,Taxe - Investissement Prestations 15% - Pays,taxes +tag_lu_486,Taxe - Investissement Prestations 17% - Pays,taxes +tag_lu_487,Taxe - Investissement Prestations 3% - Pays,taxes +tag_lu_488,Taxe - Investissement Prestations 6% - Pays,taxes +tag_lu_489,Taxe - Investissement Prestations 8% - Pays,taxes +tag_lu_490,III.A.2. Acquisitions intracommunautaires de biens (art.48/1/b),taxes +tag_lu_491,Taxe - Achat Biens 12% - Intracommunautaire (-),taxes +tag_lu_492,Taxe - Achat Biens 14% - Intracommunautaire (-),taxes +tag_lu_493,Taxe - Achat Biens 15% - Intracommunautaire (-),taxes +tag_lu_494,Taxe - Achat Biens 17% - Intracommunautaire (-),taxes +tag_lu_495,Taxe - Achat Biens 3% - Intracommunautaire (-),taxes +tag_lu_496,Taxe - Achat Biens 6% - Intracommunautaire (-),taxes +tag_lu_497,Taxe - Achat Biens 8% - Intracommunautaire (-),taxes +tag_lu_498,Taxe - Frais Biens 12% - Intracommunautaire (-),taxes +tag_lu_499,Taxe - Frais Biens 14% - Intracommunautaire (-),taxes +tag_lu_500,Taxe - Frais Biens 15% - Intracommunautaire (-),taxes +tag_lu_501,Taxe - Frais Biens 17% - Intracommunautaire (-),taxes +tag_lu_502,Taxe - Frais Biens 3% - Intracommunautaire (-),taxes +tag_lu_503,Taxe - Frais Biens 6% - Intracommunautaire (-),taxes +tag_lu_504,Taxe - Frais Biens 8% - Intracommunautaire (-),taxes +tag_lu_505,Taxe - Investissement Biens 12% - Intracommunautaire (-),taxes +tag_lu_506,Taxe - Investissement Biens 14% - Intracommunautaire (-),taxes +tag_lu_507,Taxe - Investissement Biens 15% - Intracommunautaire (-),taxes +tag_lu_508,Taxe - Investissement Biens 17% - Intracommunautaire (-),taxes +tag_lu_509,Taxe - Investissement Biens 3% - Intracommunautaire (-),taxes +tag_lu_510,Taxe - Investissement Biens 6% - Intracommunautaire (-),taxes +tag_lu_511,Taxe - Investissement Biens 8% - Intracommunautaire (-),taxes +tag_lu_512,III.A.3. Importations de biens (taxe déclarée ou payée) (art.48/1/c),taxes +tag_lu_513,Taxe - Achat Biens 12% - Extracommunautaire (-),taxes +tag_lu_514,Taxe - Achat Biens 14% - Extracommunautaire (-),taxes +tag_lu_515,Taxe - Achat Biens 15% - Extracommunautaire (-),taxes +tag_lu_516,Taxe - Achat Biens 17% - Extracommunautaire (-),taxes +tag_lu_517,Taxe - Achat Biens 3% - Extracommunautaire (-),taxes +tag_lu_518,Taxe - Achat Biens 6% - Extracommunautaire (-),taxes +tag_lu_519,Taxe - Achat Biens 8% - Extracommunautaire (-),taxes +tag_lu_520,Taxe - Achat Biens 12% - Extracommunautaire fin privées (-),taxes +tag_lu_521,Taxe - Achat Biens 14% - Extracommunautaire fin privées (-),taxes +tag_lu_522,Taxe - Achat Biens 15% - Extracommunautaire fin privées (-),taxes +tag_lu_523,Taxe - Achat Biens 17% - Extracommunautaire fin privées (-),taxes +tag_lu_524,Taxe - Achat Biens 3% - Extracommunautaire fin privées (-),taxes +tag_lu_525,Taxe - Achat Biens 6% - Extracommunautaire fin privées (-),taxes +tag_lu_526,Taxe - Achat Biens 8% - Extracommunautaire fin privées (-),taxes +tag_lu_527,Taxe - Frais Biens 12% - Extracommunautaire (-),taxes +tag_lu_528,Taxe - Frais Biens 14% - Extracommunautaire (-),taxes +tag_lu_529,Taxe - Frais Biens 15% - Extracommunautaire (-),taxes +tag_lu_530,Taxe - Frais Biens 17% - Extracommunautaire (-),taxes +tag_lu_531,Taxe - Frais Biens 3% - Extracommunautaire (-),taxes +tag_lu_532,Taxe - Frais Biens 6% - Extracommunautaire (-),taxes +tag_lu_533,Taxe - Frais Biens 8% - Extracommunautaire (-),taxes +tag_lu_534,Taxe - Frais Biens 12% - Extracommunautaire fin privées (-),taxes +tag_lu_535,Taxe - Frais Biens 14% - Extracommunautaire fin privées (-),taxes +tag_lu_536,Taxe - Frais Biens 15% - Extracommunautaire fin privées (-),taxes +tag_lu_537,Taxe - Frais Biens 17% - Extracommunautaire fin privées (-),taxes +tag_lu_538,Taxe - Frais Biens 3% - Extracommunautaire fin privées (-),taxes +tag_lu_539,Taxe - Frais Biens 6% - Extracommunautaire fin privées (-),taxes +tag_lu_540,Taxe - Frais Biens 8% - Extracommunautaire fin privées (-),taxes +tag_lu_541,Taxe - Investissement Biens 12% - Extracommunautaire (-),taxes +tag_lu_542,Taxe - Investissement Biens 14% - Extracommunautaire (-),taxes +tag_lu_543,Taxe - Investissement Biens 15% - Extracommunautaire (-),taxes +tag_lu_544,Taxe - Investissement Biens 17% - Extracommunautaire (-),taxes +tag_lu_545,Taxe - Investissement Biens 3% - Extracommunautaire (-),taxes +tag_lu_546,Taxe - Investissement Biens 6% - Extracommunautaire (-),taxes +tag_lu_547,Taxe - Investissement Biens 8% - Extracommunautaire (-),taxes +tag_lu_548,Taxe - Investissement Biens 12% - Extracommunautaire fin privées (-),taxes +tag_lu_549,Taxe - Investissement Biens 14% - Extracommunautaire fin privées (-),taxes +tag_lu_550,Taxe - Investissement Biens 15% - Extracommunautaire fin privées (-),taxes +tag_lu_551,Taxe - Investissement Biens 17% - Extracommunautaire fin privées (-),taxes +tag_lu_552,Taxe - Investissement Biens 3% - Extracommunautaire fin privées (-),taxes +tag_lu_553,Taxe - Investissement Biens 6% - Extracommunautaire fin privées (-),taxes +tag_lu_554,Taxe - Investissement Biens 8% - Extracommunautaire fin privées (-),taxes +tag_lu_555,III.A.5. Taxe déclarée comme débiteur (voir points II.E et F),taxes +tag_lu_556,Taxe - Achat Prestations 12% - Extracommunautaire (-),taxes +tag_lu_557,Taxe - Achat Prestations 14% - Extracommunautaire (-),taxes +tag_lu_558,Taxe - Achat Prestations 15% - Extracommunautaire (-),taxes +tag_lu_559,Taxe - Achat Prestations 17% - Extracommunautaire (-),taxes +tag_lu_560,Taxe - Achat Prestations 3% - Extracommunautaire (-),taxes +tag_lu_561,Taxe - Achat Prestations 6% - Extracommunautaire (-),taxes +tag_lu_562,Taxe - Achat Prestations 8% - Extracommunautaire (-),taxes +tag_lu_563,Taxe - Achat Prestations 12% - Intracommunautaire (-),taxes +tag_lu_564,Taxe - Achat Prestations 14% - Intracommunautaire (-),taxes +tag_lu_565,Taxe - Achat Prestations 15% - Intracommunautaire (-),taxes +tag_lu_566,Taxe - Achat Prestations 17% - Intracommunautaire (-),taxes +tag_lu_567,Taxe - Achat Prestations 3% - Intracommunautaire (-),taxes +tag_lu_568,Taxe - Achat Prestations 6% - Intracommunautaire (-),taxes +tag_lu_569,Taxe - Achat Prestations 8% - Intracommunautaire (-),taxes +tag_lu_570,Taxe - Frais Prestations 12% - Extracommunautaire (-),taxes +tag_lu_571,Taxe - Frais Prestations 14% - Extracommunautaire (-),taxes +tag_lu_572,Taxe - Frais Prestations 15% - Extracommunautaire (-),taxes +tag_lu_573,Taxe - Frais Prestations 17% - Extracommunautaire (-),taxes +tag_lu_574,Taxe - Frais Prestations 3% - Extracommunautaire (-),taxes +tag_lu_575,Taxe - Frais Prestations 6% - Extracommunautaire (-),taxes +tag_lu_576,Taxe - Frais Prestations 8% - Extracommunautaire (-),taxes +tag_lu_577,Taxe - Frais Prestations 12% - Intracommunautaire (-),taxes +tag_lu_578,Taxe - Frais Prestations 14% - Intracommunautaire (-),taxes +tag_lu_579,Taxe - Frais Prestations 15% - Intracommunautaire (-),taxes +tag_lu_580,Taxe - Frais Prestations 17% - Intracommunautaire (-),taxes +tag_lu_581,Taxe - Frais Prestations 3% - Intracommunautaire (-),taxes +tag_lu_582,Taxe - Frais Prestations 6% - Intracommunautaire (-),taxes +tag_lu_583,Taxe - Frais Prestations 8% - Intracommunautaire (-),taxes +tag_lu_584,Taxe - Investissement Prestations 12% - Extracommunautaire (-),taxes +tag_lu_585,Taxe - Investissement Prestations 14% - Extracommunautaire (-),taxes +tag_lu_586,Taxe - Investissement Prestations 15% - Extracommunautaire (-),taxes +tag_lu_587,Taxe - Investissement Prestations 17% - Extracommunautaire (-),taxes +tag_lu_588,Taxe - Investissement Prestations 3% - Extracommunautaire (-),taxes +tag_lu_589,Taxe - Investissement Prestations 6% - Extracommunautaire (-),taxes +tag_lu_590,Taxe - Investissement Prestations 8% - Extracommunautaire (-),taxes +tag_lu_591,Taxe - Investissement Prestations 12% - Intracommunautaire (-),taxes +tag_lu_592,Taxe - Investissement Prestations 14% - Intracommunautaire (-),taxes +tag_lu_593,Taxe - Investissement Prestations 15% - Intracommunautaire (-),taxes +tag_lu_594,Taxe - Investissement Prestations 17% - Intracommunautaire (-),taxes +tag_lu_595,Taxe - Investissement Prestations 3% - Intracommunautaire (-),taxes +tag_lu_596,Taxe - Investissement Prestations 6% - Intracommunautaire (-),taxes +tag_lu_597,Taxe - Investissement Prestations 8% - Intracommunautaire (-),taxes +tag_lu_598,Base - Sans Taxe,taxes
\ No newline at end of file diff --git a/addons/l10n_lu/data/account.tax.template-2015.csv b/addons/l10n_lu/data/account.tax.template-2015.csv index 6e652bfb092..9a520e179df 100644 --- a/addons/l10n_lu/data/account.tax.template-2015.csv +++ b/addons/l10n_lu/data/account.tax.template-2015.csv @@ -1,408 +1,408 @@ id,name,description,type_tax_use,amount_type,amount,account_id:id,refund_account_id:id,chart_template_id:id,sequence,children_tax_ids:id,tag_ids:id,tax_group_id:id -lu_2011_tax_AB-EC-0,Achat Biens Exonéré - Extracommunautaire,AB-EC-0,purchase,percent,0,,,lu_2011_chart_1,101,,tag_AB_EC_0,tax_group_0 -lu_2011_tax_AB-EC-12-n,Achat Biens 12% - Extracommunautaire (-),AB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1103,,tag_AB_EC_12_n,tax_group_12 -lu_2011_tax_AB-EC-12-p,Achat Biens 12% - Extracommunautaire (+),AB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1104,,tag_AB_EC_12_p,tax_group_12 -lu_2011_tax_AB-EC-12,Achat Biens 12% - Extracommunautaire,AB-EC-12,purchase,group,1,,,lu_2011_chart_1,102,"lu_2011_tax_AB-EC-12-n,lu_2011_tax_AB-EC-12-p",tag_AB_EC_12,tax_group_12 -lu_2015_tax_AB-EC-14-n,Achat Biens 14% - Extracommunautaire (-),AB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1106,,tag_AB_EC_14_n,tax_group_14 -lu_2015_tax_AB-EC-14-p,Achat Biens 14% - Extracommunautaire (+),AB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1107,,tag_AB_EC_14_p,tax_group_14 -lu_2015_tax_AB-EC-14,Achat Biens 14% - Extracommunautaire,AB-EC-14,purchase,group,1,,,lu_2011_chart_1,105,"lu_2015_tax_AB-EC-14-n,lu_2015_tax_AB-EC-14-p",tag_AB_EC_14,tax_group_14 -lu_2011_tax_AB-EC-15-n,Achat Biens 15% - Extracommunautaire (-),AB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1109,,tag_AB_EC_15_n,tax_group_15 -lu_2011_tax_AB-EC-15-p,Achat Biens 15% - Extracommunautaire (+),AB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1110,,tag_AB_EC_15_p,tax_group_15 -lu_2011_tax_AB-EC-15,Achat Biens 15% - Extracommunautaire,AB-EC-15,purchase,group,100,,,lu_2011_chart_1,108,"lu_2011_tax_AB-EC-15-n,lu_2011_tax_AB-EC-15-p",tag_AB_EC_15,tax_group_15 -lu_2015_tax_AB-EC-17-n,Achat Biens 17% - Extracommunautaire (-),AB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1112,,tag_AB_EC_17_n,tax_group_17 -lu_2015_tax_AB-EC-17-p,Achat Biens 17% - Extracommunautaire (+),AB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1113,,tag_AB_EC_17_p,tax_group_17 -lu_2015_tax_AB-EC-17,Achat Biens 17% - Extracommunautaire,AB-EC-17,purchase,group,100,,,lu_2011_chart_1,111,"lu_2015_tax_AB-EC-17-n,lu_2015_tax_AB-EC-17-p",tag_AB_EC_17,tax_group_17 -lu_2011_tax_AB-EC-3-n,Achat Biens 3% - Extracommunautaire (-),AB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1115,,tag_AB_EC_3_n,tax_group_3 -lu_2011_tax_AB-EC-3-p,Achat Biens 3% - Extracommunautaire (+),AB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1116,,tag_AB_EC_3_p,tax_group_3 -lu_2011_tax_AB-EC-3,Achat Biens 3% - Extracommunautaire,AB-EC-3,purchase,group,100,,,lu_2011_chart_1,114,"lu_2011_tax_AB-EC-3-n,lu_2011_tax_AB-EC-3-p",tag_AB_EC_3,tax_group_3 -lu_2011_tax_AB-EC-6-n,Achat Biens 6% - Extracommunautaire (-),AB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1118,,tag_AB_EC_6_n,tax_group_6 -lu_2011_tax_AB-EC-6-p,Achat Biens 6% - Extracommunautaire (+),AB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1119,,tag_AB_EC_6_p,tax_group_6 -lu_2011_tax_AB-EC-6,Achat Biens 6% - Extracommunautaire,AB-EC-6,purchase,group,100,,,lu_2011_chart_1,117,"lu_2011_tax_AB-EC-6-n,lu_2011_tax_AB-EC-6-p",tag_AB_EC_6,tax_group_6 -lu_2015_tax_AB-EC-8-n,Achat Biens 8% - Extracommunautaire (-),AB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1121,,tag_AB_EC_8_n,tax_group_8 -lu_2015_tax_AB-EC-8-p,Achat Biens 8% - Extracommunautaire (+),AB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1122,,tag_AB_EC_8_p,tax_group_8 -lu_2015_tax_AB-EC-8,Achat Biens 8% - Extracommunautaire,AB-EC-8,purchase,group,100,,,lu_2011_chart_1,120,"lu_2015_tax_AB-EC-8-n,lu_2015_tax_AB-EC-8-p",tag_AB_EC_8,tax_group_8 -lu_2015_tax_AB-ECP-0,Achat Biens Exonéré - Extracommunautaire fin privées,AB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,123,,tag_AB_ECP_0,tax_group_0 -lu_2015_tax_AB-ECP-12-n,Achat Biens 12% - Extracommunautaire fin privées (-),AB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1125,,tag_AB_ECP_12_n,tax_group_12 -lu_2015_tax_AB-ECP-12-p,Achat Biens 12% - Extracommunautaire fin privées (+),AB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1126,,tag_AB_ECP_12_p,tax_group_12 -lu_2015_tax_AB-ECP-12,Achat Biens 12% - Extracommunautaire fin privées,AB-ECP-12,purchase,group,100,,,lu_2011_chart_1,124,"lu_2015_tax_AB-ECP-12-n,lu_2015_tax_AB-ECP-12-p",tag_AB_ECP_12,tax_group_12 -lu_2015_tax_AB-ECP-14-n,Achat Biens 14% - Extracommunautaire fin privées (-),AB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1128,,tag_AB_ECP_14_n,tax_group_14 -lu_2015_tax_AB-ECP-14-p,Achat Biens 14% - Extracommunautaire fin privées (+),AB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1129,,tag_AB_ECP_14_p,tax_group_14 -lu_2015_tax_AB-ECP-14,Achat Biens 14% - Extracommunautaire fin privées,AB-ECP-14,purchase,group,100,,,lu_2011_chart_1,127,"lu_2015_tax_AB-ECP-14-n,lu_2015_tax_AB-ECP-14-p",tag_AB_ECP_14,tax_group_14 -lu_2015_tax_AB-ECP-15-n,Achat Biens 15% - Extracommunautaire fin privées (-),AB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1131,,tag_AB_ECP_15_n,tax_group_15 -lu_2015_tax_AB-ECP-15-p,Achat Biens 15% - Extracommunautaire fin privées (+),AB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1132,,tag_AB_ECP_15_p,tax_group_15 -lu_2015_tax_AB-ECP-15,Achat Biens 15% - Extracommunautaire fin privées,AB-ECP-15,purchase,group,100,,,lu_2011_chart_1,130,"lu_2015_tax_AB-ECP-15-n,lu_2015_tax_AB-ECP-15-p",tag_AB_ECP_15,tax_group_15 -lu_2015_tax_AB-ECP-17-n,Achat Biens 17% - Extracommunautaire fin privées (-),AB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1134,,tag_AB_ECP_17_n,tax_group_17 -lu_2015_tax_AB-ECP-17-p,Achat Biens 17% - Extracommunautaire fin privées (+),AB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1135,,tag_AB_ECP_17_p,tax_group_17 -lu_2015_tax_AB-ECP-17,Achat Biens 17% - Extracommunautaire fin privées,AB-ECP-17,purchase,group,100,,,lu_2011_chart_1,133,"lu_2015_tax_AB-ECP-17-n,lu_2015_tax_AB-ECP-17-p",tag_AB_ECP_17,tax_group_17 -lu_2015_tax_AB-ECP-3-n,Achat Biens 3% - Extracommunautaire fin privées (-),AB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1137,,tag_AB_ECP_3_n,tax_group_3 -lu_2015_tax_AB-ECP-3-p,Achat Biens 3% - Extracommunautaire fin privées (+),AB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1138,,tag_AB_ECP_3_p,tax_group_3 -lu_2015_tax_AB-ECP-3,Achat Biens 3% - Extracommunautaire fin privées,AB-ECP-3,purchase,group,100,,,lu_2011_chart_1,136,"lu_2015_tax_AB-ECP-3-n,lu_2015_tax_AB-ECP-3-p",tag_AB_ECP_3,tax_group_3 -lu_2015_tax_AB-ECP-6-n,Achat Biens 6% - Extracommunautaire fin privées (-),AB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1140,,tag_AB_ECP_6_n,tax_group_6 -lu_2015_tax_AB-ECP-6-p,Achat Biens 6% - Extracommunautaire fin privées (+),AB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1141,,tag_AB_ECP_6_p,tax_group_6 -lu_2015_tax_AB-ECP-6,Achat Biens 6% - Extracommunautaire fin privées,AB-ECP-6,purchase,group,100,,,lu_2011_chart_1,139,"lu_2015_tax_AB-ECP-6-n,lu_2015_tax_AB-ECP-6-p",tag_AB_ECP_6,tax_group_6 -lu_2015_tax_AB-ECP-8-n,Achat Biens 8% - Extracommunautaire fin privées (-),AB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1143,,tag_AB_ECP_8_n,tax_group_8 -lu_2015_tax_AB-ECP-8-p,Achat Biens 8% - Extracommunautaire fin privées (+),AB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1144,,tag_AB_ECP_8_p,tax_group_8 -lu_2015_tax_AB-ECP-8,Achat Biens 8% - Extracommunautaire fin privées,AB-ECP-8,purchase,group,100,,,lu_2011_chart_1,142,"lu_2015_tax_AB-ECP-8-n,lu_2015_tax_AB-ECP-8-p",tag_AB_ECP_8,tax_group_8 -lu_2011_tax_AB-IC-0,Achat Biens Exonéré - Intracommunautaire,AB-IC-0,purchase,percent,0,,,lu_2011_chart_1,145,,tag_AB_IC_0,tax_group_0 -lu_2011_tax_AB-IC-12-n,Achat Biens 12% - Intracommunautaire (-),AB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1147,,tag_AB_IC_12_n,tax_group_12 -lu_2011_tax_AB-IC-12-p,Achat Biens 12% - Intracommunautaire (+),AB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1148,,tag_AB_IC_12_p,tax_group_12 -lu_2011_tax_AB-IC-12,Achat Biens 12% - Intracommunautaire,AB-IC-12,purchase,group,100,,,lu_2011_chart_1,146,"lu_2011_tax_AB-IC-12-n,lu_2011_tax_AB-IC-12-p",tag_AB_IC_12,tax_group_12 -lu_2015_tax_AB-IC-14-n,Achat Biens 14% - Intracommunautaire (-),AB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1150,,tag_AB_IC_14_n,tax_group_14 -lu_2015_tax_AB-IC-14-p,Achat Biens 14% - Intracommunautaire (+),AB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1151,,tag_AB_IC_14_p,tax_group_14 -lu_2015_tax_AB-IC-14,Achat Biens 14% - Intracommunautaire,AB-IC-14,purchase,group,100,,,lu_2011_chart_1,149,"lu_2015_tax_AB-IC-14-n,lu_2015_tax_AB-IC-14-p",tag_AB_IC_14,tax_group_14 -lu_2011_tax_AB-IC-15-n,Achat Biens 15% - Intracommunautaire (-),AB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1153,,tag_AB_IC_15_n,tax_group_15 -lu_2011_tax_AB-IC-15-p,Achat Biens 15% - Intracommunautaire (+),AB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1154,,tag_AB_IC_15_p,tax_group_15 -lu_2011_tax_AB-IC-15,Achat Biens 15% - Intracommunautaire,AB-IC-15,purchase,group,100,,,lu_2011_chart_1,152,"lu_2011_tax_AB-IC-15-n,lu_2011_tax_AB-IC-15-p",tag_AB_IC_15,tax_group_15 -lu_2015_tax_AB-IC-17-n,Achat Biens 17% - Intracommunautaire (-),AB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1156,,tag_AB_IC_17_n,tax_group_17 -lu_2015_tax_AB-IC-17-p,Achat Biens 17% - Intracommunautaire (+),AB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1157,,tag_AB_IC_17_p,tax_group_17 -lu_2015_tax_AB-IC-17,Achat Biens 17% - Intracommunautaire,AB-IC-17,purchase,group,100,,,lu_2011_chart_1,155,"lu_2015_tax_AB-IC-17-n,lu_2015_tax_AB-IC-17-p",tag_AB_IC_17,tax_group_17 -lu_2011_tax_AB-IC-3-n,Achat Biens 3% - Intracommunautaire (-),AB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1159,,tag_AB_IC_3_n,tax_group_3 -lu_2011_tax_AB-IC-3-p,Achat Biens 3% - Intracommunautaire (+),AB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1160,,tag_AB_IC_3_p,tax_group_3 -lu_2011_tax_AB-IC-3,Achat Biens 3% - Intracommunautaire,AB-IC-3,purchase,group,100,,,lu_2011_chart_1,158,"lu_2011_tax_AB-IC-3-n,lu_2011_tax_AB-IC-3-p",tag_AB_IC_3,tax_group_3 -lu_2011_tax_AB-IC-6-n,Achat Biens 6% - Intracommunautaire (-),AB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1162,,tag_AB_IC_6_n,tax_group_6 -lu_2011_tax_AB-IC-6-p,Achat Biens 6% - Intracommunautaire (+),AB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1163,,tag_AB_IC_6_p,tax_group_6 -lu_2011_tax_AB-IC-6,Achat Biens 6% - Intracommunautaire,AB-IC-6,purchase,group,100,,,lu_2011_chart_1,161,"lu_2011_tax_AB-IC-6-n,lu_2011_tax_AB-IC-6-p",tag_AB_IC_6,tax_group_6 -lu_2015_tax_AB-IC-8-n,Achat Biens 8% - Intracommunautaire (-),AB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1165,,tag_AB_IC_8_n,tax_group_8 -lu_2015_tax_AB-IC-8-p,Achat Biens 8% - Intracommunautaire (+),AB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1166,,tag_AB_IC_8_p,tax_group_8 -lu_2015_tax_AB-IC-8,Achat Biens 8% - Intracommunautaire,AB-IC-8,purchase,group,100,,,lu_2011_chart_1,164,"lu_2015_tax_AB-IC-8-n,lu_2015_tax_AB-IC-8-p",tag_AB_IC_8,tax_group_8 -lu_2011_tax_AB-PA-0,Achat Biens 0% - Pays,AB-PA-0,purchase,percent,0,,,lu_2011_chart_1,167,,tag_AB_PA_0,tax_group_0 -lu_2011_tax_AB-PA-12,Achat Biens 12% - Pays,AB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,168,,tag_AB_PA_12,tax_group_12 -lu_2015_tax_AB-PA-14,Achat Biens 14% - Pays,AB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,169,,tag_AB_PA_14,tax_group_14 -lu_2011_tax_AB-PA-15,Achat Biens 15% - Pays,AB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,170,,tag_AB_PA_15,tax_group_15 -lu_2015_tax_AB-PA-17,Achat Biens 17% - Pays,AB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,171,,tag_AB_PA_17,tax_group_17 -lu_2011_tax_AB-PA-3,Achat Biens 3% - Pays,AB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,172,,tag_AB_PA_3,tax_group_3 -lu_2011_tax_AB-PA-6,Achat Biens 6% - Pays,AB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,173,,tag_AB_PA_6,tax_group_6 -lu_2015_tax_AB-PA-8,Achat Biens 8% - Pays,AB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,174,,tag_AB_PA_8,tax_group_8 -lu_2011_tax_AP-EC-0,Achat Prestations Exonérées - Extracommunautaire,AP-EC-0,purchase,percent,0,,,lu_2011_chart_1,175,,tag_AP_EC_0,tax_group_0 -lu_2011_tax_AP-EC-12-n,Achat Prestations 12% - Extracommunautaire (-),AP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1177,,tag_AP_EC_12_n,tax_group_12 -lu_2011_tax_AP-EC-12-p,Achat Prestations 12% - Extracommunautaire (+),AP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1178,,tag_AP_EC_12_p,tax_group_12 -lu_2011_tax_AP-EC-12,Achat Prestations 12% - Extracommunautaire,AP-EC-12,purchase,group,100,,,lu_2011_chart_1,176,"lu_2011_tax_AP-EC-12-n,lu_2011_tax_AP-EC-12-p",tag_AP_EC_12,tax_group_12 -lu_2015_tax_AP-EC-14-n,Achat Prestations 14% - Extracommunautaire (-),AP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1180,,tag_AP_EC_14_n,tax_group_14 -lu_2015_tax_AP-EC-14-p,Achat Prestations 14% - Extracommunautaire (+),AP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1181,,tag_AP_EC_14_p,tax_group_14 -lu_2015_tax_AP-EC-14,Achat Prestations 14% - Extracommunautaire,AP-EC-14,purchase,group,100,,,lu_2011_chart_1,179,"lu_2015_tax_AP-EC-14-n,lu_2015_tax_AP-EC-14-p",tag_AP_EC_14,tax_group_14 -lu_2011_tax_AP-EC-15-n,Achat Prestations 15% - Extracommunautaire (-),AP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1183,,tag_AP_EC_15_n,tax_group_15 -lu_2011_tax_AP-EC-15-p,Achat Prestations 15% - Extracommunautaire (+),AP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1184,,tag_AP_EC_15_p,tax_group_15 -lu_2011_tax_AP-EC-15,Achat Prestations 15% - Extracommunautaire,AP-EC-15,purchase,group,100,,,lu_2011_chart_1,182,"lu_2011_tax_AP-EC-15-n,lu_2011_tax_AP-EC-15-p",tag_AP_EC_15,tax_group_15 -lu_2015_tax_AP-EC-17-n,Achat Prestations 17% - Extracommunautaire (-),AP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1186,,tag_AP_EC_17_n,tax_group_17 -lu_2015_tax_AP-EC-17-p,Achat Prestations 17% - Extracommunautaire (+),AP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1187,,tag_AP_EC_17_p,tax_group_17 -lu_2015_tax_AP-EC-17,Achat Prestations 17% - Extracommunautaire,AP-EC-17,purchase,group,100,,,lu_2011_chart_1,185,"lu_2015_tax_AP-EC-17-n,lu_2015_tax_AP-EC-17-p",tag_AP_EC_17,tax_group_17 -lu_2011_tax_AP-EC-3-n,Achat Prestations 3% - Extracommunautaire (-),AP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1189,,tag_AP_EC_3_n,tax_group_3 -lu_2011_tax_AP-EC-3-p,Achat Prestations 3% - Extracommunautaire (+),AP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1190,,tag_AP_EC_3_p,tax_group_3 -lu_2011_tax_AP-EC-3,Achat Prestations 3% - Extracommunautaire,AP-EC-3,purchase,group,100,,,lu_2011_chart_1,188,"lu_2011_tax_AP-EC-3-n,lu_2011_tax_AP-EC-3-p",tag_AP_EC_3,tax_group_3 -lu_2011_tax_AP-EC-6-n,Achat Prestations 6% - Extracommunautaire (-),AP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1192,,tag_AP_EC_6_n,tax_group_6 -lu_2011_tax_AP-EC-6-p,Achat Prestations 6% - Extracommunautaire (+),AP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1193,,tag_AP_EC_6_p,tax_group_6 -lu_2011_tax_AP-EC-6,Achat Prestations 6% - Extracommunautaire,AP-EC-6,purchase,group,100,,,lu_2011_chart_1,191,"lu_2011_tax_AP-EC-6-n,lu_2011_tax_AP-EC-6-p",tag_AP_EC_6,tax_group_6 -lu_2015_tax_AP-EC-8-n,Achat Prestations 8% - Extracommunautaire (-),AP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1195,,tag_AP_EC_8_n,tax_group_8 -lu_2015_tax_AP-EC-8-p,Achat Prestations 8% - Extracommunautaire (+),AP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1196,,tag_AP_EC_8_p,tax_group_8 -lu_2015_tax_AP-EC-8,Achat Prestations 8% - Extracommunautaire,AP-EC-8,purchase,group,100,,,lu_2011_chart_1,194,"lu_2015_tax_AP-EC-8-n,lu_2015_tax_AP-EC-8-p",tag_AP_EC_8,tax_group_8 -lu_2011_tax_AP-IC-0,Achat Prestations Exonérées - Intracommunautaire,AP-IC-0,purchase,percent,0,,,lu_2011_chart_1,197,,tag_AP_IC_0,tax_group_0 -lu_2011_tax_AP-IC-12-n,Achat Prestations 12% - Intracommunautaire (-),AP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1199,,tag_AP_IC_12_n,tax_group_12 -lu_2011_tax_AP-IC-12-p,Achat Prestations 12% - Intracommunautaire (+),AP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1200,,tag_AP_IC_12_p,tax_group_12 -lu_2011_tax_AP-IC-12,Achat Prestations 12% - Intracommunautaire,AP-IC-12,purchase,group,100,,,lu_2011_chart_1,198,"lu_2011_tax_AP-IC-12-n,lu_2011_tax_AP-IC-12-p",tag_AP_IC_12,tax_group_12 -lu_2015_tax_AP-IC-14-n,Achat Prestations 14% - Intracommunautaire (-),AP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1202,,tag_AP_IC_14_n,tax_group_14 -lu_2015_tax_AP-IC-14-p,Achat Prestations 14% - Intracommunautaire (+),AP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1203,,tag_AP_IC_14_p,tax_group_14 -lu_2015_tax_AP-IC-14,Achat Prestations 14% - Intracommunautaire,AP-IC-14,purchase,group,100,,,lu_2011_chart_1,201,"lu_2015_tax_AP-IC-14-n,lu_2015_tax_AP-IC-14-p",tag_AP_IC_14,tax_group_14 -lu_2011_tax_AP-IC-15-n,Achat Prestations 15% - Intracommunautaire (-),AP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1205,,tag_AP_IC_15_n,tax_group_15 -lu_2011_tax_AP-IC-15-p,Achat Prestations 15% - Intracommunautaire (+),AP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1206,,tag_AP_IC_15_p,tax_group_15 -lu_2011_tax_AP-IC-15,Achat Prestations 15% - Intracommunautaire,AP-IC-15,purchase,group,100,,,lu_2011_chart_1,204,"lu_2011_tax_AP-IC-15-n,lu_2011_tax_AP-IC-15-p",tag_AP_IC_15,tax_group_15 -lu_2015_tax_AP-IC-17-n,Achat Prestations 17% - Intracommunautaire (-),AP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1208,,tag_AP_IC_17_n,tax_group_17 -lu_2015_tax_AP-IC-17-p,Achat Prestations 17% - Intracommunautaire (+),AP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1209,,tag_AP_IC_17_p,tax_group_17 -lu_2015_tax_AP-IC-17,Achat Prestations 17% - Intracommunautaire,AP-IC-17,purchase,group,100,,,lu_2011_chart_1,207,"lu_2015_tax_AP-IC-17-n,lu_2015_tax_AP-IC-17-p",tag_AP_IC_17,tax_group_17 -lu_2011_tax_AP-IC-3-n,Achat Prestations 3% - Intracommunautaire (-),AP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1211,,tag_AP_IC_3_n,tax_group_3 -lu_2011_tax_AP-IC-3-p,Achat Prestations 3% - Intracommunautaire (+),AP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1212,,tag_AP_IC_3_p,tax_group_3 -lu_2011_tax_AP-IC-3,Achat Prestations 3% - Intracommunautaire,AP-IC-3,purchase,group,100,,,lu_2011_chart_1,210,"lu_2011_tax_AP-IC-3-n,lu_2011_tax_AP-IC-3-p",tag_AP_IC_3,tax_group_3 -lu_2011_tax_AP-IC-6-n,Achat Prestations 6% - Intracommunautaire (-),AP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1214,,tag_AP_IC_6_n,tax_group_6 -lu_2011_tax_AP-IC-6-p,Achat Prestations 6% - Intracommunautaire (+),AP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1215,,tag_AP_IC_6_p,tax_group_6 -lu_2011_tax_AP-IC-6,Achat Prestations 6% - Intracommunautaire,AP-IC-6,purchase,group,100,,,lu_2011_chart_1,213,"lu_2011_tax_AP-IC-6-n,lu_2011_tax_AP-IC-6-p",tag_AP_IC_6,tax_group_6 -lu_2015_tax_AP-IC-8-n,Achat Prestations 8% - Intracommunautaire (-),AP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1217,,tag_AP_IC_8_n,tax_group_8 -lu_2015_tax_AP-IC-8-p,Achat Prestations 8% - Intracommunautaire (+),AP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1218,,tag_AP_IC_8_p,tax_group_8 -lu_2015_tax_AP-IC-8,Achat Prestations 8% - Intracommunautaire,AP-IC-8,purchase,group,100,,,lu_2011_chart_1,216,"lu_2015_tax_AP-IC-8-n,lu_2015_tax_AP-IC-8-p",tag_AP_IC_8,tax_group_8 -lu_2011_tax_AP-PA-0,Achat Prestations 0% - Pays,AP-PA-0,purchase,percent,0,,,lu_2011_chart_1,219,,tag_AP_PA_0,tax_group_0 -lu_2011_tax_AP-PA-12,Achat Prestations 12% - Pays,AP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,220,,tag_AP_PA_12,tax_group_12 -lu_2015_tax_AP-PA-14,Achat Prestations 14% - Pays,AP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,221,,tag_AP_PA_14,tax_group_14 -lu_2011_tax_AP-PA-15,Achat Prestations 15% - Pays,AP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,222,,tag_AP_PA_15,tax_group_15 -lu_2015_tax_AP-PA-17,Achat Prestations 17% - Pays,AP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,223,,tag_AP_PA_17,tax_group_17 -lu_2011_tax_AP-PA-3,Achat Prestations 3% - Pays,AP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,224,,tag_AP_PA_3,tax_group_3 -lu_2011_tax_AP-PA-6,Achat Prestations 6% - Pays,AP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,225,,tag_AP_PA_6,tax_group_6 -lu_2015_tax_AP-PA-8,Achat Prestations 8% - Pays,AP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,226,,tag_AP_PA_8,tax_group_8 -lu_2011_tax_FB-EC-0,Frais Biens Exonéré - Extracommunautaire,FB-EC-0,purchase,percent,0,,,lu_2011_chart_1,227,,tag_FB_EC_0,tax_group_0 -lu_2011_tax_FB-EC-12-n,Frais Biens 12% - Extracommunautaire (-),FB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1229,,tag_FB_EC_12_n,tax_group_12 -lu_2011_tax_FB-EC-12-p,Frais Biens 12% - Extracommunautaire (+),FB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1230,,tag_FB_EC_12_p,tax_group_12 -lu_2011_tax_FB-EC-12,Frais Biens 12% - Extracommunautaire,FB-EC-12,purchase,group,100,,,lu_2011_chart_1,228,"lu_2011_tax_FB-EC-12-n,lu_2011_tax_FB-EC-12-p",tag_FB_EC_12,tax_group_12 -lu_2015_tax_FB-EC-14-n,Frais Biens 14% - Extracommunautaire (-),FB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1232,,tag_FB_EC_14_n,tax_group_14 -lu_2015_tax_FB-EC-14-p,Frais Biens 14% - Extracommunautaire (+),FB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1233,,tag_FB_EC_14_p,tax_group_14 -lu_2015_tax_FB-EC-14,Frais Biens 14% - Extracommunautaire,FB-EC-14,purchase,group,100,,,lu_2011_chart_1,231,"lu_2015_tax_FB-EC-14-n,lu_2015_tax_FB-EC-14-p",tag_FB_EC_14,tax_group_14 -lu_2011_tax_FB-EC-15-n,Frais Biens 15% - Extracommunautaire (-),FB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1235,,tag_FB_EC_15_n,tax_group_15 -lu_2011_tax_FB-EC-15-p,Frais Biens 15% - Extracommunautaire (+),FB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1236,,tag_FB_EC_15_p,tax_group_15 -lu_2011_tax_FB-EC-15,Frais Biens 15% - Extracommunautaire,FB-EC-15,purchase,group,100,,,lu_2011_chart_1,234,"lu_2011_tax_FB-EC-15-n,lu_2011_tax_FB-EC-15-p",tag_FB_EC_15,tax_group_15 -lu_2015_tax_FB-EC-17-n,Frais Biens 17% - Extracommunautaire (-),FB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1238,,tag_FB_EC_17_n,tax_group_17 -lu_2015_tax_FB-EC-17-p,Frais Biens 17% - Extracommunautaire (+),FB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1239,,tag_FB_EC_17_p,tax_group_17 -lu_2015_tax_FB-EC-17,Frais Biens 17% - Extracommunautaire,FB-EC-17,purchase,group,100,,,lu_2011_chart_1,237,"lu_2015_tax_FB-EC-17-n,lu_2015_tax_FB-EC-17-p",tag_FB_EC_17,tax_group_17 -lu_2011_tax_FB-EC-3-n,Frais Biens 3% - Extracommunautaire (-),FB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1241,,tag_FB_EC_3_n,tax_group_3 -lu_2011_tax_FB-EC-3-p,Frais Biens 3% - Extracommunautaire (+),FB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1242,,tag_FB_EC_3_p,tax_group_3 -lu_2011_tax_FB-EC-3,Frais Biens 3% - Extracommunautaire,FB-EC-3,purchase,group,100,,,lu_2011_chart_1,240,"lu_2011_tax_FB-EC-3-n,lu_2011_tax_FB-EC-3-p",tag_FB_EC_3,tax_group_3 -lu_2011_tax_FB-EC-6-n,Frais Biens 6% - Extracommunautaire (-),FB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1244,,tag_FB_EC_6_n,tax_group_6 -lu_2011_tax_FB-EC-6-p,Frais Biens 6% - Extracommunautaire (+),FB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1245,,tag_FB_EC_6_p,tax_group_6 -lu_2011_tax_FB-EC-6,Frais Biens 6% - Extracommunautaire,FB-EC-6,purchase,group,100,,,lu_2011_chart_1,243,"lu_2011_tax_FB-EC-6-n,lu_2011_tax_FB-EC-6-p",tag_FB_EC_6,tax_group_6 -lu_2015_tax_FB-EC-8-n,Frais Biens 8% - Extracommunautaire (-),FB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1247,,tag_FB_EC_8_n,tax_group_8 -lu_2015_tax_FB-EC-8-p,Frais Biens 8% - Extracommunautaire (+),FB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1248,,tag_FB_EC_8_p,tax_group_8 -lu_2015_tax_FB-EC-8,Frais Biens 8% - Extracommunautaire,FB-EC-8,purchase,group,100,,,lu_2011_chart_1,246,"lu_2015_tax_FB-EC-8-n,lu_2015_tax_FB-EC-8-p",tag_FB_EC_8,tax_group_8 -lu_2015_tax_FB-ECP-0,Frais Biens Exonéré - Extracommunautaire fin privées,FB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,249,,tag_FB_ECP_0,tax_group_0 -lu_2015_tax_FB-ECP-12-n,Frais Biens 12% - Extracommunautaire fin privées (-),FB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1251,,tag_FB_ECP_12_n,tax_group_12 -lu_2015_tax_FB-ECP-12-p,Frais Biens 12% - Extracommunautaire fin privées (+),FB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1252,,tag_FB_ECP_12_p,tax_group_12 -lu_2015_tax_FB-ECP-12,Frais Biens 12% - Extracommunautaire fin privées,FB-ECP-12,purchase,group,100,,,lu_2011_chart_1,250,"lu_2015_tax_FB-ECP-12-n,lu_2015_tax_FB-ECP-12-p",tag_FB_ECP_12,tax_group_12 -lu_2015_tax_FB-ECP-14-n,Frais Biens 14% - Extracommunautaire fin privées (-),FB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1254,,tag_FB_ECP_14_n,tax_group_14 -lu_2015_tax_FB-ECP-14-p,Frais Biens 14% - Extracommunautaire fin privées (+),FB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1255,,tag_FB_ECP_14_p,tax_group_14 -lu_2015_tax_FB-ECP-14,Frais Biens 14% - Extracommunautaire fin privées,FB-ECP-14,purchase,group,100,,,lu_2011_chart_1,253,"lu_2015_tax_FB-ECP-14-n,lu_2015_tax_FB-ECP-14-p",tag_FB_ECP_14,tax_group_14 -lu_2015_tax_FB-ECP-15-n,Frais Biens 15% - Extracommunautaire fin privées (-),FB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1257,,tag_FB_ECP_15_n,tax_group_15 -lu_2015_tax_FB-ECP-15-p,Frais Biens 15% - Extracommunautaire fin privées (+),FB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1258,,tag_FB_ECP_15_p,tax_group_15 -lu_2015_tax_FB-ECP-15,Frais Biens 15% - Extracommunautaire fin privées,FB-ECP-15,purchase,group,100,,,lu_2011_chart_1,256,"lu_2015_tax_FB-ECP-15-n,lu_2015_tax_FB-ECP-15-p",tag_FB_ECP_15,tax_group_15 -lu_2015_tax_FB-ECP-17-n,Frais Biens 17% - Extracommunautaire fin privées (-),FB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1260,,tag_FB_ECP_17_n,tax_group_17 -lu_2015_tax_FB-ECP-17-p,Frais Biens 17% - Extracommunautaire fin privées (+),FB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1261,,tag_FB_ECP_17_p,tax_group_17 -lu_2015_tax_FB-ECP-17,Frais Biens 17% - Extracommunautaire fin privées,FB-ECP-17,purchase,group,100,,,lu_2011_chart_1,259,"lu_2015_tax_FB-ECP-17-n,lu_2015_tax_FB-ECP-17-p",tag_FB_ECP_17,tax_group_17 -lu_2015_tax_FB-ECP-3-n,Frais Biens 3% - Extracommunautaire fin privées (-),FB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1263,,tag_FB_ECP_3_n,tax_group_3 -lu_2015_tax_FB-ECP-3-p,Frais Biens 3% - Extracommunautaire fin privées (+),FB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1264,,tag_FB_ECP_3_p,tax_group_3 -lu_2015_tax_FB-ECP-3,Frais Biens 3% - Extracommunautaire fin privées,FB-ECP-3,purchase,group,100,,,lu_2011_chart_1,262,"lu_2015_tax_FB-ECP-3-n,lu_2015_tax_FB-ECP-3-p",tag_FB_ECP_3,tax_group_3 -lu_2015_tax_FB-ECP-6-n,Frais Biens 6% - Extracommunautaire fin privées (-),FB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1266,,tag_FB_ECP_6_n,tax_group_6 -lu_2015_tax_FB-ECP-6-p,Frais Biens 6% - Extracommunautaire fin privées (+),FB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1267,,tag_FB_ECP_6_p,tax_group_6 -lu_2015_tax_FB-ECP-6,Frais Biens 6% - Extracommunautaire fin privées,FB-ECP-6,purchase,group,100,,,lu_2011_chart_1,265,"lu_2015_tax_FB-ECP-6-n,lu_2015_tax_FB-ECP-6-p",tag_FB_ECP_6,tax_group_6 -lu_2015_tax_FB-ECP-8-n,Frais Biens 8% - Extracommunautaire fin privées (-),FB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1269,,tag_FB_ECP_8_n,tax_group_8 -lu_2015_tax_FB-ECP-8-p,Frais Biens 8% - Extracommunautaire fin privées (+),FB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1270,,tag_FB_ECP_8_p,tax_group_8 -lu_2015_tax_FB-ECP-8,Frais Biens 8% - Extracommunautaire fin privées,FB-ECP-8,purchase,group,100,,,lu_2011_chart_1,268,"lu_2015_tax_FB-ECP-8-n,lu_2015_tax_FB-ECP-8-p",tag_FB_ECP_8,tax_group_8 -lu_2011_tax_FB-IC-0,Frais Biens Exonéré - Intracommunautaire,FB-IC-0,purchase,percent,0,,,lu_2011_chart_1,271,,tag_FB_IC_0,tax_group_0 -lu_2011_tax_FB-IC-12-n,Frais Biens 12% - Intracommunautaire (-),FB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1273,,tag_FB_IC_12_n,tax_group_12 -lu_2011_tax_FB-IC-12-p,Frais Biens 12% - Intracommunautaire (+),FB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1274,,tag_FB_IC_12_p,tax_group_12 -lu_2011_tax_FB-IC-12,Frais Biens 12% - Intracommunautaire,FB-IC-12,purchase,group,100,,,lu_2011_chart_1,272,"lu_2011_tax_FB-IC-12-n,lu_2011_tax_FB-IC-12-p",tag_FB_IC_12,tax_group_12 -lu_2015_tax_FB-IC-14-n,Frais Biens 14% - Intracommunautaire (-),FB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1276,,tag_FB_IC_14_n,tax_group_14 -lu_2015_tax_FB-IC-14-p,Frais Biens 14% - Intracommunautaire (+),FB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1277,,tag_FB_IC_14_p,tax_group_14 -lu_2015_tax_FB-IC-14,Frais Biens 14% - Intracommunautaire,FB-IC-14,purchase,group,100,,,lu_2011_chart_1,275,"lu_2015_tax_FB-IC-14-n,lu_2015_tax_FB-IC-14-p",tag_FB_IC_14,tax_group_14 -lu_2011_tax_FB-IC-15-n,Frais Biens 15% - Intracommunautaire (-),FB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1279,,tag_FB_IC_15_n,tax_group_15 -lu_2011_tax_FB-IC-15-p,Frais Biens 15% - Intracommunautaire (+),FB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1280,,tag_FB_IC_15_p,tax_group_15 -lu_2011_tax_FB-IC-15,Frais Biens 15% - Intracommunautaire,FB-IC-15,purchase,group,100,,,lu_2011_chart_1,278,"lu_2011_tax_FB-IC-15-n,lu_2011_tax_FB-IC-15-p",tag_FB_IC_15,tax_group_15 -lu_2015_tax_FB-IC-17-n,Frais Biens 17% - Intracommunautaire (-),FB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1282,,tag_FB_IC_17_n,tax_group_17 -lu_2015_tax_FB-IC-17-p,Frais Biens 17% - Intracommunautaire (+),FB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1283,,tag_FB_IC_17_p,tax_group_17 -lu_2015_tax_FB-IC-17,Frais Biens 17% - Intracommunautaire,FB-IC-17,purchase,group,100,,,lu_2011_chart_1,281,"lu_2015_tax_FB-IC-17-n,lu_2015_tax_FB-IC-17-p",tag_FB_IC_17,tax_group_17 -lu_2011_tax_FB-IC-3-n,Frais Biens 3% - Intracommunautaire (-),FB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1285,,tag_FB_IC_3_n,tax_group_3 -lu_2011_tax_FB-IC-3-p,Frais Biens 3% - Intracommunautaire (+),FB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1286,,tag_FB_IC_3_p,tax_group_3 -lu_2011_tax_FB-IC-3,Frais Biens 3% - Intracommunautaire,FB-IC-3,purchase,group,100,,,lu_2011_chart_1,284,"lu_2011_tax_FB-IC-3-n,lu_2011_tax_FB-IC-3-p",tag_FB_IC_3,tax_group_3 -lu_2011_tax_FB-IC-6-n,Frais Biens 6% - Intracommunautaire (-),FB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1288,,tag_FB_IC_6_n,tax_group_6 -lu_2011_tax_FB-IC-6-p,Frais Biens 6% - Intracommunautaire (+),FB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1289,,tag_FB_IC_6_p,tax_group_6 -lu_2011_tax_FB-IC-6,Frais Biens 6% - Intracommunautaire,FB-IC-6,purchase,group,100,,,lu_2011_chart_1,287,"lu_2011_tax_FB-IC-6-n,lu_2011_tax_FB-IC-6-p",tag_FB_IC_6,tax_group_6 -lu_2015_tax_FB-IC-8-n,Frais Biens 8% - Intracommunautaire (-),FB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1291,,tag_FB_IC_8_n,tax_group_8 -lu_2015_tax_FB-IC-8-p,Frais Biens 8% - Intracommunautaire (+),FB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1292,,tag_FB_IC_8_p,tax_group_8 -lu_2015_tax_FB-IC-8,Frais Biens 8% - Intracommunautaire,FB-IC-8,purchase,group,100,,,lu_2011_chart_1,290,"lu_2015_tax_FB-IC-8-n,lu_2015_tax_FB-IC-8-p",tag_FB_IC_8,tax_group_8 -lu_2011_tax_FB-PA-0,Frais Biens 0% - Pays,FB-PA-0,purchase,percent,0,,,lu_2011_chart_1,293,,tag_FB_PA_0,tax_group_0 -lu_2011_tax_FB-PA-12,Frais Biens 12% - Pays,FB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,294,,tag_FB_PA_12,tax_group_12 -lu_2015_tax_FB-PA-14,Frais Biens 14% - Pays,FB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,295,,tag_FB_PA_14,tax_group_14 -lu_2011_tax_FB-PA-15,Frais Biens 15% - Pays,FB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,296,,tag_FB_PA_15,tax_group_15 -lu_2015_tax_FB-PA-17,Frais Biens 17% - Pays,FB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,297,,tag_FB_PA_17,tax_group_17 -lu_2011_tax_FB-PA-3,Frais Biens 3% - Pays,FB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,298,,tag_FB_PA_3,tax_group_3 -lu_2011_tax_FB-PA-6,Frais Biens 6% - Pays,FB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,299,,tag_FB_PA_6,tax_group_6 -lu_2015_tax_FB-PA-8,Frais Biens 8% - Pays,FB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,300,,tag_FB_PA_8,tax_group_8 -lu_2011_tax_FP-EC-0,Frais Prestations Exonérées - Extracommunautaire,FP-EC-0,purchase,percent,0,,,lu_2011_chart_1,301,,tag_FP_EC_0,tax_group_0 -lu_2011_tax_FP-EC-12-n,Frais Prestations 12% - Extracommunautaire (-),FP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1303,,tag_FP_EC_12_n,tax_group_12 -lu_2011_tax_FP-EC-12-p,Frais Prestations 12% - Extracommunautaire (+),FP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1304,,tag_FP_EC_12_p,tax_group_12 -lu_2011_tax_FP-EC-12,Frais Prestations 12% - Extracommunautaire,FP-EC-12,purchase,group,100,,,lu_2011_chart_1,302,"lu_2011_tax_FP-EC-12-n,lu_2011_tax_FP-EC-12-p",tag_FP_EC_12,tax_group_12 -lu_2015_tax_FP-EC-14-n,Frais Prestations 14% - Extracommunautaire (-),FP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1306,,tag_FP_EC_14_n,tax_group_14 -lu_2015_tax_FP-EC-14-p,Frais Prestations 14% - Extracommunautaire (+),FP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1307,,tag_FP_EC_14_p,tax_group_14 -lu_2015_tax_FP-EC-14,Frais Prestations 14% - Extracommunautaire,FP-EC-14,purchase,group,100,,,lu_2011_chart_1,305,"lu_2015_tax_FP-EC-14-n,lu_2015_tax_FP-EC-14-p",tag_FP_EC_14,tax_group_14 -lu_2011_tax_FP-EC-15-n,Frais Prestations 15% - Extracommunautaire (-),FP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1309,,tag_FP_EC_15_n,tax_group_15 -lu_2011_tax_FP-EC-15-p,Frais Prestations 15% - Extracommunautaire (+),FP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1310,,tag_FP_EC_15_p,tax_group_15 -lu_2011_tax_FP-EC-15,Frais Prestations 15% - Extracommunautaire,FP-EC-15,purchase,group,100,,,lu_2011_chart_1,308,"lu_2011_tax_FP-EC-15-n,lu_2011_tax_FP-EC-15-p",tag_FP_EC_15,tax_group_15 -lu_2015_tax_FP-EC-17-n,Frais Prestations 17% - Extracommunautaire (-),FP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1312,,tag_FP_EC_17_n,tax_group_17 -lu_2015_tax_FP-EC-17-p,Frais Prestations 17% - Extracommunautaire (+),FP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1313,,tag_FP_EC_17_p,tax_group_17 -lu_2015_tax_FP-EC-17,Frais Prestations 17% - Extracommunautaire,FP-EC-17,purchase,group,100,,,lu_2011_chart_1,311,"lu_2015_tax_FP-EC-17-n,lu_2015_tax_FP-EC-17-p",tag_FP_EC_17,tax_group_17 -lu_2011_tax_FP-EC-3-n,Frais Prestations 3% - Extracommunautaire (-),FP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1315,,tag_FP_EC_3_n,tax_group_3 -lu_2011_tax_FP-EC-3-p,Frais Prestations 3% - Extracommunautaire (+),FP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1316,,tag_FP_EC_3_p,tax_group_3 -lu_2011_tax_FP-EC-3,Frais Prestations 3% - Extracommunautaire,FP-EC-3,purchase,group,100,,,lu_2011_chart_1,314,"lu_2011_tax_FP-EC-3-n,lu_2011_tax_FP-EC-3-p",tag_FP_EC_3,tax_group_3 -lu_2011_tax_FP-EC-6-n,Frais Prestations 6% - Extracommunautaire (-),FP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1318,,tag_FP_EC_6_n,tax_group_6 -lu_2011_tax_FP-EC-6-p,Frais Prestations 6% - Extracommunautaire (+),FP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1319,,tag_FP_EC_6_p,tax_group_6 -lu_2011_tax_FP-EC-6,Frais Prestations 6% - Extracommunautaire,FP-EC-6,purchase,group,100,,,lu_2011_chart_1,317,"lu_2011_tax_FP-EC-6-n,lu_2011_tax_FP-EC-6-p",tag_FP_EC_6,tax_group_6 -lu_2015_tax_FP-EC-8-n,Frais Prestations 8% - Extracommunautaire (-),FP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1321,,tag_FP_EC_8_n,tax_group_8 -lu_2015_tax_FP-EC-8-p,Frais Prestations 8% - Extracommunautaire (+),FP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1322,,tag_FP_EC_8_p,tax_group_8 -lu_2015_tax_FP-EC-8,Frais Prestations 8% - Extracommunautaire,FP-EC-8,purchase,group,100,,,lu_2011_chart_1,320,"lu_2015_tax_FP-EC-8-n,lu_2015_tax_FP-EC-8-p",tag_FP_EC_8,tax_group_8 -lu_2011_tax_FP-IC-0,Frais Prestations Exonérées - Intracommunautaire,FP-IC-0,purchase,percent,0,,,lu_2011_chart_1,323,,tag_FP_IC_0,tax_group_0 -lu_2011_tax_FP-IC-12-n,Frais Prestations 12% - Intracommunautaire (-),FP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1325,,tag_FP_IC_12_n,tax_group_12 -lu_2011_tax_FP-IC-12-p,Frais Prestations 12% - Intracommunautaire (+),FP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1326,,tag_FP_IC_12_p,tax_group_12 -lu_2011_tax_FP-IC-12,Frais Prestations 12% - Intracommunautaire,FP-IC-12,purchase,group,100,,,lu_2011_chart_1,324,"lu_2011_tax_FP-IC-12-n,lu_2011_tax_FP-IC-12-p",tag_FP_IC_12,tax_group_12 -lu_2015_tax_FP-IC-14-n,Frais Prestations 14% - Intracommunautaire (-),FP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1328,,tag_FP_IC_14_n,tax_group_14 -lu_2015_tax_FP-IC-14-p,Frais Prestations 14% - Intracommunautaire (+),FP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1329,,tag_FP_IC_14_p,tax_group_14 -lu_2015_tax_FP-IC-14,Frais Prestations 14% - Intracommunautaire,FP-IC-14,purchase,group,100,,,lu_2011_chart_1,327,"lu_2015_tax_FP-IC-14-n,lu_2015_tax_FP-IC-14-p",tag_FP_IC_14,tax_group_14 -lu_2011_tax_FP-IC-15-n,Frais Prestations 15% - Intracommunautaire (-),FP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1331,,tag_FP_IC_15_n,tax_group_15 -lu_2011_tax_FP-IC-15-p,Frais Prestations 15% - Intracommunautaire (+),FP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1332,,tag_FP_IC_15_p,tax_group_15 -lu_2011_tax_FP-IC-15,Frais Prestations 15% - Intracommunautaire,FP-IC-15,purchase,group,100,,,lu_2011_chart_1,330,"lu_2011_tax_FP-IC-15-n,lu_2011_tax_FP-IC-15-p",tag_FP_IC_15,tax_group_15 -lu_2015_tax_FP-IC-17-n,Frais Prestations 17% - Intracommunautaire (-),FP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1334,,tag_FP_IC_17_n,tax_group_17 -lu_2015_tax_FP-IC-17-p,Frais Prestations 17% - Intracommunautaire (+),FP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1335,,tag_FP_IC_17_p,tax_group_17 -lu_2015_tax_FP-IC-17,Frais Prestations 17% - Intracommunautaire,FP-IC-17,purchase,group,100,,,lu_2011_chart_1,333,"lu_2015_tax_FP-IC-17-n,lu_2015_tax_FP-IC-17-p",tag_FP_IC_17,tax_group_17 -lu_2011_tax_FP-IC-3-n,Frais Prestations 3% - Intracommunautaire (-),FP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1337,,tag_FP_IC_3_n,tax_group_3 -lu_2011_tax_FP-IC-3-p,Frais Prestations 3% - Intracommunautaire (+),FP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1338,,tag_FP_IC_3_p,tax_group_3 -lu_2011_tax_FP-IC-3,Frais Prestations 3% - Intracommunautaire,FP-IC-3,purchase,group,100,,,lu_2011_chart_1,336,"lu_2011_tax_FP-IC-3-n,lu_2011_tax_FP-IC-3-p",tag_FP_IC_3,tax_group_3 -lu_2011_tax_FP-IC-6-n,Frais Prestations 6% - Intracommunautaire (-),FP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1340,,tag_FP_IC_6_n,tax_group_6 -lu_2011_tax_FP-IC-6-p,Frais Prestations 6% - Intracommunautaire (+),FP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1341,,tag_FP_IC_6_p,tax_group_6 -lu_2011_tax_FP-IC-6,Frais Prestations 6% - Intracommunautaire,FP-IC-6,purchase,group,100,,,lu_2011_chart_1,339,"lu_2011_tax_FP-IC-6-n,lu_2011_tax_FP-IC-6-p",tag_FP_IC_6,tax_group_6 -lu_2015_tax_FP-IC-8-n,Frais Prestations 8% - Intracommunautaire (-),FP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1343,,tag_FP_IC_8_n,tax_group_8 -lu_2015_tax_FP-IC-8-p,Frais Prestations 8% - Intracommunautaire (+),FP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1344,,tag_FP_IC_8_p,tax_group_8 -lu_2015_tax_FP-IC-8,Frais Prestations 8% - Intracommunautaire,FP-IC-8,purchase,group,100,,,lu_2011_chart_1,342,"lu_2015_tax_FP-IC-8-n,lu_2015_tax_FP-IC-8-p",tag_FP_IC_8,tax_group_8 -lu_2011_tax_FP-PA-0,Frais Prestations 0% - Pays,FP-PA-0,purchase,percent,0,,,lu_2011_chart_1,345,,tag_FP_PA_0,tax_group_0 -lu_2011_tax_FP-PA-12,Frais Prestations 12% - Pays,FP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,346,,tag_FP_PA_12,tax_group_12 -lu_2015_tax_FP-PA-14,Frais Prestations 14% - Pays,FP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,347,,tag_FP_PA_14,tax_group_14 -lu_2011_tax_FP-PA-15,Frais Prestations 15% - Pays,FP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,348,,tag_FP_PA_15,tax_group_15 -lu_2015_tax_FP-PA-17,Frais Prestations 17% - Pays,FP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,349,,tag_FP_PA_17,tax_group_17 -lu_2011_tax_FP-PA-3,Frais Prestations 3% - Pays,FP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,350,,tag_FP_PA_3,tax_group_3 -lu_2011_tax_FP-PA-6,Frais Prestations 6% - Pays,FP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,351,,tag_FP_PA_6,tax_group_6 -lu_2015_tax_FP-PA-8,Frais Prestations 8% - Pays,FP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,352,,tag_FP_PA_8,tax_group_8 -lu_2011_tax_IB-EC-0,Investissement Biens Exonéré - Extracommunautaire,IB-EC-0,purchase,percent,0,,,lu_2011_chart_1,353,,tag_IB_EC_0,tax_group_0 -lu_2011_tax_IB-EC-12-n,Investissement Biens 12% - Extracommunautaire (-),IB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1355,,tag_IB_EC_12_n,tax_group_12 -lu_2011_tax_IB-EC-12-p,Investissement Biens 12% - Extracommunautaire (+),IB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1356,,tag_IB_EC_12_p,tax_group_12 -lu_2011_tax_IB-EC-12,Investissement Biens 12% - Extracommunautaire,IB-EC-12,purchase,group,100,,,lu_2011_chart_1,354,"lu_2011_tax_IB-EC-12-n,lu_2011_tax_IB-EC-12-p",tag_IB_EC_12,tax_group_12 -lu_2015_tax_IB-EC-14-n,Investissement Biens 14% - Extracommunautaire (-),IB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1358,,tag_IB_EC_14_n,tax_group_14 -lu_2015_tax_IB-EC-14-p,Investissement Biens 14% - Extracommunautaire (+),IB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1359,,tag_IB_EC_14_p,tax_group_14 -lu_2015_tax_IB-EC-14,Investissement Biens 14% - Extracommunautaire,IB-EC-14,purchase,group,100,,,lu_2011_chart_1,357,"lu_2015_tax_IB-EC-14-n,lu_2015_tax_IB-EC-14-p",tag_IB_EC_14,tax_group_14 -lu_2011_tax_IB-EC-15-n,Investissement Biens 15% - Extracommunautaire (-),IB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1361,,tag_IB_EC_15_n,tax_group_15 -lu_2011_tax_IB-EC-15-p,Investissement Biens 15% - Extracommunautaire (+),IB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1362,,tag_IB_EC_15_p,tax_group_15 -lu_2011_tax_IB-EC-15,Investissement Biens 15% - Extracommunautaire,IB-EC-15,purchase,group,100,,,lu_2011_chart_1,360,"lu_2011_tax_IB-EC-15-n,lu_2011_tax_IB-EC-15-p",tag_IB_EC_15,tax_group_15 -lu_2015_tax_IB-EC-17-n,Investissement Biens 17% - Extracommunautaire (-),IB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1364,,tag_IB_EC_17_n,tax_group_17 -lu_2015_tax_IB-EC-17-p,Investissement Biens 17% - Extracommunautaire (+),IB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1365,,tag_IB_EC_17_p,tax_group_17 -lu_2015_tax_IB-EC-17,Investissement Biens 17% - Extracommunautaire,IB-EC-17,purchase,group,100,,,lu_2011_chart_1,363,"lu_2015_tax_IB-EC-17-n,lu_2015_tax_IB-EC-17-p",tag_IB_EC_17,tax_group_17 -lu_2011_tax_IB-EC-3-n,Investissement Biens 3% - Extracommunautaire (-),IB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1367,,tag_IB_EC_3_n,tax_group_3 -lu_2011_tax_IB-EC-3-p,Investissement Biens 3% - Extracommunautaire (+),IB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1368,,tag_IB_EC_3_p,tax_group_3 -lu_2011_tax_IB-EC-3,Investissement Biens 3% - Extracommunautaire,IB-EC-3,purchase,group,100,,,lu_2011_chart_1,366,"lu_2011_tax_IB-EC-3-n,lu_2011_tax_IB-EC-3-p",tag_IB_EC_3,tax_group_3 -lu_2011_tax_IB-EC-6-n,Investissement Biens 6% - Extracommunautaire (-),IB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1370,,tag_IB_EC_6_n,tax_group_6 -lu_2011_tax_IB-EC-6-p,Investissement Biens 6% - Extracommunautaire (+),IB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1371,,tag_IB_EC_6_p,tax_group_6 -lu_2011_tax_IB-EC-6,Investissement Biens 6% - Extracommunautaire,IB-EC-6,purchase,group,100,,,lu_2011_chart_1,369,"lu_2011_tax_IB-EC-6-n,lu_2011_tax_IB-EC-6-p",tag_IB_EC_6,tax_group_6 -lu_2015_tax_IB-EC-8-n,Investissement Biens 8% - Extracommunautaire (-),IB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1373,,tag_IB_EC_8_n,tax_group_8 -lu_2015_tax_IB-EC-8-p,Investissement Biens 8% - Extracommunautaire (+),IB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1374,,tag_IB_EC_8_p,tax_group_8 -lu_2015_tax_IB-EC-8,Investissement Biens 8% - Extracommunautaire,IB-EC-8,purchase,group,100,,,lu_2011_chart_1,372,"lu_2015_tax_IB-EC-8-n,lu_2015_tax_IB-EC-8-p",tag_IB_EC_8,tax_group_8 -lu_2015_tax_IB-ECP-0,Investissement Biens Exonéré - Extracommunautaire fin privées,IB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,375,,tag_IB_ECP_0,tax_group_0 -lu_2015_tax_IB-ECP-12-n,Investissement Biens 12% - Extracommunautaire fin privées (-),IB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1377,,tag_IB_ECP_12_n,tax_group_12 -lu_2015_tax_IB-ECP-12-p,Investissement Biens 12% - Extracommunautaire fin privées (+),IB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1378,,tag_IB_ECP_12_p,tax_group_12 -lu_2015_tax_IB-ECP-12,Investissement Biens 12% - Extracommunautaire fin privées,IB-ECP-12,purchase,group,100,,,lu_2011_chart_1,376,"lu_2015_tax_IB-ECP-12-n,lu_2015_tax_IB-ECP-12-p",tag_IB_ECP_12,tax_group_12 -lu_2015_tax_IB-ECP-14-n,Investissement Biens 14% - Extracommunautaire fin privées (-),IB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1380,,tag_IB_ECP_14_n,tax_group_14 -lu_2015_tax_IB-ECP-14-p,Investissement Biens 14% - Extracommunautaire fin privées (+),IB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1381,,tag_IB_ECP_14_p,tax_group_14 -lu_2015_tax_IB-ECP-14,Investissement Biens 14% - Extracommunautaire fin privées,IB-ECP-14,purchase,group,100,,,lu_2011_chart_1,379,"lu_2015_tax_IB-ECP-14-n,lu_2015_tax_IB-ECP-14-p",tag_IB_ECP_14,tax_group_14 -lu_2015_tax_IB-ECP-15-n,Investissement Biens 15% - Extracommunautaire fin privées (-),IB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1383,,tag_IB_ECP_15_n,tax_group_15 -lu_2015_tax_IB-ECP-15-p,Investissement Biens 15% - Extracommunautaire fin privées (+),IB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1384,,tag_IB_ECP_15_p,tax_group_15 -lu_2015_tax_IB-ECP-15,Investissement Biens 15% - Extracommunautaire fin privées,IB-ECP-15,purchase,group,100,,,lu_2011_chart_1,382,"lu_2015_tax_IB-ECP-15-n,lu_2015_tax_IB-ECP-15-p",tag_IB_ECP_15,tax_group_15 -lu_2015_tax_IB-ECP-17-n,Investissement Biens 17% - Extracommunautaire fin privées (-),IB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1386,,tag_IB_ECP_17_n,tax_group_17 -lu_2015_tax_IB-ECP-17-p,Investissement Biens 17% - Extracommunautaire fin privées (+),IB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1387,,tag_IB_ECP_17_p,tax_group_17 -lu_2015_tax_IB-ECP-17,Investissement Biens 17% - Extracommunautaire fin privées,IB-ECP-17,purchase,group,100,,,lu_2011_chart_1,385,"lu_2015_tax_IB-ECP-17-n,lu_2015_tax_IB-ECP-17-p",tag_IB_ECP_17,tax_group_17 -lu_2015_tax_IB-ECP-3-n,Investissement Biens 3% - Extracommunautaire fin privées (-),IB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1389,,tag_IB_ECP_3_n,tax_group_3 -lu_2015_tax_IB-ECP-3-p,Investissement Biens 3% - Extracommunautaire fin privées (+),IB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1390,,tag_IB_ECP_3_p,tax_group_3 -lu_2015_tax_IB-ECP-3,Investissement Biens 3% - Extracommunautaire fin privées,IB-ECP-3,purchase,group,100,,,lu_2011_chart_1,388,"lu_2015_tax_IB-ECP-3-n,lu_2015_tax_IB-ECP-3-p",tag_IB_ECP_3,tax_group_3 -lu_2015_tax_IB-ECP-6-n,Investissement Biens 6% - Extracommunautaire fin privées (-),IB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1392,,tag_IB_ECP_6_n,tax_group_6 -lu_2015_tax_IB-ECP-6-p,Investissement Biens 6% - Extracommunautaire fin privées (+),IB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1393,,tag_IB_ECP_6_p,tax_group_6 -lu_2015_tax_IB-ECP-6,Investissement Biens 6% - Extracommunautaire fin privées,IB-ECP-6,purchase,group,100,,,lu_2011_chart_1,391,"lu_2015_tax_IB-ECP-6-n,lu_2015_tax_IB-ECP-6-p",tag_IB_ECP_6,tax_group_6 -lu_2015_tax_IB-ECP-8-n,Investissement Biens 8% - Extracommunautaire fin privées (-),IB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1395,,tag_IB_ECP_8_n,tax_group_8 -lu_2015_tax_IB-ECP-8-p,Investissement Biens 8% - Extracommunautaire fin privées (+),IB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1396,,tag_IB_ECP_8_p,tax_group_8 -lu_2015_tax_IB-ECP-8,Investissement Biens 8% - Extracommunautaire fin privées,IB-ECP-8,purchase,group,100,,,lu_2011_chart_1,394,"lu_2015_tax_IB-ECP-8-n,lu_2015_tax_IB-ECP-8-p",tag_IB_ECP_8,tax_group_8 -lu_2011_tax_IB-IC-0,Investissement Biens Exonéré - Intracommunautaire,IB-IC-0,purchase,percent,0,,,lu_2011_chart_1,397,,tag_IB_IC_0,tax_group_0 -lu_2011_tax_IB-IC-12-n,Investissement Biens 12% - Intracommunautaire (-),IB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1399,,tag_IB_IC_12_n,tax_group_12 -lu_2011_tax_IB-IC-12-p,Investissement Biens 12% - Intracommunautaire (+),IB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1400,,tag_IB_IC_12_p,tax_group_12 -lu_2011_tax_IB-IC-12,Investissement Biens 12% - Intracommunautaire,IB-IC-12,purchase,group,100,,,lu_2011_chart_1,398,"lu_2011_tax_IB-IC-12-n,lu_2011_tax_IB-IC-12-p",tag_IB_IC_12,tax_group_12 -lu_2015_tax_IB-IC-14-n,Investissement Biens 14% - Intracommunautaire (-),IB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1402,,tag_IB_IC_14_n,tax_group_14 -lu_2015_tax_IB-IC-14-p,Investissement Biens 14% - Intracommunautaire (+),IB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1403,,tag_IB_IC_14_p,tax_group_14 -lu_2015_tax_IB-IC-14,Investissement Biens 14% - Intracommunautaire,IB-IC-14,purchase,group,100,,,lu_2011_chart_1,401,"lu_2015_tax_IB-IC-14-n,lu_2015_tax_IB-IC-14-p",tag_IB_IC_14,tax_group_14 -lu_2011_tax_IB-IC-15-n,Investissement Biens 15% - Intracommunautaire (-),IB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1405,,tag_IB_IC_15_n,tax_group_15 -lu_2011_tax_IB-IC-15-p,Investissement Biens 15% - Intracommunautaire (+),IB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1406,,tag_IB_IC_15_p,tax_group_15 -lu_2011_tax_IB-IC-15,Investissement Biens 15% - Intracommunautaire,IB-IC-15,purchase,group,100,,,lu_2011_chart_1,404,"lu_2011_tax_IB-IC-15-n,lu_2011_tax_IB-IC-15-p",tag_IB_IC_15,tax_group_15 -lu_2015_tax_IB-IC-17-n,Investissement Biens 17% - Intracommunautaire (-),IB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1408,,tag_IB_IC_17_n,tax_group_17 -lu_2015_tax_IB-IC-17-p,Investissement Biens 17% - Intracommunautaire (+),IB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1409,,tag_IB_IC_17_p,tax_group_17 -lu_2015_tax_IB-IC-17,Investissement Biens 17% - Intracommunautaire,IB-IC-17,purchase,group,100,,,lu_2011_chart_1,407,"lu_2015_tax_IB-IC-17-n,lu_2015_tax_IB-IC-17-p",tag_IB_IC_17,tax_group_17 -lu_2011_tax_IB-IC-3-n,Investissement Biens 3% - Intracommunautaire (-),IB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1411,,tag_IB_IC_3_n,tax_group_3 -lu_2011_tax_IB-IC-3-p,Investissement Biens 3% - Intracommunautaire (+),IB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1412,,tag_IB_IC_3_p,tax_group_3 -lu_2011_tax_IB-IC-3,Investissement Biens 3% - Intracommunautaire,IB-IC-3,purchase,group,100,,,lu_2011_chart_1,410,"lu_2011_tax_IB-IC-3-n,lu_2011_tax_IB-IC-3-p",tag_IB_IC_3,tax_group_3 -lu_2011_tax_IB-IC-6-n,Investissement Biens 6% - Intracommunautaire (-),IB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1414,,tag_IB_IC_6_n,tax_group_6 -lu_2011_tax_IB-IC-6-p,Investissement Biens 6% - Intracommunautaire (+),IB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1415,,tag_IB_IC_6_p,tax_group_6 -lu_2011_tax_IB-IC-6,Investissement Biens 6% - Intracommunautaire,IB-IC-6,purchase,group,100,,,lu_2011_chart_1,413,"lu_2011_tax_IB-IC-6-n,lu_2011_tax_IB-IC-6-p",tag_IB_IC_6,tax_group_6 -lu_2015_tax_IB-IC-8-n,Investissement Biens 8% - Intracommunautaire (-),IB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1417,,tag_IB_IC_8_n,tax_group_8 -lu_2015_tax_IB-IC-8-p,Investissement Biens 8% - Intracommunautaire (+),IB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1418,,tag_IB_IC_8_p,tax_group_8 -lu_2015_tax_IB-IC-8,Investissement Biens 8% - Intracommunautaire,IB-IC-8,purchase,group,100,,,lu_2011_chart_1,416,"lu_2015_tax_IB-IC-8-n,lu_2015_tax_IB-IC-8-p",tag_IB_IC_8,tax_group_8 -lu_2011_tax_IB-PA-0,Investissement Biens 0% - Pays,IB-PA-0,purchase,percent,0,,,lu_2011_chart_1,419,,tag_IB_PA_0,tax_group_0 -lu_2011_tax_IB-PA-12,Investissement Biens 12% - Pays,IB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,420,,tag_IB_PA_12,tax_group_12 -lu_2015_tax_IB-PA-14,Investissement Biens 14% - Pays,IB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,421,,tag_IB_PA_14,tax_group_14 -lu_2011_tax_IB-PA-15,Investissement Biens 15% - Pays,IB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,422,,tag_IB_PA_15,tax_group_15 -lu_2015_tax_IB-PA-17,Investissement Biens 17% - Pays,IB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,423,,tag_IB_PA_17,tax_group_17 -lu_2011_tax_IB-PA-3,Investissement Biens 3% - Pays,IB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,424,,tag_IB_PA_3,tax_group_3 -lu_2011_tax_IB-PA-6,Investissement Biens 6% - Pays,IB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,425,,tag_IB_PA_6,tax_group_6 -lu_2015_tax_IB-PA-8,Investissement Biens 8% - Pays,IB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,426,,tag_IB_PA_8,tax_group_8 -lu_2011_tax_IP-EC-0,Investissement Prestations Exonérées - Extracommunautaire,IP-EC-0,purchase,percent,0,,,lu_2011_chart_1,427,,tag_IP_EC_0,tax_group_0 -lu_2011_tax_IP-EC-12-n,Investissement Prestations 12% - Extracommunautaire (-),IP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1429,,tag_IP_EC_12_n,tax_group_12 -lu_2011_tax_IP-EC-12-p,Investissement Prestations 12% - Extracommunautaire (+),IP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1430,,tag_IP_EC_12_p,tax_group_12 -lu_2011_tax_IP-EC-12,Investissement Prestations 12% - Extracommunautaire,IP-EC-12,purchase,group,100,,,lu_2011_chart_1,428,"lu_2011_tax_IP-EC-12-n,lu_2011_tax_IP-EC-12-p",tag_IP_EC_12,tax_group_12 -lu_2015_tax_IP-EC-14-n,Investissement Prestations 14% - Extracommunautaire (-),IP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1432,,tag_IP_EC_14_n,tax_group_14 -lu_2015_tax_IP-EC-14-p,Investissement Prestations 14% - Extracommunautaire (+),IP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1433,,tag_IP_EC_14_p,tax_group_14 -lu_2015_tax_IP-EC-14,Investissement Prestations 14% - Extracommunautaire,IP-EC-14,purchase,group,100,,,lu_2011_chart_1,431,"lu_2015_tax_IP-EC-14-n,lu_2015_tax_IP-EC-14-p",tag_IP_EC_14,tax_group_14 -lu_2011_tax_IP-EC-15-n,Investissement Prestations 15% - Extracommunautaire (-),IP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1435,,tag_IP_EC_15_n,tax_group_15 -lu_2011_tax_IP-EC-15-p,Investissement Prestations 15% - Extracommunautaire (+),IP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1436,,tag_IP_EC_15_p,tax_group_15 -lu_2011_tax_IP-EC-15,Investissement Prestations 15% - Extracommunautaire,IP-EC-15,purchase,group,100,,,lu_2011_chart_1,434,"lu_2011_tax_IP-EC-15-n,lu_2011_tax_IP-EC-15-p",tag_IP_EC_15,tax_group_15 -lu_2015_tax_IP-EC-17-n,Investissement Prestations 17% - Extracommunautaire (-),IP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1438,,tag_IP_EC_17_n,tax_group_17 -lu_2015_tax_IP-EC-17-p,Investissement Prestations 17% - Extracommunautaire (+),IP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1439,,tag_IP_EC_17_p,tax_group_17 -lu_2015_tax_IP-EC-17,Investissement Prestations 17% - Extracommunautaire,IP-EC-17,purchase,group,100,,,lu_2011_chart_1,437,"lu_2015_tax_IP-EC-17-n,lu_2015_tax_IP-EC-17-p",tag_IP_EC_17,tax_group_17 -lu_2011_tax_IP-EC-3-n,Investissement Prestations 3% - Extracommunautaire (-),IP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1441,,tag_IP_EC_3_n,tax_group_3 -lu_2011_tax_IP-EC-3-p,Investissement Prestations 3% - Extracommunautaire (+),IP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1442,,tag_IP_EC_3_p,tax_group_3 -lu_2011_tax_IP-EC-3,Investissement Prestations 3% - Extracommunautaire,IP-EC-3,purchase,group,100,,,lu_2011_chart_1,440,"lu_2011_tax_IP-EC-3-n,lu_2011_tax_IP-EC-3-p",tag_IP_EC_3,tax_group_3 -lu_2011_tax_IP-EC-6-n,Investissement Prestations 6% - Extracommunautaire (-),IP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1444,,tag_IP_EC_6_n,tax_group_6 -lu_2011_tax_IP-EC-6-p,Investissement Prestations 6% - Extracommunautaire (+),IP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1445,,tag_IP_EC_6_p,tax_group_6 -lu_2011_tax_IP-EC-6,Investissement Prestations 6% - Extracommunautaire,IP-EC-6,purchase,group,100,,,lu_2011_chart_1,443,"lu_2011_tax_IP-EC-6-n,lu_2011_tax_IP-EC-6-p",tag_IP_EC_6,tax_group_6 -lu_2015_tax_IP-EC-8-n,Investissement Prestations 8% - Extracommunautaire (-),IP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1447,,tag_IP_EC_8_n,tax_group_8 -lu_2015_tax_IP-EC-8-p,Investissement Prestations 8% - Extracommunautaire (+),IP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1448,,tag_IP_EC_8_p,tax_group_8 -lu_2015_tax_IP-EC-8,Investissement Prestations 8% - Extracommunautaire,IP-EC-8,purchase,group,100,,,lu_2011_chart_1,446,"lu_2015_tax_IP-EC-8-n,lu_2015_tax_IP-EC-8-p",tag_IP_EC_8,tax_group_8 -lu_2011_tax_IP-IC-0,Investissement Prestations Exonérées - Intracommunautaire,IP-IC-0,purchase,percent,0,,,lu_2011_chart_1,449,,tag_IP_IC_0,tax_group_0 -lu_2011_tax_IP-IC-12-n,Investissement Prestations 12% - Intracommunautaire (-),IP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1451,,tag_IP_IC_12_n,tax_group_12 -lu_2011_tax_IP-IC-12-p,Investissement Prestations 12% - Intracommunautaire (+),IP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1452,,tag_IP_IC_12_p,tax_group_12 -lu_2011_tax_IP-IC-12,Investissement Prestations 12% - Intracommunautaire,IP-IC-12,purchase,group,100,,,lu_2011_chart_1,450,"lu_2011_tax_IP-IC-12-n,lu_2011_tax_IP-IC-12-p",tag_IP_IC_12,tax_group_12 -lu_2015_tax_IP-IC-14-n,Investissement Prestations 14% - Intracommunautaire (-),IP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1454,,tag_IP_IC_14_n,tax_group_14 -lu_2015_tax_IP-IC-14-p,Investissement Prestations 14% - Intracommunautaire (+),IP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1455,,tag_IP_IC_14_p,tax_group_14 -lu_2015_tax_IP-IC-14,Investissement Prestations 14% - Intracommunautaire,IP-IC-14,purchase,group,100,,,lu_2011_chart_1,453,"lu_2015_tax_IP-IC-14-n,lu_2015_tax_IP-IC-14-p",tag_IP_IC_14,tax_group_14 -lu_2011_tax_IP-IC-15-n,Investissement Prestations 15% - Intracommunautaire (-),IP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1457,,tag_IP_IC_15_n,tax_group_15 -lu_2011_tax_IP-IC-15-p,Investissement Prestations 15% - Intracommunautaire (+),IP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1458,,tag_IP_IC_15_p,tax_group_15 -lu_2011_tax_IP-IC-15,Investissement Prestations 15% - Intracommunautaire,IP-IC-15,purchase,group,100,,,lu_2011_chart_1,456,"lu_2011_tax_IP-IC-15-n,lu_2011_tax_IP-IC-15-p",tag_IP_IC_15,tax_group_15 -lu_2015_tax_IP-IC-17-n,Investissement Prestations 17% - Intracommunautaire (-),IP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1460,,tag_IP_IC_17_n,tax_group_17 -lu_2015_tax_IP-IC-17-p,Investissement Prestations 17% - Intracommunautaire (+),IP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1461,,tag_IP_IC_17_p,tax_group_17 -lu_2015_tax_IP-IC-17,Investissement Prestations 17% - Intracommunautaire,IP-IC-17,purchase,group,100,,,lu_2011_chart_1,459,"lu_2015_tax_IP-IC-17-n,lu_2015_tax_IP-IC-17-p",tag_IP_IC_17,tax_group_17 -lu_2011_tax_IP-IC-3-n,Investissement Prestations 3% - Intracommunautaire (-),IP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1463,,tag_IP_IC_3_n,tax_group_3 -lu_2011_tax_IP-IC-3-p,Investissement Prestations 3% - Intracommunautaire (+),IP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1464,,tag_IP_IC_3_p,tax_group_3 -lu_2011_tax_IP-IC-3,Investissement Prestations 3% - Intracommunautaire,IP-IC-3,purchase,group,100,,,lu_2011_chart_1,462,"lu_2011_tax_IP-IC-3-n,lu_2011_tax_IP-IC-3-p",tag_IP_IC_3,tax_group_3 -lu_2011_tax_IP-IC-6-n,Investissement Prestations 6% - Intracommunautaire (-),IP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1466,,tag_IP_IC_6_n,tax_group_6 -lu_2011_tax_IP-IC-6-p,Investissement Prestations 6% - Intracommunautaire (+),IP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1467,,tag_IP_IC_6_p,tax_group_6 -lu_2011_tax_IP-IC-6,Investissement Prestations 6% - Intracommunautaire,IP-IC-6,purchase,group,100,,,lu_2011_chart_1,465,"lu_2011_tax_IP-IC-6-n,lu_2011_tax_IP-IC-6-p",tag_IP_IC_6,tax_group_6 -lu_2015_tax_IP-IC-8-n,Investissement Prestations 8% - Intracommunautaire (-),IP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1469,,tag_IP_IC_8_n,tax_group_8 -lu_2015_tax_IP-IC-8-p,Investissement Prestations 8% - Intracommunautaire (+),IP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1470,,tag_IP_IC_8_p,tax_group_8 -lu_2015_tax_IP-IC-8,Investissement Prestations 8% - Intracommunautaire,IP-IC-8,purchase,group,100,,,lu_2011_chart_1,468,"lu_2015_tax_IP-IC-8-n,lu_2015_tax_IP-IC-8-p",tag_IP_IC_8,tax_group_8 -lu_2011_tax_IP-PA-0,Investissement Prestations 0% - Pays,IP-PA-0,purchase,percent,0,,,lu_2011_chart_1,471,,tag_IP_PA_0,tax_group_0 -lu_2011_tax_IP-PA-12,Investissement Prestations 12% - Pays,IP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,472,,tag_IP_PA_12,tax_group_12 -lu_2015_tax_IP-PA-14,Investissement Prestations 14% - Pays,IP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,473,,tag_IP_PA_14,tax_group_14 -lu_2011_tax_IP-PA-15,Investissement Prestations 15% - Pays,IP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,474,,tag_IP_PA_15,tax_group_15 -lu_2015_tax_IP-PA-17,Investissement Prestations 17% - Pays,IP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,475,,tag_IP_PA_17,tax_group_17 -lu_2011_tax_IP-PA-3,Investissement Prestations 3% - Pays,IP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,476,,tag_IP_PA_3,tax_group_3 -lu_2011_tax_IP-PA-6,Investissement Prestations 6% - Pays,IP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,477,,tag_IP_PA_6,tax_group_6 -lu_2015_tax_IP-PA-8,Investissement Prestations 8% - Pays,IP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,478,,tag_IP_PA_8,tax_group_8 -lu_2015_tax_V-ART-43_60b,Vente - Autres Exonérations (Article 43 et 60 bis),V-ART-43_60b,sale,percent,0,,,lu_2011_chart_1,479,,tag_V_ART_43_60b,tax_group_0 -lu_2015_tax_V-ART-44_56q,Vente - Autres Exonérations (Article 44 et 56 quarter),V-ART-44_56q,sale,percent,0,,,lu_2011_chart_1,480,,tag_V_ART_44_56q,tax_group_0 -lu_2011_tax_VB-EC-0,Vente Biens - Extracommunautaire,VB-EC-0,sale,percent,0,,,lu_2011_chart_1,481,,tag_VB_EC_0,tax_group_0 -lu_2011_tax_VB-EC-Tab,Vente Biens Tabacs - Extracommunautaire,VB-EC-Tab,sale,percent,0,,,lu_2011_chart_1,482,,tag_VB_EC_Tab,tax_group_0 -lu_2011_tax_VB-IC-0,Vente Biens - Intracommunautaire,VB-IC-0,sale,percent,0,,,lu_2011_chart_1,483,,tag_VB_IC_0,tax_group_0 -lu_2011_tax_VB-IC-Tab,Vente Biens Tabacs - Intracommunautaire,VB-IC-Tab,sale,percent,0,,,lu_2011_chart_1,484,,tag_VB_IC_Tab,tax_group_0 -lu_2011_tax_VB-PA-0,Vente Biens 0% - Pays,VB-PA-0,sale,percent,0,,,lu_2011_chart_1,485,,tag_VB_PA_0,tax_group_0 -lu_2011_tax_VB-PA-12,Vente Biens 12% - Pays,VB-PA-12,sale,percent,12,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,486,,tag_VB_PA_12,tax_group_12 -lu_2015_tax_VB-PA-14,Vente Biens 14% - Pays,VB-PA-14,sale,percent,14,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,487,,tag_VB_PA_14,tax_group_14 -lu_2011_tax_VB-PA-15,Vente Biens 15% - Pays,VB-PA-15,sale,percent,15,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,488,,tag_VB_PA_15,tax_group_15 -lu_2015_tax_VB-PA-17,Vente Biens 17% - Pays,VB-PA-17,sale,percent,17,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,489,,tag_VB_PA_17,tax_group_17 -lu_2011_tax_VB-PA-3,Vente Biens 3% - Pays,VB-PA-3,sale,percent,3,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,490,,tag_VB_PA_3,tax_group_3 -lu_2011_tax_VB-PA-6,Vente Biens 6% - Pays,VB-PA-6,sale,percent,6,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,491,,tag_VB_PA_6,tax_group_6 -lu_2015_tax_VB-PA-8,Vente Biens 8% - Pays,VB-PA-8,sale,percent,8,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,492,,tag_VB_PA_8,tax_group_8 -lu_2011_tax_VB-PA-Tab,Vente Biens Tabacs - Pays,VB-PA-Tab,sale,percent,0,,,lu_2011_chart_1,493,,tag_VB_PA_Tab,tax_group_0 -lu_2015_tax_VB-TR-0,Vente Biens – Triangulaire Intracommunautaire,VB-TR-0,sale,percent,0,,,lu_2011_chart_1,494,,tag_VB_TR_0,tax_group_0 -lu_2011_tax_VP-EC-0,Vente Prestations - Extracommunautaire,VP-EC-0,sale,percent,0,,,lu_2011_chart_1,495,,tag_VP_EC_0,tax_group_0 -lu_2011_tax_VP-IC-0,Vente Prestations - Intracommunautaire,VP-IC-0,sale,percent,0,,,lu_2011_chart_1,496,,tag_VP_IC_0,tax_group_0 -lu_2011_tax_VP-IC-EX,'Vente Prestations - Intracommunautaire exonérées dans l''état membre',VP-IC-EX,sale,percent,0,,,lu_2011_chart_1,497,,tag_VP_IC_EX,tax_group_0 -lu_2011_tax_VP-PA-0,Vente Prestations 0% - Pays,VP-PA-0,sale,percent,0,,,lu_2011_chart_1,498,,tag_VP_PA_0,tax_group_0 -lu_2011_tax_VP-PA-12,Vente Prestations 12% - Pays,VP-PA-12,sale,percent,12,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,499,,tag_VP_PA_12,tax_group_12 -lu_2015_tax_VP-PA-14,Vente Prestations 14% - Pays,VP-PA-14,sale,percent,14,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,500,,tag_VP_PA_14,tax_group_14 -lu_2011_tax_VP-PA-15,Vente Prestations 15% - Pays,VP-PA-15,sale,percent,15,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,501,,tag_VP_PA_15,tax_group_15 -lu_2015_tax_VP-PA-17,Vente Prestations 17% - Pays,VP-PA-17,sale,percent,17,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,502,,tag_VP_PA_17,tax_group_17 -lu_2011_tax_VP-PA-3,Vente Prestations 3% - Pays,VP-PA-3,sale,percent,3,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,503,,tag_VP_PA_3,tax_group_3 -lu_2011_tax_VP-PA-6,Vente Prestations 6% - Pays,VP-PA-6,sale,percent,6,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,504,,tag_VP_PA_6,tax_group_6 -lu_2015_tax_VP-PA-8,Vente Prestations 8% - Pays,VP-PA-8,sale,percent,8,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,505,,tag_VP_PA_8,tax_group_8 -lu_2015_tax_SANS,Sans Taxes,SANS,purchase,percent,0,,,lu_2011_chart_1,506,,tag_VP_PA_SANS,tax_group_0 -lu_2015_tax_SANS,Sans Taxes,SANS,sale,percent,0,,,lu_2011_chart_1,507,,tag_VP_PA_SANS,tax_group_0 +lu_2011_tax_AB-EC-0,Achat Biens Exonéré - Extracommunautaire,AB-EC-0,purchase,percent,0,,,lu_2011_chart_1,101,,tag_lu_69,tax_group_0 +lu_2011_tax_AB-EC-12-n,Achat Biens 12% - Extracommunautaire (-),AB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1103,,tag_lu_513,tax_group_12 +lu_2011_tax_AB-EC-12-p,Achat Biens 12% - Extracommunautaire (+),AB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1104,,tag_lu_338,tax_group_12 +lu_2011_tax_AB-EC-12,Achat Biens 12% - Extracommunautaire,AB-EC-12,purchase,group,1,,,lu_2011_chart_1,102,"lu_2011_tax_AB-EC-12-n,lu_2011_tax_AB-EC-12-p",tag_lu_49,tax_group_12 +lu_2015_tax_AB-EC-14-n,Achat Biens 14% - Extracommunautaire (-),AB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1106,,tag_lu_514,tax_group_14 +lu_2015_tax_AB-EC-14-p,Achat Biens 14% - Extracommunautaire (+),AB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1107,,tag_lu_362,tax_group_14 +lu_2015_tax_AB-EC-14,Achat Biens 14% - Extracommunautaire,AB-EC-14,purchase,group,1,,,lu_2011_chart_1,105,"lu_2015_tax_AB-EC-14-n,lu_2015_tax_AB-EC-14-p",tag_lu_81,tax_group_14 +lu_2011_tax_AB-EC-15-n,Achat Biens 15% - Extracommunautaire (-),AB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1109,,tag_lu_515,tax_group_15 +lu_2011_tax_AB-EC-15-p,Achat Biens 15% - Extracommunautaire (+),AB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1110,,tag_lu_326,tax_group_15 +lu_2011_tax_AB-EC-15,Achat Biens 15% - Extracommunautaire,AB-EC-15,purchase,group,100,,,lu_2011_chart_1,108,"lu_2011_tax_AB-EC-15-n,lu_2011_tax_AB-EC-15-p",tag_lu_37,tax_group_15 +lu_2015_tax_AB-EC-17-n,Achat Biens 17% - Extracommunautaire (-),AB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1112,,tag_lu_516,tax_group_17 +lu_2015_tax_AB-EC-17-p,Achat Biens 17% - Extracommunautaire (+),AB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1113,,tag_lu_358,tax_group_17 +lu_2015_tax_AB-EC-17,Achat Biens 17% - Extracommunautaire,AB-EC-17,purchase,group,100,,,lu_2011_chart_1,111,"lu_2015_tax_AB-EC-17-n,lu_2015_tax_AB-EC-17-p",tag_lu_77,tax_group_17 +lu_2011_tax_AB-EC-3-n,Achat Biens 3% - Extracommunautaire (-),AB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1115,,tag_lu_517,tax_group_3 +lu_2011_tax_AB-EC-3-p,Achat Biens 3% - Extracommunautaire (+),AB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1116,,tag_lu_334,tax_group_3 +lu_2011_tax_AB-EC-3,Achat Biens 3% - Extracommunautaire,AB-EC-3,purchase,group,100,,,lu_2011_chart_1,114,"lu_2011_tax_AB-EC-3-n,lu_2011_tax_AB-EC-3-p",tag_lu_45,tax_group_3 +lu_2011_tax_AB-EC-6-n,Achat Biens 6% - Extracommunautaire (-),AB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1118,,tag_lu_518,tax_group_6 +lu_2011_tax_AB-EC-6-p,Achat Biens 6% - Extracommunautaire (+),AB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1119,,tag_lu_330,tax_group_6 +lu_2011_tax_AB-EC-6,Achat Biens 6% - Extracommunautaire,AB-EC-6,purchase,group,100,,,lu_2011_chart_1,117,"lu_2011_tax_AB-EC-6-n,lu_2011_tax_AB-EC-6-p",tag_lu_41,tax_group_6 +lu_2015_tax_AB-EC-8-n,Achat Biens 8% - Extracommunautaire (-),AB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1121,,tag_lu_519,tax_group_8 +lu_2015_tax_AB-EC-8-p,Achat Biens 8% - Extracommunautaire (+),AB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1122,,tag_lu_366,tax_group_8 +lu_2015_tax_AB-EC-8,Achat Biens 8% - Extracommunautaire,AB-EC-8,purchase,group,100,,,lu_2011_chart_1,120,"lu_2015_tax_AB-EC-8-n,lu_2015_tax_AB-EC-8-p",tag_lu_85,tax_group_8 +lu_2015_tax_AB-ECP-0,Achat Biens Exonéré - Extracommunautaire fin privées,AB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,123,,tag_lu_73,tax_group_0 +lu_2015_tax_AB-ECP-12-n,Achat Biens 12% - Extracommunautaire fin privées (-),AB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1125,,tag_lu_520,tax_group_12 +lu_2015_tax_AB-ECP-12-p,Achat Biens 12% - Extracommunautaire fin privées (+),AB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1126,,tag_lu_354,tax_group_12 +lu_2015_tax_AB-ECP-12,Achat Biens 12% - Extracommunautaire fin privées,AB-ECP-12,purchase,group,100,,,lu_2011_chart_1,124,"lu_2015_tax_AB-ECP-12-n,lu_2015_tax_AB-ECP-12-p",tag_lu_65,tax_group_12 +lu_2015_tax_AB-ECP-14-n,Achat Biens 14% - Extracommunautaire fin privées (-),AB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1128,,tag_lu_521,tax_group_14 +lu_2015_tax_AB-ECP-14-p,Achat Biens 14% - Extracommunautaire fin privées (+),AB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1129,,tag_lu_374,tax_group_14 +lu_2015_tax_AB-ECP-14,Achat Biens 14% - Extracommunautaire fin privées,AB-ECP-14,purchase,group,100,,,lu_2011_chart_1,127,"lu_2015_tax_AB-ECP-14-n,lu_2015_tax_AB-ECP-14-p",tag_lu_93,tax_group_14 +lu_2015_tax_AB-ECP-15-n,Achat Biens 15% - Extracommunautaire fin privées (-),AB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1131,,tag_lu_522,tax_group_15 +lu_2015_tax_AB-ECP-15-p,Achat Biens 15% - Extracommunautaire fin privées (+),AB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1132,,tag_lu_342,tax_group_15 +lu_2015_tax_AB-ECP-15,Achat Biens 15% - Extracommunautaire fin privées,AB-ECP-15,purchase,group,100,,,lu_2011_chart_1,130,"lu_2015_tax_AB-ECP-15-n,lu_2015_tax_AB-ECP-15-p",tag_lu_53,tax_group_15 +lu_2015_tax_AB-ECP-17-n,Achat Biens 17% - Extracommunautaire fin privées (-),AB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1134,,tag_lu_523,tax_group_17 +lu_2015_tax_AB-ECP-17-p,Achat Biens 17% - Extracommunautaire fin privées (+),AB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1135,,tag_lu_370,tax_group_17 +lu_2015_tax_AB-ECP-17,Achat Biens 17% - Extracommunautaire fin privées,AB-ECP-17,purchase,group,100,,,lu_2011_chart_1,133,"lu_2015_tax_AB-ECP-17-n,lu_2015_tax_AB-ECP-17-p",tag_lu_89,tax_group_17 +lu_2015_tax_AB-ECP-3-n,Achat Biens 3% - Extracommunautaire fin privées (-),AB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1137,,tag_lu_524,tax_group_3 +lu_2015_tax_AB-ECP-3-p,Achat Biens 3% - Extracommunautaire fin privées (+),AB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1138,,tag_lu_350,tax_group_3 +lu_2015_tax_AB-ECP-3,Achat Biens 3% - Extracommunautaire fin privées,AB-ECP-3,purchase,group,100,,,lu_2011_chart_1,136,"lu_2015_tax_AB-ECP-3-n,lu_2015_tax_AB-ECP-3-p",tag_lu_61,tax_group_3 +lu_2015_tax_AB-ECP-6-n,Achat Biens 6% - Extracommunautaire fin privées (-),AB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1140,,tag_lu_525,tax_group_6 +lu_2015_tax_AB-ECP-6-p,Achat Biens 6% - Extracommunautaire fin privées (+),AB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1141,,tag_lu_346,tax_group_6 +lu_2015_tax_AB-ECP-6,Achat Biens 6% - Extracommunautaire fin privées,AB-ECP-6,purchase,group,100,,,lu_2011_chart_1,139,"lu_2015_tax_AB-ECP-6-n,lu_2015_tax_AB-ECP-6-p",tag_lu_57,tax_group_6 +lu_2015_tax_AB-ECP-8-n,Achat Biens 8% - Extracommunautaire fin privées (-),AB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1143,,tag_lu_526,tax_group_8 +lu_2015_tax_AB-ECP-8-p,Achat Biens 8% - Extracommunautaire fin privées (+),AB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1144,,tag_lu_378,tax_group_8 +lu_2015_tax_AB-ECP-8,Achat Biens 8% - Extracommunautaire fin privées,AB-ECP-8,purchase,group,100,,,lu_2011_chart_1,142,"lu_2015_tax_AB-ECP-8-n,lu_2015_tax_AB-ECP-8-p",tag_lu_97,tax_group_8 +lu_2011_tax_AB-IC-0,Achat Biens Exonéré - Intracommunautaire,AB-IC-0,purchase,percent,0,,,lu_2011_chart_1,145,,tag_lu_20,tax_group_0 +lu_2011_tax_AB-IC-12-n,Achat Biens 12% - Intracommunautaire (-),AB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1147,,tag_lu_491,tax_group_12 +lu_2011_tax_AB-IC-12-p,Achat Biens 12% - Intracommunautaire (+),AB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1148,,tag_lu_309,tax_group_12 +lu_2011_tax_AB-IC-12,Achat Biens 12% - Intracommunautaire,AB-IC-12,purchase,group,100,,,lu_2011_chart_1,146,"lu_2011_tax_AB-IC-12-n,lu_2011_tax_AB-IC-12-p",tag_lu_16,tax_group_12 +lu_2015_tax_AB-IC-14-n,Achat Biens 14% - Intracommunautaire (-),AB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1150,,tag_lu_492,tax_group_14 +lu_2015_tax_AB-IC-14-p,Achat Biens 14% - Intracommunautaire (+),AB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1151,,tag_lu_317,tax_group_14 +lu_2015_tax_AB-IC-14,Achat Biens 14% - Intracommunautaire,AB-IC-14,purchase,group,100,,,lu_2011_chart_1,149,"lu_2015_tax_AB-IC-14-n,lu_2015_tax_AB-IC-14-p",tag_lu_28,tax_group_14 +lu_2011_tax_AB-IC-15-n,Achat Biens 15% - Intracommunautaire (-),AB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1153,,tag_lu_493,tax_group_15 +lu_2011_tax_AB-IC-15-p,Achat Biens 15% - Intracommunautaire (+),AB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1154,,tag_lu_297,tax_group_15 +lu_2011_tax_AB-IC-15,Achat Biens 15% - Intracommunautaire,AB-IC-15,purchase,group,100,,,lu_2011_chart_1,152,"lu_2011_tax_AB-IC-15-n,lu_2011_tax_AB-IC-15-p",tag_lu_04,tax_group_15 +lu_2015_tax_AB-IC-17-n,Achat Biens 17% - Intracommunautaire (-),AB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1156,,tag_lu_494,tax_group_17 +lu_2015_tax_AB-IC-17-p,Achat Biens 17% - Intracommunautaire (+),AB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1157,,tag_lu_313,tax_group_17 +lu_2015_tax_AB-IC-17,Achat Biens 17% - Intracommunautaire,AB-IC-17,purchase,group,100,,,lu_2011_chart_1,155,"lu_2015_tax_AB-IC-17-n,lu_2015_tax_AB-IC-17-p",tag_lu_24,tax_group_17 +lu_2011_tax_AB-IC-3-n,Achat Biens 3% - Intracommunautaire (-),AB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1159,,tag_lu_495,tax_group_3 +lu_2011_tax_AB-IC-3-p,Achat Biens 3% - Intracommunautaire (+),AB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1160,,tag_lu_305,tax_group_3 +lu_2011_tax_AB-IC-3,Achat Biens 3% - Intracommunautaire,AB-IC-3,purchase,group,100,,,lu_2011_chart_1,158,"lu_2011_tax_AB-IC-3-n,lu_2011_tax_AB-IC-3-p",tag_lu_12,tax_group_3 +lu_2011_tax_AB-IC-6-n,Achat Biens 6% - Intracommunautaire (-),AB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1162,,tag_lu_496,tax_group_6 +lu_2011_tax_AB-IC-6-p,Achat Biens 6% - Intracommunautaire (+),AB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1163,,tag_lu_301,tax_group_6 +lu_2011_tax_AB-IC-6,Achat Biens 6% - Intracommunautaire,AB-IC-6,purchase,group,100,,,lu_2011_chart_1,161,"lu_2011_tax_AB-IC-6-n,lu_2011_tax_AB-IC-6-p",tag_lu_08,tax_group_6 +lu_2015_tax_AB-IC-8-n,Achat Biens 8% - Intracommunautaire (-),AB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1165,,tag_lu_497,tax_group_8 +lu_2015_tax_AB-IC-8-p,Achat Biens 8% - Intracommunautaire (+),AB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1166,,tag_lu_321,tax_group_8 +lu_2015_tax_AB-IC-8,Achat Biens 8% - Intracommunautaire,AB-IC-8,purchase,group,100,,,lu_2011_chart_1,164,"lu_2015_tax_AB-IC-8-n,lu_2015_tax_AB-IC-8-p",tag_lu_32,tax_group_8 +lu_2011_tax_AB-PA-0,Achat Biens 0% - Pays,AB-PA-0,purchase,percent,0,,,lu_2011_chart_1,167,,tag_lu_220,tax_group_0 +lu_2011_tax_AB-PA-12,Achat Biens 12% - Pays,AB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,168,,"tag_lu_221,tag_lu_447",tax_group_12 +lu_2015_tax_AB-PA-14,Achat Biens 14% - Pays,AB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,169,,"tag_lu_222,tag_lu_448",tax_group_14 +lu_2011_tax_AB-PA-15,Achat Biens 15% - Pays,AB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,170,,"tag_lu_223,tag_lu_449",tax_group_15 +lu_2015_tax_AB-PA-17,Achat Biens 17% - Pays,AB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,171,,"tag_lu_224,tag_lu_450",tax_group_17 +lu_2011_tax_AB-PA-3,Achat Biens 3% - Pays,AB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,172,,"tag_lu_225,tag_lu_451",tax_group_3 +lu_2011_tax_AB-PA-6,Achat Biens 6% - Pays,AB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,173,,"tag_lu_226,tag_lu_452",tax_group_6 +lu_2015_tax_AB-PA-8,Achat Biens 8% - Pays,AB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,174,,"tag_lu_453,tag_lu_227",tax_group_8 +lu_2011_tax_AP-EC-0,Achat Prestations Exonérées - Extracommunautaire,AP-EC-0,purchase,percent,0,,,lu_2011_chart_1,175,,tag_lu_153,tax_group_0 +lu_2011_tax_AP-EC-12-n,Achat Prestations 12% - Extracommunautaire (-),AP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1177,,tag_lu_556,tax_group_12 +lu_2011_tax_AP-EC-12-p,Achat Prestations 12% - Extracommunautaire (+),AP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1178,,tag_lu_425,tax_group_12 +lu_2011_tax_AP-EC-12,Achat Prestations 12% - Extracommunautaire,AP-EC-12,purchase,group,100,,,lu_2011_chart_1,176,"lu_2011_tax_AP-EC-12-n,lu_2011_tax_AP-EC-12-p",tag_lu_149,tax_group_12 +lu_2015_tax_AP-EC-14-n,Achat Prestations 14% - Extracommunautaire (-),AP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1180,,tag_lu_557,tax_group_14 +lu_2015_tax_AP-EC-14-p,Achat Prestations 14% - Extracommunautaire (+),AP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1181,,tag_lu_433,tax_group_14 +lu_2015_tax_AP-EC-14,Achat Prestations 14% - Extracommunautaire,AP-EC-14,purchase,group,100,,,lu_2011_chart_1,179,"lu_2015_tax_AP-EC-14-n,lu_2015_tax_AP-EC-14-p",tag_lu_161,tax_group_14 +lu_2011_tax_AP-EC-15-n,Achat Prestations 15% - Extracommunautaire (-),AP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1183,,tag_lu_558,tax_group_15 +lu_2011_tax_AP-EC-15-p,Achat Prestations 15% - Extracommunautaire (+),AP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1184,,tag_lu_413,tax_group_15 +lu_2011_tax_AP-EC-15,Achat Prestations 15% - Extracommunautaire,AP-EC-15,purchase,group,100,,,lu_2011_chart_1,182,"lu_2011_tax_AP-EC-15-n,lu_2011_tax_AP-EC-15-p",tag_lu_137,tax_group_15 +lu_2015_tax_AP-EC-17-n,Achat Prestations 17% - Extracommunautaire (-),AP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1186,,tag_lu_559,tax_group_17 +lu_2015_tax_AP-EC-17-p,Achat Prestations 17% - Extracommunautaire (+),AP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1187,,tag_lu_429,tax_group_17 +lu_2015_tax_AP-EC-17,Achat Prestations 17% - Extracommunautaire,AP-EC-17,purchase,group,100,,,lu_2011_chart_1,185,"lu_2015_tax_AP-EC-17-n,lu_2015_tax_AP-EC-17-p",tag_lu_157,tax_group_17 +lu_2011_tax_AP-EC-3-n,Achat Prestations 3% - Extracommunautaire (-),AP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1189,,tag_lu_560,tax_group_3 +lu_2011_tax_AP-EC-3-p,Achat Prestations 3% - Extracommunautaire (+),AP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1190,,tag_lu_421,tax_group_3 +lu_2011_tax_AP-EC-3,Achat Prestations 3% - Extracommunautaire,AP-EC-3,purchase,group,100,,,lu_2011_chart_1,188,"lu_2011_tax_AP-EC-3-n,lu_2011_tax_AP-EC-3-p",tag_lu_145,tax_group_3 +lu_2011_tax_AP-EC-6-n,Achat Prestations 6% - Extracommunautaire (-),AP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1192,,tag_lu_561,tax_group_6 +lu_2011_tax_AP-EC-6-p,Achat Prestations 6% - Extracommunautaire (+),AP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1193,,tag_lu_417,tax_group_6 +lu_2011_tax_AP-EC-6,Achat Prestations 6% - Extracommunautaire,AP-EC-6,purchase,group,100,,,lu_2011_chart_1,191,"lu_2011_tax_AP-EC-6-n,lu_2011_tax_AP-EC-6-p",tag_lu_141,tax_group_6 +lu_2015_tax_AP-EC-8-n,Achat Prestations 8% - Extracommunautaire (-),AP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1195,,tag_lu_562,tax_group_8 +lu_2015_tax_AP-EC-8-p,Achat Prestations 8% - Extracommunautaire (+),AP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1196,,tag_lu_437,tax_group_8 +lu_2015_tax_AP-EC-8,Achat Prestations 8% - Extracommunautaire,AP-EC-8,purchase,group,100,,,lu_2011_chart_1,194,"lu_2015_tax_AP-EC-8-n,lu_2015_tax_AP-EC-8-p",tag_lu_165,tax_group_8 +lu_2011_tax_AP-IC-0,Achat Prestations Exonérées - Intracommunautaire,AP-IC-0,purchase,percent,0,,,lu_2011_chart_1,197,,tag_lu_120,tax_group_0 +lu_2011_tax_AP-IC-12-n,Achat Prestations 12% - Intracommunautaire (-),AP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1199,,tag_lu_563,tax_group_12 +lu_2011_tax_AP-IC-12-p,Achat Prestations 12% - Intracommunautaire (+),AP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1200,,tag_lu_396,tax_group_12 +lu_2011_tax_AP-IC-12,Achat Prestations 12% - Intracommunautaire,AP-IC-12,purchase,group,100,,,lu_2011_chart_1,198,"lu_2011_tax_AP-IC-12-n,lu_2011_tax_AP-IC-12-p",tag_lu_116,tax_group_12 +lu_2015_tax_AP-IC-14-n,Achat Prestations 14% - Intracommunautaire (-),AP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1202,,tag_lu_564,tax_group_14 +lu_2015_tax_AP-IC-14-p,Achat Prestations 14% - Intracommunautaire (+),AP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1203,,tag_lu_404,tax_group_14 +lu_2015_tax_AP-IC-14,Achat Prestations 14% - Intracommunautaire,AP-IC-14,purchase,group,100,,,lu_2011_chart_1,201,"lu_2015_tax_AP-IC-14-n,lu_2015_tax_AP-IC-14-p",tag_lu_128,tax_group_14 +lu_2011_tax_AP-IC-15-n,Achat Prestations 15% - Intracommunautaire (-),AP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1205,,tag_lu_565,tax_group_15 +lu_2011_tax_AP-IC-15-p,Achat Prestations 15% - Intracommunautaire (+),AP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1206,,tag_lu_384,tax_group_15 +lu_2011_tax_AP-IC-15,Achat Prestations 15% - Intracommunautaire,AP-IC-15,purchase,group,100,,,lu_2011_chart_1,204,"lu_2011_tax_AP-IC-15-n,lu_2011_tax_AP-IC-15-p",tag_lu_104,tax_group_15 +lu_2015_tax_AP-IC-17-n,Achat Prestations 17% - Intracommunautaire (-),AP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1208,,tag_lu_566,tax_group_17 +lu_2015_tax_AP-IC-17-p,Achat Prestations 17% - Intracommunautaire (+),AP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1209,,tag_lu_400,tax_group_17 +lu_2015_tax_AP-IC-17,Achat Prestations 17% - Intracommunautaire,AP-IC-17,purchase,group,100,,,lu_2011_chart_1,207,"lu_2015_tax_AP-IC-17-n,lu_2015_tax_AP-IC-17-p",tag_lu_124,tax_group_17 +lu_2011_tax_AP-IC-3-n,Achat Prestations 3% - Intracommunautaire (-),AP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1211,,tag_lu_567,tax_group_3 +lu_2011_tax_AP-IC-3-p,Achat Prestations 3% - Intracommunautaire (+),AP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1212,,tag_lu_392,tax_group_3 +lu_2011_tax_AP-IC-3,Achat Prestations 3% - Intracommunautaire,AP-IC-3,purchase,group,100,,,lu_2011_chart_1,210,"lu_2011_tax_AP-IC-3-n,lu_2011_tax_AP-IC-3-p",tag_lu_112,tax_group_3 +lu_2011_tax_AP-IC-6-n,Achat Prestations 6% - Intracommunautaire (-),AP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1214,,tag_lu_568,tax_group_6 +lu_2011_tax_AP-IC-6-p,Achat Prestations 6% - Intracommunautaire (+),AP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1215,,tag_lu_388,tax_group_6 +lu_2011_tax_AP-IC-6,Achat Prestations 6% - Intracommunautaire,AP-IC-6,purchase,group,100,,,lu_2011_chart_1,213,"lu_2011_tax_AP-IC-6-n,lu_2011_tax_AP-IC-6-p",tag_lu_108,tax_group_6 +lu_2015_tax_AP-IC-8-n,Achat Prestations 8% - Intracommunautaire (-),AP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1217,,tag_lu_569,tax_group_8 +lu_2015_tax_AP-IC-8-p,Achat Prestations 8% - Intracommunautaire (+),AP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1218,,tag_lu_408,tax_group_8 +lu_2015_tax_AP-IC-8,Achat Prestations 8% - Intracommunautaire,AP-IC-8,purchase,group,100,,,lu_2011_chart_1,216,"lu_2015_tax_AP-IC-8-n,lu_2015_tax_AP-IC-8-p",tag_lu_132,tax_group_8 +lu_2011_tax_AP-PA-0,Achat Prestations 0% - Pays,AP-PA-0,purchase,percent,0,,,lu_2011_chart_1,219,,tag_lu_228,tax_group_0 +lu_2011_tax_AP-PA-12,Achat Prestations 12% - Pays,AP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,220,,"tag_lu_454,tag_lu_229",tax_group_12 +lu_2015_tax_AP-PA-14,Achat Prestations 14% - Pays,AP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,221,,"tag_lu_456,tag_lu_230",tax_group_14 +lu_2011_tax_AP-PA-15,Achat Prestations 15% - Pays,AP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,222,,"tag_lu_457,tag_lu_231",tax_group_15 +lu_2015_tax_AP-PA-17,Achat Prestations 17% - Pays,AP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,223,,"tag_lu_458,tag_lu_232",tax_group_17 +lu_2011_tax_AP-PA-3,Achat Prestations 3% - Pays,AP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,224,,"tag_lu_233,tag_lu_459",tax_group_3 +lu_2011_tax_AP-PA-6,Achat Prestations 6% - Pays,AP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,225,,"tag_lu_460,tag_lu_234",tax_group_6 +lu_2015_tax_AP-PA-8,Achat Prestations 8% - Pays,AP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,226,,"tag_lu_235,tag_lu_461",tax_group_8 +lu_2011_tax_FB-EC-0,Frais Biens Exonéré - Extracommunautaire,FB-EC-0,purchase,percent,0,,,lu_2011_chart_1,227,,tag_lu_70,tax_group_0 +lu_2011_tax_FB-EC-12-n,Frais Biens 12% - Extracommunautaire (-),FB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1229,,tag_lu_527,tax_group_12 +lu_2011_tax_FB-EC-12-p,Frais Biens 12% - Extracommunautaire (+),FB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1230,,tag_lu_339,tax_group_12 +lu_2011_tax_FB-EC-12,Frais Biens 12% - Extracommunautaire,FB-EC-12,purchase,group,100,,,lu_2011_chart_1,228,"lu_2011_tax_FB-EC-12-n,lu_2011_tax_FB-EC-12-p",tag_lu_50,tax_group_12 +lu_2015_tax_FB-EC-14-n,Frais Biens 14% - Extracommunautaire (-),FB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1232,,tag_lu_528,tax_group_14 +lu_2015_tax_FB-EC-14-p,Frais Biens 14% - Extracommunautaire (+),FB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1233,,tag_lu_363,tax_group_14 +lu_2015_tax_FB-EC-14,Frais Biens 14% - Extracommunautaire,FB-EC-14,purchase,group,100,,,lu_2011_chart_1,231,"lu_2015_tax_FB-EC-14-n,lu_2015_tax_FB-EC-14-p",tag_lu_82,tax_group_14 +lu_2011_tax_FB-EC-15-n,Frais Biens 15% - Extracommunautaire (-),FB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1235,,tag_lu_529,tax_group_15 +lu_2011_tax_FB-EC-15-p,Frais Biens 15% - Extracommunautaire (+),FB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1236,,tag_lu_327,tax_group_15 +lu_2011_tax_FB-EC-15,Frais Biens 15% - Extracommunautaire,FB-EC-15,purchase,group,100,,,lu_2011_chart_1,234,"lu_2011_tax_FB-EC-15-n,lu_2011_tax_FB-EC-15-p",tag_lu_38,tax_group_15 +lu_2015_tax_FB-EC-17-n,Frais Biens 17% - Extracommunautaire (-),FB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1238,,tag_lu_530,tax_group_17 +lu_2015_tax_FB-EC-17-p,Frais Biens 17% - Extracommunautaire (+),FB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1239,,tag_lu_359,tax_group_17 +lu_2015_tax_FB-EC-17,Frais Biens 17% - Extracommunautaire,FB-EC-17,purchase,group,100,,,lu_2011_chart_1,237,"lu_2015_tax_FB-EC-17-n,lu_2015_tax_FB-EC-17-p",tag_lu_78,tax_group_17 +lu_2011_tax_FB-EC-3-n,Frais Biens 3% - Extracommunautaire (-),FB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1241,,tag_lu_531,tax_group_3 +lu_2011_tax_FB-EC-3-p,Frais Biens 3% - Extracommunautaire (+),FB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1242,,tag_lu_335,tax_group_3 +lu_2011_tax_FB-EC-3,Frais Biens 3% - Extracommunautaire,FB-EC-3,purchase,group,100,,,lu_2011_chart_1,240,"lu_2011_tax_FB-EC-3-n,lu_2011_tax_FB-EC-3-p",tag_lu_46,tax_group_3 +lu_2011_tax_FB-EC-6-n,Frais Biens 6% - Extracommunautaire (-),FB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1244,,tag_lu_532,tax_group_6 +lu_2011_tax_FB-EC-6-p,Frais Biens 6% - Extracommunautaire (+),FB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1245,,tag_lu_331,tax_group_6 +lu_2011_tax_FB-EC-6,Frais Biens 6% - Extracommunautaire,FB-EC-6,purchase,group,100,,,lu_2011_chart_1,243,"lu_2011_tax_FB-EC-6-n,lu_2011_tax_FB-EC-6-p",tag_lu_42,tax_group_6 +lu_2015_tax_FB-EC-8-n,Frais Biens 8% - Extracommunautaire (-),FB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1247,,tag_lu_533,tax_group_8 +lu_2015_tax_FB-EC-8-p,Frais Biens 8% - Extracommunautaire (+),FB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1248,,tag_lu_367,tax_group_8 +lu_2015_tax_FB-EC-8,Frais Biens 8% - Extracommunautaire,FB-EC-8,purchase,group,100,,,lu_2011_chart_1,246,"lu_2015_tax_FB-EC-8-n,lu_2015_tax_FB-EC-8-p",tag_lu_86,tax_group_8 +lu_2015_tax_FB-ECP-0,Frais Biens Exonéré - Extracommunautaire fin privées,FB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,249,,tag_lu_74,tax_group_0 +lu_2015_tax_FB-ECP-12-n,Frais Biens 12% - Extracommunautaire fin privées (-),FB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1251,,tag_lu_534,tax_group_12 +lu_2015_tax_FB-ECP-12-p,Frais Biens 12% - Extracommunautaire fin privées (+),FB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1252,,tag_lu_355,tax_group_12 +lu_2015_tax_FB-ECP-12,Frais Biens 12% - Extracommunautaire fin privées,FB-ECP-12,purchase,group,100,,,lu_2011_chart_1,250,"lu_2015_tax_FB-ECP-12-n,lu_2015_tax_FB-ECP-12-p",tag_lu_66,tax_group_12 +lu_2015_tax_FB-ECP-14-n,Frais Biens 14% - Extracommunautaire fin privées (-),FB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1254,,tag_lu_535,tax_group_14 +lu_2015_tax_FB-ECP-14-p,Frais Biens 14% - Extracommunautaire fin privées (+),FB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1255,,tag_lu_375,tax_group_14 +lu_2015_tax_FB-ECP-14,Frais Biens 14% - Extracommunautaire fin privées,FB-ECP-14,purchase,group,100,,,lu_2011_chart_1,253,"lu_2015_tax_FB-ECP-14-n,lu_2015_tax_FB-ECP-14-p",tag_lu_94,tax_group_14 +lu_2015_tax_FB-ECP-15-n,Frais Biens 15% - Extracommunautaire fin privées (-),FB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1257,,tag_lu_536,tax_group_15 +lu_2015_tax_FB-ECP-15-p,Frais Biens 15% - Extracommunautaire fin privées (+),FB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1258,,tag_lu_343,tax_group_15 +lu_2015_tax_FB-ECP-15,Frais Biens 15% - Extracommunautaire fin privées,FB-ECP-15,purchase,group,100,,,lu_2011_chart_1,256,"lu_2015_tax_FB-ECP-15-n,lu_2015_tax_FB-ECP-15-p",tag_lu_54,tax_group_15 +lu_2015_tax_FB-ECP-17-n,Frais Biens 17% - Extracommunautaire fin privées (-),FB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1260,,tag_lu_537,tax_group_17 +lu_2015_tax_FB-ECP-17-p,Frais Biens 17% - Extracommunautaire fin privées (+),FB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1261,,tag_lu_371,tax_group_17 +lu_2015_tax_FB-ECP-17,Frais Biens 17% - Extracommunautaire fin privées,FB-ECP-17,purchase,group,100,,,lu_2011_chart_1,259,"lu_2015_tax_FB-ECP-17-n,lu_2015_tax_FB-ECP-17-p",tag_lu_90,tax_group_17 +lu_2015_tax_FB-ECP-3-n,Frais Biens 3% - Extracommunautaire fin privées (-),FB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1263,,tag_lu_538,tax_group_3 +lu_2015_tax_FB-ECP-3-p,Frais Biens 3% - Extracommunautaire fin privées (+),FB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1264,,tag_lu_351,tax_group_3 +lu_2015_tax_FB-ECP-3,Frais Biens 3% - Extracommunautaire fin privées,FB-ECP-3,purchase,group,100,,,lu_2011_chart_1,262,"lu_2015_tax_FB-ECP-3-n,lu_2015_tax_FB-ECP-3-p",tag_lu_62,tax_group_3 +lu_2015_tax_FB-ECP-6-n,Frais Biens 6% - Extracommunautaire fin privées (-),FB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1266,,tag_lu_539,tax_group_6 +lu_2015_tax_FB-ECP-6-p,Frais Biens 6% - Extracommunautaire fin privées (+),FB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1267,,tag_lu_347,tax_group_6 +lu_2015_tax_FB-ECP-6,Frais Biens 6% - Extracommunautaire fin privées,FB-ECP-6,purchase,group,100,,,lu_2011_chart_1,265,"lu_2015_tax_FB-ECP-6-n,lu_2015_tax_FB-ECP-6-p",tag_lu_58,tax_group_6 +lu_2015_tax_FB-ECP-8-n,Frais Biens 8% - Extracommunautaire fin privées (-),FB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1269,,tag_lu_540,tax_group_8 +lu_2015_tax_FB-ECP-8-p,Frais Biens 8% - Extracommunautaire fin privées (+),FB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1270,,tag_lu_379,tax_group_8 +lu_2015_tax_FB-ECP-8,Frais Biens 8% - Extracommunautaire fin privées,FB-ECP-8,purchase,group,100,,,lu_2011_chart_1,268,"lu_2015_tax_FB-ECP-8-n,lu_2015_tax_FB-ECP-8-p",tag_lu_98,tax_group_8 +lu_2011_tax_FB-IC-0,Frais Biens Exonéré - Intracommunautaire,FB-IC-0,purchase,percent,0,,,lu_2011_chart_1,271,,tag_lu_21,tax_group_0 +lu_2011_tax_FB-IC-12-n,Frais Biens 12% - Intracommunautaire (-),FB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1273,,tag_lu_498,tax_group_12 +lu_2011_tax_FB-IC-12-p,Frais Biens 12% - Intracommunautaire (+),FB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1274,,tag_lu_310,tax_group_12 +lu_2011_tax_FB-IC-12,Frais Biens 12% - Intracommunautaire,FB-IC-12,purchase,group,100,,,lu_2011_chart_1,272,"lu_2011_tax_FB-IC-12-n,lu_2011_tax_FB-IC-12-p",tag_lu_17,tax_group_12 +lu_2015_tax_FB-IC-14-n,Frais Biens 14% - Intracommunautaire (-),FB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1276,,tag_lu_499,tax_group_14 +lu_2015_tax_FB-IC-14-p,Frais Biens 14% - Intracommunautaire (+),FB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1277,,tag_lu_318,tax_group_14 +lu_2015_tax_FB-IC-14,Frais Biens 14% - Intracommunautaire,FB-IC-14,purchase,group,100,,,lu_2011_chart_1,275,"lu_2015_tax_FB-IC-14-n,lu_2015_tax_FB-IC-14-p",tag_lu_29,tax_group_14 +lu_2011_tax_FB-IC-15-n,Frais Biens 15% - Intracommunautaire (-),FB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1279,,tag_lu_500,tax_group_15 +lu_2011_tax_FB-IC-15-p,Frais Biens 15% - Intracommunautaire (+),FB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1280,,tag_lu_298,tax_group_15 +lu_2011_tax_FB-IC-15,Frais Biens 15% - Intracommunautaire,FB-IC-15,purchase,group,100,,,lu_2011_chart_1,278,"lu_2011_tax_FB-IC-15-n,lu_2011_tax_FB-IC-15-p",tag_lu_05,tax_group_15 +lu_2015_tax_FB-IC-17-n,Frais Biens 17% - Intracommunautaire (-),FB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1282,,tag_lu_501,tax_group_17 +lu_2015_tax_FB-IC-17-p,Frais Biens 17% - Intracommunautaire (+),FB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1283,,tag_lu_314,tax_group_17 +lu_2015_tax_FB-IC-17,Frais Biens 17% - Intracommunautaire,FB-IC-17,purchase,group,100,,,lu_2011_chart_1,281,"lu_2015_tax_FB-IC-17-n,lu_2015_tax_FB-IC-17-p",tag_lu_25,tax_group_17 +lu_2011_tax_FB-IC-3-n,Frais Biens 3% - Intracommunautaire (-),FB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1285,,tag_lu_502,tax_group_3 +lu_2011_tax_FB-IC-3-p,Frais Biens 3% - Intracommunautaire (+),FB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1286,,tag_lu_306,tax_group_3 +lu_2011_tax_FB-IC-3,Frais Biens 3% - Intracommunautaire,FB-IC-3,purchase,group,100,,,lu_2011_chart_1,284,"lu_2011_tax_FB-IC-3-n,lu_2011_tax_FB-IC-3-p",tag_lu_13,tax_group_3 +lu_2011_tax_FB-IC-6-n,Frais Biens 6% - Intracommunautaire (-),FB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1288,,tag_lu_503,tax_group_6 +lu_2011_tax_FB-IC-6-p,Frais Biens 6% - Intracommunautaire (+),FB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1289,,tag_lu_302,tax_group_6 +lu_2011_tax_FB-IC-6,Frais Biens 6% - Intracommunautaire,FB-IC-6,purchase,group,100,,,lu_2011_chart_1,287,"lu_2011_tax_FB-IC-6-n,lu_2011_tax_FB-IC-6-p",tag_lu_09,tax_group_6 +lu_2015_tax_FB-IC-8-n,Frais Biens 8% - Intracommunautaire (-),FB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1291,,tag_lu_504,tax_group_8 +lu_2015_tax_FB-IC-8-p,Frais Biens 8% - Intracommunautaire (+),FB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1292,,tag_lu_322,tax_group_8 +lu_2015_tax_FB-IC-8,Frais Biens 8% - Intracommunautaire,FB-IC-8,purchase,group,100,,,lu_2011_chart_1,290,"lu_2015_tax_FB-IC-8-n,lu_2015_tax_FB-IC-8-p",tag_lu_33,tax_group_8 +lu_2011_tax_FB-PA-0,Frais Biens 0% - Pays,FB-PA-0,purchase,percent,0,,,lu_2011_chart_1,293,,tag_lu_236,tax_group_0 +lu_2011_tax_FB-PA-12,Frais Biens 12% - Pays,FB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,294,,"tag_lu_237,tag_lu_462",tax_group_12 +lu_2015_tax_FB-PA-14,Frais Biens 14% - Pays,FB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,295,,"tag_lu_463,tag_lu_238",tax_group_14 +lu_2011_tax_FB-PA-15,Frais Biens 15% - Pays,FB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,296,,"tag_lu_239,tag_lu_464",tax_group_15 +lu_2015_tax_FB-PA-17,Frais Biens 17% - Pays,FB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,297,,"tag_lu_240,tag_lu_465",tax_group_17 +lu_2011_tax_FB-PA-3,Frais Biens 3% - Pays,FB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,298,,"tag_lu_241,tag_lu_466",tax_group_3 +lu_2011_tax_FB-PA-6,Frais Biens 6% - Pays,FB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,299,,"tag_lu_242,tag_lu_467",tax_group_6 +lu_2015_tax_FB-PA-8,Frais Biens 8% - Pays,FB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,300,,"tag_lu_468,tag_lu_243",tax_group_8 +lu_2011_tax_FP-EC-0,Frais Prestations Exonérées - Extracommunautaire,FP-EC-0,purchase,percent,0,,,lu_2011_chart_1,301,,tag_lu_154,tax_group_0 +lu_2011_tax_FP-EC-12-n,Frais Prestations 12% - Extracommunautaire (-),FP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1303,,tag_lu_570,tax_group_12 +lu_2011_tax_FP-EC-12-p,Frais Prestations 12% - Extracommunautaire (+),FP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1304,,tag_lu_426,tax_group_12 +lu_2011_tax_FP-EC-12,Frais Prestations 12% - Extracommunautaire,FP-EC-12,purchase,group,100,,,lu_2011_chart_1,302,"lu_2011_tax_FP-EC-12-n,lu_2011_tax_FP-EC-12-p",tag_lu_150,tax_group_12 +lu_2015_tax_FP-EC-14-n,Frais Prestations 14% - Extracommunautaire (-),FP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1306,,tag_lu_571,tax_group_14 +lu_2015_tax_FP-EC-14-p,Frais Prestations 14% - Extracommunautaire (+),FP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1307,,tag_lu_434,tax_group_14 +lu_2015_tax_FP-EC-14,Frais Prestations 14% - Extracommunautaire,FP-EC-14,purchase,group,100,,,lu_2011_chart_1,305,"lu_2015_tax_FP-EC-14-n,lu_2015_tax_FP-EC-14-p",tag_lu_162,tax_group_14 +lu_2011_tax_FP-EC-15-n,Frais Prestations 15% - Extracommunautaire (-),FP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1309,,tag_lu_572,tax_group_15 +lu_2011_tax_FP-EC-15-p,Frais Prestations 15% - Extracommunautaire (+),FP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1310,,tag_lu_414,tax_group_15 +lu_2011_tax_FP-EC-15,Frais Prestations 15% - Extracommunautaire,FP-EC-15,purchase,group,100,,,lu_2011_chart_1,308,"lu_2011_tax_FP-EC-15-n,lu_2011_tax_FP-EC-15-p",tag_lu_138,tax_group_15 +lu_2015_tax_FP-EC-17-n,Frais Prestations 17% - Extracommunautaire (-),FP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1312,,tag_lu_573,tax_group_17 +lu_2015_tax_FP-EC-17-p,Frais Prestations 17% - Extracommunautaire (+),FP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1313,,tag_lu_430,tax_group_17 +lu_2015_tax_FP-EC-17,Frais Prestations 17% - Extracommunautaire,FP-EC-17,purchase,group,100,,,lu_2011_chart_1,311,"lu_2015_tax_FP-EC-17-n,lu_2015_tax_FP-EC-17-p",tag_lu_158,tax_group_17 +lu_2011_tax_FP-EC-3-n,Frais Prestations 3% - Extracommunautaire (-),FP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1315,,tag_lu_574,tax_group_3 +lu_2011_tax_FP-EC-3-p,Frais Prestations 3% - Extracommunautaire (+),FP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1316,,tag_lu_422,tax_group_3 +lu_2011_tax_FP-EC-3,Frais Prestations 3% - Extracommunautaire,FP-EC-3,purchase,group,100,,,lu_2011_chart_1,314,"lu_2011_tax_FP-EC-3-n,lu_2011_tax_FP-EC-3-p",tag_lu_146,tax_group_3 +lu_2011_tax_FP-EC-6-n,Frais Prestations 6% - Extracommunautaire (-),FP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1318,,tag_lu_575,tax_group_6 +lu_2011_tax_FP-EC-6-p,Frais Prestations 6% - Extracommunautaire (+),FP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1319,,tag_lu_418,tax_group_6 +lu_2011_tax_FP-EC-6,Frais Prestations 6% - Extracommunautaire,FP-EC-6,purchase,group,100,,,lu_2011_chart_1,317,"lu_2011_tax_FP-EC-6-n,lu_2011_tax_FP-EC-6-p",tag_lu_142,tax_group_6 +lu_2015_tax_FP-EC-8-n,Frais Prestations 8% - Extracommunautaire (-),FP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1321,,tag_lu_576,tax_group_8 +lu_2015_tax_FP-EC-8-p,Frais Prestations 8% - Extracommunautaire (+),FP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1322,,tag_lu_438,tax_group_8 +lu_2015_tax_FP-EC-8,Frais Prestations 8% - Extracommunautaire,FP-EC-8,purchase,group,100,,,lu_2011_chart_1,320,"lu_2015_tax_FP-EC-8-n,lu_2015_tax_FP-EC-8-p",tag_lu_166,tax_group_8 +lu_2011_tax_FP-IC-0,Frais Prestations Exonérées - Intracommunautaire,FP-IC-0,purchase,percent,0,,,lu_2011_chart_1,323,,tag_lu_121,tax_group_0 +lu_2011_tax_FP-IC-12-n,Frais Prestations 12% - Intracommunautaire (-),FP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1325,,tag_lu_577,tax_group_12 +lu_2011_tax_FP-IC-12-p,Frais Prestations 12% - Intracommunautaire (+),FP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1326,,tag_lu_397,tax_group_12 +lu_2011_tax_FP-IC-12,Frais Prestations 12% - Intracommunautaire,FP-IC-12,purchase,group,100,,,lu_2011_chart_1,324,"lu_2011_tax_FP-IC-12-n,lu_2011_tax_FP-IC-12-p",tag_lu_117,tax_group_12 +lu_2015_tax_FP-IC-14-n,Frais Prestations 14% - Intracommunautaire (-),FP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1328,,tag_lu_578,tax_group_14 +lu_2015_tax_FP-IC-14-p,Frais Prestations 14% - Intracommunautaire (+),FP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1329,,tag_lu_405,tax_group_14 +lu_2015_tax_FP-IC-14,Frais Prestations 14% - Intracommunautaire,FP-IC-14,purchase,group,100,,,lu_2011_chart_1,327,"lu_2015_tax_FP-IC-14-n,lu_2015_tax_FP-IC-14-p",tag_lu_129,tax_group_14 +lu_2011_tax_FP-IC-15-n,Frais Prestations 15% - Intracommunautaire (-),FP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1331,,tag_lu_579,tax_group_15 +lu_2011_tax_FP-IC-15-p,Frais Prestations 15% - Intracommunautaire (+),FP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1332,,tag_lu_385,tax_group_15 +lu_2011_tax_FP-IC-15,Frais Prestations 15% - Intracommunautaire,FP-IC-15,purchase,group,100,,,lu_2011_chart_1,330,"lu_2011_tax_FP-IC-15-n,lu_2011_tax_FP-IC-15-p",tag_lu_105,tax_group_15 +lu_2015_tax_FP-IC-17-n,Frais Prestations 17% - Intracommunautaire (-),FP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1334,,tag_lu_580,tax_group_17 +lu_2015_tax_FP-IC-17-p,Frais Prestations 17% - Intracommunautaire (+),FP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1335,,tag_lu_401,tax_group_17 +lu_2015_tax_FP-IC-17,Frais Prestations 17% - Intracommunautaire,FP-IC-17,purchase,group,100,,,lu_2011_chart_1,333,"lu_2015_tax_FP-IC-17-n,lu_2015_tax_FP-IC-17-p",tag_lu_125,tax_group_17 +lu_2011_tax_FP-IC-3-n,Frais Prestations 3% - Intracommunautaire (-),FP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1337,,tag_lu_581,tax_group_3 +lu_2011_tax_FP-IC-3-p,Frais Prestations 3% - Intracommunautaire (+),FP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1338,,tag_lu_393,tax_group_3 +lu_2011_tax_FP-IC-3,Frais Prestations 3% - Intracommunautaire,FP-IC-3,purchase,group,100,,,lu_2011_chart_1,336,"lu_2011_tax_FP-IC-3-n,lu_2011_tax_FP-IC-3-p",tag_lu_113,tax_group_3 +lu_2011_tax_FP-IC-6-n,Frais Prestations 6% - Intracommunautaire (-),FP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1340,,tag_lu_582,tax_group_6 +lu_2011_tax_FP-IC-6-p,Frais Prestations 6% - Intracommunautaire (+),FP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1341,,tag_lu_389,tax_group_6 +lu_2011_tax_FP-IC-6,Frais Prestations 6% - Intracommunautaire,FP-IC-6,purchase,group,100,,,lu_2011_chart_1,339,"lu_2011_tax_FP-IC-6-n,lu_2011_tax_FP-IC-6-p",tag_lu_109,tax_group_6 +lu_2015_tax_FP-IC-8-n,Frais Prestations 8% - Intracommunautaire (-),FP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1343,,tag_lu_583,tax_group_8 +lu_2015_tax_FP-IC-8-p,Frais Prestations 8% - Intracommunautaire (+),FP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1344,,tag_lu_409,tax_group_8 +lu_2015_tax_FP-IC-8,Frais Prestations 8% - Intracommunautaire,FP-IC-8,purchase,group,100,,,lu_2011_chart_1,342,"lu_2015_tax_FP-IC-8-n,lu_2015_tax_FP-IC-8-p",tag_lu_133,tax_group_8 +lu_2011_tax_FP-PA-0,Frais Prestations 0% - Pays,FP-PA-0,purchase,percent,0,,,lu_2011_chart_1,345,,tag_lu_244,tax_group_0 +lu_2011_tax_FP-PA-12,Frais Prestations 12% - Pays,FP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,346,,"tag_lu_469,tag_lu_245",tax_group_12 +lu_2015_tax_FP-PA-14,Frais Prestations 14% - Pays,FP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,347,,"tag_lu_470,tag_lu_246",tax_group_14 +lu_2011_tax_FP-PA-15,Frais Prestations 15% - Pays,FP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,348,,"tag_lu_247,tag_lu_471",tax_group_15 +lu_2015_tax_FP-PA-17,Frais Prestations 17% - Pays,FP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,349,,"tag_lu_248,tag_lu_472",tax_group_17 +lu_2011_tax_FP-PA-3,Frais Prestations 3% - Pays,FP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,350,,"tag_lu_473,tag_lu_249",tax_group_3 +lu_2011_tax_FP-PA-6,Frais Prestations 6% - Pays,FP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,351,,"tag_lu_474,tag_lu_250",tax_group_6 +lu_2015_tax_FP-PA-8,Frais Prestations 8% - Pays,FP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,352,,"tag_lu_475,tag_lu_251",tax_group_8 +lu_2011_tax_IB-EC-0,Investissement Biens Exonéré - Extracommunautaire,IB-EC-0,purchase,percent,0,,,lu_2011_chart_1,353,,tag_lu_71,tax_group_0 +lu_2011_tax_IB-EC-12-n,Investissement Biens 12% - Extracommunautaire (-),IB-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1355,,tag_lu_541,tax_group_12 +lu_2011_tax_IB-EC-12-p,Investissement Biens 12% - Extracommunautaire (+),IB-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1356,,tag_lu_340,tax_group_12 +lu_2011_tax_IB-EC-12,Investissement Biens 12% - Extracommunautaire,IB-EC-12,purchase,group,100,,,lu_2011_chart_1,354,"lu_2011_tax_IB-EC-12-n,lu_2011_tax_IB-EC-12-p",tag_lu_51,tax_group_12 +lu_2015_tax_IB-EC-14-n,Investissement Biens 14% - Extracommunautaire (-),IB-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1358,,tag_lu_542,tax_group_14 +lu_2015_tax_IB-EC-14-p,Investissement Biens 14% - Extracommunautaire (+),IB-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1359,,tag_lu_364,tax_group_14 +lu_2015_tax_IB-EC-14,Investissement Biens 14% - Extracommunautaire,IB-EC-14,purchase,group,100,,,lu_2011_chart_1,357,"lu_2015_tax_IB-EC-14-n,lu_2015_tax_IB-EC-14-p",tag_lu_83,tax_group_14 +lu_2011_tax_IB-EC-15-n,Investissement Biens 15% - Extracommunautaire (-),IB-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1361,,tag_lu_543,tax_group_15 +lu_2011_tax_IB-EC-15-p,Investissement Biens 15% - Extracommunautaire (+),IB-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1362,,tag_lu_328,tax_group_15 +lu_2011_tax_IB-EC-15,Investissement Biens 15% - Extracommunautaire,IB-EC-15,purchase,group,100,,,lu_2011_chart_1,360,"lu_2011_tax_IB-EC-15-n,lu_2011_tax_IB-EC-15-p",tag_lu_39,tax_group_15 +lu_2015_tax_IB-EC-17-n,Investissement Biens 17% - Extracommunautaire (-),IB-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1364,,tag_lu_544,tax_group_17 +lu_2015_tax_IB-EC-17-p,Investissement Biens 17% - Extracommunautaire (+),IB-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1365,,tag_lu_360,tax_group_17 +lu_2015_tax_IB-EC-17,Investissement Biens 17% - Extracommunautaire,IB-EC-17,purchase,group,100,,,lu_2011_chart_1,363,"lu_2015_tax_IB-EC-17-n,lu_2015_tax_IB-EC-17-p",tag_lu_79,tax_group_17 +lu_2011_tax_IB-EC-3-n,Investissement Biens 3% - Extracommunautaire (-),IB-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1367,,tag_lu_545,tax_group_3 +lu_2011_tax_IB-EC-3-p,Investissement Biens 3% - Extracommunautaire (+),IB-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1368,,tag_lu_336,tax_group_3 +lu_2011_tax_IB-EC-3,Investissement Biens 3% - Extracommunautaire,IB-EC-3,purchase,group,100,,,lu_2011_chart_1,366,"lu_2011_tax_IB-EC-3-n,lu_2011_tax_IB-EC-3-p",tag_lu_47,tax_group_3 +lu_2011_tax_IB-EC-6-n,Investissement Biens 6% - Extracommunautaire (-),IB-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1370,,tag_lu_546,tax_group_6 +lu_2011_tax_IB-EC-6-p,Investissement Biens 6% - Extracommunautaire (+),IB-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1371,,tag_lu_332,tax_group_6 +lu_2011_tax_IB-EC-6,Investissement Biens 6% - Extracommunautaire,IB-EC-6,purchase,group,100,,,lu_2011_chart_1,369,"lu_2011_tax_IB-EC-6-n,lu_2011_tax_IB-EC-6-p",tag_lu_43,tax_group_6 +lu_2015_tax_IB-EC-8-n,Investissement Biens 8% - Extracommunautaire (-),IB-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1373,,tag_lu_547,tax_group_8 +lu_2015_tax_IB-EC-8-p,Investissement Biens 8% - Extracommunautaire (+),IB-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1374,,tag_lu_368,tax_group_8 +lu_2015_tax_IB-EC-8,Investissement Biens 8% - Extracommunautaire,IB-EC-8,purchase,group,100,,,lu_2011_chart_1,372,"lu_2015_tax_IB-EC-8-n,lu_2015_tax_IB-EC-8-p",tag_lu_87,tax_group_8 +lu_2015_tax_IB-ECP-0,Investissement Biens Exonéré - Extracommunautaire fin privées,IB-ECP-0,purchase,percent,0,,,lu_2011_chart_1,375,,tag_lu_75,tax_group_0 +lu_2015_tax_IB-ECP-12-n,Investissement Biens 12% - Extracommunautaire fin privées (-),IB-ECP-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1377,,tag_lu_548,tax_group_12 +lu_2015_tax_IB-ECP-12-p,Investissement Biens 12% - Extracommunautaire fin privées (+),IB-ECP-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1378,,tag_lu_356,tax_group_12 +lu_2015_tax_IB-ECP-12,Investissement Biens 12% - Extracommunautaire fin privées,IB-ECP-12,purchase,group,100,,,lu_2011_chart_1,376,"lu_2015_tax_IB-ECP-12-n,lu_2015_tax_IB-ECP-12-p",tag_lu_67,tax_group_12 +lu_2015_tax_IB-ECP-14-n,Investissement Biens 14% - Extracommunautaire fin privées (-),IB-ECP-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1380,,tag_lu_549,tax_group_14 +lu_2015_tax_IB-ECP-14-p,Investissement Biens 14% - Extracommunautaire fin privées (+),IB-ECP-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1381,,tag_lu_376,tax_group_14 +lu_2015_tax_IB-ECP-14,Investissement Biens 14% - Extracommunautaire fin privées,IB-ECP-14,purchase,group,100,,,lu_2011_chart_1,379,"lu_2015_tax_IB-ECP-14-n,lu_2015_tax_IB-ECP-14-p",tag_lu_95,tax_group_14 +lu_2015_tax_IB-ECP-15-n,Investissement Biens 15% - Extracommunautaire fin privées (-),IB-ECP-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1383,,tag_lu_550,tax_group_15 +lu_2015_tax_IB-ECP-15-p,Investissement Biens 15% - Extracommunautaire fin privées (+),IB-ECP-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1384,,tag_lu_344,tax_group_15 +lu_2015_tax_IB-ECP-15,Investissement Biens 15% - Extracommunautaire fin privées,IB-ECP-15,purchase,group,100,,,lu_2011_chart_1,382,"lu_2015_tax_IB-ECP-15-n,lu_2015_tax_IB-ECP-15-p",tag_lu_55,tax_group_15 +lu_2015_tax_IB-ECP-17-n,Investissement Biens 17% - Extracommunautaire fin privées (-),IB-ECP-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1386,,tag_lu_551,tax_group_17 +lu_2015_tax_IB-ECP-17-p,Investissement Biens 17% - Extracommunautaire fin privées (+),IB-ECP-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1387,,tag_lu_372,tax_group_17 +lu_2015_tax_IB-ECP-17,Investissement Biens 17% - Extracommunautaire fin privées,IB-ECP-17,purchase,group,100,,,lu_2011_chart_1,385,"lu_2015_tax_IB-ECP-17-n,lu_2015_tax_IB-ECP-17-p",tag_lu_91,tax_group_17 +lu_2015_tax_IB-ECP-3-n,Investissement Biens 3% - Extracommunautaire fin privées (-),IB-ECP-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1389,,tag_lu_552,tax_group_3 +lu_2015_tax_IB-ECP-3-p,Investissement Biens 3% - Extracommunautaire fin privées (+),IB-ECP-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1390,,tag_lu_352,tax_group_3 +lu_2015_tax_IB-ECP-3,Investissement Biens 3% - Extracommunautaire fin privées,IB-ECP-3,purchase,group,100,,,lu_2011_chart_1,388,"lu_2015_tax_IB-ECP-3-n,lu_2015_tax_IB-ECP-3-p",tag_lu_63,tax_group_3 +lu_2015_tax_IB-ECP-6-n,Investissement Biens 6% - Extracommunautaire fin privées (-),IB-ECP-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1392,,tag_lu_553,tax_group_6 +lu_2015_tax_IB-ECP-6-p,Investissement Biens 6% - Extracommunautaire fin privées (+),IB-ECP-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1393,,tag_lu_348,tax_group_6 +lu_2015_tax_IB-ECP-6,Investissement Biens 6% - Extracommunautaire fin privées,IB-ECP-6,purchase,group,100,,,lu_2011_chart_1,391,"lu_2015_tax_IB-ECP-6-n,lu_2015_tax_IB-ECP-6-p",tag_lu_59,tax_group_6 +lu_2015_tax_IB-ECP-8-n,Investissement Biens 8% - Extracommunautaire fin privées (-),IB-ECP-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1395,,tag_lu_554,tax_group_8 +lu_2015_tax_IB-ECP-8-p,Investissement Biens 8% - Extracommunautaire fin privées (+),IB-ECP-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1396,,tag_lu_380,tax_group_8 +lu_2015_tax_IB-ECP-8,Investissement Biens 8% - Extracommunautaire fin privées,IB-ECP-8,purchase,group,100,,,lu_2011_chart_1,394,"lu_2015_tax_IB-ECP-8-n,lu_2015_tax_IB-ECP-8-p",tag_lu_99,tax_group_8 +lu_2011_tax_IB-IC-0,Investissement Biens Exonéré - Intracommunautaire,IB-IC-0,purchase,percent,0,,,lu_2011_chart_1,397,,tag_lu_22,tax_group_0 +lu_2011_tax_IB-IC-12-n,Investissement Biens 12% - Intracommunautaire (-),IB-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1399,,tag_lu_505,tax_group_12 +lu_2011_tax_IB-IC-12-p,Investissement Biens 12% - Intracommunautaire (+),IB-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1400,,tag_lu_311,tax_group_12 +lu_2011_tax_IB-IC-12,Investissement Biens 12% - Intracommunautaire,IB-IC-12,purchase,group,100,,,lu_2011_chart_1,398,"lu_2011_tax_IB-IC-12-n,lu_2011_tax_IB-IC-12-p",tag_lu_18,tax_group_12 +lu_2015_tax_IB-IC-14-n,Investissement Biens 14% - Intracommunautaire (-),IB-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1402,,tag_lu_506,tax_group_14 +lu_2015_tax_IB-IC-14-p,Investissement Biens 14% - Intracommunautaire (+),IB-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1403,,tag_lu_319,tax_group_14 +lu_2015_tax_IB-IC-14,Investissement Biens 14% - Intracommunautaire,IB-IC-14,purchase,group,100,,,lu_2011_chart_1,401,"lu_2015_tax_IB-IC-14-n,lu_2015_tax_IB-IC-14-p",tag_lu_30,tax_group_14 +lu_2011_tax_IB-IC-15-n,Investissement Biens 15% - Intracommunautaire (-),IB-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1405,,tag_lu_507,tax_group_15 +lu_2011_tax_IB-IC-15-p,Investissement Biens 15% - Intracommunautaire (+),IB-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1406,,tag_lu_299,tax_group_15 +lu_2011_tax_IB-IC-15,Investissement Biens 15% - Intracommunautaire,IB-IC-15,purchase,group,100,,,lu_2011_chart_1,404,"lu_2011_tax_IB-IC-15-n,lu_2011_tax_IB-IC-15-p",tag_lu_06,tax_group_15 +lu_2015_tax_IB-IC-17-n,Investissement Biens 17% - Intracommunautaire (-),IB-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1408,,tag_lu_508,tax_group_17 +lu_2015_tax_IB-IC-17-p,Investissement Biens 17% - Intracommunautaire (+),IB-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1409,,tag_lu_315,tax_group_17 +lu_2015_tax_IB-IC-17,Investissement Biens 17% - Intracommunautaire,IB-IC-17,purchase,group,100,,,lu_2011_chart_1,407,"lu_2015_tax_IB-IC-17-n,lu_2015_tax_IB-IC-17-p",tag_lu_26,tax_group_17 +lu_2011_tax_IB-IC-3-n,Investissement Biens 3% - Intracommunautaire (-),IB-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1411,,tag_lu_509,tax_group_3 +lu_2011_tax_IB-IC-3-p,Investissement Biens 3% - Intracommunautaire (+),IB-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1412,,tag_lu_307,tax_group_3 +lu_2011_tax_IB-IC-3,Investissement Biens 3% - Intracommunautaire,IB-IC-3,purchase,group,100,,,lu_2011_chart_1,410,"lu_2011_tax_IB-IC-3-n,lu_2011_tax_IB-IC-3-p",tag_lu_14,tax_group_3 +lu_2011_tax_IB-IC-6-n,Investissement Biens 6% - Intracommunautaire (-),IB-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1414,,tag_lu_510,tax_group_6 +lu_2011_tax_IB-IC-6-p,Investissement Biens 6% - Intracommunautaire (+),IB-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1415,,tag_lu_303,tax_group_6 +lu_2011_tax_IB-IC-6,Investissement Biens 6% - Intracommunautaire,IB-IC-6,purchase,group,100,,,lu_2011_chart_1,413,"lu_2011_tax_IB-IC-6-n,lu_2011_tax_IB-IC-6-p",tag_lu_10,tax_group_6 +lu_2015_tax_IB-IC-8-n,Investissement Biens 8% - Intracommunautaire (-),IB-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1417,,tag_lu_511,tax_group_8 +lu_2015_tax_IB-IC-8-p,Investissement Biens 8% - Intracommunautaire (+),IB-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1418,,tag_lu_323,tax_group_8 +lu_2015_tax_IB-IC-8,Investissement Biens 8% - Intracommunautaire,IB-IC-8,purchase,group,100,,,lu_2011_chart_1,416,"lu_2015_tax_IB-IC-8-n,lu_2015_tax_IB-IC-8-p",tag_lu_34,tax_group_8 +lu_2011_tax_IB-PA-0,Investissement Biens 0% - Pays,IB-PA-0,purchase,percent,0,,,lu_2011_chart_1,419,,tag_lu_252,tax_group_0 +lu_2011_tax_IB-PA-12,Investissement Biens 12% - Pays,IB-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,420,,"tag_lu_476,tag_lu_253",tax_group_12 +lu_2015_tax_IB-PA-14,Investissement Biens 14% - Pays,IB-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,421,,"tag_lu_477,tag_lu_254",tax_group_14 +lu_2011_tax_IB-PA-15,Investissement Biens 15% - Pays,IB-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,422,,"tag_lu_255,tag_lu_478",tax_group_15 +lu_2015_tax_IB-PA-17,Investissement Biens 17% - Pays,IB-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,423,,"tag_lu_479,tag_lu_256",tax_group_17 +lu_2011_tax_IB-PA-3,Investissement Biens 3% - Pays,IB-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,424,,"tag_lu_480,tag_lu_257",tax_group_3 +lu_2011_tax_IB-PA-6,Investissement Biens 6% - Pays,IB-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,425,,"tag_lu_481,tag_lu_258",tax_group_6 +lu_2015_tax_IB-PA-8,Investissement Biens 8% - Pays,IB-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,426,,"tag_lu_482,tag_lu_259",tax_group_8 +lu_2011_tax_IP-EC-0,Investissement Prestations Exonérées - Extracommunautaire,IP-EC-0,purchase,percent,0,,,lu_2011_chart_1,427,,tag_lu_155,tax_group_0 +lu_2011_tax_IP-EC-12-n,Investissement Prestations 12% - Extracommunautaire (-),IP-EC-12-n,none,percent,-12,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1429,,tag_lu_584,tax_group_12 +lu_2011_tax_IP-EC-12-p,Investissement Prestations 12% - Extracommunautaire (+),IP-EC-12-p,none,percent,12,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1430,,tag_lu_427,tax_group_12 +lu_2011_tax_IP-EC-12,Investissement Prestations 12% - Extracommunautaire,IP-EC-12,purchase,group,100,,,lu_2011_chart_1,428,"lu_2011_tax_IP-EC-12-n,lu_2011_tax_IP-EC-12-p",tag_lu_151,tax_group_12 +lu_2015_tax_IP-EC-14-n,Investissement Prestations 14% - Extracommunautaire (-),IP-EC-14-n,none,percent,-14,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1432,,tag_lu_585,tax_group_14 +lu_2015_tax_IP-EC-14-p,Investissement Prestations 14% - Extracommunautaire (+),IP-EC-14-p,none,percent,14,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1433,,tag_lu_435,tax_group_14 +lu_2015_tax_IP-EC-14,Investissement Prestations 14% - Extracommunautaire,IP-EC-14,purchase,group,100,,,lu_2011_chart_1,431,"lu_2015_tax_IP-EC-14-n,lu_2015_tax_IP-EC-14-p",tag_lu_163,tax_group_14 +lu_2011_tax_IP-EC-15-n,Investissement Prestations 15% - Extracommunautaire (-),IP-EC-15-n,none,percent,-15,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1435,,tag_lu_586,tax_group_15 +lu_2011_tax_IP-EC-15-p,Investissement Prestations 15% - Extracommunautaire (+),IP-EC-15-p,none,percent,15,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1436,,tag_lu_415,tax_group_15 +lu_2011_tax_IP-EC-15,Investissement Prestations 15% - Extracommunautaire,IP-EC-15,purchase,group,100,,,lu_2011_chart_1,434,"lu_2011_tax_IP-EC-15-n,lu_2011_tax_IP-EC-15-p",tag_lu_139,tax_group_15 +lu_2015_tax_IP-EC-17-n,Investissement Prestations 17% - Extracommunautaire (-),IP-EC-17-n,none,percent,-17,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1438,,tag_lu_587,tax_group_17 +lu_2015_tax_IP-EC-17-p,Investissement Prestations 17% - Extracommunautaire (+),IP-EC-17-p,none,percent,17,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1439,,tag_lu_431,tax_group_17 +lu_2015_tax_IP-EC-17,Investissement Prestations 17% - Extracommunautaire,IP-EC-17,purchase,group,100,,,lu_2011_chart_1,437,"lu_2015_tax_IP-EC-17-n,lu_2015_tax_IP-EC-17-p",tag_lu_159,tax_group_17 +lu_2011_tax_IP-EC-3-n,Investissement Prestations 3% - Extracommunautaire (-),IP-EC-3-n,none,percent,-3,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1441,,tag_lu_588,tax_group_3 +lu_2011_tax_IP-EC-3-p,Investissement Prestations 3% - Extracommunautaire (+),IP-EC-3-p,none,percent,3,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1442,,tag_lu_423,tax_group_3 +lu_2011_tax_IP-EC-3,Investissement Prestations 3% - Extracommunautaire,IP-EC-3,purchase,group,100,,,lu_2011_chart_1,440,"lu_2011_tax_IP-EC-3-n,lu_2011_tax_IP-EC-3-p",tag_lu_147,tax_group_3 +lu_2011_tax_IP-EC-6-n,Investissement Prestations 6% - Extracommunautaire (-),IP-EC-6-n,none,percent,-6,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1444,,tag_lu_589,tax_group_6 +lu_2011_tax_IP-EC-6-p,Investissement Prestations 6% - Extracommunautaire (+),IP-EC-6-p,none,percent,6,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1445,,tag_lu_419,tax_group_6 +lu_2011_tax_IP-EC-6,Investissement Prestations 6% - Extracommunautaire,IP-EC-6,purchase,group,100,,,lu_2011_chart_1,443,"lu_2011_tax_IP-EC-6-n,lu_2011_tax_IP-EC-6-p",tag_lu_143,tax_group_6 +lu_2015_tax_IP-EC-8-n,Investissement Prestations 8% - Extracommunautaire (-),IP-EC-8-n,none,percent,-8,lu_2011_account_4614113,lu_2011_account_4614113,lu_2011_chart_1,1447,,tag_lu_590,tax_group_8 +lu_2015_tax_IP-EC-8-p,Investissement Prestations 8% - Extracommunautaire (+),IP-EC-8-p,none,percent,8,lu_2011_account_4216113,lu_2011_account_4216113,lu_2011_chart_1,1448,,tag_lu_439,tax_group_8 +lu_2015_tax_IP-EC-8,Investissement Prestations 8% - Extracommunautaire,IP-EC-8,purchase,group,100,,,lu_2011_chart_1,446,"lu_2015_tax_IP-EC-8-n,lu_2015_tax_IP-EC-8-p",tag_lu_167,tax_group_8 +lu_2011_tax_IP-IC-0,Investissement Prestations Exonérées - Intracommunautaire,IP-IC-0,purchase,percent,0,,,lu_2011_chart_1,449,,tag_lu_122,tax_group_0 +lu_2011_tax_IP-IC-12-n,Investissement Prestations 12% - Intracommunautaire (-),IP-IC-12-n,none,percent,-12,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1451,,tag_lu_591,tax_group_12 +lu_2011_tax_IP-IC-12-p,Investissement Prestations 12% - Intracommunautaire (+),IP-IC-12-p,none,percent,12,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1452,,tag_lu_398,tax_group_12 +lu_2011_tax_IP-IC-12,Investissement Prestations 12% - Intracommunautaire,IP-IC-12,purchase,group,100,,,lu_2011_chart_1,450,"lu_2011_tax_IP-IC-12-n,lu_2011_tax_IP-IC-12-p",tag_lu_118,tax_group_12 +lu_2015_tax_IP-IC-14-n,Investissement Prestations 14% - Intracommunautaire (-),IP-IC-14-n,none,percent,-14,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1454,,tag_lu_592,tax_group_14 +lu_2015_tax_IP-IC-14-p,Investissement Prestations 14% - Intracommunautaire (+),IP-IC-14-p,none,percent,14,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1455,,tag_lu_406,tax_group_14 +lu_2015_tax_IP-IC-14,Investissement Prestations 14% - Intracommunautaire,IP-IC-14,purchase,group,100,,,lu_2011_chart_1,453,"lu_2015_tax_IP-IC-14-n,lu_2015_tax_IP-IC-14-p",tag_lu_130,tax_group_14 +lu_2011_tax_IP-IC-15-n,Investissement Prestations 15% - Intracommunautaire (-),IP-IC-15-n,none,percent,-15,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1457,,tag_lu_593,tax_group_15 +lu_2011_tax_IP-IC-15-p,Investissement Prestations 15% - Intracommunautaire (+),IP-IC-15-p,none,percent,15,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1458,,tag_lu_386,tax_group_15 +lu_2011_tax_IP-IC-15,Investissement Prestations 15% - Intracommunautaire,IP-IC-15,purchase,group,100,,,lu_2011_chart_1,456,"lu_2011_tax_IP-IC-15-n,lu_2011_tax_IP-IC-15-p",tag_lu_106,tax_group_15 +lu_2015_tax_IP-IC-17-n,Investissement Prestations 17% - Intracommunautaire (-),IP-IC-17-n,none,percent,-17,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1460,,tag_lu_594,tax_group_17 +lu_2015_tax_IP-IC-17-p,Investissement Prestations 17% - Intracommunautaire (+),IP-IC-17-p,none,percent,17,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1461,,tag_lu_402,tax_group_17 +lu_2015_tax_IP-IC-17,Investissement Prestations 17% - Intracommunautaire,IP-IC-17,purchase,group,100,,,lu_2011_chart_1,459,"lu_2015_tax_IP-IC-17-n,lu_2015_tax_IP-IC-17-p",tag_lu_126,tax_group_17 +lu_2011_tax_IP-IC-3-n,Investissement Prestations 3% - Intracommunautaire (-),IP-IC-3-n,none,percent,-3,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1463,,tag_lu_595,tax_group_3 +lu_2011_tax_IP-IC-3-p,Investissement Prestations 3% - Intracommunautaire (+),IP-IC-3-p,none,percent,3,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1464,,tag_lu_394,tax_group_3 +lu_2011_tax_IP-IC-3,Investissement Prestations 3% - Intracommunautaire,IP-IC-3,purchase,group,100,,,lu_2011_chart_1,462,"lu_2011_tax_IP-IC-3-n,lu_2011_tax_IP-IC-3-p",tag_lu_114,tax_group_3 +lu_2011_tax_IP-IC-6-n,Investissement Prestations 6% - Intracommunautaire (-),IP-IC-6-n,none,percent,-6,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1466,,tag_lu_596,tax_group_6 +lu_2011_tax_IP-IC-6-p,Investissement Prestations 6% - Intracommunautaire (+),IP-IC-6-p,none,percent,6,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1467,,tag_lu_390,tax_group_6 +lu_2011_tax_IP-IC-6,Investissement Prestations 6% - Intracommunautaire,IP-IC-6,purchase,group,100,,,lu_2011_chart_1,465,"lu_2011_tax_IP-IC-6-n,lu_2011_tax_IP-IC-6-p",tag_lu_110,tax_group_6 +lu_2015_tax_IP-IC-8-n,Investissement Prestations 8% - Intracommunautaire (-),IP-IC-8-n,none,percent,-8,lu_2011_account_4614112,lu_2011_account_4614112,lu_2011_chart_1,1469,,tag_lu_597,tax_group_8 +lu_2015_tax_IP-IC-8-p,Investissement Prestations 8% - Intracommunautaire (+),IP-IC-8-p,none,percent,8,lu_2011_account_4216112,lu_2011_account_4216112,lu_2011_chart_1,1470,,tag_lu_410,tax_group_8 +lu_2015_tax_IP-IC-8,Investissement Prestations 8% - Intracommunautaire,IP-IC-8,purchase,group,100,,,lu_2011_chart_1,468,"lu_2015_tax_IP-IC-8-n,lu_2015_tax_IP-IC-8-p",tag_lu_134,tax_group_8 +lu_2011_tax_IP-PA-0,Investissement Prestations 0% - Pays,IP-PA-0,purchase,percent,0,,,lu_2011_chart_1,471,,tag_lu_260,tax_group_0 +lu_2011_tax_IP-PA-12,Investissement Prestations 12% - Pays,IP-PA-12,purchase,percent,12,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,472,,"tag_lu_483,tag_lu_261",tax_group_12 +lu_2015_tax_IP-PA-14,Investissement Prestations 14% - Pays,IP-PA-14,purchase,percent,14,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,473,,"tag_lu_484,tag_lu_262",tax_group_14 +lu_2011_tax_IP-PA-15,Investissement Prestations 15% - Pays,IP-PA-15,purchase,percent,15,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,474,,"tag_lu_485,tag_lu_263",tax_group_15 +lu_2015_tax_IP-PA-17,Investissement Prestations 17% - Pays,IP-PA-17,purchase,percent,17,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,475,,"tag_lu_486,tag_lu_264",tax_group_17 +lu_2011_tax_IP-PA-3,Investissement Prestations 3% - Pays,IP-PA-3,purchase,percent,3,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,476,,"tag_lu_265,tag_lu_487",tax_group_3 +lu_2011_tax_IP-PA-6,Investissement Prestations 6% - Pays,IP-PA-6,purchase,percent,6,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,477,,"tag_lu_488,tag_lu_266",tax_group_6 +lu_2015_tax_IP-PA-8,Investissement Prestations 8% - Pays,IP-PA-8,purchase,percent,8,lu_2011_account_4216111,lu_2011_account_4216111,lu_2011_chart_1,478,,"tag_lu_489,tag_lu_267",tax_group_8 +lu_2015_tax_V-ART-43_60b,Vente - Autres Exonérations (Article 43 et 60 bis),V-ART-43_60b,sale,percent,0,,,lu_2011_chart_1,479,,tag_lu_174,tax_group_0 +lu_2015_tax_V-ART-44_56q,Vente - Autres Exonérations (Article 44 et 56 quarter),V-ART-44_56q,sale,percent,0,,,lu_2011_chart_1,480,,tag_lu_176,tax_group_0 +lu_2011_tax_VB-EC-0,Vente Biens - Extracommunautaire,VB-EC-0,sale,percent,0,,,lu_2011_chart_1,481,,tag_lu_172,tax_group_0 +lu_2011_tax_VB-EC-Tab,Vente Biens Tabacs - Extracommunautaire,VB-EC-Tab,sale,percent,0,,,lu_2011_chart_1,482,,tag_lu_178,tax_group_0 +lu_2011_tax_VB-IC-0,Vente Biens - Intracommunautaire,VB-IC-0,sale,percent,0,,,lu_2011_chart_1,483,,tag_lu_192,tax_group_0 +lu_2011_tax_VB-IC-Tab,Vente Biens Tabacs - Intracommunautaire,VB-IC-Tab,sale,percent,0,,,lu_2011_chart_1,484,,tag_lu_179,tax_group_0 +lu_2011_tax_VB-PA-0,Vente Biens 0% - Pays,VB-PA-0,sale,percent,0,,,lu_2011_chart_1,485,,tag_lu_208,tax_group_0 +lu_2011_tax_VB-PA-12,Vente Biens 12% - Pays,VB-PA-12,sale,percent,12,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,486,,"tag_lu_283,tag_lu_205",tax_group_12 +lu_2015_tax_VB-PA-14,Vente Biens 14% - Pays,VB-PA-14,sale,percent,14,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,487,,"tag_lu_290,tag_lu_214",tax_group_14 +lu_2011_tax_VB-PA-15,Vente Biens 15% - Pays,VB-PA-15,sale,percent,15,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,488,,"tag_lu_274,tag_lu_196",tax_group_15 +lu_2015_tax_VB-PA-17,Vente Biens 17% - Pays,VB-PA-17,sale,percent,17,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,489,,"tag_lu_287,tag_lu_211",tax_group_17 +lu_2011_tax_VB-PA-3,Vente Biens 3% - Pays,VB-PA-3,sale,percent,3,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,490,,"tag_lu_202,tag_lu_280",tax_group_3 +lu_2011_tax_VB-PA-6,Vente Biens 6% - Pays,VB-PA-6,sale,percent,6,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,491,,"tag_lu_277,tag_lu_199",tax_group_6 +lu_2015_tax_VB-PA-8,Vente Biens 8% - Pays,VB-PA-8,sale,percent,8,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,492,,"tag_lu_293,tag_lu_217",tax_group_8 +lu_2011_tax_VB-PA-Tab,Vente Biens Tabacs - Pays,VB-PA-Tab,sale,percent,0,,,lu_2011_chart_1,493,,tag_lu_180,tax_group_0 +lu_2015_tax_VB-TR-0,Vente Biens – Triangulaire Intracommunautaire,VB-TR-0,sale,percent,0,,,lu_2011_chart_1,494,,tag_lu_182,tax_group_0 +lu_2011_tax_VP-EC-0,Vente Prestations - Extracommunautaire,VP-EC-0,sale,percent,0,,,lu_2011_chart_1,495,,tag_lu_184,tax_group_0 +lu_2011_tax_VP-IC-0,Vente Prestations - Intracommunautaire,VP-IC-0,sale,percent,0,,,lu_2011_chart_1,496,,tag_lu_188,tax_group_0 +lu_2011_tax_VP-IC-EX,'Vente Prestations - Intracommunautaire exonérées dans l''état membre',VP-IC-EX,sale,percent,0,,,lu_2011_chart_1,497,,tag_lu_190,tax_group_0 +lu_2011_tax_VP-PA-0,Vente Prestations 0% - Pays,VP-PA-0,sale,percent,0,,,lu_2011_chart_1,498,,tag_lu_209,tax_group_0 +lu_2011_tax_VP-PA-12,Vente Prestations 12% - Pays,VP-PA-12,sale,percent,12,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,499,,"tag_lu_284,tag_lu_206",tax_group_12 +lu_2015_tax_VP-PA-14,Vente Prestations 14% - Pays,VP-PA-14,sale,percent,14,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,500,,"tag_lu_291,tag_lu_215",tax_group_14 +lu_2011_tax_VP-PA-15,Vente Prestations 15% - Pays,VP-PA-15,sale,percent,15,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,501,,"tag_lu_275,tag_lu_197",tax_group_15 +lu_2015_tax_VP-PA-17,Vente Prestations 17% - Pays,VP-PA-17,sale,percent,17,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,502,,"tag_lu_288,tag_lu_212",tax_group_17 +lu_2011_tax_VP-PA-3,Vente Prestations 3% - Pays,VP-PA-3,sale,percent,3,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,503,,"tag_lu_281,tag_lu_203",tax_group_3 +lu_2011_tax_VP-PA-6,Vente Prestations 6% - Pays,VP-PA-6,sale,percent,6,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,504,,"tag_lu_200,tag_lu_278",tax_group_6 +lu_2015_tax_VP-PA-8,Vente Prestations 8% - Pays,VP-PA-8,sale,percent,8,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,505,,"tag_lu_294,tag_lu_218",tax_group_8 +lu_2015_tax_SANS,Sans Taxes,SANS,purchase,percent,0,,,lu_2011_chart_1,506,,tag_lu_598,tax_group_0 +lu_2015_tax_SANS,Sans Taxes,SANS,sale,percent,0,,,lu_2011_chart_1,507,,tag_lu_598,tax_group_0 diff --git a/addons/l10n_lu/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_lu/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..fa56fd00dfa --- /dev/null +++ b/addons/l10n_lu/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/l10n_multilang/models/l10n_multilang.py b/addons/l10n_multilang/models/l10n_multilang.py index de0ef064bcd..bee06394b7d 100644 --- a/addons/l10n_multilang/models/l10n_multilang.py +++ b/addons/l10n_multilang/models/l10n_multilang.py @@ -73,22 +73,26 @@ class AccountChartTemplate(models.Model): @api.multi def _process_accounts_translations(self, company_id, langs, field): - in_ids = self.env['account.account.template'].search([('chart_template_id', '=', self.id)], order='id') - out_ids = self.env['account.account'].search([('company_id', '=', company_id)], order='id') + in_ids, out_ids = self._get_template_from_model(company_id, 'account.account') return self.process_translations(langs, field, in_ids, out_ids) @api.multi def _process_taxes_translations(self, company_id, langs, field): - in_ids = self.env['account.tax.template'].search([('chart_template_id', '=', self.id)], order='id') - out_ids = self.env['account.tax'].search([('company_id', '=', company_id)], order='id') + in_ids, out_ids = self._get_template_from_model(company_id, 'account.tax') return self.process_translations(langs, field, in_ids, out_ids) @api.multi def _process_fiscal_pos_translations(self, company_id, langs, field): - in_ids = self.env['account.fiscal.position.template'].search([('chart_template_id', '=', self.id)], order='id') - out_ids = self.env['account.fiscal.position'].search([('company_id', '=', company_id)], order='id') + in_ids, out_ids = self._get_template_from_model(company_id, 'account.fiscal.position') return self.process_translations(langs, field, in_ids, out_ids) + def _get_template_from_model(self, company_id, model): + out_data = self.env['ir.model.data'].search([('model', '=', model), ('name', '=like', str(company_id)+'\_%')]) + out_ids = self.env[model].search([('id', 'in', out_data.mapped('res_id'))], order='id') + in_xml_id_names = [xml_id.partition(str(company_id) + '_')[-1] for xml_id in out_data.mapped('name')] + in_xml_ids = self.env['ir.model.data'].search([('model', '=', model+'.template'), ('name', 'in', in_xml_id_names)]) + in_ids = self.env[model+'.template'].search([('id', 'in', in_xml_ids.mapped('res_id'))], order='id') + return (in_ids, out_ids) class BaseLanguageInstall(models.TransientModel): """ Install Language""" diff --git a/addons/l10n_mx/__manifest__.py b/addons/l10n_mx/__manifest__.py index 49baf7a72ad..d7bf6c4ede9 100644 --- a/addons/l10n_mx/__manifest__.py +++ b/addons/l10n_mx/__manifest__.py @@ -28,7 +28,7 @@ With this module you will have: - Minimal chart of account tested in production environments. - Minimal chart of taxes, to comply with SAT_ requirements. -.. SAT: http://www.sat.gob.mx/ +.. _SAT: http://www.sat.gob.mx/ """, "depends": [ "account", diff --git a/addons/l10n_mx/data/account_tag_data.xml b/addons/l10n_mx/data/account_tag_data.xml index ecf157f78b2..5160151c821 100644 --- a/addons/l10n_mx/data/account_tag_data.xml +++ b/addons/l10n_mx/data/account_tag_data.xml @@ -479,7 +479,7 @@ <field name='name'>119.01 IVA pendiente de pago</field> <field name='color'>4</field> <field name='applicability'>accounts</field> - <field name='nature'>D</field> + <field name='nature'>A</field> </record> <record id='account_tag_119_02' model='account.account.tag'> <field name='name'>119.02 IVA de importación pendiente de pago</field> @@ -2015,7 +2015,7 @@ <field name='name'>304.01 Utilidad de ejercicios anteriores</field> <field name='color'>4</field> <field name='applicability'>accounts</field> - <field name='nature'>D</field> + <field name='nature'>A</field> </record> <record id='account_tag_304_02' model='account.account.tag'> <field name='name'>304.02 Pérdida de ejercicios anteriores</field> @@ -2429,7 +2429,7 @@ <field name='name'>503.01 Devoluciones, descuentos o bonificaciones sobre compras</field> <field name='color'>4</field> <field name='applicability'>accounts</field> - <field name='nature'>D</field> + <field name='nature'>A</field> </record> <record id='account_tag_504_01' model='account.account.tag'> <field name='name'>504.01 Gastos indirectos de fabricación</field> @@ -5573,7 +5573,7 @@ <field name='name'>899.01 Otras cuentas de orden</field> <field name='color'>4</field> <field name='applicability'>accounts</field> - <field name='nature'>A</field> + <field name='nature'>D</field> </record> <record id='account_tag_899_02' model='account.account.tag'> <field name='name'>899.02 Contra cuenta otras cuentas de orden</field> diff --git a/addons/l10n_no/__manifest__.py b/addons/l10n_no/__manifest__.py index c8f93010947..ba4208b6b3c 100644 --- a/addons/l10n_no/__manifest__.py +++ b/addons/l10n_no/__manifest__.py @@ -3,7 +3,7 @@ { "name" : "Norway - Accounting", - "version" : "1.1", + "version" : "2.0", "author" : "Rolv Råen", 'category': 'Localization', "description": """This is the module to manage the accounting chart for Norway in Odoo. diff --git a/addons/l10n_no/data/account_tax_data.xml b/addons/l10n_no/data/account_tax_data.xml index cec3e4cd917..2609ee6f0bc 100644 --- a/addons/l10n_no/data/account_tax_data.xml +++ b/addons/l10n_no/data/account_tax_data.xml @@ -1,142 +1,171 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8"?> <odoo> -<data noupdate="1"> - <!-- Account Tags --> + <data> - <record id="tax_tag_ut25" model="account.account.tag"> - <field name="name">Utgående 25% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_ut15" model="account.account.tag"> - <field name="name">Utgående 15% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_ut8" model="account.account.tag"> - <field name="name">Utgående 10% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_in25" model="account.account.tag"> - <field name="name">Inngående 25% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_in15" model="account.account.tag"> - <field name="name">Inngående 15% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_in8" model="account.account.tag"> - <field name="name">Inngående 10% mva</field> - <field name="applicability">taxes</field> - </record> + <!-- Account Tags --> + <record id="tag_no_01" model="account.account.tag"> + <field name="name">Sum avgiftsgrunnlag</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_02" model="account.account.tag"> + <field name="name">Sum innkjøp</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_03" model="account.account.tag"> + <field name="name">Ikke momspliktig omsetning</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_04" model="account.account.tag"> + <field name="name">Grunnlag for utgående avgift, høy sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_05" model="account.account.tag"> + <field name="name">Grunnlag for utgående avgift, mellom sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_06" model="account.account.tag"> + <field name="name">Grunnlag for utgående avgift, lav sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_07" model="account.account.tag"> + <field name="name">Grunnlag for inngående avgift, høy sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_08" model="account.account.tag"> + <field name="name">Grunnlag for inngående avgift, mellom sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_09" model="account.account.tag"> + <field name="name">Grunnlag for inngående avgift, lav sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_10" model="account.account.tag"> + <field name="name">Netto beregnet avgift</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_11" model="account.account.tag"> + <field name="name">Beregnet inngående avgift, høy sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_12" model="account.account.tag"> + <field name="name">Beregnet inngående avgift, lav sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_13" model="account.account.tag"> + <field name="name">Beregnet inngående avgift, mellom sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_14" model="account.account.tag"> + <field name="name">Beregnet utgående avgift, høy sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_15" model="account.account.tag"> + <field name="name">Beregnet utgående avgift, lav sats</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_no_16" model="account.account.tag"> + <field name="name">Beregnet utgående avgift, mellom sats</field> + <field name="applicability">taxes</field> + </record> - <record id="tax_tag_in0" model="account.account.tag"> - <field name="name">Inngående 0% mva</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_tag_ut0" model="account.account.tag"> - <field name="name">Utgående 0% mva</field> - <field name="applicability">taxes</field> - </record> - - -<record id="tax1" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Utgående 25% mva</field> - <field name="description">Utgående 25% mva</field> - <field name="amount">25</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="account_id" ref="chart2701"/> - <field name="refund_account_id" ref="chart2701"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_ut25')])]"/> + <record id="tax1" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Utgående 25% mva</field> + <field name="description">Utgående 25% mva</field> + <field name="amount">25</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="account_id" ref="chart2701"/> + <field name="refund_account_id" ref="chart2701"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_04'),ref('tag_no_14')])]"/> <field name="tax_group_id" ref="tax_group_25"/> -</record> -<record id="tax2" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Utgående 15% mva</field> - <field name="description">Utgående 15% mva</field> - <field name="amount">15</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="account_id" ref="chart2703"/> - <field name="refund_account_id" ref="chart2703"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_ut15')])]"/> + </record> + <record id="tax2" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Utgående 15% mva</field> + <field name="description">Utgående 15% mva</field> + <field name="amount">15</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="account_id" ref="chart2703"/> + <field name="refund_account_id" ref="chart2703"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_05'),ref('tag_no_16')])]"/> <field name="tax_group_id" ref="tax_group_15"/> -</record> -<record id="tax3" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Utgående 10% mva</field> - <field name="description">Utgående 10% mva</field> - <field name="amount">10</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="account_id" ref="chart2704"/> - <field name="refund_account_id" ref="chart2704"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_ut8')])]"/> + </record> + <record id="tax3" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Utgående 10% mva</field> + <field name="description">Utgående 10% mva</field> + <field name="amount">10</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="account_id" ref="chart2704"/> + <field name="refund_account_id" ref="chart2704"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_06'),ref('tag_no_15')])]"/> <field name="tax_group_id" ref="tax_group_10"/> -</record> -<record id="tax4" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Inngående 25% mva</field> - <field name="description">Inngående 25% mva</field> - <field name="amount">25</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="account_id" ref="chart2711"/> - <field name="refund_account_id" ref="chart2711"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_in25')])]"/> + </record> + <record id="tax4" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Inngående 25% mva</field> + <field name="description">Inngående 25% mva</field> + <field name="amount">25</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="account_id" ref="chart2711"/> + <field name="refund_account_id" ref="chart2711"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_07'),ref('tag_no_11')])]"/> <field name="tax_group_id" ref="tax_group_25"/> -</record> -<record id="tax5" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Inngående 15% mva</field> - <field name="description">Inngående 15% mva</field> - <field name="amount">15</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="account_id" ref="chart2713"/> - <field name="refund_account_id" ref="chart2713"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_in15')])]"/> + </record> + <record id="tax5" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Inngående 15% mva</field> + <field name="description">Inngående 15% mva</field> + <field name="amount">15</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="account_id" ref="chart2713"/> + <field name="refund_account_id" ref="chart2713"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_08'),ref('tag_no_13')])]"/> <field name="tax_group_id" ref="tax_group_15"/> -</record> -<record id="tax6" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Inngående 10% mva</field> - <field name="description">Inngående 10% mva</field> - <field name="amount">10</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="account_id" ref="chart2714"/> - <field name="refund_account_id" ref="chart2714"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_in8')])]"/> + </record> + <record id="tax6" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Inngående 10% mva</field> + <field name="description">Inngående 10% mva</field> + <field name="amount">10</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="account_id" ref="chart2714"/> + <field name="refund_account_id" ref="chart2714"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_09'),ref('tag_no_12')])]"/> <field name="tax_group_id" ref="tax_group_10"/> -</record> + </record> -<record id="tax7" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Inngående 0% mva</field> - <field name="description">Inngående 0% mva</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="account_id" ref="chart2714"/> - <field name="refund_account_id" ref="chart2714"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_in0')])]"/> + <record id="tax7" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Inngående 0% mva</field> + <field name="description">Inngående 0% mva</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="account_id" ref="chart2714"/> + <field name="refund_account_id" ref="chart2714"/> <field name="tax_group_id" ref="tax_group_0"/> -</record> + </record> -<record id="tax8" model="account.tax.template"> - <field name="chart_template_id" ref="no_chart_template"/> - <field name="name">Utgående 0% mva</field> - <field name="description">Utgående 0% mva</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="account_id" ref="chart2704"/> - <field name="refund_account_id" ref="chart2704"/> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_ut0')])]"/> + <record id="tax8" model="account.tax.template"> + <field name="chart_template_id" ref="no_chart_template"/> + <field name="name">Utgående 0% mva</field> + <field name="description">Utgående 0% mva</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="account_id" ref="chart2704"/> + <field name="refund_account_id" ref="chart2704"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_no_03')])]"/> <field name="tax_group_id" ref="tax_group_0"/> -</record> + </record> -</data> + </data> </odoo> diff --git a/addons/l10n_no/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_no/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..a37770d2c1c --- /dev/null +++ b/addons/l10n_no/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,7 @@ +from openerp.modules.registry import RegistryManager + + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/l10n_no/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py b/addons/l10n_no/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py new file mode 100644 index 00000000000..fa1694f229a --- /dev/null +++ b/addons/l10n_no/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py @@ -0,0 +1,7 @@ +from openerp.modules.registry import RegistryManager + + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_set_tags_and_taxes_updatable + migrate_set_tags_and_taxes_updatable(cr, registry, 'l10n_no') diff --git a/addons/l10n_pl/__manifest__.py b/addons/l10n_pl/__manifest__.py index 0edf835ab0d..dab10c2a1f3 100644 --- a/addons/l10n_pl/__manifest__.py +++ b/addons/l10n_pl/__manifest__.py @@ -5,7 +5,7 @@ { 'name' : 'Poland - Accounting', - 'version' : '1.02', + 'version' : '2.0', 'author' : 'Grzegorz Grzelak (OpenGLOBE)', 'website': 'http://www.openglobe.pl', 'category': 'Localization', diff --git a/addons/l10n_pl/data/account_tax_data.xml b/addons/l10n_pl/data/account_tax_data.xml index 43e4c5343aa..f29294b36aa 100644 --- a/addons/l10n_pl/data/account_tax_data.xml +++ b/addons/l10n_pl/data/account_tax_data.xml @@ -1,801 +1,815 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> -<data noupdate="1"> + <data> + <!-- Account Tags --> - <record id="tax_Z23" model="account.account.tag"> - <field name="name">Z23</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_V23" model="account.account.tag"> - <field name="name">V23</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z0" model="account.account.tag"> - <field name="name">Z0</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_ZZW" model="account.account.tag"> - <field name="name">ZZW</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLPS" model="account.account.tag"> - <field name="name">VLPSale</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLPP" model="account.account.tag"> - <field name="name">VLPPurchase</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VST" model="account.account.tag"> - <field name="name">VST</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_zst" model="account.account.tag"> - <field name="name">zst</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_udt" model="account.account.tag"> - <field name="name">udt</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_unt" model="account.account.tag"> - <field name="name">unt</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_V0" model="account.account.tag"> - <field name="name">V0</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UNU" model="account.account.tag"> - <field name="name">UNU</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_EXT" model="account.account.tag"> - <field name="name">EXT</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMT" model="account.account.tag"> - <field name="name">IMT</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_EXU" model="account.account.tag"> - <field name="name">EXU</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMU" model="account.account.tag"> - <field name="name">IMU</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_V22" model="account.account.tag"> - <field name="name">V22</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_V8" model="account.account.tag"> - <field name="name">V8</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_v7" model="account.account.tag"> - <field name="name">v7</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_v5" model="account.account.tag"> - <field name="name">v5</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_v3" model="account.account.tag"> - <field name="name">v3</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VU23" model="account.account.tag"> - <field name="name">VU23</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VU22" model="account.account.tag"> - <field name="name">VU22</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UDU" model="account.account.tag"> - <field name="name">UDU</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VZW" model="account.account.tag"> - <field name="name">VZW</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLP-1_sale" model="account.account.tag"> - <field name="name">VLP-1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLP-1_purchase" model="account.account.tag"> - <field name="name">VLP-1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLP-2_sale" model="account.account.tag"> - <field name="name">VLP-2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_VLP-2_purchase" model="account.account.tag"> - <field name="name">VLP-2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UNT1" model="account.account.tag"> - <field name="name">UNT1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_ZST1" model="account.account.tag"> - <field name="name">ZST1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UNT2" model="account.account.tag"> - <field name="name">UNT2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_ZST2" model="account.account.tag"> - <field name="name">ZST2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UNU1" model="account.account.tag"> - <field name="name">UNU1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMT1" model="account.account.tag"> - <field name="name">IMT1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMU1" model="account.account.tag"> - <field name="name">IMU1</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMT2" model="account.account.tag"> - <field name="name">IMT2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_UNU2" model="account.account.tag"> - <field name="name">UNU2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_IMU2" model="account.account.tag"> - <field name="name">IMU2</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z22" model="account.account.tag"> - <field name="name">Z22</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z8" model="account.account.tag"> - <field name="name">Z8</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z7" model="account.account.tag"> - <field name="name">Z7</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z5" model="account.account.tag"> - <field name="name">Z5</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_Z3" model="account.account.tag"> - <field name="name">Z3</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_ZU23" model="account.account.tag"> - <field name="name">ZU23</field> - <field name="applicability">taxes</field> - </record> - <record id="tax_ZU22" model="account.account.tag"> - <field name="name">ZU22</field> - <field name="applicability">taxes</field> - </record> - - -# VAT domestic sale - - <record id="vs_kraj_23" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-23%</field> - <field name="description">V23</field> - <field name="amount">23</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="sequence" eval="0"/> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_V23')])]"/> + <record id="tag_pl_01" model="account.account.tag"> + <field name="name">Podstawa - Razem C</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_02" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, kraj, zwolnione</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_03" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, poza kraj</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_04" model="account.account.tag"> + <field name="name">Podstawa - W tym usługi art 100.1.4</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_05" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, kraj, 0%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_06" model="account.account.tag"> + <field name="name">Podstawa - W tym towary art 129</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_07" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, kraj, 3% lub 5%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_08" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, kraj, 7% lub 8%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_09" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów/usług, kraj, 22% lub 23%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_10" model="account.account.tag"> + <field name="name">Podstawa - Wew-wspól dostawa towarów</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_11" model="account.account.tag"> + <field name="name">Podstawa - Eksport towarów</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_12" model="account.account.tag"> + <field name="name">Podstawa - Wewn-wspól. nabycie towarów</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_13" model="account.account.tag"> + <field name="name">Podstawa - Import towarów art. 33a</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_14" model="account.account.tag"> + <field name="name">Podstawa - Import usług</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_15" model="account.account.tag"> + <field name="name">Podstawa - W tym nabycie wg art 28b</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_16" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów, podatnik nabywca</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_17" model="account.account.tag"> + <field name="name">Podstawa - Dostawa towarów, podatnik nabywca bis</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_18" model="account.account.tag"> + <field name="name">Podstawa - Razem D</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_19" model="account.account.tag"> + <field name="name">Podstawa - Nabycie towarów i usług ś.trwałe</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_20" model="account.account.tag"> + <field name="name">Podstawa - Nabycie towarów i usług pozostałych</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_21" model="account.account.tag"> + <field name="name">Podstawa - Nabycie towarów i usług pozostałych bis</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_22" model="account.account.tag"> + <field name="name">Podatek - Do przeniesienia</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_23" model="account.account.tag"> + <field name="name">Podatek - Nadwyżka naliczonego nad należnym</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_24" model="account.account.tag"> + <field name="name">Podatek - Do wpłaty do US</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_25" model="account.account.tag"> + <field name="name">Podatek - Wydatek na kasy rejestrujące</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_26" model="account.account.tag"> + <field name="name">Podatek - Objęty zaniechaniem poboru</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_27" model="account.account.tag"> + <field name="name">Podatek - Razem C</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_28" model="account.account.tag"> + <field name="name">Podatek - Dostawa towarów/usług, kraj, 3% lub 5%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_29" model="account.account.tag"> + <field name="name">Podatek - Dostawa towarów/usług, kraj, 7% lub 8%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_30" model="account.account.tag"> + <field name="name">Podatek - Dostawa towarów/usług, kraj, 22% lub 23%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_31" model="account.account.tag"> + <field name="name">Podatek - Wewn-wspól. nabycie towarów</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_32" model="account.account.tag"> + <field name="name">Podatek - Import towarów art. 33a</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_33" model="account.account.tag"> + <field name="name">Podatek - Import usług</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_34" model="account.account.tag"> + <field name="name">Podatek - W tym nabycie wg art 28b</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_35" model="account.account.tag"> + <field name="name">Podatek - Dostawa towarów, podatnik nabywca</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_36" model="account.account.tag"> + <field name="name">Podatek - Ze spisu z natury art 14.5</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_37" model="account.account.tag"> + <field name="name">Podatek - Wew.wspól. nabycie środk. transp. termin</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_38" model="account.account.tag"> + <field name="name">Podatek - Razem D</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_39" model="account.account.tag"> + <field name="name">Podatek - Nadwyżka z poprzedniej deklaracji</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_40" model="account.account.tag"> + <field name="name">Podatek - Naliczony ze spisu z natury, art.113</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_41" model="account.account.tag"> + <field name="name">Podatek - Nabycie towarów i usług ś.trwałe</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_42" model="account.account.tag"> + <field name="name">Podatek - Nabycie towarów i usług pozostałych</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_43" model="account.account.tag"> + <field name="name">Podatek - Nabycie towarów i usług pozostałych bis</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_44" model="account.account.tag"> + <field name="name">Podatek - Korekta naliczonego od nabycia ś.trwałych</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_45" model="account.account.tag"> + <field name="name">Podatek - Korekta naliczonego od pozostałych nabyć</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_46" model="account.account.tag"> + <field name="name">Podatek - Wydatek na kasy do zwrotu w tym okresie</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_47" model="account.account.tag"> + <field name="name">Podatek - Do zwrotu</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_48" model="account.account.tag"> + <field name="name">Podatek - Do zwrotu 25 dni</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_49" model="account.account.tag"> + <field name="name">Podatek - Do zwrotu 60 dni</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_pl_50" model="account.account.tag"> + <field name="name">Podatek - Do zwrotu 180 dni</field> + <field name="applicability">taxes</field> + </record> + + # VAT domestic sale + + <record id="vs_kraj_23" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-23%</field> + <field name="description">V23</field> + <field name="amount">23</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="sequence" eval="0"/> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_09'), ref('l10n_pl.tag_pl_30')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vs_kraj_22" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-22%</field> - <field name="description">V22</field> - <field name="amount">22</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030100"/> - <field name="account_id" ref="chart22030100"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_V22')])]"/> + </record> + + <record id="vs_kraj_22" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-22%</field> + <field name="description">V22</field> + <field name="amount">22</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030100"/> + <field name="account_id" ref="chart22030100"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_09'), ref('l10n_pl.tag_pl_30')])]"/> <field name="tax_group_id" ref="tax_group_vat_22"/> - </record> - - <record id="vs_kraj_8" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-8%</field> - <field name="description">V8</field> - <field name="amount">8</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030500"/> - <field name="account_id" ref="chart22030500"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_V8')])]"/> + </record> + + <record id="vs_kraj_8" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-8%</field> + <field name="description">V8</field> + <field name="amount">8</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030500"/> + <field name="account_id" ref="chart22030500"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_08'), ref('l10n_pl.tag_pl_29')])]"/> <field name="tax_group_id" ref="tax_group_vat_8"/> - </record> - - <record id="vs_kraj_7" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-7%</field> - <field name="description">V7</field> - <field name="amount">7</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030200"/> - <field name="account_id" ref="chart22030200"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_v7')])]"/> + </record> + + <record id="vs_kraj_7" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-7%</field> + <field name="description">V7</field> + <field name="amount">7</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030200"/> + <field name="account_id" ref="chart22030200"/> + <field name="tag_ids" eval="[ref('l10n_pl.tag_pl_08'), ref('l10n_pl.tag_pl_29')]"/> <field name="tax_group_id" ref="tax_group_vat_7"/> - </record> - - <record id="vs_kraj_5" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-5%</field> - <field name="description">V5</field> - <field name="amount">5</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030600"/> - <field name="account_id" ref="chart22030600"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_v5')])]"/> + </record> + + <record id="vs_kraj_5" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-5%</field> + <field name="description">V5</field> + <field name="amount">5</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030600"/> + <field name="account_id" ref="chart22030600"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_07'), ref('l10n_pl.tag_pl_28')])]"/> <field name="tax_group_id" ref="tax_group_vat_5"/> - </record> - - <record id="vs_kraj_3" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-3%</field> - <field name="description">V3</field> - <field name="amount">3</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030300"/> - <field name="account_id" ref="chart22030300"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_v3')])]"/> + </record> + + <record id="vs_kraj_3" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-3%</field> + <field name="description">V3</field> + <field name="amount">3</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030300"/> + <field name="account_id" ref="chart22030300"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_07'), ref('l10n_pl.tag_pl_28')])]"/> <field name="tax_group_id" ref="tax_group_vat_3"/> - </record> - - <record id="vs_kraj_0" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-0%</field> - <field name="description">V0</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_V0')])]"/> + </record> + + <record id="vs_kraj_0" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-0%</field> + <field name="description">V0</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_05')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vs_kraj_zw" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT-ZW</field> - <field name="description">VZW</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VZW')])]"/> + </record> + + <record id="vs_kraj_zw" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT-ZW</field> + <field name="description">VZW</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_02')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vs_kraj_usl_23" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT usł-23%</field> - <field name="description">VU23</field> - <field name="amount">23</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VU23')])]"/> + </record> + + <record id="vs_kraj_usl_23" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT usł-23%</field> + <field name="description">VU23</field> + <field name="amount">23</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_09'), ref('l10n_pl.tag_pl_30')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vs_kraj_usl_22" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT usł-22%</field> - <field name="description">VU22</field> - <field name="amount">22</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="refund_account_id" ref="chart22030100"/> - <field name="account_id" ref="chart22030100"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VU22')])]"/> + </record> + + <record id="vs_kraj_usl_22" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT usł-22%</field> + <field name="description">VU22</field> + <field name="amount">22</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="refund_account_id" ref="chart22030100"/> + <field name="account_id" ref="chart22030100"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_09'), ref('l10n_pl.tag_pl_30')])]"/> <field name="tax_group_id" ref="tax_group_vat_22"/> - </record> - -# VAT domestic purchase - - <record id="vz_kraj_23" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-23%</field> - <field name="description">Z23</field> - <field name="amount">23</field> - <field name="amount_type">percent</field> - <field name="sequence" eval="0"/> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z23')])]"/> + </record> + + # VAT domestic purchase + + <record id="vz_kraj_23" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-23%</field> + <field name="description">Z23</field> + <field name="amount">23</field> + <field name="amount_type">percent</field> + <field name="sequence" eval="0"/> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vz_kraj_22" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-22%</field> - <field name="description">Z22</field> - <field name="amount">22</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020100"/> - <field name="account_id" ref="chart22020100"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z22')])]"/> + </record> + + <record id="vz_kraj_22" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-22%</field> + <field name="description">Z22</field> + <field name="amount">22</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020100"/> + <field name="account_id" ref="chart22020100"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_22"/> - </record> - - <record id="vz_kraj_8" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-8%</field> - <field name="description">Z8</field> - <field name="amount">8</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020500"/> - <field name="account_id" ref="chart22020500"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z8')])]"/> + </record> + + <record id="vz_kraj_8" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-8%</field> + <field name="description">Z8</field> + <field name="amount">8</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020500"/> + <field name="account_id" ref="chart22020500"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_8"/> - </record> - - <record id="vz_kraj_7" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-7%</field> - <field name="description">Z7</field> - <field name="amount">7</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020200"/> - <field name="account_id" ref="chart22020200"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z7')])]"/> + </record> + + <record id="vz_kraj_7" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-7%</field> + <field name="description">Z7</field> + <field name="amount">7</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020200"/> + <field name="account_id" ref="chart22020200"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_7"/> - </record> - - <record id="vz_kraj_5" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-5%</field> - <field name="description">Z5</field> - <field name="amount">5</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020600"/> - <field name="account_id" ref="chart22020600"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z5')])]"/> + </record> + + <record id="vz_kraj_5" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-5%</field> + <field name="description">Z5</field> + <field name="amount">5</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020600"/> + <field name="account_id" ref="chart22020600"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_5"/> - </record> - - <record id="vz_kraj_3" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-3%</field> - <field name="description">Z3</field> - <field name="amount">3</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020300"/> - <field name="account_id" ref="chart22020300"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z3')])]"/> + </record> + + <record id="vz_kraj_3" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-3%</field> + <field name="description">Z3</field> + <field name="amount">3</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020300"/> + <field name="account_id" ref="chart22020300"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_3"/> - </record> - - <record id="vz_kraj_0" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-0%</field> - <field name="description">Z0</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_Z0')])]"/> + </record> + + <record id="vz_kraj_0" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-0%</field> + <field name="description">Z0</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_kraj_zw" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT naliczony-ZW</field> - <field name="description">ZZW</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_ZZW')])]"/> + </record> + + <record id="vz_kraj_zw" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT naliczony-ZW</field> + <field name="description">ZZW</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_kraj_usl_23" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT usł nalicz-23%</field> - <field name="description">ZU23</field> - <field name="amount">23</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_ZU23')])]"/> + </record> + + <record id="vz_kraj_usl_23" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT usł nalicz-23%</field> + <field name="description">ZU23</field> + <field name="amount">23</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vz_kraj_usl_22" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT usł nalicz-22%</field> - <field name="description">ZU22</field> - <field name="amount">22</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">purchase</field> - <field name="refund_account_id" ref="chart22020100"/> - <field name="account_id" ref="chart22020100"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_ZU22')])]"/> + </record> + + <record id="vz_kraj_usl_22" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT usł nalicz-22%</field> + <field name="description">ZU22</field> + <field name="amount">22</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">purchase</field> + <field name="refund_account_id" ref="chart22020100"/> + <field name="account_id" ref="chart22020100"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_22"/> - </record> - -# Vehicle leasing -#================================================ - - <record id="vp_leas_sale_1" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu 60% x 23%(sale)</field> - <field name="description">VLP-1</field> - <field name="amount" eval="13.80"/> - <field name="sequence" eval="10"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLP-1_sale')])]"/> + </record> + + # Vehicle leasing + #================================================ + + <record id="vp_leas_sale_1" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu 60% x 23%(sale)</field> + <field name="description">VLP-1</field> + <field name="amount" eval="13.80"/> + <field name="sequence" eval="10"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_43')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vp_leas_purchase_1" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu 60% x 23%(purchase)</field> - <field name="description">VLP-1</field> - <field name="amount" eval="13.80"/> - <field name="sequence" eval="10"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLP-1_purchase')])]"/> + </record> + + <record id="vp_leas_purchase_1" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu 60% x 23%(purchase)</field> + <field name="description">VLP-1</field> + <field name="amount" eval="13.80"/> + <field name="sequence" eval="10"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vp_leas_sale_2" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu 40% x 23%(sale)</field> - <field name="description">VLP-2</field> - <field name="amount" eval="9.2"/> - <field name="sequence" eval="20"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart76140000"/> - <field name="account_id" ref="chart76140000"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLP-2_sale')])]"/> + </record> + + <record id="vp_leas_sale_2" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu 40% x 23%(sale)</field> + <field name="description">VLP-2</field> + <field name="amount" eval="9.2"/> + <field name="sequence" eval="20"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart76140000"/> + <field name="account_id" ref="chart76140000"/> + <field name="type_tax_use">none</field> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vp_leas_purchase_2" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu 40% x 23%</field> - <field name="description">VLP-2</field> - <field name="amount" eval="9.2"/> - <field name="sequence" eval="20"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart76140000"/> - <field name="account_id" ref="chart76140000"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLP-2_purchase')])]"/> + </record> + + <record id="vp_leas_purchase_2" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu 40% x 23%</field> + <field name="description">VLP-2</field> + <field name="amount" eval="9.2"/> + <field name="sequence" eval="20"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart76140000"/> + <field name="account_id" ref="chart76140000"/> + <field name="type_tax_use">none</field> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vp_leas_sale" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu(sale)</field> - <field name="description">VLP</field> - <field name="amount">1.00</field> - <field name="sequence" eval="1"/> - <field name="amount_type">group</field> - <field name="type_tax_use">sale</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vp_leas_sale_1'), ref('vp_leas_sale_2')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLPS')])]"/> + </record> + + <record id="vp_leas_sale" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu(sale)</field> + <field name="description">VLP</field> + <field name="amount">1.00</field> + <field name="sequence" eval="1"/> + <field name="amount_type">group</field> + <field name="type_tax_use">sale</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vp_leas_sale_1'), ref('vp_leas_sale_2')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_21')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - - <record id="vp_leas_purchase" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">VAT - leasing pojazdu(purchase)</field> - <field name="description">VLP</field> - <field name="amount">1.00</field> - <field name="sequence" eval="1"/> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vp_leas_purchase_1'), ref('vp_leas_purchase_2')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VLPP')])]"/> + </record> + + <record id="vp_leas_purchase" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">VAT - leasing pojazdu(purchase)</field> + <field name="description">VLP</field> + <field name="amount">1.00</field> + <field name="sequence" eval="1"/> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vp_leas_purchase_1'), ref('vp_leas_purchase_2')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_23"/> - </record> - -# Steel trade - - <record id="vs_stal" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Sprzedaż stali</field> - <field name="description">VST</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_VST')])]"/> + </record> + + # Steel trade + + <record id="vs_stal" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Sprzedaż stali</field> + <field name="description">VST</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_17')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_stal_podatek_naliczony" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Zakup stali - podatek naliczony</field> - <field name="description">ZST1</field> - <field name="amount" eval="23"/> - <field name="sequence" eval="100"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_ZST1')])]"/> + </record> + + <record id="vz_stal_podatek_naliczony" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Zakup stali - podatek naliczony</field> + <field name="description">ZST1</field> + <field name="amount" eval="23"/> + <field name="sequence" eval="100"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_stal_podatek_nalezny" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Zakup stali - podatek należny</field> - <field name="description">ZST2</field> - <field name="amount" eval="-23"/> - <field name="sequence" eval="110"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_ZST2')])]"/> + </record> + + <record id="vz_stal_podatek_nalezny" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Zakup stali - podatek należny</field> + <field name="description">ZST2</field> + <field name="amount" eval="-23"/> + <field name="sequence" eval="110"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_35')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_stal" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Zakup stali</field> - <field name="description">ZST</field> - <field name="amount">1.0</field> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vz_stal_podatek_naliczony'), ref('vz_stal_podatek_nalezny')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_zst')])]"/> + </record> + + <record id="vz_stal" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Zakup stali</field> + <field name="description">ZST</field> + <field name="amount">1.0</field> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vz_stal_podatek_naliczony'), ref('vz_stal_podatek_nalezny')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_20'), ref('l10n_pl.tag_pl_16')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - -# Eurpean Union -#=========================================================== - - <record id="vs_unia" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Dost tow. unia</field> - <field name="description">UDT</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_udt')])]"/> + </record> + + # Eurpean Union + #=========================================================== + + <record id="vs_unia" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Dost tow. unia</field> + <field name="description">UDT</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_10')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_unia_podatek_naliczony" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab tow unia - podatek naliczony</field> - <field name="description">UNT1</field> - <field name="amount" eval="23"/> - <field name="sequence" eval="100"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UNT1')])]"/> + </record> + + <record id="vz_unia_podatek_naliczony" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab tow unia - podatek naliczony</field> + <field name="description">UNT1</field> + <field name="amount" eval="23"/> + <field name="sequence" eval="100"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_unia_podatek_nalezny" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab tow unia - podatek należny</field> - <field name="description">UNT2</field> - <field name="amount" eval="-23"/> - <field name="sequence" eval="110"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UNT2')])]"/> + </record> + + <record id="vz_unia_podatek_nalezny" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab tow unia - podatek należny</field> + <field name="description">UNT2</field> + <field name="amount" eval="-23"/> + <field name="sequence" eval="110"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_31')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_unia" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab tow unia</field> - <field name="description">UNT</field> - <field name="amount">1.0</field> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vz_unia_podatek_naliczony'), ref('vz_unia_podatek_nalezny')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_unt')])]"/> + </record> + + <record id="vz_unia" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab tow unia</field> + <field name="description">UNT</field> + <field name="amount">1.0</field> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vz_unia_podatek_naliczony'), ref('vz_unia_podatek_nalezny')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_20'), ref('l10n_pl.tag_pl_12')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vs_dostu" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Świad Usł</field> - <field name="description">UDU</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UDU')])]"/> + </record> + + <record id="vs_dostu" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Świad Usł</field> + <field name="description">UDU</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_04')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_nabu_podatek_naliczony" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab Usł - podatek naliczony</field> - <field name="description">UNU1</field> - <field name="amount" eval="23"/> - <field name="sequence" eval="200"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UNU1')])]"/> + </record> + + <record id="vz_nabu_podatek_naliczony" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab Usł - podatek naliczony</field> + <field name="description">UNU1</field> + <field name="amount" eval="23"/> + <field name="sequence" eval="200"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_nabu_2" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab Usł - podatek należny</field> - <field name="description">UNU2</field> - <field name="amount" eval="-23"/> - <field name="sequence" eval="210"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UNU2')])]"/> + </record> + + <record id="vz_nabu_2" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab Usł - podatek należny</field> + <field name="description">UNU2</field> + <field name="amount" eval="-23"/> + <field name="sequence" eval="210"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_34')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_nabu" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Nab Usł</field> - <field name="description">UNU</field> - <field name="amount">1.0</field> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vz_nabu_podatek_naliczony'), ref('vz_nabu_2')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_UNU')])]"/> + </record> + + <record id="vz_nabu" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Nab Usł</field> + <field name="description">UNU</field> + <field name="amount">1.0</field> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vz_nabu_podatek_naliczony'), ref('vz_nabu_2')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_20'),ref('l10n_pl.tag_pl_15')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> + </record> -# Export / Import -#================================================ + # Export / Import + #================================================ - <record id="vs_eksp_tow" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Eksp Tow</field> - <field name="description">EXT</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_EXT')])]"/> + <record id="vs_eksp_tow" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Eksp Tow</field> + <field name="description">EXT</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_11')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_imp_tow_podatek_naliczony" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Tow - podatek naliczony</field> - <field name="description">IMT1</field> - <field name="amount" eval="23"/> - <field name="sequence" eval="200"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMT1')])]"/> + </record> + + <record id="vz_imp_tow_podatek_naliczony" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Tow - podatek naliczony</field> + <field name="description">IMT1</field> + <field name="amount" eval="23"/> + <field name="sequence" eval="200"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_imp_tow_podatek_nalezny" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Tow - podatek należny</field> - <field name="description">IMT2</field> - <field name="amount" eval="-23"/> - <field name="sequence" eval="210"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMT2')])]"/> + </record> + + <record id="vz_imp_tow_podatek_nalezny" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Tow - podatek należny</field> + <field name="description">IMT2</field> + <field name="amount" eval="-23"/> + <field name="sequence" eval="210"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_32')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_imp_tow" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Tow</field> - <field name="description">IMT</field> - <field name="amount">1.0</field> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vz_imp_tow_podatek_naliczony'), ref('vz_imp_tow_podatek_nalezny')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMT')])]"/> + </record> + + <record id="vz_imp_tow" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Tow</field> + <field name="description">IMT</field> + <field name="amount">1.0</field> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vz_imp_tow_podatek_naliczony'), ref('vz_imp_tow_podatek_nalezny')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_13'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vs_ekspu" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Eksp Usł</field> - <field name="description">EXU</field> - <field name="amount">0</field> - <field name="amount_type">percent</field> - <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_EXU')])]"/> + </record> + + <record id="vs_ekspu" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Eksp Usł</field> + <field name="description">EXU</field> + <field name="amount">0</field> + <field name="amount_type">percent</field> + <field name="type_tax_use">sale</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_03')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_impu_podatek_naliczony" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Usł - podatek naliczony</field> - <field name="description">IMU1</field> - <field name="amount" eval="23"/> - <field name="sequence" eval="200"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22020400"/> - <field name="account_id" ref="chart22020400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMU1')])]"/> + </record> + + <record id="vz_impu_podatek_naliczony" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Usł - podatek naliczony</field> + <field name="description">IMU1</field> + <field name="amount" eval="23"/> + <field name="sequence" eval="200"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22020400"/> + <field name="account_id" ref="chart22020400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_42')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_impu_podatek_nalezny" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Usł - podatek należny</field> - <field name="description">IMU2</field> - <field name="amount" eval="-23"/> - <field name="sequence" eval="210"/> - <field name="amount_type">percent</field> - <field name="refund_account_id" ref="chart22030400"/> - <field name="account_id" ref="chart22030400"/> - <field name="type_tax_use">none</field> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMU2')])]"/> + </record> + + <record id="vz_impu_podatek_nalezny" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Usł - podatek należny</field> + <field name="description">IMU2</field> + <field name="amount" eval="-23"/> + <field name="sequence" eval="210"/> + <field name="amount_type">percent</field> + <field name="refund_account_id" ref="chart22030400"/> + <field name="account_id" ref="chart22030400"/> + <field name="type_tax_use">none</field> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_33')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> - - <record id="vz_impu" model="account.tax.template"> - <field name="chart_template_id" ref="pl_chart_template"/> - <field name="name">Imp Usł</field> - <field name="description">IMU</field> - <field name="amount">1.00</field> - <field name="amount_type">group</field> - <field name="type_tax_use">purchase</field> - <field name="children_tax_ids" eval="[(6, 0, [ref('vz_impu_podatek_naliczony'), ref('vz_impu_podatek_nalezny')])]"/> - <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tax_IMU')])]"/> + </record> + + <record id="vz_impu" model="account.tax.template"> + <field name="chart_template_id" ref="pl_chart_template"/> + <field name="name">Imp Usł</field> + <field name="description">IMU</field> + <field name="amount">1.00</field> + <field name="amount_type">group</field> + <field name="type_tax_use">purchase</field> + <field name="children_tax_ids" eval="[(6, 0, [ref('vz_impu_podatek_naliczony'), ref('vz_impu_podatek_nalezny')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('l10n_pl.tag_pl_14'), ref('l10n_pl.tag_pl_20')])]"/> <field name="tax_group_id" ref="tax_group_vat_0"/> - </record> + </record> -</data> + </data> </odoo> diff --git a/addons/l10n_pl/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_pl/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..fa56fd00dfa --- /dev/null +++ b/addons/l10n_pl/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/l10n_pl/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py b/addons/l10n_pl/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py new file mode 100644 index 00000000000..b587dd4a3b8 --- /dev/null +++ b/addons/l10n_pl/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_set_tags_and_taxes_updatable + migrate_set_tags_and_taxes_updatable(cr, registry, 'l10n_pl') diff --git a/addons/l10n_sg/__manifest__.py b/addons/l10n_sg/__manifest__.py index ce333a6685b..2df4ef0e928 100644 --- a/addons/l10n_sg/__manifest__.py +++ b/addons/l10n_sg/__manifest__.py @@ -6,6 +6,7 @@ { 'name': 'Singapore - Accounting', 'author': 'Tech Receptives', + 'version': '2.0', 'website': 'http://www.techreceptives.com', 'category': 'Localization', 'description': """ diff --git a/addons/l10n_sg/data/account_tax_data.xml b/addons/l10n_sg/data/account_tax_data.xml index 5e580a60e53..e37eef5c499 100644 --- a/addons/l10n_sg/data/account_tax_data.xml +++ b/addons/l10n_sg/data/account_tax_data.xml @@ -1,96 +1,194 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> - <data noupdate="1"> + <data> <!-- Account Tags --> - - <record id="tag_sg_sale_tax_es_0" model="account.account.tag"> - <field name="name">Sales Tax 0% ES33</field> + <record id="tag_sg_01" model="account.account.tag"> + <field name="name">Chart of Singapore</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_sale_tax_ds_7" model="account.account.tag"> - <field name="name">Sales Tax 7% DS</field> + <record id="tag_sg_02" model="account.account.tag"> + <field name="name">Tax Balance To Pay</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_sale_tax_esn_0" model="account.account.tag"> - <field name="name">Sales Tax 0% ESN33</field> + <record id="tag_sg_03" model="account.account.tag"> + <field name="name">Tax Received</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_sale_tax_os_0" model="account.account.tag"> - <field name="name">Sales Tax 0% OS</field> + <record id="tag_sg_04" model="account.account.tag"> + <field name="name">Tax Received @ 0%</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_sale_tax_zr_0" model="account.account.tag"> - <field name="name">Sales Tax 0% ZR</field> + <record id="tag_sg_05" model="account.account.tag"> + <field name="name">Tax Received @ 7% SR</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_sale_tax_sr_7" model="account.account.tag"> - <field name="name">Sales Tax 7% SR</field> + <record id="tag_sg_06" model="account.account.tag"> + <field name="name">Tax Received @ 7% DS</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_txn33_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% TX-N33</field> + <record id="tag_sg_07" model="account.account.tag"> + <field name="name">Tax Paid</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_txe33_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% TX-E33</field> + <record id="tag_sg_08" model="account.account.tag"> + <field name="name">Tax Paid @ 7% TX7</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_bl_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% BL</field> + <record id="tag_sg_09" model="account.account.tag"> + <field name="name">Tax Paid @ 7% TX-N33</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_im_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% IM</field> + <record id="tag_sg_10" model="account.account.tag"> + <field name="name">Tax Paid @ 7% TX-E33</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_txre_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% TX-RE</field> + <record id="tag_sg_11" model="account.account.tag"> + <field name="name">Tax Paid @ 7% BL</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_me_0" model="account.account.tag"> - <field name="name">Purchase Tax 0% ME</field> + <record id="tag_sg_12" model="account.account.tag"> + <field name="name">Tax Paid @ 7% IM</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_nr_0" model="account.account.tag"> - <field name="name">Purchase Tax 0% NR</field> + <record id="tag_sg_13" model="account.account.tag"> + <field name="name">Tax Paid @ 7% TX-RE</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_zp_0" model="account.account.tag"> - <field name="name">Purchase Tax 0% ZP</field> + <record id="tag_sg_14" model="account.account.tag"> + <field name="name">Tax Paid @ 0% ME</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_op_0" model="account.account.tag"> - <field name="name">Purchase Tax 0% OP</field> + <record id="tag_sg_15" model="account.account.tag"> + <field name="name">Tax Paid @ 0% NR</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_ep_0" model="account.account.tag"> - <field name="name">Purchase Tax 0% EP</field> + <record id="tag_sg_16" model="account.account.tag"> + <field name="name">Tax Paid @ 0% ZP</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_mes_0" model="account.account.tag"> - <field name="name">Purchase Tax MES</field> + <record id="tag_sg_17" model="account.account.tag"> + <field name="name">MES Purchase Tax</field> <field name="applicability">taxes</field> </record> - - <record id="tag_sg_purchase_tax_tx7_7" model="account.account.tag"> - <field name="name">Purchase Tax 7% TX7</field> + <record id="tag_sg_18" model="account.account.tag"> + <field name="name">Out of Scope Taxes</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_19" model="account.account.tag"> + <field name="name">Out of Scope Purchase Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_20" model="account.account.tag"> + <field name="name">Out of Scope Sales Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_21" model="account.account.tag"> + <field name="name">Exempted Taxes</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_22" model="account.account.tag"> + <field name="name">Exempted Purchase Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_23" model="account.account.tag"> + <field name="name">Exempted Sales Tax ES33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_24" model="account.account.tag"> + <field name="name">Exempted Sales Tax ESN33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_25" model="account.account.tag"> + <field name="name">Tax Bases</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_26" model="account.account.tag"> + <field name="name">Base of Taxed Sales</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_27" model="account.account.tag"> + <field name="name">Sales 7% Standard</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_28" model="account.account.tag"> + <field name="name">Sales 7% Standard SR</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_29" model="account.account.tag"> + <field name="name">Sales 7% Standard DS</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_30" model="account.account.tag"> + <field name="name">Sales 0% Standard</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_31" model="account.account.tag"> + <field name="name">Sales Exempted</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_32" model="account.account.tag"> + <field name="name">Sales Exempted ES33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_33" model="account.account.tag"> + <field name="name">Sales Exempted ESN33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_34" model="account.account.tag"> + <field name="name">Base of Taxed Purchases</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_35" model="account.account.tag"> + <field name="name">Purchase 7% Standard TX7</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_36" model="account.account.tag"> + <field name="name">Purchase 7% Standard TX-N33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_37" model="account.account.tag"> + <field name="name">Purchase 7% Standard TX-E33</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_38" model="account.account.tag"> + <field name="name">Purchase 7% Standard BL</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_39" model="account.account.tag"> + <field name="name">Purchase 7% Standard IM</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_40" model="account.account.tag"> + <field name="name">Purchase 7% Standard TX-RE</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_41" model="account.account.tag"> + <field name="name">Purchase 0% Standard ME</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_42" model="account.account.tag"> + <field name="name">Purchase 0% Standard NR</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_43" model="account.account.tag"> + <field name="name">Purchase 0% Standard ZP</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_44" model="account.account.tag"> + <field name="name">Purchase Imports Under MES</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_45" model="account.account.tag"> + <field name="name">Purchase Exempted</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_46" model="account.account.tag"> + <field name="name">Purchase Out Of Scope</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_sg_47" model="account.account.tag"> + <field name="name">Sales Out Of Scope</field> <field name="applicability">taxes</field> </record> @@ -106,7 +204,7 @@ <field name="account_id" ref="account_account_791"/> <field name="refund_account_id" ref="account_account_791"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_es_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_23'),ref('tag_sg_32')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -120,7 +218,7 @@ <field name="account_id" ref="account_account_792"/> <field name="refund_account_id" ref="account_account_792"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_ds_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_06'), ref('tag_sg_29')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -134,7 +232,7 @@ <field name="account_id" ref="account_account_793"/> <field name="refund_account_id" ref="account_account_793"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_esn_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_24'),ref('tag_sg_33')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -148,7 +246,7 @@ <field name="account_id" ref="account_account_794"/> <field name="refund_account_id" ref="account_account_794"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_os_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_20'),ref('tag_sg_47')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -162,7 +260,7 @@ <field name="account_id" ref="account_account_795"/> <field name="refund_account_id" ref="account_account_795"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_zr_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_04'), ref('tag_sg_30')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -176,7 +274,7 @@ <field name="account_id" ref="account_account_796"/> <field name="refund_account_id" ref="account_account_796"/> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_sale_tax_sr_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_05'),ref('tag_sg_28')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -192,7 +290,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_txn33_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_09'), ref('tag_sg_36')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -206,7 +304,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_txe33_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_10'),ref('tag_sg_37')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -220,7 +318,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_bl_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_11'),ref('tag_sg_38')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -234,7 +332,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_im_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_12'),ref('tag_sg_39')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -248,7 +346,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_txre_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_13'),ref('tag_sg_40')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> @@ -262,7 +360,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_me_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_14'),ref('tag_sg_41')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -276,7 +374,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_nr_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_15'),ref('tag_sg_42')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -290,7 +388,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_zp_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_16'),ref('tag_sg_43')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -304,7 +402,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_op_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_19'),ref('tag_sg_46')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -318,7 +416,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_ep_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_22'),ref('tag_sg_45')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -332,7 +430,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_mes_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_17'),ref('tag_sg_44')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -346,7 +444,7 @@ <field name="amount_type">percent</field> <field name="type_tax_use">purchase</field> <field name="chart_template_id" ref="sg_chart_template"/> - <field name="tag_ids" eval="[(6,0,[ref('tag_sg_purchase_tax_tx7_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_sg_08'),ref('tag_sg_35')])]"/> <field name="tax_group_id" ref="tax_group_7"/> </record> diff --git a/addons/l10n_sg/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_sg/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..fa56fd00dfa --- /dev/null +++ b/addons/l10n_sg/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/l10n_sg/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py b/addons/l10n_sg/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py new file mode 100644 index 00000000000..8d963dbac16 --- /dev/null +++ b/addons/l10n_sg/migrations/9.0.2.0/pre-set_tags_and_taxes_updatable.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_set_tags_and_taxes_updatable + migrate_set_tags_and_taxes_updatable(cr, registry, 'l10n_sg') diff --git a/addons/l10n_th/__manifest__.py b/addons/l10n_th/__manifest__.py index 3deeb87d45f..548cc9dd626 100644 --- a/addons/l10n_th/__manifest__.py +++ b/addons/l10n_th/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Thailand - Accounting', - 'version': '1.0', + 'version': '2.0', 'category': 'Localization', 'description': """ Chart of Accounts for Thailand. diff --git a/addons/l10n_th/data/l10n_th_chart_data.xml b/addons/l10n_th/data/l10n_th_chart_data.xml index c1c89091ced..906ae7104ab 100644 --- a/addons/l10n_th/data/l10n_th_chart_data.xml +++ b/addons/l10n_th/data/l10n_th_chart_data.xml @@ -242,75 +242,94 @@ <!-- Account Tax Tags --> -<record id="tag_input_vat_7" model="account.account.tag"> - <field name="name">Input VAT 7%</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_output_7" model="account.account.tag"> - <field name="name">Output VAT 7%</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_comp_tax_trans_1" model="account.account.tag"> - <field name="name">Company Tax 1% (Transportation)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_comp_tax_advt_2" model="account.account.tag"> - <field name="name">Company Tax 2% (Advertising)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_comp_tax_serv_3" model="account.account.tag"> - <field name="name">Company Tax 3% (Service)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_comp_tax_rent_5" model="account.account.tag"> - <field name="name">Company Tax 5% (Rental)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_pers_tax_trans_1" model="account.account.tag"> - <field name="name">Personal Tax 1% (Transportation)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_pers_tax_advt_2" model="account.account.tag"> - <field name="name">Personal Tax 2% (Advertising)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_pers_tax_serv_3" model="account.account.tag"> - <field name="name">Personal Tax 3% (Service)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_pers_tax_rent_5" model="account.account.tag"> - <field name="name">Personal Tax 5% (Rental)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_income_tax_trans_1" model="account.account.tag"> - <field name="name">Income Tax 1% (Transportation)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_income_tax_advt_2" model="account.account.tag"> - <field name="name">Income Tax 2% (Advertising)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_income_tax_serv_3" model="account.account.tag"> - <field name="name">Income Tax 3% (Service)</field> - <field name="applicability">taxes</field> -</record> - -<record id="tag_income_tax_rent_5" model="account.account.tag"> - <field name="name">Income Tax 5% (Rental)</field> - <field name="applicability">taxes</field> -</record> + <record id="tag_th_01" model="account.account.tag"> + <field name="name">Taxes to be paid</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_02" model="account.account.tag"> + <field name="name">Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_03" model="account.account.tag"> + <field name="name">Personal Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_04" model="account.account.tag"> + <field name="name">Personal Withholding Tax (Service)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_05" model="account.account.tag"> + <field name="name">Personal Withholding Tax (Other)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_06" model="account.account.tag"> + <field name="name">Company Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_07" model="account.account.tag"> + <field name="name">Company Withholding Tax (Service)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_08" model="account.account.tag"> + <field name="name">Company Withholding Tax (Other)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_09" model="account.account.tag"> + <field name="name">Value Added Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_10" model="account.account.tag"> + <field name="name">Output VAT</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_11" model="account.account.tag"> + <field name="name">Input VAT</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_12" model="account.account.tag"> + <field name="name">Taxable amounts</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_13" model="account.account.tag"> + <field name="name">Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_14" model="account.account.tag"> + <field name="name">Personal Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_15" model="account.account.tag"> + <field name="name">Personal Withholding Tax (Service)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_16" model="account.account.tag"> + <field name="name">Personal Withholding Tax (Other)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_17" model="account.account.tag"> + <field name="name">Company Withholding Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_18" model="account.account.tag"> + <field name="name">Company Withholding Tax (Service)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_19" model="account.account.tag"> + <field name="name">Company Withholding Tax (Other)</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_20" model="account.account.tag"> + <field name="name">Value Added Tax</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_21" model="account.account.tag"> + <field name="name">Output VAT</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_th_22" model="account.account.tag"> + <field name="name">Input VAT</field> + <field name="applicability">taxes</field> + </record> <!-- TAXES --> @@ -322,7 +341,7 @@ <field name="account_id" ref="a_input_vat"/> <field name="refund_account_id" ref="a_input_vat"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_input_vat_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_22'), ref('tag_th_11')])]"/> <field name="tax_group_id" ref="tax_group_vat_7"/> </record> @@ -334,7 +353,7 @@ <field name="account_id" ref="a_output_vat"/> <field name="refund_account_id" ref="a_output_vat"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_output_7')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_21'), ref('tag_th_10')])]"/> <field name="tax_group_id" ref="tax_group_vat_7"/> </record> @@ -346,7 +365,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_comp_tax_trans_1')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_19'),ref('tag_th_08')])]"/> <field name="tax_group_id" ref="tax_group_1"/> </record> @@ -358,7 +377,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_comp_tax_advt_2')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_19'),ref('tag_th_08')])]"/> <field name="tax_group_id" ref="tax_group_2"/> </record> @@ -370,7 +389,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_comp_tax_serv_3')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_18'),ref('tag_th_07')])]"/> <field name="tax_group_id" ref="tax_group_3"/> </record> @@ -382,7 +401,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_comp_tax_rent_5')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_19'),ref('tag_th_08')])]"/> <field name="tax_group_id" ref="tax_group_5"/> </record> @@ -394,7 +413,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_pers_tax_trans_1')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_05'),ref('tag_th_19')])]"/> <field name="tax_group_id" ref="tax_group_1"/> </record> @@ -406,7 +425,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_pers_tax_advt_2')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_05'),ref('tag_th_19')])]"/> <field name="tax_group_id" ref="tax_group_2"/> </record> @@ -418,7 +437,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_pers_tax_serv_3')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_15'),ref('tag_th_04')])]"/> <field name="tax_group_id" ref="tax_group_3"/> </record> @@ -430,7 +449,7 @@ <field name="account_id" ref="a_wht"/> <field name="refund_account_id" ref="a_wht"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_pers_tax_rent_5')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_th_05'),ref('tag_th_19')])]"/> <field name="tax_group_id" ref="tax_group_5"/> </record> @@ -442,7 +461,6 @@ <field name="account_id" ref="a_wht_income"/> <field name="refund_account_id" ref="a_wht_income"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_income_tax_trans_1')])]"/> <field name="tax_group_id" ref="tax_group_1"/> </record> @@ -454,7 +472,6 @@ <field name="account_id" ref="a_wht_income"/> <field name="refund_account_id" ref="a_wht_income"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_income_tax_advt_2')])]"/> <field name="tax_group_id" ref="tax_group_2"/> </record> @@ -466,7 +483,6 @@ <field name="account_id" ref="a_wht_income"/> <field name="refund_account_id" ref="a_wht_income"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_income_tax_serv_3')])]"/> <field name="tax_group_id" ref="tax_group_3"/> </record> @@ -478,7 +494,6 @@ <field name="account_id" ref="a_wht_income"/> <field name="refund_account_id" ref="a_wht_income"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tag_income_tax_rent_5')])]"/> <field name="tax_group_id" ref="tax_group_5"/> </record> </odoo> diff --git a/addons/l10n_th/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_th/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..fa56fd00dfa --- /dev/null +++ b/addons/l10n_th/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/l10n_vn/__manifest__.py b/addons/l10n_vn/__manifest__.py index edd6dba29d4..c945d4726fa 100644 --- a/addons/l10n_vn/__manifest__.py +++ b/addons/l10n_vn/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Vietnam - Accounting", - "version": "1.0", + "version": "2.0", "author": "General Solutions", 'website': 'http://gscom.vn', 'category': 'Localization', diff --git a/addons/l10n_vn/data/account_tax_data.xml b/addons/l10n_vn/data/account_tax_data.xml index 5465c271d15..0ac0602a008 100644 --- a/addons/l10n_vn/data/account_tax_data.xml +++ b/addons/l10n_vn/data/account_tax_data.xml @@ -1,28 +1,76 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> <!-- Tax Definitions --> - <record id="tax_tag_purchase_10" model="account.account.tag"> - <field name="name">Thuế GTGT được khấu trừ 10%</field> + <record id="tag_vn_01" model="account.account.tag"> + <field name="name">HHDV mua và o</field> <field name="applicability">taxes</field> </record> - <record id="tax_tag_purchase_5" model="account.account.tag"> - <field name="name">Thuế GTGT được khấu trừ 5%</field> + <record id="tag_vn_02" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV mua và o</field> <field name="applicability">taxes</field> </record> - <record id="tax_tag_purchase_0" model="account.account.tag"> - <field name="name">Thuế GTGT được khấu trừ 0%</field> + <record id="tag_vn_03" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV mua và o chịu thuế 0%</field> <field name="applicability">taxes</field> </record> - <record id="tax_tag_sale_10" model="account.account.tag"> - <field name="name">Thuế GTGT phải nộp 10%</field> + <record id="tag_vn_04" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV mua và o chịu thuế 5%</field> <field name="applicability">taxes</field> </record> - <record id="tax_tag_sale_5" model="account.account.tag"> - <field name="name">Thuế GTGT phải nộp 5%</field> + <record id="tag_vn_05" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV mua và o chịu thuế 10%</field> <field name="applicability">taxes</field> </record> - <record id="tax_tag_sale_0" model="account.account.tag"> - <field name="name">Thuế GTGT phải nộp 0%</field> + <record id="tag_vn_06" model="account.account.tag"> + <field name="name">Giá trị HHDV mua và o</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_07" model="account.account.tag"> + <field name="name">Giá trị HHDV mua và o chịu thuế 0%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_08" model="account.account.tag"> + <field name="name">Giá trị HHDV mua và o chịu thuế 5%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_09" model="account.account.tag"> + <field name="name">Giá trị HHDV mua và o chịu thuế 10%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_10" model="account.account.tag"> + <field name="name">HHDV bán ra</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_11" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV bán ra</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_12" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV bán ra chịu thuế 0%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_13" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV bán ra chịu thuế 5%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_14" model="account.account.tag"> + <field name="name">Thuế GTGT HHDV bán ra chịu thuế 10%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_15" model="account.account.tag"> + <field name="name">Giá trị HHDV bán ra</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_16" model="account.account.tag"> + <field name="name">Giá trị HHDV bán ra chịu thuế 0%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_17" model="account.account.tag"> + <field name="name">Giá trị HHDV bán ra chịu thuế 5%</field> + <field name="applicability">taxes</field> + </record> + <record id="tag_vn_18" model="account.account.tag"> + <field name="name">Giá trị HHDV bán ra chịu thuế 10%</field> <field name="applicability">taxes</field> </record> @@ -36,7 +84,7 @@ <field name="account_id" ref="chart1331"/> <field name="refund_account_id" ref="chart1331"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_purchase_10')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_09'),ref('tag_vn_05')])]"/> <field name="tax_group_id" ref="tax_group_10"/> </record> <record id="tax_purchase_vat5" model="account.tax.template"> @@ -48,7 +96,7 @@ <field name="account_id" ref="chart1331"/> <field name="refund_account_id" ref="chart1331"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_purchase_5')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_08'),ref('tag_vn_04')])]"/> <field name="tax_group_id" ref="tax_group_5"/> </record> <record id="tax_purchase_vat0" model="account.tax.template"> @@ -60,7 +108,7 @@ <field name="account_id" ref="chart1331"/> <field name="refund_account_id" ref="chart1331"/> <field name="type_tax_use">purchase</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_purchase_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_07')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> @@ -74,7 +122,7 @@ <field name="account_id" ref="chart33311"/> <field name="refund_account_id" ref="chart33311"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_sale_10')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_18'),ref('tag_vn_14')])]"/> <field name="tax_group_id" ref="tax_group_10"/> </record> <record id="tax_sale_vat5" model="account.tax.template"> @@ -86,7 +134,7 @@ <field name="account_id" ref="chart33311"/> <field name="refund_account_id" ref="chart33311"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_sale_5')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_17'),ref('tag_vn_13')])]"/> <field name="tax_group_id" ref="tax_group_5"/> </record> <record id="tax_sale_vat0" model="account.tax.template"> @@ -98,7 +146,7 @@ <field name="account_id" ref="chart33311"/> <field name="refund_account_id" ref="chart33311"/> <field name="type_tax_use">sale</field> - <field name="tag_ids" eval="[(6,0,[ref('tax_tag_sale_0')])]"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_vn_16')])]"/> <field name="tax_group_id" ref="tax_group_0"/> </record> </odoo> diff --git a/addons/l10n_vn/migrations/9.0.2.0/post-migrate_tags_on_taxes.py b/addons/l10n_vn/migrations/9.0.2.0/post-migrate_tags_on_taxes.py new file mode 100644 index 00000000000..fa56fd00dfa --- /dev/null +++ b/addons/l10n_vn/migrations/9.0.2.0/post-migrate_tags_on_taxes.py @@ -0,0 +1,6 @@ +from openerp.modules.registry import RegistryManager + +def migrate(cr, version): + registry = RegistryManager.get(cr.dbname) + from openerp.addons.account.models.chart_template import migrate_tags_on_taxes + migrate_tags_on_taxes(cr, registry) diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index c799cf6a70a..f5a85948762 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -288,7 +288,10 @@ var Chatter = Widget.extend(chat_mixin, { if (this.fields.thread && event.data.thread) { fieldNames.push(this.fields.thread.name); } - this.trigger_up('reload', {fieldNames: fieldNames}); + this.trigger_up('reload', { + fieldNames: fieldNames, + keepChanges: true, + }); }, _onScheduleActivity: function () { this.fields.activity.scheduleActivity(false); diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index f268851463d..b5d7feab56e 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -13,7 +13,6 @@ var BasicComposer = Composers.BasicComposer; var createAsyncView = testUtils.createAsyncView; var createView = testUtils.createView; -var createAsyncView = testUtils.createAsyncView; QUnit.module('mail', {}, function () { @@ -496,7 +495,7 @@ QUnit.test('chatter: post, receive and star messages', function (assert) { }); QUnit.test('form activity widget: schedule next activity', function (assert) { - assert.expect(4); + assert.expect(5); this.data.partner.records[0].activity_ids = [1]; this.data.partner.records[0].activity_state = 'today'; this.data['mail.activity'].records = [{ @@ -508,6 +507,7 @@ QUnit.test('form activity widget: schedule next activity', function (assert) { activity_type_id: 2, }]; + var checkReadArgs = false; var form = createView({ View: FormView, model: 'partner', @@ -529,6 +529,10 @@ QUnit.test('form activity widget: schedule next activity', function (assert) { "the feedback should be sent correctly"); return $.when(); } + if (args.method === 'read' && checkReadArgs) { + assert.deepEqual(args.args[1], ['activity_ids', 'message_ids', 'display_name'], + "should only read the mail fields"); + } return this._super.apply(this, arguments); }, intercepts: { @@ -555,6 +559,8 @@ QUnit.test('form activity widget: schedule next activity', function (assert) { view_type: "form", views: [[false, "form"]], }, "should do a do_action with correct parameters"); + checkReadArgs = true; // should re-read the activities when closing the dialog + event.data.options.on_close(); }, }, }); @@ -567,6 +573,55 @@ QUnit.test('form activity widget: schedule next activity', function (assert) { form.destroy(); }); +QUnit.test('form activity widget: schedule activity does not discard changes', function (assert) { + assert.expect(1); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<field name="foo"/>' + + '</sheet>' + + '<div class="oe_chatter">' + + '<field name="activity_ids" widget="mail_activity"/>' + + '</div>' + + '</form>', + res_id: 2, + mockRPC: function (route, args) { + if (args.method === 'write') { + assert.deepEqual(args.args[1], {foo: 'new value'}, + "should correctly save the change"); + } + return this._super.apply(this, arguments); + }, + intercepts: { + get_bus: function (event) { + event.stopPropagation(); + event.data.callback(new Bus()); + }, + do_action: function (event) { + event.data.options.on_close(); + }, + }, + viewOptions: { + mode: 'edit', + }, + }); + + // update value of foo field + form.$('.o_field_widget[name=foo]').val('new value').trigger('input'); + + // schedule an activity (this triggers a do_action) + form.$('.o_chatter_button_schedule_activity').click(); + + // save the record + form.$buttons.find('.o_form_button_save').click(); + + form.destroy(); +}); + QUnit.test('form activity widget: mark as done and remove', function (assert) { assert.expect(14); @@ -631,11 +686,11 @@ QUnit.test('form activity widget: mark as done and remove', function (assert) { if (nbReads === 1) { // first read assert.strictEqual(args.args[1].length, 4, 'should read all fiels the first time'); } else if (nbReads === 2) { // second read: after the unlink - assert.ok(_.isEqual(args.args[1], ['activity_ids']), - 'should only read the activities after an unlink'); + assert.ok(_.isEqual(args.args[1], ['activity_ids', 'display_name']), + 'should only read the activities (+ display_name) after an unlink'); } else { // third read: after marking an activity done - assert.ok(_.isEqual(args.args[1], ['activity_ids', 'message_ids']), - 'should read the activities and messages after marking an activity done'); + assert.ok(_.isEqual(args.args[1], ['activity_ids', 'message_ids', 'display_name']), + 'should read the activities and messages (+ display_name) after marking an activity done'); } } return this._super.apply(this, arguments); @@ -754,8 +809,8 @@ QUnit.test('followers widget: follow/unfollow, edit subtypes', function (assert) assert.strictEqual(args.args[1].length, 3, 'should read "foo", "message_follower_ids" and "display_name"'); } else { // three next reads: only read 'message_follower_ids' field - assert.ok(_.isEqual(args.args[1], ['message_follower_ids']), - 'should only read "message_follower_ids"'); + assert.deepEqual(args.args[1], ['message_follower_ids', 'display_name'], + 'should only read "message_follower_ids" and "display_name"'); } } return this._super.apply(this, arguments); diff --git a/addons/mrp/views/stock_move_views.xml b/addons/mrp/views/stock_move_views.xml index 6dc5a9729d1..c9e7dc51941 100644 --- a/addons/mrp/views/stock_move_views.xml +++ b/addons/mrp/views/stock_move_views.xml @@ -28,9 +28,11 @@ <field name="workorder_id" invisible="1"/> <field name="location_id" invisible="1"/> <field name="location_dest_id" invisible="1"/> + <field name="production_id" invisible="1"/> + <field name="raw_material_production_id" invisible="1"/> </group> </group> - <field name="active_move_line_ids" attrs="{'readonly': [('is_done', '=', True)]}" context="{'default_workorder_id': workorder_id, 'default_product_uom_id': product_uom, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}"> + <field name="active_move_line_ids" attrs="{'readonly': [('is_done', '=', True)]}" context="{'default_workorder_id': workorder_id, 'default_product_uom_id': product_uom, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id, 'default_production_id': production_id or raw_material_production_id}"> <tree editable="bottom" decoration-success="product_qty==qty_done" decoration-danger="(product_qty > 0) and (qty_done>product_qty)"> <field name="lot_id" domain="[('product_id', '=', parent.product_id)]" context="{'default_product_id': parent.product_id}"/> <field name="product_qty" invisible="not context.get('show_reserved') or context.get('serial') or context.get('state_done')" readonly="1"/> @@ -41,6 +43,7 @@ <field name="location_id" invisible="1"/> <field name="location_dest_id" invisible="1"/> <field name="done_wo" invisible="1"/> + <field name="production_id" invisible="1" /> </tree> </field> <footer class="oe_edit_only"> diff --git a/addons/mrp/wizard/change_production_qty.py b/addons/mrp/wizard/change_production_qty.py index b408bef5f8b..cd3cf5a5864 100644 --- a/addons/mrp/wizard/change_production_qty.py +++ b/addons/mrp/wizard/change_production_qty.py @@ -55,7 +55,6 @@ class ChangeProductionQty(models.TransientModel): operation_bom_qty[operation.id] = bom_data['qty'] self._update_product_to_produce(production, production.product_qty - qty_produced) moves = production.move_raw_ids.filtered(lambda x: x.state not in ('done', 'cancel')) - moves.do_unreserve() moves.action_assign() for wo in production.workorder_ids: operation = wo.operation_id diff --git a/addons/mrp/wizard/mrp_product_produce.py b/addons/mrp/wizard/mrp_product_produce.py index b887ac2a62d..8b08771e6e6 100644 --- a/addons/mrp/wizard/mrp_product_produce.py +++ b/addons/mrp/wizard/mrp_product_produce.py @@ -78,22 +78,22 @@ class MrpProductProduce(models.TransientModel): @api.multi def do_produce(self): # Nothing to do for lots since values are created using default data (stock.move.lots) - moves = self.production_id.move_raw_ids quantity = self.product_qty if float_compare(quantity, 0, precision_rounding=self.product_uom_id.rounding) <= 0: raise UserError(_('You should at least produce some quantity')) - for move in moves.filtered(lambda x: x.product_id.tracking == 'none' and x.quantity_done == 0 and x.state not in ('done', 'cancel')): - if move.unit_factor: + for move in self.production_id.move_raw_ids: + # TODO currently not possible to guess if the user updated quantity by hand or automatically by the produce wizard. + if move.product_id.tracking == 'none' and move.quantity_done < move.product_uom_qty and move.state not in ('done', 'cancel') and move.unit_factor: rounding = move.product_uom.rounding move.quantity_done += float_round(quantity * move.unit_factor, precision_rounding=rounding) - moves = self.production_id.move_finished_ids.filtered(lambda x: x.product_id.tracking == 'none' and x.state not in ('done', 'cancel')) - for move in moves: - rounding = move.product_uom.rounding - if move.product_id.id == self.production_id.product_id.id: - move.quantity_done += float_round(quantity, precision_rounding=rounding) - elif move.unit_factor: - # byproducts handling - move.quantity_done += float_round(quantity * move.unit_factor, precision_rounding=rounding) + for move in self.production_id.move_finished_ids: + if move.product_id.tracking == 'none' and move.state not in ('done', 'cancel'): + rounding = move.product_uom.rounding + if move.product_id.id == self.production_id.product_id.id: + move.quantity_done += float_round(quantity, precision_rounding=rounding) + elif move.unit_factor: + # byproducts handling + move.quantity_done += float_round(quantity * move.unit_factor, precision_rounding=rounding) self.check_finished_move_lots() if self.production_id.state == 'confirmed': self.production_id.write({ diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index a0097b7ccd3..92cec857a6b 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -916,7 +916,7 @@ class PosOrderLine(models.Model): self._onchange_qty() self.tax_ids = self.product_id.taxes_id.filtered(lambda r: not self.company_id or r.company_id == self.company_id) fpos = self.order_id.fiscal_position_id - tax_ids_after_fiscal_position = fpos.map_tax(self.tax_ids, line.product_id, line.order_id.partner_id) if fpos else self.tax_ids + tax_ids_after_fiscal_position = fpos.map_tax(self.tax_ids, self.product_id, self.order_id.partner_id) if fpos else self.tax_ids self.price_unit = self.env['account.tax']._fix_tax_included_price(price, self.product_id.taxes_id, tax_ids_after_fiscal_position) @api.onchange('qty', 'discount', 'price_unit', 'tax_ids') diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 46c67fb1614..77f0189321b 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -1674,6 +1674,9 @@ exports.Orderline = Backbone.Model.extend({ if (!no_map_tax){ tax = self._map_tax_fiscal_position(tax); } + if (!tax){ + return; + } if (tax.amount_type === 'group'){ var ret = self.compute_all(tax.children_tax_ids, price_unit, quantity, currency_rounding); total_excluded = ret.total_excluded; diff --git a/addons/procurement/models/procurement.py b/addons/procurement/models/procurement.py index e0dc2e97889..840fb86f94b 100644 --- a/addons/procurement/models/procurement.py +++ b/addons/procurement/models/procurement.py @@ -21,7 +21,7 @@ class ProcurementGroup(models.Model): having the moves grouped into pickings that represent the sales order. Used in: sales order (to group delivery order lines like the so), pull/push - rules (to pack like the delivery order), on orderpoints (e.g. for wave picking + rules (to pack like the delivery order), on orderpoints (e.g. for batch picking all the similar products together). Grouping is made only if the source and the destination is the same. diff --git a/addons/product/models/product.py b/addons/product/models/product.py index 8437bf16d74..c0c117f990c 100644 --- a/addons/product/models/product.py +++ b/addons/product/models/product.py @@ -127,8 +127,9 @@ class ProductProduct(models.Model): 'Cost', company_dependent=True, digits=dp.get_precision('Product Price'), groups="base.group_user", - help="Cost used for standard stock valuation in accounting and used as a base price on purchase orders. " - "Expressed in the default unit of measure of the product.") + help = "Cost used for stock valuation in standard price and as a first price to set in average/fifo. " + "Also used as a base price for pricelists. " + "Expressed in the default unit of measure of the product.") volume = fields.Float('Volume', help="The volume in m3.") weight = fields.Float( 'Weight', digits=dp.get_precision('Stock Weight'), diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py index 38fb9d4d1e1..4a364682920 100644 --- a/addons/product/models/product_template.py +++ b/addons/product/models/product_template.py @@ -78,7 +78,9 @@ class ProductTemplate(models.Model): 'Cost', compute='_compute_standard_price', inverse='_set_standard_price', search='_search_standard_price', digits=dp.get_precision('Product Price'), groups="base.group_user", - help="The cost price is used to valuate your inventory.") + help = "Cost used for stock valuation in standard price and as a first price to set in average/fifo. " + "Also used as a base price for pricelists. " + "Expressed in the default unit of measure of the product. ") volume = fields.Float( 'Volume', compute='_compute_volume', inverse='_set_volume', diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml index d3180ec4cef..ce3ed28c1cf 100644 --- a/addons/project/views/project_views.xml +++ b/addons/project/views/project_views.xml @@ -321,9 +321,8 @@ <record id="ir_actions_server_project_sample" model="ir.actions.server"> <field name="name">Project: Activate Sample Project</field> <field name="model_id" ref="project.model_project_project"/> - <field name="code"> -action = model.activate_sample_project() - </field> + <field name="state">code</field> + <field name="code">action = model.activate_sample_project()</field> </record> <record id="open_view_project_all" model="ir.actions.act_window"> diff --git a/addons/purchase/models/account_invoice.py b/addons/purchase/models/account_invoice.py index 350e8ad8684..953f4557753 100644 --- a/addons/purchase/models/account_invoice.py +++ b/addons/purchase/models/account_invoice.py @@ -51,7 +51,7 @@ class AccountInvoice(models.Model): 'uom_id': line.product_uom.id, 'product_id': line.product_id.id, 'account_id': invoice_line.with_context({'journal_id': self.journal_id.id, 'type': 'in_invoice'})._default_account(), - 'price_unit': line.order_id.currency_id.compute(line.price_unit, self.currency_id, round=False), + 'price_unit': line.order_id.currency_id.with_context(date=self.date_invoice).compute(line.price_unit, self.currency_id, round=False), 'quantity': qty, 'discount': 0.0, 'account_analytic_id': line.account_analytic_id.id, @@ -84,11 +84,11 @@ class AccountInvoice(models.Model): self.purchase_id = False return {} - @api.onchange('currency_id') + @api.onchange('currency_id', 'date_invoice') def _onchange_currency_id(self): if self.currency_id: for line in self.invoice_line_ids.filtered(lambda r: r.purchase_line_id): - line.price_unit = line.purchase_id.currency_id.compute(line.purchase_line_id.price_unit, self.currency_id, round=False) + line.price_unit = line.purchase_id.currency_id.with_context(date=self.date_invoice).compute(line.purchase_line_id.price_unit, self.currency_id, round=False) @api.onchange('invoice_line_ids') def _onchange_origin(self): diff --git a/addons/purchase/test/average_price.yml b/addons/purchase/test/average_price.yml index fdcbc9f3b9f..c4871884087 100644 --- a/addons/purchase/test/average_price.yml +++ b/addons/purchase/test/average_price.yml @@ -47,7 +47,7 @@ - !python {model: product.product, id: product_average_icecream}: | assert self.qty_available == 10.0, 'Wrong quantity in stock after first reception' - assert self.average_price == 60.0, 'Standard price should be the price of the first reception!' + assert self.standard_price == 60.0, 'Standard price should be the price of the first reception!' - I create a draft Purchase Order for second incoming shipment for 30 pieces at 80€ - @@ -75,7 +75,7 @@ Check the standard price - !python {model: product.product, id: product_average_icecream}: | - assert self.average_price == 75.0, 'After second reception, we should have an average price of 75.0 on the product' + assert self.standard_price == 75.0, 'After second reception, we should have an average price of 75.0 on the product' - Create picking to send some goods - @@ -101,7 +101,7 @@ Check the standard price (60 * 10 + 30 * 80) / 40 = 75.0 did not change - !python {model: product.product, id: product_average_icecream}: | - assert self.average_price == 75.0, 'Average price should not have changed with outgoing picking!' + assert self.standard_price == 75.0, 'Average price should not have changed with outgoing picking!' assert self.qty_available == 20.0, 'Pieces were not picked correctly as the quantity on hand is wrong' - Make a new purchase order with 500 g Average Ice Cream at a price of 0.2€/g @@ -131,4 +131,4 @@ - !python {model: product.product, id: product_average_icecream}: | assert self.qty_available == 20.5, 'Reception of purchase order in grams leads to wrong quantity in stock' - assert round(self.average_price, 2) == 78.05, 'Standard price as average price of third reception with other UoM incorrect! Got %s instead of 78.05' % (round(self.standard_price, 2),) + assert round(self.standard_price, 2) == 78.05, 'Standard price as average price of third reception with other UoM incorrect! Got %s instead of 78.05' % (round(self.standard_price, 2),) diff --git a/addons/purchase/test/fifo_price.yml b/addons/purchase/test/fifo_price.yml index a8ad4e24240..cbbe151e040 100644 --- a/addons/purchase/test/fifo_price.yml +++ b/addons/purchase/test/fifo_price.yml @@ -341,10 +341,7 @@ !python {model: purchase.order, id: purchase_order_fifo_neg}: | picking = self.picking_ids[0] self.env['stock.immediate.transfer'].create({'pick_id': picking.id}).process() - original_out_move = self.env['stock.picking'].browse(ref('outgoing_fifo_shipment_neg')).move_lines[0] - assert original_out_move.remaining_qty == 50.0, 'On the out move of 100, 50 still needs to be matched' - assert original_out_move.value == 2500, 'Value of the move should be 2500' -- +- Receive purchase order with 600 kg FIFO Ice Cream at 80 euro/kg - !record {model: purchase.order, id: purchase_order_fifo_neg2}: @@ -368,6 +365,9 @@ picking = self.picking_ids[0] self.env['stock.immediate.transfer'].create({'pick_id': picking.id}).process() original_out_move = self.env['stock.picking'].browse(ref('outgoing_fifo_shipment_neg')).move_lines[0] - assert original_out_move.value == 6500.0, 'First original out move should have 6500 as value' + outgoing_shipment_fifo_icecream_neg2 = self.env['stock.picking'].browse(ref('outgoing_fifo_shipment_neg2')).move_lines[0] + original_out_move._fifo_vacuum() + outgoing_shipment_fifo_icecream_neg2._fifo_vacuum() + assert original_out_move.value == -6500.0, 'First original out move should have -6500 as value' assert original_out_move.product_id.stock_value == 12000.0, 'Stock Value should be 12000' assert original_out_move.product_id.qty_available == 150.0, 'Qty available should be 150'
\ No newline at end of file diff --git a/addons/sale_timesheet/models/account.py b/addons/sale_timesheet/models/account.py index eec7637be31..07c70419b89 100644 --- a/addons/sale_timesheet/models/account.py +++ b/addons/sale_timesheet/models/account.py @@ -26,10 +26,10 @@ class AccountAnalyticLine(models.Model): @api.multi def write(self, values): - # prevent to update invoiced timesheets - #if self.filtered(lambda timesheet: timesheet.timesheet_invoice_id): - # if any([field_name in values for field_name in ['unit_amount', 'employee_id', 'task_id', 'timesheet_revenue', 'so_line', 'amount', 'date']]): - # raise UserError(_('You can not modify already invoiced timesheets.')) + # prevent to update invoiced timesheets if product_id is not of type order + if self.so_line.product_id.invoice_policy != "order" and self.filtered(lambda timesheet: timesheet.timesheet_invoice_id): + if any([field_name in values for field_name in ['unit_amount', 'employee_id', 'task_id', 'timesheet_revenue', 'so_line', 'amount', 'date']]): + raise UserError(_('You can not modify already invoiced timesheets.')) so_lines = self.mapped('so_line') if values.get('task_id'): @@ -134,7 +134,7 @@ class AccountAnalyticLine(models.Model): total_revenue_invoiced = sum(analytic_lines.mapped('timesheet_revenue')) # compute (new) revenue of current timesheet line revenue = min( - analytic_account.currency_id.round(unit_amount * so_line.currency_id.compute(so_line.price_unit, analytic_account.currency_id) * (1-so_line.discount)), + analytic_account.currency_id.round(unit_amount * so_line.currency_id.compute(so_line.price_unit, analytic_account.currency_id) * (1-(so_line.discount/100))), total_revenue_so - total_revenue_invoiced ) billable_type = 'billable_fixed' diff --git a/addons/sale_timesheet/tests/test_timesheet_revenue.py b/addons/sale_timesheet/tests/test_timesheet_revenue.py index 9c5ceb79bac..dccc52d7396 100644 --- a/addons/sale_timesheet/tests/test_timesheet_revenue.py +++ b/addons/sale_timesheet/tests/test_timesheet_revenue.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.sale.tests.test_sale_common import TestSale +from odoo.exceptions import UserError from odoo.tools import float_compare, float_repr @@ -187,6 +188,16 @@ class TestSaleTimesheet(TestSale): self.assertEquals(timesheet2.timesheet_invoice_id, invoice) self.assertEquals(timesheet3.timesheet_invoice_id, invoice) + # check that analytic line for product 'ordered' can be altered + with self.assertRaises(UserError): + timesheet1.write(dict(unit_amount=10)) + self.assertNotEquals(timesheet1.unit_amount, 10) + + # check that analytic line for product 'delivered' cannot be altered + timesheet3.write(dict(unit_amount=10)) + self.assertEquals(timesheet3.unit_amount, 10) + + def test_revenue_multi_currency(self): """ Create a SO with 2 lines : one for a delivered service, one for a ordered service. Confirm and invoice it. For this, we use a partner having a DIFFERENT currency from the current company. diff --git a/addons/stock/__manifest__.py b/addons/stock/__manifest__.py index 41aaa65f4e5..3c3509539db 100644 --- a/addons/stock/__manifest__.py +++ b/addons/stock/__manifest__.py @@ -43,14 +43,13 @@ 'wizard/stock_immediate_transfer_views.xml', 'wizard/stock_backorder_confirmation_views.xml', - 'views/stock_scrap_views.xml', - 'views/res_partner_views.xml', 'views/product_strategy_views.xml', - 'views/stock_inventory_views.xml', 'views/stock_incoterms_views.xml', 'views/stock_production_lot_views.xml', 'views/stock_picking_views.xml', + 'views/stock_scrap_views.xml', + 'views/stock_inventory_views.xml', 'views/stock_quant_views.xml', 'views/stock_location_views.xml', 'views/procurement_views.xml', diff --git a/addons/stock/data/stock_demo.yml b/addons/stock/data/stock_demo.yml index ac8ac582632..697bd8a2cad 100644 --- a/addons/stock/data/stock_demo.yml +++ b/addons/stock/data/stock_demo.yml @@ -131,7 +131,6 @@ - !record {model: stock.picking, id: incomming_shipment}: picking_type_id: stock.picking_type_in - origin: 'incoming_shipment for test' location_id: stock_location_suppliers location_dest_id: stock_location_stock - @@ -146,7 +145,6 @@ - !record {model: stock.picking, id: incomming_shipment1}: picking_type_id: stock.picking_type_in - origin: 'incoming_shipment' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_stock @@ -160,7 +158,6 @@ - !record {model: stock.picking, id: incomming_shipment2}: picking_type_id: stock.picking_type_in - origin: 'incoming_shipment main_warehouse' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_stock @@ -174,7 +171,6 @@ - !record {model: stock.picking, id: incomming_shipment3}: picking_type_id: stock.picking_type_in - origin: 'incoming_shipment your_company warehouse' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_stock @@ -188,7 +184,6 @@ - !record {model: stock.picking, id: incomming_shipment4}: picking_type_id: stock.picking_type_in - origin: 'incoming_shipment_main_warehouse' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_stock @@ -219,7 +214,6 @@ - !record {model: stock.picking, id: incomming_chicago_warehouse1}: picking_type_id: chi_picking_type_in - origin: 'incoming_shipment_chicago_warehouse' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_shop0 @@ -240,7 +234,6 @@ - !record {model: stock.picking, id: incomming_chicago_warehouse2}: picking_type_id: chi_picking_type_in - origin: 'incoming_shipment chicago_warehouse' partner_id: base.res_partner_1 location_id: stock.stock_location_suppliers location_dest_id: stock.stock_location_shop0 diff --git a/addons/stock/models/procurement.py b/addons/stock/models/procurement.py index 8d5e419fb90..ad5b81d9bdf 100644 --- a/addons/stock/models/procurement.py +++ b/addons/stock/models/procurement.py @@ -152,7 +152,7 @@ class ProcurementOrder(models.Model): qty_done = sum(self.move_ids.filtered(lambda move: move.state == 'done').mapped('product_uom_qty')) qty_left = max(self.product_qty - qty_done, 0) return { - 'name': self.name, + 'name': self.name[:2000], 'company_id': self.rule_id.company_id.id or self.rule_id.location_src_id.company_id.id or self.rule_id.location_id.company_id.id or self.company_id.id, 'product_id': self.product_id.id, 'product_uom': self.product_uom.id, diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index 693f5c0119e..391542c829f 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -76,7 +76,7 @@ class Product(models.Model): reordering_min_qty = fields.Float(compute='_compute_nbr_reordering_rules') reordering_max_qty = fields.Float(compute='_compute_nbr_reordering_rules') - @api.depends('stock_quant_ids', 'stock_move_ids') + @api.depends('stock_move_ids.product_qty', 'stock_move_ids.state') def _compute_quantities(self): res = self._compute_quantities_dict(self._context.get('lot_id'), self._context.get('owner_id'), self._context.get('package_id'), self._context.get('from_date'), self._context.get('to_date')) for product in self: @@ -154,9 +154,15 @@ class Product(models.Model): It will return all stock locations when no parameters are given Possible parameters are shop, warehouse, location, force_company, compute_child ''' - # TDE FIXME: clean that brol, context seems overused Warehouse = self.env['stock.warehouse'] + if self.env.context.get('company_owned', False): + company_id = self.env.user.company_id.id + return ( + [('location_id.company_id', '=', company_id)], + [('location_id.company_id', '=', False), ('location_dest_id.company_id', '=', company_id)], + [('location_id.company_id', '=', company_id), ('location_dest_id.company_id', '=', False), + ]) location_ids = [] if self.env.context.get('location', False): if isinstance(self.env.context['location'], pycompat.integer_types): diff --git a/addons/stock/models/stock_config_settings.py b/addons/stock/models/stock_config_settings.py index 531047ec3ec..45ff22c6ede 100644 --- a/addons/stock/models/stock_config_settings.py +++ b/addons/stock/models/stock_config_settings.py @@ -35,7 +35,7 @@ class StockConfigSettings(models.TransientModel): string="No Rescheduling Propagation", oldname='default_new_propagation_minimum_delta', help="Rescheduling applies to any chain of operations (e.g. Make To Order, Pick Pack Ship). In the case of MTO sales, a vendor delay (updated incoming date) impacts the expected delivery date to the customer. \n This option allows to not propagate the rescheduling if the change is not critical.") - module_stock_picking_wave = fields.Boolean("Picking Waves") + module_stock_picking_batch = fields.Boolean("Batch Pickings", oldname="module_stock_picking_wave") module_stock_calendar = fields.Boolean("Vendor Calendar for Reordering", help='Scheduled dates of requests for quotation generated from reordering rules are based on vendor lead times (defined on products).\nBy default, such a scheduling is made on calendar days. This option allow to adapt the scheduling with vendor calendars to set on reordering rules.') module_stock_barcode = fields.Boolean("Barcode Scanner") diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index c29a941e3bb..3ee63610245 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -352,8 +352,11 @@ class StockMove(models.Model): @api.multi def write(self, vals): # FIXME: pim fix your crap - if vals.get('product_uom_qty') and self.env.context.get('do_not_unreserve') is None: - self.filtered(lambda m: m.state not in ['draft', 'done', 'cancel']).do_unreserve() + if vals.get('product_uom_qty'): + if self.env.context.get('do_not_unreserve') is None: + move_to_unreserve = self.filtered(lambda m: m.state not in ['draft', 'done', 'cancel'] and m.reserved_availability > vals.get('product_uom_qty')) + move_to_unreserve.do_unreserve() + (self - move_to_unreserve).filtered(lambda m: m.state == 'assigned').write({'state': 'partially_available'}) # TDE CLEANME: it is a gros bordel + tracking Picking = self.env['stock.picking'] diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py index 1050d60902e..34fe0157b94 100644 --- a/addons/stock/models/stock_move_line.py +++ b/addons/stock/models/stock_move_line.py @@ -42,7 +42,7 @@ class StockMoveLine(models.Model): from_loc = fields.Char(compute='_compute_location_description') to_loc = fields.Char(compute='_compute_location_description') lots_visible = fields.Boolean(compute='_compute_lots_visible') - state = fields.Selection(related='move_id.state') + state = fields.Selection(related='move_id.state', store=True) consume_line_ids = fields.Many2many('stock.move.line', 'stock_move_line_consume_rel', 'consume_line_id', 'produce_line_id', help="Technical link to see who consumed what. ") produce_line_ids = fields.Many2many('stock.move.line', 'stock_move_line_consume_rel', 'produce_line_id', 'consume_line_id', help="Technical link to see which line was produced with this. ") diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 73c0827f9b8..04764834449 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -187,7 +187,7 @@ class Picking(models.Model): help="If this shipment was split, then this field links to the shipment which contains the already processed part.") move_type = fields.Selection([ - ('direct', 'Partial'), ('one', 'All at once')], 'Shipping Policy', + ('direct', 'As soon as possible'), ('one', 'When all products are ready')], 'Shipping Policy', default='direct', required=True, states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, help="It specifies goods to be deliver partially or all at once") @@ -236,7 +236,7 @@ class Picking(models.Model): readonly=True, required=True, states={'draft': [('readonly', False)]}) location_dest_id = fields.Many2one( - 'stock.location', "Destination Location Zone", + 'stock.location', "Destination Location", default=lambda self: self.env['stock.picking.type'].browse(self._context.get('default_picking_type_id')).default_location_dest_id, readonly=True, required=True, states={'draft': [('readonly', False)]}) @@ -644,8 +644,8 @@ class Picking(models.Model): for move in self.move_lines: quantity_todo.setdefault(move.product_id.id, 0) quantity_done.setdefault(move.product_id.id, 0) - quantity_todo[move.product_id.id] += move.product_qty - quantity_done[move.product_id.id] += move.quantity_done #TODO: convert to base units + quantity_todo[move.product_id.id] += move.product_uom_qty + quantity_done[move.product_id.id] += move.quantity_done for ops in self.move_line_ids.filtered(lambda x: x.package_id and not x.product_id and not x.move_id): for quant in ops.package_id.quant_ids: quantity_done.setdefault(quant.product_id.id, 0) diff --git a/addons/stock/models/stock_quant.py b/addons/stock/models/stock_quant.py index 582d24d1033..767162c1e92 100644 --- a/addons/stock/models/stock_quant.py +++ b/addons/stock/models/stock_quant.py @@ -11,10 +11,15 @@ from odoo.osv import expression class StockQuant(models.Model): _name = 'stock.quant' _description = 'Quants' + _rec_name = 'product_id' product_id = fields.Many2one( 'product.product', 'Product', ondelete='restrict', readonly=True, required=True) + # so user can filter on template in webclient + product_tmpl_id = fields.Many2one( + 'product.template', string='Product Template', + related='product_id.product_tmpl_id') product_uom_id = fields.Many2one( 'product.uom', 'Unit of Measure', readonly=True, related='product_id.uom_id') @@ -44,6 +49,18 @@ class StockQuant(models.Model): in_date = fields.Datetime('Incoming Date', readonly=True) @api.multi + def action_view_stock_moves(self): + self.ensure_one() + action = self.env.ref('stock.stock_move_line_action').read()[0] + action['domain'] = [ + ('product_id', '=', self.product_id.id), + '|', ('location_id', '=', self.location_id.id), + ('location_dest_id', '=', self.location_id.id), + ('lot_id', '=', self.lot_id.id), + ('package_id', '=', self.package_id.id)] + return action + + @api.multi @api.constrains('product_id') def check_product_id(self): if any(elem.product_id.type != 'product' for elem in self): diff --git a/addons/stock/tests/test_move.py b/addons/stock/tests/test_move.py index 22ae95448e4..2fc3d884045 100644 --- a/addons/stock/tests/test_move.py +++ b/addons/stock/tests/test_move.py @@ -12,6 +12,10 @@ class StockMove(TransactionCase): self.customer_location = self.env.ref('stock.stock_location_customers') self.supplier_location = self.env.ref('stock.stock_location_suppliers') self.pack_location = self.env.ref('stock.location_pack_zone') + self.transit_location = self.env['stock.location'].search([ + ('company_id', '=', self.env.user.company_id.id), + ('usage', '=', 'transit'), + ], limit=1) self.uom_unit = self.env.ref('product.product_uom_unit') self.product1 = self.env['product.product'].create({ 'name': 'Product A', @@ -2632,3 +2636,39 @@ class StockMove(TransactionCase): self.assertEqual(quant.in_date, Datetime.to_string(initial_in_date_lot1)) elif quant.lot_id == lot2: self.assertEqual(quant.in_date, initial_in_date_lot2) + + def test_transit_1(self): + """ Receive some products, send some to transit, check the product's `available_qty` + computed field with or without the "company_owned" key in the context. + """ + move1 = self.env['stock.move'].create({ + 'name': 'test_transit_1', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'picking_type_id': self.env.ref('stock.picking_type_in').id, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10 + move1.action_done() + + self.assertEqual(self.product1.qty_available, 10.0) + + move2 = self.env['stock.move'].create({ + 'name': 'test_transit_1', + 'location_id': self.stock_location.id, + 'location_dest_id': self.transit_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 5.0, + }) + move2.action_confirm() + move2.action_assign() + move2.move_line_ids.qty_done = 5 + move2.action_done() + + self.assertEqual(self.product1.qty_available, 5.0) + self.assertEqual(self.product1.with_context(company_owned=True).qty_available, 10.0) diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py index b9fcd4f0dfc..3f24334d195 100644 --- a/addons/stock/tests/test_move2.py +++ b/addons/stock/tests/test_move2.py @@ -3,6 +3,7 @@ from odoo.addons.stock.tests.common import TestStockCommon from odoo.exceptions import UserError +from odoo import api, registry class TestPickShip(TestStockCommon): @@ -1204,3 +1205,83 @@ class TestSinglePicking(TestStockCommon): }) move_line.lot_id = lot1 delivery_order.action_done() + + +class TestStockUOM(TestStockCommon): + + def setUp(self): + with registry().cursor() as cr: + env = api.Environment(cr, 1, {}) + dp = env.ref('product.decimal_product_uom') + self.old_digits = dp.digits + dp.digits = 7 + super(TestStockUOM, self).setUp() + + def tearDown(self): + super(TestStockUOM, self).tearDown() + with self.registry.cursor() as cr: + env = api.Environment(cr, 1, {}) + dp = env.ref('product.decimal_product_uom') + dp.digits = self.old_digits + + def test_pickings_transfer_with_different_uom_and_back_orders(self): + """ Picking transfer with diffrent unit of meassure. """ + # weight category + categ_test = self.env['product.uom.categ'].create({'name': 'Bigger than tons'}) + + T_LBS = self.env['product.uom'].create({ + 'name': 'T-LBS', + 'category_id': categ_test.id, + 'uom_type': 'reference', + 'rounding': 0.01 + }) + T_GT = self.env['product.uom'].create({ + 'name': 'T-GT', + 'category_id': categ_test.id, + 'uom_type': 'bigger', + 'rounding': 0.0000001, + 'factor_inv': 2240.00, + }) + T_TEST = self.env['product.product'].create({ + 'name': 'T_TEST', + 'type': 'product', + 'uom_id': T_LBS.id, + 'uom_po_id': T_LBS.id, + 'tracking': 'lot', + }) + picking_in = self.env['stock.picking'].create({ + 'partner_id': self.partner_delta_id, + 'picking_type_id': self.picking_type_in, + 'location_id': self.supplier_location, + 'location_dest_id': self.stock_location + }) + move = self.env['stock.move'].create({ + 'name': 'First move with 60 GT', + 'product_id': T_TEST.id, + 'product_uom_qty': 60, + 'product_uom': T_GT.id, + 'picking_id': picking_in.id, + 'location_id': self.supplier_location, + 'location_dest_id': self.stock_location + }) + picking_in.action_confirm() + + self.assertEqual(move.product_uom_qty, 60.00, 'Wrong T_GT quantity') + self.assertEqual(move.product_qty, 134400.00, 'Wrong T_LBS quantity') + + lot = self.env['stock.production.lot'].create({'name': 'Lot TEST', 'product_id': T_TEST.id}) + self.env['stock.move.line'].create({ + 'move_id': move.id, + 'product_id': T_TEST.id, + 'product_uom_id': T_LBS.id, + 'location_id': self.supplier_location, + 'location_dest_id': self.stock_location, + 'qty_done': 42760.00, + 'lot_id': lot.id, + }) + + picking_in.action_done() + back_order_in = self.env['stock.picking'].search([('backorder_id', '=', picking_in.id)]) + + self.assertEqual(len(back_order_in), 1.00, 'There should be one back order created') + self.assertEqual(back_order_in.move_lines.product_qty, 91640.00, 'There should be one back order created') diff --git a/addons/stock/tests/test_stock_flow.py b/addons/stock/tests/test_stock_flow.py index d6e3fa838c4..6291f804595 100644 --- a/addons/stock/tests/test_stock_flow.py +++ b/addons/stock/tests/test_stock_flow.py @@ -848,9 +848,7 @@ class TestStockFlow(TestStockCommon): res_dict = picking_out.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - res_dict_for_back_order = wizard.process() - backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) - backorder_wizard.process() + wizard.process() # ---------------------------------------------------------------------- # Check product stock location quantity and quantity available. @@ -931,9 +929,7 @@ class TestStockFlow(TestStockCommon): # Transfer Incoming shipment. res_dict = picking_in.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - res_dict_for_back_order = wizard.process() - backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) - backorder_wizard.process() + wizard.process() # ----------------------------------------------------------------------- # Check incoming shipment after transfer. @@ -970,7 +966,9 @@ class TestStockFlow(TestStockCommon): pack_opt.write({'product_uom_qty': 0.5}) res_dict = picking_out.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() quants = self.StockQuantObj.search([('product_id', '=', productKG.id), ('location_id', '=', self.stock_location)]) total_qty = [quant.quantity for quant in quants] # Check total quantity stock location. @@ -992,7 +990,9 @@ class TestStockFlow(TestStockCommon): pack_opt.write({'product_uom_qty': 0.5}) res_dict = bo_out_1.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() quants = self.StockQuantObj.search([('product_id', '=', productKG.id), ('location_id', '=', self.stock_location)]) total_qty = [quant.quantity for quant in quants] @@ -1014,7 +1014,9 @@ class TestStockFlow(TestStockCommon): pack_opt.write({'product_uom_qty': 0.5}) res_dict = bo_out_2.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() # Check total quantity stock location of product KG. quants = self.StockQuantObj.search([('product_id', '=', productKG.id), ('location_id', '=', self.stock_location)]) total_qty = [quant.quantity for quant in quants] @@ -1035,7 +1037,9 @@ class TestStockFlow(TestStockCommon): pack_opt.write({'product_uom_qty': 0.5}) res_dict = bo_out_3.button_validate() wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id')) - wizard.process() + res_dict_for_back_order = wizard.process() + backorder_wizard = self.env[(res_dict_for_back_order.get('res_model'))].browse(res_dict_for_back_order.get('res_id')) + backorder_wizard.process() quants = self.StockQuantObj.search([('product_id', '=', productKG.id), ('location_id', '=', self.stock_location)]) total_qty = [quant.quantity for quant in quants] self.assertEqual(sum(total_qty), 999.9980, 'Expecting 999.9980 kg , got %.4f kg on location stock!' % (sum(total_qty))) diff --git a/addons/stock/views/procurement_views.xml b/addons/stock/views/procurement_views.xml index 012789e5495..c36e2de7a6c 100644 --- a/addons/stock/views/procurement_views.xml +++ b/addons/stock/views/procurement_views.xml @@ -92,9 +92,9 @@ </record> <!-- Procurements are located in Warehouse menu hierarchy, MRP users should come to Stock application to use it. --> - <menuitem id="menu_stock_sched" name="Schedulers" parent="stock.menu_stock_root" groups="group_stock_manager" sequence="50"/> - <menuitem action="action_procurement_compute" id="menu_procurement_compute" parent="menu_stock_sched" sequence="2" groups="base.group_no_one"/> - <menuitem action="procurement.action_compute_schedulers" id="menu_stock_proc_schedulers" parent="menu_stock_sched" sequence="1" groups="stock.group_stock_manager"/> + <menuitem id="procurement_order_compute_all_menu" name="Schedulers" sequence="5" groups="group_stock_manager" parent="menu_stock_warehouse_mgmt"/> + <menuitem action="procurement.action_compute_schedulers" id="menu_stock_proc_schedulers" parent="procurement_order_compute_all_menu" name="Run Scheduler" sequence="5" groups="stock.group_stock_manager"/> + <menuitem action="action_procurement_compute" id="menu_procurement_compute" parent="procurement_order_compute_all_menu" sequence="10" groups="base.group_no_one"/> <menuitem id="menu_stock_procurement" name="Automatic Procurements" parent="stock.menu_stock_config_settings" sequence="5"/> <menuitem action="procurement.procurement_order_action_exceptions" id="menu_stock_procurement_action" parent="stock.menu_warehouse_report" sequence="130" groups="stock.group_stock_manager"/> </odoo> diff --git a/addons/stock/views/stock_config_settings_views.xml b/addons/stock/views/stock_config_settings_views.xml index 3719c4ab3f3..df827a73bde 100644 --- a/addons/stock/views/stock_config_settings_views.xml +++ b/addons/stock/views/stock_config_settings_views.xml @@ -43,10 +43,10 @@ </div> <div class="col-xs-12 col-md-6 o_setting_box"> <div class="o_setting_left_pane"> - <field name="module_stock_picking_wave"/> + <field name="module_stock_picking_batch"/> </div> <div class="o_setting_right_pane"> - <label for="module_stock_picking_wave"/> + <label for="module_stock_picking_batch"/> <div class="text-muted"> Process picking in batch per worker </div> diff --git a/addons/stock/views/stock_inventory_views.xml b/addons/stock/views/stock_inventory_views.xml index a7a63adaea2..4026cd2e277 100644 --- a/addons/stock/views/stock_inventory_views.xml +++ b/addons/stock/views/stock_inventory_views.xml @@ -271,5 +271,5 @@ <field name="domain">[('inventory_id', '=', active_id)]</field> </record> - <menuitem action="action_inventory_form" id="menu_action_inventory_form" parent="menu_stock_inventory_control" sequence="30"/> + <menuitem action="action_inventory_form" id="menu_action_inventory_form" parent="stock_picking_menu_product" sequence="30"/> </odoo> diff --git a/addons/stock/views/stock_location_views.xml b/addons/stock/views/stock_location_views.xml index 0d91ca295a9..89fc9e1b818 100644 --- a/addons/stock/views/stock_location_views.xml +++ b/addons/stock/views/stock_location_views.xml @@ -138,7 +138,7 @@ </field> </record> <menuitem action="action_location_form" id="menu_action_location_form" - parent="menu_warehouse_config" sequence="2"/> + parent="menu_warehouse_config" sequence="2" groups="stock.group_stock_multi_locations"/> <record id="stock_location_path_filter" model="ir.ui.view"> diff --git a/addons/stock/views/stock_menu_views.xml b/addons/stock/views/stock_menu_views.xml index a8d58466cbc..41a1f709455 100644 --- a/addons/stock/views/stock_menu_views.xml +++ b/addons/stock/views/stock_menu_views.xml @@ -9,12 +9,18 @@ <menuitem id="menu_stock_config_settings" name="Configuration" parent="menu_stock_root" sequence="100" groups="group_stock_manager"/> <menuitem id="menu_warehouse_config" name="Warehouse Management" parent="menu_stock_config_settings" groups="stock.group_stock_manager" sequence="1"/> - <menuitem id="menu_packages_config" name="Packages" parent="menu_stock_config_settings" sequence="3"/> - <menuitem id="menu_wms_barcode_nomenclature_all" parent="menu_stock_config_settings" action="barcodes.action_barcode_nomenclature_form" - sequence="50" groups="base.group_no_one"/> + <menuitem id="menu_product_in_config_stock" name="Products" parent="stock.menu_stock_config_settings" sequence="4"/> + <menuitem id="menu_wms_barcode_nomenclature_all" parent="menu_product_in_config_stock" action="barcodes.action_barcode_nomenclature_form" + sequence="50" groups="base.group_no_one"/> + + <menuitem id="product_uom_menu" name="Units of Measures" parent="menu_stock_config_settings" + sequence="5" groups="product.group_uom"/> + + <menuitem id="menu_packages_config" name="Packages" parent="menu_stock_config_settings" sequence="6"/> + <menuitem action="product.product_category_action_form" id="menu_product_category_config_stock" parent="stock.menu_product_in_config_stock" sequence="2"/> @@ -26,13 +32,15 @@ parent="menu_product_in_config_stock" sequence="5" groups="product.group_product_variant"/> <menuitem action="product.product_uom_categ_form_action" id="menu_stock_uom_categ_form_action" - parent="menu_product_in_config_stock" sequence="5" groups="product.group_uom"/> + name="UoM Categories" + parent="product_uom_menu" sequence="5"/> <menuitem id="menu_stock_unit_measure_stock" name="Units of Measure" parent="stock.menu_product_in_config_stock" sequence="35" groups="product.group_uom"/> <menuitem id="menu_stock_uom_form_action" action="product.product_uom_form_action" - parent="menu_stock_config_settings" sequence="35" groups="product.group_uom"/> + name="UoM" + parent="product_uom_menu" sequence="35"/> <menuitem id="menu_stock_inventory_control" name="Inventory Control" parent="menu_stock_root" sequence="4"/> diff --git a/addons/stock/views/stock_move_line_views.xml b/addons/stock/views/stock_move_line_views.xml index f23aae541d6..929e22c3c12 100644 --- a/addons/stock/views/stock_move_line_views.xml +++ b/addons/stock/views/stock_move_line_views.xml @@ -5,14 +5,15 @@ <field name="model">stock.move.line</field> <field name="arch" type="xml"> <tree decoration-muted="state == 'cancel'" decoration-danger="(state not in ('cancel','done'))" string="Move Lines" create="0"> + <field name="date"/> <field name="picking_id" string="Reference"/> <field name="create_date" invisible="1" groups="base.group_no_one"/> <field name="product_id"/> + <field name="location_id"/> + <field name="location_dest_id"/> <field name="product_uom_qty"/> + <field name="qty_done" string="Quantity Done"/> <field name="product_uom_id" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> - <field name="location_id" groups="stock.group_stock_multi_locations"/> - <field name="location_dest_id" groups="stock.group_stock_multi_locations"/> - <field name="date" groups="base.group_no_one"/> <field name="state"/> </tree> </field> @@ -28,27 +29,55 @@ <sheet> <group> <group> - <field name="picking_id"/> - <field name="create_date" groups="base.group_no_one"/> + <field name="date" groups="base.group_no_one"/> + <field name="picking_id" string="Reference"/> <field name="product_id"/> - <field name="product_uom_qty"/> - <field name="product_uom_id" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> <field name="location_id" groups="stock.group_stock_multi_locations"/> <field name="location_dest_id" groups="stock.group_stock_multi_locations"/> - <field name="date" groups="base.group_no_one"/> + </group> + <group> + <label for="product_uom_qty" string="Quantity Reserved"/> + <div class="o_row"> + <field name="product_uom_qty"/> + <field name="product_uom_id" options="{'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> + </div> + <label for="qty_done" string="Quantity Done"/> + <div class="o_row"> + <field name="qty_done"/> + <field name="product_uom_id" options="{'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> + </div> </group> </group> </sheet> </form> </field> </record> + + <record id="stock_move_line_view_search" model="ir.ui.view"> + <field name="name">stock.move.line.search</field> + <field name="model">stock.move.line</field> + <field name="arch" type="xml"> + <search string="Stock Moves"> + <field name="picking_id" string="Reference"/> + <field name="product_id"/> + <field name="location_id" groups="stock.group_stock_multi_locations"/> + <field name="location_dest_id" groups="stock.group_stock_multi_locations"/> + <filter string="Done" name="done" domain="[('state','=','done')]"/> + <separator/> + <group expand="0" string="Group By"> + <filter string="Status" name="by_state" domain="[]" context="{'group_by':'state'}"/> + </group> + </search> + </field> + </record> + <record id="stock_move_line_action" model="ir.actions.act_window"> - <field name="name">Stock Move Lines</field> + <field name="name">Product Moves</field> <field name="res_model">stock.move.line</field> <field name="type">ir.actions.act_window</field> <field name="view_type">form</field> <field name="view_id" ref="view_move_line_tree"/> - <field name="context">{}</field> + <field name="context">{'search_default_done': 1}</field> </record> <menuitem action="stock_move_line_action" id="stock_move_line_menu" parent="stock.menu_warehouse_report" sequence="150" groups="base.group_no_one"/> diff --git a/addons/stock/views/stock_move_views.xml b/addons/stock/views/stock_move_views.xml index 6c9e5230575..ff7f946050d 100644 --- a/addons/stock/views/stock_move_views.xml +++ b/addons/stock/views/stock_move_views.xml @@ -231,6 +231,8 @@ <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,assigned,done" /> </header> <sheet> + <div class="oe_button_box" name="button_box"> + </div> <group> <group name="main_grp" colspan="2"> <group name="main_grp_col1"> @@ -358,7 +360,7 @@ </record> <record id="stock_move_action" model="ir.actions.act_window"> - <field name="name">Stock Moves</field> + <field name="name">Picking Moves</field> <field name="res_model">stock.move</field> <field name="type">ir.actions.act_window</field> <field name="view_type">form</field> diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml index c8c99af328a..017f035be4a 100644 --- a/addons/stock/views/stock_picking_views.xml +++ b/addons/stock/views/stock_picking_views.xml @@ -181,7 +181,7 @@ <field name="arch" type="xml"> <tree decoration-info="state == 'draft'" decoration-muted="state == 'cancel'" decoration-danger="state not in ('cancel', 'done') and scheduled_date < current_date" string="Picking list"> <field name="name"/> - <field name="location_dest_id"/> + <field name="location_dest_id" groups="stock.group_stock_multi_locations"/> <field name="partner_id"/> <field name="date" invisible="1"/> <field name="scheduled_date"/> @@ -210,13 +210,13 @@ <button name="do_print_picking" string="Print" groups="stock.group_stock_user" type="object" attrs="{'invisible': [('state', 'not in', ('assigned', 'partially_available'))]}"/> <button name="%(action_report_delivery)d" string="Print" states="done" type="action" groups="base.group_user"/> <button name="%(act_stock_return_picking)d" string="Return" states="done" type="action" groups="base.group_user"/> - <button name="action_cancel" states="assigned,confirmed,partially_available,draft,waiting" string="Cancel" groups="base.group_user" type="object"/> <field name="picking_type_code" invisible="1"/> <button name="do_unreserve" string="Unreserve" groups="base.group_user" type="object" attrs="{'invisible': ['|', ('picking_type_code', '=', 'incoming'), ('state', 'not in', ('assigned', 'partially_available'))]}"/> <field name="show_operations" invisible="1" readonly="1"/> <field name="move_line_exist" invisible="1"/> <field name="has_packages" invisible="1"/> <button name="button_scrap" type="object" string="Scrap" attrs="{'invisible': ['|', '&', ('picking_type_code', '!=', 'incoming'), ('state', 'in', ('draft', 'cancel', 'waiting')), '&', ('picking_type_code', '=', 'incoming'), ('state', '!=', 'done')]}"/> + <button name="action_cancel" states="assigned,confirmed,partially_available,draft,waiting" string="Cancel" groups="base.group_user" type="object"/> <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,partially_available,assigned,done" /> <field name="picking_type_entire_packs" invisible="1"/> </header> @@ -243,7 +243,7 @@ </group> <group> <field name="scheduled_date"/> - <field name="origin" placeholder="e.g. PO0032" class="oe_inline"/> + <field name="origin" placeholder="e.g. PO0032" readonly="1"/> <field name="owner_id" groups="stock.group_tracking_owner"/> <div groups="stock.group_tracking_owner" colspan="2" col="2"> <button name="action_assign_owner" string="Assign Owner" type="object" attrs="{'invisible': ['|',('move_line_exist', '=', False),('state', 'not in', ('draft','assigned','confirmed'))]}" @@ -273,9 +273,8 @@ </page> <page string="Operations"> <field name="id" invisible="1"/> - <field name="move_lines" attrs="{'readonly': [('state', 'in', ('cancel', 'done'))]}" context="{'default_picking_id': id, 'form_view_ref':'stock.view_move_picking_form', 'address_in_id': partner_id, 'default_picking_type_id': picking_type_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}"> - <tree decoration-danger="state != 'done' and quantity_done > reserved_availability" decoration-muted="scrapped == True" string="Stock Moves" editable="bottom"> - <field name="name" invisible="1"/> + <field name="move_lines" attrs="{'readonly': [('state', 'in', ('cancel', 'done'))]}" context="{'picking_type_code': picking_type_code, 'default_picking_id': id, 'form_view_ref':'stock.view_move_picking_form', 'address_in_id': partner_id, 'default_picking_type_id': picking_type_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}"> + <tree decoration-danger="state != 'done' and quantity_done > reserved_availability" decoration-muted="scrapped == True or state == 'cancel'" string="Stock Moves" editable="bottom"> <field name="date_expected" invisible="1"/> <field name="state" invisible="1" readonly="0"/> <field name="picking_type_id" invisible="1"/> @@ -291,9 +290,9 @@ <field name="product_id" required="1" attrs="{'readonly': ['&', ('state', '!=', 'draft'), ('additional', '=', False)]}"/> <field name="is_initial_demand_editable" invisible="1"/> <field name="product_uom_qty" string="Initial Demand" attrs="{'readonly': [('is_initial_demand_editable', '=', False), ('state', '!=', 'draft')]}"/> - <field name="product_uom" attrs="{'readonly': [('state', '!=', 'draft'), ('additional', '=', False)]}" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> - <field name="reserved_availability" string="Reserved"/> + <field name="reserved_availability" string="Reserved" invisible="context.get('picking_type_code') == 'incoming'"/> <field name="quantity_done" string="Done" attrs="{'readonly': ['|', ('show_details_visible', '=', True), ('state', '=', 'cancel')], 'invisible': ['|', ('state', 'in', ['draft', 'confirmed', 'waiting']), ('show_operations', '=', True)]}"/> + <field name="product_uom" attrs="{'readonly': [('state', '!=', 'draft'), ('additional', '=', False)]}" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> <button name="action_show_details" string="Register lots, packs, location" type="object" icon="fa-list" attrs="{'invisible': [('show_details_visible', '=', False)]}"/> </tree> </field> @@ -302,14 +301,14 @@ <page string="Additional Info" name="extra"> <group> <group> - <field name="move_type"/> - <field name="picking_type_id" attrs="{'readonly': [('state', '!=', 'draft')]}"/> <field name="picking_type_code" invisible="1"/> + <field name="move_type" attrs="{'invisible': [('picking_type_code', '=', 'incoming')]}"/> + <field name="picking_type_id" attrs="{'readonly': [('state', '!=', 'draft')]}"/> </group> <group> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> <field name="group_id" groups="base.group_no_one"/> - <field name="priority"/> + <field name="priority" attrs="{'invisible': [('picking_type_code', '=', 'incoming')]}"/> </group> </group> </page> @@ -388,7 +387,11 @@ </field> </record> - <menuitem id="all_picking" name="All Transfers" parent="menu_stock_warehouse_mgmt" sequence="2" action="action_picking_tree_all" groups="stock.group_stock_manager,stock.group_stock_user"/> + <menuitem id="stock_picking_menu_product" name="Products" + parent="menu_stock_warehouse_mgmt" sequence="1" + groups="stock.group_stock_manager,stock.group_stock_user"/> + + <menuitem id="all_picking" name="Transfers" parent="stock_picking_menu_product" sequence="5" action="action_picking_tree_all" groups="stock.group_stock_manager,stock.group_stock_user"/> <record id="stock_picking_action_picking_type" model="ir.actions.act_window"> <field name="name">All Transfers</field> diff --git a/addons/stock/views/stock_quant_views.xml b/addons/stock/views/stock_quant_views.xml index e92515f6037..ad263184b5c 100644 --- a/addons/stock/views/stock_quant_views.xml +++ b/addons/stock/views/stock_quant_views.xml @@ -18,6 +18,7 @@ <separator/> <filter name="negative" string="Negative Stock" domain="[('quantity', '<', 0.0)]"/> <filter name="positive" string="Positive Stock" domain="[('quantity', '>', 0.0)]"/> + <filter name="reserved" string="Reservations" domain="[('reserved_quantity', '>', 0.0)]"/> </group> <group expand='0' string='Group by...'> <filter string='Location' name="locationgroup" domain="[]" context="{'group_by': 'location_id'}"/> @@ -37,20 +38,33 @@ <field eval="10" name="priority"/> <field name="arch" type="xml"> <form string="Inventory Valuation" create="false" edit="false" delete="false"> - <group> - <group> - <field name="product_id"/> - <field name="quantity"/> - <field name="product_uom_id" groups="product.group_uom"/> - <field name="lot_id" groups="stock.group_production_lot"/> - <field name="package_id" groups="stock.group_tracking_lot"/> - <field name="location_id"/> - <field name="owner_id" groups="stock.group_tracking_owner"/> - </group> + <sheet> + <div class="oe_button_box" name="button_box"> + <button class="oe_stat_button" icon="fa-arrows-v" type="object" name="action_view_stock_moves" string="Picking Moves"/> + </div> <group> - <field name="in_date" attrs="{'invisible': [('lot_id', '=', False)]}" groups="stock.group_production_lot"/> + <group> + <field name="product_id"/> + <field name="location_id"/> + <field name="lot_id" groups="stock.group_production_lot"/> + <field name="package_id" groups="stock.group_tracking_lot"/> + <field name="owner_id" groups="stock.group_tracking_owner"/> + </group> + <group> + <label for="quantity" string="Quantity On Hand"/> + <div class="o_row"> + <field name="quantity"/> + <field name="product_uom_id" groups="product.group_uom"/> + </div> + <label for="reserved_quantity" string="Quantity Reserved"/> + <div class="o_row"> + <field name="reserved_quantity"/> + <field name="product_uom_id" groups="product.group_uom"/> + </div> + <field name="in_date" attrs="{'invisible': [('lot_id', '=', False)]}" groups="stock.group_production_lot"/> + </group> </group> - </group> + </sheet> </form> </field> </record> @@ -62,12 +76,13 @@ <field name="arch" type="xml"> <tree string="Inventory Valuation" create="0" delete="0"> <field name="product_id"/> - <field name="quantity"/> - <field name="product_uom_id" groups="product.group_uom"/> <field name="location_id"/> - <field name="owner_id" groups="stock.group_tracking_owner"/> <field name="lot_id" groups="stock.group_production_lot"/> <field name="package_id" groups="stock.group_tracking_lot"/> + <field name="reserved_quantity" string="Reserved"/> + <field name="quantity" string="On Hand"/> + <field name="product_uom_id" groups="product.group_uom"/> + <field name="owner_id" groups="stock.group_tracking_owner"/> <field name='company_id' groups="base.group_multi_company"/> </tree> </field> @@ -79,18 +94,30 @@ <field name="model">stock.quant</field> <field name="arch" type="xml"> <pivot string="Inventory"> - <field name="location_id" type="row"/> + <field name="product_id" type="row"/> + <field name="location_id" type="col"/> <field name="quantity" type="measure"/> </pivot> </field> </record> + <record id="stock_quant_view_graph" model="ir.ui.view"> + <field name="name">stock.quant.graph</field> + <field name="model">stock.quant</field> + <field name="arch" type="xml"> + <graph string="Stock Quant"> + <field name="location_id"/> + <field name="quantity" type="measure"/> + </graph> + </field> + </record> + <record model="ir.actions.act_window" id="quantsact"> <!-- Menu + python --> <field name="name">Inventory</field> <field name="res_model">stock.quant</field> <field name="view_type">form</field> - <field name="view_mode">tree,form,pivot</field> - <field name="context">{'search_default_internal_loc': 1, 'search_default_transit_loc': 1}</field> + <field name="view_mode">tree,form,pivot,graph</field> + <field name="context">{'search_default_internal_loc': 1,}</field> <field name="help">This analysis gives you a fast overview on the current stock level of your products and their current inventory value.</field> </record> <record model="ir.actions.act_window" id="product_template_open_quants"> <!-- Not used --> diff --git a/addons/stock/views/stock_scrap_views.xml b/addons/stock/views/stock_scrap_views.xml index fbd2684d80a..570e24974e4 100644 --- a/addons/stock/views/stock_scrap_views.xml +++ b/addons/stock/views/stock_scrap_views.xml @@ -136,7 +136,7 @@ <menuitem id="menu_stock_scrap" name="Scrap" - parent="menu_stock_inventory_control" + parent="stock_picking_menu_product" action="action_stock_scrap" sequence="99"/> diff --git a/addons/stock/wizard/stock_immediate_transfer_views.xml b/addons/stock/wizard/stock_immediate_transfer_views.xml index 2b1995650db..4987bd3cb17 100644 --- a/addons/stock/wizard/stock_immediate_transfer_views.xml +++ b/addons/stock/wizard/stock_immediate_transfer_views.xml @@ -7,8 +7,8 @@ <form string="Immediate transfer?"> <group> <p> - You haven't entered (<i>done</i>) quantities, by clicking on <i>apply</i> - Odoo will process all the reserved quantities. + You haven't entered <i>done</i> quantities, by clicking on <i>apply</i> + Odoo will process all the <i>reserved</i> quantities. </p> </group> <footer> diff --git a/addons/stock_account/models/__init__.py b/addons/stock_account/models/__init__.py index 21bf84ae9b2..7ba53628062 100644 --- a/addons/stock_account/models/__init__.py +++ b/addons/stock_account/models/__init__.py @@ -3,6 +3,7 @@ from . import account_chart_template from . import account_invoice +from . import account_move from . import product from . import stock from . import stock_config_settings diff --git a/addons/stock_account/models/account_move.py b/addons/stock_account/models/account_move.py new file mode 100644 index 00000000000..7919da15090 --- /dev/null +++ b/addons/stock_account/models/account_move.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models + + +class AccountMove(models.Model): + _inherit = 'account.move' + + stock_move_id = fields.Many2one('stock.move', string='Stock Move') + diff --git a/addons/stock_account/models/product.py b/addons/stock_account/models/product.py index bfdb5a00469..2fc2e106f8b 100644 --- a/addons/stock_account/models/product.py +++ b/addons/stock_account/models/product.py @@ -3,7 +3,7 @@ from odoo import api, fields, models, tools, _ from odoo.exceptions import UserError -from odoo.tools import float_is_zero +from odoo.tools import float_is_zero, pycompat from odoo.addons import decimal_precision as dp @@ -16,17 +16,17 @@ class ProductTemplate(models.Model): ('manual_periodic', 'Periodic (manual)'), ('real_time', 'Perpetual (automated)')], string='Inventory Valuation', company_dependent=True, copy=True, default='manual_periodic', - help="If perpetual valuation is enabled for a product, the system will automatically create journal entries corresponding to stock moves, with product price as specified by the 'Costing Method'" \ - "The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products.") + help="""Manual: The accounting entries to value the inventory are not posted automatically. + Automated: An accounting entry is automatically created to value the inventory when a product enters or leaves the company.""") valuation = fields.Char(compute='_compute_valuation_type', inverse='_set_valuation_type') property_cost_method = fields.Selection([ ('standard', 'Standard Price'), - ('fifo', '(financial) FIFO'), - ('average', 'AVCO')], string='Costing Method', + ('fifo', 'First In First Out (FIFO)'), + ('average', 'Average Cost (AVCO)')], string='Costing Method', company_dependent=True, copy=True, - help="""Standard Price: The cost price is manually updated at the end of a specific period (usually once a year). - Average Price: The cost price is recomputed at each incoming shipment and used for the product valuation. - Real Price: The cost price displayed is the price of the last outgoing product (will be use in case of inventory loss for example).""") + help="""Standard Price: The products are valued at their standard cost defined on the product. + Average Cost (AVCO): The products are valued at weighted average cost. + First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first.""") cost_method = fields.Char(compute='_compute_cost_method', inverse='_set_cost_method') property_stock_account_input = fields.Many2one( 'account.account', 'Stock Input Account', @@ -38,19 +38,6 @@ class ProductTemplate(models.Model): company_dependent=True, domain=[('deprecated', '=', False)], help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless " "there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used.") - average_price = fields.Float( - 'Average Cost', compute='_compute_average_price', - digits=dp.get_precision('Product Price'), groups="base.group_user", - help="Average cost of the product, in the default unit of measure of the product.") - - @api.multi - def _compute_average_price(self): - unique_variants = self.filtered(lambda template: len(template.product_variant_ids) == 1) - for template in unique_variants: - template.average_price = template.product_variant_ids.average_price - for template in (self - unique_variants): - template.average_price = 0.0 - @api.one @api.depends('property_valuation', 'categ_id.property_valuation') @@ -73,11 +60,6 @@ class ProductTemplate(models.Model): def _set_cost_method(self): return self.write({'property_cost_method': self.cost_method}) - @api.onchange('type') - def onchange_type_valuation(self): - # TO REMOVE IN MASTER - pass - @api.multi def _get_product_accounts(self): """ Add the stock accounts related to product to the result of super() @@ -105,20 +87,9 @@ class ProductTemplate(models.Model): class ProductProduct(models.Model): _inherit = 'product.product' - average_price = fields.Float( - 'Average Cost', - digits=dp.get_precision('Product Price'), - groups="base.group_user", - compute='_compute_average_price', - help="Calculated average cost") stock_value = fields.Float( 'Value', compute='_compute_stock_value') - @api.onchange('type') - def onchange_type_valuation(self): - # TO REMOVE IN MASTER - pass - @api.multi def do_change_standard_price(self, new_price, account_id): """ Changes the Standard Price of Product and creates an account move accordingly.""" @@ -166,93 +137,45 @@ class ProductProduct(models.Model): self.write({'standard_price': new_price}) return True - def _get_latest_cumulated_value(self, not_move=False): - self.ensure_one() - # TODO: only filter on IN and OUT stock.move - domain = [ - ('product_id', '=', self.id), - ('state', '=', 'done'), - ] - if not_move: - domain += [('id', '!=', not_move.id)] - latest = self.env['stock.move'].search(domain, order='date desc, id desc', limit=1) - if not latest: - return 0.0 - return latest.cumulated_value - - def _get_candidates_out_move(self): - self.ensure_one() - # TODO: filter at start of period - candidates = self.env['stock.move'].search([ - ('product_id', '=', self.id), - ('location_dest_id.usage', 'not in', ('transit', 'internal')), - ('location_id.usage', 'in', ('transit', 'internal')), - ('remaining_qty', '>', 0), - ('state', '=', 'done') - ], order='date, id') #TODO: case - return candidates - - def _get_candidates_move(self): + def _get_fifo_candidates_in_move(self): + """ Find IN moves that can be used to value OUT moves. + """ self.ensure_one() - # TODO: filter at start of period - candidates = self.env['stock.move'].search([ - ('product_id', '=', self.id), - ('location_dest_id.usage', 'in', ('transit', 'internal')), - ('location_id.usage', 'not in', ('transit', 'internal')), - ('remaining_qty', '>', 0), - ('state', '=', 'done') - ], order='date, id') #TODO: case where + domain = [('product_id', '=', self.id), ('remaining_qty', '>', 0.0)] + self.env['stock.move']._get_in_base_domain() + candidates = self.env['stock.move'].search(domain, order='date, id') return candidates @api.multi - def _compute_average_price(self): - for product in self: - if product.qty_available > 0: - last_cumulated_value = product._get_latest_cumulated_value() - product.average_price = last_cumulated_value / product.qty_available - else: - product.average_price = 0 - - @api.multi def _compute_stock_value(self): for product in self: - if product.cost_method == 'standard': - product.stock_value = product.standard_price * product.qty_available - elif product.cost_method == 'average': - product.stock_value = product._get_latest_cumulated_value() - elif product.cost_method == 'fifo': #Could also do same as for average, but it would lead to more rounding errors - moves = product._get_candidates_move() - value = 0 - for move in moves: - value += move.remaining_qty * move.price_unit - product.stock_value = value + if product.cost_method in ['standard', 'average']: + product.stock_value = product.standard_price * product.with_context(company_owned=True).qty_available + elif product.cost_method == 'fifo': + StockMove = self.env['stock.move'] + domain = [('product_id', '=', product.id)] + StockMove._get_all_base_domain() + moves = StockMove.search(domain) + product.stock_value = sum(moves.mapped('value')) class ProductCategory(models.Model): _inherit = 'product.category' property_valuation = fields.Selection([ - ('manual_periodic', 'Periodic (manual)'), - ('real_time', 'Perpetual (automated)')], string='Inventory Valuation', + ('manual_periodic', 'Manual'), + ('real_time', 'Automated')], string='Inventory Valuation', company_dependent=True, copy=True, required=True, - help="If perpetual valuation is enabled for a product, the system " - "will automatically create journal entries corresponding to " - "stock moves, with product price as specified by the 'Costing " - "Method'. The inventory variation account set on the product " - "category will represent the current inventory value, and the " - "stock input and stock output account will hold the counterpart " - "moves for incoming and outgoing products.") + help="""Manual: The accounting entries to value the inventory are not posted automatically. + Automated: An accounting entry is automatically created to value the inventory when a product enters or leaves the company. + """) property_cost_method = fields.Selection([ ('standard', 'Standard Price'), - ('fifo', '(financial) FIFO)'), - ('average', 'AVCO')], string="Costing Method", + ('fifo', 'First In First Out (FIFO)'), + ('average', 'Average Cost (AVCO)')], string="Costing Method", company_dependent=True, copy=True, required=True, - help="Standard Price: The cost price is manually updated at the end " - "of a specific period (usually once a year).\nAverage Price: " - "The cost price is recomputed at each incoming shipment and " - "used for the product valuation.\nReal Price: The cost price " - "displayed is the price of the last outgoing product (will be " - "used in case of inventory loss for example).""") + help=""""Standard Price: The products are valued at their standard cost defined on the product. + Average Cost (AVCO): The products are valued at weighted average cost. + First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first. + """) property_stock_journal = fields.Many2one( 'account.journal', 'Stock Journal', company_dependent=True, help="When doing real-time inventory valuation, this is the Accounting Journal in which entries will be automatically posted when stock moves are processed.") diff --git a/addons/stock_account/models/stock.py b/addons/stock_account/models/stock.py index d9504d7bc9e..d4564d97959 100644 --- a/addons/stock_account/models/stock.py +++ b/addons/stock_account/models/stock.py @@ -55,11 +55,25 @@ class StockMoveLine(models.Model): @api.multi def write(self, vals): - super(StockMoveLine, self).write(vals) if 'qty_done' in vals: - for move in self.mapped('move_id').filtered(lambda m: m.state == 'done'): - move.value = move.quantity_done * move.price_unit - move.replay() + # We need to update the `value`, `remaining_value` and `remaining_qty` on the linked + # stock move. + moves_to_update = {} + for move_line in self.filtered(lambda ml: ml.state == 'done'): + moves_to_update[move_line.move_id] = vals['qty_done'] - move_line.qty_done + + for move_id, qty_difference in moves_to_update.items(): + # more/less units are available, update `value`, `remaining_value` and + # `remaining_qty` on the linked stock move. + move_vals = { + 'value': move_id.value + qty_difference * move_id.price_unit, + 'remaining_value': move_id.remaining_value + qty_difference * move_id.price_unit, + 'remaining_qty': move_id.remaining_qty + qty_difference, + } + move_id.write(move_vals) + if move_id.product_id.valuation == 'real_time': + move_id.with_context(force_valuation_amount=qty_difference*move_id.price_unit)._account_entry_move() + return super(StockMoveLine, self).write(vals) class StockMove(models.Model): @@ -67,163 +81,236 @@ class StockMove(models.Model): to_refund = fields.Boolean(string="To Refund (update SO/PO)", help='Trigger a decrease of the delivered/received quantity in the associated Sale Order/Purchase Order') - value = fields.Float() - cumulated_value = fields.Float() remaining_qty = fields.Float() - last_done_move_id = fields.Many2one('stock.move') - last_done_remaining_qty = fields.Float() - last_done_qty = fields.Float() - - # TODO: add constraints remaining_qty > 0 - # TODO: add constrain price_unit = 0 on done move? + remaining_value = fields.Float() + account_move_ids = fields.One2many('account.move', 'stock_move_id') @api.multi - def _get_price_unit(self): - self.ensure_one() - if self.product_id.cost_method == 'average': - return self.product_id.average_price or self.product_id.standard_price - if self.product_id.cost_method == 'fifo': - move = self.search([('product_id', '=', self.product_id.id), - ('state', '=', 'done'), - ('location_id.usage', '=', 'internal'), - ('location_dest_id.usage', '!=', 'internal')], order='date desc', limit=1) - if move: - return move.price_unit or self.product_id.standard_price - return self.product_id.standard_price - - def _update_future_cumulated_value(self, value): + def action_get_account_moves(self): self.ensure_one() - moves = self.search([('state', '=', 'done'), - ('date', '>', self.date), - ('product_id', '=', self.product_id.id)]) - for move in moves: - move.value += value - -# def change_move_value_in_the_past(self, value): -# self.ensure_one() -# if self.product_id.cost_method == 'fifo': -# moves = self.search([('state', '=', 'done'), -# ('date', '>', self.date), -# ('product_id', '=', self.product_id.id)]) -# if self.location_id.usage not in ('internal', 'transit'): -# if move.last_done_move_id and move.last_done_remaining_qty: + action_ref = self.env.ref('account.action_move_journal_line') + if not action_ref: + return False + action_data = action_ref.read()[0] + action_data['domain'] = [('id', 'in', self.account_move_ids.ids)] + return action_data + + def get_price_unit(self): + """ Returns the unit price to store on the quant """ + return self.price_unit or self.product_id.standard_price + + @api.model + def _get_in_base_domain(self, company_id=False): + domain = [ + ('state', '=', 'done'), + ('location_id.company_id', '=', False), + ('location_dest_id.company_id', '=', company_id or self.env.user.company_id.id) + ] + return domain + + @api.model + def _get_all_base_domain(self, company_id=False): + domain = [ + ('state', '=', 'done'), + '|', + '&', + ('location_id.company_id', '=', False), + ('location_dest_id.company_id', '=', company_id or self.env.user.company_id.id), + '&', + ('location_id.company_id', '=', company_id or self.env.user.company_id.id), + ('location_dest_id.company_id', '=', False) + ] + return domain + + def _get_in_domain(self): + return [('product_id', '=', self.product_id.id)] + self._get_in_base_domain(company_id=self.company_id.id) + + def _get_all_domain(self): + return [('product_id', '=', self.product_id.id)] + self._get_all_base_domain(company_id=self.company_id.id) + + def _is_in(self): + """ Check if the move should be considered as entering the company so that the cost method + will be able to apply the correct logic. + + :return: True if the move is entering the company else False + """ + return not self.location_id.company_id and self.location_dest_id.company_id.id == self.company_id.id - @api.multi - def replay(self): - # Easy scenario: avergae /done - # search last move before this one - start_move = self.search([('product_id', '=', self.product_id.id), - ('state', '=', 'done'), - ('date', '<', self.date)], limit=1, order='date desc') #filter on outgoing/incoming moves - next_moves = self.search([('product_id', '=', self.product_id.id), - ('state', '=', 'done'), - ('date', '>', start_move.date)], order='date') # filter on outgoing/incoming moves - if start_move: - last_cumulated_value = start_move.cumulated_value - last_done_qty_available = start_move.last_done_qty - else: - last_cumulated_value = 0.0 - last_done_qty_available = 0.0 - if self.product_id.cost_method == 'average': - for move in next_moves: - if move.location_id.usage in ('internal', 'transit') and move.location_dest_id.usage not in ('internal', 'transit'): - if last_done_qty_available: - move.value = - ((last_cumulated_value / last_done_qty_available) * move.product_qty) - last_done_qty_available -= move.product_qty - else: - last_done_qty_available += move.product_qty - move.cumulated_value = last_cumulated_value + move.value - last_cumulated_value = move.cumulated_value - move.last_done_qty = last_done_qty_available - - - # FIFO: needs dict with qty_remaining to replay algorithm - - - # update cumulated_value according to value - - # update outs according to values - - # update + def _is_out(self): + """ Check if the move should be considered as leaving the company so that the cost method + will be able to apply the correct logic. + :return: True if the move is leaving the company else False + """ + return self.location_id.company_id.id == self.company_id.id and not self.location_dest_id.company_id @api.multi def action_done(self): - qty_available = {} - for move in self: - #Should write move.price_unit here maybe, certainly on incoming - if move.product_id.cost_method == 'average': - qty_available[move.product_id.id] = move.product_id.qty_available + self.product_price_update_before_done() res = super(StockMove, self).action_done() for move in res: - if move.location_id.usage not in ('internal', 'transit') and move.location_dest_id.usage in ('internal', 'transit'): + if move._is_in(): if move.product_id.cost_method in ['fifo', 'average']: - if not move.price_unit: - move.price_unit = move._get_price_unit() - move.value = move.price_unit * move.product_qty - move.cumulated_value = move.product_id._get_latest_cumulated_value(not_move=move) + move.value - move.remaining_qty = move.product_qty + price_unit = move.price_unit or move.get_price_unit() + value = price_unit * move.product_qty + vals = { + 'price_unit': price_unit, + 'value': value, + 'remaining_value': value, + } if move.product_id.cost_method == 'fifo': - # If you find an out with qty_remaining (because of negative stock), you can change it over there - candidates_out = move.product_id._get_candidates_out_move() - qty_to_take = move.product_qty - for candidate in candidates_out: - if candidate.remaining_qty < qty_to_take: - qty_taken_on_candidate = candidate.remaining_qty - else: - qty_taken_on_candidate = qty_to_take - candidate.remaining_qty -= qty_taken_on_candidate - move.remaining_qty -= qty_taken_on_candidate - qty_to_take -= qty_taken_on_candidate - candidate.value += move.price_unit * qty_taken_on_candidate - candidate.cumulated_value += move.price_unit * qty_taken_on_candidate - candidate._update_future_cumulated_value(move.price_unit * qty_taken_on_candidate) - candidate.price_unit = candidate.value / candidate.product_qty - move.last_done_qty = move.product_id.qty_available - else: - move.price_unit = move.product_id.standard_price - move.value = move.price_unit * move.product_qty - elif move.location_id.usage in ('internal', 'transit') and move.location_dest_id.usage not in ('internal', 'transit'): + vals['remaining_qty'] = move.product_qty + move.write(vals) + else: # standard + move.write({ + 'price_unit': move.product_id.standard_price, + 'value': move.product_id.standard_price * move.product_qty, + }) + elif move._is_out(): if move.product_id.cost_method == 'fifo': - qty_to_take = move.product_qty - tmp_value = 0 - candidates = move.product_id._get_candidates_move() - last_candidate = False + # Find back incoming stock moves (called candidates here) to value this move. + qty_to_take_on_candidates = move.product_qty + candidates = move.product_id._get_fifo_candidates_in_move() + new_standard_price = 0 + tmp_value = 0 # to accumulate the value taken on the candidates for candidate in candidates: - if candidate.remaining_qty <= qty_to_take: + new_standard_price = candidate.price_unit + if candidate.remaining_qty <= qty_to_take_on_candidates: qty_taken_on_candidate = candidate.remaining_qty else: - qty_taken_on_candidate = qty_to_take - tmp_value += qty_taken_on_candidate * candidate.price_unit - candidate.remaining_qty -= qty_taken_on_candidate - qty_to_take -= qty_taken_on_candidate - if qty_to_take == 0: + qty_taken_on_candidate = qty_to_take_on_candidates + + value_taken_on_candidate = qty_taken_on_candidate * candidate.price_unit + candidate_vals = { + 'remaining_qty': candidate.remaining_qty - qty_taken_on_candidate, + 'remaining_value': candidate.remaining_value - value_taken_on_candidate, + } + candidate.write(candidate_vals) + + qty_to_take_on_candidates -= qty_taken_on_candidate + tmp_value += value_taken_on_candidate + if qty_to_take_on_candidates == 0: break - last_candidate = candidate - if last_candidate: - move.last_done_move_id = last_candidate.id - move.last_done_remaining_qty = last_candidate.remaining_qty - if qty_to_take > 0: - move.remaining_qty = qty_to_take # In case there are no candidates to match, put standard price on it - move.value = -tmp_value - move.cumulated_value = move.product_id._get_latest_cumulated_value(not_move=move) + move.value - move.last_done_qty = move.product_id.qty_available - elif move.product_id.cost_method == 'average': + + # Update the standard price with the price of the last used candidate, if any. + if new_standard_price: + move.product_id.standard_price = new_standard_price + + # If there's still quantity to value but we're out of candidates, we fall in the + # negative stock use case. We chose to value the out move at the price of the + # last out and a correction entry will be made once `_fifo_vacuum` is called. + if qty_to_take_on_candidates == 0: + move.write({ + 'value': -tmp_value, # outgoing move are valued negatively + 'price_unit': -tmp_value / move.product_qty, + }) + elif qty_to_take_on_candidates > 0: + last_fifo_price = new_standard_price or move.product_id.standard_price + negative_stock_value = last_fifo_price * -qty_to_take_on_candidates + vals = { + 'remaining_qty': -qty_to_take_on_candidates, + 'remaining_value': negative_stock_value, + 'value': -tmp_value + negative_stock_value, + 'price_unit': (-tmp_value + negative_stock_value) / move.product_qty, + } + move.write(vals) + elif move.product_id.cost_method in ['standard', 'average']: curr_rounding = move.company_id.currency_id.rounding - avg_price_unit = float_round(move.product_id._get_latest_cumulated_value(not_move=move) / qty_available[move.product_id.id], precision_rounding=curr_rounding) - move.value = float_round(-avg_price_unit * move.product_qty, precision_rounding=curr_rounding) - move.remaining_qty = 0 - move.cumulated_value = move.product_id._get_latest_cumulated_value(not_move=move) + move.value - move.last_done_qty = move.product_id.qty_available - elif move.product_id.cost_method == 'standard': - move.value = - move.product_id.standard_price * move.product_qty - + value = -float_round(move.product_id.standard_price * move.product_qty, precision_rounding=curr_rounding) + move.write({ + 'value': value, + 'price_unit': value / move.product_qty, + }) for move in res.filtered(lambda m: m.product_id.valuation == 'real_time'): move._account_entry_move() return res @api.multi + def product_price_update_before_done(self): + tmpl_dict = defaultdict(lambda: 0.0) + # adapt standard price on incomming moves if the product cost_method is 'average' + std_price_update = {} + for move in self.filtered(lambda move: move.location_id.usage in ('supplier', 'production') and move.product_id.cost_method == 'average'): + product_tot_qty_available = move.product_id.qty_available + tmpl_dict[move.product_id.id] + + if product_tot_qty_available == 0: + new_std_price = move.get_price_unit() + else: + # Get the standard price + amount_unit = std_price_update.get((move.company_id.id, move.product_id.id)) or move.product_id.standard_price + new_std_price = ((amount_unit * product_tot_qty_available) + (move.get_price_unit() * move.product_qty)) / (product_tot_qty_available + move.product_qty) + + tmpl_dict[move.product_id.id] += move.product_qty + # Write the standard price, as SUPERUSER_ID because a warehouse manager may not have the right to write on products + move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': new_std_price}) + std_price_update[move.company_id.id, move.product_id.id] = new_std_price + + @api.model + def _fifo_vacuum(self): + """ Every moves that need to be fixed are identifiable by having a negative `remaining_qty`. + """ + # FIXME: sort by date (does filtered lose the order?) + for move in self.filtered(lambda m: (m._is_in() or m._is_out()) and m.remaining_qty < 0): + domain = [ + '|', + ('date', '>', move.date), + '&', + ('date', '=', move.date), + ('id', '>', move.id) + ] + domain += self._get_in_domain() + candidates = self.search(domain, order='date, id') + if not candidates: + return + qty_to_take_on_candidates = abs(move.remaining_qty) + tmp_value = 0 + for candidate in candidates: + if candidate.remaining_qty <= qty_to_take_on_candidates: + qty_taken_on_candidate = candidate.remaining_qty + else: + qty_taken_on_candidate = qty_to_take_on_candidates + + value_taken_on_candidate = qty_taken_on_candidate * candidate.price_unit + candidate_vals = { + 'remaining_qty': candidate.remaining_qty - qty_taken_on_candidate, + 'remaining_value': candidate.remaining_value - value_taken_on_candidate, + } + candidate.write(candidate_vals) + + qty_to_take_on_candidates -= qty_taken_on_candidate + tmp_value += value_taken_on_candidate + if qty_to_take_on_candidates == 0: + break + + corrected_value = move.remaining_value + tmp_value + if move.product_id.valuation == 'real_time': + if move._is_in(): + # If we just compensated an IN move that has a negative remaining + # quantity, it means the move has returned more items than it received. + # The correction should behave as a return too. As `_account_entry_move` + # will post the natural values for an IN move (credit IN account, debit + # OUT one), we inverse the sign to create the correct entries. + move.with_context(force_valuation_amount=-corrected_value)._account_entry_move() + else: + move.with_context(force_valuation_amount=corrected_value)._account_entry_move() + + if qty_to_take_on_candidates == 0: + move.write({ + 'value': move.value - corrected_value, + 'remaining_value': 0, + 'remaining_qty': 0, + }) + elif qty_to_take_on_candidates > 0: + # It's possible that `remaining_value` is equals to 0 even if the move needs to be + # compensated (negative stock for the first ever out in FIFO). + move.write({ + 'value': move.value - corrected_value, + 'remaining_value': 0 if not move.remaining_value else move.remaining_value + corrected_value, + 'remaining_qty': -qty_to_take_on_candidates, + }) + + @api.multi def _get_accounting_data_for_valuation(self): """ Return the accounts and journal to use to post Journal Entries for the real-time valuation of the quant. """ @@ -344,7 +431,9 @@ class StockMove(models.Model): 'journal_id': journal_id, 'line_ids': move_lines, 'date': date, - 'ref': self.picking_id.name}) + 'ref': self.picking_id.name, + 'stock_move_id': self.id, + }) new_account_move.post() def _account_entry_move(self): diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py index 7cb07ada7f1..fd50a6aef98 100644 --- a/addons/stock_account/tests/test_stockvaluation.py +++ b/addons/stock_account/tests/test_stockvaluation.py @@ -17,7 +17,657 @@ class TestStockValuation(TransactionCase): 'categ_id': self.env.ref('product.product_category_all').id, }) + self.product1.product_tmpl_id.valuation = 'real_time' + Account = self.env['account.account'] + self.stock_input_account = Account.create({ + 'name': 'Stock Input', + 'code': 'StockIn', + 'user_type_id': self.env.ref('account.data_account_type_current_assets').id, + }) + self.stock_output_account = Account.create({ + 'name': 'Stock Output', + 'code': 'StockOut', + 'user_type_id': self.env.ref('account.data_account_type_current_assets').id, + }) + self.stock_valuation_account = Account.create({ + 'name': 'Stock Valuation', + 'code': 'Stock Valuation', + 'user_type_id': self.env.ref('account.data_account_type_current_assets').id, + }) + self.stock_journal = self.env['account.journal'].create({ + 'name': 'Stock Journal', + 'code': 'STJTEST', + 'type': 'general', + }) + self.product1.categ_id.write({ + 'property_stock_account_input_categ_id': self.stock_input_account.id, + 'property_stock_account_output_categ_id': self.stock_output_account.id, + 'property_stock_valuation_account_id': self.stock_valuation_account.id, + 'property_stock_journal': self.stock_journal.id, + }) + self.product1.categ_id.write({ + 'property_stock_account_input_categ_id': self.stock_input_account.id, + 'property_stock_account_output_categ_id': self.stock_output_account.id, + 'property_stock_valuation_account_id': self.stock_valuation_account.id, + 'property_stock_journal': self.stock_journal.id, + }) + + def _get_stock_input_move_lines(self): + return self.env['account.move.line'].search([ + ('product_id', '=', self.product1.id), + ('account_id', '=', self.stock_input_account.id), + ], order='date, id') + + def _get_stock_output_move_lines(self): + return self.env['account.move.line'].search([ + ('product_id', '=', self.product1.id), + ('account_id', '=', self.stock_output_account.id), + ], order='date, id') + + def _get_stock_valuation_move_lines(self): + return self.env['account.move.line'].search([ + ('product_id', '=', self.product1.id), + ('account_id', '=', self.stock_valuation_account.id), + ], order='date, id') + def test_fifo_perpetual_1(self): + self.product1.product_tmpl_id.cost_method = 'fifo' + + # --------------------------------------------------------------------- + # receive 10 units @ 10.00 per unit + # --------------------------------------------------------------------- + move1 = self.env['stock.move'].create({ + 'name': 'IN 10 units @ 10.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10.0, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10.0 + move1.action_done() + + # stock_account values for move1 + self.assertEqual(move1.product_uom_qty, 10.0) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 10.0) + self.assertEqual(move1.value, 100.0) + self.assertEqual(move1.remaining_value, 100.0) + + # account values for move1 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 1) + move1_input_aml = input_aml[-1] + self.assertEqual(move1_input_aml.debit, 0) + self.assertEqual(move1_input_aml.credit, 100) + + valuation_aml = self._get_stock_valuation_move_lines() + move1_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 1) + self.assertEqual(move1_valuation_aml.debit, 100) + self.assertEqual(move1_valuation_aml.credit, 0) + + output_aml = self._get_stock_output_move_lines() + self.assertEqual(len(output_aml), 0) + + # link between stock move and account move + self.assertEqual(len(move1.account_move_ids), 1) + self.assertTrue(set(move1.account_move_ids.line_ids.ids) == {move1_valuation_aml.id, move1_input_aml.id}) + + # --------------------------------------------------------------------- + # receive 10 units @ 8.00 per unit + # --------------------------------------------------------------------- + move2 = self.env['stock.move'].create({ + 'name': 'IN 10 units @ 8.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 8.0, + }) + move2.action_confirm() + move2.action_assign() + move2.move_line_ids.qty_done = 10.0 + move2.action_done() + + # stock_account values for move2 + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 10.0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 80.0) + + # account values for move2 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 2) + move2_input_aml = input_aml[-1] + self.assertEqual(move2_input_aml.debit, 0) + self.assertEqual(move2_input_aml.credit, 80) + + valuation_aml = self._get_stock_valuation_move_lines() + move2_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 2) + self.assertEqual(move2_valuation_aml.debit, 80) + self.assertEqual(move2_valuation_aml.credit, 0) + + output_aml = self._get_stock_output_move_lines() + self.assertEqual(len(output_aml), 0) + + # link between stock move and account move + self.assertEqual(len(move2.account_move_ids), 1) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + + # older moves + self.assertEqual(move1.product_uom_qty, 10.0) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 10.0) + self.assertEqual(move1.value, 100.0) + self.assertEqual(move1.remaining_value, 100.0) + self.assertEqual(len(move1.account_move_ids), 1) + self.assertTrue(set(move1.account_move_ids.line_ids.ids) == {move1_valuation_aml.id, move1_input_aml.id}) + + # --------------------------------------------------------------------- + # sale 3 units + # --------------------------------------------------------------------- + move3 = self.env['stock.move'].create({ + 'name': 'Sale 3 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 3.0, + }) + move3.action_confirm() + move3.action_assign() + move3.move_line_ids.qty_done = 3.0 + move3.action_done() + + # stock_account values for move3 + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) # unused in out move + self.assertEqual(move3.value, -30.0) # took 3 items from move 1 @ 10.00 per unit + self.assertEqual(move3.remaining_value, 0.0) # took 3 items from move 1 @ 10.00 per unit + + # account values for move3 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 2) + + valuation_aml = self._get_stock_valuation_move_lines() + move3_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 3) + self.assertEqual(move3_valuation_aml.debit, 0) + self.assertEqual(move3_valuation_aml.credit, 30) + + output_aml = self._get_stock_output_move_lines() + move3_output_aml = output_aml[-1] + self.assertEqual(len(output_aml), 1) + self.assertEqual(move3_output_aml.debit, 30) + self.assertEqual(move3_output_aml.credit, 0) + + # link between stock move and account move + self.assertEqual(len(move3.account_move_ids), 1) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + + # older moves + self.assertEqual(move1.product_uom_qty, 10.0) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 7) + self.assertEqual(move1.remaining_value, 70) + self.assertEqual(move1.value, 100.0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 10.0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 80.0) + self.assertTrue(set(move1.account_move_ids.line_ids.ids) == {move1_valuation_aml.id, move1_input_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + + # --------------------------------------------------------------------- + # Increase received quantity of move1 from 10 to 12, it should updates + # the remaining quantity, the value and remaining value on this move + # without impacting any of the next ones. + # --------------------------------------------------------------------- + move1.quantity_done = 12 + + # stock_account values for move3 + self.assertEqual(move1.product_uom_qty, 12.0) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 9.0) + self.assertEqual(move1.value, 120.0) + self.assertEqual(move1.remaining_value, 90.0) + + # account values for move1 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 3) + move1_correction_input_aml = input_aml[-1] + self.assertEqual(move1_correction_input_aml.debit, 0) + self.assertEqual(move1_correction_input_aml.credit, 20) + + valuation_aml = self._get_stock_valuation_move_lines() + move1_correction_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 4) + self.assertEqual(move1_correction_valuation_aml.debit, 20) + self.assertEqual(move1_correction_valuation_aml.credit, 0) + + output_aml = self._get_stock_output_move_lines() + self.assertEqual(len(output_aml), 1) + + # link between stock move and account move + self.assertEqual(len(move1.account_move_ids), 2) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + + # older moves + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 10.0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 80.0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + + # --------------------------------------------------------------------- + # Sale 9 units, the units available from the previous increase are sent + # immediately. + # --------------------------------------------------------------------- + move4 = self.env['stock.move'].create({ + 'name': 'Sale 9 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 9.0, + }) + move4.action_confirm() + move4.action_assign() + move4.move_line_ids.qty_done = 9.0 + move4.action_done() + + # stock_account values for move4 + self.assertEqual(move4.product_uom_qty, 9.0) + self.assertEqual(move4.remaining_qty, 0.0) # unused in out move + self.assertEqual(move4.value, -90.0) # took 9 items from move 1 @ 10.00 per unit + self.assertEqual(move4.remaining_value, 0.0) # took 3 items from move 1 @ 10.00 per unit + + # account values for move4 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 3) + + valuation_aml = self._get_stock_valuation_move_lines() + move4_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 5) + self.assertEqual(move4_valuation_aml.debit, 0) + self.assertEqual(move4_valuation_aml.credit, 90) + + output_aml = self._get_stock_output_move_lines() + move4_output_aml = output_aml[-1] + self.assertEqual(len(output_aml), 2) + self.assertEqual(move4_output_aml.debit, 90) + self.assertEqual(move4_output_aml.credit, 0) + + # link between stock move and account move + self.assertEqual(len(move4.account_move_ids), 1) + self.assertTrue(set(move4.account_move_ids.line_ids.ids) == {move4_valuation_aml.id, move4_output_aml.id}) + + # older moves + self.assertEqual(move1.product_uom_qty, 12) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move1.value, 120) + self.assertEqual(move1.remaining_value, 0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 10.0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 80.0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + + # --------------------------------------------------------------------- + # Sale 20 units, we fall in negative stock for 10 units. Theses are + # valued at the last FIFO cost and the total is negative. + # --------------------------------------------------------------------- + move5 = self.env['stock.move'].create({ + 'name': 'Sale 20 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 20.0, + }) + move5.action_confirm() + move5.action_assign() + move5.move_line_ids.qty_done = 20.0 + move5.action_done() + + # stock_account values for move5 + self.assertEqual(move5.product_uom_qty, 20.0) + self.assertEqual(move5.remaining_qty, -10.0) + self.assertEqual(move5.value, -160.0) + self.assertEqual(move5.remaining_value, -80.0) + + # account values for move5 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 3) + + valuation_aml = self._get_stock_valuation_move_lines() + move5_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 6) + self.assertEqual(move5_valuation_aml.debit, 0) + self.assertEqual(move5_valuation_aml.credit, 160) + + output_aml = self._get_stock_output_move_lines() + move5_output_aml = output_aml[-1] + self.assertEqual(len(output_aml), 3) + self.assertEqual(move5_output_aml.debit, 160) + self.assertEqual(move5_output_aml.credit, 0) + + # link between stock move and account move + self.assertEqual(len(move5.account_move_ids), 1) + self.assertTrue(set(move5.account_move_ids.line_ids.ids) == {move5_valuation_aml.id, move5_output_aml.id}) + + # older moves + self.assertEqual(move1.product_uom_qty, 12) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move1.value, 120) + self.assertEqual(move1.remaining_value, 0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertEqual(move4.product_uom_qty, 9.0) + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move4.value, -90.0) + self.assertEqual(move4.remaining_value, 0) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + self.assertTrue(set(move4.account_move_ids.line_ids.ids) == {move4_valuation_aml.id, move4_output_aml.id}) + + # --------------------------------------------------------------------- + # Receive 10 units @ 12.00 to counterbalance the negative, we do not do + # the operation right now. + # --------------------------------------------------------------------- + move6 = self.env['stock.move'].create({ + 'name': 'IN 10 units @ 12.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 12.0, + }) + move6.action_confirm() + move6.action_assign() + move6.move_line_ids.qty_done = 10.0 + move6.action_done() + + # stock_account values for move6 + self.assertEqual(move6.product_uom_qty, 10) + self.assertEqual(move6.price_unit, 12.0) + self.assertEqual(move6.remaining_qty, 10.0) + self.assertEqual(move6.value, 120) + self.assertEqual(move6.remaining_value, 120) + + # account values for move6 + input_aml = self._get_stock_input_move_lines() + move6_input_aml = input_aml[-1] + self.assertEqual(len(input_aml), 4) + self.assertEqual(move6_input_aml.debit, 0) + self.assertEqual(move6_input_aml.credit, 120) + + valuation_aml = self._get_stock_valuation_move_lines() + move6_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 7) + self.assertEqual(move6_valuation_aml.debit, 120) + self.assertEqual(move6_valuation_aml.credit, 0) + + output_aml = self._get_stock_output_move_lines() + self.assertEqual(len(output_aml), 3) + + # link between stock move and account move + self.assertEqual(len(move6.account_move_ids), 1) + self.assertTrue(set(move6.account_move_ids.line_ids.ids) == {move6_valuation_aml.id, move6_input_aml.id}) + + # older moves + self.assertEqual(move1.product_uom_qty, 12) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move1.value, 120) + self.assertEqual(move1.remaining_value, 0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertEqual(move4.product_uom_qty, 9.0) + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move4.value, -90.0) + self.assertEqual(move4.remaining_value, 0) + self.assertEqual(move5.product_uom_qty, 20.0) + self.assertEqual(move5.remaining_qty, -10.0) + self.assertEqual(move5.value, -160.0) + self.assertEqual(move5.remaining_value, -80.0) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + self.assertTrue(set(move4.account_move_ids.line_ids.ids) == {move4_valuation_aml.id, move4_output_aml.id}) + self.assertTrue(set(move5.account_move_ids.line_ids.ids) == {move5_valuation_aml.id, move5_output_aml.id}) + + # --------------------------------------------------------------------- + # Vacuum is called, we cleanup the negatives. + # --------------------------------------------------------------------- + move5._fifo_vacuum() + + # account values after vacuum + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 4) + + valuation_aml = self._get_stock_valuation_move_lines() + vacuum_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 8) + self.assertEqual(vacuum_valuation_aml.balance, -40) + + output_aml = self._get_stock_output_move_lines() + vacuum_output_aml = output_aml[-1] + self.assertEqual(len(output_aml), 4) + self.assertEqual(vacuum_output_aml.balance, 40) + + # stock_account values + self.assertEqual(move1.product_uom_qty, 12) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move1.value, 120) + self.assertEqual(move1.remaining_value, 0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertEqual(move4.product_uom_qty, 9.0) + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move4.value, -90.0) + self.assertEqual(move4.remaining_value, 0) + self.assertEqual(move5.product_uom_qty, 20.0) + self.assertEqual(move5.remaining_qty, 0.0) + self.assertEqual(move5.value, -200.0) + self.assertEqual(move5.remaining_value, 0.0) + self.assertEqual(move6.product_uom_qty, 10) + self.assertEqual(move6.price_unit, 12.0) + self.assertEqual(move6.remaining_qty, 0.0) + self.assertEqual(move6.value, 120) + self.assertEqual(move6.remaining_value, 0) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + self.assertTrue(set(move4.account_move_ids.line_ids.ids) == {move4_valuation_aml.id, move4_output_aml.id}) + # a new account move was created for move 5, to compensate the negative stock we had + move5_correction_account_move = self.env['account.move'].browse(max(move5.account_move_ids.ids)) + move5_correction_output_aml = move5_correction_account_move.line_ids.filtered(lambda ml: ml.account_id == self.stock_output_account) + self.assertEqual(move5_correction_output_aml.debit, 40) + self.assertEqual(move5_correction_output_aml.credit, 0) + move5_correction_valuation_aml = move5_correction_account_move.line_ids.filtered(lambda ml: ml.account_id == self.stock_valuation_account) + self.assertEqual(move5_correction_valuation_aml.debit, 0) + self.assertEqual(move5_correction_valuation_aml.credit, 40) + self.assertTrue(set(move5.account_move_ids.mapped('line_ids').ids) == {move5_valuation_aml.id, move5_output_aml.id, move5_correction_output_aml.id, move5_correction_valuation_aml.id}) + self.assertTrue(set(move6.account_move_ids.line_ids.ids) == {move6_valuation_aml.id, move6_input_aml.id}) + + # --------------------------------------------------------------------- + # Edit move6, receive less + # --------------------------------------------------------------------- + move6.quantity_done = 8 + + # stock_account values for move6 + self.assertEqual(move6.product_uom_qty, 8) + self.assertEqual(move6.price_unit, 12) + self.assertEqual(move6.remaining_qty, -2) + self.assertEqual(move6.value, 96) + self.assertEqual(move6.remaining_value, -24) + + # account values for move1 + input_aml = self._get_stock_input_move_lines() + move6_correction_input_aml = input_aml[-1] + self.assertEqual(move6_correction_input_aml.debit, 24) + self.assertEqual(move6_correction_input_aml.credit, 0) + + valuation_aml = self._get_stock_valuation_move_lines() + move6_correction_valuation_aml = valuation_aml[-1] + self.assertEqual(move6_correction_valuation_aml.debit, 0) + self.assertEqual(move6_correction_valuation_aml.credit, 24) + + # link between stock move and account move + self.assertEqual(len(move6.account_move_ids), 2) + self.assertTrue(set(move6.account_move_ids.mapped('line_ids').ids) == {move6_input_aml.id, move6_valuation_aml.id, move6_correction_input_aml.id, move6_correction_valuation_aml.id}) + + # ----------------------------------------------------------- + # receive 4, do not counterbalance now + # ----------------------------------------------------------- + move7 = self.env['stock.move'].create({ + 'name': 'IN 4 units @ 15.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 4.0, + 'price_unit': 15.0, + }) + move7.action_confirm() + move7.action_assign() + move7.move_line_ids.qty_done = 4.0 + move7.action_done() + + # stock_account values for move1 + self.assertEqual(move7.product_uom_qty, 4.0) + self.assertEqual(move7.price_unit, 15.0) + self.assertEqual(move7.remaining_qty, 4.0) + self.assertEqual(move7.value, 60.0) + self.assertEqual(move7.remaining_value, 60.0) + + # account values for move7 + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 6) + move7_input_aml = input_aml[-1] + self.assertEqual(move7_input_aml.debit, 0) + self.assertEqual(move7_input_aml.credit, 60) + + valuation_aml = self._get_stock_valuation_move_lines() + move7_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 10) + self.assertEqual(move7_valuation_aml.debit, 60) + self.assertEqual(move7_valuation_aml.credit, 0) + + # link between stock move and account move + self.assertEqual(len(move7.account_move_ids), 1) + self.assertTrue(set(move7.account_move_ids.line_ids.ids) == {move7_valuation_aml.id, move7_input_aml.id}) + + # ----------------------------------------------------------- + # vacuum, compensate in + # ----------------------------------------------------------- + move6._fifo_vacuum() + + # account values after vacuum + input_aml = self._get_stock_input_move_lines() + self.assertEqual(len(input_aml), 7) + move6_correction2_input_aml = input_aml[-1] + self.assertEqual(move6_correction2_input_aml.debit, 6) + self.assertEqual(move6_correction2_input_aml.credit, 0) + + valuation_aml = self._get_stock_valuation_move_lines() + move6_correction2_valuation_aml = valuation_aml[-1] + self.assertEqual(len(valuation_aml), 11) + self.assertEqual(move6_correction2_valuation_aml.debit, 0) + self.assertEqual(move6_correction2_valuation_aml.credit, 6) + + # stock_account values + self.assertEqual(move1.product_uom_qty, 12) + self.assertEqual(move1.price_unit, 10.0) + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move1.value, 120) + self.assertEqual(move1.remaining_value, 0) + self.assertEqual(move2.product_uom_qty, 10.0) + self.assertEqual(move2.price_unit, 8.0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move2.value, 80.0) + self.assertEqual(move2.remaining_value, 0) + self.assertEqual(move3.product_uom_qty, 3.0) + self.assertEqual(move3.remaining_qty, 0.0) + self.assertEqual(move3.value, -30.0) + self.assertEqual(move3.remaining_value, 0.0) + self.assertEqual(move4.product_uom_qty, 9.0) + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move4.value, -90.0) + self.assertEqual(move4.remaining_value, 0) + self.assertEqual(move5.product_uom_qty, 20.0) + self.assertEqual(move5.remaining_qty, 0.0) + self.assertEqual(move5.value, -200.0) + self.assertEqual(move5.remaining_value, 0.0) + self.assertEqual(move6.product_uom_qty, 8) + self.assertEqual(move6.price_unit, 12.0) + self.assertEqual(move6.remaining_qty, 0.0) + self.assertEqual(move6.value, 90) + self.assertEqual(move6.remaining_value, 0) + self.assertTrue(set(move1.account_move_ids.mapped('line_ids').ids) == {move1_input_aml.id, move1_valuation_aml.id, move1_correction_input_aml.id, move1_correction_valuation_aml.id}) + self.assertTrue(set(move2.account_move_ids.line_ids.ids) == {move2_valuation_aml.id, move2_input_aml.id}) + self.assertTrue(set(move3.account_move_ids.line_ids.ids) == {move3_valuation_aml.id, move3_output_aml.id}) + self.assertTrue(set(move4.account_move_ids.line_ids.ids) == {move4_valuation_aml.id, move4_output_aml.id}) + # a new account move was created for move 5, to compensate the negative stock we had + move5_correction_account_move = self.env['account.move'].browse(max(move5.account_move_ids.ids)) + move5_correction_output_aml = move5_correction_account_move.line_ids.filtered(lambda ml: ml.account_id == self.stock_output_account) + self.assertEqual(move5_correction_output_aml.debit, 40) + self.assertEqual(move5_correction_output_aml.credit, 0) + move5_correction_valuation_aml = move5_correction_account_move.line_ids.filtered(lambda ml: ml.account_id == self.stock_valuation_account) + self.assertEqual(move5_correction_valuation_aml.debit, 0) + self.assertEqual(move5_correction_valuation_aml.credit, 40) + self.assertTrue(set(move5.account_move_ids.mapped('line_ids').ids) == {move5_valuation_aml.id, move5_output_aml.id, move5_correction_output_aml.id, move5_correction_valuation_aml.id}) + self.assertTrue(set(move6.account_move_ids.mapped('line_ids').ids) == {move6_valuation_aml.id, move6_input_aml.id, move6_correction_input_aml.id, move6_correction_valuation_aml.id, move6_correction2_input_aml.id, move6_correction2_valuation_aml.id}) + + def test_fifo_perpetual_2(self): # http://accountingexplained.com/financial/inventories/fifo-method self.product1.product_tmpl_id.cost_method = 'fifo' @@ -37,7 +687,6 @@ class TestStockValuation(TransactionCase): move1.action_done() self.assertEqual(move1.value, 1020.0) - self.assertEqual(move1.cumulated_value, 1020.0) self.assertEqual(move1.remaining_qty, 68.0) @@ -57,7 +706,6 @@ class TestStockValuation(TransactionCase): move2.action_done() self.assertEqual(move2.value, 2170.0) - self.assertEqual(move2.cumulated_value, 3190.0) self.assertEqual(move1.remaining_qty, 68.0) self.assertEqual(move2.remaining_qty, 140.0) @@ -76,12 +724,10 @@ class TestStockValuation(TransactionCase): move3.move_line_ids.qty_done = 94.0 move3.action_done() - self.assertEqual(move3.price_unit, 0.0) # unused in out moves # note: it' ll have to get 68 units from the first batch and 26 from the second one # so its value should be -((68*15) + (26*15.5)) = -1423 self.assertEqual(move3.value, -1423.0) - self.assertEqual(move3.cumulated_value, 1767.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 114) @@ -103,7 +749,6 @@ class TestStockValuation(TransactionCase): move4.action_done() self.assertEqual(move4.value, 640.0) - self.assertEqual(move4.cumulated_value, 2407.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 114) @@ -126,7 +771,6 @@ class TestStockValuation(TransactionCase): move5.action_done() self.assertEqual(move5.value, 1287.0) - self.assertEqual(move5.cumulated_value, 3694.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 114) @@ -151,7 +795,6 @@ class TestStockValuation(TransactionCase): # note: it' ll have to get 114 units from the move2 and 2 from move4 # so its value should be -((114*15.5) + (2*16)) = 1735 self.assertEqual(move6.value, -1799.0) - self.assertEqual(move6.cumulated_value, 1895.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 0) @@ -177,7 +820,6 @@ class TestStockValuation(TransactionCase): # note: it' ll have to get 38 units from the move4 and 24 from move5 # so its value should be -((38*16) + (24*16.5)) = 608 + 396 self.assertEqual(move7.value, -1004.0) - self.assertEqual(move7.cumulated_value, 891.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 0) @@ -187,8 +829,64 @@ class TestStockValuation(TransactionCase): self.assertEqual(move6.remaining_qty, 0.0) # unused in out moves self.assertEqual(move7.remaining_qty, 0.0) # unused in out moves - def test_fifo_perpetual_2(self): - # https://docs.google.com/spreadsheets/d/1NI0u9N1gFByXxYHfdiXuxQCrycXXOh76TpPQ3CWeyDw/edit?ts=58da749b#gid=0 + # send 10 units in our transit location, the valorisation should not be impacted + transit_location = self.env['stock.location'].search([ + ('company_id', '=', self.env.user.company_id.id), + ('usage', '=', 'transit'), + ], limit=1) + move8 = self.env['stock.move'].create({ + 'name': 'Send 10 units in transit', + 'location_id': self.stock_location.id, + 'location_dest_id': transit_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move8.action_confirm() + move8.action_assign() + move8.move_line_ids.qty_done = 10.0 + move8.action_done() + + self.assertEqual(move8.value, 0.0) + + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move3.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move5.remaining_qty, 54.0) + self.assertEqual(move6.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move7.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move8.remaining_qty, 0.0) # unused in internal moves + + # Sale 10 units @ 16.5 per unit + move9 = self.env['stock.move'].create({ + 'name': 'Sale 10 units @ 16.5 per unit', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move9.action_confirm() + move9.action_assign() + move9.move_line_ids.qty_done = 10.0 + move9.action_done() + + # note: it' ll have to get 10 units from move5 so its value should + # be -(10*16.50) = -165 + self.assertEqual(move9.value, -165.0) + + self.assertEqual(move1.remaining_qty, 0) + self.assertEqual(move2.remaining_qty, 0) + self.assertEqual(move3.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move4.remaining_qty, 0.0) + self.assertEqual(move5.remaining_qty, 44.0) + self.assertEqual(move6.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move7.remaining_qty, 0.0) # unused in out moves + self.assertEqual(move8.remaining_qty, 0.0) # unused in internal moves + self.assertEqual(move9.remaining_qty, 0.0) # unused in out moves + + def test_fifo_perpetual_3(self): self.product1.cost_method = 'fifo' # in 10 @ 100 @@ -207,7 +905,6 @@ class TestStockValuation(TransactionCase): move1.action_done() self.assertEqual(move1.value, 1000.0) - self.assertEqual(move1.cumulated_value, 1000.0) self.assertEqual(move1.remaining_qty, 10.0) @@ -227,7 +924,6 @@ class TestStockValuation(TransactionCase): move2.action_done() self.assertEqual(move2.value, 800.0) - self.assertEqual(move2.cumulated_value, 1800.0) self.assertEqual(move1.remaining_qty, 10.0) self.assertEqual(move2.remaining_qty, 10.0) @@ -246,12 +942,10 @@ class TestStockValuation(TransactionCase): move3.move_line_ids.qty_done = 15.0 move3.action_done() - self.assertEqual(move3.price_unit, 0.0) # unused in out moves # note: it' ll have to get 10 units from move1 and 5 from move2 # so its value should be -((10*100) + (5*80)) = -1423 self.assertEqual(move3.value, -1400.0) - self.assertEqual(move3.cumulated_value, 400.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 5) @@ -273,7 +967,6 @@ class TestStockValuation(TransactionCase): move4.action_done() self.assertEqual(move4.value, 300.0) - self.assertEqual(move4.cumulated_value, 700.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 5) @@ -297,7 +990,6 @@ class TestStockValuation(TransactionCase): # note: it' ll have to get 5 units from the move2 and 2 from move4 # so its value should be -((5*80) + (2*60)) = 520 self.assertEqual(move5.value, -520.0) - self.assertEqual(move5.cumulated_value, 180.0) self.assertEqual(move1.remaining_qty, 0) self.assertEqual(move2.remaining_qty, 0) @@ -305,9 +997,134 @@ class TestStockValuation(TransactionCase): self.assertEqual(move4.remaining_qty, 3.0) self.assertEqual(move5.remaining_qty, 0.0) # unused in out moves + def test_fifo_negative_1(self): + self.product1.product_tmpl_id.cost_method = 'fifo' + move1 = self.env['stock.move'].create({ + 'name': '50 out', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 50.0, + 'price_unit': 0, + 'move_line_ids': [(0, 0, { + 'product_id': self.product1.id, + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_uom_id': self.uom_unit.id, + 'qty_done': 50.0, + })] + }) + move1.action_confirm() + move1.action_done() + + self.assertEqual(move1.value, 0.0) + # normally unused in out moves, but as it moved negative stock we mark it + self.assertEqual(move1.remaining_qty, -50.0) + + move2 = self.env['stock.move'].create({ + 'name': '40 in @15', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 40.0, + 'price_unit': 15.0, + 'move_line_ids': [(0, 0, { + 'product_id': self.product1.id, + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_uom_id': self.uom_unit.id, + 'qty_done': 40.0, + })] + }) + move2.action_confirm() + move2.action_done() + + move1._fifo_vacuum() + + self.assertEqual(move1.value, -600.0) + self.assertEqual(move1.remaining_qty, -10.0) + self.assertEqual(move2.value, 600.0) + self.assertEqual(move2.remaining_qty, 0.0) + + move3 = self.env['stock.move'].create({ + 'name': '20 in @25', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 20.0, + 'price_unit': 25.0, + 'move_line_ids': [(0, 0, { + 'product_id': self.product1.id, + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_uom_id': self.uom_unit.id, + 'qty_done': 20.0 + })] + }) + move3.action_confirm() + move3.action_done() + + move1._fifo_vacuum() + + self.assertEqual(move1.value, -850.0) + self.assertEqual(move1.remaining_qty, 0.0) + self.assertEqual(move2.value, 600.0) + self.assertEqual(move2.remaining_qty, 0.0) + self.assertEqual(move3.value, 500.0) + self.assertEqual(move3.remaining_qty, 10.0) + + def test_fifo_negative_2(self): + """ Receives 10 units, send more, the extra quantity should be valued at the last fifo + price, running the vacuum should not do anything. + """ + self.product1.product_tmpl_id.cost_method = 'fifo' + + move1 = self.env['stock.move'].create({ + 'name': '10 in', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + 'move_line_ids': [(0, 0, { + 'product_id': self.product1.id, + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_uom_id': self.uom_unit.id, + 'qty_done': 10.0, + })] + }) + move1.action_confirm() + move1.action_done() + + move2 = self.env['stock.move'].create({ + 'name': '10 in', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 12.0, + 'price_unit': 0, + 'move_line_ids': [(0, 0, { + 'product_id': self.product1.id, + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_uom_id': self.uom_unit.id, + 'qty_done': 12.0, + })] + }) + move2.action_confirm() + move2.action_done() + + move2._fifo_vacuum() + self.assertEqual(len(move2.account_move_ids), 1) + def test_average_perpetual_1(self): # http://accountingexplained.com/financial/inventories/avco-method - self.product1.product_tmpl_id.cost_method = 'average' # Beginning Inventory: 60 units @ 15.00 per unit @@ -326,9 +1143,7 @@ class TestStockValuation(TransactionCase): move1.action_done() self.assertEqual(move1.value, 900.0) - self.assertEqual(move1.cumulated_value, 900.0) - - self.assertEqual(move1.remaining_qty, 60.0) + self.assertEqual(move1.remaining_qty, 0.0) # unusedin average move # Purchase 140 units @ 15.50 per unit move2 = self.env['stock.move'].create({ @@ -346,9 +1161,8 @@ class TestStockValuation(TransactionCase): move2.action_done() self.assertEqual(move2.value, 2170.0) - self.assertEqual(move2.cumulated_value, 3070.0) - # Sale 190 units @ 15.00 per unit + # Sale 190 units @ 15.35 per unit move3 = self.env['stock.move'].create({ 'name': 'Sale 190 units @ 19.00 per unit', 'location_id': self.stock_location.id, @@ -362,10 +1176,8 @@ class TestStockValuation(TransactionCase): move3.move_line_ids.qty_done = 190.0 move3.action_done() - self.assertEqual(move3.price_unit, 0.0) # unused in out moves self.assertEqual(move3.value, -2916.5) - self.assertEqual(move3.cumulated_value, 153.5) # Purchase 70 units @ $16.00 per unit move4 = self.env['stock.move'].create({ @@ -383,7 +1195,6 @@ class TestStockValuation(TransactionCase): move4.action_done() self.assertEqual(move4.value, 1120.0) - self.assertEqual(move4.cumulated_value, 1273.5) # Sale 30 units @ $19.50 per unit move5 = self.env['stock.move'].create({ @@ -400,6 +1211,300 @@ class TestStockValuation(TransactionCase): move5.action_done() self.assertEqual(move5.value, -477.6) - self.assertEqual(move5.cumulated_value, 795.9) # fuck you, rounding - # self.assertEqual(move5.cumulated_value, 796) + def test_average_negative_1(self): + """ Send goods that you don't have in stock and never received any unit. + """ + self.product1.product_tmpl_id.cost_method = 'average' + + # set a standard price + self.product1.standard_price = 99 + + # send 10 units that we do not have + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0) + move1 = self.env['stock.move'].create({ + 'name': 'test_average_negative_1', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move1.action_confirm() + move1.force_assign() + move1.quantity_done = 10.0 + move1.action_done() + self.assertEqual(move1.value, -990.0) # as no move out were done for this product, fallback on the standard price + self.assertEqual(move1.remaining_qty, 0.0) # unused in average move + + def test_average_negative_2(self): + """ Send goods that you don't have in stock but received and send some units before. + """ + self.product1.product_tmpl_id.cost_method = 'average' + + # set a standard price + self.product1.standard_price = 99 + + # Receives 10 produts at 10 + move1 = self.env['stock.move'].create({ + 'name': '68 units @ 15.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10.0 + move1.action_done() + + self.assertEqual(move1.value, 100.0) + self.assertEqual(move1.remaining_qty, 0.0) # unused in average move + + # send 10 products + move2 = self.env['stock.move'].create({ + 'name': 'Sale 94 units @ 19.00 per unit', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move2.action_confirm() + move2.action_assign() + move2.move_line_ids.qty_done = 10.0 + move2.action_done() + + self.assertEqual(move2.value, -100.0) + self.assertEqual(move2.remaining_qty, 0.0) # unused in average move + + # send 10 products again + move3 = self.env['stock.move'].create({ + 'name': 'Sale 94 units @ 19.00 per unit', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move3.action_confirm() + move3.force_assign() + move3.quantity_done = 10.0 + move3.action_done() + + self.assertEqual(move3.value, -100.0) # as no move out were done for this product, fallback on latest cost + self.assertEqual(move3.remaining_qty, 0.0) # unused in average move + + def test_average_negative_3(self): + """ Send goods that you don't have in stock but received and send some units before. + """ + self.product1.product_tmpl_id.cost_method = 'average' + + # set a standard price + self.product1.standard_price = 99 + + # Receives 10 produts at 10 + move1 = self.env['stock.move'].create({ + 'name': '68 units @ 15.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10.0 + move1.action_done() + + self.assertEqual(move1.value, 100.0) + self.assertEqual(move1.remaining_qty, 0.0) # unused in average move + + # send 10 products + move2 = self.env['stock.move'].create({ + 'name': 'Sale 94 units @ 19.00 per unit', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move2.action_confirm() + move2.action_assign() + move2.move_line_ids.qty_done = 10.0 + move2.action_done() + + self.assertEqual(move2.value, -100.0) + self.assertEqual(move2.remaining_qty, 0.0) # unused in average move + + # send 10 products again + move3 = self.env['stock.move'].create({ + 'name': 'Sale 94 units @ 19.00 per unit', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move3.action_confirm() + move3.force_assign() + move3.quantity_done = 10.0 + move3.action_done() + + self.assertEqual(move3.value, -100.0) # as no move out were done for this product, fallback on latest cost + self.assertEqual(move3.remaining_qty, 0.0) # unused in average move + + def test_average_negative_4(self): + self.product1.product_tmpl_id.cost_method = 'average' + + # set a standard price + self.product1.standard_price = 99 + + # Receives 10 produts at 10 + move1 = self.env['stock.move'].create({ + 'name': '68 units @ 15.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10.0 + move1.action_done() + + self.assertEqual(move1.value, 100.0) + self.assertEqual(move1.remaining_qty, 0.0) # unused in average move + + def test_average_negative_5(self): + self.product1.product_tmpl_id.cost_method = 'average' + + # in 10 @ 10 + move1 = self.env['stock.move'].create({ + 'name': '10 units @ 10.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + }) + move1.action_confirm() + move1.action_assign() + move1.move_line_ids.qty_done = 10.0 + move1.action_done() + + self.assertEqual(move1.value, 100.0) + self.assertEqual(self.product1.standard_price, 10) + + # in 10 @ 20 + move2 = self.env['stock.move'].create({ + 'name': '10 units @ 20.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 20, + }) + move2.action_confirm() + move2.action_assign() + move2.move_line_ids.qty_done = 10.0 + move2.action_done() + + self.assertEqual(move2.value, 200.0) + self.assertEqual(self.product1.standard_price, 15) + + # send 5 + move3 = self.env['stock.move'].create({ + 'name': 'Sale 5 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 5.0, + }) + move3.action_confirm() + move3.force_assign() + move3.quantity_done = 5.0 + move3.action_done() + + self.assertEqual(move3.value, -75.0) + self.assertEqual(self.product1.standard_price, 15) + + # send 30 + move4 = self.env['stock.move'].create({ + 'name': 'Sale 5 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 30.0, + }) + move4.action_confirm() + move4.force_assign() + move4.quantity_done = 30.0 + move4.action_done() + + self.assertEqual(move4.value, -450.0) + self.assertEqual(self.product1.standard_price, 15) + + # in 20 @ 20 + move5 = self.env['stock.move'].create({ + 'name': '20 units @ 20.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 20.0, + 'price_unit': 20, + }) + move5.action_confirm() + move5.action_assign() + move5.move_line_ids.qty_done = 20.0 + move5.action_done() + + self.assertEqual(move5.value, 400.0) + self.assertEqual(self.product1.standard_price, 35) + + self.assertEqual(self.product1.qty_available, 5) + + # send 5 products to empty the inventory, the average price should not go to 0 + move6 = self.env['stock.move'].create({ + 'name': 'Sale 5 units', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 5.0, + }) + move6.action_confirm() + move6.force_assign() + move6.quantity_done = 5.0 + move6.action_done() + + self.assertEqual(move6.value, -175.0) + self.assertEqual(self.product1.standard_price, 35) + + # in 10 @ 10, the new average price should be 10 + move7 = self.env['stock.move'].create({ + 'name': '10 units @ 10.00 per unit', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + 'price_unit': 10, + }) + move7.action_confirm() + move7.action_assign() + move7.move_line_ids.qty_done = 10.0 + move7.action_done() + + self.assertEqual(move7.value, 100.0) + self.assertEqual(self.product1.standard_price, 10) diff --git a/addons/stock_account/views/product_views.xml b/addons/stock_account/views/product_views.xml index 026599d1ecb..2acb622d680 100644 --- a/addons/stock_account/views/product_views.xml +++ b/addons/stock_account/views/product_views.xml @@ -39,10 +39,7 @@ </field> <field name="standard_price" position="replace"> <field name="standard_price" - attrs="{'readonly': [('valuation','=','real_time')]}" - widget='monetary' options="{'currency_field': 'currency_id'}"/> - <field name="average_price" readonly="1" - attrs="{'invisible': [('cost_method','!=', 'average')]}" + attrs="{'readonly':[('valuation','=','real_time')]}" widget='monetary' options="{'currency_field': 'currency_id'}"/> </field> <div name="standard_price_uom" position="after"> @@ -97,6 +94,7 @@ <tree> <field name="name"/> <field name="stock_value" sum="Stock Valuation"/> + <field name="qty_available" context="{'company_owned': True}"/> </tree> </field> </record> diff --git a/addons/stock_account/views/stock_account_views.xml b/addons/stock_account/views/stock_account_views.xml index fa14fc21e6b..7579cea5b45 100644 --- a/addons/stock_account/views/stock_account_views.xml +++ b/addons/stock_account/views/stock_account_views.xml @@ -2,6 +2,17 @@ <odoo> <data> + <record id="view_move_form_inherit" model="ir.ui.view"> + <field name="name">stock.move.form.inherit</field> + <field name="model">stock.move</field> + <field name="inherit_id" ref="stock.view_move_form"/> + <field name="arch" type="xml"> + <xpath expr="//div[@name='button_box']" position="inside"> + <button name="action_get_account_moves" icon="fa-arrows" class="oe_stat_button" string="Account Moves" type="object"/> + </xpath> + </field> + </record> + <record id="view_inventory_form_inherit" model="ir.ui.view"> <field name="name">stock.inventory.form.inherit</field> <field name="model">stock.inventory</field> @@ -50,14 +61,16 @@ <field name="picking_type_id" invisible="1"/> <field name="create_date" invisible="1" groups="base.group_no_one"/> <field name="product_id"/> - <field name="price_unit"/> - <field name="product_uom_qty"/> - <field name="product_uom" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> <field name="location_id" groups="stock.group_stock_multi_locations"/> <field name="location_dest_id" groups="stock.group_stock_multi_locations"/> <field name="date" groups="base.group_no_one"/> <field name="state" invisible="1"/> + <field name="product_uom_qty" string="Qty"/> + <field name="product_uom" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="product.group_uom"/> + <field name="price_unit"/> + <field name="remaining_qty"/> <field name="value" sum="Stock Valuation"/> + <field name="remaining_value" sum="Stock Valuation"/> </tree> </field> </record> diff --git a/addons/stock_account/wizard/wizard_valuation_history.py b/addons/stock_account/wizard/wizard_valuation_history.py index 3f4d87f5d31..0836b516fff 100644 --- a/addons/stock_account/wizard/wizard_valuation_history.py +++ b/addons/stock_account/wizard/wizard_valuation_history.py @@ -17,8 +17,19 @@ class WizardValuationHistory(models.TransientModel): @api.multi def open_table(self): self.ensure_one() - if self.compute_at_date and self.date: + # Call `_fifo_vacuum` on concerned moves + fifo_valued_products = self.env['product.product'] + fifo_valued_products |= self.env['product.template'].search([('property_cost_method', '=', 'fifo')]).mapped('product_variant_ids') + fifo_valued_categories = self.env['product.category'].search([('property_cost_method', '=', 'fifo')]) + fifo_valued_products |= self.env['product.product'].search([('categ_id', 'child_of', fifo_valued_categories.ids)]) + moves_to_vacuum = self.env['stock.move'] + Move = self.env['stock.move'] + for product in fifo_valued_products: + moves_to_vacuum |= Move.search([('product_id', '=', product.id), ('remaining_qty', '<', 0)] + Move._get_all_base_domain()) + moves_to_vacuum._fifo_vacuum() + + if self.compute_at_date and self.date: action = self.env['ir.model.data'].xmlid_to_object('stock_account.stock_move_valuation_action') if not action: action = { diff --git a/addons/stock_account/wizard/wizard_valuation_history_views.xml b/addons/stock_account/wizard/wizard_valuation_history_views.xml index a1400983319..2413dc88537 100644 --- a/addons/stock_account/wizard/wizard_valuation_history_views.xml +++ b/addons/stock_account/wizard/wizard_valuation_history_views.xml @@ -8,7 +8,7 @@ <group> <group> <field name="compute_at_date" widget="radio"/> - <field name="date" attrs="{'invisible': [('compute_at_date', '=', False)]}"/> + <field name="date" attrs="{'invisible': [('compute_at_date', '=', 0)]}"/> </group> </group> <footer> diff --git a/addons/stock_picking_wave/__init__.py b/addons/stock_picking_batch/__init__.py index 2ae6446f9dc..2ae6446f9dc 100644 --- a/addons/stock_picking_wave/__init__.py +++ b/addons/stock_picking_batch/__init__.py diff --git a/addons/stock_picking_wave/__manifest__.py b/addons/stock_picking_batch/__manifest__.py index 4401f5dc6d6..498ea901fdc 100644 --- a/addons/stock_picking_wave/__manifest__.py +++ b/addons/stock_picking_batch/__manifest__.py @@ -2,23 +2,23 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. { - 'name': 'Warehouse Management: Waves', + 'name': 'Warehouse Management: Batch Picking', 'version': '1.0', 'category': 'Warehouse', 'description': """ -This module adds the picking wave option in warehouse management -================================================================ +This module adds the batch picking option in warehouse management +================================================================= """, 'website': 'https://www.odoo.com/page/warehouse', 'depends': ['stock'], 'data': [ 'security/ir.model.access.csv', - 'views/stock_picking_wave_views.xml', - 'data/stock_picking_wave_data.xml', - 'wizard/stock_picking_to_wave_views.xml', + 'views/stock_picking_batch_views.xml', + 'data/stock_picking_batch_data.xml', + 'wizard/stock_picking_to_batch_views.xml', ], 'demo': [ - 'data/stock_picking_wave_demo.xml', + 'data/stock_picking_batch_demo.xml', ], 'installable': True, } diff --git a/addons/stock_picking_batch/data/stock_picking_batch_data.xml b/addons/stock_picking_batch/data/stock_picking_batch_data.xml new file mode 100644 index 00000000000..1ce28f17aca --- /dev/null +++ b/addons/stock_picking_batch/data/stock_picking_batch_data.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- Batch picking related subtypes for messaging / Chatter --> + <record id="mt_batch_state" model="mail.message.subtype"> + <field name="name">Stage Changed</field> + <field name="res_model">stock.picking.batch</field> + <field name="default" eval="False"/> + <field name="description">Stage Changed</field> + </record> + + <record id="seq_picking_batch" model="ir.sequence"> + <field name="name">Batch Picking</field> + <field name="code">picking.batch</field> + <field name="prefix">Batch/</field> + <field name="padding">5</field> + <field name="company_id" eval="False"/> + </record> +</odoo> diff --git a/addons/stock_picking_batch/data/stock_picking_batch_demo.xml b/addons/stock_picking_batch/data/stock_picking_batch_demo.xml new file mode 100644 index 00000000000..8262a81c58f --- /dev/null +++ b/addons/stock_picking_batch/data/stock_picking_batch_demo.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- Add batch picking --> + <record id="stock_picking_batch_dry_1" model="stock.picking.batch"> + <field name="name">Picking Dry for John</field> + <field name="state">in_progress</field> + </record> + <record id="stock_picking_batch_freeze_1" model="stock.picking.batch"> + <field name="name">Picking Freeze for Mickael</field> + <field name="state">in_progress</field> + </record> + + <!-- Add picking --> + <record id="Picking_A" model="stock.picking"> + <field name="name">Picking #1</field> + <field name="move_type">one</field> + <field name="priority">2</field> + <field name="picking_type_id" ref="stock.picking_type_internal"/> + <field name="batch_id" ref="stock_picking_batch_freeze_1"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + </record> + <record id="Picking_B" model="stock.picking"> + <field name="name">Picking #2</field> + <field name="move_type">one</field> + <field name="state">assigned</field> + <field name="priority">1</field> + <field name="picking_type_id" ref="stock.picking_type_internal"/> + <field name="batch_id" ref="stock_picking_batch_dry_1"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + </record> + <record id="Picking_C" model="stock.picking"> + <field name="name">Picking #3</field> + <field name="move_type">one</field> + <field name="state">assigned</field> + <field name="priority">1</field> + <field name="picking_type_id" ref="stock.picking_type_internal"/> + <field name="batch_id" ref="stock_picking_batch_freeze_1"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + </record> + + <!-- add Product --> + <record id="product_product_ice_cream_choco" model="product.product"> + <field name="name">Ice Cream Chocolate</field> + <field name="default_code">IC-CHOCO</field> + <field name="categ_id" ref="product.product_category_all"/> + <field name="list_price">450.0</field> + <field name="standard_price">300.0</field> + <field name="type">consu</field> + <field name="uom_id" ref="product.product_uom_unit"/> + <field name="uom_po_id" ref="product.product_uom_unit"/> + <field name="description_sale">Ice Cream Chocolate with sticks</field> + </record> + <record id="product_product_ice_cream_vani" model="product.product"> + <field name="name">Ice Cream Vanilla</field> + <field name="default_code">IC-VANI</field> + <field name="categ_id" ref="product.product_category_all"/> + <field name="list_price">450.0</field> + <field name="standard_price">300.0</field> + <field name="type">consu</field> + <field name="uom_id" ref="product.product_uom_unit"/> + <field name="uom_po_id" ref="product.product_uom_unit"/> + <field name="description_sale">Ice Cream Vanilla</field> + </record> + <record id="product_product_dry_specu" model="product.product"> + <field name="name">Speculoos</field> + <field name="default_code">DRY-SPEC</field> + <field name="categ_id" ref="product.product_category_all"/> + <field name="list_price">150.0</field> + <field name="standard_price">100.0</field> + <field name="type">consu</field> + <field name="uom_id" ref="product.product_uom_unit"/> + <field name="uom_po_id" ref="product.product_uom_unit"/> + <field name="description_sale">Speculoos - A belgian speciality</field> + </record> + + <!-- Add stock move --> + <record id="stock_move1" model="stock.move"> + <field name="name">A first stock move</field> + <field name="picking_id" ref="Picking_A"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + <field name="product_uom" ref="product.product_uom_unit" /> + <field name="product_id" ref="product_product_ice_cream_choco"/> + </record> + <record id="stock_move2" model="stock.move"> + <field name="name">A second stock move</field> + <field name="picking_id" ref="Picking_A"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + <field name="product_uom" ref="product.product_uom_unit" /> + <field name="product_id" ref="product_product_ice_cream_vani"/> + </record> + <record id="stock_move3" model="stock.move"> + <field name="name">A third stock move</field> + <field name="picking_id" ref="Picking_B"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + <field name="product_uom" ref="product.product_uom_unit" /> + <field name="product_id" ref="product_product_dry_specu"/> + </record> + <record id="stock_move4" model="stock.move"> + <field name="name">A fourth stock move</field> + <field name="picking_id" ref="Picking_C"/> + <field name="location_id" ref="stock.stock_location_stock"/> + <field name="location_dest_id" ref="stock.stock_location_output"/> + <field name="product_uom" ref="product.product_uom_unit" /> + <field name="product_id" ref="product_product_ice_cream_vani"/> + </record> + +</odoo> diff --git a/addons/stock_picking_wave/i18n/af.po b/addons/stock_picking_batch/i18n/af.po index af4d092a627..af4d092a627 100644 --- a/addons/stock_picking_wave/i18n/af.po +++ b/addons/stock_picking_batch/i18n/af.po diff --git a/addons/stock_picking_wave/i18n/am.po b/addons/stock_picking_batch/i18n/am.po index 7a2b83c3b9a..7a2b83c3b9a 100644 --- a/addons/stock_picking_wave/i18n/am.po +++ b/addons/stock_picking_batch/i18n/am.po diff --git a/addons/stock_picking_wave/i18n/ar.po b/addons/stock_picking_batch/i18n/ar.po index 8f029c17597..8f029c17597 100644 --- a/addons/stock_picking_wave/i18n/ar.po +++ b/addons/stock_picking_batch/i18n/ar.po diff --git a/addons/stock_picking_wave/i18n/bg.po b/addons/stock_picking_batch/i18n/bg.po index 4ca76ee044a..4ca76ee044a 100644 --- a/addons/stock_picking_wave/i18n/bg.po +++ b/addons/stock_picking_batch/i18n/bg.po diff --git a/addons/stock_picking_wave/i18n/bs.po b/addons/stock_picking_batch/i18n/bs.po index 8e1488b1c73..8e1488b1c73 100644 --- a/addons/stock_picking_wave/i18n/bs.po +++ b/addons/stock_picking_batch/i18n/bs.po diff --git a/addons/stock_picking_wave/i18n/ca.po b/addons/stock_picking_batch/i18n/ca.po index c120e92500a..c120e92500a 100644 --- a/addons/stock_picking_wave/i18n/ca.po +++ b/addons/stock_picking_batch/i18n/ca.po diff --git a/addons/stock_picking_wave/i18n/cs.po b/addons/stock_picking_batch/i18n/cs.po index cb47ea25d8b..cb47ea25d8b 100644 --- a/addons/stock_picking_wave/i18n/cs.po +++ b/addons/stock_picking_batch/i18n/cs.po diff --git a/addons/stock_picking_wave/i18n/da.po b/addons/stock_picking_batch/i18n/da.po index b61742569f4..b61742569f4 100644 --- a/addons/stock_picking_wave/i18n/da.po +++ b/addons/stock_picking_batch/i18n/da.po diff --git a/addons/stock_picking_wave/i18n/de.po b/addons/stock_picking_batch/i18n/de.po index 33c019d18f6..33c019d18f6 100644 --- a/addons/stock_picking_wave/i18n/de.po +++ b/addons/stock_picking_batch/i18n/de.po diff --git a/addons/stock_picking_wave/i18n/el.po b/addons/stock_picking_batch/i18n/el.po index 09839391f14..09839391f14 100644 --- a/addons/stock_picking_wave/i18n/el.po +++ b/addons/stock_picking_batch/i18n/el.po diff --git a/addons/stock_picking_wave/i18n/en_AU.po b/addons/stock_picking_batch/i18n/en_AU.po index 8cca568b2b2..8cca568b2b2 100644 --- a/addons/stock_picking_wave/i18n/en_AU.po +++ b/addons/stock_picking_batch/i18n/en_AU.po diff --git a/addons/stock_picking_wave/i18n/en_GB.po b/addons/stock_picking_batch/i18n/en_GB.po index 55bfa303948..55bfa303948 100644 --- a/addons/stock_picking_wave/i18n/en_GB.po +++ b/addons/stock_picking_batch/i18n/en_GB.po diff --git a/addons/stock_picking_wave/i18n/es.po b/addons/stock_picking_batch/i18n/es.po index 391f8dbe68f..391f8dbe68f 100644 --- a/addons/stock_picking_wave/i18n/es.po +++ b/addons/stock_picking_batch/i18n/es.po diff --git a/addons/stock_picking_wave/i18n/es_AR.po b/addons/stock_picking_batch/i18n/es_AR.po index f40d9642376..f40d9642376 100644 --- a/addons/stock_picking_wave/i18n/es_AR.po +++ b/addons/stock_picking_batch/i18n/es_AR.po diff --git a/addons/stock_picking_wave/i18n/es_BO.po b/addons/stock_picking_batch/i18n/es_BO.po index 3c76e2802b1..3c76e2802b1 100644 --- a/addons/stock_picking_wave/i18n/es_BO.po +++ b/addons/stock_picking_batch/i18n/es_BO.po diff --git a/addons/stock_picking_wave/i18n/es_CL.po b/addons/stock_picking_batch/i18n/es_CL.po index 9fc979550d5..9fc979550d5 100644 --- a/addons/stock_picking_wave/i18n/es_CL.po +++ b/addons/stock_picking_batch/i18n/es_CL.po diff --git a/addons/stock_picking_wave/i18n/es_CO.po b/addons/stock_picking_batch/i18n/es_CO.po index b6134cd3899..b6134cd3899 100644 --- a/addons/stock_picking_wave/i18n/es_CO.po +++ b/addons/stock_picking_batch/i18n/es_CO.po diff --git a/addons/stock_picking_wave/i18n/es_CR.po b/addons/stock_picking_batch/i18n/es_CR.po index 0bbb2f066f0..0bbb2f066f0 100644 --- a/addons/stock_picking_wave/i18n/es_CR.po +++ b/addons/stock_picking_batch/i18n/es_CR.po diff --git a/addons/stock_picking_wave/i18n/es_DO.po b/addons/stock_picking_batch/i18n/es_DO.po index 5b2f8742b4f..5b2f8742b4f 100644 --- a/addons/stock_picking_wave/i18n/es_DO.po +++ b/addons/stock_picking_batch/i18n/es_DO.po diff --git a/addons/stock_picking_wave/i18n/es_EC.po b/addons/stock_picking_batch/i18n/es_EC.po index 334fa5537c6..334fa5537c6 100644 --- a/addons/stock_picking_wave/i18n/es_EC.po +++ b/addons/stock_picking_batch/i18n/es_EC.po diff --git a/addons/stock_picking_wave/i18n/es_PE.po b/addons/stock_picking_batch/i18n/es_PE.po index 6450b3d2624..6450b3d2624 100644 --- a/addons/stock_picking_wave/i18n/es_PE.po +++ b/addons/stock_picking_batch/i18n/es_PE.po diff --git a/addons/stock_picking_wave/i18n/es_PY.po b/addons/stock_picking_batch/i18n/es_PY.po index 103a7c3afb6..103a7c3afb6 100644 --- a/addons/stock_picking_wave/i18n/es_PY.po +++ b/addons/stock_picking_batch/i18n/es_PY.po diff --git a/addons/stock_picking_wave/i18n/es_VE.po b/addons/stock_picking_batch/i18n/es_VE.po index 9da0bb4302e..9da0bb4302e 100644 --- a/addons/stock_picking_wave/i18n/es_VE.po +++ b/addons/stock_picking_batch/i18n/es_VE.po diff --git a/addons/stock_picking_wave/i18n/et.po b/addons/stock_picking_batch/i18n/et.po index cad756a56de..cad756a56de 100644 --- a/addons/stock_picking_wave/i18n/et.po +++ b/addons/stock_picking_batch/i18n/et.po diff --git a/addons/stock_picking_wave/i18n/eu.po b/addons/stock_picking_batch/i18n/eu.po index 134f10f2e98..134f10f2e98 100644 --- a/addons/stock_picking_wave/i18n/eu.po +++ b/addons/stock_picking_batch/i18n/eu.po diff --git a/addons/stock_picking_wave/i18n/fa.po b/addons/stock_picking_batch/i18n/fa.po index 573325e3240..573325e3240 100644 --- a/addons/stock_picking_wave/i18n/fa.po +++ b/addons/stock_picking_batch/i18n/fa.po diff --git a/addons/stock_picking_wave/i18n/fi.po b/addons/stock_picking_batch/i18n/fi.po index 2915e57136c..2915e57136c 100644 --- a/addons/stock_picking_wave/i18n/fi.po +++ b/addons/stock_picking_batch/i18n/fi.po diff --git a/addons/stock_picking_wave/i18n/fo.po b/addons/stock_picking_batch/i18n/fo.po index 01b099bcc87..01b099bcc87 100644 --- a/addons/stock_picking_wave/i18n/fo.po +++ b/addons/stock_picking_batch/i18n/fo.po diff --git a/addons/stock_picking_wave/i18n/fr.po b/addons/stock_picking_batch/i18n/fr.po index d65e9f53708..d65e9f53708 100644 --- a/addons/stock_picking_wave/i18n/fr.po +++ b/addons/stock_picking_batch/i18n/fr.po diff --git a/addons/stock_picking_wave/i18n/fr_BE.po b/addons/stock_picking_batch/i18n/fr_BE.po index b3da2a2f9f7..b3da2a2f9f7 100644 --- a/addons/stock_picking_wave/i18n/fr_BE.po +++ b/addons/stock_picking_batch/i18n/fr_BE.po diff --git a/addons/stock_picking_wave/i18n/fr_CA.po b/addons/stock_picking_batch/i18n/fr_CA.po index bd5da348d42..bd5da348d42 100644 --- a/addons/stock_picking_wave/i18n/fr_CA.po +++ b/addons/stock_picking_batch/i18n/fr_CA.po diff --git a/addons/stock_picking_wave/i18n/gl.po b/addons/stock_picking_batch/i18n/gl.po index 64b0e3ec03a..64b0e3ec03a 100644 --- a/addons/stock_picking_wave/i18n/gl.po +++ b/addons/stock_picking_batch/i18n/gl.po diff --git a/addons/stock_picking_wave/i18n/gu.po b/addons/stock_picking_batch/i18n/gu.po index c0e537d52f3..c0e537d52f3 100644 --- a/addons/stock_picking_wave/i18n/gu.po +++ b/addons/stock_picking_batch/i18n/gu.po diff --git a/addons/stock_picking_wave/i18n/he.po b/addons/stock_picking_batch/i18n/he.po index 7d852501b65..7d852501b65 100644 --- a/addons/stock_picking_wave/i18n/he.po +++ b/addons/stock_picking_batch/i18n/he.po diff --git a/addons/stock_picking_wave/i18n/hi.po b/addons/stock_picking_batch/i18n/hi.po index 79ba83a986f..79ba83a986f 100644 --- a/addons/stock_picking_wave/i18n/hi.po +++ b/addons/stock_picking_batch/i18n/hi.po diff --git a/addons/stock_picking_wave/i18n/hr.po b/addons/stock_picking_batch/i18n/hr.po index 887c5537445..887c5537445 100644 --- a/addons/stock_picking_wave/i18n/hr.po +++ b/addons/stock_picking_batch/i18n/hr.po diff --git a/addons/stock_picking_wave/i18n/hu.po b/addons/stock_picking_batch/i18n/hu.po index 1eb9c15e1db..1eb9c15e1db 100644 --- a/addons/stock_picking_wave/i18n/hu.po +++ b/addons/stock_picking_batch/i18n/hu.po diff --git a/addons/stock_picking_wave/i18n/id.po b/addons/stock_picking_batch/i18n/id.po index f4cd30cdea5..f4cd30cdea5 100644 --- a/addons/stock_picking_wave/i18n/id.po +++ b/addons/stock_picking_batch/i18n/id.po diff --git a/addons/stock_picking_wave/i18n/it.po b/addons/stock_picking_batch/i18n/it.po index b6df9347c33..b6df9347c33 100644 --- a/addons/stock_picking_wave/i18n/it.po +++ b/addons/stock_picking_batch/i18n/it.po diff --git a/addons/stock_picking_wave/i18n/ja.po b/addons/stock_picking_batch/i18n/ja.po index d186805c102..d186805c102 100644 --- a/addons/stock_picking_wave/i18n/ja.po +++ b/addons/stock_picking_batch/i18n/ja.po diff --git a/addons/stock_picking_wave/i18n/ka.po b/addons/stock_picking_batch/i18n/ka.po index 466f0c4ec0d..466f0c4ec0d 100644 --- a/addons/stock_picking_wave/i18n/ka.po +++ b/addons/stock_picking_batch/i18n/ka.po diff --git a/addons/stock_picking_wave/i18n/kab.po b/addons/stock_picking_batch/i18n/kab.po index 079940ab264..079940ab264 100644 --- a/addons/stock_picking_wave/i18n/kab.po +++ b/addons/stock_picking_batch/i18n/kab.po diff --git a/addons/stock_picking_wave/i18n/ko.po b/addons/stock_picking_batch/i18n/ko.po index 43db24cb14b..43db24cb14b 100644 --- a/addons/stock_picking_wave/i18n/ko.po +++ b/addons/stock_picking_batch/i18n/ko.po diff --git a/addons/stock_picking_wave/i18n/lo.po b/addons/stock_picking_batch/i18n/lo.po index 0a9ee4b4c96..0a9ee4b4c96 100644 --- a/addons/stock_picking_wave/i18n/lo.po +++ b/addons/stock_picking_batch/i18n/lo.po diff --git a/addons/stock_picking_wave/i18n/lt.po b/addons/stock_picking_batch/i18n/lt.po index 59baac27fdc..59baac27fdc 100644 --- a/addons/stock_picking_wave/i18n/lt.po +++ b/addons/stock_picking_batch/i18n/lt.po diff --git a/addons/stock_picking_wave/i18n/lv.po b/addons/stock_picking_batch/i18n/lv.po index 461e50f04a6..461e50f04a6 100644 --- a/addons/stock_picking_wave/i18n/lv.po +++ b/addons/stock_picking_batch/i18n/lv.po diff --git a/addons/stock_picking_wave/i18n/mk.po b/addons/stock_picking_batch/i18n/mk.po index f7709c30de2..f7709c30de2 100644 --- a/addons/stock_picking_wave/i18n/mk.po +++ b/addons/stock_picking_batch/i18n/mk.po diff --git a/addons/stock_picking_wave/i18n/mn.po b/addons/stock_picking_batch/i18n/mn.po index dcb46417542..dcb46417542 100644 --- a/addons/stock_picking_wave/i18n/mn.po +++ b/addons/stock_picking_batch/i18n/mn.po diff --git a/addons/stock_picking_wave/i18n/nb.po b/addons/stock_picking_batch/i18n/nb.po index a0623aa4621..a0623aa4621 100644 --- a/addons/stock_picking_wave/i18n/nb.po +++ b/addons/stock_picking_batch/i18n/nb.po diff --git a/addons/stock_picking_wave/i18n/nl.po b/addons/stock_picking_batch/i18n/nl.po index 24550ac0c64..24550ac0c64 100644 --- a/addons/stock_picking_wave/i18n/nl.po +++ b/addons/stock_picking_batch/i18n/nl.po diff --git a/addons/stock_picking_wave/i18n/nl_BE.po b/addons/stock_picking_batch/i18n/nl_BE.po index 084343bdbb7..084343bdbb7 100644 --- a/addons/stock_picking_wave/i18n/nl_BE.po +++ b/addons/stock_picking_batch/i18n/nl_BE.po diff --git a/addons/stock_picking_wave/i18n/pl.po b/addons/stock_picking_batch/i18n/pl.po index 598e6dc5a66..598e6dc5a66 100644 --- a/addons/stock_picking_wave/i18n/pl.po +++ b/addons/stock_picking_batch/i18n/pl.po diff --git a/addons/stock_picking_wave/i18n/pt.po b/addons/stock_picking_batch/i18n/pt.po index cf709978271..cf709978271 100644 --- a/addons/stock_picking_wave/i18n/pt.po +++ b/addons/stock_picking_batch/i18n/pt.po diff --git a/addons/stock_picking_wave/i18n/pt_BR.po b/addons/stock_picking_batch/i18n/pt_BR.po index 8864bc56061..8864bc56061 100644 --- a/addons/stock_picking_wave/i18n/pt_BR.po +++ b/addons/stock_picking_batch/i18n/pt_BR.po diff --git a/addons/stock_picking_wave/i18n/ro.po b/addons/stock_picking_batch/i18n/ro.po index ab12800821f..ab12800821f 100644 --- a/addons/stock_picking_wave/i18n/ro.po +++ b/addons/stock_picking_batch/i18n/ro.po diff --git a/addons/stock_picking_wave/i18n/ru.po b/addons/stock_picking_batch/i18n/ru.po index 0155cdba28a..0155cdba28a 100644 --- a/addons/stock_picking_wave/i18n/ru.po +++ b/addons/stock_picking_batch/i18n/ru.po diff --git a/addons/stock_picking_wave/i18n/sk.po b/addons/stock_picking_batch/i18n/sk.po index 5891e92540f..5891e92540f 100644 --- a/addons/stock_picking_wave/i18n/sk.po +++ b/addons/stock_picking_batch/i18n/sk.po diff --git a/addons/stock_picking_wave/i18n/sl.po b/addons/stock_picking_batch/i18n/sl.po index 6e4b51ed860..6e4b51ed860 100644 --- a/addons/stock_picking_wave/i18n/sl.po +++ b/addons/stock_picking_batch/i18n/sl.po diff --git a/addons/stock_picking_wave/i18n/sq.po b/addons/stock_picking_batch/i18n/sq.po index 43f8a9115be..43f8a9115be 100644 --- a/addons/stock_picking_wave/i18n/sq.po +++ b/addons/stock_picking_batch/i18n/sq.po diff --git a/addons/stock_picking_wave/i18n/sr.po b/addons/stock_picking_batch/i18n/sr.po index a31212f15e7..a31212f15e7 100644 --- a/addons/stock_picking_wave/i18n/sr.po +++ b/addons/stock_picking_batch/i18n/sr.po diff --git a/addons/stock_picking_wave/i18n/sr@latin.po b/addons/stock_picking_batch/i18n/sr@latin.po index 84d20953dd5..84d20953dd5 100644 --- a/addons/stock_picking_wave/i18n/sr@latin.po +++ b/addons/stock_picking_batch/i18n/sr@latin.po diff --git a/addons/stock_picking_wave/i18n/stock_picking_wave.pot b/addons/stock_picking_batch/i18n/stock_picking_batch.pot index 3612d2e951a..3612d2e951a 100644 --- a/addons/stock_picking_wave/i18n/stock_picking_wave.pot +++ b/addons/stock_picking_batch/i18n/stock_picking_batch.pot diff --git a/addons/stock_picking_wave/i18n/sv.po b/addons/stock_picking_batch/i18n/sv.po index 18c21dafedc..18c21dafedc 100644 --- a/addons/stock_picking_wave/i18n/sv.po +++ b/addons/stock_picking_batch/i18n/sv.po diff --git a/addons/stock_picking_wave/i18n/ta.po b/addons/stock_picking_batch/i18n/ta.po index e99a4ecd775..e99a4ecd775 100644 --- a/addons/stock_picking_wave/i18n/ta.po +++ b/addons/stock_picking_batch/i18n/ta.po diff --git a/addons/stock_picking_wave/i18n/th.po b/addons/stock_picking_batch/i18n/th.po index f2ca121203c..f2ca121203c 100644 --- a/addons/stock_picking_wave/i18n/th.po +++ b/addons/stock_picking_batch/i18n/th.po diff --git a/addons/stock_picking_wave/i18n/tr.po b/addons/stock_picking_batch/i18n/tr.po index f2b4d2a5e0f..f2b4d2a5e0f 100644 --- a/addons/stock_picking_wave/i18n/tr.po +++ b/addons/stock_picking_batch/i18n/tr.po diff --git a/addons/stock_picking_wave/i18n/uk.po b/addons/stock_picking_batch/i18n/uk.po index 0e477c4e8ec..0e477c4e8ec 100644 --- a/addons/stock_picking_wave/i18n/uk.po +++ b/addons/stock_picking_batch/i18n/uk.po diff --git a/addons/stock_picking_wave/i18n/vi.po b/addons/stock_picking_batch/i18n/vi.po index 968d7b5bf10..968d7b5bf10 100644 --- a/addons/stock_picking_wave/i18n/vi.po +++ b/addons/stock_picking_batch/i18n/vi.po diff --git a/addons/stock_picking_wave/i18n/zh_CN.po b/addons/stock_picking_batch/i18n/zh_CN.po index c0947363c5f..c0947363c5f 100644 --- a/addons/stock_picking_wave/i18n/zh_CN.po +++ b/addons/stock_picking_batch/i18n/zh_CN.po diff --git a/addons/stock_picking_wave/i18n/zh_TW.po b/addons/stock_picking_batch/i18n/zh_TW.po index 8fa52cd0bfe..8fa52cd0bfe 100644 --- a/addons/stock_picking_wave/i18n/zh_TW.po +++ b/addons/stock_picking_batch/i18n/zh_TW.po diff --git a/addons/stock_picking_wave/wizard/__init__.py b/addons/stock_picking_batch/models/__init__.py index afd96c47267..6f4ec3d8036 100644 --- a/addons/stock_picking_wave/wizard/__init__.py +++ b/addons/stock_picking_batch/models/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import stock_picking_to_wave +from . import stock_picking_batch diff --git a/addons/stock_picking_wave/models/stock_picking_wave.py b/addons/stock_picking_batch/models/stock_picking_batch.py index 8c70e7663bc..17528be6c98 100644 --- a/addons/stock_picking_wave/models/stock_picking_wave.py +++ b/addons/stock_picking_batch/models/stock_picking_batch.py @@ -5,22 +5,22 @@ from odoo import api, fields, models, _ from odoo.exceptions import UserError -class StockPickingWave(models.Model): +class StockPickingBatch(models.Model): _inherit = ['mail.thread'] - _name = "stock.picking.wave" - _description = "Picking Wave" + _name = "stock.picking.batch" + _description = "Batch Picking" _order = "name desc" name = fields.Char( - string='Picking Wave Name', default='/', + string='Batch Picking Name', default='/', copy=False, required=True, - help='Name of the picking wave') + help='Name of the batch picking') user_id = fields.Many2one( 'res.users', string='Responsible', track_visibility='onchange', - help='Person responsible for this wave') + help='Person responsible for this batch picking') picking_ids = fields.One2many( - 'stock.picking', 'wave_id', string='Pickings', - help='List of picking associated to this wave') + 'stock.picking', 'batch_id', string='Pickings', + help='List of picking associated to this batch') state = fields.Selection([ ('draft', 'Draft'), ('in_progress', 'Running'), @@ -31,8 +31,8 @@ class StockPickingWave(models.Model): @api.model def create(self, vals): if vals.get('name', '/') == '/': - vals['name'] = self.env['ir.sequence'].next_by_code('picking.wave') or '/' - return super(StockPickingWave, self).create(vals) + vals['name'] = self.env['ir.sequence'].next_by_code('batch.picking') or '/' + return super(StockPickingBatch, self).create(vals) @api.multi def confirm_picking(self): @@ -56,28 +56,28 @@ class StockPickingWave(models.Model): def done(self): pickings = self.mapped('picking_ids').filtered(lambda picking: picking.state not in ('cancel', 'done')) if any(picking.state != 'assigned' for picking in pickings): - raise UserError(_('Some pickings are still waiting for goods. Please check or force their availability before setting this wave to done.')) + raise UserError(_('Some pickings are still waiting for goods. Please check or force their availability before setting this batch to done.')) for picking in pickings: picking.message_post( - body="<b>%s:</b> %s <a href=#id=%s&view_type=form&model=stock.picking.wave>%s</a>" % ( + body="<b>%s:</b> %s <a href=#id=%s&view_type=form&model=stock.picking.batch>%s</a>" % ( _("Transferred by"), - _("Picking Wave"), - picking.wave_id.id, - picking.wave_id.name)) + _("Batch Picking"), + picking.batch_id.id, + picking.batch_id.name)) if pickings: pickings.action_done() return self.write({'state': 'done'}) def _track_subtype(self, init_values): if 'state' in init_values: - return 'stock_picking_wave.mt_wave_state' - return super(StockPickingWave, self)._track_subtype(init_values) + return 'stock_picking_batch.mt_batch_state' + return super(StockPickingBatch, self)._track_subtype(init_values) class StockPicking(models.Model): _inherit = "stock.picking" - wave_id = fields.Many2one( - 'stock.picking.wave', string='Picking Wave', + batch_id = fields.Many2one( + 'stock.picking.batch', string='Batch Picking', oldname="wave_id", states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}, - help='Picking wave associated to this picking') + help='Batch associated to this picking') diff --git a/addons/stock_picking_batch/security/ir.model.access.csv b/addons/stock_picking_batch/security/ir.model.access.csv new file mode 100644 index 00000000000..615ed649f59 --- /dev/null +++ b/addons/stock_picking_batch/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_picking_batch,stock.picking.batch stock users,model_stock_picking_batch,stock.group_stock_user,1,1,1,1 diff --git a/addons/stock_picking_batch/views/stock_picking_batch_views.xml b/addons/stock_picking_batch/views/stock_picking_batch_views.xml new file mode 100644 index 00000000000..01816033053 --- /dev/null +++ b/addons/stock_picking_batch/views/stock_picking_batch_views.xml @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <record id="stock_picking_batch_form" model="ir.ui.view"> + <field name="name">stock.picking.batch.form</field> + <field name="model">stock.picking.batch</field> + <field name="arch" type="xml"> + <form string="Stock Batch Picking"> + <header> + <button name="confirm_picking" states="draft" string="Confirm" type="object" class="oe_highlight"/> + <button name="print_picking" string="Print" type="object" class="oe_highlight"/> + <button name="done" states="in_progress" string="Done" type="object" class="oe_highlight"/> + <button name="cancel_picking" string="Cancel" type="object" states="in_progress"/> + <field name="state" widget="statusbar" statusbar_visible="in_progress,done"/> + </header> + <sheet> + <div class="oe_title"> + <h1><field name="name" class="oe_inline" readonly="1"/></h1> + </div> + <group> + <field name="user_id"/> + </group> + <separator string="Pickings"/> + <field name="picking_ids" widget="many2many" domain="[('state', 'not in', ('done', 'cancel'))]" options="{'not_delete': True}"> + <tree> + <field name="name"/> + <field name="backorder_id"/> + <field name="origin"/> + <field name="date"/> + <field name="scheduled_date"/> + <field name="state"/> + <button name="action_assign" string="Confirm picking" type="object" icon="fa-check text-success" attrs="{'invisible': [('state', 'in', ('done', 'cancel', 'confirmed', 'assigned'))]}"/> + <button name="force_assign" string="Force availability" type="object" icon="fa-arrow-right text-success" attrs="{'invisible': [('state', 'in', ('done', 'cancel', 'draft', 'assigned'))]}" groups="stock.group_stock_manager"/> + <button name="action_cancel" string="Cancel picking" type="object" icon="fa-times-circle text-danger" attrs="{'invisible': [('state', 'in', ('done', 'cancel'))]}"/> + </tree> + </field> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/> + <field name="message_ids" widget="mail_thread"/> + </div> + </form> + </field> + </record> + <record id="stock_picking_batch_tree" model="ir.ui.view"> + <field name="name">stock.picking.batch.tree</field> + <field name="model">stock.picking.batch</field> + <field name="arch" type="xml"> + <tree string="Stock Batch Picking" decoration-muted="state=='cancel'"> + <field name="name"/> + <field name="user_id"/> + <field name="state"/> + </tree> + </field> + </record> + <record id="stock_picking_batch_kanban" model="ir.ui.view"> + <field name="name">stock.picking.batch.kanban</field> + <field name="model">stock.picking.batch</field> + <field name="arch" type="xml"> + <kanban class="o_kanban_mobile"> + <field name="name"/> + <field name="user_id"/> + <field name="state"/> + <templates> + <t t-name="kanban-box"> + <div t-attf-class="oe_kanban_global_click"> + <div class="row mb4"> + <div class="col-xs-6"> + <strong><field name="name"/></strong> + </div> + <div class="col-xs-6 text-right"> + <field name="state" widget="kanban_label_selection"/> + </div> + </div> + <div class="pull-right"> + <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/> + </div> + </div> + </t> + </templates> + </kanban> + </field> + </record> + <record id="stock_picking_batch_filter" model="ir.ui.view"> + <field name="name">stock.picking.batch.filter</field> + <field name="model">stock.picking.batch</field> + <field name="arch" type="xml"> + <search string="Search Batch Picking"> + <field name="name" string="Batch Picking"/> + <filter name="in_progress" string="In Progress" domain="[('state','=', 'in_progress')]" help="Batch Pickings not finished"/> + <field name="user_id"/> + <group expand="0" string="Group By"> + <filter string="User" domain="[]" context="{'group_by':'user_id'}"/> + <filter string="State" domain="[]" context="{'group_by':'state'}"/> + </group> + </search> + </field> + </record> + <record id="stock_picking_batch_action" model="ir.actions.act_window"> + <field name="name">Batch Pickings</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">stock.picking.batch</field> + <field name="view_type">form</field> + <field name="view_mode">tree,kanban,form</field> + <field name="context">{"search_default_in_progress" : True,}</field> + <field name="search_view_id" ref="stock_picking_batch_filter"/> + <field name="help" type="html"> + <p class="oe_view_nocontent_create"> + Click to create a Batch Picking. + </p><p> + The goal of the batch picking is to group operations that may + (needs to) be done together in order to increase their efficiency. + It may also be useful to assign jobs (one person = one batch) or + help the timing management of operations (tasks to be done at 1pm). + </p> + </field> + </record> + <menuitem action="stock_picking_batch_action" id="stock_picking_batch_menu" parent="stock.stock_picking_menu_product" sequence="10"/> + + <record id="vpicktree_inherit_stock_picking_batch" model="ir.ui.view"> + <field name="name">stock.picking.tree</field> + <field name="model">stock.picking</field> + <field name="inherit_id" ref="stock.vpicktree"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='picking_type_id']" position="after"> + <field name="batch_id"/> + </xpath> + </field> + </record> + <record id="view_picking_internal_search_inherit_stock_picking_batch" model="ir.ui.view"> + <field name="name">stock.picking.search</field> + <field name="model">stock.picking</field> + <field name="inherit_id" ref="stock.view_picking_internal_search"/> + <field name="arch" type="xml"> + <xpath expr="//filter[@name='picking_type']" position="after"> + <filter string="Batch" domain="[]" context="{'group_by':'batch_id'}"/> + </xpath> + <xpath expr="//field[@name='picking_type_id']" position="after"> + <field name="batch_id"/> + </xpath> + </field> + </record> + +</odoo> diff --git a/addons/stock_picking_batch/wizard/__init__.py b/addons/stock_picking_batch/wizard/__init__.py new file mode 100644 index 00000000000..063ece3795c --- /dev/null +++ b/addons/stock_picking_batch/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import stock_picking_to_batch diff --git a/addons/stock_picking_batch/wizard/stock_picking_to_batch.py b/addons/stock_picking_batch/wizard/stock_picking_to_batch.py new file mode 100644 index 00000000000..c25b97bcad9 --- /dev/null +++ b/addons/stock_picking_batch/wizard/stock_picking_to_batch.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models + + +class StockPickingToBatch(models.TransientModel): + _name = 'stock.picking.to.batch' + _description = 'Add pickings to a batch picking' + + batch_id = fields.Many2one('stock.picking.batch', string='Batch Picking', required=True, oldname="wave_id") + + @api.multi + def attach_pickings(self): + # use active_ids to add picking line to the selected batch + self.ensure_one() + picking_ids = self.env.context.get('active_ids') + return self.env['stock.picking'].browse(picking_ids).write({'batch_id': self.batch_id.id}) diff --git a/addons/stock_picking_batch/wizard/stock_picking_to_batch_views.xml b/addons/stock_picking_batch/wizard/stock_picking_to_batch_views.xml new file mode 100644 index 00000000000..9f994be520b --- /dev/null +++ b/addons/stock_picking_batch/wizard/stock_picking_to_batch_views.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <!-- add picking to batch --> + <record id="stock_picking_to_batch_form" model="ir.ui.view"> + <field name="name">stock.picking.to.batch.form</field> + <field name="model">stock.picking.to.batch</field> + <field name="arch" type="xml"> + <form string="Add pickings to batch"> + <separator string="Select a batch"/> + <field name="batch_id" class="oe_inline"/> + <footer> + <button name="attach_pickings" type="object" string="Add to Batch" class="btn-primary"/> + <button string="Cancel" class="btn-default" special="cancel"/> + </footer> + </form> + </field> + </record> + + <!-- add picking to batch action --> + <record id="stock_picking_to_batch_action" model="ir.actions.act_window"> + <field name="name">Add to Batch</field> + <field name="res_model">stock.picking.to.batch</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="view_id" ref="stock_picking_to_batch_form"/> + <field name="target">new</field> + </record> + + <act_window id="stock_picking_to_batch_action_stock_picking" + multi="True" + key2="client_action_multi" name="Add to Batch" + res_model="stock.picking.to.batch" src_model="stock.picking" + view_mode="form" target="new" view_type="form" + /> + +</odoo> diff --git a/addons/stock_picking_wave/data/stock_picking_wave_data.xml b/addons/stock_picking_wave/data/stock_picking_wave_data.xml deleted file mode 100644 index bfc677faff6..00000000000 --- a/addons/stock_picking_wave/data/stock_picking_wave_data.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - <!-- Picking Wave related subtypes for messaging / Chatter --> - <record id="mt_wave_state" model="mail.message.subtype"> - <field name="name">Stage Changed</field> - <field name="res_model">stock.picking.wave</field> - <field name="default" eval="False"/> - <field name="description">Stage Changed</field> - </record> - - <record id="seq_picking_wave" model="ir.sequence"> - <field name="name">Picking Wave</field> - <field name="code">picking.wave</field> - <field name="prefix">Wave/</field> - <field name="padding">5</field> - <field name="company_id" eval="False"/> - </record> -</odoo> diff --git a/addons/stock_picking_wave/data/stock_picking_wave_demo.xml b/addons/stock_picking_wave/data/stock_picking_wave_demo.xml deleted file mode 100644 index 2d074370200..00000000000 --- a/addons/stock_picking_wave/data/stock_picking_wave_demo.xml +++ /dev/null @@ -1,125 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - <!-- - Add picking wave - --> - <record id="stock_picking_wave_dry_1" model="stock.picking.wave"> - <field name="name">Picking Dry for John</field> - <field name="state">in_progress</field> - </record> - - <record id="stock_picking_wave_freeze_1" model="stock.picking.wave"> - <field name="name">Picking Freeze for Mickael</field> - <field name="state">in_progress</field> - </record> - - <!-- - Add picking - --> - - <record id="Picking_A" model="stock.picking"> - <field name="name">Picking #1</field> - <field name="move_type">one</field> - <field name="priority">2</field> - <field name="picking_type_id" ref="stock.picking_type_internal"/> - <field name="wave_id" ref="stock_picking_wave_freeze_1"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - </record> - <record id="Picking_B" model="stock.picking"> - <field name="name">Picking #2</field> - <field name="move_type">one</field> - <field name="state">assigned</field> - <field name="priority">1</field> - <field name="picking_type_id" ref="stock.picking_type_internal"/> - <field name="wave_id" ref="stock_picking_wave_dry_1"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - </record> - <record id="Picking_C" model="stock.picking"> - <field name="name">Picking #3</field> - <field name="move_type">one</field> - <field name="state">assigned</field> - <field name="priority">1</field> - <field name="picking_type_id" ref="stock.picking_type_internal"/> - <field name="wave_id" ref="stock_picking_wave_freeze_1"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - </record> - - <!-- add Product --> - - <record id="product_product_ice_cream_choco" model="product.product"> - <field name="name">Ice Cream Chocolate</field> - <field name="default_code">IC-CHOCO</field> - <field name="categ_id" ref="product.product_category_all"/> - <field name="list_price">450.0</field> - <field name="standard_price">300.0</field> - <field name="type">consu</field> - <field name="uom_id" ref="product.product_uom_unit"/> - <field name="uom_po_id" ref="product.product_uom_unit"/> - <field name="description_sale">Ice Cream Chocolate with sticks</field> - </record> - <record id="product_product_ice_cream_vani" model="product.product"> - <field name="name">Ice Cream Vanilla</field> - <field name="default_code">IC-VANI</field> - <field name="categ_id" ref="product.product_category_all"/> - <field name="list_price">450.0</field> - <field name="standard_price">300.0</field> - <field name="type">consu</field> - <field name="uom_id" ref="product.product_uom_unit"/> - <field name="uom_po_id" ref="product.product_uom_unit"/> - <field name="description_sale">Ice Cream Vanilla</field> - </record> - <record id="product_product_dry_specu" model="product.product"> - <field name="name">Speculoos</field> - <field name="default_code">DRY-SPEC</field> - <field name="categ_id" ref="product.product_category_all"/> - <field name="list_price">150.0</field> - <field name="standard_price">100.0</field> - <field name="type">consu</field> - <field name="uom_id" ref="product.product_uom_unit"/> - <field name="uom_po_id" ref="product.product_uom_unit"/> - <field name="description_sale">Speculoos - A belgian speciality</field> - </record> - - - <!-- - Add stock move - --> - - <record id="stock_move1" model="stock.move"> - <field name="name">A first stock move</field> - <field name="picking_id" ref="Picking_A"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - <field name="product_uom" ref="product.product_uom_unit" /> - <field name="product_id" ref="product_product_ice_cream_choco"/> - </record> - <record id="stock_move2" model="stock.move"> - <field name="name">A second stock move</field> - <field name="picking_id" ref="Picking_A"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - <field name="product_uom" ref="product.product_uom_unit" /> - <field name="product_id" ref="product_product_ice_cream_vani"/> - </record> - <record id="stock_move3" model="stock.move"> - <field name="name">A third stock move</field> - <field name="picking_id" ref="Picking_B"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - <field name="product_uom" ref="product.product_uom_unit" /> - <!--<field name="product_id" ref="product.product_product_10"/>--> - <field name="product_id" ref="product_product_dry_specu"/> - </record> - <record id="stock_move4" model="stock.move"> - <field name="name">A fourth stock move</field> - <field name="picking_id" ref="Picking_C"/> - <field name="location_id" ref="stock.stock_location_stock"/> - <field name="location_dest_id" ref="stock.stock_location_output"/> - <field name="product_uom" ref="product.product_uom_unit" /> - <field name="product_id" ref="product_product_ice_cream_vani"/> - </record> - -</odoo> diff --git a/addons/stock_picking_wave/security/ir.model.access.csv b/addons/stock_picking_wave/security/ir.model.access.csv deleted file mode 100644 index 40168055609..00000000000 --- a/addons/stock_picking_wave/security/ir.model.access.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_stock_picking_wave,stock.picking.wave stock users,model_stock_picking_wave,stock.group_stock_user,1,1,1,1
\ No newline at end of file diff --git a/addons/stock_picking_wave/views/stock_picking_wave_views.xml b/addons/stock_picking_wave/views/stock_picking_wave_views.xml deleted file mode 100644 index c8a038ee6e1..00000000000 --- a/addons/stock_picking_wave/views/stock_picking_wave_views.xml +++ /dev/null @@ -1,160 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - <record id="view_picking_wave_form" model="ir.ui.view"> - <field name="name">picking.wave.form</field> - <field name="model">stock.picking.wave</field> - <field name="arch" type="xml"> - <form string="Stock Picking Waves"> - <header> - <button name="confirm_picking" states="draft" string="Confirm" type="object" class="oe_highlight"/> - <button name="print_picking" string="Print" type="object" class="oe_highlight"/> - <button name="done" states="in_progress" string="Done" type="object" class="oe_highlight"/> - <button name="cancel_picking" string="Cancel" type="object" states="in_progress"/> - <field name="state" widget="statusbar" statusbar_visible="in_progress,done"/> - </header> - <sheet> - <div class="oe_title"> - <h1> - <field name="name" class="oe_inline" readonly="1"/> - </h1> - </div> - <group> - <field name="user_id"/> - </group> - <separator string="Pickings"/> - <field name="picking_ids" widget="many2many" domain="[('state', 'not in', ('done', 'cancel'))]" options="{'not_delete': True}"> - <tree> - <field name="name"/> - <field name="backorder_id"/> - <field name="origin"/> - <field name="date"/> - <field name="scheduled_date"/> - <field name="state"/> - <button name="action_assign" string="Confirm picking" type="object" icon="fa-check text-success" attrs="{'invisible': [('state', 'in', ('done', 'cancel', 'confirmed', 'assigned'))]}"/> - <button name="force_assign" string="Force availability" type="object" icon="fa-arrow-right text-success" attrs="{'invisible': [('state', 'in', ('done', 'cancel', 'draft', 'assigned'))]}" groups="stock.group_stock_manager"/> - <button name="action_cancel" string="Cancel picking" type="object" icon="fa-times-circle text-danger" attrs="{'invisible': [('state', 'in', ('done', 'cancel'))]}"/> - </tree> - </field> - </sheet> - <div class="oe_chatter"> - <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/> - <field name="message_ids" widget="mail_thread"/> - </div> - </form> - </field> - </record> - - - <record id="view_picking_wave_tree" model="ir.ui.view"> - <field name="name">picking.wave.tree</field> - <field name="model">stock.picking.wave</field> - <field name="arch" type="xml"> - <tree string="Stock Picking Waves" decoration-muted="state=='cancel'"> - <field name="name"/> - <field name="user_id"/> - <field name="state"/> - </tree> - </field> - </record> - - <record id="view_stock_picking_wave_kanban" model="ir.ui.view"> - <field name="name">stock.picking.wave.kanban</field> - <field name="model">stock.picking.wave</field> - <field name="arch" type="xml"> - <kanban class="o_kanban_mobile"> - <field name="name"/> - <field name="user_id"/> - <field name="state"/> - <templates> - <t t-name="kanban-box"> - <div t-attf-class="oe_kanban_global_click"> - <div class="row mb4"> - <div class="col-xs-6"> - <strong><field name="name"/></strong> - </div> - <div class="col-xs-6 text-right"> - <field name="state" widget="kanban_label_selection"/> - </div> - </div> - <div class="pull-right"> - <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/> - </div> - </div> - </t> - </templates> - </kanban> - </field> - </record> - - <record id="view_picking_wave_filter" model="ir.ui.view"> - <field name="name">picking.wave.filter</field> - <field name="model">stock.picking.wave</field> - <field name="arch" type="xml"> - <search string="Search Picking Waves"> - <field name="name" string="Picking Wave"/> - <filter name="in_progress" string="In Progress" domain="[('state','=', 'in_progress')]" help="Picking Waves not finished"/> - <field name="user_id"/> - <group expand="0" string="Group By"> - <filter string="User" domain="[]" context="{'group_by':'user_id'}"/> - <filter string="State" domain="[]" context="{'group_by':'state'}"/> - </group> - </search> - </field> - </record> - - <record id="action_picking_wave" model="ir.actions.act_window"> - <field name="name">Picking Waves</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">stock.picking.wave</field> - <field name="view_type">form</field> - <field name="view_mode">tree,kanban,form</field> - <field name="context">{"search_default_in_progress" : True,}</field> - <field name="search_view_id" ref="view_picking_wave_filter"/> - <field name="help" type="html"> - <p class="oe_view_nocontent_create"> - Click to create a Picking Wave. - </p><p> - The goal of the picking waves is to group operations that may - (needs to) be done together in order to increase their efficiency. - It may also be useful to assign jobs (one person = one wave) or - help the timing management of operations (tasks to be done at 1pm). - </p> - </field> - </record> - <menuitem action="action_picking_wave" id="menu_action_picking_wave" parent="stock.menu_stock_warehouse_mgmt" sequence="30"/> - - <!-- <record model="ir.ui.view" id="view_stock_picking_wave_inherit"> - <field name="name">stock.picking.wave.inherit.form</field> - <field name="model">stock.picking</field> - <field name="inherit_id" ref="stock.view_picking_form"/> - <field name="arch" type="xml"> - <xpath expr="//field[@name='picking_type_id']" position="after"> - <field name="wave_id" domain="[('state', 'not in', ('done', 'cancel'))]"/> - </xpath> - </field> - </record>--> - <record model="ir.ui.view" id="view_stock_picking_wave_tree_inherit"> - <field name="name">stock.picking.wave.inherit.tree</field> - <field name="model">stock.picking</field> - <field name="inherit_id" ref="stock.vpicktree"/> - <field name="arch" type="xml"> - <xpath expr="//field[@name='picking_type_id']" position="after"> - <field name="wave_id"/> - </xpath> - </field> - </record> - <record model="ir.ui.view" id="view_stock_picking_wave_search_inherit"> - <field name="name">stock.picking.wave.inherit.search</field> - <field name="model">stock.picking</field> - <field name="inherit_id" ref="stock.view_picking_internal_search"/> - <field name="arch" type="xml"> - <xpath expr="//filter[@name='picking_type']" position="after"> - <filter string="Wave" domain="[]" context="{'group_by':'wave_id'}"/> - </xpath> - <xpath expr="//field[@name='picking_type_id']" position="after"> - <field name="wave_id"/> - </xpath> - </field> - </record> - -</odoo> diff --git a/addons/stock_picking_wave/wizard/stock_picking_to_wave.py b/addons/stock_picking_wave/wizard/stock_picking_to_wave.py deleted file mode 100644 index 69b53578018..00000000000 --- a/addons/stock_picking_wave/wizard/stock_picking_to_wave.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import api, fields, models - - -class StockPickingToWave(models.TransientModel): - _name = 'stock.picking.to.wave' - _description = 'Add pickings to a picking wave' - - wave_id = fields.Many2one('stock.picking.wave', string='Picking Wave', required=True) - - @api.multi - def attach_pickings(self): - # use active_ids to add picking line to the selected wave - self.ensure_one() - picking_ids = self.env.context.get('active_ids') - return self.env['stock.picking'].browse(picking_ids).write({'wave_id': self.wave_id.id}) diff --git a/addons/stock_picking_wave/wizard/stock_picking_to_wave_views.xml b/addons/stock_picking_wave/wizard/stock_picking_to_wave_views.xml deleted file mode 100644 index a8ed7dd8bdf..00000000000 --- a/addons/stock_picking_wave/wizard/stock_picking_to_wave_views.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - - <!-- add picking to wave --> - <record model="ir.ui.view" id="picking_to_wave_form"> - <field name="name">stock.picking.to.wave.form</field> - <field name="model">stock.picking.to.wave</field> - <field name="arch" type="xml"> - <form string="Add pickings to wave"> - <separator string="Select a wave"/> - <field name="wave_id" class="oe_inline"/> - <footer> - <button name="attach_pickings" type="object" string="Add to Wave" class="btn-primary"/> - <button string="Cancel" class="btn-default" special="cancel"/> - </footer> - </form> - </field> - </record> - - <!-- add picking to wave action --> - <record model="ir.actions.act_window" id="picking_to_wave_act"> - <field name="name">Add to Wave</field> - <field name="res_model">stock.picking.to.wave</field> - <field name="view_type">form</field> - <field name="view_mode">form</field> - <field name="view_id" ref="picking_to_wave_form"/> - <field name="target">new</field> - </record> - - <act_window id="action_picking_to_wave" - multi="True" - key2="client_action_multi" name="Add to Wave" - res_model="stock.picking.to.wave" src_model="stock.picking" - view_mode="form" target="new" view_type="form" - /> - -</odoo> diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 7a032b59bef..d013a9f9f8b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -38,7 +38,7 @@ from odoo.tools.safe_eval import safe_eval from odoo import http from odoo.http import content_disposition, dispatch_rpc, request, \ serialize_exception as _serialize_exception -from odoo.exceptions import AccessError +from odoo.exceptions import AccessError, UserError from odoo.models import check_method_name _logger = logging.getLogger(__name__) @@ -1418,6 +1418,9 @@ class ExcelExport(ExportFormat, http.Controller): return base + '.xls' def from_data(self, fields, rows): + if len(rows) > 65535: + raise UserError(_('There are too many rows (%s rows, limit: 65535) to export as Excel 97-2003 (.xls) format. Consider splitting the export.') % len(rows)) + workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Sheet 1') diff --git a/addons/web/static/src/js/chrome/pager.js b/addons/web/static/src/js/chrome/pager.js index bbe69c6d86a..c7f22a6f2c9 100644 --- a/addons/web/static/src/js/chrome/pager.js +++ b/addons/web/static/src/js/chrome/pager.js @@ -97,10 +97,16 @@ var Pager = Widget.extend({ /** * Sets the state of the pager and renders it * @param {Object} [state] the values to update (size, current_min and limit) + * @param {Object} [options] + * @param {boolean} [options.notifyChange] set to true to make the pager + * notify the environment that its state changed */ - updateState: function (state) { + updateState: function (state, options) { _.extend(this.state, state); this._render(); + if (options && options.notifyChange) { + this.trigger('pager_changed', _.clone(this.state)); + } }, //-------------------------------------------------------------------------- diff --git a/addons/web/static/src/js/chrome/view_manager.js b/addons/web/static/src/js/chrome/view_manager.js index 2dae906c6db..d89f035d34d 100644 --- a/addons/web/static/src/js/chrome/view_manager.js +++ b/addons/web/static/src/js/chrome/view_manager.js @@ -363,7 +363,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, { var View = this.registry.get(arch.attrs.js_class || view_descr.type); var params = _.extend({}, view_options, {userContext: this.getSession().user_context}); if (view_descr.type === "form" && ((this.action.target === 'new' || this.action.target === 'inline') || - (view_options && view_options.mode === 'edit'))) { + (view_options && (view_options.mode === 'edit' || view_options.context.form_view_initial_mode)))) { params.mode = params.initial_mode || 'edit'; } view_descr.searchview_hidden = View.prototype.searchview_hidden; diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index a1f87a38fd2..4c4671275f2 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -846,6 +846,13 @@ var HandleWidget = AbstractField.extend({ tagName: 'span', description: "", supportedFieldTypes: ['integer'], + + /* + * @override + */ + isSet: function () { + return true; + }, }); var FieldEmail = InputField.extend({ @@ -1787,7 +1794,7 @@ var FieldProgressBar = AbstractField.extend({ } else { this.$el.on('click', function () { if (!self.write_mode) { - var $input = $('<input>', {type: 'text', class: 'o_progressbar_value'}); + var $input = $('<input>', {type: 'text', class: 'o_progressbar_value o_input'}); $input.on('blur', _.bind(self.on_change_input, self)); self.$('.o_progressbar_value').replaceWith($input); self.write_mode = true; diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index ba9b947d6a3..f396699bc3d 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -1087,7 +1087,11 @@ var FieldOne2Many = FieldX2Many.extend({ ev.stopPropagation(); if (this.editable) { - if (!this.creatingRecord) { + if (!this.activeActions.create) { + if (ev.data.onFail) { + ev.data.onFail(); + } + } else if (!this.creatingRecord) { this.creatingRecord = true; this._setValue({ operation: 'CREATE', diff --git a/addons/web/static/src/js/services/data_manager.js b/addons/web/static/src/js/services/data_manager.js index 999a9d8df01..77857ef2d31 100644 --- a/addons/web/static/src/js/services/data_manager.js +++ b/addons/web/static/src/js/services/data_manager.js @@ -398,11 +398,6 @@ return core.Class.extend({ */ _processFieldsView: function (viewInfo) { var viewFields = this._processFields(viewInfo.type, viewInfo.arch, viewInfo.fields); - // by default fetch display_name and id - if (!viewInfo.fields.display_name) { - viewInfo.fields.display_name = {type: 'char'}; - viewFields.display_name = {}; - } viewInfo.fieldsInfo = {}; viewInfo.fieldsInfo[viewInfo.type] = viewFields; utils.deepFreeze(viewInfo.fields); diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index cfdee6793dd..67de3ec8ad9 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -539,6 +539,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { * reload */ _onReload: function (event) { + event.stopPropagation(); // prevent other controllers from handling this request var data = event && event.data || {}; var handle = data.db_id; if (handle) { @@ -546,7 +547,10 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { this.model.reload(handle).then(this._confirmSave.bind(this, handle)); } else { // no db_id given, so reload the main record - this.reload({fieldNames: data.fieldNames}); + this.reload({ + fieldNames: data.fieldNames, + keepChanges: data.keepChanges || false, + }); } }, /** diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 537fa11fdb9..5eca6c5374f 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1631,8 +1631,8 @@ var BasicModel = AbstractModel.extend({ */ _fetchRecord: function (record, options) { var self = this; - var fieldNames = options && options.fieldNames || - _.uniq(record.getFieldNames().concat(['display_name'])); + var fieldNames = options && options.fieldNames || record.getFieldNames(); + fieldNames = _.uniq(fieldNames.concat(['display_name'])); return this._rpc({ model: record.model, method: 'read', @@ -2045,7 +2045,7 @@ var BasicModel = AbstractModel.extend({ if (record.data.hasOwnProperty(domainModel)) { domainModel = record._changes && record._changes[domainModel] || record.data[domainModel]; } - var domainValue = record._changes && record._changes[fieldName] || record.data[fieldName]; + var domainValue = record._changes && record._changes[fieldName] || record.data[fieldName] || []; // avoid rpc if not necessary var hasChanged = this._saveSpecialDataCache(record, fieldName, { @@ -2339,6 +2339,16 @@ var BasicModel = AbstractModel.extend({ _generateOnChangeData: function (record) { var commands = this._generateX2ManyCommands(record, {withReadonly: true}); var data = _.extend(this.get(record.id, {raw: true}).data, commands); + // 'display_name' is automatically added to the list of fields to fetch, + // when fetching a record, even if it doesn't appear in the view. However, + // only the fields in the view must be passed to the onchange RPC, so we + // remove it from the data sent by RPC if it isn't in the view. + var hasDisplayName = _.some(record.fieldsInfo, function (fieldsInfo) { + return 'display_name' in fieldsInfo; + }); + if (!hasDisplayName) { + delete data.display_name; + } // one2many records have a parentID if (record.parentID) { @@ -2399,7 +2409,10 @@ var BasicModel = AbstractModel.extend({ _.each(list._changes, function (change) { if (change.operation === 'ADD') { relRecordAdded.push(self.localData[change.id]); - } else if (change.operation === 'UPDATE') { + } else if (change.operation === 'UPDATE' && !self.isNew(change.id)) { + // ignore new records that would have been updated + // afterwards, as all their changes would already + // be aggregated in the CREATE command relRecordUpdated.push(self.localData[change.id]); } }); @@ -2740,8 +2753,7 @@ var BasicModel = AbstractModel.extend({ var fieldInfo = element.fieldsInfo[element.viewType][fieldName]; var rawModifiers = JSON.parse(fieldInfo.modifiers || "{}"); var modifiers = self._evalModifiers(record, rawModifiers); - var required = 'required' in modifiers ? modifiers.required : field.required; - if (required && !self._isFieldSet(recordData[fieldName], field.type)) { + if (modifiers.required && !self._isFieldSet(recordData[fieldName], field.type)) { isValid = false; } }); diff --git a/addons/web/static/src/js/views/field_manager_mixin.js b/addons/web/static/src/js/views/field_manager_mixin.js index 1ee7bf4a501..aaf7e4a5859 100644 --- a/addons/web/static/src/js/views/field_manager_mixin.js +++ b/addons/web/static/src/js/views/field_manager_mixin.js @@ -120,6 +120,7 @@ var FieldManagerMixin = { */ _onLoad: function (event) { var self = this; + event.stopPropagation(); // prevent other field managers from handling this request var data = event.data; if (!data.on_success) { return; } var params = {}; diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 0718b4e202e..0bd3c263666 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -28,6 +28,7 @@ var FormController = BasicController.extend({ this._super.apply(this, arguments); this.actionButtons = params.actionButtons; + this.disableAutofocus = params.disableAutofocus; this.footerToButtons = params.footerToButtons; this.defaultButtons = params.defaultButtons; this.hasSidebar = params.hasSidebar; @@ -42,7 +43,9 @@ var FormController = BasicController.extend({ * Calls autofocus on the renderer */ autofocus: function () { - this.renderer.autofocus(); + if (!this.disableAutofocus) { + this.renderer.autofocus(); + } }, /** * This method switches the form view in edit mode, with a new record. @@ -305,7 +308,7 @@ var FormController = BasicController.extend({ this.set('title', title); this._updateButtons(); this._updateSidebar(); - return this._super.apply(this, arguments); + return this._super.apply(this, arguments).then(this.autofocus.bind(this)); }, /** * @private diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js index 1d788ac2c05..63d7fd44917 100644 --- a/addons/web/static/src/js/views/form/form_renderer.js +++ b/addons/web/static/src/js/views/form/form_renderer.js @@ -246,10 +246,6 @@ var FormRenderer = BasicRenderer.extend({ _renderButtonBox: function (node) { var self = this; var $result = $('<' + node.tag + '>', { 'class': 'o_not_full' }); - // Avoid to show buttons if we are in create mode (edit mode without res_id) - if (this.mode === 'edit' && !this.state.res_id) { - return $result; - } var buttons = _.map(node.children, function (child) { if (child.tag === 'button') { return self._renderStatButton(child); @@ -816,9 +812,6 @@ var FormRenderer = BasicRenderer.extend({ self._addFieldTooltip(widget, $label); } }); - - // Focus the default field (in edit mode) - self.autofocus(); }, /** * Sets id attribute of given widget to idForLabel diff --git a/addons/web/static/src/js/views/form/form_view.js b/addons/web/static/src/js/views/form/form_view.js index f0264b67307..b48a5488848 100644 --- a/addons/web/static/src/js/views/form/form_view.js +++ b/addons/web/static/src/js/views/form/form_view.js @@ -29,6 +29,7 @@ var FormView = BasicView.extend({ this.loadParams.type = 'record'; this.loadParams.parentID = params.parentID; + this.controllerParams.disableAutofocus = params.disable_autofocus; this.controllerParams.hasSidebar = params.sidebar; this.controllerParams.toolbarActions = viewInfo.toolbar; this.controllerParams.footerToButtons = params.footer_to_buttons; diff --git a/addons/web/static/src/js/views/graph/graph_controller.js b/addons/web/static/src/js/views/graph/graph_controller.js index d68808bac1d..77e3f1e7a40 100644 --- a/addons/web/static/src/js/views/graph/graph_controller.js +++ b/addons/web/static/src/js/views/graph/graph_controller.js @@ -102,10 +102,20 @@ var GraphController = AbstractController.extend({ }); }, /** + * @private + */ + _update: function () { + this._updateButtons(); + return this._super.apply(this, arguments); + }, + /** * makes sure that the buttons in the control panel matches the current * state (so, correct active buttons and stuff like that) */ _updateButtons: function () { + if (!this.$buttons) { + return; + } var state = this.model.get(); this.$buttons.find('.o_graph_button').removeClass('active'); this.$buttons diff --git a/addons/web/static/src/js/views/graph/graph_model.js b/addons/web/static/src/js/views/graph/graph_model.js index 50e9f224697..a6d2b057d0e 100644 --- a/addons/web/static/src/js/views/graph/graph_model.js +++ b/addons/web/static/src/js/views/graph/graph_model.js @@ -55,14 +55,15 @@ return AbstractModel.extend({ * to keep track of various entities. */ load: function (params) { - this.initialGroupBys = params.groupBys; + var groupBys = params.context.graph_groupbys || params.groupBys; + this.initialGroupBys = groupBys; this.fields = params.fields; this.modelName = params.modelName; this.chart = { data: [], - groupedBy: params.groupedBy.length ? params.groupedBy : params.groupBys, - measure: params.measure, - mode: params.mode, + groupedBy: params.groupedBy.length ? params.groupedBy : groupBys, + measure: params.context.graph_measure || params.measure, + mode: params.context.graph_mode || params.mode, domain: params.domain, context: params.context, }; @@ -85,6 +86,12 @@ return AbstractModel.extend({ * @returns {Deferred} */ reload: function (handle, params) { + if ('context' in params) { + this.chart.context = params.context; + this.chart.groupedBy = params.context.graph_groupbys || this.chart.groupedBy; + this.chart.measure = params.context.graph_measure || this.chart.measure; + this.chart.mode = params.context.graph_mode || this.chart.mode; + } if ('domain' in params) { this.chart.domain = params.domain; } diff --git a/addons/web/static/src/js/views/graph/graph_view.js b/addons/web/static/src/js/views/graph/graph_view.js index 08b5ce1968f..423d52ca64c 100644 --- a/addons/web/static/src/js/views/graph/graph_view.js +++ b/addons/web/static/src/js/views/graph/graph_view.js @@ -27,7 +27,7 @@ var GraphView = AbstractView.extend({ /** * @override */ - init: function (viewInfo, params) { + init: function (viewInfo) { this._super.apply(this, arguments); var measure; @@ -57,9 +57,9 @@ var GraphView = AbstractView.extend({ this.controllerParams.measures = measures; this.rendererParams.stacked = viewInfo.arch.attrs.stacked !== "False"; - this.loadParams.mode = params.context.graph_mode || viewInfo.arch.attrs.type || 'bar'; - this.loadParams.measure = params.context.graph_measure || measure || '__count__'; - this.loadParams.groupBys = params.context.graph_groupbys || groupBys || []; + this.loadParams.mode = viewInfo.arch.attrs.type || 'bar'; + this.loadParams.measure = measure || '__count__'; + this.loadParams.groupBys = groupBys || []; this.loadParams.fields = viewInfo.fields; }, }); diff --git a/addons/web/static/src/js/views/list/list_controller.js b/addons/web/static/src/js/views/list/list_controller.js index 3b74f140e4d..33637e53f52 100644 --- a/addons/web/static/src/js/views/list/list_controller.js +++ b/addons/web/static/src/js/views/list/list_controller.js @@ -313,7 +313,11 @@ var ListController = BasicController.extend({ */ _onAddRecord: function (event) { event.stopPropagation(); - this._addRecord(); + if (this.activeActions.create) { + this._addRecord(); + } else if (event.data.onFail) { + event.data.onFail(); + } }, /** * Handles a click on a button by performing its action. diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js index 3cd93bb6e8b..c5f65ecc6e2 100644 --- a/addons/web/static/src/js/views/list/list_editable_renderer.js +++ b/addons/web/static/src/js/views/list/list_editable_renderer.js @@ -341,7 +341,12 @@ ListRenderer.include({ if (this.currentRow < this.state.data.length - 1) { this._selectCell(this.currentRow + 1, 0); } else { - this.unselectRow().then(this.trigger_up.bind(this, 'add_record')); + var self = this; + this.unselectRow().then(function () { + self.trigger_up('add_record', { + onFail: self._selectCell.bind(self, 0, 0, {}), + }); + }); } }, /** diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js index d74af7fee22..7eb2ba4bc6b 100644 --- a/addons/web/static/src/js/views/pivot/pivot_model.js +++ b/addons/web/static/src/js/views/pivot/pivot_model.js @@ -223,15 +223,15 @@ var PivotModel = AbstractModel.extend({ */ load: function (params) { this.initialDomain = params.domain; - this.initialRowGroupBys = params.rowGroupBys; + this.initialRowGroupBys = params.context.pivot_row_groupby || params.rowGroupBys; this.fields = params.fields; this.modelName = params.modelName; this.data = { domain: params.domain, context: _.extend({}, session.user_context, params.context), groupedBy: params.groupedBy, - colGroupBys: params.colGroupBys, - measures: params.measures, + colGroupBys: params.context.pivot_column_groupby || params.colGroupBys, + measures: this._processMeasures(params.context.pivot_measures) || params.measures, sorted_column: {}, }; this.defaultGroupedBy = params.groupedBy; @@ -245,6 +245,12 @@ var PivotModel = AbstractModel.extend({ */ reload: function (handle, params) { var self = this; + if ('context' in params) { + this.data.context = params.context; + this.data.colGroupBys = params.context.pivot_column_groupby || this.data.colGroupBys; + this.data.groupedBy = params.context.pivot_row_groupby || this.data.groupedBy; + this.data.measures = this._processMeasures(params.context.pivot_measures) || this.data.measures; + } if ('domain' in params) { this.data.domain = params.domain; } else { @@ -261,7 +267,7 @@ var PivotModel = AbstractModel.extend({ var old_col_root = this.data.main_col.root; return this._loadData().then(function () { var new_groupby_length; - if (!('groupBy' in params)) { + if (!('groupBy' in params) && !('pivot_row_groupby' in (params.context || {}))) { // we only update the row groupbys according to the old groupbys // if we don't have the key 'groupBy' in params. In that case, // we want to have the full open state for the groupbys. @@ -649,6 +655,29 @@ var PivotModel = AbstractModel.extend({ this.data.main_col.root = main_col_header; }, /** + * In the preview implementation of the pivot view (a.k.a. version 2), + * the virtual field used to display the number of records was named + * __count__, whereas __count is actually the one used in xml. So + * basically, activating a filter specifying __count as measures crashed. + * Unfortunately, as __count__ was used in the JS, all filters saved as + * favorite at that time were saved with __count__, and not __count. + * So in order the make them still work with the new implementation, we + * handle both __count__ and __count. + * + * This function replaces in the given array of measures occurences of + * '__count__' by '__count'. + * + * @param {Array[string] || undefined} measures + * @return {Array[string] || undefined} + */ + _processMeasures: function (measures) { + if (measures) { + return _.map(measures, function (measure) { + return measure === '__count__' ? '__count' : measure; + }); + } + }, + /** * Format a value to a usable string, for the renderer to display. * * @param {any} value diff --git a/addons/web/static/src/js/views/pivot/pivot_view.js b/addons/web/static/src/js/views/pivot/pivot_view.js index 356672081d9..7e4dddc4a52 100644 --- a/addons/web/static/src/js/views/pivot/pivot_view.js +++ b/addons/web/static/src/js/views/pivot/pivot_view.js @@ -87,9 +87,9 @@ var PivotView = AbstractView.extend({ activeMeasures.push('__count'); } - this.loadParams.measures = params.context.pivot_measures || activeMeasures; - this.loadParams.colGroupBys = params.context.pivot_column_groupby || colGroupBys; - this.loadParams.rowGroupBys = params.context.pivot_row_groupby || rowGroupBys; + this.loadParams.measures = activeMeasures; + this.loadParams.colGroupBys = colGroupBys; + this.loadParams.rowGroupBys = rowGroupBys; this.loadParams.fields = fields; this.controllerParams.title = params.title || arch.attrs.string || _t("Untitled"); diff --git a/addons/web/static/src/less/list_view.less b/addons/web/static/src/less/list_view.less index b7e362cc57f..f509e82345c 100644 --- a/addons/web/static/src/less/list_view.less +++ b/addons/web/static/src/less/list_view.less @@ -118,7 +118,9 @@ } .o_data_cell.o_invisible_modifier { - display: table-cell!important; // Override invisible to keep the cells aligned + // Override display: none to keep table cells aligned. Note: cannot use + // 'initial' as it will force them to 'inline', not 'table-cell'. + display: table-cell!important; } //-------------------------------------------------------------------------- diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index b533f5056d2..6347ed63432 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -1259,6 +1259,8 @@ QUnit.module('basic_fields', { // Copying from a div tag with white-space:pre-wrap doesn't work in Firefox assert.strictEqual(form.$('[name="txt"]').prop("tagName").toLowerCase(), 'span', "the field contents should be surrounded by a span tag"); + + form.destroy(); }); QUnit.module('FieldBinary'); @@ -1594,6 +1596,24 @@ QUnit.module('basic_fields', { form.destroy(); }); + QUnit.test('handle widget with falsy values', function (assert) { + assert.expect(1); + + var list = createView({ + View: ListView, + model: 'partner', + data: this.data, + arch: '<tree>' + + '<field name="sequence" widget="handle"/>' + + '<field name="display_name"/>' + + '</tree>', + }); + + assert.strictEqual(list.$('.o_row_handle:visible').length, this.data.partner.records.length, + 'there should be a visible handle for each record'); + list.destroy(); + }); + QUnit.module('FieldDate'); @@ -3878,6 +3898,44 @@ QUnit.module('basic_fields', { "field selector popover should contain 'Color index' field"); form.destroy(); }); + + QUnit.test('domain field: handle false domain as []', function (assert) { + assert.expect(2); + + this.data.partner.records[0].foo = false; + this.data.partner.fields.bar.type = "char"; + this.data.partner.records[0].bar = "product"; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: + '<form>' + + '<sheet>' + + '<group>' + + '<field name="bar"/>' + + '<field name="foo" widget="domain" options="{\'model\': \'bar\'}"/>' + + '</group>' + + '</sheet>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'search_count') { + assert.deepEqual(args.args[0], [], "should send a valid domain"); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + var $warning = form.$('.o_field_widget[name=foo] .text-warning'); + assert.strictEqual($warning.length, 0, "should not display that the domain is invalid"); + + form.destroy(); + }); }); }); }); diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 82b668a11fb..b6b463fdc32 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -998,14 +998,15 @@ QUnit.module('relational_fields', { }); QUnit.test('list in form: default_get with x2many create', function (assert) { - assert.expect(3); + assert.expect(5); + var displayName = 'brandon is the new timmy'; this.data.partner.onchanges.timmy = function (obj) { assert.deepEqual( obj.timmy, [ [6, false, []], - [0, obj.timmy[1][1], {display_name: 'brandon is the new timmy', name: 'brandon'}] + [0, obj.timmy[1][1], {display_name: displayName, name: 'brandon'}] ], "should have properly created the x2many command list"); obj.int_field = obj.timmy.length; @@ -1029,6 +1030,15 @@ QUnit.module('relational_fields', { if (args.method === 'default_get') { return $.when({timmy: [[0, 0, {display_name: 'brandon is the new timmy', name: 'brandon'}]]}); } + if (args.method === 'create') { + assert.deepEqual(args.args[0], { + int_field: 2, + timmy: [ + [6, false, []], + [0, false, {display_name: displayName, name: 'brandon'}], + ], + }, "should send the correct values to create"); + } return this._super.apply(this, arguments); }, }); @@ -1038,6 +1048,12 @@ QUnit.module('relational_fields', { assert.strictEqual($('input.o_field_integer').val(), '2', "should have called and executed the onchange properly"); + // edit the subrecord and save + displayName = 'new value'; + form.$('.o_data_cell').click(); + form.$('.o_data_cell input').val(displayName).trigger('input'); + form.$buttons.find('.o_form_button_save').click(); + form.destroy(); }); @@ -2521,6 +2537,7 @@ QUnit.module('relational_fields', { arch:'<form string="Partners">' + '<field name="p">' + '<kanban create="0">' + + '<field name="display_name"/>' + '<templates>' + '<t t-name="kanban-box">' + '<div class="oe_kanban_global_click">' + @@ -3499,7 +3516,7 @@ QUnit.module('relational_fields', { rpcCount++; if (args.method === 'write') { assert.deepEqual(args.args[1].p, [[0, args.args[1].p[0][1], { - display_name: false, int_field: 123, product_id: 41 + int_field: 123, product_id: 41 }]]); } return this._super(route, args); @@ -3736,7 +3753,7 @@ QUnit.module('relational_fields', { if (args.method === 'default_get') { var expected = counter === 0 ? [[4, 2, false]] : - [[4, 2, false], [0, args.kwargs.context.turtles[1][1], {display_name: false, turtle_foo: 'hammer'}]]; + [[4, 2, false], [0, args.kwargs.context.turtles[1][1], {turtle_foo: 'hammer'}]]; assert.deepEqual(args.kwargs.context.turtles, expected, "should have properly evaluated turtles key in context"); counter++; @@ -5483,6 +5500,43 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('onchange and required fields with override in arch', function (assert) { + assert.expect(4); + + this.data.partner.onchanges = { + turtles: function (obj) {} + }; + this.data.turtle.fields.turtle_foo.required = true; + this.data.partner.records[0].turtles = []; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'<form string="Partners">' + + '<field name="turtles">' + + '<tree editable="bottom">' + + '<field name="turtle_int"/>' + + '<field name="turtle_foo" required="0"/>' + + '</tree>' + + '</field>' + + '</form>', + res_id: 1, + mockRPC: function (route, args) { + assert.step(args.method); + return this._super.apply(this, arguments); + }, + }); + form.$buttons.find('.o_form_button_edit').click(); + + // triggers an onchange on partner, because the new record is valid + form.$('.o_field_x2many_list_row_add a').click(); + + assert.verifySteps(['read', 'default_get', 'onchange']); + form.destroy(); + }); + + QUnit.module('FieldMany2Many'); @@ -5638,6 +5692,7 @@ QUnit.module('relational_fields', { arch:'<form string="Partners">' + '<field name="timmy">' + '<kanban create="0">' + + '<field name="display_name"/>' + '<templates>' + '<t t-name="kanban-box">' + '<div class="oe_kanban_global_click">' + @@ -6977,6 +7032,71 @@ QUnit.module('relational_fields', { list.destroy(); }); + QUnit.test('search more in many2one: group and use the pager', function (assert) { + assert.expect(2); + + this.data.partner.records.push({ + id: 5, + display_name: "Partner 4", + }, { + id: 6, + display_name: "Partner 5", + }, { + id: 7, + display_name: "Partner 6", + }, { + id: 8, + display_name: "Partner 7", + }, { + id: 9, + display_name: "Partner 8", + }, { + id: 10, + display_name: "Partner 9", + }); + + this.data.partner.fields.datetime.searchable = true; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<group>' + + '<field name="trululu"/>' + + '</group>' + + '</sheet>' + + '</form>', + + res_id: 1, + archs: { + 'partner,false,list': '<tree limit="7"><field name="display_name"/></tree>', + 'partner,false,search': '<search><group>' + + ' <filter name="bar" string="Bar" context="{\'group_by\': \'bar\'}"/>' + + '</group></search>', + }, + viewOptions: { + mode: 'edit', + }, + }); + + var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); + form.$('.o_field_many2one input').click(); + $dropdown.find('.o_m2o_dropdown_option:contains(Search)').mouseenter().click(); // Open Search More + + $('.modal .o_searchview_more').click(); // Magnifying class for more filters + $('.modal .o_search_options .o_group_by_menu a:contains(Bar)').click(); // group by 'Bar' + + $('.modal .o_group_header:first').click(); + assert.strictEqual($('.modal tbody:nth(1) .o_data_row').length, 7, + "should display 7 records in the first page"); + $('.modal .o_group_header:first .o_pager_next').click(); + assert.strictEqual($('.modal tbody:nth(1) .o_data_row').length, 1, + "should display 1 record in the second page"); + + form.destroy(); + }); + QUnit.test('field many2many_tags keeps focus when being edited', function (assert) { assert.expect(7); diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js index fdc70507a12..65cbc16fda0 100644 --- a/addons/web/static/tests/helpers/test_utils.js +++ b/addons/web/static/tests/helpers/test_utils.js @@ -470,6 +470,20 @@ function triggerPositionalMouseEvent(x, y, type){ } /** + * simulate a keypress event for a given character + * @param {string} the character + */ +function triggerKeypressEvent(char) { + var keycode; + if (char === "Enter") { + keycode = $.ui.keyCode.ENTER; + } else { + keycode = char.charCodeAt(0); + } + return $('body').trigger($.Event('keypress', {which: keycode, keyCode: keycode})); +} + +/** * Removes the src attribute on images and iframes to prevent not found errors, * and optionally triggers an rpc with the src url as route on a widget. * @@ -518,6 +532,7 @@ return $.when( dragAndDrop: dragAndDrop, triggerMouseEvent: triggerMouseEvent, triggerPositionalMouseEvent: triggerPositionalMouseEvent, + triggerKeypressEvent: triggerKeypressEvent, removeSrcAttribute: removeSrcAttribute, }; }); diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index dcb422b00ca..f87eea2d154 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -1136,7 +1136,7 @@ QUnit.module('Views', { mockRPC: function (route, args) { if (args.method === "onchange") { assert.deepEqual(args.args[3], - {"foo": "1", "p": "", "p.bar": "", "p.display_name": "", "p.product_id": "", "timmy": "", "timmy.name": ""}, + {"foo": "1", "p": "", "p.bar": "", "p.product_id": "", "timmy": "", "timmy.name": ""}, "should send only the fields used in the views"); } return this._super(route, args); @@ -1284,7 +1284,6 @@ QUnit.module('Views', { if (args.method === 'onchange') { assert.deepEqual(args.args[3], { p: '', - 'p.display_name': '', 'p.foo': '1' }, "onchangeSpec should be correct (with sub fields)"); } @@ -2678,7 +2677,7 @@ QUnit.module('Views', { form.destroy(); }); - QUnit.test('button box is not rendered in create mode', function (assert) { + QUnit.test('button box is rendered in create mode', function (assert) { assert.expect(3); var form = createView({ @@ -2708,8 +2707,8 @@ QUnit.module('Views', { // create mode (leave edition first!) form.$buttons.find('.o_form_button_cancel').click(); form.$buttons.find('.o_form_button_create').click(); - assert.strictEqual(form.$('.oe_stat_button').length, 0, - "button box should not be displayed when creating a new record"); + assert.strictEqual(form.$('.oe_stat_button').length, 1, + "button box should be displayed when creating a new record as well"); form.destroy(); }); @@ -2863,6 +2862,92 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('display_name not sent for onchanges if not in view', function (assert) { + assert.expect(7); + + this.data.partner.records[0].timmy = [12]; + this.data.partner.onchanges = { + foo: function () {}, + }; + this.data.partner_type.onchanges = { + name: function () {}, + }; + var readInModal = false; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<group>' + + '<field name="foo"/>' + + '<field name="timmy">' + + '<tree>' + + '<field name="name"/>' + + '</tree>' + + '<form>' + + '<field name="name"/>' + + '<field name="color"/>' + + '</form>' + + '</field>' + + '</group>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'read' && args.model === 'partner') { + assert.deepEqual(args.args[1], ['foo', 'timmy', 'display_name'], + "should read display_name even if not in the view"); + } + if (args.method === 'read' && args.model === 'partner_type') { + if (!readInModal) { + assert.deepEqual(args.args[1], ['name'], + "should not read display_name for records in the list"); + } else { + assert.deepEqual(args.args[1], ['name', 'color', 'display_name'], + "should read display_name when opening the subrecord"); + } + } + if (args.method === 'onchange' && args.model === 'partner') { + assert.deepEqual(args.args[1], { + id: 1, + foo: 'coucou', + timmy: [[6, false, [12]]], + }, "should only send the value of fields in the view (+ id)"); + assert.deepEqual(args.args[3], { + foo: '1', + timmy: '', + 'timmy.name': '1', + 'timmy.color': '', + }, "only the fields in the view should be in the onchange spec"); + } + if (args.method === 'onchange' && args.model === 'partner_type') { + assert.deepEqual(args.args[1], { + id: 12, + name: 'new name', + color: 2, + }, "should only send the value of fields in the view (+ id)"); + assert.deepEqual(args.args[3], { + name: '1', + color: '', + }, "only the fields in the view should be in the onchange spec"); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + // trigger the onchange + form.$('.o_field_widget[name=foo]').val("coucou").trigger('input'); + + // open a subrecord and trigger an onchange + readInModal = true; + form.$('.o_data_row .o_data_cell:first').click(); + $('.modal .o_field_widget[name=name]').val("new name").trigger('input'); + + form.destroy(); + }); + QUnit.test('onchanges on date(time) fields', function (assert) { assert.expect(6); @@ -3761,7 +3846,6 @@ QUnit.module('Views', { if (args.method === 'create') { var command = args.args[0].p; assert.deepEqual(command, [[0, command[0][1], { - display_name: false, timmy: [[6, false, [12]]], }]], "the default partner_type_id should be equal to 12"); } @@ -4233,6 +4317,32 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('no autofocus with disable_autofocus option [REQUIRE FOCUS]', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<field name="int_field"/>' + + '<field name="foo"/>' + + '</form>', + viewOptions: { + disable_autofocus: true, + }, + }); + assert.notStrictEqual(document.activeElement, form.$('input[name="int_field"]')[0], + "int_field field should not have focus"); + + form.update({}); + + assert.notStrictEqual(document.activeElement, form.$('input[name="int_field"]')[0], + "int_field field should not have focus"); + + form.destroy(); + }); + QUnit.test('open one2many form containing many2many_tags', function (assert) { assert.expect(4); @@ -5625,6 +5735,61 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('reload event is handled only once', function (assert) { + // In this test, several form controllers are nested (two of them are + // opened in dialogs). When the users clicks on save in the last + // opened dialog, a 'reload' event is triggered up to reload the (direct) + // parent view. If this event isn't stopPropagated by the first controller + // catching it, it will crash when the other one will try to handle it, + // as this one doesn't know at all the dataPointID to reload. + assert.expect(9); + + var arch = '<form>' + + '<field name="display_name"/>' + + '<field name="trululu"/>' + + '</form>'; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: arch, + archs: { + 'partner,false,form': arch, + }, + res_id: 2, + mockRPC: function (route, args) { + assert.step(args.method); + if (args.method === 'get_formview_id') { + return $.when(false); + } + return this._super.apply(this, arguments); + }, + viewOptions: { + mode: 'edit', + }, + }); + + form.$('.o_external_button').click(); // open the many2one record in a modal + $('.modal .o_external_button').click(); // in the modal, open the many2one record in another modal + + $('.modal:nth(1) .o_field_widget[name=display_name]').val('new name').trigger('input'); + $('.modal:nth(1) .modal-footer .btn-primary').first().click(); // save changes + + assert.strictEqual($('.modal .o_field_widget[name=trululu] input').val(), 'new name', + "record should have been reloaded"); + assert.verifySteps([ + "read", // main record + "get_formview_id", // id of first form view opened in a dialog + "read", // first dialog + "get_formview_id", // id of second form view opened in a dialog + "read", // second dialog + "write", // save second dialog + "read", // reload first dialog + ]); + + form.destroy(); + }); + QUnit.test('rainbowman attributes correctly passed on button click', function (assert) { assert.expect(1); diff --git a/addons/web/static/tests/views/graph_tests.js b/addons/web/static/tests/views/graph_tests.js index c7d69b194ff..07f7d060347 100644 --- a/addons/web/static/tests/views/graph_tests.js +++ b/addons/web/static/tests/views/graph_tests.js @@ -372,6 +372,52 @@ QUnit.module('Views', { }); }); + QUnit.test('correctly uses graph_ keys from the context (at reload)', function (assert) { + var done = assert.async(); + assert.expect(8); + + var graph = createView({ + View: GraphView, + model: "foo", + data: this.data, + arch: '<graph><field name="product_id"/></graph>', + }); + + assert.strictEqual(graph.renderer.state.mode, "bar", "should be in bar chart mode"); + assert.ok(graph.$buttons.find('button[data-mode="bar"]').hasClass('active'), + 'bar chart button should be active'); + + var reloadParams = { + context: { + graph_measure: 'foo', + graph_mode: 'line', + graph_groupbys: ['color_id'], + }, + }; + graph.reload(reloadParams); + return concurrency.delay(0).then(function () { + // check measure + assert.strictEqual(graph.$('text.nv-legend-text:contains(Foo)').length, 1, + "should now use the 'foo' measure"); + + // check mode + assert.strictEqual(graph.renderer.state.mode, "line", "should be in line chart mode"); + assert.notOk(graph.$buttons.find('button[data-mode="bar"]').hasClass('active'), + 'bar chart button should not be active'); + assert.ok(graph.$buttons.find('button[data-mode="line"]').hasClass('active'), + 'line chart button should be active'); + + // check groupbys + assert.strictEqual(graph.$('text:contains(xphone)').length, 0, + "should not contain a text element with product in legend"); + assert.strictEqual(graph.$('text:contains(red)').length, 1, + "should contain a text element with color in legend"); + + graph.destroy(); + done(); + }); + }); + QUnit.test('reload graph with correct fields', function (assert) { assert.expect(2); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 4b33af9f0a6..2ac373dbcd0 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -19,6 +19,7 @@ QUnit.module('Views', { int_field: {string: "int_field", type: "integer", sortable: true}, qux: {string: "my float", type: "float"}, m2o: {string: "M2O field", type: "many2one", relation: "bar"}, + o2m: {string: "O2M field", type: "one2many", relation: "bar"}, m2m: {string: "M2M field", type: "many2many", relation: "bar"}, amount: {string: "Monetary field", type: "monetary"}, currency_id: {string: "Currency", type: "many2one", @@ -1994,6 +1995,80 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('navigation with tab on a list with create="0"', function (assert) { + assert.expect(4); + + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree editable="bottom" create="0">' + + '<field name="display_name"/>' + + '</tree>', + }); + + assert.strictEqual(list.$('.o_data_row').length, 4, + "the list should contain 4 rows"); + + list.$('.o_data_row:nth(2) .o_data_cell:first').click(); + assert.ok(list.$('.o_data_row:nth(2)').hasClass('o_selected_row'), + "third row should be in edition"); + + // Press 'Tab' -> should go to next line + list.$('.o_selected_row input').trigger({type: 'keydown', which: 9}); + assert.ok(list.$('.o_data_row:nth(3)').hasClass('o_selected_row'), + "fourth row should be in edition"); + + // Press 'Tab' -> should go back to first line as the create action isn't available + list.$('.o_selected_row input').trigger({type: 'keydown', which: 9}); + assert.ok(list.$('.o_data_row:first').hasClass('o_selected_row'), + "first row should be in edition"); + + list.destroy(); + }); + + + QUnit.test('navigation with tab on a one2many list with create="0"', function (assert) { + assert.expect(4); + + this.data.foo.records[0].o2m = [1, 2]; + var form = createView({ + View: FormView, + model: 'foo', + data: this.data, + arch: '<form><sheet>' + + '<field name="o2m">' + + '<tree editable="bottom" create="0">' + + '<field name="display_name"/>' + + '</tree>' + + '</field>' + + '</sheet></form>', + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + assert.strictEqual(form.$('.o_field_widget[name=o2m] .o_data_row').length, 2, + "there should be two records in the many2many"); + + form.$('.o_field_widget[name=o2m] .o_data_cell:first').click(); + assert.ok(form.$('.o_field_widget[name=o2m] .o_data_row:first').hasClass('o_selected_row'), + "first row should be in edition"); + + // Press 'Tab' -> should go to next line + form.$('.o_field_widget[name=o2m] .o_selected_row input').trigger({type: 'keydown', which: 9}); + assert.ok(form.$('.o_field_widget[name=o2m] .o_data_row:nth(1)').hasClass('o_selected_row'), + "second row should be in edition"); + + // Press 'Tab' -> should go back to first line as the create action isn't available + form.$('.o_field_widget[name=o2m] .o_selected_row input').trigger({type: 'keydown', which: 9}); + assert.ok(form.$('.o_field_widget[name=o2m] .o_data_row:first').hasClass('o_selected_row'), + "first row should be in edition"); + + form.destroy(); + }); + QUnit.test('edition, then navigation with tab (with a readonly field)', function (assert) { // This test makes sure that if we have 2 cells in a row, the first in // edit mode, and the second one readonly, then if we edit and press TAB, diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js index 267437845b0..fe8c4c5b3f9 100644 --- a/addons/web/static/tests/views/pivot_tests.js +++ b/addons/web/static/tests/views/pivot_tests.js @@ -825,6 +825,53 @@ QUnit.module('Views', { pivot.destroy(); }); + QUnit.test('correctly uses pivot_ keys from the context (at reload)', function (assert) { + assert.expect(8); + + this.data.partner.fields.amount = {string: "Amount", type: "float"}; + + var pivot = createView({ + View: PivotView, + model: "partner", + data: this.data, + arch: '<pivot>' + + '<field name="date" interval="day" type="col"/>' + + '<field name="amount" type="measure"/>' + + '</pivot>', + }); + + assert.strictEqual(pivot.$('tbody tr:first td.o_pivot_cell_value:last').text(), '0.00', + "the active measure should be amount"); + + var reloadParams = { + context: { + pivot_measures: ['foo'], + pivot_column_groupby: ['customer'], + pivot_row_groupby: ['product_id'], + }, + }; + pivot.reload(reloadParams); + + assert.strictEqual(pivot.$('thead .o_pivot_header_cell_opened').length, 1, + "column: should have one opened header"); + assert.strictEqual(pivot.$('thead .o_pivot_header_cell_closed:contains(First)').length, 1, + "column: should display one closed header with 'First'"); + assert.strictEqual(pivot.$('thead .o_pivot_header_cell_closed:contains(Second)').length, 1, + "column: should display one closed header with 'Second'"); + + assert.strictEqual(pivot.$('tbody .o_pivot_header_cell_opened').length, 1, + "row: should have one opened header"); + assert.strictEqual(pivot.$('tbody .o_pivot_header_cell_closed:contains(xphone)').length, 1, + "row: should display one closed header with 'xphone'"); + assert.strictEqual(pivot.$('tbody .o_pivot_header_cell_closed:contains(xpad)').length, 1, + "row: should display one closed header with 'xpad'"); + + assert.strictEqual(pivot.$('tbody tr:first td:nth(3)').text(), '32', + "selected measure should be foo, with total 32"); + + pivot.destroy(); + }); + QUnit.test('correctly use group_by key from the context', function (assert) { assert.expect(7); @@ -859,4 +906,33 @@ QUnit.module('Views', { pivot.destroy(); }); + QUnit.test('pivot still handles __count__ measure', function (assert) { + // for retro-compatibility reasons, the pivot view still handles + // '__count__' measure. + assert.expect(2); + + var pivot = createView({ + View: PivotView, + model: "partner", + data: this.data, + arch: '<pivot></pivot>', + mockRPC: function (route, args) { + if (args.method === 'read_group') { + assert.deepEqual(args.kwargs.fields, ['__count'], + "should make a read_group with field __count"); + } + return this._super(route, args); + }, + viewOptions: { + context: { + pivot_measures: ['__count__'], + }, + }, + }); + + var $countMeasure = pivot.$buttons.find('li[data-field=__count]'); + assert.ok($countMeasure.hasClass('selected'), "The count measure should be activated"); + + pivot.destroy(); + }); });}); diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py index 4e5a7489ca6..b9d6ea0e865 100644 --- a/addons/website_forum/models/forum.py +++ b/addons/website_forum/models/forum.py @@ -396,7 +396,7 @@ class Post(models.Model): post.can_downvote = is_admin or user.karma >= post.forum_id.karma_downvote post.can_comment = is_admin or user.karma >= post.karma_comment post.can_comment_convert = is_admin or user.karma >= post.karma_comment_convert - post.can_view = is_admin or user.karma >= post.karma_close or (post_sudo.create_uid.karma > 0 and (post_sudo.active or post_sudo.create_uid.id == user)) + post.can_view = is_admin or user.karma >= post.karma_close or (post_sudo.create_uid.karma > 0 and (post_sudo.active or post_sudo.create_uid == user)) post.can_display_biography = is_admin or post_sudo.create_uid.karma >= post.forum_id.karma_user_bio post.can_post = is_admin or user.karma >= post.forum_id.karma_post post.can_flag = is_admin or user.karma >= post.forum_id.karma_flag diff --git a/addons/website_sale/models/product.py b/addons/website_sale/models/product.py index 603e336c9a3..c21d04865ea 100644 --- a/addons/website_sale/models/product.py +++ b/addons/website_sale/models/product.py @@ -132,11 +132,13 @@ class ProductTemplate(models.Model): website_public_price = fields.Float('Website public price', compute='_website_price', digits=dp.get_precision('Product Price')) def _website_price(self): - self.mapped('product_variant_id') - - for p in self: - p.website_price = p.product_variant_id.website_price - p.website_public_price = p.product_variant_id.website_public_price + # First filter out the ones that have no variant: + # This makes sure that every template below has a corresponding product in the zipped result. + self = self.filtered('product_variant_id') + # use mapped who returns a recordset with only itself to prefetch (and don't prefetch every product_variant_ids) + for template, product in pycompat.izip(self, self.mapped('product_variant_id')): + template.website_price = product.website_price + template.website_public_price = product.website_public_price def _default_website_sequence(self): self._cr.execute("SELECT MIN(website_sequence) FROM %s" % self._table) diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index 1c113d8f759..e1a7f4670b6 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -415,13 +415,13 @@ <div class="col-sm-7"> <span itemprop="image" t-field="product.image" t-options="{'widget': 'image', 'class': 'product_detail_img', 'alt-field': 'name', 'zoom': 'image'}" groups="!website_sale.group_website_multi_image"/> <t groups="website_sale.group_website_multi_image"> - <t t-set="variant_img" t-value="product.product_variant_ids[0].image_variant"/> + <t t-set="variant_img" t-value="product.product_variant_id.image_variant"/> <t t-set="image_ids" t-value="product.product_image_ids"/> <div id="o-carousel-product" class="carousel slide" data-ride="carousel" data-interval="0"> <div class="carousel-outer"> <div class="carousel-inner"> - <div class="item active" itemprop="image" t-field="product.product_variant_ids[0].image" t-options='{"widget": "image", "class": "product_detail_img js_variant_img", "alt-field": "name", "zoom": "image"}'/> - <div t-if="variant_img" class="item" itemprop="image" t-field="product.image" t-options='{"widget": "image", "class": "product_detail_img", "alt-field": "name", "zoom": "image"}'/> + <div class="item active" itemprop="image" t-field="product.product_variant_id.image" t-options="{'widget': 'image', 'class': 'product_detail_img js_variant_img', 'alt-field': 'name', 'zoom': 'image', 'unique': product['__last_update'] + product.product_variant_id['__last_update']}"/> + <div t-if="variant_img" class="item" itemprop="image" t-field="product.image" t-options="{'widget': 'image', 'class': 'product_detail_img', 'alt-field': 'name', 'zoom': 'image', 'unique': product['__last_update'] + product.product_variant_id['__last_update']}"/> <t t-if="len(image_ids)" t-foreach="image_ids" t-as="pimg"> <div class="item" t-field="pimg.image" t-options='{"widget": "image", "class": "product_detail_img", "alt-field": "name", "zoom": "image" }'/> </t> diff --git a/doc/cla/individual/vuongtien2411.md b/doc/cla/individual/vuongtien2411.md new file mode 100644 index 00000000000..821a9881a43 --- /dev/null +++ b/doc/cla/individual/vuongtien2411.md @@ -0,0 +1,11 @@ +Vietnam, 2017-08-24 + +I hereby agree to the terms of the Odoo Individual Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Do Vuong Tien tiendv@trobz.com https://github.com/vuongtien2411 diff --git a/odoo/addons/test_main_flows/static/src/js/tour.js b/odoo/addons/test_main_flows/static/src/js/tour.js index e3aa7980ff2..e9e0a4bfbd1 100644 --- a/odoo/addons/test_main_flows/static/src/js/tour.js +++ b/odoo/addons/test_main_flows/static/src/js/tour.js @@ -403,11 +403,15 @@ tour.register('main_flow_tour', { }, { // Run the schedulers edition: "enterprise", - trigger: ".o_menu_sections a:contains('Schedulers')", - content: _t("Go to Schedulers"), + trigger: ".o_menu_sections a:contains('Operations')", + content: _t("Go to Operations"), position: "bottom" }, { - trigger: ".o_menu_sections a:has(span:contains('Run Schedulers')), .oe_secondary_submenu .oe_menu_text:contains('Run Schedulers'):first", + trigger: ".o_app[data-menu-xmlid='stock.procurement_order_compute_all_menu'], .oe_menu_toggler[data-menu-xmlid='stock.procurement_order_compute_all_menu']", + content: _t("Click on schedulers menu"), + position: "bottom" +}, { + trigger: ".o_menu_sections a:has(span:contains('Run Scheduler')), .oe_secondary_submenu .oe_menu_text:contains('Run Scheduler'):first", content: _t("Run the schedulers"), position: "bottom" }, { diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index 85a63e47e62..9a5dced9665 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -287,7 +287,7 @@ class Foo(models.Model): _name = 'test_new_api.foo' name = fields.Char() - value1 = fields.Integer() + value1 = fields.Integer(change_default=True) value2 = fields.Integer() diff --git a/odoo/addons/test_new_api/tests/test_onchange.py b/odoo/addons/test_new_api/tests/test_onchange.py index dfeafd99805..4b54d895416 100644 --- a/odoo/addons/test_new_api/tests/test_onchange.py +++ b/odoo/addons/test_new_api/tests/test_onchange.py @@ -276,6 +276,28 @@ class TestOnChange(common.TransactionCase): for user in discussion.participants + demo], ) + def test_onchange_default(self): + """ test the effect of a conditional user-default on a field """ + Foo = self.env['test_new_api.foo'] + field_onchange = Foo._onchange_spec() + self.assertTrue(Foo._fields['value1'].change_default) + self.assertEqual(field_onchange.get('value1'), '1') + + # create a user-defined default based on 'value1' + self.env['ir.values'].set_default('test_new_api.foo', 'value2', 666, condition='value1=42') + + # setting 'value1' to 42 should trigger the change of 'value2' + self.env.invalidate_all() + values = {'name': 'X', 'value1': 42, 'value2': False} + result = Foo.onchange(values, 'value1', field_onchange) + self.assertEqual(result['value'], {'value2': 666}) + + # setting 'value1' to 24 should not trigger the change of 'value2' + self.env.invalidate_all() + values = {'name': 'X', 'value1': 24, 'value2': False} + result = Foo.onchange(values, 'value1', field_onchange) + self.assertEqual(result['value'], {}) + def test_onchange_one2many_value(self): """ test the value of the one2many field inside the onchange """ discussion = self.env.ref('test_new_api.discussion_0') diff --git a/odoo/models.py b/odoo/models.py index 4e0ca389651..d558525f9f9 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -577,6 +577,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): def is_onchange(func): return callable(func) and hasattr(func, '_onchange') + # collect onchange methods on the model's class cls = type(self) methods = defaultdict(list) for attr, func in getmembers(cls, is_onchange): @@ -585,6 +586,17 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): _logger.warning("@onchange%r parameters must be field names", func._onchange) methods[name].append(func) + # add onchange methods to implement "change_default" on fields + def onchange_default(field, self): + value = field.convert_to_write(self[field.name], self) + condition = "%s=%s" % (field.name, value) + defaults = self.env['ir.values'].get_defaults_dict(self._name, condition) + self.update(defaults) + + for name, field in cls._fields.items(): + if field.change_default: + methods[name].append(functools.partial(onchange_default, field)) + # optimization: memoize result on cls, it will not be recomputed cls._onchange_methods = methods return methods diff --git a/odoo/service/server.py b/odoo/service/server.py index c3b523efe7e..42e76a11688 100644 --- a/odoo/service/server.py +++ b/odoo/service/server.py @@ -276,10 +276,6 @@ class ThreadedServer(CommonServer): # some tests need the http deamon to be available... self.http_spawn() - if not stop: - # only relevant if we are not in "--stop-after-init" mode - self.cron_spawn() - def stop(self): """ Shutdown the WSGI server. Wait for non deamon threads. """ @@ -323,6 +319,8 @@ class ThreadedServer(CommonServer): self.stop() return rc + self.cron_spawn() + # Wait for a first signal to be handled. (time.sleep will be interrupted # by the signal handler.) The try/except is for the win32 case. try: |
