diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-06-27 14:19:31 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-06-27 14:19:31 +0200 |
| commit | dd43071638773dcb58376b79ec7b1456c8b0454d (patch) | |
| tree | fd7935e2aa93de03fa3fe12507f8ef74405a255e /addons | |
| parent | 6501184e6294ffb06e24a0ec8e9666b79a80b59a (diff) | |
| parent | 278e478d55209bd958836fde7fe1c82c555180dc (diff) | |
[MERGE] forward port branch saas-16 up to 278e478d552
Diffstat (limited to 'addons')
93 files changed, 1551 insertions, 691 deletions
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 87966a761fe..4bde8a3dee2 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -897,6 +897,11 @@ class AccountMoveLine(models.Model): @api.multi def reconcile(self, writeoff_acc_id=False, writeoff_journal_id=False): + # Empty self can happen if the user tries to reconcile entries which are already reconciled. + # The calling method might have filtered out reconciled lines. + if not self: + return True + #Perform all checks on lines company_ids = set() all_accounts = [] @@ -1425,7 +1430,7 @@ class AccountPartialReconcile(models.Model): help='Utility field to express amount currency') company_id = fields.Many2one('res.company', related='debit_move_id.company_id', store=True, string='Currency') full_reconcile_id = fields.Many2one('account.full.reconcile', string="Full Reconcile", copy=False) - max_date = fields.Datetime(string='Max Date of Matched Lines', compute='_compute_max_date', + max_date = fields.Date(string='Max Date of Matched Lines', compute='_compute_max_date', readonly=True, copy=False, stored=True, help='Technical field used to determine at which date this reconciliation needs to be shown on the aged receivable/payable reports.') diff --git a/addons/account/report/account_aged_partner_balance.py b/addons/account/report/account_aged_partner_balance.py index 125021a1628..3380f876d63 100644 --- a/addons/account/report/account_aged_partner_balance.py +++ b/addons/account/report/account_aged_partner_balance.py @@ -2,6 +2,7 @@ import time from odoo import api, models, _ +from odoo.exceptions import UserError from odoo.tools import float_is_zero from datetime import datetime from dateutil.relativedelta import relativedelta @@ -196,6 +197,9 @@ class ReportAgedPartnerBalance(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + total = [] model = self.env.context.get('active_model') docs = self.env[model].browse(self.env.context.get('active_id')) diff --git a/addons/account/report/account_balance.py b/addons/account/report/account_balance.py index c4b2568bfa5..e8280c90128 100644 --- a/addons/account/report/account_balance.py +++ b/addons/account/report/account_balance.py @@ -2,6 +2,7 @@ import time from odoo import api, models +from odoo.exceptions import UserError class ReportTrialBalance(models.AbstractModel): @@ -50,13 +51,18 @@ class ReportTrialBalance(models.AbstractModel): res['balance'] = account_result[account.id].get('balance') if display_account == 'all': account_res.append(res) - if display_account in ['movement', 'not_zero'] and not currency.is_zero(res['balance']): + if display_account == 'not_zero' and not currency.is_zero(res['balance']): + account_res.append(res) + if display_account == 'movement' and (not currency.is_zero(res['debit']) or not currency.is_zero(res['credit'])): account_res.append(res) return account_res @api.model def get_report_values(self, docids, data=None): + if not data.get('form') or not self.env.context.get('active_model'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + self.model = self.env.context.get('active_model') docs = self.env[self.model].browse(self.env.context.get('active_ids', [])) display_account = data['form'].get('display_account') diff --git a/addons/account/report/account_general_ledger.py b/addons/account/report/account_general_ledger.py index 3f08209b129..1bd983a68ae 100644 --- a/addons/account/report/account_general_ledger.py +++ b/addons/account/report/account_general_ledger.py @@ -2,6 +2,7 @@ import time from odoo import api, models +from odoo.exceptions import UserError class ReportGeneralLedger(models.AbstractModel): @@ -109,6 +110,9 @@ class ReportGeneralLedger(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form') or not self.env.context.get('active_model'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + self.model = self.env.context.get('active_model') docs = self.env[self.model].browse(self.env.context.get('active_ids', [])) diff --git a/addons/account/report/account_journal.py b/addons/account/report/account_journal.py index 4dfe7d970e5..0bb9bcedb99 100644 --- a/addons/account/report/account_journal.py +++ b/addons/account/report/account_journal.py @@ -2,6 +2,7 @@ import time from odoo import api, models +from odoo.exceptions import UserError class ReportJournal(models.AbstractModel): @@ -95,6 +96,9 @@ class ReportJournal(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + target_move = data['form'].get('target_move', 'all') sort_selection = data['form'].get('sort_selection', 'date') diff --git a/addons/account/report/account_partner_ledger.py b/addons/account/report/account_partner_ledger.py index 0ba3bfc5afa..b3e0b03b6ba 100644 --- a/addons/account/report/account_partner_ledger.py +++ b/addons/account/report/account_partner_ledger.py @@ -3,6 +3,7 @@ from datetime import datetime import time from odoo import api, models +from odoo.exceptions import UserError from odoo.tools import DEFAULT_SERVER_DATE_FORMAT @@ -69,6 +70,9 @@ class ReportPartnerLedger(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + data['computed'] = {} obj_partner = self.env['res.partner'] diff --git a/addons/account/report/account_report_financial.py b/addons/account/report/account_report_financial.py index bc6f9b53f1f..b0abf69de3d 100644 --- a/addons/account/report/account_report_financial.py +++ b/addons/account/report/account_report_financial.py @@ -2,6 +2,7 @@ import time from odoo import api, models +from odoo.exceptions import UserError from odoo.tools import pycompat @@ -145,6 +146,9 @@ class ReportFinancial(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + self.model = self.env.context.get('active_model') docs = self.env[self.model].browse(self.env.context.get('active_id')) report_lines = self.get_account_lines(data.get('form')) diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml index fa523b741c0..c4956b3567a 100644 --- a/addons/account/views/account_view.xml +++ b/addons/account/views/account_view.xml @@ -729,7 +729,7 @@ <field name="name">Bank Statement Lines</field> <field name="res_model">account.bank.statement.line</field> <field name="view_type">form</field> - <field name="view_mode">tree</field> + <field name="view_mode">tree,form</field> <field name="domain">[]</field> <field name="context">{}</field> <field name="search_view_id" ref="view_bank_statement_line_search"/> diff --git a/addons/barcodes/static/src/js/barcode_parser.js b/addons/barcodes/static/src/js/barcode_parser.js index 9dd73bf060e..d834f3cbd27 100644 --- a/addons/barcodes/static/src/js/barcode_parser.js +++ b/addons/barcodes/static/src/js/barcode_parser.js @@ -109,7 +109,7 @@ var BarcodeParser = Class.extend({ ean = ean.substr(0,13); for(var n = 0, count = (13 - ean.length); n < count; n++){ - ean = ean + '0'; + ean = '0' + ean; } return ean.substr(0,12) + this.ean_checksum(ean); }, diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index c4992efff20..c3795afafe3 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -281,6 +281,11 @@ class Lead(models.Model): if vals.get('user_id') and 'date_open' not in vals: vals['date_open'] = fields.Datetime.now() + + if context.get('default_partner_id') and not vals.get('email_from'): + partner = self.env['res.partner'].browse(context['default_partner_id']) + vals['email_from'] = partner.email + # context: no_log, because subtype already handle this return super(Lead, self.with_context(context, mail_create_nolog=True)).create(vals) diff --git a/addons/hr_holidays/report/holidays_summary_report.py b/addons/hr_holidays/report/holidays_summary_report.py index d77e664c9e9..e9e166dc3a7 100644 --- a/addons/hr_holidays/report/holidays_summary_report.py +++ b/addons/hr_holidays/report/holidays_summary_report.py @@ -6,6 +6,7 @@ import calendar from datetime import timedelta from dateutil.relativedelta import relativedelta from odoo import api, fields, models +from odoo.exceptions import UserError class HrHolidaySummaryReport(models.AbstractModel): @@ -107,6 +108,9 @@ class HrHolidaySummaryReport(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + holidays_report = self.env['ir.actions.report']._get_report_from_name('hr_holidays.report_holidayssummary') holidays = self.env['hr.holidays'].browse(self.ids) return { diff --git a/addons/hr_payroll/report/report_contribution_register.py b/addons/hr_payroll/report/report_contribution_register.py index 7d6cdeef23d..27b0612e5f1 100644 --- a/addons/hr_payroll/report/report_contribution_register.py +++ b/addons/hr_payroll/report/report_contribution_register.py @@ -6,6 +6,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from odoo import api, fields, models +from odoo.exceptions import UserError class ContributionRegisterReport(models.AbstractModel): @@ -29,6 +30,9 @@ class ContributionRegisterReport(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + register_ids = self.env.context.get('active_ids', []) contrib_registers = self.env['hr.contribution.register'].browse(register_ids) date_from = data['form'].get('date_from', fields.Date.today()) diff --git a/addons/l10n_ch/data/l10n_ch_chart_data.xml b/addons/l10n_ch/data/l10n_ch_chart_data.xml index 60b391a71f9..a69f96c8699 100644 --- a/addons/l10n_ch/data/l10n_ch_chart_data.xml +++ b/addons/l10n_ch/data/l10n_ch_chart_data.xml @@ -13,7 +13,7 @@ </record> <record id="l10nch_chart_template" model="account.chart.template"> <field name="name">Plan comptable 2015</field> - <field name="code_digits">1</field> + <field name="code_digits">4</field> <field name="bank_account_code_prefix">102</field> <field name="cash_account_code_prefix">100</field> <field name="currency_id" ref="base.CHF"/> diff --git a/addons/l10n_fr/data/account_chart_template_data.xml b/addons/l10n_fr/data/account_chart_template_data.xml index 67deb80cc04..59fb761390d 100644 --- a/addons/l10n_fr/data/account_chart_template_data.xml +++ b/addons/l10n_fr/data/account_chart_template_data.xml @@ -216,7 +216,7 @@ </record> <record id="pcg_109" model="account.account.template"> - <field name="name">Actionnaires: capital souscrit - non appelé</field> + <field name="name">Actionnaires : capital souscrit - non appelé</field> <field name="code">109</field> <field name="user_type_id" ref="account.data_account_type_equity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -251,56 +251,56 @@ </record> <record id="pcg_1311" model="account.account.template"> - <field name="name">État</field> + <field name="name">Subventions d'équipement - État</field> <field name="code">1311</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1312" model="account.account.template"> - <field name="name">Régions</field> + <field name="name">Subventions d'équipement - Régions</field> <field name="code">1312</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1313" model="account.account.template"> - <field name="name">Départements</field> + <field name="name">Subventions d'équipement - Départements</field> <field name="code">1313</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1314" model="account.account.template"> - <field name="name">Communes</field> + <field name="name">Subventions d'équipement - Communes</field> <field name="code">1314</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1315" model="account.account.template"> - <field name="name">Collectivités publiques</field> + <field name="name">Subventions d'équipement - Collectivités publiques</field> <field name="code">1315</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1316" model="account.account.template"> - <field name="name">Entreprises publiques</field> + <field name="name">Subventions d'équipement - Entreprises publiques</field> <field name="code">1316</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1317" model="account.account.template"> - <field name="name">Entreprises et organismes privés</field> + <field name="name">Subventions d'équipement - Entreprises et organismes privés</field> <field name="code">1317</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1318" model="account.account.template"> - <field name="name">Autres</field> + <field name="name">Subventions d'équipement - Autres</field> <field name="code">1318</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -314,56 +314,56 @@ </record> <record id="pcg_13911" model="account.account.template"> - <field name="name">Etat</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - État</field> <field name="code">13911</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13912" model="account.account.template"> - <field name="name">Régions</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Régions</field> <field name="code">13912</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13913" model="account.account.template"> - <field name="name">Départements</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Départements</field> <field name="code">13913</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13914" model="account.account.template"> - <field name="name">Communes</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Communes</field> <field name="code">13914</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13915" model="account.account.template"> - <field name="name">Collectivités publiques</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Collectivités publiques</field> <field name="code">13915</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13916" model="account.account.template"> - <field name="name">Entreprises publiques</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Entreprises publiques</field> <field name="code">13916</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13917" model="account.account.template"> - <field name="name">Entreprises et organismes privés </field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Entreprises et organismes privés</field> <field name="code">13917</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_13918" model="account.account.template"> - <field name="name">Autres</field> + <field name="name">Subventions d'équipement inscrites au compte de résultat - Autres</field> <field name="code">13918</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -391,14 +391,14 @@ </record> <record id="pcg_1431" model="account.account.template"> - <field name="name">Hausse des prix</field> + <field name="name">Provisions réglementées relatives aux stocks - Hausse de prix</field> <field name="code">1431</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1432" model="account.account.template"> - <field name="name">Fluctuation des cours</field> + <field name="name">Provisions réglementées relatives aux stocks - Fluctuation des cours</field> <field name="code">1432</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -517,7 +517,7 @@ </record> <record id="pcg_1572" model="account.account.template"> - <field name="name">Provisions pour gros entretien ou grandes révisions </field> + <field name="name">Provisions pour charges à répartir sur plusieurs exercices - Gros entretien ou grandes révisions</field> <field name="code">1572</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -538,7 +538,7 @@ </record> <record id="pcg_163" model="account.account.template"> - <field name="name">Autres emprunts obligataires </field> + <field name="name">Autres emprunts obligataires</field> <field name="code">163</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -566,105 +566,105 @@ </record> <record id="pcg_1661" model="account.account.template"> - <field name="name">Comptes bloqués</field> + <field name="name">Participation des salariés aux résultats - Comptes bloqués</field> <field name="code">1661</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1662" model="account.account.template"> - <field name="name">Fonds de participation</field> + <field name="name">Participation des salariés aux résultats - Fonds de participation</field> <field name="code">1662</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1671" model="account.account.template"> - <field name="name">Emissions de titres participatifs</field> + <field name="name">Emprunts et dettes assortis de conditions particulières - Emissions de titres participatifs</field> <field name="code">1671</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1674" model="account.account.template"> - <field name="name">Avances conditionnées de l'État</field> + <field name="name">Emprunts et dettes assortis de conditions particulières - Avances conditionnées de l'État</field> <field name="code">1674</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1675" model="account.account.template"> - <field name="name">Emprunts participatifs</field> + <field name="name">Emprunts et dettes assortis de conditions particulières - Emprunts participatifs</field> <field name="code">1675</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1681" model="account.account.template"> - <field name="name">Autres emprunts</field> + <field name="name">Autres emprunts et dettes assimilées - Autres emprunts</field> <field name="code">1681</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1685" model="account.account.template"> - <field name="name">Rentes viagères capitalisées</field> + <field name="name">Autres emprunts et dettes assimilées - Rentes viagères capitalisées</field> <field name="code">1685</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1687" model="account.account.template"> - <field name="name">Autres dettes</field> + <field name="name">Autres emprunts et dettes assimilées - Autres dettes</field> <field name="code">1687</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16881" model="account.account.template"> - <field name="name">Sur emprunts obligataires convertibles </field> + <field name="name">Intérêts courus sur emprunts obligataires convertibles</field> <field name="code">16881</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16883" model="account.account.template"> - <field name="name">Sur autres emprunts obligataires</field> + <field name="name">Intérêts courus sur autres emprunts obligataires</field> <field name="code">16883</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16884" model="account.account.template"> - <field name="name">Sur emprunts auprès des établissements de crédit</field> + <field name="name">Intérêts courus sur emprunts auprès des établissements de crédit</field> <field name="code">16884</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16885" model="account.account.template"> - <field name="name">Sur dépôts et cautionnements reçus</field> + <field name="name">Intérêts courus sur dépôts et cautionnements reçus</field> <field name="code">16885</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16886" model="account.account.template"> - <field name="name">Sur participation des salariés aux résultats</field> + <field name="name">Intérêts courus sur participation des salariés aux résultats</field> <field name="code">16886</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16887" model="account.account.template"> - <field name="name">Sur emprunts et dettes assortis de conditions particulières</field> + <field name="name">Intérêts courus sur emprunts et dettes assortis de conditions particulières</field> <field name="code">16887</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_16888" model="account.account.template"> - <field name="name">Sur autres emprunts et dettes assimilées</field> + <field name="name">Intérêts courus sur autres emprunts et dettes assimilées</field> <field name="code">16888</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -692,14 +692,14 @@ </record> <record id="pcg_1781" model="account.account.template"> - <field name="name">Principal</field> + <field name="name">Dettes rattachées à des sociétés en participation - Principal</field> <field name="code">1781</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_1788" model="account.account.template"> - <field name="name">Intérêts courus</field> + <field name="name">Dettes rattachées à des sociétés en participation - Intérêts courus</field> <field name="code">1788</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -734,56 +734,56 @@ </record> <record id="pcg_2011" model="account.account.template"> - <field name="name">Frais de constitution</field> + <field name="name">Immobilisations incorporelles - Frais d'établissement - Frais de constitution</field> <field name="code">2011</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_20121" model="account.account.template"> - <field name="name">Frais de prospection</field> + <field name="name">Immobilisations incorporelles - Frais d'établissement - Frais de prospection</field> <field name="code">20121</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_20122" model="account.account.template"> - <field name="name">Frais de publicité</field> + <field name="name">Immobilisations incorporelles - Frais d'établissement - Frais de publicité</field> <field name="code">20122</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2013" model="account.account.template"> - <field name="name">Frais d'augmentation de capital et d'opérations diverses (fusions, scissions, transformations)</field> + <field name="name">Immobilisations incorporelles - Frais d'augmentation de capital et d'opérations diverses (fusions, scissions, transformations)</field> <field name="code">2013</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_203" model="account.account.template"> - <field name="name">Frais de recherche et de développement</field> + <field name="name">Immobilisations incorporelles - Frais de recherche et de développement</field> <field name="code">203</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_205" model="account.account.template"> - <field name="name">Concessions et droits similaires, brevets, licences, marques, procédés, logiciels, droits et valeurs similaires</field> + <field name="name">Immobilisations incorporelles - Concessions et droits similaires, brevets, licences, marques, procédés, logiciels, droits et valeurs similaires</field> <field name="code">205</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_206" model="account.account.template"> - <field name="name">Droit au bail</field> + <field name="name">Immobilisations incorporelles - Droit au bail</field> <field name="code">206</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_207" model="account.account.template"> - <field name="name">Fonds commercial</field> + <field name="name">Immobilisations incorporelles - Fonds commercial</field> <field name="code">207</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -797,238 +797,238 @@ </record> <record id="pcg_2111" model="account.account.template"> - <field name="name">Terrains nus</field> + <field name="name">Immobilisations corporelles - Terrains nus</field> <field name="code">2111</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2112" model="account.account.template"> - <field name="name">Terrains aménagés</field> + <field name="name">Immobilisations corporelles - Terrains aménagés</field> <field name="code">2112</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2113" model="account.account.template"> - <field name="name">Sous-sols et sur-sols</field> + <field name="name">Immobilisations corporelles - Sous-sols et sur-sols</field> <field name="code">2113</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21141" model="account.account.template"> - <field name="name">Carrières</field> + <field name="name">Immobilisations corporelles - Carrières</field> <field name="code">21141</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21151" model="account.account.template"> - <field name="name">Ensembles immobiliers industriels (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Terrains bâtis - Ensembles immobiliers industriels</field> <field name="code">21151</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21155" model="account.account.template"> - <field name="name">Ensembles immobiliers administratifs et commerciaux (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Terrains bâtis - Ensembles immobiliers administratifs et commerciaux</field> <field name="code">21155</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_211581" model="account.account.template"> - <field name="name">Affectés aux opérations professionnelles (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Terrains bâtis affectés aux opérations professionnelles</field> <field name="code">211581</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_211588" model="account.account.template"> - <field name="name">Affectés aux opérations non professionnelles (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Terrains bâtis affectés aux opérations non professionnelles</field> <field name="code">211588</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2116" model="account.account.template"> - <field name="name">Compte d'ordre sur immobilisations</field> + <field name="name">Immobilisations corporelles - Compte d'ordre sur immobilisations</field> <field name="code">2116</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_212" model="account.account.template"> - <field name="name">Agencements et aménagements de terrains (même ventilation que celle du compte 211)</field> + <field name="name">Immobilisations corporelles - Agencements et aménagements de terrains (même ventilation que celle du compte 211)</field> <field name="code">212</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21311" model="account.account.template"> - <field name="name">Ensembles immobiliers industriels (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Bâtiments - Ensembles immobiliers industriels</field> <field name="code">21311</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21315" model="account.account.template"> - <field name="name">Ensembles immobiliers administratifs et commerciaux (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Bâtiments - Ensembles immobiliers administratifs et commerciaux</field> <field name="code">21315</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_213181" model="account.account.template"> - <field name="name">Affectés aux opérations professionnelles (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Bâtiments affectés aux opérations professionnelles</field> <field name="code">213181</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_213188" model="account.account.template"> - <field name="name">Affectés aux opérations non professionnelles (A, B, ...)</field> + <field name="name">Immobilisations corporelles - Bâtiments affectés aux opérations non professionnelles</field> <field name="code">213188</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2135" model="account.account.template"> - <field name="name">Installations générales agencements aménagements des constructions (même ventilation que celle du compte 2131)</field> + <field name="name">Immobilisations corporelles - Installations générales, agencements, aménagements des constructions (même ventilation que celle du compte 2131)</field> <field name="code">2135</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21381" model="account.account.template"> - <field name="name">Voies de terre</field> + <field name="name">Immobilisations corporelles - Ouvrages d'infrastructure - Voies de terre</field> <field name="code">21381</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21382" model="account.account.template"> - <field name="name">Voies de fer</field> + <field name="name">Immobilisations corporelles - Ouvrages d'infrastructure - Voies de fer</field> <field name="code">21382</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21383" model="account.account.template"> - <field name="name">Voies d'eau</field> + <field name="name">Immobilisations corporelles - Ouvrages d'infrastructure - Voies d'eau</field> <field name="code">21383</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21384" model="account.account.template"> - <field name="name">Barrages</field> + <field name="name">Immobilisations corporelles - Ouvrages d'infrastructure - Barrages</field> <field name="code">21384</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21385" model="account.account.template"> - <field name="name">Pistes d'aérodromes</field> + <field name="name">Immobilisations corporelles - Ouvrages d'infrastructure - Pistes d'aérodromes</field> <field name="code">21385</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_214" model="account.account.template"> - <field name="name">Constructions sur sol d'autrui (même ventilation que celle du compte 213)</field> + <field name="name">Immobilisations corporelles - Constructions sur sol d'autrui (même ventilation que celle du compte 213)</field> <field name="code">214</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21511" model="account.account.template"> - <field name="name">Sur sol propre</field> + <field name="name">Immobilisations corporelles - Installations complexes spécialisées sur sol propre</field> <field name="code">21511</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21514" model="account.account.template"> - <field name="name">Sur sol d'autrui</field> + <field name="name">Immobilisations corporelles - Installations complexes spécialisées sur sol d'autrui</field> <field name="code">21514</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21531" model="account.account.template"> - <field name="name">Sur sol propre</field> + <field name="name">Immobilisations corporelles - Installations à caractère spécifique sur sol propre</field> <field name="code">21531</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_21534" model="account.account.template"> - <field name="name">Sur sol d'autrui</field> + <field name="name">Immobilisations corporelles - Installations à caractère spécifique sur sol d'autrui</field> <field name="code">21534</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2154" model="account.account.template"> - <field name="name">Matériel industriel</field> + <field name="name">Immobilisations corporelles - Matériels industriels</field> <field name="code">2154</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2155" model="account.account.template"> - <field name="name">Outillage industriel</field> + <field name="name">Immobilisations corporelles - Outillage industriel</field> <field name="code">2155</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2157" model="account.account.template"> - <field name="name">Agencements et aménagements du matériel et outillage industriels</field> + <field name="name">Immobilisations corporelles - Agencements et aménagements des matériels et outillage industriels</field> <field name="code">2157</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2181" model="account.account.template"> - <field name="name">Installations générales agencements aménagements divers</field> + <field name="name">Immobilisations corporelles - Installations générales agencements aménagements divers</field> <field name="code">2181</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2182" model="account.account.template"> - <field name="name">Matériel de transport</field> + <field name="name">Immobilisations corporelles - Matériel de transport</field> <field name="code">2182</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2183" model="account.account.template"> - <field name="name">Matériel de bureau et matériel informatique </field> + <field name="name">Immobilisations corporelles - Matériel de bureau et matériel informatique</field> <field name="code">2183</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2184" model="account.account.template"> - <field name="name">Mobilier</field> + <field name="name">Immobilisations corporelles - Mobilier</field> <field name="code">2184</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2185" model="account.account.template"> - <field name="name">Cheptel</field> + <field name="name">Immobilisations corporelles - Cheptel</field> <field name="code">2185</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2186" model="account.account.template"> - <field name="name">Emballages récupérables</field> + <field name="name">Immobilisations corporelles - Emballages récupérables</field> <field name="code">2186</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1042,7 +1042,7 @@ </record> <record id="pcg_2312" model="account.account.template"> - <field name="name">Terrains</field> + <field name="name">Immobilisations corporelles en cours - Terrains</field> <field name="code">2312</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="note">Pas d'amortissement sur les terrains</field> @@ -1050,28 +1050,28 @@ </record> <record id="pcg_2313" model="account.account.template"> - <field name="name">Constructions</field> + <field name="name">Immobilisations corporelles en cours - Constructions</field> <field name="code">2313</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2315" model="account.account.template"> - <field name="name">Installations techniques matériel et outillage industriels</field> + <field name="name">Immobilisations corporelles en cours - Installations techniques matériel et outillage industriels</field> <field name="code">2315</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2318" model="account.account.template"> - <field name="name">Autres immobilisations corporelles</field> + <field name="name">Autres immobilisations corporelles en cours</field> <field name="code">2318</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_232" model="account.account.template"> - <field name="name">Immobilisations incorporelles en cours </field> + <field name="name">Immobilisations incorporelles en cours</field> <field name="code">232</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1085,28 +1085,28 @@ </record> <record id="pcg_2382" model="account.account.template"> - <field name="name">Terrains</field> + <field name="name">Avances et acomptes versés sur commandes d'immobilisations corporelles - Terrains</field> <field name="code">2382</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2383" model="account.account.template"> - <field name="name">Constructions</field> + <field name="name">Avances et acomptes versés sur commandes d'immobilisations corporelles - Constructions</field> <field name="code">2383</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2385" model="account.account.template"> - <field name="name">Installations techniques matériel et outillage industriels</field> + <field name="name">Avances et acomptes versés sur commandes d'immobilisations corporelles - Installations techniques matériel et outillage industriels</field> <field name="code">2385</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2388" model="account.account.template"> - <field name="name">Autres immobilisations corporelles</field> + <field name="name">Avances et acomptes versés sur commandes d'immobilisations corporelles - Autres immobilisations corporelles</field> <field name="code">2388</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1120,14 +1120,14 @@ </record> <record id="pcg_2611" model="account.account.template"> - <field name="name">Actions</field> + <field name="name">Titres de participation - Actions</field> <field name="code">2611</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2618" model="account.account.template"> - <field name="name">Autres titres</field> + <field name="name">Autres titres de participation</field> <field name="code">2618</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1178,28 +1178,28 @@ </record> <record id="pcg_2677" model="account.account.template"> - <field name="name">Autres créances rattachées à des participations </field> + <field name="name">Autres créances rattachées à des participations</field> <field name="code">2677</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2678" model="account.account.template"> - <field name="name">Intérêts courus</field> + <field name="name">Créances rattachées à des participations - Intérêts courus</field> <field name="code">2678</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2681" model="account.account.template"> - <field name="name">Principal</field> + <field name="name">Créances rattachées à des sociétés en participation - Principal</field> <field name="code">2681</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2688" model="account.account.template"> - <field name="name">Intérêts courus</field> + <field name="name">Créances rattachées à des sociétés en participation - Intérêts courus</field> <field name="code">2688</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1213,35 +1213,35 @@ </record> <record id="pcg_2711" model="account.account.template"> - <field name="name">Actions</field> + <field name="name">Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - Actions</field> <field name="code">2711</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2718" model="account.account.template"> - <field name="name">Autres titres</field> + <field name="name">Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - Autres titres</field> <field name="code">2718</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2721" model="account.account.template"> - <field name="name">Obligations</field> + <field name="name">Titres immobilisés - Obligations</field> <field name="code">2721</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2722" model="account.account.template"> - <field name="name">Bons</field> + <field name="name">Titres immobilisés - Bons</field> <field name="code">2722</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_273" model="account.account.template"> - <field name="name">Titres immobilisés de l'activité de portefeuille (TIAP)</field> + <field name="name">Titres immobilisés de l'activité de portefeuille</field> <field name="code">273</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1290,35 +1290,35 @@ </record> <record id="pcg_2761" model="account.account.template"> - <field name="name">Créances diverses</field> + <field name="name">Autres créances immobilisées - Créances diverses</field> <field name="code">2761</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_27682" model="account.account.template"> - <field name="name">Sur titres immobilisés (droits de créance)</field> + <field name="name">Autres créances immobilisées - Intérêts courus sur titres immobilisés (droits de créance)</field> <field name="code">27682</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_27684" model="account.account.template"> - <field name="name">Sur prêts</field> + <field name="name">Autres créances immobilisées - Intérêts courus sur prêts</field> <field name="code">27684</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_27685" model="account.account.template"> - <field name="name">Sur dépôts et cautionnements</field> + <field name="name">Autres créances immobilisées - Intérêts courus sur dépôts et cautionnements</field> <field name="code">27685</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_27688" model="account.account.template"> - <field name="name">Sur créances diverses</field> + <field name="name">Autres créances immobilisées - Intérêts courus sur créances diverses</field> <field name="code">27688</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1346,77 +1346,77 @@ </record> <record id="pcg_2801" model="account.account.template"> - <field name="name">Frais d'établissement (même ventilation que celle du compte 201) </field> + <field name="name">Amortissements des immobilisations incorporelles - Frais d'établissement (même ventilation que celle du compte 201)</field> <field name="code">2801</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2803" model="account.account.template"> - <field name="name">Frais de recherche et de développement </field> + <field name="name">Amortissements des immobilisations incorporelles - Frais de recherche et de développement</field> <field name="code">2803</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2805" model="account.account.template"> - <field name="name">Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires</field> + <field name="name">Amortissements des immobilisations incorporelles - Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires</field> <field name="code">2805</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2807" model="account.account.template"> - <field name="name">Fonds commercial</field> + <field name="name">Amortissements des immobilisations incorporelles - Fonds commercial</field> <field name="code">2807</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2808" model="account.account.template"> - <field name="name">Autres immobilisations incorporelles</field> + <field name="name">Amortissements des autres immobilisations incorporelles</field> <field name="code">2808</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2811" model="account.account.template"> - <field name="name">Terrains de gisement</field> + <field name="name">Amortissements des immobilisations corporelles - Terrains de gisement</field> <field name="code">2811</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2812" model="account.account.template"> - <field name="name">Agencements aménagements de terrains (même ventilation que celle du compte 212)</field> + <field name="name">Amortissements des immobilisations corporelles - Agencements aménagements de terrains (même ventilation que celle du compte 212)</field> <field name="code">2812</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2813" model="account.account.template"> - <field name="name">Constructions (même ventilation que celle du compte 213)</field> + <field name="name">Amortissements des immobilisations corporelles - Constructions (même ventilation que celle du compte 213)</field> <field name="code">2813</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2814" model="account.account.template"> - <field name="name">Constructions sur sol d'autrui (même ventilation que celle du compte 214)</field> + <field name="name">Amortissements des immobilisations corporelles - Constructions sur sol d'autrui (même ventilation que celle du compte 214)</field> <field name="code">2814</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2815" model="account.account.template"> - <field name="name">Installations matériel et outillage industriels (même ventilation que celle du compte 215)</field> + <field name="name">Amortissements des immobilisations corporelles - Installations matériel et outillage industriels (même ventilation que celle du compte 215)</field> <field name="code">2815</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2818" model="account.account.template"> - <field name="name">Autres immobilisations corporelles (même ventilation que celle du compte 218)</field> + <field name="name">Amortissements des autres immobilisations corporelles (même ventilation que celle du compte 218)</field> <field name="code">2818</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1430,35 +1430,35 @@ </record> <record id="pcg_2905" model="account.account.template"> - <field name="name">Marques, procédés, droits et valeurs similaires</field> + <field name="name">Dépréciations des immobilisations incorporelles - Marques, procédés, droits et valeurs similaires</field> <field name="code">2905</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2906" model="account.account.template"> - <field name="name">Droit au bail</field> + <field name="name">Dépréciations des immobilisations incorporelles - Droit au bail</field> <field name="code">2906</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2907" model="account.account.template"> - <field name="name">Fonds commercial</field> + <field name="name">Dépréciations des immobilisations incorporelles - Fonds commercial</field> <field name="code">2907</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2908" model="account.account.template"> - <field name="name">Autres immobilisations incorporelles</field> + <field name="name">Dépréciations des autres immobilisations incorporelles</field> <field name="code">2908</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2911" model="account.account.template"> - <field name="name">Terrains (autres que terrains de gisement)</field> + <field name="name">Dépréciations des immobilisations corporelles - Terrains (autres que terrains de gisement)</field> <field name="code">2911</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1472,97 +1472,97 @@ </record> <record id="pcg_2931" model="account.account.template"> - <field name="name">Immobilisations corporelles en cours</field> + <field name="name">Dépréciations des immobilisations corporelles en cours</field> <field name="code">2931</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2932" model="account.account.template"> - <field name="name">Immobilisations incorporelles en cours</field> + <field name="name">Dépréciations des immobilisations incorporelles en cours</field> <field name="code">2932</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2961" model="account.account.template"> - <field name="name">Titres de participation</field> + <field name="name">Provisions pour dépréciation des titres de participation</field> <field name="code">2961</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2966" model="account.account.template"> - <field name="name">Autres formes de participation</field> + <field name="name">Provisions pour dépréciation des autres formes de participation</field> <field name="code">2966</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2967" model="account.account.template"> - <field name="name">Créances rattachées à des participations (même ventilation que celle du compte 267)</field> + <field name="name">Provisions pour dépréciation des créances rattachées à des participations (même ventilation que celle du compte 267)</field> <field name="code">2967</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2968" model="account.account.template"> - <field name="name">Créances rattachées à des sociétés en participation (même ventilation que celle du compte 268)</field> + <field name="name">Provisions pour dépréciation des créances rattachées à des sociétés en participation (même ventilation que celle du compte 268)</field> <field name="code">2968</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2971" model="account.account.template"> - <field name="name">Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - droit de propriété (ventilation : 271)</field> + <field name="name">Provisions pour dépréciation des titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - droit de propriété (ventilation : 271)</field> <field name="code">2971</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2972" model="account.account.template"> - <field name="name">Titres immobilisés - droit de créance (même ventilation que celle du compte 272) </field> + <field name="name">Provisions pour dépréciation des titres immobilisés - droit de créance (même ventilation que celle du compte 272)</field> <field name="code">2972</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2973" model="account.account.template"> - <field name="name">Titres immobilisés de l'activité de portefeuille</field> + <field name="name">Provisions pour dépréciation des titres immobilisés de l'activité de portefeuille</field> <field name="code">2973</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2974" model="account.account.template"> - <field name="name">Prêts (même ventilation que celle du compte 274)</field> + <field name="name">Provisions pour dépréciation des prêts (même ventilation que celle du compte 274)</field> <field name="code">2974</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2975" model="account.account.template"> - <field name="name">Dépôts et cautionnements versés (même ventilation que celle du compte 275)</field> + <field name="name">Provisions pour dépréciation des dépôts et cautionnements versés (même ventilation que celle du compte 275)</field> <field name="code">2975</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_2976" model="account.account.template"> - <field name="name">Autres créances immobilisées (même ventilation que celle du compte 276)</field> + <field name="name">Provisions pour dépréciation des autres créances immobilisées (même ventilation que celle du compte 276)</field> <field name="code">2976</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_311" model="account.account.template"> - <field name="name">Matière (ou groupe) A</field> + <field name="name">Matières premières (ou groupe) A</field> <field name="code">311</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_312" model="account.account.template"> - <field name="name">Matière (ou groupe) B</field> + <field name="name">Matières premières (ou groupe) B</field> <field name="code">312</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1576,14 +1576,14 @@ </record> <record id="pcg_3211" model="account.account.template"> - <field name="name">Matière (ou groupe) C</field> + <field name="name">Matières consommables (ou groupe) C</field> <field name="code">3211</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3212" model="account.account.template"> - <field name="name">Matière (ou groupe) D</field> + <field name="name">Matières consommables (ou groupe) D</field> <field name="code">3212</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1688,63 +1688,63 @@ </record> <record id="pcg_3451" model="account.account.template"> - <field name="name">Prestations de services S 1</field> + <field name="name">Prestations de services en cours S 1</field> <field name="code">3451</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3452" model="account.account.template"> - <field name="name">Prestations de services S 2</field> + <field name="name">Prestations de services en cours S 2</field> <field name="code">3452</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3511" model="account.account.template"> - <field name="name">Produits intermédiaires (ou groupe) A </field> + <field name="name">Stocks produits intermédiaires (ou groupe) A</field> <field name="code">3511</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3512" model="account.account.template"> - <field name="name">Produits intermédiaires (ou groupe) B</field> + <field name="name">Stocks produits intermédiaires (ou groupe) B</field> <field name="code">3512</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3551" model="account.account.template"> - <field name="name">Produits finis (ou groupe) A</field> + <field name="name">Stocks produits finis (ou groupe) A</field> <field name="code">3551</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3552" model="account.account.template"> - <field name="name">Produits finis (ou groupe) B</field> + <field name="name">Stocks produits finis (ou groupe) B</field> <field name="code">3552</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3581" model="account.account.template"> - <field name="name">Déchets</field> + <field name="name">Stocks produits résiduels - Déchets</field> <field name="code">3581</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3585" model="account.account.template"> - <field name="name">Rebuts</field> + <field name="name">Stocks produits résiduels - Rebuts</field> <field name="code">3585</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3586" model="account.account.template"> - <field name="name">Matières de récupération</field> + <field name="name">Stocks produits résiduels - Matières de récupération</field> <field name="code">3586</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1758,14 +1758,14 @@ </record> <record id="pcg_371" model="account.account.template"> - <field name="name">Marchandises (ou groupe) A</field> + <field name="name">Stocks de marchandises (ou groupe) A</field> <field name="code">371</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_372" model="account.account.template"> - <field name="name">Marchandises (ou groupe) B</field> + <field name="name">Stocks de marchandises (ou groupe) B</field> <field name="code">372</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -1779,105 +1779,105 @@ </record> <record id="pcg_3911" model="account.account.template"> - <field name="name">Matières (ou groupe) A</field> + <field name="name">Provisions pour dépréciation des matières premières (ou groupe) A</field> <field name="code">3911</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3912" model="account.account.template"> - <field name="name">Matières (ou groupe) B</field> + <field name="name">Provisions pour dépréciation des matières premières (ou groupe) B</field> <field name="code">3912</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3917" model="account.account.template"> - <field name="name">Fournitures A, B, C, ..</field> + <field name="name">Provisions pour dépréciation des fournitures A, B, C, ..</field> <field name="code">3917</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3921" model="account.account.template"> - <field name="name">Matières consommables (même ventilation que celle du compte 321)</field> + <field name="name">Provisions pour dépréciation des matières consommables (même ventilation que celle du compte 321)</field> <field name="code">3921</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3922" model="account.account.template"> - <field name="name">Fournitures consommables (même ventilation que celle du compte 322)</field> + <field name="name">Provisions pour dépréciation des fournitures consommables (même ventilation que celle du compte 322)</field> <field name="code">3922</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3926" model="account.account.template"> - <field name="name">Emballages (même ventilation que celle du compte 326)</field> + <field name="name">Provisions pour dépréciation des emballages (même ventilation que celle du compte 326)</field> <field name="code">3926</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3931" model="account.account.template"> - <field name="name">Produits en cours (même ventilation que celle du compte 331)</field> + <field name="name">Provisions pour dépréciation des produits en cours (même ventilation que celle du compte 331)</field> <field name="code">3931</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3935" model="account.account.template"> - <field name="name">Travaux en cours (même ventilation que celle du compte 335)</field> + <field name="name">Provisions pour dépréciation des travaux en cours (même ventilation que celle du compte 335)</field> <field name="code">3935</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3941" model="account.account.template"> - <field name="name">Études en cours (même ventilation que celle du compte 341)</field> + <field name="name">Provisions pour dépréciation des études en cours (même ventilation que celle du compte 341)</field> <field name="code">3941</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3945" model="account.account.template"> - <field name="name">Prestations de services en cours (même ventilation que celle du compte 345)</field> + <field name="name">Provisions pour dépréciation des prestations de services en cours (même ventilation que celle du compte 345)</field> <field name="code">3945</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3951" model="account.account.template"> - <field name="name">Produits intermédiaires (même ventilation que celle du compte 351)</field> + <field name="name">Provisions pour dépréciation des produits intermédiaires (même ventilation que celle du compte 351)</field> <field name="code">3951</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3955" model="account.account.template"> - <field name="name">Produits finis (même ventilation que celle du compte 355)</field> + <field name="name">Provisions pour dépréciation des produits finis (même ventilation que celle du compte 355)</field> <field name="code">3955</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3971" model="account.account.template"> - <field name="name">Marchandises (ou groupe) A</field> + <field name="name">Provisions pour dépréciation des stocks de marchandises (ou groupe) A</field> <field name="code">3971</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_3972" model="account.account.template"> - <field name="name">Marchandises (ou groupe) B</field> + <field name="name">Provisions pour dépréciation des stocks de marchandises (ou groupe) B</field> <field name="code">3972</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_400" model="account.account.template"> - <field name="name">Fournisseurs et comptes rattachés </field> + <field name="name">Fournisseurs et comptes rattachés</field> <field name="code">400</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -1933,7 +1933,7 @@ </record> <record id="pcg_4081" model="account.account.template"> - <field name="name">Fournisseurs</field> + <field name="name">Factures non parvenues - Fournisseurs</field> <field name="code">4081</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -1941,7 +1941,7 @@ </record> <record id="pcg_4084" model="account.account.template"> - <field name="name">Fournisseurs d'immobilisations </field> + <field name="name">Factures non parvenues - Fournisseurs d'immobilisations</field> <field name="code">4084</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -1949,7 +1949,7 @@ </record> <record id="pcg_4088" model="account.account.template"> - <field name="name">Fournisseurs - Intérêts courus</field> + <field name="name">Factures non parvenues - Fournisseurs - Intérêts courus</field> <field name="code">4088</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -1957,7 +1957,7 @@ </record> <record id="pcg_4096" model="account.account.template"> - <field name="name">Fournisseurs - Créances pour emballages et matériel à rendre</field> + <field name="name">Fournisseurs débiteurs - Créances pour emballages et matériel à rendre</field> <field name="code">4096</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="reconcile" eval="True"/> @@ -1965,7 +1965,7 @@ </record> <record id="pcg_40971" model="account.account.template"> - <field name="name">Fournisseurs d'exploitation</field> + <field name="name">Fournisseurs débiteurs - Autres avoirs des fournisseurs d'exploitation</field> <field name="code">40971</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="reconcile" eval="True"/> @@ -1973,7 +1973,7 @@ </record> <record id="pcg_40974" model="account.account.template"> - <field name="name">Fournisseurs d'immobilisations</field> + <field name="name">Fournisseurs débiteurs - Autres avoirs des fournisseurs d'immobilisations</field> <field name="code">40974</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="reconcile" eval="True"/> @@ -1981,7 +1981,7 @@ </record> <record id="pcg_4098" model="account.account.template"> - <field name="name">Rabais, remises, ristournes à obtenir et autres avoirs non encore reçus</field> + <field name="name">Fournisseurs débiteurs - Rabais, remises, ristournes à obtenir et autres avoirs non encore reçus</field> <field name="code">4098</field> <field name="user_type_id" ref="account.data_account_type_current_assets" /> <field name="reconcile" eval="True"/> @@ -1989,7 +1989,7 @@ </record> <record id="pcg_410" model="account.account.template"> - <field name="name">Clients et comptes rattachés </field> + <field name="name">Clients et comptes rattachés</field> <field name="code">410</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2030,7 +2030,7 @@ </record> <record id="pcg_4181" model="account.account.template"> - <field name="name">Clients - Factures à établir </field> + <field name="name">Clients - Factures à établir</field> <field name="code">4181</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2038,7 +2038,7 @@ </record> <record id="pcg_4188" model="account.account.template"> - <field name="name">Clients - Intérêts courus</field> + <field name="name">Clients - Intérêts courus non encore facturés</field> <field name="code">4188</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2046,7 +2046,7 @@ </record> <record id="pcg_4191" model="account.account.template"> - <field name="name">Clients - Avances et acomptes reçus sur commandes</field> + <field name="name">Clients créditeurs - Avances et acomptes reçus sur commandes</field> <field name="code">4191</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2054,7 +2054,7 @@ </record> <record id="pcg_4196" model="account.account.template"> - <field name="name">Clients - Dettes pour emballages et matériels consignés </field> + <field name="name">Clients créditeurs - Dettes pour emballages et matériels consignés</field> <field name="code">4196</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2062,7 +2062,7 @@ </record> <record id="pcg_4197" model="account.account.template"> - <field name="name">Clients - Autres avoirs </field> + <field name="name">Clients créditeurs - Autres avoirs</field> <field name="code">4197</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2070,7 +2070,7 @@ </record> <record id="pcg_4198" model="account.account.template"> - <field name="name">Rabais, remises, ristournes à accorder et autres avoirs à établir</field> + <field name="name">Clients créditeurs - Rabais, remises, ristournes à accorder et autres avoirs à établir</field> <field name="code">4198</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2086,7 +2086,7 @@ </record> <record id="pcg_422" model="account.account.template"> - <field name="name">Comités d'entreprise d'établissement </field> + <field name="name">Comités d'entreprise, d'établissement</field> <field name="code">422</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2094,7 +2094,7 @@ </record> <record id="pcg_4246" model="account.account.template"> - <field name="name">Réserve spéciale</field> + <field name="name">Participation des salariés aux résultats - Réserve spéciale</field> <field name="code">4246</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2102,7 +2102,7 @@ </record> <record id="pcg_4248" model="account.account.template"> - <field name="name">Comptes courants</field> + <field name="name">Participation des salariés aux résultats - Comptes courants</field> <field name="code">4248</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2134,7 +2134,7 @@ </record> <record id="pcg_4282" model="account.account.template"> - <field name="name">Dettes provisionnées pour congés à payer</field> + <field name="name">Personnel - Dettes provisionnées pour congés à payer</field> <field name="code">4282</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2142,7 +2142,7 @@ </record> <record id="pcg_4284" model="account.account.template"> - <field name="name">Dettes provisionnées pour participation des salariés aux résultats</field> + <field name="name">Personnel - Dettes provisionnées pour participation des salariés aux résultats</field> <field name="code">4284</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2150,7 +2150,7 @@ </record> <record id="pcg_4286" model="account.account.template"> - <field name="name">Autres charges à payer</field> + <field name="name">Personnel - Autres charges à payer</field> <field name="code">4286</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2158,7 +2158,7 @@ </record> <record id="pcg_4287" model="account.account.template"> - <field name="name">Produits à recevoir</field> + <field name="name">Personnel - Produits à recevoir</field> <field name="code">4287</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2182,7 +2182,7 @@ </record> <record id="pcg_4382" model="account.account.template"> - <field name="name">Charges sociales sur congés à payer </field> + <field name="name">Charges sociales sur congés à payer</field> <field name="code">4382</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2190,7 +2190,7 @@ </record> <record id="pcg_4386" model="account.account.template"> - <field name="name">Autres charges à payer</field> + <field name="name">Organismes sociaux - Autres charges à payer</field> <field name="code">4386</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2198,7 +2198,7 @@ </record> <record id="pcg_4387" model="account.account.template"> - <field name="name">Produits à recevoir</field> + <field name="name">Organismes sociaux - Produits à recevoir</field> <field name="code">4387</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2206,7 +2206,7 @@ </record> <record id="pcg_4411" model="account.account.template"> - <field name="name">Subventions d'investissement</field> + <field name="name">État - Subventions à recevoir - Subventions d'investissement</field> <field name="code">4411</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2214,7 +2214,7 @@ </record> <record id="pcg_4417" model="account.account.template"> - <field name="name">Subventions d'exploitation</field> + <field name="name">État - Subventions à recevoir - Subventions d'exploitation</field> <field name="code">4417</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2222,7 +2222,7 @@ </record> <record id="pcg_4418" model="account.account.template"> - <field name="name">Subventions d'équilibre</field> + <field name="name">État - Subventions à recevoir - Subventions d'équilibre</field> <field name="code">4418</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2230,7 +2230,7 @@ </record> <record id="pcg_4419" model="account.account.template"> - <field name="name">Avances sur subventions</field> + <field name="name">État - Subventions à recevoir - Avances sur subventions</field> <field name="code">4419</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2238,7 +2238,7 @@ </record> <record id="pcg_4424" model="account.account.template"> - <field name="name">Obligataires</field> + <field name="name">État - Impôts et taxes recouvrables sur des tiers - Obligataires</field> <field name="code">4424</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2246,7 +2246,7 @@ </record> <record id="pcg_4425" model="account.account.template"> - <field name="name">Associés</field> + <field name="name">État - Impôts et taxes recouvrables sur des tiers - Associés</field> <field name="code">4425</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2262,7 +2262,7 @@ </record> <record id="pcg_4438" model="account.account.template"> - <field name="name">Intérêts courus sur créances figurant au compte 4431</field> + <field name="name">État - Intérêts courus sur créances figurant au compte 4431</field> <field name="code">4438</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2322,14 +2322,14 @@ </record> <record id="pcg_44562" model="account.account.template"> - <field name="name">TVA sur immobilisations</field> + <field name="name">TVA déductible sur immobilisations</field> <field name="code">44562</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_44563" model="account.account.template"> - <field name="name">TVA transférée par d'autres entreprises</field> + <field name="name">TVA déductible transférée par d'autres entreprises</field> <field name="code">44563</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2337,7 +2337,7 @@ </record> <record id="pcg_44566" model="account.account.template"> - <field name="name">TVA sur autres biens et services</field> + <field name="name">TVA déductible sur autres biens et services</field> <field name="code">44566</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -2367,7 +2367,7 @@ </record> <record id="pcg_44568" model="account.account.template"> - <field name="name">Taxes assimilées à la TVA</field> + <field name="name">Taxes déductibles assimilées à la TVA</field> <field name="code">44568</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2396,7 +2396,7 @@ </record> <record id="pcg_44578" model="account.account.template"> - <field name="name">Taxes assimilées à la TVA</field> + <field name="name">Taxes collectées assimilées à la TVA</field> <field name="code">44578</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2476,7 +2476,7 @@ </record> <record id="pcg_4482" model="account.account.template"> - <field name="name">Charges fiscales sur congés à payer </field> + <field name="name">État - Charges fiscales sur congés à payer</field> <field name="code">4482</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2484,7 +2484,7 @@ </record> <record id="pcg_4486" model="account.account.template"> - <field name="name">Charges à payer</field> + <field name="name">État - Charges à payer</field> <field name="code">4486</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2492,7 +2492,7 @@ </record> <record id="pcg_4487" model="account.account.template"> - <field name="name">Produits à recevoir</field> + <field name="name">État - Produits à recevoir</field> <field name="code">4487</field> <field name="user_type_id" ref="account.data_account_type_current_assets"/> <field name="reconcile" eval="True"/> @@ -2515,17 +2515,8 @@ <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> - <record id="pcg_455" model="account.account.template"> - <field name="name">Associés - Comptes courants</field> - <field name="code">455</field> - <field name="user_type_id" ref="account.data_account_type_payable"/> - <field name="note">Pour frais avancés personnellement</field> - <field name="reconcile" eval="True"/> - <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> - </record> - <record id="pcg_4551" model="account.account.template"> - <field name="name">Principal</field> + <field name="name">Associés - Comptes courants - Principal</field> <field name="code">4551</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -2533,7 +2524,7 @@ </record> <record id="pcg_4558" model="account.account.template"> - <field name="name">Intérêts courus</field> + <field name="name">Associés - Comptes courants - Intérêts courus</field> <field name="code">4558</field> <field name="user_type_id" ref="account.data_account_type_payable"/> <field name="reconcile" eval="True"/> @@ -2541,7 +2532,7 @@ </record> <record id="pcg_45611" model="account.account.template"> - <field name="name">Apports en nature</field> + <field name="name">Associés - Comptes d'apport en société - Apports en nature</field> <field name="code">45611</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2549,7 +2540,7 @@ </record> <record id="pcg_45615" model="account.account.template"> - <field name="name">Apports en numéraire</field> + <field name="name">Associés - Comptes d'apport en société - Apports en numéraire</field> <field name="code">45615</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2613,7 +2604,7 @@ </record> <record id="pcg_4581" model="account.account.template"> - <field name="name">Opérations courantes</field> + <field name="name">Associés - Opérations faites en commun et en GIE - Opérations courantes</field> <field name="code">4581</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2621,7 +2612,7 @@ </record> <record id="pcg_4588" model="account.account.template"> - <field name="name">Intérêts courus</field> + <field name="name">Associés - Opérations faites en commun et en GIE - Intérêts courus</field> <field name="code">4588</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2675,48 +2666,16 @@ <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> - <record id="pcg_472" model="account.account.template"> - <field name="name">Comptes d'attente 1</field> - <field name="code">472</field> - <field name="user_type_id" ref="account.data_account_type_receivable"/> - <field name="reconcile" eval="True"/> - <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> - </record> - - <record id="pcg_473" model="account.account.template"> - <field name="name">Comptes d'attente 2</field> - <field name="code">473</field> - <field name="user_type_id" ref="account.data_account_type_receivable"/> - <field name="reconcile" eval="True"/> - <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> - </record> - - <record id="pcg_474" model="account.account.template"> - <field name="name">Comptes d'attente 3</field> - <field name="code">474</field> - <field name="user_type_id" ref="account.data_account_type_receivable"/> - <field name="reconcile" eval="True"/> - <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> - </record> - - <record id="pcg_475" model="account.account.template"> - <field name="name">Comptes d'attente 4</field> - <field name="code">475</field> - <field name="user_type_id" ref="account.data_account_type_receivable"/> - <field name="reconcile" eval="True"/> - <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> - </record> - - <record id="pcg_476" model="account.account.template"> - <field name="name">Comptes d'attente 5</field> - <field name="code">476</field> + <record id="pcg_471" model="account.account.template"> + <field name="name">Compte d'attente</field> + <field name="code">471</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_4761" model="account.account.template"> - <field name="name">Diminution des créances</field> + <field name="name">Différence de conversion - Actif - Diminution des créances</field> <field name="code">4761</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2724,7 +2683,7 @@ </record> <record id="pcg_4762" model="account.account.template"> - <field name="name">Augmentation des dettes</field> + <field name="name">Différence de conversion - Actif - Augmentation des dettes</field> <field name="code">4762</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2732,7 +2691,7 @@ </record> <record id="pcg_4768" model="account.account.template"> - <field name="name">Différences compensées par couverture de change</field> + <field name="name">Différence de conversion - Actif - Différences compensées par couverture de change</field> <field name="code">4768</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2740,7 +2699,7 @@ </record> <record id="pcg_4771" model="account.account.template"> - <field name="name">Augmentation des créances</field> + <field name="name">Différences de conversion - Passif - Augmentation des créances</field> <field name="code">4771</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2748,7 +2707,7 @@ </record> <record id="pcg_4772" model="account.account.template"> - <field name="name">Diminution des dettes</field> + <field name="name">Différences de conversion - Passif - Diminution des dettes</field> <field name="code">4772</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2756,7 +2715,7 @@ </record> <record id="pcg_4778" model="account.account.template"> - <field name="name">Différences compensées par couverture de change</field> + <field name="name">Différences de conversion - Passif - Différences compensées par couverture de change</field> <field name="code">4778</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2771,7 +2730,7 @@ </record> <record id="pcg_4816" model="account.account.template"> - <field name="name">Frais d'émission des emprunts</field> + <field name="name">Charges à répartir sur plusieurs exercices - Frais d'émission des emprunts</field> <field name="code">4816</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2795,7 +2754,7 @@ </record> <record id="pcg_4886" model="account.account.template"> - <field name="name">Charges</field> + <field name="name">Comptes de répartition périodique des charges</field> <field name="code">4886</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2803,7 +2762,7 @@ </record> <record id="pcg_4887" model="account.account.template"> - <field name="name">Produits</field> + <field name="name">Comptes de répartition périodique des produits</field> <field name="code">4887</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2819,7 +2778,7 @@ </record> <record id="pcg_491" model="account.account.template"> - <field name="name">Dépréciation des comptes de clients</field> + <field name="name">Provisions pour dépréciation des comptes de clients</field> <field name="code">491</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2827,7 +2786,7 @@ </record> <record id="pcg_4951" model="account.account.template"> - <field name="name">Comptes du groupe</field> + <field name="name">Provisions pour dépréciation des comptes du groupe</field> <field name="code">4951</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2835,7 +2794,7 @@ </record> <record id="pcg_4955" model="account.account.template"> - <field name="name">Comptes courants des associés</field> + <field name="name">Provisions pour dépréciation des comptes courants des associés</field> <field name="code">4955</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2843,7 +2802,7 @@ </record> <record id="pcg_4958" model="account.account.template"> - <field name="name">Opérations faites en commun et en GIE</field> + <field name="name">Provisions pour dépréciation des opérations faites en commun et en GIE</field> <field name="code">4958</field> <field name="user_type_id" ref="account.data_account_type_current_liabilities"/> <field name="reconcile" eval="True"/> @@ -2851,7 +2810,7 @@ </record> <record id="pcg_4962" model="account.account.template"> - <field name="name">Créances sur cessions d'immobilisations</field> + <field name="name">Provisions pour dépréciation des créances sur cessions d'immobilisations</field> <field name="code">4962</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2859,7 +2818,7 @@ </record> <record id="pcg_4965" model="account.account.template"> - <field name="name">Créances sur cessions de valeurs mobilières de placement</field> + <field name="name">Provisions pour dépréciation des créances sur cessions de valeurs mobilières de placement</field> <field name="code">4965</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2867,7 +2826,7 @@ </record> <record id="pcg_4967" model="account.account.template"> - <field name="name">Autres comptes débiteurs</field> + <field name="name">Provisions pour dépréciation - Autres comptes débiteurs</field> <field name="code">4967</field> <field name="user_type_id" ref="account.data_account_type_receivable"/> <field name="reconcile" eval="True"/> @@ -2875,35 +2834,35 @@ </record> <record id="pcg_501" model="account.account.template"> - <field name="name">Parts dans entreprises liées</field> + <field name="name">Valeurs mobilières de placement - Parts dans entreprises liées</field> <field name="code">501</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_502" model="account.account.template"> - <field name="name">Actions propres</field> + <field name="name">Valeurs mobilières de placement - Actions propres</field> <field name="code">502</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5031" model="account.account.template"> - <field name="name">Titres cotés</field> + <field name="name">Valeurs mobilières de placement - Titres cotés</field> <field name="code">5031</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5035" model="account.account.template"> - <field name="name">Titres non cotés</field> + <field name="name">Valeurs mobilières de placement - Titres non cotés</field> <field name="code">5035</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_504" model="account.account.template"> - <field name="name">Autres titres conférant un droit de propriété</field> + <field name="name">Valeurs mobilières de placement - Autres titres conférant un droit de propriété</field> <field name="code">504</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -2917,14 +2876,14 @@ </record> <record id="pcg_5061" model="account.account.template"> - <field name="name">Titres cotés</field> + <field name="name">Obligations cotés</field> <field name="code">5061</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5065" model="account.account.template"> - <field name="name">Titres non cotés</field> + <field name="name">Obligations non cotés</field> <field name="code">5065</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -2938,7 +2897,7 @@ </record> <record id="pcg_5081" model="account.account.template"> - <field name="name">Autres valeurs mobilières</field> + <field name="name">Autres valeurs mobilières de placement</field> <field name="code">5081</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -2994,7 +2953,7 @@ </record> <record id="pcg_5124" model="account.account.template"> - <field name="name">Comptes en devises</field> + <field name="name">Banques - Comptes en devises</field> <field name="code">5124</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3043,21 +3002,21 @@ </record> <record id="pcg_5191" model="account.account.template"> - <field name="name">Crédit de mobilisation de créances commerciales (CMCC)</field> + <field name="name">Concours bancaires courants - Crédit de mobilisation de créances commerciales (CMCC)</field> <field name="code">5191</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5193" model="account.account.template"> - <field name="name">Mobilisation de créances nées à l'étranger</field> + <field name="name">Concours bancaires courants - Mobilisation de créances nées à l'étranger</field> <field name="code">5193</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5198" model="account.account.template"> - <field name="name">Intérêts courus sur concours bancaires courants</field> + <field name="name">Concours bancaires courants - Intérêts courus sur concours bancaires courants</field> <field name="code">5198</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3106,119 +3065,119 @@ </record> <record id="pcg_5903" model="account.account.template"> - <field name="name">Actions</field> + <field name="name">Provisions pour dépréciation des actions</field> <field name="code">5903</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5904" model="account.account.template"> - <field name="name">Autres titres conférant un droit de propriété </field> + <field name="name">Provisions pour dépréciation des autres titres conférant un droit de propriété</field> <field name="code">5904</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5906" model="account.account.template"> - <field name="name">Obligations</field> + <field name="name">Provisions pour dépréciation des obligations</field> <field name="code">5906</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_5908" model="account.account.template"> - <field name="name">Autres valeurs mobilières de placement et créances assimilées (provisions)</field> + <field name="name">Provisions pour dépréciation des autres valeurs mobilières de placement et créances assimilées (provisions)</field> <field name="code">5908</field> <field name="user_type_id" ref="account.data_account_type_liquidity"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6011" model="account.account.template"> - <field name="name">Matières (ou groupe) A</field> + <field name="name">Achats stockés - Matières premières (ou groupe) A</field> <field name="code">6011</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6012" model="account.account.template"> - <field name="name">Matières (ou groupe) B</field> + <field name="name">Achats stockés - matières premières (ou groupe) B</field> <field name="code">6012</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6017" model="account.account.template"> - <field name="name">Fournitures A, B, C, ..</field> + <field name="name">Achats stockés - Fournitures A, B, C, ..</field> <field name="code">6017</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60211" model="account.account.template"> - <field name="name">Matières (ou groupe) C</field> + <field name="name">Achats stockés - Matières consommables (ou groupe) C</field> <field name="code">60211</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60212" model="account.account.template"> - <field name="name">Matières (ou groupe) D</field> + <field name="name">Achats stockés - Matières consommables (ou groupe) D</field> <field name="code">60212</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60221" model="account.account.template"> - <field name="name">Combustibles</field> + <field name="name">Achats stockés - Combustibles</field> <field name="code">60221</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60222" model="account.account.template"> - <field name="name">Produits d'entretien</field> + <field name="name">Achats stockés - Produits d'entretien</field> <field name="code">60222</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60223" model="account.account.template"> - <field name="name">Fournitures d'atelier et d'usine</field> + <field name="name">Achats stockés - Fournitures d'atelier et d'usine</field> <field name="code">60223</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60224" model="account.account.template"> - <field name="name">Fournitures de magasin</field> + <field name="name">Achats stockés - Fournitures de magasin</field> <field name="code">60224</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60225" model="account.account.template"> - <field name="name">Fournitures de bureau</field> + <field name="name">Achats stockés - Fournitures de bureau</field> <field name="code">60225</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60261" model="account.account.template"> - <field name="name">Emballages perdus</field> + <field name="name">Achats stockés - Emballages perdus</field> <field name="code">60261</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60265" model="account.account.template"> - <field name="name">Emballages récupérables non identifiables</field> + <field name="name">Achats stockés - Emballages récupérables non identifiables</field> <field name="code">60265</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_60267" model="account.account.template"> - <field name="name">Emballages à usage mixte</field> + <field name="name">Achats stockés - Emballages à usage mixte</field> <field name="code">60267</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3261,7 +3220,7 @@ </record> <record id="pcg_6061" model="account.account.template"> - <field name="name">Fournitures non stockables (eau, énergie...) </field> + <field name="name">Fournitures non stockables (eau, énergie...)</field> <field name="code">6061</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3282,14 +3241,14 @@ </record> <record id="pcg_6068" model="account.account.template"> - <field name="name">Autres matières et fournitures</field> + <field name="name">Achats autres matières et fournitures</field> <field name="code">6068</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6071" model="account.account.template"> - <field name="name">Marchandise (ou groupe) A</field> + <field name="name">Achats de marchandises (ou groupe) A</field> <field name="code">6071</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3297,7 +3256,7 @@ </record> <record id="pcg_6072" model="account.account.template"> - <field name="name">Marchandise (ou groupe) B</field> + <field name="name">Achats de marchandises (ou groupe) B</field> <field name="code">6072</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="note">Pour déclaration TVA intracommunautaire</field> @@ -3312,42 +3271,42 @@ </record> <record id="pcg_6091" model="account.account.template"> - <field name="name">- de matières premières (et fournitures)</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats de matières premières (et fournitures)</field> <field name="code">6091</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6092" model="account.account.template"> - <field name="name">- d'autres approvisionnements stockés</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats d'autres approvisionnements stockés</field> <field name="code">6092</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6094" model="account.account.template"> - <field name="name">- d'études et prestations de services</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats d'études et prestations de services</field> <field name="code">6094</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6095" model="account.account.template"> - <field name="name">- de matériel, équipements et travaux</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats de matériel, équipements et travaux</field> <field name="code">6095</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6096" model="account.account.template"> - <field name="name">- d'approvisionnements non stockés</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats d'approvisionnements non stockés</field> <field name="code">6096</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6097" model="account.account.template"> - <field name="name">- de marchandises</field> + <field name="name">Rabais, remises et ristournes obtenus sur achats de marchandises</field> <field name="code">6097</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3368,14 +3327,14 @@ </record> <record id="pcg_6122" model="account.account.template"> - <field name="name">Crédit-bail mobilier</field> + <field name="name">Redevances de crédit-bail mobilier</field> <field name="code">6122</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6125" model="account.account.template"> - <field name="name">Crédit-bail immobilier</field> + <field name="name">Redevances de crédit-bail immobilier</field> <field name="code">6125</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3396,7 +3355,7 @@ </record> <record id="pcg_6136" model="account.account.template"> - <field name="name">Malis sur emballages</field> + <field name="name">Locations malis sur emballages</field> <field name="code">6136</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3410,14 +3369,14 @@ </record> <record id="pcg_6152" model="account.account.template"> - <field name="name">- sur biens immobiliers</field> + <field name="name">Entretien et réparations sur biens immobiliers</field> <field name="code">6152</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6155" model="account.account.template"> - <field name="name">- sur biens mobiliers</field> + <field name="name">Entretien et réparations sur biens mobiliers</field> <field name="code">6155</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3431,14 +3390,14 @@ </record> <record id="pcg_6161" model="account.account.template"> - <field name="name">Multirisques</field> + <field name="name">Assurance multirisques</field> <field name="code">6161</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6162" model="account.account.template"> - <field name="name">Assurance obligatoire dommage construction </field> + <field name="name">Assurance obligatoire dommage construction</field> <field name="code">6162</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3452,7 +3411,7 @@ </record> <record id="pcg_61637" model="account.account.template"> - <field name="name">Assurance transportsur ventes</field> + <field name="name">Assurance transport sur ventes</field> <field name="code">61637</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3466,14 +3425,14 @@ </record> <record id="pcg_6164" model="account.account.template"> - <field name="name">Risques d'exploitation</field> + <field name="name">Assurance risques d'exploitation</field> <field name="code">6164</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6165" model="account.account.template"> - <field name="name">Insolvabilité clients</field> + <field name="name">Assurance insolvabilité clients</field> <field name="code">6165</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3529,7 +3488,7 @@ </record> <record id="pcg_6221" model="account.account.template"> - <field name="name">Commissions et courtages sur achats </field> + <field name="name">Commissions et courtages sur achats</field> <field name="code">6221</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3571,7 +3530,7 @@ </record> <record id="pcg_6228" model="account.account.template"> - <field name="name">Divers</field> + <field name="name">Rémunérations d'intermédiaires et honoraires - Divers</field> <field name="code">6228</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3628,7 +3587,7 @@ </record> <record id="pcg_6238" model="account.account.template"> - <field name="name">Divers (pourboires, dons courants...)</field> + <field name="name">Publicité, publications, relations publiques - Divers (pourboires, dons courants...)</field> <field name="code">6238</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3670,7 +3629,7 @@ </record> <record id="pcg_6248" model="account.account.template"> - <field name="name">Divers</field> + <field name="name">Transports divers</field> <field name="code">6248</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3796,7 +3755,7 @@ </record> <record id="pcg_6318" model="account.account.template"> - <field name="name">Autres</field> + <field name="name">Autres impôts, taxes et versements assimilés sur rémunérations (administrations des impôts)</field> <field name="code">6318</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3838,15 +3797,22 @@ </record> <record id="pcg_6338" model="account.account.template"> - <field name="name">Autres</field> + <field name="name">Autres impôts, taxes et versements assimilés sur rémunérations (autres organismes)</field> <field name="code">6338</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> - <record id="pcg_63511" model="account.account.template"> - <field name="name">Taxe professionnelle</field> - <field name="code">63511</field> + <record id="pcg_635111" model="account.account.template"> + <field name="name">Cotisation foncière des entreprises</field> + <field name="code">635111</field> + <field name="user_type_id" ref="account.data_account_type_expenses"/> + <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> + </record> + + <record id="pcg_635112" model="account.account.template"> + <field name="name">Cotisation sur la valeur ajoutée des entreprises</field> + <field name="code">635112</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> @@ -3873,7 +3839,7 @@ </record> <record id="pcg_6352" model="account.account.template"> - <field name="name">Taxes sur le chiffre d'affaires non récupérables </field> + <field name="name">Taxes sur le chiffre d'affaires non récupérables</field> <field name="code">6352</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -3922,7 +3888,7 @@ </record> <record id="pcg_6378" model="account.account.template"> - <field name="name">Taxes diverses</field> + <field name="name">Taxes diverses (autres organismes)</field> <field name="code">6378</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4041,7 +4007,7 @@ </record> <record id="pcg_6475" model="account.account.template"> - <field name="name">Médecine du travail pharmacie</field> + <field name="name">Médecine du travail, pharmacie</field> <field name="code">6475</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4062,7 +4028,7 @@ </record> <record id="pcg_6511" model="account.account.template"> - <field name="name">Redevances pour concessions brevets, licences, marques, procédés, logiciels </field> + <field name="name">Redevances pour concessions brevets, licences, marques, procédés, logiciels</field> <field name="code">6511</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4210,14 +4176,14 @@ </record> <record id="pcg_6711" model="account.account.template"> - <field name="name">Pénalités sur marchés (et dédits payés sur achats et ventes)</field> + <field name="name">Charges exceptionnelles - Pénalités sur marchés (et dédits payés sur achats et ventes)</field> <field name="code">6711</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6712" model="account.account.template"> - <field name="name">Pénalités, amendes fiscales et pénales </field> + <field name="name">Charges exceptionnelles - Pénalités, amendes fiscales et pénales</field> <field name="code">6712</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="note">PV code de la route non déductibles</field> @@ -4225,28 +4191,28 @@ </record> <record id="pcg_6713" model="account.account.template"> - <field name="name">Dons, libéralités</field> + <field name="name">Charges exceptionnelles - Dons, libéralités</field> <field name="code">6713</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6714" model="account.account.template"> - <field name="name">Créances devenues irrécouvrables dans l'exercice</field> + <field name="name">Charges exceptionnelles - Créances devenues irrécouvrables dans l'exercice</field> <field name="code">6714</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6715" model="account.account.template"> - <field name="name">Subventions accordées</field> + <field name="name">Charges exceptionnelles - Subventions accordées</field> <field name="code">6715</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6717" model="account.account.template"> - <field name="name">Rappels d'impôts (autres qu'impôts sur les bénéfices)</field> + <field name="name">Charges exceptionnelles - Rappels d'impôts (autres qu'impôts sur les bénéfices)</field> <field name="code">6717</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4260,56 +4226,56 @@ </record> <record id="pcg_672" model="account.account.template"> - <field name="name">Charges sur exercices antérieurs (en cours d'exercice seulement)</field> + <field name="name">Charges exceptionnelles sur exercices antérieurs (en cours d'exercice seulement)</field> <field name="code">672</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6751" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Valeurs comptables des éléments d'actif cédés - Immobilisations incorporelles</field> <field name="code">6751</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6752" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Valeurs comptables des éléments d'actif cédés - Immobilisations corporelles</field> <field name="code">6752</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6756" model="account.account.template"> - <field name="name">Immobilisations financières</field> + <field name="name">Valeurs comptables des éléments d'actif cédés - Immobilisations financières</field> <field name="code">6756</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6758" model="account.account.template"> - <field name="name">Autres éléments d'actif</field> + <field name="name">Valeurs comptables des éléments d'actif cédés - Autres éléments d'actif</field> <field name="code">6758</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6781" model="account.account.template"> - <field name="name">Malis provenant de clauses d'indexation </field> + <field name="name">Charges exceptionnelles - Malis provenant de clauses d'indexation</field> <field name="code">6781</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6782" model="account.account.template"> - <field name="name">Lots</field> + <field name="name">Charges exceptionnelles - Lots</field> <field name="code">6782</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6783" model="account.account.template"> - <field name="name">Malis provenant du rachat par l'entreprise d'actions et obligations émises par elle-même</field> + <field name="name">Charges exceptionnelles - Malis provenant du rachat par l'entreprise d'actions et obligations émises par elle-même</field> <field name="code">6783</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4323,14 +4289,14 @@ </record> <record id="pcg_68111" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Dotations aux amortissements sur immobilisations incorporelles</field> <field name="code">68111</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_68112" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Dotations aux amortissements sur immobilisations corporelles</field> <field name="code">68112</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4351,28 +4317,28 @@ </record> <record id="pcg_68161" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Dotations aux dépréciations des immobilisations incorporelles</field> <field name="code">68161</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_68162" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Dotations aux dépréciations des immobilisations corporelles</field> <field name="code">68162</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_68173" model="account.account.template"> - <field name="name">Stocks et en-cours</field> + <field name="name">Dotations aux dépréciations des stocks et en-cours</field> <field name="code">68173</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_68174" model="account.account.template"> - <field name="name">Créances</field> + <field name="name">Dotations aux dépréciations des créances</field> <field name="code">68174</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4393,21 +4359,21 @@ </record> <record id="pcg_68662" model="account.account.template"> - <field name="name">Immobilisations financières</field> + <field name="name">Dotations aux dépréciations des immobilisations financières</field> <field name="code">68662</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_68665" model="account.account.template"> - <field name="name">Valeurs mobilières de placement</field> + <field name="name">Dotations aux dépréciations des valeurs mobilières de placement</field> <field name="code">68665</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6868" model="account.account.template"> - <field name="name">Autres dotations</field> + <field name="name">Autres dotations aux amortissements, dépréciations et provisions - Charges financières</field> <field name="code">6868</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4421,21 +4387,21 @@ </record> <record id="pcg_68725" model="account.account.template"> - <field name="name">Amortissements dérogatoires</field> + <field name="name">Dotations aux provisions réglementées exceptionnelles (immobilisations) - Amortissements dérogatoires</field> <field name="code">68725</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6873" model="account.account.template"> - <field name="name">Dotations aux provisions réglementées (stocks)</field> + <field name="name">Dotations aux provisions réglementées exceptionnelles (stocks)</field> <field name="code">6873</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_6874" model="account.account.template"> - <field name="name">Dotations aux autres provisions réglementées</field> + <field name="name">Dotations aux autres provisions réglementées exceptionnelles</field> <field name="code">6874</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4463,7 +4429,7 @@ </record> <record id="pcg_6951" model="account.account.template"> - <field name="name">Impôts dus en France</field> + <field name="name">Impôts sur les bénéfices dus en France</field> <field name="code">6951</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4477,7 +4443,7 @@ </record> <record id="pcg_6954" model="account.account.template"> - <field name="name">Impôts dus à l'étranger</field> + <field name="name">Impôts sur les bénéfices dus à l'étranger</field> <field name="code">6954</field> <field name="user_type_id" ref="account.data_account_type_expenses"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4519,14 +4485,14 @@ </record> <record id="pcg_7011" model="account.account.template"> - <field name="name">Produits finis (ou groupe) A</field> + <field name="name">Ventes de produits finis (ou groupe) A</field> <field name="code">7011</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7012" model="account.account.template"> - <field name="name">Produits finis (ou groupe) B</field> + <field name="name">Ventes de produits finis (ou groupe) B</field> <field name="code">7012</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4547,49 +4513,49 @@ </record> <record id="pcg_7041" model="account.account.template"> - <field name="name">Travaux de catégorie (ou activité) A</field> + <field name="name">Ventes de travaux de catégorie (ou activité) A</field> <field name="code">7041</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7042" model="account.account.template"> - <field name="name">Travaux de catégorie (ou activité) B</field> + <field name="name">Ventes de travaux de catégorie (ou activité) B</field> <field name="code">7042</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_705" model="account.account.template"> - <field name="name">Études</field> + <field name="name">Ventes d'études</field> <field name="code">705</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_706" model="account.account.template"> - <field name="name">Prestations de services</field> + <field name="name">Ventes de prestations de services</field> <field name="code">706</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7071" model="account.account.template"> - <field name="name">Marchandises (ou groupe) A</field> + <field name="name">Ventes de marchandises (ou groupe) A</field> <field name="code">7071</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7072" model="account.account.template"> - <field name="name">Marchandises (ou groupe) B</field> + <field name="name">Ventes de marchandises (ou groupe) B</field> <field name="code">7072</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7073" model="account.account.template"> - <field name="name">Marchandises à l'exportation</field> + <field name="name">Ventes de marchandises à l'exportation</field> <field name="code">7073</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4617,7 +4583,7 @@ </record> <record id="pcg_7084" model="account.account.template"> - <field name="name">Mise à disposition de personnel facturée </field> + <field name="name">Mise à disposition de personnel facturée</field> <field name="code">7084</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4652,112 +4618,112 @@ </record> <record id="pcg_7091" model="account.account.template"> - <field name="name">- sur ventes de produits finis</field> + <field name="name">Rabais, remises et ristournes sur ventes de produits finis</field> <field name="code">7091</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7092" model="account.account.template"> - <field name="name">- sur ventes de produits intermédiaires </field> + <field name="name">Rabais, remises et ristournes sur ventes de produits intermédiaires</field> <field name="code">7092</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7094" model="account.account.template"> - <field name="name">- sur travaux</field> + <field name="name">Rabais, remises et ristournes sur travaux</field> <field name="code">7094</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7095" model="account.account.template"> - <field name="name">- sur études</field> + <field name="name">Rabais, remises et ristournes sur études</field> <field name="code">7095</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7096" model="account.account.template"> - <field name="name">- sur prestations de services</field> + <field name="name">Rabais, remises et ristournes sur prestations de services</field> <field name="code">7096</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7097" model="account.account.template"> - <field name="name">- sur ventes de marchandises</field> + <field name="name">Rabais, remises et ristournes sur ventes de marchandises</field> <field name="code">7097</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7098" model="account.account.template"> - <field name="name">- sur produits des activités annexes</field> + <field name="name">Rabais, remises et ristournes sur produits des activités annexes</field> <field name="code">7098</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71331" model="account.account.template"> - <field name="name">Produits en cours</field> + <field name="name">Variation des en-cours de production de biens - Produits en cours</field> <field name="code">71331</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71335" model="account.account.template"> - <field name="name">Travaux en cours</field> + <field name="name">Variation des en-cours de production de biens - Travaux en cours</field> <field name="code">71335</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71341" model="account.account.template"> - <field name="name">Études en cours</field> + <field name="name">Variation des en-cours de production de services - Études en cours</field> <field name="code">71341</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71345" model="account.account.template"> - <field name="name">Prestations de services en cours</field> + <field name="name">Variation des en-cours de production de services - Prestations de services en cours</field> <field name="code">71345</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71351" model="account.account.template"> - <field name="name">Produits intermédiaires </field> + <field name="name">Variation des stocks de produits intermédiaires</field> <field name="code">71351</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71355" model="account.account.template"> - <field name="name">Produits finis</field> + <field name="name">Variation des stocks de produits finis</field> <field name="code">71355</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_71358" model="account.account.template"> - <field name="name">Produits résiduels</field> + <field name="name">Variation des stocks de produits résiduels</field> <field name="code">71358</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_721" model="account.account.template"> - <field name="name">Immobilisations incorporelles </field> + <field name="name">Production immobilisée - Immobilisations incorporelles</field> <field name="code">721</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_722" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Production immobilisée - Immobilisations corporelles</field> <field name="code">722</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4771,7 +4737,7 @@ </record> <record id="pcg_7511" model="account.account.template"> - <field name="name">Redevances pour concessions, brevets, licences, marques, procédés, logiciels </field> + <field name="name">Redevances pour concessions, brevets, licences, marques, procédés, logiciels</field> <field name="code">7511</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4785,7 +4751,7 @@ </record> <record id="pcg_7518" model="account.account.template"> - <field name="name">Autres droits et valeurs similaires</field> + <field name="name">Redevances pour autres droits et valeurs similaires</field> <field name="code">7518</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4841,7 +4807,7 @@ </record> <record id="pcg_7616" model="account.account.template"> - <field name="name">Revenus sur autres formes de participation </field> + <field name="name">Revenus sur autres formes de participation</field> <field name="code">7616</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4875,7 +4841,7 @@ </record> <record id="pcg_7631" model="account.account.template"> - <field name="name">Revenus des créances commerciales </field> + <field name="name">Revenus des créances commerciales</field> <field name="code">7631</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4925,35 +4891,35 @@ </record> <record id="pcg_7711" model="account.account.template"> - <field name="name">Dédits et pénalités perçus sur achats et sur ventes</field> + <field name="name">Produits exceptionnels - Dédits et pénalités perçus sur achats et sur ventes</field> <field name="code">7711</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7713" model="account.account.template"> - <field name="name">Libéralités reçues</field> + <field name="name">Produits exceptionnels - Libéralités reçues</field> <field name="code">7713</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7714" model="account.account.template"> - <field name="name">Rentrées sur créances amorties</field> + <field name="name">Produits exceptionnels - Rentrées sur créances amorties</field> <field name="code">7714</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7715" model="account.account.template"> - <field name="name">Subventions d'équilibre</field> + <field name="name">Produits exceptionnels - Subventions d'équilibre</field> <field name="code">7715</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7717" model="account.account.template"> - <field name="name">Dégrèvements d'impôts autres qu'impôts sur les bénéfices</field> + <field name="name">Produits exceptionnels - Dégrèvements d'impôts autres qu'impôts sur les bénéfices</field> <field name="code">7717</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -4967,63 +4933,63 @@ </record> <record id="pcg_772" model="account.account.template"> - <field name="name">Produits sur exercices antérieurs (en cours d'exercice seulement)</field> + <field name="name">Produits exceptionnels sur exercices antérieurs (en cours d'exercice seulement)</field> <field name="code">772</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7751" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Produits exceptionnels des cessions d'éléments d'actif - Immobilisations incorporelles</field> <field name="code">7751</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7752" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Produits exceptionnels des cessions d'éléments d'actif - Immobilisations corporelles</field> <field name="code">7752</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7756" model="account.account.template"> - <field name="name">Immobilisations financières</field> + <field name="name">Produits exceptionnels des cessions d'éléments d'actif - Immobilisations financières</field> <field name="code">7756</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7758" model="account.account.template"> - <field name="name">Autres éléments d'actif</field> + <field name="name">Produits exceptionnels des cessions d'éléments d'actif - Autres éléments d'actif</field> <field name="code">7758</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_777" model="account.account.template"> - <field name="name">Quote-part des subventions d'investissement virée au résultat de l'exercice</field> + <field name="name">Produits exceptionnels - Quote-part des subventions d'investissement virée au résultat de l'exercice</field> <field name="code">777</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7781" model="account.account.template"> - <field name="name">Bonis provenant de clauses d'indexation </field> + <field name="name">Produits exceptionnels - Bonis provenant de clauses d'indexation</field> <field name="code">7781</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7782" model="account.account.template"> - <field name="name">Lots</field> + <field name="name">Produits exceptionnels - Lots</field> <field name="code">7782</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7783" model="account.account.template"> - <field name="name">Bonis provenant du rachat par l'entreprise d'actions et d'obligations émises par elle-même</field> + <field name="name">Produits exceptionnels - Bonis provenant du rachat par l'entreprise d'actions et d'obligations émises par elle-même</field> <field name="code">7783</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -5037,14 +5003,14 @@ </record> <record id="pcg_78111" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Reprises sur amortissements des immobilisations incorporelles</field> <field name="code">78111</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78112" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Reprises sur amortissements des immobilisations corporelles</field> <field name="code">78112</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -5058,84 +5024,84 @@ </record> <record id="pcg_78161" model="account.account.template"> - <field name="name">Immobilisations incorporelles</field> + <field name="name">Reprises sur dépréciations des immobilisations incorporelles</field> <field name="code">78161</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78162" model="account.account.template"> - <field name="name">Immobilisations corporelles</field> + <field name="name">Reprises sur dépréciations des immobilisations corporelles</field> <field name="code">78162</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78173" model="account.account.template"> - <field name="name">Stocks et en-cours</field> + <field name="name">Reprises sur dépréciations des actifs circulants - Stocks et en-cours</field> <field name="code">78173</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78174" model="account.account.template"> - <field name="name">Créances</field> + <field name="name">Reprises sur dépréciations des actifs circulants - Créances</field> <field name="code">78174</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7865" model="account.account.template"> - <field name="name">Reprises sur provisions financiers</field> + <field name="name">Reprises sur provisions financières</field> <field name="code">7865</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78662" model="account.account.template"> - <field name="name">Immobilisations financières</field> + <field name="name">Reprises sur dépréciations des immobilisations financières</field> <field name="code">78662</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78665" model="account.account.template"> - <field name="name">Valeurs mobilières de placement</field> + <field name="name">Reprises sur dépréciations des valeurs mobilières de placement</field> <field name="code">78665</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78725" model="account.account.template"> - <field name="name">Amortissements dérogatoires</field> + <field name="name">Reprises sur provisions réglementées (immobilisations) - Amortissements dérogatoires</field> <field name="code">78725</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78726" model="account.account.template"> - <field name="name">Provision spéciale de réévaluation</field> + <field name="name">Reprises sur provisions réglementées (immobilisations) - Provision spéciale de réévaluation</field> <field name="code">78726</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_78727" model="account.account.template"> - <field name="name">Plus-values réinvesties</field> + <field name="name">Reprises sur provisions réglementées (immobilisations) - Plus-values réinvesties</field> <field name="code">78727</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7873" model="account.account.template"> - <field name="name">Reprises sur provisions réglementées (stocks) </field> + <field name="name">Reprises sur provisions réglementées (stocks)</field> <field name="code">7873</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> </record> <record id="pcg_7874" model="account.account.template"> - <field name="name">Reprises sur autres provisions réglementées </field> + <field name="name">Reprises sur autres provisions réglementées</field> <field name="code">7874</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> @@ -5149,7 +5115,7 @@ </record> <record id="pcg_7876" model="account.account.template"> - <field name="name">Reprises pour dépréciations exceptionnelles</field> + <field name="name">Reprises sur dépréciations exceptionnelles</field> <field name="code">7876</field> <field name="user_type_id" ref="account.data_account_type_revenue"/> <field name="chart_template_id" ref="l10n_fr_pcg_chart_template"/> diff --git a/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.py b/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.py index f6b458ebd4f..16e17b2fbba 100644 --- a/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.py +++ b/addons/l10n_in_hr_payroll/report/report_hr_salary_employee_bymonth.py @@ -4,6 +4,7 @@ from datetime import date from odoo import api, models +from odoo.exceptions import UserError class ReportHrSalaryEmployeeBymonth(models.AbstractModel): @@ -93,6 +94,9 @@ class ReportHrSalaryEmployeeBymonth(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + model = self.env.context.get('active_model') docs = self.env[model].browse(self.env.context.get('active_id')) get_periods, months, total_mnths = self.get_periods(data['form']) diff --git a/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py b/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py index 0464f8249ed..38cee62d220 100644 --- a/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py +++ b/addons/l10n_in_hr_payroll/report/report_hr_yearly_salary_detail.py @@ -4,6 +4,7 @@ from datetime import date from odoo import api, models +from odoo.exceptions import UserError from odoo.tools import pycompat @@ -128,6 +129,9 @@ class EmployeesYearlySalaryReport(models.AbstractModel): @api.model def get_report_values(self, docids, data=None): + if not self.env.context.get('active_model') or not self.env.context.get('active_id'): + raise UserError(_("Some data are missing, this report cannot be printed.")) + model = self.env.context.get('active_model') docs = self.env[model].browse(self.env.context.get('active_id')) return { diff --git a/addons/lunch/models/lunch.py b/addons/lunch/models/lunch.py index f4e5b16430b..ee8bba3492e 100644 --- a/addons/lunch/models/lunch.py +++ b/addons/lunch/models/lunch.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from operator import itemgetter +from collections import OrderedDict import json import datetime @@ -94,9 +94,9 @@ class LunchOrder(models.Model): })) if self.previous_order_ids: - lunch_data = [] + lunch_data = {} for line in self.previous_order_ids: - lunch_data.append({ + lunch_data[line.id] = { 'line_id': line.id, 'product_id': line.product_id.id, 'product_name': line.product_id.name, @@ -105,8 +105,9 @@ class LunchOrder(models.Model): 'price': line.price, 'date': line.date, 'currency_id': line.currency_id.id, - }) - lunch_data.sort(key=itemgetter('date', 'line_id'), reverse=True) + } + # sort the old lunch orders by (date, id) + lunch_data = OrderedDict(sorted(lunch_data.items(), key=lambda t: (t[1]['date'], t[0]), reverse=True)) self.previous_order_widget = json.dumps(lunch_data) @api.one diff --git a/addons/mail/models/mail_tracking_value.py b/addons/mail/models/mail_tracking_value.py index da38a678d06..5fbe63d6a14 100644 --- a/addons/mail/models/mail_tracking_value.py +++ b/addons/mail/models/mail_tracking_value.py @@ -75,8 +75,14 @@ class MailTracking(models.Model): assert type in ('new', 'old') result = [] for record in self: - if record.field_type in ['integer', 'float', 'char', 'text', 'datetime', 'monetary']: + if record.field_type in ['integer', 'float', 'char', 'text', 'monetary']: result.append(getattr(record, '%s_value_%s' % (type, record.field_type))) + elif record.field_type == 'datetime': + if record['%s_value_datetime' % type]: + new_datetime = getattr(record, '%s_value_datetime' % type) + result.append('%sZ' % new_datetime) + else: + result.append(record['%s_value_datetime' % type]) elif record.field_type == 'date': if record['%s_value_datetime' % type]: new_date = datetime.strptime(record['%s_value_datetime' % type], tools.DEFAULT_SERVER_DATETIME_FORMAT).date() diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index 3181f940e6e..f7aaf73637e 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -217,14 +217,22 @@ function make_message (data) { // can not be done in preprocess, since it alter the original value if (msg.tracking_value_ids && msg.tracking_value_ids.length) { _.each(msg.tracking_value_ids, function(f) { - if (_.contains(['date', 'datetime'], f.field_type)) { - var format = (f.field_type === 'date') ? 'LL' : 'LLL'; + if (f.field_type === 'datetime') { + var format = 'LLL'; if (f.old_value) { f.old_value = moment.utc(f.old_value).local().format(format); } if (f.new_value) { f.new_value = moment.utc(f.new_value).local().format(format); } + } else if (f.field_type === 'date') { + var format = 'LL'; + if (f.old_value) { + f.old_value = moment(f.old_value).local().format(format); + } + if (f.new_value) { + f.new_value = moment(f.new_value).local().format(format); + } } }); } diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 3eca7fe9dff..37d40718516 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -312,7 +312,7 @@ class MassMailing(models.Model): create_date = fields.Datetime(string='Creation Date') sent_date = fields.Datetime(string='Sent Date', oldname='date', copy=False) schedule_date = fields.Datetime(string='Schedule in the Future') - body_html = fields.Html(string='Body', translate=html_translate, sanitize_attributes=False) + body_html = fields.Html(string='Body', sanitize_attributes=False) attachment_ids = fields.Many2many('ir.attachment', 'mass_mailing_ir_attachments_rel', 'mass_mailing_id', 'attachment_id', string='Attachments') keep_archives = fields.Boolean(string='Keep Archives') diff --git a/addons/mass_mailing/static/src/js/mass_mailing.js b/addons/mass_mailing/static/src/js/mass_mailing.js index f01d4aff8d2..75a52a940f1 100644 --- a/addons/mass_mailing/static/src/js/mass_mailing.js +++ b/addons/mass_mailing/static/src/js/mass_mailing.js @@ -32,17 +32,13 @@ KanbanColumn.include({ }); FieldTextHtml.include({ - get_datarecord: function () { + getDatarecord: function () { /* Avoid extremely long URIs by whitelisting fields in the datarecord that get set as a get parameter */ var datarecord = this._super(); - if (this.view.model === 'mail.mass_mailing') { + if (this.model === 'mail.mass_mailing') { // these fields can potentially get very long, let's remove them - var blacklist = ['mailing_domain', 'contact_list_ids']; - for (var k in blacklist) { - delete datarecord[blacklist[k]]; - } - delete datarecord[this.name]; + datarecord = _.omit(datarecord, ['mailing_domain', 'contact_list_ids', 'body_html']); } return datarecord; }, diff --git a/addons/mass_mailing/static/src/js/mass_mailing_editor.js b/addons/mass_mailing/static/src/js/mass_mailing_editor.js index 5d475808589..593ed6140cd 100644 --- a/addons/mass_mailing/static/src/js/mass_mailing_editor.js +++ b/addons/mass_mailing/static/src/js/mass_mailing_editor.js @@ -170,6 +170,7 @@ snippets_editor.Class.include({ className: classname || "", img: $theme.data("img") || "", template: $theme.html().trim(), + nowrap: !!$theme.data('nowrap'), get_image_info: function (filename) { if (images_info[filename]) { return images_info[filename]; @@ -331,13 +332,20 @@ snippets_editor.Class.include({ var $old_layout = $editable_area.find(".o_layout"); // This wrapper structure is the only way to have a responsive and // centered fixed-width content column on all mail clients - var $new_wrapper = $('<table/>', {class: 'o_mail_wrapper'}); - var $new_wrapper_content = $("<td/>", {class: 'o_mail_no_resize o_mail_wrapper_td oe_structure'}); - $new_wrapper.append($('<tr/>').append( - $("<td/>", {class: 'o_mail_no_resize'}), - $new_wrapper_content, - $("<td/>", {class: 'o_mail_no_resize'}) - )); + var $new_wrapper, $new_wrapper_content; + + if (theme_params.nowrap) { + $new_wrapper = $new_wrapper_content = $("<div/>", {"class": "oe_structure"}); + } + else { + $new_wrapper = $('<table/>', {class: 'o_mail_wrapper'}); + $new_wrapper_content = $("<td/>", {class: 'o_mail_no_resize o_mail_wrapper_td oe_structure'}); + $new_wrapper.append($('<tr/>').append( + $("<td/>", {class: 'o_mail_no_resize'}), + $new_wrapper_content, + $("<td/>", {class: 'o_mail_no_resize'}) + )); + } var $new_layout = $("<div/>", {"class": "o_layout " + theme_params.className}).append($new_wrapper); var $contents; diff --git a/addons/mrp/models/mrp_bom.py b/addons/mrp/models/mrp_bom.py index e4fef9f58cd..64c1e723f92 100644 --- a/addons/mrp/models/mrp_bom.py +++ b/addons/mrp/models/mrp_bom.py @@ -117,26 +117,48 @@ class MrpBom(models.Model): Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM """ + from collections import defaultdict + + graph = defaultdict(list) + V = set() + + def check_cycle(v, visited, recStack, graph): + visited[v] = True + recStack[v] = True + for neighbour in graph[v]: + if visited[neighbour] == False: + if check_cycle(neighbour, visited, recStack, graph) == True: + return True + elif recStack[neighbour] == True: + return True + recStack[v] = False + return False + boms_done = [(self, {'qty': quantity, 'product': product, 'original_qty': quantity, 'parent_line': False})] lines_done = [] - templates_done = product.product_tmpl_id + V |= set([product.product_tmpl_id.id]) bom_lines = [(bom_line, product, quantity, False) for bom_line in self.bom_line_ids] + for bom_line in self.bom_line_ids: + V |= set([bom_line.product_id.product_tmpl_id.id]) + graph[product.product_tmpl_id.id].append(bom_line.product_id.product_tmpl_id.id) while bom_lines: current_line, current_product, current_qty, parent_line = bom_lines[0] bom_lines = bom_lines[1:] if current_line._skip_bom_line(current_product): continue - if current_line.product_id.product_tmpl_id in templates_done: - raise UserError(_('Recursion error! A product with a Bill of Material should not have itself in its BoM or child BoMs!')) line_quantity = current_qty * current_line.product_qty bom = self._bom_find(product=current_line.product_id, picking_type=picking_type or self.picking_type_id, company_id=self.company_id.id) if bom.type == 'phantom': converted_line_quantity = current_line.product_uom_id._compute_quantity(line_quantity / bom.product_qty, bom.product_uom_id) bom_lines = [(line, current_line.product_id, converted_line_quantity, current_line) for line in bom.bom_line_ids] + bom_lines - templates_done |= current_line.product_id.product_tmpl_id + for bom_line in bom.bom_line_ids: + graph[current_line.product_id.product_tmpl_id.id].append(bom_line.product_id.product_tmpl_id.id) + if bom_line.product_id.product_tmpl_id.id in V and check_cycle(bom_line.product_id.product_tmpl_id.id, {key: False for key in V}, {key: False for key in V}, graph): + raise UserError(_('Recursion error! A product with a Bill of Material should not have itself in its BoM or child BoMs!')) + V |= set([bom_line.product_id.product_tmpl_id.id]) boms_done.append((bom, {'qty': converted_line_quantity, 'product': current_product, 'original_qty': quantity, 'parent_line': current_line})) else: # We round up here because the user expects that if he has to consume a little more, the whole UOM unit diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 4f728d48698..1f59087a2c2 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -208,11 +208,8 @@ class MrpProduction(models.Model): @api.depends('move_raw_ids.quantity_done', 'move_finished_ids.quantity_done') def _compute_post_visible(self): for order in self: - if order.product_tmpl_id._is_cost_method_standard(): - order.post_visible = any((x.quantity_done > 0 and x.state not in ['done', 'cancel']) for x in order.move_raw_ids) or \ - any((x.quantity_done > 0 and x.state not in ['done' 'cancel']) for x in order.move_finished_ids) - else: - order.post_visible = any((x.quantity_done > 0 and x.state not in ['done' 'cancel']) for x in order.move_finished_ids) + order.post_visible = any(order.move_raw_ids.filtered(lambda x: (x.quantity_done) > 0 and (x.state not in ['done', 'cancel']))) or \ + any(order.move_finished_ids.filtered(lambda x: (x.quantity_done) > 0 and (x.state not in ['done', 'cancel']))) @api.multi @api.depends('workorder_ids.state', 'move_finished_ids') @@ -269,7 +266,10 @@ class MrpProduction(models.Model): @api.model def create(self, values): if not values.get('name', False) or values['name'] == _('New'): - values['name'] = self.env['ir.sequence'].next_by_code('mrp.production') or _('New') + if values.get('picking_type_id'): + values['name'] = self.env['stock.picking.type'].browse(values['picking_type_id']).sequence_id.next_by_id() + else: + values['name'] = self.env['ir.sequence'].next_by_code('mrp.production') or _('New') if not values.get('procurement_group_id'): values['procurement_group_id'] = self.env["procurement.group"].create({'name': values['name']}).id production = super(MrpProduction, self).create(values) diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index f0c7d4e4405..24bc802ec7b 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -391,9 +391,12 @@ class MrpWorkorder(models.Model): domain = [('workorder_id', 'in', self.ids), ('date_end', '=', False)] if not doall: domain.append(('user_id', '=', self.env.user.id)) + not_productive_timelines = timeline_obj.browse() for timeline in timeline_obj.search(domain, limit=None if doall else 1): wo = timeline.workorder_id - if timeline.loss_type != 'productive': + if wo.duration_expected <= wo.duration: + if timeline.loss_type == 'productive': + not_productive_timelines += timeline timeline.write({'date_end': fields.Datetime.now()}) else: maxdate = fields.Datetime.from_string(timeline.date_start) + relativedelta(minutes=wo.duration_expected - wo.duration) @@ -402,10 +405,12 @@ class MrpWorkorder(models.Model): timeline.write({'date_end': enddate}) else: timeline.write({'date_end': maxdate}) - loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type', '=', 'performance')], limit=1) - if not len(loss_id): - raise UserError(_("You need to define at least one unactive productivity loss in the category 'Performance'. Create one from the Manufacturing app, menu: Configuration / Productivity Losses.")) - timeline.copy({'date_start': maxdate, 'date_end': enddate, 'loss_id': loss_id.id}) + not_productive_timelines += timeline.copy({'date_start': maxdate, 'date_end': enddate}) + if not_productive_timelines: + loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type', '=', 'performance')], limit=1) + if not len(loss_id): + raise UserError(_("You need to define at least one unactive productivity loss in the category 'Performance'. Create one from the Manufacturing app, menu: Configuration / Productivity Losses.")) + not_productive_timelines.write({'loss_id': loss_id.id}) return True @api.multi diff --git a/addons/mrp/tests/test_bom.py b/addons/mrp/tests/test_bom.py index 4d54f23df0a..71421216411 100644 --- a/addons/mrp/tests/test_bom.py +++ b/addons/mrp/tests/test_bom.py @@ -131,7 +131,30 @@ class TestBoM(TestMrpCommon): self.assertEqual(set((test_bom_2 | self.bom_2).ids), set([b[0].id for b in boms])) self.assertEqual(set((test_bom_2_l1 | test_bom_2_l4 | self.bom_2.bom_line_ids).ids), set([l[0].id for l in lines])) - # check recursion - test_bom_2_l3.write({'attribute_value_ids': [(6, 0, [self.prod_attr1_v1.id])]}) + #check recursion + test_bom_3 = self.env['mrp.bom'].create({ + 'product_id': self.product_9.id, + 'product_tmpl_id': self.product_9.product_tmpl_id.id, + 'product_uom_id': self.product_9.uom_id.id, + 'product_qty': 1.0, + 'type': 'normal' + }) + test_bom_4 = self.env['mrp.bom'].create({ + 'product_id': self.product_10.id, + 'product_tmpl_id': self.product_10.product_tmpl_id.id, + 'product_uom_id': self.product_10.uom_id.id, + 'product_qty': 1.0, + 'type': 'phantom' + }) + test_bom_3_l1 = self.env['mrp.bom.line'].create({ + 'bom_id': test_bom_3.id, + 'product_id': self.product_10.id, + 'product_qty': 1.0, + }) + test_bom_4_l1 = self.env['mrp.bom.line'].create({ + 'bom_id': test_bom_4.id, + 'product_id': self.product_9.id, + 'product_qty': 1.0, + }) with self.assertRaises(exceptions.UserError): - test_bom_2.explode(self.product_7_1, 4) + test_bom_3.explode(self.product_9, 1) diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml index e9b6935b9ec..25a9d56abed 100644 --- a/addons/mrp/views/mrp_production_views.xml +++ b/addons/mrp/views/mrp_production_views.xml @@ -48,7 +48,7 @@ <button name="button_plan" attrs="{'invisible': ['|', ('state', '!=', 'confirmed'), ('routing_id', '=', False)]}" type="object" string="Create Workorders" class="oe_highlight"/> <button name="open_produce_product" attrs="{'invisible': ['|', '|', '|', ('check_to_done', '=', True), ('availability', 'not in', ['partially_available', 'assigned']), ('state', 'not in', ('confirmed','progress')), ('routing_id', '!=', False)]}" string="Produce" type="object" class="oe_highlight"/> <button name="open_produce_product" attrs="{'invisible': ['|', '|', '|', ('check_to_done', '=', True), ('availability', '!=', 'waiting'), ('state', 'not in', ('confirmed','progress')), ('routing_id', '!=', False)]}" string="Produce" type="object"/> - <button name="post_inventory" string="Post Inventory" type="object" attrs="{'invisible': [('post_visible', '=', False)]}"/> + <button name="post_inventory" string="Post Inventory" type="object" attrs="{'invisible': [('post_visible', '=', False)]}" groups="base.group_no_one"/> <button name="action_cancel" type="object" string="Cancel" attrs="{'invisible': ['|', ('state', 'in', ('done','cancel')), ('check_to_done', '=', True)]}"/> <button name="button_scrap" type="object" string="Scrap" attrs="{'invisible': ['|', ('availability', '=', 'none'), ('state', 'in', ('cancel'))]}"/> <button name="button_unreserve" type="object" string="Unreserve" attrs="{'invisible': [('unreserve_visible', '=', False)]}"/> diff --git a/addons/mrp/views/mrp_workorder_views.xml b/addons/mrp/views/mrp_workorder_views.xml index 514cbecc51e..86337299a11 100644 --- a/addons/mrp/views/mrp_workorder_views.xml +++ b/addons/mrp/views/mrp_workorder_views.xml @@ -150,7 +150,7 @@ <tree editable="bottom" create="0" delete="0"> <field name="product_id"/> <field name="quantity" readonly="1"/> - <field name="lot_id" context="{'default_product_id': product_id}"/> + <field name="lot_id" domain="[('product_id', '=', product_id)]" context="{'default_product_id': product_id}"/> <field name="quantity_done"/> <field name="move_id" invisible="1"/> <field name="done_wo" invisible="1"/> diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js index 76f6ad9b9ae..9637072274e 100644 --- a/addons/pad/static/src/js/pad.js +++ b/addons/pad/static/src/js/pad.js @@ -13,7 +13,6 @@ var FieldPad = AbstractField.extend({ events: { 'click .oe_pad_switch': '_onToggleFullScreen', }, - supportedFieldTypes: ['char'], /** * @override diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index bbb054a7a0b..2f3fc969458 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -527,7 +527,9 @@ class PaymentTransaction(models.Model): tx.write({'reference': str(tx.id)}) # Generate callback hash if it is configured on the tx; avoid generating unnecessary stuff - if tx.callback_model_id and tx.callback_res_id and tx.sudo().callback_method: + # (limited sudo env for checking callback presence, must work for manual transactions too) + tx_sudo = tx.sudo() + if tx_sudo.callback_model_id and tx_sudo.callback_res_id and tx_sudo.callback_method: tx.write({'callback_hash': tx._generate_callback_hash()}) return tx @@ -657,7 +659,13 @@ class PaymentTransaction(models.Model): @api.multi def execute_callback(self): res = None - for transaction in self.filtered(lambda tx: tx.callback_model_id and tx.callback_res_id and tx.sudo().callback_method): + for transaction in self: + # limited sudo env, only for checking callback presence, not for running it! + # manual transactions have no callback, and can pass without being run by admin user + tx_sudo = transaction.sudo() + if not (tx_sudo.callback_model_id and tx_sudo.callback_res_id and tx_sudo.callback_method): + continue + valid_token = transaction._generate_callback_hash() if not consteq(ustr(valid_token), transaction.callback_hash): _logger.warning("Invalid callback signature for transaction %d" % (transaction.id)) @@ -665,7 +673,7 @@ class PaymentTransaction(models.Model): record = self.env[transaction.callback_model_id.model].browse(transaction.callback_res_id).exists() if record: - res = getattr(record, transaction.sudo().callback_method)(transaction) + res = getattr(record, transaction.callback_method)(transaction) else: _logger.warning("Did not found record %s.%s for callback of transaction %d" % (transaction.callback_model_id.model, transaction.callback_res_id, transaction.id)) return res diff --git a/addons/payment_authorize/models/authorize_request.py b/addons/payment_authorize/models/authorize_request.py index f312add67b3..37998ab6c1d 100644 --- a/addons/payment_authorize/models/authorize_request.py +++ b/addons/payment_authorize/models/authorize_request.py @@ -5,7 +5,9 @@ from StringIO import StringIO from xml.etree import ElementTree as ET from uuid import uuid4 +from odoo import _ from odoo.exceptions import ValidationError, UserError +from odoo import _ XMLNS = 'AnetApi/xml/v1/schema/AnetApiSchema.xsd' diff --git a/addons/payment_authorize/models/payment.py b/addons/payment_authorize/models/payment.py index 24d57cb0db7..dfa181b2e81 100644 --- a/addons/payment_authorize/models/payment.py +++ b/addons/payment_authorize/models/payment.py @@ -8,7 +8,7 @@ import hmac import logging import time -from odoo import api, fields, models +from odoo import _, api, fields, models from odoo.addons.payment.models.payment_acquirer import ValidationError from odoo.addons.payment_authorize.controllers.main import AuthorizeController from odoo.tools.float_utils import float_compare diff --git a/addons/phone_validation/models/phone_validation_mixin.py b/addons/phone_validation/models/phone_validation_mixin.py index 8391e89cea3..6f8b3e18902 100644 --- a/addons/phone_validation/models/phone_validation_mixin.py +++ b/addons/phone_validation/models/phone_validation_mixin.py @@ -8,10 +8,10 @@ from odoo.addons.phone_validation.tools import phone_validation class PhoneValidationMixin(models.AbstractModel): _name = 'phone.validation.mixin' - def _phone_get_country_code(self): + def _phone_get_country(self): if 'country_id' in self: - return self.country_id.code - return self.env.user.company_id.country_id.code + return self.country_id + return self.env.user.company_id.country_id def _phone_get_always_international(self): if 'company_id' in self: @@ -19,11 +19,12 @@ class PhoneValidationMixin(models.AbstractModel): return self.env.user.company_id.phone_international_format def phone_format(self, number, country=None, company=None): - country_code = country.code if country else self._phone_get_country_code() + country = country or self._phone_get_country() always_international = company.phone_international_format if company else self._phone_get_always_international() - return phone_validation.phone_format( - number, country_code if country_code else None, + number, + country.code if country else None, + country.phone_code if country else None, always_international=always_international, raise_exception=True ) diff --git a/addons/phone_validation/models/res_company.py b/addons/phone_validation/models/res_company.py index 40dab76d7a7..aa1b92d89e1 100644 --- a/addons/phone_validation/models/res_company.py +++ b/addons/phone_validation/models/res_company.py @@ -9,7 +9,7 @@ class ResCompany(models.Model): phone_international_format = fields.Boolean( string="Enforce International Format", default=False, - help="Always encore phone numbers using international format. Otherwise" + help="Always encode phone numbers using international format. Otherwise" "numbers coming from the company's country are nationaly formatted." "International numbers are always using international format." ) diff --git a/addons/phone_validation/tools/phone_validation.py b/addons/phone_validation/tools/phone_validation.py index 92b12cea1e0..e59af32f0e6 100644 --- a/addons/phone_validation/tools/phone_validation.py +++ b/addons/phone_validation/tools/phone_validation.py @@ -26,7 +26,15 @@ try: return phone_nbr - def phone_format(number, country_code, always_international=True, raise_exception=True): + def phone_format(number, country_code, country_phone_code, always_international=True, raise_exception=True): + """ Format the given phone number according to the localisation and international options. + :param number: number to convert + :param country_code: the ISO country code in two chars + :type country_code: str + :param country_phone_code: country dial in codes, defined by the ITU-T (Ex: 32 for Belgium) + :type country_phone_code: int + :rtype: str + """ try: phone_nbr = phone_parse(number, country_code) except (phonenumbers.phonenumberutil.NumberParseException, UserError) as e: @@ -35,8 +43,7 @@ try: else: _logger.warning(_('Unable to format %s:\n%s') % number, e) return number - - if always_international and phone_nbr.country_code != country_code: + if always_international and phone_nbr.country_code != country_phone_code: phone_fmt = phonenumbers.PhoneNumberFormat.INTERNATIONAL else: phone_fmt = phonenumbers.PhoneNumberFormat.NATIONAL @@ -48,7 +55,7 @@ except ImportError: def phone_parse(number, country_code): return False - def phone_format(number, country_code, always_international=True, raise_exception=True): + def phone_format(number, country_code, country_phone_code, always_international=True, raise_exception=True): global _phonenumbers_lib_warning if not _phonenumbers_lib_warning: _logger.warning( diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index be84adb3464..ec73843481a 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -886,7 +886,8 @@ class PosOrderLine(models.Model): fiscal_position_id = line.order_id.fiscal_position_id if fiscal_position_id: taxes = fiscal_position_id.map_tax(taxes, line.product_id, line.order_id.partner_id) - price = line.price_unit * (1 - (line.discount or 0.0) / 100.0) + price = self.env['account.tax']._fix_tax_included_price( + line.price_unit * (1 - (line.discount or 0.0) / 100.0), line.product_id.taxes_id, taxes) line.price_subtotal = line.price_subtotal_incl = price * line.qty if taxes: taxes = taxes.compute_all(price, currency, line.qty, product=line.product_id, partner=line.order_id.partner_id or False) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index d3619c5b889..c0e51260ea9 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -2352,7 +2352,6 @@ td { } .pos .popup-password .popup-input { width: 70%; - -webkit-text-security: disc; } .pos .popup .body ul, diff --git a/addons/point_of_sale/static/src/js/field_text_html.js b/addons/point_of_sale/static/src/js/field_text_html.js new file mode 100644 index 00000000000..27b378801c9 --- /dev/null +++ b/addons/point_of_sale/static/src/js/field_text_html.js @@ -0,0 +1,20 @@ +odoo.define('point_of_sale.fieldtexthtml', function (require) { + 'use strict'; + + var FieldTextHtml = require('web_editor.backend').FieldTextHtml; + + FieldTextHtml.include({ + // avoid '414 Request-URI Too Large' errors to + // /point_of_sale/field/customer_facing_display_template by + // filtering out biggest fields + getDatarecord: function () { + var datarecord = this._super(); + if (this.model === 'pos.config') { + datarecord = _.omit(datarecord, function (val, key) { + return _.isObject(val) || key === 'customer_facing_display_html'; + }); + } + return datarecord; + }, + }); +}); diff --git a/addons/point_of_sale/static/src/js/popups.js b/addons/point_of_sale/static/src/js/popups.js index 71b46c6e5af..a1ce0315cf8 100644 --- a/addons/point_of_sale/static/src/js/popups.js +++ b/addons/point_of_sale/static/src/js/popups.js @@ -308,6 +308,11 @@ var PasswordPopupWidget = NumberPopupWidget.extend({ this._super(); this.$('.popup').addClass('popup-password'); }, + click_numpad: function(event){ + this._super.apply(this, arguments); + var $value = this.$('.value'); + $value.text($value.text().replace(/./g, '•')); + }, }); gui.define_popup({name:'password', widget: PasswordPopupWidget}); diff --git a/addons/point_of_sale/tests/test_point_of_sale_flow.py b/addons/point_of_sale/tests/test_point_of_sale_flow.py index 26a13bf2f5f..ac9831e343d 100644 --- a/addons/point_of_sale/tests/test_point_of_sale_flow.py +++ b/addons/point_of_sale/tests/test_point_of_sale_flow.py @@ -179,22 +179,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': 2.0, + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0002", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': 3.0, + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (2*450 + 3*300 = 1800) context_make_payment = { "active_ids": [self.pos_order_pos1.id], "active_id": self.pos_order_pos1.id } self.pos_make_payment_2 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': 1800 + 'amount': 1845 }) # I click on the validate button to register the payment. @@ -241,22 +242,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': (-2.0), + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0004", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': (-3.0), + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (-2*450 + -3*300 = -1800) context_make_payment = { "active_ids": [self.pos_order_pos2.id], "active_id": self.pos_order_pos2.id } self.pos_make_payment_3 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': (-1800) + 'amount': (-1845) }) # I click on the validate button to register the payment. @@ -303,22 +305,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': (-2.0), + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0006", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': 3.0, + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (-2*450 + 3*300 = 0) context_make_payment = { "active_ids": [self.pos_order_pos3.id], "active_id": self.pos_order_pos3.id } self.pos_make_payment_4 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': 0 + 'amount': 45, }) # I click on the validate button to register the payment. diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml index 79a214758d7..110b3fd03d2 100644 --- a/addons/point_of_sale/views/pos_templates.xml +++ b/addons/point_of_sale/views/pos_templates.xml @@ -72,6 +72,12 @@ </script> </template> +<template id="pos_editor_fieldtexthtml_assets" inherit_id="web.assets_backend"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/point_of_sale/static/src/js/field_text_html.js"/> + </xpath> +</template> + <template id="pos_editor_assets" inherit_id="web_editor.assets_editor"> <xpath expr="//script[last()]" position="after"> <script type="text/javascript" src="/point_of_sale/static/src/js/pos.web_editor.js"/> diff --git a/addons/product/models/product.py b/addons/product/models/product.py index dd7f147703c..0130b159d61 100644 --- a/addons/product/models/product.py +++ b/addons/product/models/product.py @@ -57,6 +57,10 @@ class ProductCategory(models.Model): raise ValidationError(_('Error ! You cannot create recursive categories.')) return True + @api.model + def name_create(self, name): + return self.create({'name': name}).name_get()[0] + class ProductPriceHistory(models.Model): """ Keep track of the ``product.template`` standard prices as they are changed. """ diff --git a/addons/product/tests/common.py b/addons/product/tests/common.py index 007caf4d6bd..e48e4da9486 100644 --- a/addons/product/tests/common.py +++ b/addons/product/tests/common.py @@ -90,3 +90,13 @@ class TestProductCommon(common.SavepointCase): 'name': 'House', 'uom_id': cls.uom_unit.id, 'uom_po_id': cls.uom_unit.id}) + + cls.product_9 = Product.create({ + 'name': 'Paper', + 'uom_id': cls.uom_unit.id, + 'uom_po_id': cls.uom_unit.id}) + + cls.product_10 = Product.create({ + 'name': 'Stone', + 'uom_id': cls.uom_unit.id, + 'uom_po_id': cls.uom_unit.id}) diff --git a/addons/project_timesheet_holidays/models/hr_holidays.py b/addons/project_timesheet_holidays/models/hr_holidays.py index 2717a4eab59..a2d2457f573 100644 --- a/addons/project_timesheet_holidays/models/hr_holidays.py +++ b/addons/project_timesheet_holidays/models/hr_holidays.py @@ -61,5 +61,6 @@ class Holidays(models.Model): def action_refuse(self): """ Remove the timesheets linked to the refused holidays """ result = super(Holidays, self).action_refuse() + self.mapped('timesheet_ids').write({'holiday_id': False}) self.mapped('timesheet_ids').unlink() return result diff --git a/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py b/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py index f49cf00ed14..f98817fdeec 100644 --- a/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py +++ b/addons/project_timesheet_holidays/tests/test_timesheet_holidays.py @@ -72,6 +72,10 @@ class TestTimesheetHolidays(TestTimesheet): holiday.sudo().action_validate() self.assertEquals(len(holiday.timesheet_ids), number_of_days, 'Number of generated timesheets should be the same as the leave duration (1 per day)') + # manager refuse the leave + holiday.sudo().action_refuse() + self.assertEquals(len(holiday.timesheet_ids), 0, 'Number of linked timesheets should be zero, since the leave is refused.') + def test_validate_without_timesheet(self): # employee creates a leave request number_of_days = (self.leave_end_datetime - self.leave_start_datetime).days diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 85c70c5309c..a9707340a24 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -143,7 +143,7 @@ class PurchaseOrder(models.Model): picking_ids = fields.Many2many('stock.picking', compute='_compute_picking', string='Receptions', copy=False, store=True) # There is no inverse function on purpose since the date may be different on each line - date_planned = fields.Datetime(string='Scheduled Date', compute='_compute_date_planned', store=True, index=True, oldname='minimum_planned_date') + date_planned = fields.Datetime(string='Scheduled Date', compute='_compute_date_planned', store=True, index=True) amount_untaxed = fields.Monetary(string='Untaxed Amount', store=True, readonly=True, compute='_amount_all', track_visibility='always') amount_tax = fields.Monetary(string='Taxes', store=True, readonly=True, compute='_amount_all') @@ -670,7 +670,7 @@ class PurchaseOrderLine(models.Model): } # Fullfill all related procurements with this po line diff_quantity = self.product_qty - qty - for procurement in self.procurement_ids: + for procurement in self.procurement_ids.filtered(lambda p: p.state != 'cancel'): # If the procurement has some moves already, we should deduct their quantity sum_existing_moves = sum(x.product_qty for x in procurement.move_ids if x.state != 'cancel') existing_proc_qty = procurement.product_id.uom_id._compute_quantity(sum_existing_moves, procurement.product_uom) diff --git a/addons/purchase_requisition/models/purchase_requisition.py b/addons/purchase_requisition/models/purchase_requisition.py index 49af47b0b18..7ad5fc29bed 100644 --- a/addons/purchase_requisition/models/purchase_requisition.py +++ b/addons/purchase_requisition/models/purchase_requisition.py @@ -33,7 +33,14 @@ class PurchaseRequisition(models.Model): _order = "id desc" def _get_picking_in(self): - return self.env.ref('stock.picking_type_in') + pick_in = self.env.ref('stock.picking_type_in') + if not pick_in: + company = self.env['res.company']._company_default_get('purchase.requisition') + pick_in = self.env['stock.picking.type'].search( + [('warehouse_id.company_id', '=', company.id), ('code', '=', 'incoming')], + limit=1, + ) + return pick_in def _get_type_id(self): return self.env['purchase.requisition.type'].search([], limit=1) diff --git a/addons/rating/controllers/main.py b/addons/rating/controllers/main.py index 48278b735a1..c167a980e72 100644 --- a/addons/rating/controllers/main.py +++ b/addons/rating/controllers/main.py @@ -35,9 +35,6 @@ class Rating(http.Controller): return request.not_found() record_sudo = request.env[rating.res_model].sudo().browse(rating.res_id) record_sudo.rating_apply(rate, token=token, feedback=kwargs.get('feedback')) - # redirect to the form view if logged person - if request.session.uid: - return werkzeug.utils.redirect('/web#model=%s&id=%s&view_type=form' % (record_sudo._name, record_sudo.id)) lang = rating.partner_id.lang or 'en_US' return request.env['ir.ui.view'].with_context(lang=lang).render_template('rating.rating_external_page_view', { 'web_base_url': request.env['ir.config_parameter'].sudo().get_param('web.base.url'), diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py index 7e25430905c..617d6f9b79e 100644 --- a/addons/resource/tests/test_resource.py +++ b/addons/resource/tests/test_resource.py @@ -307,6 +307,35 @@ class ResourceWorkingHours(TestResourceCommon): to_naive_utc(Datetime.from_string('2013-02-12 09:25:00'), self.env.user)) self.assertEqual(res, to_naive_utc(Datetime.from_string('2013-02-26 11:25:00'), self.env.user)) + def test_calendar_hours_scheduling_timezone_2(self): + # Call schedule_hours for a user in Autralia, Sydney (GMT+10) + # Two cases: + # - start at 2013-02-15 08:00:00 => 2013-02-14 21:00:00 in UTC + # - start at 2013-02-15 11:00:00 => 2013-02-15 00:00:00 in UTC + self.env.user.tz = 'Australia/Sydney' + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 1', + 'dayofweek': '3', + 'hour_from': 8, + 'hour_to': 12, + 'calendar_id': self.calendar.id, + }) + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 2', + 'dayofweek': '3', + 'hour_from': 13, + 'hour_to': 17, + 'calendar_id': self.calendar.id, + }) + hours = 1.0/60.0 + for test_date in ['2013-02-15 08:00:00', '2013-02-15 11:00:00']: + start_dt = Datetime.from_string(test_date) + start_dt_utc = to_naive_utc(start_dt, self.env.user) + res = self.calendar._schedule_hours(hours, start_dt_utc) + self.assertEqual( + [(start_dt_utc, start_dt_utc.replace(minute=1))], res, + 'resource_calendar: wrong schedule_hours computation') + def test_calendar_hours_scheduling_forward_leaves_resource(self): res = self.calendar._schedule_hours( 40, day_dt=Datetime.from_string('2013-02-12 09:00:00'), diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index d1f283062ee..18bc98806fc 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -127,7 +127,7 @@ class SaleOrder(models.Model): ('cancel', 'Cancelled'), ], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft') date_order = fields.Datetime(string='Order Date', required=True, readonly=True, index=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=False, default=fields.Datetime.now) - validity_date = fields.Date(string='Expiration Date', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + validity_date = fields.Date(string='Expiration Date', readonly=True, copy=False, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Manually set the expiration date of your quotation (offer), or it will set the date automatically based on the template if online quotation is installed.") create_date = fields.Datetime(string='Creation Date', readonly=True, index=True, help="Date on which sales order is created.") confirmation_date = fields.Datetime(string='Confirmation Date', readonly=True, index=True, help="Date on which the sales order is confirmed.", oldname="date_confirm") diff --git a/addons/sale_margin/models/sale_order.py b/addons/sale_margin/models/sale_order.py index 94bddf50fb5..b99b49c25b0 100644 --- a/addons/sale_margin/models/sale_order.py +++ b/addons/sale_margin/models/sale_order.py @@ -55,7 +55,7 @@ class SaleOrderLine(models.Model): return super(SaleOrderLine, self).create(vals) - @api.depends('product_id', 'purchase_price', 'product_uom_qty', 'price_unit') + @api.depends('product_id', 'purchase_price', 'product_uom_qty', 'price_unit', 'price_subtotal') def _product_margin(self): for line in self: currency = line.order_id.pricelist_id.currency_id diff --git a/addons/sale_timesheet/views/account_invoice_views.xml b/addons/sale_timesheet/views/account_invoice_views.xml index ab9ee8388f1..20e25720343 100644 --- a/addons/sale_timesheet/views/account_invoice_views.xml +++ b/addons/sale_timesheet/views/account_invoice_views.xml @@ -17,7 +17,7 @@ <field name="arch" type="xml"> <xpath expr="//label" position="before"> <div class="oe_button_box" name="button_box" groups="base.group_user"> - <button name="%(sale_timesheet.action_timesheet_from_invoice)d" type="action" class="oe_stat_button" icon="fa-calendar"> + <button name="%(sale_timesheet.action_timesheet_from_invoice)d" type="action" class="oe_stat_button" icon="fa-calendar" attrs="{'invisible':[('timesheet_count','=', 0)]}"> <field name="timesheet_count" widget="statinfo" string="Timesheets"/> </button> </div> diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index 6e26cf6dc77..54b4a877fd7 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -419,9 +419,6 @@ class ProductTemplate(models.Model): relation="stock.location.route", string="Category Routes", related='categ_id.total_route_ids') - def _is_cost_method_standard(self): - return True - def _compute_quantities(self): res = self._compute_quantities_dict() for template in self: diff --git a/addons/stock/models/stock_pack_operation.py b/addons/stock/models/stock_pack_operation.py index 6e51a573546..5de33d40631 100644 --- a/addons/stock/models/stock_pack_operation.py +++ b/addons/stock/models/stock_pack_operation.py @@ -110,10 +110,11 @@ class PackOperation(models.Model): qty -= record.qty self.remaining_qty = float_round(qty, precision_rounding=self.product_id.uom_id.rounding) - @api.one + @api.multi def _compute_location_description(self): - self.from_loc = '%s%s' % (self.location_id.name, self.product_id and self.package_id.name or '') - self.to_loc = '%s%s' % (self.location_dest_id.name, self.result_package_id.name or '') + for operation, operation_sudo in zip(self, self.sudo()): + operation.from_loc = '%s%s' % (operation_sudo.location_id.name, operation.product_id and operation_sudo.package_id.name or '') + operation.to_loc = '%s%s' % (operation_sudo.location_dest_id.name, operation_sudo.result_package_id.name or '') @api.one def _compute_lots_visible(self): diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 1b3f3d34c90..ce0d7be8121 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -328,11 +328,11 @@ class Picking(models.Model): .filtered(lambda move: move.state not in ['cancel', 'done'])\ .sorted(key=lambda move: (move.state == 'assigned' and 2) or (move.state == 'waiting' and 1) or 0) if self.move_type == 'one': - self.state = moves_todo[0].state + self.state = moves_todo[0].state or 'draft' elif moves_todo[0].state != 'assigned' and any(x.partially_available or x.state == 'assigned' for x in moves_todo): self.state = 'partially_available' else: - self.state = moves_todo[-1].state + self.state = moves_todo[-1].state or 'draft' @api.one @api.depends('move_lines.priority') @@ -610,9 +610,13 @@ class Picking(models.Model): forced_qties[move.product_id] = forced_qty for vals in picking._prepare_pack_ops(picking_quants, forced_qties): vals['fresh_record'] = False - PackOperation.create(vals) + PackOperation |= PackOperation.create(vals) # recompute the remaining quantities all at once self.do_recompute_remaining_quantities() + for pack in PackOperation: + pack.ordered_qty = sum( + pack.mapped('linked_move_operation_ids').mapped('move_id').filtered(lambda r: r.state != 'cancel').mapped('ordered_qty') + ) self.write({'recompute_pack_op': False}) @api.multi @@ -782,6 +786,8 @@ class Picking(models.Model): @api.multi def do_new_transfer(self): for pick in self: + if pick.state == 'done': + raise UserError(_('The pick is already validated')) pack_operations_delete = self.env['stock.pack.operation'] if not pick.move_lines and not pick.pack_operation_ids: raise UserError(_('Please create some Initial Demand or Mark as Todo and create some Operations. ')) diff --git a/addons/stock/tests/test_stock_flow.py b/addons/stock/tests/test_stock_flow.py index d8dd43b0794..a06e46a6127 100644 --- a/addons/stock/tests/test_stock_flow.py +++ b/addons/stock/tests/test_stock_flow.py @@ -1576,7 +1576,6 @@ class TestStockFlow(TestStockCommon): 'picking_id': picking_out.id, 'location_id': self.stock_location, 'location_dest_id': self.customer_location}) - # validate this delivery order, it should be in the waiting state picking_out.action_assign() self.assertEquals(picking_out.state, "confirmed") diff --git a/addons/stock/views/stock_move_views.xml b/addons/stock/views/stock_move_views.xml index 72835114d85..39b2bdcd863 100644 --- a/addons/stock/views/stock_move_views.xml +++ b/addons/stock/views/stock_move_views.xml @@ -201,6 +201,7 @@ <header> <field name="state" widget="statusbar"/> </header> + <field name="scrapped" invisible="1"/> <group> <group string="#Products"> <field name="product_id"/> diff --git a/addons/stock/wizard/stock_backorder_confirmation.py b/addons/stock/wizard/stock_backorder_confirmation.py index 6261bf9b6eb..4dad7610dc1 100644 --- a/addons/stock/wizard/stock_backorder_confirmation.py +++ b/addons/stock/wizard/stock_backorder_confirmation.py @@ -19,11 +19,10 @@ class StockBackorderConfirmation(models.TransientModel): @api.one def _process(self, cancel_backorder=False): - for pack in self.pick_id.pack_operation_ids: - if pack.qty_done > 0: - pack.product_qty = pack.qty_done - else: - pack.unlink() + operations_to_delete = self.pick_id.pack_operation_ids.filtered(lambda o: o.qty_done <= 0) + for pack in self.pick_id.pack_operation_ids - operations_to_delete: + pack.product_qty = pack.qty_done + operations_to_delete.unlink() self.pick_id.do_transfer() if cancel_backorder: backorder_pick = self.env['stock.picking'].search([('backorder_id', '=', self.pick_id.id)]) diff --git a/addons/stock_account/models/product.py b/addons/stock_account/models/product.py index 1b15d2aa066..1e4ac7ffbe1 100644 --- a/addons/stock_account/models/product.py +++ b/addons/stock_account/models/product.py @@ -51,9 +51,6 @@ class ProductTemplate(models.Model): def _compute_cost_method(self): self.cost_method = self.property_cost_method or self.categ_id.property_cost_method - def _is_cost_method_standard(self): - return self.property_cost_method == 'standard' - @api.one def _set_cost_method(self): return self.write({'property_cost_method': self.cost_method}) diff --git a/addons/stock_account/report/stock_history.py b/addons/stock_account/report/stock_history.py index ccf150954dc..4d5d4045dfb 100644 --- a/addons/stock_account/report/stock_history.py +++ b/addons/stock_account/report/stock_history.py @@ -41,7 +41,7 @@ class StockHistory(models.Model): self._cr.execute("""SELECT DISTINCT ON (product_id, company_id) product_id, company_id, cost FROM product_price_history WHERE product_id in %s AND datetime <= %s - ORDER BY product_id, company_id, datetime DESC""", (tuple(not_real_cost_method_products.ids), date)) + ORDER BY product_id, company_id, datetime DESC, id DESC""", (tuple(not_real_cost_method_products.ids), date)) for history in self._cr.dictfetchall(): histories_dict[(history['product_id'], history['company_id'])] = history['cost'] diff --git a/addons/web/static/src/js/chrome/search_filters.js b/addons/web/static/src/js/chrome/search_filters.js index 69c38056e4a..a0e3c1c077f 100644 --- a/addons/web/static/src/js/chrome/search_filters.js +++ b/addons/web/static/src/js/chrome/search_filters.js @@ -155,6 +155,7 @@ ExtendedSearchProposition.Field = Widget.extend({ ExtendedSearchProposition.Char = ExtendedSearchProposition.Field.extend({ tagName: 'input', + className: 'o_input', attributes: { type: 'text' }, @@ -186,7 +187,7 @@ ExtendedSearchProposition.DateTime = ExtendedSearchProposition.Field.extend({ {value: "∄", text: _lt("is not set")} ], get_value: function (index) { - return this["datewidget_" + (index || 0)].get_value(); + return this["datewidget_" + (index || 0)].getValue(); }, get_domain: function (field, operator) { switch (operator.value) { @@ -251,6 +252,7 @@ ExtendedSearchProposition.Date = ExtendedSearchProposition.DateTime.extend({ ExtendedSearchProposition.Integer = ExtendedSearchProposition.Field.extend({ tagName: 'input', + className: 'o_input', attributes: { type: 'number', value: '0', diff --git a/addons/web/static/src/js/chrome/view_manager.js b/addons/web/static/src/js/chrome/view_manager.js index 8d760c568b0..d0beb5bf3dd 100644 --- a/addons/web/static/src/js/chrome/view_manager.js +++ b/addons/web/static/src/js/chrome/view_manager.js @@ -307,7 +307,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, { self.trigger('switch_mode', view_type, view_options); }).fail(function(e) { if (!(e && e.code === 200 && e.data.exception_type)) { - self.do_warn(_t("Error"), view.controller.display_name + _t(" view couldn't be loaded")); + self.do_warn(_t("Error"), view.label + _t(" view couldn't be loaded")); } // Restore internal state self.active_view = old_view; diff --git a/addons/web/static/src/js/core/pyeval.js b/addons/web/static/src/js/core/pyeval.js index 75efc9e813f..502c6a4ce90 100644 --- a/addons/web/static/src/js/core/pyeval.js +++ b/addons/web/static/src/js/core/pyeval.js @@ -435,6 +435,22 @@ datetime.datetime = py.type('datetime', null, { this.second, this.microsecond / 1000); }, + __add__: function (other) { + if (!py.PY_isInstance(other, datetime.timedelta)) { + return py.NotImplemented; + } + var s = tmxxx(this.year, this.month, this.day + other.days, this.hour, this.minute, this.second + other.seconds); + return datetime.datetime.fromJSON(s.year, s.month, s.day, s.hour, s.minute, s.second); + }, + __sub__: function (other) { + if (py.PY_isInstance(other, datetime.timedelta)) { + return py.PY_add(this, py.PY_negative(other)); + } + return py.NotImplemented; + }, + fromJSON: function (year, month, day, hour, minute, second) { + return py.PY_call(datetime.datetime, [year, month, day, hour, minute, second]); + }, }); datetime.date = py.type('date', null, { diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js index 492d9f26552..52e0aef77e4 100644 --- a/addons/web/static/src/js/fields/abstract_field.js +++ b/addons/web/static/src/js/fields/abstract_field.js @@ -142,6 +142,21 @@ var AbstractField = Widget.extend({ // this is the last value that was set by the user, unparsed. This is // used to avoid setting the value twice in a row with the exact value. this.lastSetValue = undefined; + + // formatType is used to determine which format (and parse) functions + // to call to format the field's value to insert into the DOM (typically + // put into a span or an input), and to parse the value from the input + // to send it to the server. These functions are chosen according to + // the 'widget' attrs if is is given, and if it is a valid key, with a + // fallback on the field type, ensuring that the value is formatted and + // displayed according to the choosen widget, if any. + this.formatType = this.attrs.widget in field_utils.format ? + this.attrs.widget : + this.field.type; + // formatOptions (resp. parseOptions) is a dict of options passed to + // calls to the format (resp. parse) function. + this.formatOptions = {}; + this.parseOptions = {}; }, /** * When a field widget is appended to the DOM, its start method is called, @@ -266,15 +281,15 @@ var AbstractField = Widget.extend({ //-------------------------------------------------------------------------- /** - * convert the value from the field to a string representation + * Converts the value from the field to a string representation. * * @private * @param {any} value (from the field type) * @returns {string} */ _formatValue: function (value) { - var options = _.extend({}, this.nodeOptions, { data: this.recordData }); - return field_utils.format[this.field.type](value, this.field, options); + var options = _.extend({}, this.nodeOptions, { data: this.recordData }, this.formatOptions); + return field_utils.format[this.formatType](value, this.field, options); }, /** * This method check if a value is the same as the current value of the @@ -291,15 +306,14 @@ var AbstractField = Widget.extend({ return this.value === value; }, /** - * convert a string representation to a valid value, depending on the field - * type. + * Converts a string representation to a valid value. * * @private * @param {string} value * @returns {any} */ _parseValue: function (value) { - return field_utils.parse[this.field.type](value, this.field); + return field_utils.parse[this.formatType](value, this.field, this.parseOptions); }, /** * main rendering function. Override this if your widget has the same render @@ -426,22 +440,18 @@ var AbstractField = Widget.extend({ this.trigger_up('navigation_move', {direction: 'cancel'}); break; case $.ui.keyCode.UP: - ev.preventDefault(); ev.stopPropagation(); this.trigger_up('navigation_move', {direction: 'up'}); break; case $.ui.keyCode.RIGHT: - ev.preventDefault(); ev.stopPropagation(); this.trigger_up('navigation_move', {direction: 'right'}); break; case $.ui.keyCode.DOWN: - ev.preventDefault(); ev.stopPropagation(); this.trigger_up('navigation_move', {direction: 'down'}); break; case $.ui.keyCode.LEFT: - ev.preventDefault(); ev.stopPropagation(); this.trigger_up('navigation_move', {direction: 'left'}); break; diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index d4013a8bcdb..82970255b3e 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -285,11 +285,15 @@ var InputField = DebouncedField.extend({ */ _onNavigationMove: function (ev) { this._super.apply(this, arguments); - var input = this.$input[0]; - var selecting = (input.selectionEnd !== input.selectionStart); - if ((ev.data.direction === "left" && (selecting || input.selectionStart !== 0)) - || (ev.data.direction === "right" && (selecting || input.selectionStart !== input.value.length))) { - ev.stopPropagation(); + + // the following code only makes sense in edit mode, with an input + if (this.mode === 'edit') { + var input = this.$input[0]; + var selecting = (input.selectionEnd !== input.selectionStart); + if ((ev.data.direction === "left" && (selecting || input.selectionStart !== 0)) + || (ev.data.direction === "right" && (selecting || input.selectionStart !== input.value.length))) { + ev.stopPropagation(); + } } }, }); @@ -322,6 +326,14 @@ var FieldDate = InputField.extend({ supportedFieldTypes: ['date'], /** + * @override + */ + init: function () { + this._super.apply(this, arguments); + // use the session timezone when formatting dates + this.formatOptions.timezone = true; + }, + /** * In edit mode, instantiates a DateWidget datepicker and listen to changes. * * @override @@ -396,17 +408,6 @@ var FieldDate = InputField.extend({ this.datewidget.setValue(this.value); this.$input = this.datewidget.$input; }, - - /** - * FieldDateTime overrides _formatValue to use the session timezone - * - * @override - * @private - * @param {Moment} value - */ - _formatValue: function (value) { - return field_utils.format.date(value, {timezone: true}); - }, }); var FieldDateTime = FieldDate.extend({ @@ -448,17 +449,6 @@ var FieldDateTime = FieldDate.extend({ this.datewidget.setValue(value); this.$input = this.datewidget.$input; }, - - /** - * FieldDateTime overrides _formatValue to use the session timezone - * - * @override - * @private - * @param {Moment} value - */ - _formatValue: function (value) { - return field_utils.format.datetime(value, {timezone: true}); - }, }); var FieldMonetary = InputField.extend({ @@ -490,6 +480,13 @@ var FieldMonetary = InputField.extend({ this.tagName = 'div'; this.className += ' o_input'; } + + // use the formatFloat function in edit + if (this.mode === 'edit') { + this.formatType = 'float'; + } + this.formatOptions.currency = this.currency; + this.formatOptions.digits = [16, 2]; }, //-------------------------------------------------------------------------- @@ -562,22 +559,6 @@ var FieldMonetary = InputField.extend({ var currencyID = this.record.data[currencyField] && this.record.data[currencyField].res_id; this.currency = session.get_currency(currencyID); }, - /** - * FieldMonetary overrides _formatValue to use the format monetary method - * in readonly. - * - * @override - * @private - * @param {float} value - * @returns {string} - */ - _formatValue: function (value) { - var format = field_utils.format[this.mode === 'edit' ? "float" : "monetary"]; - return format(value, this.field, { - digits: [16, 2], - currency: this.currency, - }); - }, }); var FieldBoolean = AbstractField.extend({ @@ -686,6 +667,11 @@ var FieldBoolean = AbstractField.extend({ this.$input.prop('checked', !this.value); this._setValue(!this.value); return; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ev.preventDefault(); } this._super.apply(this, arguments); }, @@ -734,7 +720,7 @@ var FieldInteger = InputField.extend({ } return value; } - return field_utils.format.integer(value, this.field); + return this._super.apply(this, arguments); }, }); @@ -771,31 +757,11 @@ var FieldFloat = InputField.extend({ }); var FieldFloatTime = FieldFloat.extend({ - supportedFieldTypes: ['float'], - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * Format the float time value into a human-readable time format. - * - * @override - * @private - */ - _formatValue: function (value) { - return field_utils.format.float_time(value); - }, - - /** - * Parse the human-readable formatted time value into a float. - * - * @override - * @private - */ - _parseValue: function (value) { - return field_utils.parse.float_time(value); - }, + // this is not strictly necessary, as for this widget to be used, the 'widget' + // attrs must be set to 'float_time', so the formatType is automatically + // 'float_time', but for the sake of clarity, we explicitely define a + // FieldFloatTime widget with formatType = 'float_time'. + formatType: 'float_time', }); var FieldText = InputField.extend(TranslatableFieldMixin, { @@ -853,6 +819,19 @@ var FieldEmail = InputField.extend({ }, //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * Returns the associated link. + * + * @override + */ + getFocusableElement: function () { + return this.mode === 'readonly' ? this.$el : this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- @@ -887,6 +866,17 @@ var FieldPhone = FieldEmail.extend({ this.tagName = 'span'; } }, + /** + * Returns the associated link only if there is one. + * + * @override + */ + getFocusableElement: function () { + if (this._canCall()) { + return this._super.apply(this, arguments); + } + return $(); + }, //-------------------------------------------------------------------------- // Private @@ -941,6 +931,19 @@ var UrlWidget = InputField.extend({ }, //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * Returns the associated link. + * + * @override + */ + getFocusableElement: function () { + return this.mode === 'readonly' ? this.$el : this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- @@ -1041,7 +1044,13 @@ var AbstractFieldBinary = AbstractField.extend({ set_filename: function (value) { var filename = this.attrs.filename; if (filename && filename in this.fields) { - this.trigger_up('update_field', { name: filename, value: value }); + var changes = {}; + changes[filename] = value; + this.trigger_up('field_changed', { + dataPointID: this.dataPointID, + changes: changes, + viewType: this.viewType, + }); } }, on_clear: function () { diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 3b47b8c64b0..419d1f5f646 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -124,7 +124,7 @@ var FieldMany2One = AbstractField.extend({ * @returns {jQuery} */ getFocusableElement: function () { - return this.$input || $(); + return this.mode === 'edit' && this.$input || this.$el; }, /** * TODO @@ -206,6 +206,17 @@ var FieldMany2One = AbstractField.extend({ return []; }, /** + * Returns the display_name from a string which contains it but was altered + * as a result of the show_address option using a horrible hack. + * + * @private + * @param {string} value + * @returns {string} display_name without show_address mess + */ + _getDisplayName: function (value) { + return value.split('\n')[0]; + }, + /** * @private * @param {string} name */ @@ -244,7 +255,7 @@ var FieldMany2One = AbstractField.extend({ // and hope for the best that noone tries to uses this mechanism to do // something else. if (this.nodeOptions.always_reload) { - value = value.split('\n')[0]; + value = this._getDisplayName(value); } this.$input.val(value); if (!this.autocomplete_bound) { @@ -302,7 +313,7 @@ var FieldMany2One = AbstractField.extend({ .then(function (result) { // possible selections for the m2o var values = _.map(result, function (x) { - x[1] = x[1].split("\n")[0]; + x[1] = self._getDisplayName(x[1]); return { label: _.str.escapeHTML(x[1].trim()) || data.noDisplayContent, value: x[1], @@ -478,7 +489,7 @@ var FieldMany2One = AbstractField.extend({ _onInputKeyup: function () { if (this.$input.val() === "") { this.reinitialize(false); - } else if (this.m2o_value !== this.$input.val()) { + } else if (this._getDisplayName(this.m2o_value) !== this.$input.val()) { this.floating = true; this._updateExternalButton(); } @@ -1585,7 +1596,7 @@ var FormFieldMany2ManyTags = FieldMany2ManyTags.extend({ var KanbanFieldMany2ManyTags = FieldMany2ManyTags.extend({ _render: function () { var self = this; - this.$el.addClass('o_field_many2manytags o_kanban_tags'); + this.$el.empty().addClass('o_field_many2manytags o_kanban_tags'); _.each(this.value.data, function (m2m) { // 10th color is invisible if ('color' in m2m.data && m2m.data.color !== 10) { @@ -1763,6 +1774,7 @@ var FieldSelection = AbstractField.extend({ this._super.apply(this, arguments); if (this.field.type === 'many2one') { this.values = this.record.specialData[this.name]; + this.formatType = 'many2one'; } else { this.values = _.reject(this.field.selection, function (v) { return v[0] === false && v[1] === ''; diff --git a/addons/web/static/src/js/fields/upgrade_fields.js b/addons/web/static/src/js/fields/upgrade_fields.js index ecf267e03c1..ae8cae56ef3 100644 --- a/addons/web/static/src/js/fields/upgrade_fields.js +++ b/addons/web/static/src/js/fields/upgrade_fields.js @@ -6,6 +6,7 @@ odoo.define('web.upgrade_widgets', function (require) { * When checked, an upgrade popup is showed to the user. */ +var AbstractField = require('web.AbstractField'); var basic_fields = require('web.basic_fields'); var core = require('web.core'); var Dialog = require('web.Dialog'); @@ -58,6 +59,7 @@ var AbstractFieldUpgrade = { * Opens the Upgrade dialog. * * @private + * @returns {Dialog} the instance of the opened Dialog */ _openDialog: function () { var message = $(QWeb.render('EnterpriseUpgrade')); @@ -75,7 +77,7 @@ var AbstractFieldUpgrade = { }, ]; - new Dialog(this, { + return new Dialog(this, { size: 'medium', buttons: buttons, $content: $('<div>', { @@ -122,7 +124,7 @@ var AbstractFieldUpgrade = { var UpgradeBoolean = FieldBoolean.extend(AbstractFieldUpgrade, { supportedFieldTypes: [], - events: _.extend({}, FieldBoolean.prototype.events, { + events: _.extend({}, AbstractField.prototype.events, { 'click input': '_onInputClicked', }), 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 af4ca7d7a08..67a4fa504d8 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -423,7 +423,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { }); if (!options.stayInEdit) { saveDef = saveDef.then(function (fieldNames) { - var def = fieldNames.length ? self._confirmSave(recordID) : self._setMode('readonly'); + var def = fieldNames.length ? self._confirmSave(recordID) : self._setMode('readonly', recordID); return def.then(function () { return fieldNames; }); @@ -534,6 +534,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { * @param {function} ev.data.action the function to execute in the mutex */ _onMutexify: function (ev) { + ev.stopPropagation(); // prevent other controllers from handling this request this.mutex.exec(ev.data.action); }, /** @@ -578,6 +579,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { * @param {OdooEvent} event */ _onTranslate: function (event) { + event.stopPropagation(); var record = this.model.get(event.data.id, {raw: true}); this._rpc({ route: '/web/dataset/call_button', 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 d897a74c696..716624f368b 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1399,7 +1399,8 @@ var BasicModel = AbstractModel.extend({ * @param {string} [optinos.viewType] the type of view for which the record * is fetched (usefull to load the adequate fields), by defaults, uses * record.viewType - * @returns {Deferred -> Object} resolves to the record + * @returns {Deferred -> Object} resolves to the record or is rejected in + * case no id given were valid ids */ _fetchRecord: function (record, options) { var self = this; @@ -1412,6 +1413,9 @@ var BasicModel = AbstractModel.extend({ context: _.extend({}, record.context, {bin_size: true}), }) .then(function (result) { + if (result.length === 0) { + return $.Deferred().reject(); + } result = result[0]; record.data = _.extend({}, record.data, result); }) @@ -2194,12 +2198,6 @@ var BasicModel = AbstractModel.extend({ if (!field || field.name === 'id') { continue; } - if (field.type === 'float' || - field.type === 'integer' || - field.type === 'monetary') { - context[fieldName] = context[fieldName] || 0; - continue; - } if (field.type === 'date' || field.type === 'datetime') { if (context[fieldName]) { context[fieldName] = JSON.parse(JSON.stringify(context[fieldName])); @@ -2445,7 +2443,11 @@ var BasicModel = AbstractModel.extend({ var fieldName = fieldNames[i]; if (!(fieldName in result)) { var field = params.fields[fieldName]; - if (field.type === 'one2many' || field.type === 'many2many') { + if (field.type === 'float' || + field.type === 'integer' || + field.type === 'monetary') { + result[fieldName] = 0; + } else if (field.type === 'one2many' || field.type === 'many2many') { result[fieldName] = []; } else { result[fieldName] = null; 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 08f28438368..25b72e4fb5a 100644 --- a/addons/web/static/src/js/views/form/form_renderer.js +++ b/addons/web/static/src/js/views/form/form_renderer.js @@ -828,6 +828,7 @@ var FormRenderer = BasicRenderer.extend({ */ _onNavigationMove: function (ev) { ev.stopPropagation(); + var index; if (ev.data.direction === "next") { index = this.allFieldWidgets[this.state.id].indexOf(ev.data.target); diff --git a/addons/web/static/src/js/views/kanban/kanban_column.js b/addons/web/static/src/js/views/kanban/kanban_column.js index 99c9500d210..93165066614 100644 --- a/addons/web/static/src/js/views/kanban/kanban_column.js +++ b/addons/web/static/src/js/views/kanban/kanban_column.js @@ -40,8 +40,6 @@ var KanbanColumn = Widget.extend({ var value = data.value; this.id = data.res_id || value; - // todo: handle group_by_m2o (nameget) - this.title = value === undefined ? _t('Undefined') : value; this.folded = !data.isOpen; this.has_active_field = 'active' in data.fields; this.size = data.count; @@ -62,6 +60,14 @@ var KanbanColumn = Widget.extend({ this.record_options = _.clone(recordOptions); + if (options.grouped_by_m2o) { + // For many2one, a false value means that the field is not set. + this.title = value ? value : _t('Undefined'); + } else { + // False and 0 might be valid values for these fields. + this.title = value === undefined ? _t('Undefined') : value; + } + if (options.group_by_tooltip) { this.tooltipInfo = _.map(options.group_by_tooltip, function (help, field) { return (data.tooltipData && data.tooltipData[field] && "<div>" + help + "<br>" + data.tooltipData[field] + "</div>") || ''; diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js index cd69889bda9..3977ac0df87 100644 --- a/addons/web/static/src/js/views/kanban/kanban_model.js +++ b/addons/web/static/src/js/views/kanban/kanban_model.js @@ -153,7 +153,7 @@ var KanbanModel = BasicModel.extend({ }).then(function () { // Remove record from its current group var old_group; - for (var i = 0; i < parent.count; i++) { + for (var i = 0; i < parent.data.length; i++) { old_group = self.localData[parent.data[i]]; var index = _.indexOf(old_group.data, recordID); if (index >= 0) { @@ -244,9 +244,14 @@ var KanbanModel = BasicModel.extend({ if (groupedByField.type !== 'many2one') { return $.when(); } - var groupIds = _.map(list.data, function (id) { - return self.get(id, {raw: true}).res_id; - }); + var groupIds = _.reduce(list.data, function (groupIds, id) { + var res_id = self.get(id, {raw: true}).res_id; + // The field on which we are grouping might not be set on all records + if (res_id) { + groupIds.push(res_id); + } + return groupIds; + }, []); var tooltipFields = []; var groupedByFieldInfo = list.fieldsInfo.kanban[list.groupedBy[0]]; if (groupedByFieldInfo && groupedByFieldInfo.options) { diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index f713ec6e66e..a917781b580 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -271,10 +271,14 @@ var ListRenderer = BasicRenderer.extend({ _renderButton: function (record, node) { var $button = $('<button>', { type: 'button', - class: 'o_icon_button', title: node.attrs.string, }); - $button.append($('<i>', {class: 'fa ' + node.attrs.icon})); + if (node.attrs.icon) { + $button.addClass('o_icon_button'); + $button.append($('<i>', {class: 'fa ' + node.attrs.icon})); + } else { + $button.text(node.attrs.string); + } this._registerModifiers(node, record, $button); diff --git a/addons/web/static/src/less/datepicker.less b/addons/web/static/src/less/datepicker.less index bc36f8c5a43..99c909efacc 100644 --- a/addons/web/static/src/less/datepicker.less +++ b/addons/web/static/src/less/datepicker.less @@ -28,6 +28,13 @@ } } +// Need to put datetimepicker widget above everything else +// The '.dropdown-menu' part is needed to override default bootstrap rule as +// this file is unfortunately placed in common assets. +.bootstrap-datetimepicker-widget.dropdown-menu { + z-index: @zindex-modal + 1; +} + .datepicker { .table-condensed { > thead { @@ -66,5 +73,5 @@ } } } - } + } } diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index b673690d379..78cc5fd9ad5 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -961,7 +961,8 @@ <span t-if="attrs.help">?</span> </label> <div t-att-style="style"> - <input type="text" size="15" t-att-name="attrs.name" + <input type="text" size="15" class="o_input" + t-att-name="attrs.name" t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined" t-att-id="element_id" t-att-value="defaults[attrs.name] || ''"/> @@ -990,7 +991,9 @@ <span t-if="attrs.help">?</span> </label> <div t-att-style="style"> - <select t-att-name="attrs.name" t-att-id="element_id" + <select class="o_input" + t-att-name="attrs.name" + t-att-id="element_id" t-att-autofocus="attrs.default_focus === '1' || undefined"> <option t-if="prepend_empty"/> <t t-foreach="attrs.selection" t-as="option"> @@ -1012,7 +1015,7 @@ <li class="o_filter_condition"> <span class="o_or_filter">or</span> <span> - <select class="o_searchview_extended_prop_field"> + <select class="o_input o_searchview_extended_prop_field"> <t t-foreach="widget.attrs.fields" t-as="field"> <option t-att="{'selected': field === widget.attrs.selected ? 'selected' : null}" t-att-value="field.name"> @@ -1022,18 +1025,19 @@ </select> <span class="o_searchview_extended_delete_prop fa fa-trash-o"/> </span> - <select class="o_searchview_extended_prop_op"/> + <select class="o_input o_searchview_extended_prop_op"/> <span class="o_searchview_extended_prop_value"/> </li> </t> <t t-name="SearchView.extended_search.proposition.float"> - <input t-att-type="widget.decimal_point === '.' ? 'number' : 'text'" + <input class="o_input" + t-att-type="widget.decimal_point === '.' ? 'number' : 'text'" t-attf-title="Number using #{widget.decimal_point || '.' } as decimal separator." t-attf-pattern="[0-9]+([\\#{widget.decimal_point || '.' }][0-9]+)?" t-attf-value="0#{widget.decimal_point || '.' }0" step="0.01"/> </t> <t t-name="SearchView.extended_search.proposition.selection"> - <select> + <select class="o_input"> <option t-foreach="widget.field.selection" t-as="element" t-att-value="element[0]"> <t t-esc="element[1]"/> </option> @@ -1051,7 +1055,7 @@ </ul> </div> <t t-name="GroupByMenuSelector"> - <li><select class="o_add_group o_group_selector"> + <li><select class="o_input o_add_group o_group_selector"> <t t-foreach="groupableFields" t-as="field"> <option t-att-data-name="field.name"><t t-esc="field.string"/></option> </t> diff --git a/addons/web/static/tests/core/pyeval_tests.js b/addons/web/static/tests/core/pyeval_tests.js index 0bd9a7151dd..89bfa32872b 100644 --- a/addons/web/static/tests/core/pyeval_tests.js +++ b/addons/web/static/tests/core/pyeval_tests.js @@ -343,6 +343,27 @@ QUnit.module('core', function () { '2015-02-02'); }); + + QUnit.test('timedelta', function (assert) { + assert.expect(4); + assert.strictEqual( + py.eval("(datetime.datetime(2017, 2, 15, 1, 7, 31) + datetime.timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')", + pyEval.context()), + "2017-02-16 01:07:31"); + assert.strictEqual( + py.eval("(datetime.datetime(2012, 2, 15, 1, 7, 31) - datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S')", + pyEval.context()), + "2012-02-15 00:07:31"); + assert.strictEqual( + py.eval("(datetime.datetime(2012, 2, 15, 1, 7, 31) + datetime.timedelta(hours=-1)).strftime('%Y-%m-%d %H:%M:%S')", + pyEval.context()), + "2012-02-15 00:07:31"); + assert.strictEqual( + py.eval("(datetime.datetime(2012, 2, 15, 1, 7, 31) + datetime.timedelta(minutes=100)).strftime('%Y-%m-%d %H:%M:%S')", + pyEval.context()), + "2012-02-15 02:47:31"); + }); + QUnit.test('datetime.tojson', function (assert) { assert.expect(7); diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 4b850b26d34..c492537c63f 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -394,7 +394,7 @@ QUnit.module('basic_fields', { QUnit.module('FieldFloat'); QUnit.test('float field when unset', function (assert) { - assert.expect(1); + assert.expect(2); var form = createView({ View: FormView, @@ -408,8 +408,10 @@ QUnit.module('basic_fields', { res_id: 4, }); - assert.ok(form.$('.o_field_widget').hasClass('o_field_empty'), - 'Non-set float field should be recognized as unset.'); + assert.notOk(form.$('.o_field_widget').hasClass('o_field_empty'), + 'Non-set float field should be considered as 0.'); + assert.strictEqual(form.$('.o_field_widget').text(), "0.000", + 'Non-set float field should be considered as 0.'); form.destroy(); }); @@ -536,6 +538,35 @@ QUnit.module('basic_fields', { form.destroy(); }); + QUnit.test('float widget on monetary field', function (assert) { + assert.expect(1); + + this.data.partner.fields.monetary = {string: "Monetary", type: 'monetary'}; + this.data.partner.records[0].monetary = 9.99; + this.data.partner.records[0].currency_id = 1; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'<form string="Partners">' + + '<sheet>' + + '<field name="monetary" widget="float"/>' + + '<field name="currency_id" invisible="1"/>' + + '</sheet>' + + '</form>', + res_id: 1, + session: { + currencies: _.indexBy(this.data.currency.records, 'id'), + }, + }); + + assert.strictEqual(form.$('.o_field_widget[name=monetary]').text(), '9.99', + 'value should be correctly formatted (with the float formatter)'); + + form.destroy(); + }); + QUnit.module('FieldEmail'); QUnit.test('email field in form view', function (assert) { @@ -1015,7 +1046,7 @@ QUnit.module('basic_fields', { QUnit.module('FieldBinary'); QUnit.test('binary fields are correctly rendered', function (assert) { - assert.expect(9); + assert.expect(16); // save the session function var oldGetFile = session.get_file; @@ -1028,18 +1059,24 @@ QUnit.module('basic_fields', { return $.when(); }; + this.data.partner.records[0].foo = 'coucou.txt'; var form = createView({ View: FormView, model: 'partner', data: this.data, arch: '<form string="Partners">' + - '<field name="document"/>' + + '<field name="document" filename="foo"/>' + + '<field name="foo"/>' + '</form>', res_id: 1, }); assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 1, "the binary field should be rendered as a downloadable link in readonly"); + assert.strictEqual(form.$('a.o_field_widget[name="document"]').text().trim(), 'coucou.txt', + "the binary field should display the name of the file in the link"); + assert.strictEqual(form.$('.o_field_char').text(), 'coucou.txt', + "the filename field should have the file name as value"); form.$('a.o_field_widget[name="document"]').click(); @@ -1047,12 +1084,15 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 0, "the binary field should not be rendered as a downloadable link in edit"); - assert.strictEqual(form.$('div.o_field_binary_file[name="document"]').length, 1, - "the binary field should be correctly rendered in edit"); + assert.strictEqual(form.$('div.o_field_binary_file[name="document"] > input').val(), 'coucou.txt', + "the binary field should display the file name in the input edit mode"); assert.strictEqual(form.$('.o_field_binary_file > input').attr('readonly'), 'readonly', "the input should be readonly"); assert.strictEqual(form.$('.o_field_binary_file > .o_clear_file_button').length, 1, "there shoud be a button to clear the file"); + assert.strictEqual(form.$('input.o_field_char').val(), 'coucou.txt', + "the filename field should have the file name as value"); + form.$('.o_field_binary_file > .o_clear_file_button').click(); @@ -1060,6 +1100,16 @@ QUnit.module('basic_fields', { "the input should be hidden"); assert.strictEqual(form.$('.o_field_binary_file > .o_select_file_button:not(.o_hidden)').length, 1, "there shoud be a button to upload the file"); + assert.strictEqual(form.$('input.o_field_char').val(), '', + "the filename field should be empty since we removed the file"); + + form.$buttons.find('.o_form_button_save').click(); + assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 0, + "the binary field should not render as a downloadable link since we removed the file"); + assert.strictEqual(form.$('a.o_field_widget[name="document"]').text().trim(), '', + "the binary field should not display a filename in the link since we removed the file"); + assert.strictEqual(form.$('.o_field_char').text().trim(), '', + "the filename field should be empty since we removed the file"); form.destroy(); @@ -1926,7 +1976,7 @@ QUnit.module('basic_fields', { QUnit.module('FieldInteger'); QUnit.test('integer field when unset', function (assert) { - assert.expect(1); + assert.expect(2); var form = createView({ View: FormView, @@ -1936,8 +1986,10 @@ QUnit.module('basic_fields', { res_id: 4, }); - assert.ok(form.$('.o_field_widget').hasClass('o_field_empty'), - 'Non-set integer field should be recognized as unset.'); + assert.notOk(form.$('.o_field_widget').hasClass('o_field_empty'), + 'Non-set integer field should be recognized as 0.'); + assert.strictEqual(form.$('.o_field_widget').text(), "0", + 'Non-set integer field should be recognized as 0.'); 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 a1f851eb91f..3bf541b097d 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -199,6 +199,115 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('many2ones in form views with show_adress', function (assert) { + assert.expect(4); + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<group>' + + '<field ' + + 'name="trululu" ' + + 'string="custom label" ' + + 'context="{\'search_default_customer\':1, \'show_address\': 1}" ' + + 'options="{\'always_reload\': True}"' + + '/>' + + '</group>' + + '</sheet>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'name_get') { + return this._super(route, args).then(function (result) { + result[0][1] += '\nStreet\nCity ZIP'; + return result; + }); + } + return this._super(route, args); + }, + res_id: 1, + }); + + assert.strictEqual($('a.o_form_uri').html(), 'aaa<br>Street<br>City ZIP', + "input should have a multi-line content in readonly due to show_address"); + form.$buttons.find('.o_form_button_edit').click(); + assert.strictEqual(form.$('button.o_external_button:visible').length, 1, + "should have an open record button"); + + form.$('input.o_input').click(); + form.$('input.o_input').trigger($.Event('keyup', { + which: $.ui.keyCode.ESC, + keyCode: $.ui.keyCode.ESC, + })); + + assert.strictEqual(form.$('button.o_external_button:visible').length, 1, + "should still have an open record button"); + form.$('input.o_input').trigger('focusout'); + assert.strictEqual($('.modal button:contains(Create and edit)').length, 0, + "there should not be a quick create modal"); + + form.destroy(); + }); + + QUnit.test('many2ones in form views with search more', function (assert) { + assert.expect(3); + 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>', + archs: { + 'partner,false,list': '<tree><field name="display_name"/></tree>', + 'partner,false,search': '<search><field name="datetime"/></search>', + }, + res_id: 1, + }); + + form.$buttons.find('.o_form_button_edit').click(); + 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 + + assert.strictEqual($('tr.o_data_row').length, 9, "should display 9 records"); + + $('.o_searchview_more').click(); // Magnifying class for more filters + $('button:contains(Filters)').click(); + $('.o_add_filter').click(); // Add a custom filter, datetime field is selected + assert.strictEqual($('li.o_filter_condition select.o_searchview_extended_prop_field').val(), 'datetime', + "datetime field should be selected"); + $('.o_apply_filter').click(); + + assert.strictEqual($('tr.o_data_row').length, 0, "should display 0 records"); + form.destroy(); + }); + QUnit.test('onchanges on many2ones trigger when editing record in form view', function (assert) { assert.expect(9); @@ -2927,8 +3036,8 @@ QUnit.module('relational_fields', { assert.strictEqual(form.$('.o_data_row').length, 3, "sould have 3 records in one2many list"); - assert.strictEqual(form.$('.o_data_row').text(), "blip1.59yop1.5tototo1.550xphone", - "sould display the record values in one2many list"); + assert.strictEqual(form.$('.o_data_row').text(), "blip1.59yop1.50tototo1.550xphone", + "should display the record values in one2many list"); $('.o_form_button_save').click(); @@ -5153,7 +5262,7 @@ QUnit.module('relational_fields', { }); QUnit.test('widget selection, edition and on many2one field', function (assert) { - assert.expect(15); + assert.expect(18); this.data.partner.onchanges = {product_id: function () {}}; this.data.partner.records[0].product_id = 37; @@ -5178,6 +5287,13 @@ QUnit.module('relational_fields', { }); assert.ok(!form.$('select').length, "should not have a select tag in dom"); + assert.strictEqual(form.$('.o_field_widget[name=product_id]').text(), 'xphone', + "should have rendered the many2one field correctly"); + assert.strictEqual(form.$('.o_field_widget[name=trululu]').text(), '', + "should have rendered the unset many2one field correctly"); + assert.strictEqual(form.$('.o_field_widget[name=color]').text(), 'Red', + "should have rendered the selection field correctly"); + form.$buttons.find('.o_form_button_edit').click(); assert.strictEqual(form.$('select').length, 3, @@ -5811,6 +5927,52 @@ QUnit.module('relational_fields', { form.destroy(); }); + + QUnit.test('name_create in form dialog', function (assert) { + var done = assert.async(); + assert.expect(2); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form>' + + '<group>' + + '<field name="p">' + + '<tree>' + + '<field name="bar"/>' + + '</tree>' + + '<form>' + + '<field name="product_id"/>' + + '</form>' + + '</field>' + + '</group>' + + '</form>', + mockRPC: function (route, args) { + if (args.method === 'name_create') { + assert.step('name_create'); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_field_x2many_list_row_add a').click(); + var $dropdown = $('.modal .o_field_many2one input').autocomplete('widget'); + $('.modal input').val('new record').trigger('keydown'); + concurrency.delay(0).then(function () { + $dropdown.find('li:first()').click(); // quick create 'new record' + assert.verifySteps(['name_create']); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + done(); + }); + }); + }); }); }); diff --git a/addons/web/static/tests/fields/upgrade_fields_tests.js b/addons/web/static/tests/fields/upgrade_fields_tests.js new file mode 100644 index 00000000000..babc32b60a8 --- /dev/null +++ b/addons/web/static/tests/fields/upgrade_fields_tests.js @@ -0,0 +1,44 @@ +odoo.define('web.upgrade_fields_tests', function (require) { +"use strict"; + +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + +QUnit.module('fields', {}, function () { + +QUnit.module('upgrade_fields', { + beforeEach: function () { + this.data = { + partner: { + fields: { + bar: {string: "Bar", type: "boolean"}, + }, + } + }; + }, +}, function () { + + QUnit.module('UpgradeBoolean'); + + QUnit.test('widget upgrade_boolean in a form view', function (assert) { + assert.expect(1); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form><field name="bar" widget="upgrade_boolean"/></form>', + }); + + form.$('input:checkbox').click(); + assert.strictEqual($('.modal').length, 1, + "the 'Upgrade to Enterprise' dialog should be opened"); + + form.destroy(); + }); + +}); +}); +}); diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index 29e53c735a7..cdd4ff4e523 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -537,11 +537,14 @@ var MockServer = Class.extend({ ids = [ids]; } var fields = args[1] && args[1].length ? _.uniq(args[1].concat(['id'])) : Object.keys(this.data[model].fields); - var results = _.map(ids, function (id) { - var record = _.findWhere(self.data[model].records, {id: id}); - if (!record) { - throw "mock read: id does not exist..."; + var records = _.reduce(ids, function (records, id) { + if (!id) { + throw "mock read: falsy value given as id, would result in an access error in actual server !"; } + var record = _.findWhere(self.data[model].records, {id: id}); + return record ? records.concat(record) : records; + }, []); + var results = _.map(records, function (record) { var result = {}; for (var i = 0; i < fields.length; i++) { var field = self.data[model].fields[fields[i]]; @@ -549,7 +552,12 @@ var MockServer = Class.extend({ // the field doens't exist on the model, so skip it continue; } - if (field.type === 'many2one') { + if (field.type === 'float' || + field.type === 'integer' || + field.type === 'monetary') { + // read should return 0 for unset numeric fields + result[fields[i]] = record[fields[i]] || 0; + } else if (field.type === 'many2one') { var relatedRecord = _.findWhere(self.data[field.relation].records, { id: record[fields[i]] }); diff --git a/addons/web/static/tests/views/basic_model_tests.js b/addons/web/static/tests/views/basic_model_tests.js index ca2f6f37f3e..9fbc2acdd88 100644 --- a/addons/web/static/tests/views/basic_model_tests.js +++ b/addons/web/static/tests/views/basic_model_tests.js @@ -92,6 +92,23 @@ QUnit.module('Views', { model.destroy(); }); + QUnit.test('rejects loading a record with invalid id', function (assert) { + assert.expect(1); + + this.params.res_id = 99; + + var model = createModel({ + Model: BasicModel, + data: this.data, + }); + + model.load(this.params).always(function (error) { + assert.strictEqual(this.state(), 'rejected', + "load should return a rejected deferred for an invalid id") + }); + model.destroy(); + }); + QUnit.test('notify change with many2one', function (assert) { assert.expect(2); @@ -1347,8 +1364,8 @@ QUnit.module('Views', { delete this.params.res_id; model.load(this.params).then(function (resultID) { var record = model.get(resultID); - assert.strictEqual(record.data.bar, false, - "should be initialized with correct value"); + assert.strictEqual(record.data.bar, 0, + "should be initialized with correct value (0 as integer)"); model.notifyChanges(resultID, {foo: "anotherverylongstring"}); diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index ab304e62ebc..0e53d6814d4 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -625,10 +625,10 @@ QUnit.module('Views', { res_id: 2, }); - assert.strictEqual(form.$('.o_field_widget.o_field_empty').length, 2, - "should have 2 empty fields with correct class"); - assert.strictEqual(form.$('.o_form_label_empty').length, 2, - "should have 2 muted labels (for the empty fieds) in readonly"); + assert.strictEqual(form.$('.o_field_widget.o_field_empty').length, 1, + "should have 1 empty field with correct class"); + assert.strictEqual(form.$('.o_form_label_empty').length, 1, + "should have 1 muted label (for the empty fied) in readonly"); form.$buttons.find('.o_form_button_edit').click(); @@ -771,7 +771,7 @@ QUnit.module('Views', { }); QUnit.test('required float fields works as expected', function (assert) { - assert.expect(8); + assert.expect(10); this.data.partner.fields.qux.required = true; var form = createView({ @@ -793,24 +793,26 @@ QUnit.module('Views', { assert.ok(form.$('input[name="qux"]').hasClass('o_required_modifier'), "qux input is flagged as required"); - assert.strictEqual(form.$('input[name="qux"]').val(), "", - "qux input is empty"); + assert.strictEqual(form.$('input[name="qux"]').val(), "0.0", + "qux input is 0 by default (float field)"); form.$buttons.find('.o_form_button_save').click(); - assert.ok(form.$('input[name="qux"]').hasClass('o_field_invalid'), - "qux input is displayed as invalid"); + assert.notOk(form.$('input[name="qux"]').hasClass('o_field_invalid'), + "qux input is not displayed as invalid"); + + form.$buttons.find('.o_form_button_edit').click(); - form.$('input[name="qux"]').val("0").trigger('input'); + form.$('input[name="qux"]').val("1").trigger('input'); form.$buttons.find('.o_form_button_save').click(); form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('input[name="qux"]').val(), "0.0", + assert.strictEqual(form.$('input[name="qux"]').val(), "1.0", "qux input is properly formatted"); - assert.verifySteps(['default_get', 'create', 'read']); + assert.verifySteps(['default_get', 'create', 'read', 'write', 'read']); form.destroy(); }); @@ -3278,7 +3280,7 @@ QUnit.module('Views', { }); QUnit.test('navigation with tab key in form view', function (assert) { - assert.expect(2); + assert.expect(3); var form = createView({ View: FormView, @@ -3287,8 +3289,9 @@ QUnit.module('Views', { arch: '<form string="Partners">' + '<sheet>' + '<group>' + - '<field name="foo"/>' + + '<field name="foo" widget="email"/>' + '<field name="bar"/>' + + '<field name="display_name" widget="url"/>' + '</group>' + '</sheet>' + '</form>', @@ -3300,18 +3303,73 @@ QUnit.module('Views', { // focus first input, trigger tab form.$('input[name="foo"]').focus(); + form.$('input[name="foo"]').trigger($.Event('keydown', {which: $.ui.keyCode.TAB})); assert.ok($.contains(form.$('div[name="bar"]')[0], document.activeElement), "bar checkbox should be focused"); + form.$('div[name="bar"]').trigger($.Event('keydown', {which: $.ui.keyCode.TAB})); + assert.strictEqual(form.$('input[name="display_name"]')[0], document.activeElement, + "display_name should be focused"); + // simulate shift+tab on active element $(document.activeElement).trigger($.Event('keydown', {which: $.ui.keyCode.TAB, shiftKey: true})); + $(document.activeElement).trigger($.Event('keydown', {which: $.ui.keyCode.TAB, shiftKey: true})); assert.strictEqual(document.activeElement, form.$('input[name="foo"]')[0], "first input should be focused"); form.destroy(); }); + QUnit.test('navigation with tab key in readonly form view', function (assert) { + // The behavior of the phone widget is completely altered by crm_voip so + // this test fails if crm_voip is installed. The enterprise module is + // responsible for testing its own behavior in its own tests. + if ('crm.voip' in odoo.__DEBUG__.services) { + assert.expect(0); + return; + } + + assert.expect(3); + + this.data.partner.records[1].product_id = 37; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<group>' + + '<field name="trululu"/>' + + '<field name="foo"/>' + + '<field name="product_id"/>' + + '<field name="foo" widget="phone"/>' + + '<field name="display_name" widget="url"/>' + + '</group>' + + '</sheet>' + + '</form>', + res_id: 2, + }); + + // focus first field, trigger tab + form.$('[name="trululu"]').focus(); + form.$('[name="trululu"]').trigger($.Event('keydown', {which: $.ui.keyCode.TAB})); + assert.strictEqual(form.$('[name="product_id"]')[0], document.activeElement, + "product_id should be focused"); + form.$('[name="product_id"]').trigger($.Event('keydown', {which: $.ui.keyCode.TAB})); + assert.strictEqual(form.$('[name="display_name"]')[0], document.activeElement, + "display_name should be focused (emails are focusable but phone aren't)"); + + // simulate shift+tab on active element + $(document.activeElement).trigger($.Event('keydown', {which: $.ui.keyCode.TAB, shiftKey: true})); + $(document.activeElement).trigger($.Event('keydown', {which: $.ui.keyCode.TAB, shiftKey: true})); + assert.strictEqual(document.activeElement, form.$('[name="trululu"]')[0], + "first many2one should be focused"); + + form.destroy(); + }); + QUnit.test('skip invisible fields when navigating with TAB', function (assert) { assert.expect(1); @@ -4640,6 +4698,64 @@ QUnit.module('Views', { _t.database.multi_lang = multi_lang; }); + QUnit.test('translate event correctly handled with multiple controllers', function (assert) { + assert.expect(3); + + this.data.product.fields.name.translate = true; + this.data.partner.records[0].product_id = 37; + var nbTranslateCalls = 0; + + var multi_lang = _t.database.multi_lang; + _t.database.multi_lang = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<group>' + + '<field name="product_id"/>' + + '</group>' + + '</sheet>' + + '</form>', + archs: { + 'product,false,form': '<form>' + + '<sheet>' + + '<group>' + + '<field name="name"/>' + + '<field name="partner_type_id"/>' + + '</group>' + + '</sheet>' + + '</form>', + }, + res_id: 1, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/product/get_formview_id') { + return $.when(false); + } else if (route === "/web/dataset/call_button" && args.method === 'translate_fields') { + assert.deepEqual(args.args, ["product",37,"name",{}], 'should call "call_button" route'); + nbTranslateCalls++; + return $.when(); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('[name="product_id"] .o_external_button').click(); + + assert.strictEqual($('.modal-body .o_field_translate').length, 1, + "there should be a translate button in the modal"); + + $('.modal-body .o_field_translate').click(); + + assert.strictEqual(nbTranslateCalls, 1, "should call_button translate once"); + + form.destroy(); + _t.database.multi_lang = multi_lang; + }); + QUnit.test('buttons are disabled until action is resolved', function (assert) { assert.expect(3); diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index 3d375e7be0a..549b724ca68 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -445,7 +445,7 @@ QUnit.module('Views', { }); QUnit.test('many2many_tags are correctly fetched and displayed', function (assert) { - assert.expect(5); + assert.expect(10); this.data.partner.records[0].category_ids = [6, 7]; this.data.partner.records[1].category_ids = [7]; @@ -459,6 +459,7 @@ QUnit.module('Views', { '<div>' + '<field name="category_ids"/>' + '<field name="foo"/>' + + '<field name="state" widget="priority"/>' + '</div>' + '</t></templates>' + '</kanban>', @@ -474,7 +475,20 @@ QUnit.module('Views', { assert.ok($first_record.find('.o_tag:first()').hasClass('o_tag_color_2'), 'first tag should have color 2'); assert.verifySteps(['/web/dataset/search_read', '/web/dataset/call_kw/category/read'], - 'two RPC should have been done(one search read and one read for the m2m'); + 'two RPC should have been done (one search read and one read for the m2m)'); + + // Write on the record using the priority widget to trigger a re-render in readonly + kanban.$('.o_field_widget.o_priority a.o_priority_star.fa-star-o').first().click(); + assert.verifySteps([ + '/web/dataset/search_read', + '/web/dataset/call_kw/category/read', + '/web/dataset/call_kw/partner/write', + '/web/dataset/call_kw/partner/read', + '/web/dataset/call_kw/category/read' + ], 'five RPCs should have been done (previous 2, 1 write (triggers a re-render), same 2 at re-render'); + assert.strictEqual(kanban.$('.o_kanban_record:first()').find('.o_field_many2manytags .o_tag').length, 2, + 'first record should still contain only 2 tags'); + kanban.destroy(); }); @@ -1505,7 +1519,8 @@ QUnit.module('Views', { }); QUnit.test('group_by_tooltip option when grouping on a many2one', function (assert) { - assert.expect(5); + assert.expect(12); + delete this.data.partner.records[3].product_id; var kanban = createView({ View: KanbanView, model: 'partner', @@ -1528,16 +1543,87 @@ QUnit.module('Views', { }, }); + assert.ok(kanban.$('.o_kanban_view').hasClass('o_kanban_grouped'), + "should have classname 'o_kanban_grouped'"); assert.strictEqual(kanban.$('.o_kanban_group').length, 2, "should have " + 2 + " columns"); // simulate an update coming from the searchview, with another groupby given kanban.update({groupBy: ['product_id']}); - assert.ok(kanban.$('.o_kanban_group:first span.o_column_title:contains(hello)').length, - "first column should have a title with a value from the many2one"); + assert.strictEqual(kanban.$('.o_kanban_group').length, 3, "should have " + 3 + " columns"); + assert.strictEqual(kanban.$('.o_kanban_group:nth-child(1) .o_kanban_record').length, 1, + "column should contain 1 record(s)"); + assert.strictEqual(kanban.$('.o_kanban_group:nth-child(2) .o_kanban_record').length, 2, + "column should contain 2 record(s)"); + assert.strictEqual(kanban.$('.o_kanban_group:nth-child(3) .o_kanban_record').length, 1, + "column should contain 1 record(s)"); + assert.ok(kanban.$('.o_kanban_group:first span.o_column_title:contains(Undefined)').length, + "first column should have a default title for when no value is provided"); assert.strictEqual(kanban.$('.o_kanban_group:first .o_kanban_header').data('original-title'), + "<p>1 records</p>", + "first column should have a tooltip with the number of records, but not" + + "the group_by_tooltip title and the many2one field value since it has no value"); + assert.ok(kanban.$('.o_kanban_group:eq(1) span.o_column_title:contains(hello)').length, + "second column should have a title with a value from the many2one"); + assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_header').data('original-title'), "<p>2 records</p><div>Kikou<br>hello</div>", - "first column should have a tooltip with the number of records, the group_by_tooltip title and many2one field value"); + "second column should have a tooltip with the number of records, the group_by_tooltip title and many2one field value"); + + kanban.destroy(); + }); + + QUnit.test('move a record then put it again in the same column', function (assert) { + assert.expect(6); + + this.data.partner.records = []; + + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '<kanban>' + + '<field name="product_id"/>' + + '<templates><t t-name="kanban-box">' + + '<div><field name="display_name"/></div>' + + '</t></templates></kanban>', + groupBy: ['product_id'], + }); + + kanban.$('.o_column_quick_create').click(); + kanban.$('.o_column_quick_create input').val('column1'); + kanban.$('.o_column_quick_create button.o_kanban_add').click(); + + kanban.$('.o_column_quick_create').click(); + kanban.$('.o_column_quick_create input').val('column2'); + kanban.$('.o_column_quick_create button.o_kanban_add').click(); + + kanban.$('.o_kanban_group:eq(1) .o_kanban_quick_add i').click(); + var $quickCreate = kanban.$('.o_kanban_group:eq(1) .o_kanban_quick_create'); + $quickCreate.find('input').val('new partner'); + $quickCreate.find('button.o_kanban_add').click(); + + assert.strictEqual(kanban.$('.o_kanban_group:eq(0) .o_kanban_record').length, 0, + "column should contain 0 record"); + assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_record').length, 1, + "column should contain 1 records"); + + var $record = kanban.$('.o_kanban_group:eq(1) .o_kanban_record:eq(0)'); + var $group = kanban.$('.o_kanban_group:eq(0)'); + testUtils.dragAndDrop($record, $group); + + assert.strictEqual(kanban.$('.o_kanban_group:eq(0) .o_kanban_record').length, 1, + "column should contain 1 records"); + assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_record').length, 0, + "column should contain 0 records"); + + $record = kanban.$('.o_kanban_group:eq(0) .o_kanban_record:eq(0)'); + $group = kanban.$('.o_kanban_group:eq(1)'); + + testUtils.dragAndDrop($record, $group); + assert.strictEqual(kanban.$('.o_kanban_group:eq(0) .o_kanban_record').length, 0, + "column should contain 0 records"); + assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_kanban_record').length, 1, + "column should contain 1 records"); kanban.destroy(); }); }); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 332ba6687f9..c39e6d2b1b0 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -136,7 +136,7 @@ QUnit.module('Views', { }); QUnit.test('simple editable rendering', function (assert) { - assert.expect(9); + assert.expect(12); var list = createView({ View: ListView, @@ -164,6 +164,15 @@ QUnit.module('Views', { "should have a visible save button"); assert.ok(list.$buttons.find('.o_list_button_discard').is(':visible'), "should have a visible discard button"); + + list.$buttons.find('.o_list_button_save').click(); + + assert.ok(list.$buttons.find('.o_list_button_add').is(':visible'), + "should have a visible Create button"); + assert.ok(!list.$buttons.find('.o_list_button_save').is(':visible'), + "should not have a visible save button"); + assert.ok(!list.$buttons.find('.o_list_button_discard').is(':visible'), + "should not have a visible discard button"); list.destroy(); }); @@ -1046,6 +1055,24 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('list view with a button without icon', function (assert) { + assert.expect(1); + + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree string="Phonecalls" editable="top">' + + '<field name="foo"/>' + + '<button string="abc" type="object" name="schedule_another_phonecall"/>' + + '</tree>', + }); + + assert.strictEqual(list.$('table button').first().text(), 'abc', + "should have rendered a button with string attribute as label"); + list.destroy(); + }); + QUnit.test('list view, editable, can discard', function (assert) { assert.expect(5); diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index fe23ff89679..71473f62f18 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -438,6 +438,7 @@ <script type="text/javascript" src="/web/static/tests/fields/field_utils_tests.js"></script> <script type="text/javascript" src="/web/static/tests/fields/relational_fields_tests.js"></script> <script type="text/javascript" src="/web/static/tests/fields/special_fields.js"></script> + <script type="text/javascript" src="/web/static/tests/fields/upgrade_fields_tests.js"></script> <script type="text/javascript" src="/web/static/tests/views/abstract_view_tests.js"></script> <script type="text/javascript" src="/web/static/tests/views/form_tests.js"></script> diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py index 4c065a5b634..8c60e7923f2 100644 --- a/addons/web_editor/models/ir_ui_view.py +++ b/addons/web_editor/models/ir_ui_view.py @@ -6,7 +6,7 @@ import logging from lxml import etree, html from odoo.exceptions import AccessError -from odoo import api, models +from odoo import api, fields, models from odoo.tools import pycompat _logger = logging.getLogger(__name__) @@ -35,6 +35,10 @@ class IrUiView(models.Model): return arch.xpath('//*[@data-oe-model != "ir.ui.view"]') @api.model + def get_default_lang_code(self): + return False + + @api.model def save_embedded_field(self, el): Model = self.env[el.get('data-oe-model')] field = el.get('data-oe-field') @@ -45,7 +49,10 @@ class IrUiView(models.Model): if value is not None: # TODO: batch writes? - Model.browse(int(el.get('data-oe-id'))).write({field: value}) + if self.get_default_lang_code() and field != 'arch' and not isinstance(Model._fields[field], fields.Html): + Model.browse(int(el.get('data-oe-id'))).with_context(lang=self.get_default_lang_code()).write({field: value}) + else: + Model.browse(int(el.get('data-oe-id'))).write({field: value}) def _pretty_arch(self, arch): # remove_blank_string does not seem to work on HTMLParser, and diff --git a/addons/web_editor/static/src/js/backend.js b/addons/web_editor/static/src/js/backend.js index c12ab41b4bb..34ca6c9f5d4 100644 --- a/addons/web_editor/static/src/js/backend.js +++ b/addons/web_editor/static/src/js/backend.js @@ -192,6 +192,7 @@ var FieldTextHtmlSimple = basic_fields.DebouncedField.extend({ var FieldTextHtml = AbstractField.extend({ template: 'web_editor.FieldTextHtml', supportedFieldTypes: ['html'], + start: function () { var self = this; @@ -206,7 +207,7 @@ var FieldTextHtml = AbstractField.extend({ }; window.odoo[this.callback+"_updown"] = null; window.odoo[this.callback+"_downup"] = function (value) { - self.set_value(value); + self._setValue(value); self.resize(); }; @@ -236,10 +237,13 @@ var FieldTextHtml = AbstractField.extend({ // this.$translate = $(); return def; }, + getDatarecord: function () { + return this.recordData; + }, get_url: function (_attr) { var src = this.nodeOptions.editor_url || "/mass_mailing/field/email_template"; var k; - var datarecord = this.recordData; + var datarecord = this.getDatarecord(); var attr = { 'model': this.model, 'field': this.name, diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index da4d691274c..7e956e85658 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -145,3 +145,13 @@ class View(models.Model): menu_data=self.env['ir.ui.menu'].load_menus_root() if request.website.is_user() else None, ) return qcontext + + + @api.model + def get_default_lang_code(self): + website_id = self.env.context.get('website_id') + if website_id: + lang_code = self.env['website'].browse(website_id).default_lang_code + return lang_code + else: + return super(View, self).get_default_lang_code()
\ No newline at end of file diff --git a/addons/website_event_sale/tests/test_ui.py b/addons/website_event_sale/tests/test_ui.py index 193521db8d8..c2e6f04f4a6 100644 --- a/addons/website_event_sale/tests/test_ui.py +++ b/addons/website_event_sale/tests/test_ui.py @@ -7,6 +7,12 @@ class TestUi(odoo.tests.HttpCase): at_install = False def test_admin(self): + # Seen that: + # - this test relies on demo data that are entirely in USD (pricelists) + # - that main demo company is gelocated in US + # - that this test awaits for hardcoded USDs amount + # we have to force company currency as USDs only for this test + self.env.ref('base.main_company').write({'currency_id': self.env.ref('base.USD').id}) self.phantom_js("/", "odoo.__DEBUG__.services['web_tour.tour'].run('event_buy_tickets')", "odoo.__DEBUG__.services['web_tour.tour'].tours.event_buy_tickets.ready", login="admin") def test_demo(self): diff --git a/addons/website_forum/i18n/website_forum.pot b/addons/website_forum/i18n/website_forum.pot index 2f70c77241b..75bdf73ced2 100644 --- a/addons/website_forum/i18n/website_forum.pot +++ b/addons/website_forum/i18n/website_forum.pot @@ -789,6 +789,11 @@ msgid "Close" msgstr "" #. module: website_forum +#: model:ir.ui.view,arch_db:website_forum.close_post +msgid "Close Post" +msgstr "" + +#. module: website_forum #: model:ir.model.fields,field_description:website_forum.field_forum_forum_karma_close_all msgid "Close all posts" msgstr "" @@ -799,6 +804,11 @@ msgid "Close own posts" msgstr "" #. module: website_forum +#: model:ir.ui.view,arch_db:website_forum.close_post +msgid "Close post" +msgstr "" + +#. module: website_forum #: model:ir.model.fields,field_description:website_forum.field_forum_post_closed_uid msgid "Closed by" msgstr "" @@ -1205,6 +1215,7 @@ msgid "First upvote" msgstr "" #. module: website_forum +#: model:ir.ui.view,arch_db:website_forum.post_answers #: model:ir.ui.view,arch_db:website_forum.post_description_full msgid "Flag" msgstr "" @@ -1218,6 +1229,7 @@ msgstr "" #. module: website_forum #: selection:forum.post,state:0 #: model:ir.ui.view,arch_db:website_forum.moderation_queue +#: model:ir.ui.view,arch_db:website_forum.post_answers #: model:ir.ui.view,arch_db:website_forum.post_description_full msgid "Flagged" msgstr "" @@ -1592,6 +1604,11 @@ msgid "Links" msgstr "" #. module: website_forum +#: model:ir.ui.view,arch_db:website_forum.close_post +msgid "Mark as offensive" +msgstr "" + +#. module: website_forum #: model:ir.model.fields,field_description:website_forum.field_forum_forum_karma_moderate msgid "Moderate posts" msgstr "" @@ -1758,6 +1775,11 @@ msgid "Offensive" msgstr "" #. module: website_forum +#: model:ir.ui.view,arch_db:website_forum.close_post +msgid "Offensive Post" +msgstr "" + +#. module: website_forum #: model:ir.ui.view,arch_db:website_forum.post_answers msgid "On" msgstr "" diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index 3608b9b47c7..ce9f37dcf2d 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -631,7 +631,10 @@ <!-- Moderation: close a post --> <template id="close_post"> <t t-call="website_forum.header"> - <h1 class="mt0"><t t-esc="offensive and 'Offensive' or 'Close'"/> Post</h1> + <h1 class="mt0"> + <t t-if="offensive">Offensive Post</t> + <t t-if="not offensive">Close Post</t> + </h1> <p class="text-muted" t-if="not offensive"> If you close this post, it will be hidden for most users. Only users having a high karma can see closed posts to moderate @@ -668,7 +671,10 @@ </div> <div class="form-group"> <div class="col-md-offset-3 col-md-8"> - <button type="submit" class="btn btn-primary"><t t-esc="offensive and 'Mark as offensive' or 'Close post'"/></button> + <button type="submit" class="btn btn-primary"> + <t t-if="offensive">Mark as offensive</t> + <t t-if="not offensive">Close post</t> + </button> <span class="text-muted">or</span> <a class="btn btn-link" t-attf-href="/forum/#{ slug(forum) }/question/#{ slug(question) }">back to post</a> </div> @@ -1005,9 +1011,9 @@ <a t-attf-style="cursor: pointer;#{not answer.can_flag and 'color:#999;' or ''}" t-attf-class="flag fa fa-flag #{not answer.can_flag and 'karma_required' or ''}" t-attf-data-karma="#{not answer.can_flag and answer.forum_id.karma_flag or 0}" - t-attf-data-href="/forum/#{slug(forum)}/post/#{slug(answer)}/flag" - > - <t class="flag_flagged_label" t-esc="answer.state == 'flagged' and 'Flagged' or 'Flag'"/> + t-attf-data-href="/forum/#{slug(forum)}/post/#{slug(answer)}/flag"> + <t t-if="answer.state == 'flagged'">Flagged</t> + <t t-if="answer.state != 'flagged'">Flag</t> </a> </li> <li t-if="question.post_type == 'question'"> diff --git a/addons/website_sale/controllers/backend.py b/addons/website_sale/controllers/backend.py index d49889df47e..90a83208c9b 100644 --- a/addons/website_sale/controllers/backend.py +++ b/addons/website_sale/controllers/backend.py @@ -88,6 +88,7 @@ class WebsiteSaleBackend(WebsiteBackend): order_carts_abandoned_count=request.env['sale.order'].search_count(sale_order_domain + [ ('state', '=', 'draft'), ('order_line', '!=', 'False'), + ('partner_id', '!=', request.env.ref('base.public_partner').id), ('date_order', '<=', fields.Datetime.to_string(datetime.now() - timedelta(hours=1))), ]), payment_to_capture_count=request.env['payment.transaction'].search_count([ diff --git a/addons/website_sale/views/sale_order_views.xml b/addons/website_sale/views/sale_order_views.xml index 2f45988dbbf..3a7b291ec2b 100644 --- a/addons/website_sale/views/sale_order_views.xml +++ b/addons/website_sale/views/sale_order_views.xml @@ -7,8 +7,6 @@ <field name="arch" type="xml"> <search> <filter string="Confirmed Orders" name="order_confirmed" domain="[('state', 'in', ('sale', 'done'))]"/> - <separator/> - <filter string="From Website" name="from_website" domain="[('team_id.team_type', '=', 'website')]"/> </search> </field> </record> @@ -17,8 +15,8 @@ <field name="name">Orders</field> <field name="res_model">sale.order</field> <field name="view_mode">tree,form</field> - <field name="domain">[]</field> - <field name="context">{'show_sale': True, 'search_default_confirm_order': 1, 'search_default_from_website': 1}</field> + <field name="domain">[('team_id.team_type', '=', 'website')]</field> + <field name="context">{'show_sale': True, 'search_default_order_confirmed': 1}</field> <field name="search_view_id" ref="view_sales_order_filter_ecommerce"/> <field name="help">You don't have any confirmed order from the website.</field> </record> @@ -27,8 +25,8 @@ <field name="name">Unpaid Orders</field> <field name="res_model">sale.order</field> <field name="view_mode">tree,form</field> - <field name="domain">[('state', '=', 'sent')]</field> - <field name="context">{'show_sale': True, 'search_default_from_website': 1, 'create': False}</field> + <field name="domain">[('state', '=', 'sent'), ('team_id.team_type', '=', 'website')]</field> + <field name="context">{'show_sale': True, 'create': False}</field> <field name="search_view_id" ref="view_sales_order_filter_ecommerce"/> <field name="help">You don't have any unpaid order from the website.</field> </record> @@ -37,8 +35,8 @@ <field name="name">Abandoned Carts</field> <field name="res_model">sale.order</field> <field name="view_mode">tree,form</field> - <field name="domain">[('state', '=', 'draft'), ('order_line', '!=', False), ('date_order', '<=', (context_today() - datetime.timedelta(hours=1)).strftime('%Y-%m-%d'))]</field> - <field name="context">{'show_sale': True, 'search_default_from_website': 1, 'create': False}</field> + <field name="domain">[('state', '=', 'draft'), ('order_line', '!=', False), ('partner_id','!=', context.get('public_partner_id')), ('team_id.team_type', '=', 'website'), ('date_order', '<=', (datetime.datetime.utcnow() - datetime.timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S'))]</field> + <field name="context" eval="{'show_sale': True, 'create': False, 'public_partner_id': ref('base.public_partner')}"/> <field name="search_view_id" ref="view_sales_order_filter_ecommerce"/> <field name="help" type="xml"> <p>Find here all the abandoned carts, i.e. the carts generated by your website's visitors more than one hour ago and not confirmed.</p> @@ -49,8 +47,8 @@ <field name="name">Orders To Invoice</field> <field name="res_model">sale.order</field> <field name="view_mode">tree,form</field> - <field name="domain">[('state', 'in', ('sale', 'done')), ('invoice_status', '=', 'to invoice')]</field> - <field name="context">{'show_sale': True, 'search_default_from_website': 1, 'create': False}</field> + <field name="domain">[('state', 'in', ('sale', 'done')), ('invoice_status', '=', 'to invoice'), ('team_id.team_type', '=', 'website')]</field> + <field name="context">{'show_sale': True, 'search_default_order_confirmed': 1, 'create': False}</field> <field name="search_view_id" ref="view_sales_order_filter_ecommerce"/> <field name="help">You don't have any order from the website.</field> </record> |
