Compare commits
14 Commits
14.0-add-c
...
14.0-imp-a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4f90a7fd91 | ||
|
|
1fd25be02f | ||
|
|
174fac6d88 | ||
|
|
9507d1fbd8 | ||
|
|
a89f1a9ae7 | ||
|
|
abb36545d9 | ||
|
|
296746ce6e | ||
|
|
d0a9ec27ef | ||
|
|
d3989e96d7 | ||
|
|
f1a0aa6253 | ||
|
|
c7bd3319a9 | ||
|
|
fe96425d84 | ||
|
|
a59c2e774a | ||
|
|
cad0654983 |
732
account_usability/i18n/fr.po
Normal file
732
account_usability/i18n/fr.po
Normal file
@@ -0,0 +1,732 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_usability
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2022-06-01 14:17+0000\n"
|
||||||
|
"PO-Revision-Date: 2022-06-01 16:22+0200\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: fr\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
"X-Generator: Poedit 3.0.1\n"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"%d account groups already exists in company '%s'. This wizard is designed "
|
||||||
|
"to generate account groups from scratch."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_account
|
||||||
|
msgid "Account"
|
||||||
|
msgstr "Compte"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Account Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move_reversal
|
||||||
|
msgid "Account Move Reversal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_reconciliation_widget
|
||||||
|
msgid "Account Reconciliation widget"
|
||||||
|
msgstr "Outils de lettrage de compte"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_assets_id
|
||||||
|
msgid "Account Type Current Assets"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_liabilities_id
|
||||||
|
msgid "Account Type Current Liabilities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__account_reconcile
|
||||||
|
msgid "Allow Reconciliation"
|
||||||
|
msgstr "Autoriser le lettrage"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.constraint,message:account_usability.constraint_account_analytic_account_code_company_unique
|
||||||
|
msgid ""
|
||||||
|
"An analytic account with the same code already exists in the same company!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_analytic_account
|
||||||
|
msgid "Analytic Account"
|
||||||
|
msgstr "Compte analytique"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "Are you sure to unreconcile all the entrie of the bank statement?"
|
||||||
|
msgstr "Êtes-vous sûr de vouloir délettrer toute les écritures du relevés?"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__balance
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
||||||
|
msgid "Balance"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__partner_bank_id
|
||||||
|
msgid ""
|
||||||
|
"Bank Account Number to which the invoice will be paid. A Company bank "
|
||||||
|
"account if this is a Customer Invoice or Vendor Credit Note, otherwise a "
|
||||||
|
"Partner bank account number."
|
||||||
|
msgstr ""
|
||||||
|
"Numéro du compte bancaire sur lequel la facture sera payée. Un compte "
|
||||||
|
"bancaire de la Société s'il s'agit d'une facture client ou d'un avoir du "
|
||||||
|
"fournisseur, sinon un numéro de compte bancaire du tiers."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.ui.menu,name:account_usability.res_partner_bank_account_config_menu
|
||||||
|
msgid "Bank Accounts"
|
||||||
|
msgstr "Comptes bancaires"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_bank_statement
|
||||||
|
msgid "Bank Statement"
|
||||||
|
msgstr "Relevé bancaire"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_bank_statement_line
|
||||||
|
msgid "Bank Statement Line"
|
||||||
|
msgstr "Ligne de relevé bancaire"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.ui.menu,name:account_usability.res_bank_account_config_menu
|
||||||
|
msgid "Banks"
|
||||||
|
msgstr "Banques"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annuler"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__account_reconcile
|
||||||
|
msgid ""
|
||||||
|
"Check this box if this account allows invoices & payments matching of "
|
||||||
|
"journal items."
|
||||||
|
msgstr ""
|
||||||
|
"Cochez cette case si ce compte permet de faire du rapprochement entre "
|
||||||
|
"factures et paiements."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
|
msgid "Code"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_company
|
||||||
|
msgid "Companies"
|
||||||
|
msgstr "Sociétés"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "Paramètres de configuration"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_partner
|
||||||
|
msgid "Contact"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Créé par"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Créé le"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_credit_ids
|
||||||
|
msgid "Credit journal items that are matched with this journal item."
|
||||||
|
msgstr "Pièces au crédit qui correspondent à cette pièce."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Current Year"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__date
|
||||||
|
msgid "Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_debit_ids
|
||||||
|
msgid "Debit journal items that are matched with this journal item."
|
||||||
|
msgstr "Pièces au débit qui correspondent avec cette pièce."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Debit or Credit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nom affiché"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_date_due
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__invoice_date_due
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__invoice_date_due
|
||||||
|
msgid "Due Date"
|
||||||
|
msgstr "Date d'échéance"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__end_date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_search
|
||||||
|
msgid "End Date"
|
||||||
|
msgstr "Date de Fin"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_fiscal_position
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__property_account_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_users__property_account_position_id
|
||||||
|
msgid "Fiscal Position"
|
||||||
|
msgstr "Position fiscale"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_fiscalyear
|
||||||
|
msgid "Fiscal Year"
|
||||||
|
msgstr "Exercice"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_payment__fiscal_position_id
|
||||||
|
msgid ""
|
||||||
|
"Fiscal positions are used to adapt taxes and accounts for particular "
|
||||||
|
"customers or sales orders/invoices. The default value comes from the "
|
||||||
|
"customer."
|
||||||
|
msgstr ""
|
||||||
|
" Les positions fiscales sont utilisées pour adapter les taxes et les "
|
||||||
|
"comptes à des clients particuliers ou à des bons de commande/factures. La "
|
||||||
|
"valeur par défaut provient du client."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__full_reconcile_id
|
||||||
|
msgid "Full Reconcile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Fully Reconciled"
|
||||||
|
msgstr "Lettrage Complet"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid "Generate"
|
||||||
|
msgstr "Générer"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.actions.act_window,name:account_usability.account_group_generate_action
|
||||||
|
#: model:ir.model,name:account_usability.model_account_group_generate
|
||||||
|
#: model:ir.ui.menu,name:account_usability.account_group_generate_menu
|
||||||
|
msgid "Generate Account Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid "Generate account groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_analytic_account_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
|
msgid "Group"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
|
msgid "Group By"
|
||||||
|
msgstr "Regrouper par"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_attachment
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_attachment
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_attachment
|
||||||
|
msgid "Has Attachment"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_discount
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_discount
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_discount
|
||||||
|
msgid "Has Discount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__hide_bank_statement_balance
|
||||||
|
msgid "Hide Bank Statement Balance"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "Identifiant"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_incoterms
|
||||||
|
msgid "Incoterms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__transfer_account_id
|
||||||
|
msgid "Inter-Banks Transfer Account"
|
||||||
|
msgstr "Compte de transfert inter-bancaire"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_config_settings__transfer_account_id
|
||||||
|
msgid ""
|
||||||
|
"Intermediary account used when moving money from a liquidity account to "
|
||||||
|
"another"
|
||||||
|
msgstr ""
|
||||||
|
"Compte intermédiaire utilisé pour déplacer de l'argent d'un compte de "
|
||||||
|
"trésorerie vers un autre"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__product_barcode
|
||||||
|
msgid "International Article Number used for product identification."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__invoice_warn
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_users__invoice_warn
|
||||||
|
msgid "Invoice"
|
||||||
|
msgstr "Facture"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
|
msgid "Invoice Legal Terms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_line
|
||||||
|
msgid "Invoice Line"
|
||||||
|
msgstr "Lignes de facture"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_report_tree
|
||||||
|
msgid "Invoices Analysis"
|
||||||
|
msgstr "Analyse des factures"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_report
|
||||||
|
msgid "Invoices Statistics"
|
||||||
|
msgstr "Statistiques des factures"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_journal
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__journal_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__journal_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__journal_id
|
||||||
|
msgid "Journal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move
|
||||||
|
msgid "Journal Entry"
|
||||||
|
msgstr "Pièce comptable"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move_line
|
||||||
|
msgid "Journal Item"
|
||||||
|
msgstr "Écriture comptable"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Dernière modification le"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Mis à jour par"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Mis à jour le"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
|
msgid "Legal Terms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__static_invoice_terms
|
||||||
|
msgid "Legal Terms on Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__level
|
||||||
|
msgid "Level"
|
||||||
|
msgstr "Niveau"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.actions.act_window,name:account_usability.account_invoice_mark_sent_action
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Mark as Sent"
|
||||||
|
msgstr "Marquer comme envoyé"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Mark invoices as sent"
|
||||||
|
msgstr "Marquer les factures comme envoyé"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "Missing Attachment"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_partial_reconcile
|
||||||
|
msgid "Partial Reconcile"
|
||||||
|
msgstr "Lettrage partiel"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_credit_ids
|
||||||
|
msgid "Partial Reconcile Credit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_debit_ids
|
||||||
|
msgid "Partial Reconcile Debit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__industry_id
|
||||||
|
msgid "Partner Industry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_payment_term_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__invoice_payment_term_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__invoice_payment_term_id
|
||||||
|
msgid "Payment Terms"
|
||||||
|
msgstr "Conditions de paiement"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/account_move.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Please post the following entries before reconciliation :"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__name_prefix
|
||||||
|
msgid "Prefix"
|
||||||
|
msgstr "Préfixe"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_reconcile_model
|
||||||
|
msgid ""
|
||||||
|
"Preset to create journal entries during a invoices and payments matching"
|
||||||
|
msgstr ""
|
||||||
|
"Préconfigurer pour créer une écriture pendant la correspondance entre des "
|
||||||
|
"factures et des paiements"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Previous Year"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_form
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__product_barcode
|
||||||
|
msgid "Product Barcode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_product_template
|
||||||
|
msgid "Product Template"
|
||||||
|
msgstr "Modèle de produit"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_product__purchase_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__purchase_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__purchase_price_type
|
||||||
|
msgid "Purchase Price Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__partner_bank_id
|
||||||
|
msgid "Recipient Bank"
|
||||||
|
msgstr "Compte bancaire destinataire"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__reconcile_string
|
||||||
|
msgid "Reconcile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__ref
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__ref
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__ref
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr "Référence"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__date
|
||||||
|
msgid "Reversal date"
|
||||||
|
msgstr "Date de renversement"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__sale_dates
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__sale_dates
|
||||||
|
msgid "Sale Dates"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_product__sale_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__sale_price_type
|
||||||
|
msgid "Sale Price Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_partner__invoice_warn
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_users__invoice_warn
|
||||||
|
msgid ""
|
||||||
|
"Selecting the \"Warning\" option will notify user with the message, "
|
||||||
|
"Selecting \"Blocking Message\" will throw an exception with the message and "
|
||||||
|
"block the flow. The Message has to be written in the next field."
|
||||||
|
msgstr ""
|
||||||
|
"Sélectionner l'option 'Avertissement' notifiera l'utilisateur avec le "
|
||||||
|
"Message. Sélectionner 'Message Bloquant' lancera une exception avec le "
|
||||||
|
"message et bloquera le flux. Le Message doit être encodé dans le champ "
|
||||||
|
"suivant."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "Sent"
|
||||||
|
msgstr "Envoyé"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__start_date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_search
|
||||||
|
msgid "Start Date"
|
||||||
|
msgstr "Date de Début"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_product_supplierinfo
|
||||||
|
msgid "Supplier Pricelist"
|
||||||
|
msgstr "Liste prix fournisseur"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.product_supplierinfo_tree_view
|
||||||
|
msgid "Tax"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/product.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Tax excl."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/product.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Tax incl."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__balance
|
||||||
|
msgid ""
|
||||||
|
"Technical field holding the debit - credit in order to open meaningful "
|
||||||
|
"graph views from reports"
|
||||||
|
msgstr ""
|
||||||
|
"Champ technique égal à 'débit - crédit', utilisé pour les vues graphes dans "
|
||||||
|
"les rapports"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"The code of account '%s' is %d caracters. It cannot be inferior to level "
|
||||||
|
"(%d)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_partner__property_account_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_users__property_account_position_id
|
||||||
|
msgid ""
|
||||||
|
"The fiscal position determines the taxes/accounts used for this contact."
|
||||||
|
msgstr ""
|
||||||
|
"La position fiscale détermine les taxes / comptes utilisés pour ce contact."
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "The level must be >= 1."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__sale_dates
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_payment__sale_dates
|
||||||
|
msgid ""
|
||||||
|
"This information appears on invoice qweb report (you may use it for your "
|
||||||
|
"own report)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid ""
|
||||||
|
"This wizard is designed to auto-generate account groups from the chart of "
|
||||||
|
"account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid ""
|
||||||
|
"This wizard will mark as <i>sent</i> all the selected invoices in open or "
|
||||||
|
"paid state."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "To Send"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__amount_total
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__amount_total
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__amount_total
|
||||||
|
msgid "Total"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.res_config_settings_view_form
|
||||||
|
msgid ""
|
||||||
|
"Transit account when you transfer money from a bank account of your company "
|
||||||
|
"to another bank account of your company."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
|
msgid "Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "Unreconcile All"
|
||||||
|
msgstr "Tous délettrés"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Unreconciled or Partially Reconciled"
|
||||||
|
msgstr "Non Lettré ou Partiellement Lettré"
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "View Journal Entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
||||||
|
msgid "View Journal Entry Form"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_journal__hide_bank_statement_balance
|
||||||
|
msgid ""
|
||||||
|
"You may want to enable this option when your bank journal is generated from "
|
||||||
|
"a bank statement file that doesn't handle start/end balance (QIF for "
|
||||||
|
"instance) and you don't want to enter the start/end balance manually: it "
|
||||||
|
"will prevent the display of wrong information in the accounting dashboard "
|
||||||
|
"and on bank statements."
|
||||||
|
msgstr ""
|
||||||
@@ -242,6 +242,17 @@ class AccountMoveLine(models.Model):
|
|||||||
compute='_compute_reconcile_string', string='Reconcile', store=True)
|
compute='_compute_reconcile_string', string='Reconcile', store=True)
|
||||||
# for optional display in tree view
|
# for optional display in tree view
|
||||||
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
|
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
|
||||||
|
balance = fields.Monetary(
|
||||||
|
string='Balance',
|
||||||
|
default=0.0,
|
||||||
|
currency_field='company_currency_id',
|
||||||
|
compute="_compute_balance",
|
||||||
|
store=True)
|
||||||
|
|
||||||
|
@api.depends("credit", "debit")
|
||||||
|
def _compute_balance(self):
|
||||||
|
for line in self:
|
||||||
|
line.balance = line.debit - line.credit
|
||||||
|
|
||||||
def show_account_move_form(self):
|
def show_account_move_form(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
<field name="matching_number" position="after">
|
<field name="matching_number" position="after">
|
||||||
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
|
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
|
||||||
</field>
|
</field>
|
||||||
|
<field name="credit" position="after">
|
||||||
|
<field name="balance" sum="Balance" />
|
||||||
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
0
mail_no_portal/__init__.py
Normal file
0
mail_no_portal/__init__.py
Normal file
25
mail_no_portal/__manifest__.py
Normal file
25
mail_no_portal/__manifest__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Mail no portal',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Productivity/Discuss',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Remove portal button in mails sent by Odoo',
|
||||||
|
'description': """
|
||||||
|
This module remove the buttons such as *View Request for Quotation* in emails sent by Odoo.
|
||||||
|
|
||||||
|
This module has been written by Alexis de Lattre from Akretion
|
||||||
|
<alexis.delattre@akretion.com>.
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'maintainers': ['alexis-via'],
|
||||||
|
'website': 'https://www.akretion.com',
|
||||||
|
'depends': ['mail'],
|
||||||
|
'data': [
|
||||||
|
'data/mail.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
23
mail_no_portal/data/mail.xml
Normal file
23
mail_no_portal/data/mail.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<template id="mail_notification_paynow" inherit_id="mail.mail_notification_paynow">
|
||||||
|
<!-- Remove the portal button -->
|
||||||
|
<xpath expr="//t[@t-set='is_online']" position="attributes">
|
||||||
|
<attribute name="t-value">False</attribute>
|
||||||
|
</xpath>
|
||||||
|
<!-- Remove the Powered by Odoo -->
|
||||||
|
<xpath expr="//a[@target='_blank']/.." position="replace">
|
||||||
|
<td align="center" style="min-width: 590px; padding: 8px; font-size:11px;"></td>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -4,20 +4,119 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Odoo Server 12.0\n"
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-10-11 13:11+0000\n"
|
"POT-Creation-Date: 2022-05-09 16:56+0000\n"
|
||||||
"PO-Revision-Date: 2019-10-11 15:11+0200\n"
|
"PO-Revision-Date: 2022-05-09 18:57+0200\n"
|
||||||
"Last-Translator: <>\n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
"Language: fr\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
"Language: fr\n"
|
"X-Generator: Poedit 3.0.1\n"
|
||||||
"X-Generator: Poedit 2.0.6\n"
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_category__product_count
|
||||||
|
msgid "# Products"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:pos_usability.product_pos_category_form_view
|
||||||
|
msgid "<span class=\"o_stat_text\"> Products</span>"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. module: pos_usability
|
#. module: pos_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:pos_usability.report_saledetails
|
#: model_terms:ir.ui.view,arch_db:pos_usability.report_saledetails
|
||||||
msgid "Amount"
|
msgid "Amount"
|
||||||
msgstr "Montant"
|
msgstr "Montant"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_product__available_in_pos
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_template__available_in_pos
|
||||||
|
msgid "Available in POS"
|
||||||
|
msgstr "Disponible dans le PdV"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_payment_method__cash_journal_id
|
||||||
|
msgid "Cash Journal"
|
||||||
|
msgstr "Journal de caisse"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_product_product__pos_categ_id
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_product_template__pos_categ_id
|
||||||
|
msgid "Category used in the Point of Sale."
|
||||||
|
msgstr "Catégorie utilisé dans le point de vente"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_product_product__available_in_pos
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_product_template__available_in_pos
|
||||||
|
msgid "Check if you want this product to appear in the Point of Sale."
|
||||||
|
msgstr ""
|
||||||
|
"Cochez si vous souhaitez faire apparaître ce produit dans le Point de Vente"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_category__display_name
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_payment_method__display_name
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_template__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nom affiché"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_category__id
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_payment_method__id
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_template__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_category____last_update
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_pos_payment_method____last_update
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_template____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Dernière modification le"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model,name:pos_usability.model_pos_category
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_product__pos_categ_id
|
||||||
|
#: model:ir.model.fields,field_description:pos_usability.field_product_template__pos_categ_id
|
||||||
|
#: model_terms:ir.ui.view,arch_db:pos_usability.product_template_search_view
|
||||||
|
msgid "Point of Sale Category"
|
||||||
|
msgstr "Catégorie du point de vente"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model,name:pos_usability.model_pos_payment_method
|
||||||
|
msgid "Point of Sale Payment Methods"
|
||||||
|
msgstr "Modes de paiement au point de vente"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model,name:pos_usability.model_product_template
|
||||||
|
msgid "Product Template"
|
||||||
|
msgstr "Modèle d'article"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:pos_usability.view_pos_session_form
|
||||||
|
msgid "Starting Balance"
|
||||||
|
msgstr "Montant à l'ouverture"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:pos_usability.view_pos_session_form
|
||||||
|
msgid "Stats"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_pos_category__product_count
|
||||||
|
msgid ""
|
||||||
|
"The number of products under this point of sale category (does not consider "
|
||||||
|
"the children categories)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model:ir.model.fields,help:pos_usability.field_pos_payment_method__cash_journal_id
|
||||||
|
msgid ""
|
||||||
|
"The payment method is of type cash. A cash statement will be automatically "
|
||||||
|
"generated."
|
||||||
|
msgstr ""
|
||||||
|
"Cette méthode de paiement est de type cash. Un relevé sera automatiquement "
|
||||||
|
"généré. "
|
||||||
|
|||||||
@@ -15,6 +15,20 @@
|
|||||||
<button name="show_journal_items" position="after">
|
<button name="show_journal_items" position="after">
|
||||||
<button name="%(point_of_sale.action_report_pos_order_all)d" type="action" class="oe_stat_button" icon="fa-table" string="Stats" context="{'search_default_session_id': active_id}"/>
|
<button name="%(point_of_sale.action_report_pos_order_all)d" type="action" class="oe_stat_button" icon="fa-table" string="Stats" context="{'search_default_session_id': active_id}"/>
|
||||||
</button>
|
</button>
|
||||||
|
<xpath
|
||||||
|
expr="//field[@name='cash_register_total_entry_encoding']/parent::group"
|
||||||
|
position="before"
|
||||||
|
>
|
||||||
|
<group>
|
||||||
|
<field
|
||||||
|
style="text-align:right;margin:0;padding:0;"
|
||||||
|
name="cash_register_balance_start"
|
||||||
|
widget="monetary"
|
||||||
|
options="{'currency_field': 'currency_id'}"
|
||||||
|
string="Starting Balance"
|
||||||
|
/>
|
||||||
|
</group>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -21,17 +21,21 @@ The usability enhancements include:
|
|||||||
|
|
||||||
* hide description field on product (description_sale must be use instead of description)
|
* hide description field on product (description_sale must be use instead of description)
|
||||||
|
|
||||||
|
* add a field barcode_type in product form view
|
||||||
|
|
||||||
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
|
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
|
||||||
""",
|
""",
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['product'],
|
'depends': ['product'],
|
||||||
|
"external_dependencies": {"python": ["stdnum"]},
|
||||||
'data': [
|
'data': [
|
||||||
'views/product_supplierinfo_view.xml',
|
'views/product_supplierinfo_view.xml',
|
||||||
'views/product_pricelist_view.xml',
|
'views/product_pricelist_view.xml',
|
||||||
'views/product_pricelist_item.xml',
|
'views/product_pricelist_item.xml',
|
||||||
'views/product_template_view.xml',
|
'views/product_template_view.xml',
|
||||||
'views/product_product.xml',
|
'views/product_product.xml',
|
||||||
|
'views/uom_uom.xml',
|
||||||
'views/product_category_view.xml',
|
'views/product_category_view.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields
|
||||||
|
from stdnum.ean import is_valid
|
||||||
|
|
||||||
|
|
||||||
class ProductProduct(models.Model):
|
class ProductProduct(models.Model):
|
||||||
@@ -13,9 +14,7 @@ class ProductProduct(models.Model):
|
|||||||
barcode = fields.Char(tracking=20)
|
barcode = fields.Char(tracking=20)
|
||||||
weight = fields.Float(tracking=30)
|
weight = fields.Float(tracking=30)
|
||||||
active = fields.Boolean(tracking=40)
|
active = fields.Boolean(tracking=40)
|
||||||
barcode_code128 = fields.Char(
|
barcode_type = fields.Char(compute='_compute_barcode_type')
|
||||||
compute='_compute_barcode_code128',
|
|
||||||
help="Barcode in Code128-B with start char, checksum and stop char")
|
|
||||||
|
|
||||||
_sql_constraints = [(
|
_sql_constraints = [(
|
||||||
# Maybe it could be better to have a constrain per company
|
# Maybe it could be better to have a constrain per company
|
||||||
@@ -28,30 +27,17 @@ class ProductProduct(models.Model):
|
|||||||
'This internal reference already exists!')]
|
'This internal reference already exists!')]
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _compute_code128_checksum(self, code):
|
def _get_barcode_type(self, barcode):
|
||||||
# This is NOT a full implementation of code128 checksum
|
barcode_type = False
|
||||||
csum = 104 # Start B
|
if barcode:
|
||||||
i = 0
|
size = len(barcode)
|
||||||
for char in code:
|
if size == 13 and is_valid(barcode):
|
||||||
i += 1
|
barcode_type = 'EAN13'
|
||||||
char_val = ord(char) - 32
|
elif size == 8 and is_valid(barcode):
|
||||||
csum += char_val * i
|
barcode_type = 'EAN8'
|
||||||
remainder = csum % 103
|
return barcode_type
|
||||||
checksum = chr(remainder + 32)
|
|
||||||
return checksum
|
|
||||||
|
|
||||||
@api.depends('barcode')
|
@api.depends('barcode')
|
||||||
def _compute_barcode_code128(self):
|
def _compute_barcode_type(self):
|
||||||
# We use Code128-B. Useful info on code128:
|
|
||||||
# https://boowiki.info/art/codes-a-barres/code-128.html
|
|
||||||
# Use code128.ttf and copy it in /usr/local/share/fonts/
|
|
||||||
startb = chr(209)
|
|
||||||
stop = chr(211)
|
|
||||||
for product in self:
|
for product in self:
|
||||||
code128 = False
|
product.barcode_type = self._get_barcode_type(product.barcode)
|
||||||
barcode = product.barcode
|
|
||||||
if barcode and all([32 <= ord(x) <= 127 for x in barcode]):
|
|
||||||
checksum = self._compute_code128_checksum(barcode)
|
|
||||||
if checksum:
|
|
||||||
code128 = startb + barcode + checksum + stop
|
|
||||||
product.barcode_code128 = code128
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# @author Raphaël Valyi <rvalyi@akretion.com>
|
# @author Raphaël Valyi <rvalyi@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields
|
from odoo import api, models, fields
|
||||||
|
|
||||||
|
|
||||||
class ProductTemplate(models.Model):
|
class ProductTemplate(models.Model):
|
||||||
@@ -31,3 +31,14 @@ class ProductTemplate(models.Model):
|
|||||||
purchase_ok = fields.Boolean(tracking=90)
|
purchase_ok = fields.Boolean(tracking=90)
|
||||||
active = fields.Boolean(tracking=100)
|
active = fields.Boolean(tracking=100)
|
||||||
company_id = fields.Many2one(tracking=110)
|
company_id = fields.Many2one(tracking=110)
|
||||||
|
barcode_type = fields.Char(compute='_compute_template_barcode_type')
|
||||||
|
|
||||||
|
@api.depends('product_variant_ids.barcode')
|
||||||
|
def _compute_template_barcode_type(self):
|
||||||
|
ppo = self.env['product.product']
|
||||||
|
for template in self:
|
||||||
|
barcode_type = False
|
||||||
|
if len(template.product_variant_ids) == 1:
|
||||||
|
barcode = template.product_variant_ids.barcode
|
||||||
|
barcode_type = ppo._get_barcode_type(barcode)
|
||||||
|
template.barcode_type = barcode_type
|
||||||
|
|||||||
@@ -21,4 +21,16 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="product_normal_form_view" model="ir.ui.view">
|
||||||
|
<field name="name">usability.product.product.form</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="barcode" position="after">
|
||||||
|
<field name="barcode_type" attrs="{'invisible': [('barcode', '=', False)]}"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -19,4 +19,17 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- product template ONLY form view -->
|
||||||
|
<record id="product_template_only_form_view" model="ir.ui.view">
|
||||||
|
<field name="name">usability.product.template.ONLY.form</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="barcode" position="after">
|
||||||
|
<!-- barcode is False when the template has several variants anyway -->
|
||||||
|
<field name="barcode_type" attrs="{'invisible': [('barcode', '=', False)]}"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
22
product_usability/views/uom_uom.xml
Normal file
22
product_usability/views/uom_uom.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<!-- When the module stock and sale are not installed,
|
||||||
|
there is no menu entry for UoM ! These menu entry fixes this -->
|
||||||
|
|
||||||
|
<menuitem id="uom_config_menu" parent="base.menu_custom"
|
||||||
|
name="Units of Measure" sequence="150"/>
|
||||||
|
|
||||||
|
<menuitem id="uom_categ_config_menu" parent="uom_config_menu"
|
||||||
|
action="uom.product_uom_categ_form_action" sequence="10" />
|
||||||
|
|
||||||
|
<menuitem id="uom_uom_config_menu" parent="uom_config_menu"
|
||||||
|
action="uom.product_uom_form_action" sequence="20" />
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
'views/product_pricelist_item.xml',
|
'views/product_pricelist_item.xml',
|
||||||
'views/account_move.xml',
|
'views/account_move.xml',
|
||||||
'views/res_company.xml',
|
'views/res_company.xml',
|
||||||
|
"views/res_partner.xml",
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
15
sale_usability/views/res_partner.xml
Normal file
15
sale_usability/views/res_partner.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="res_partner_view_team" model="ir.ui.view">
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="inherit_id" ref="sales_team.res_partner_view_team" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<!-- team_id should be visible in no developper mode -->
|
||||||
|
<field name="team_id" position="attributes">
|
||||||
|
<attribute name="groups"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
|
|||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['stock_account', 'stock_usability'],
|
'depends': ['stock_account', 'stock_usability'],
|
||||||
'data': ['views/stock_move.xml'],
|
'data': [
|
||||||
|
'views/stock_move.xml',
|
||||||
|
'views/product.xml',
|
||||||
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
1
stock_account_usability/models/__init__.py
Normal file
1
stock_account_usability/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import product
|
||||||
38
stock_account_usability/models/product.py
Normal file
38
stock_account_usability/models/product.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = 'product.template'
|
||||||
|
|
||||||
|
def action_open_stock_valuation_layer(self):
|
||||||
|
self.ensure_one()
|
||||||
|
ppo = self.env['product.product']
|
||||||
|
if len(self.product_variant_ids) == 1:
|
||||||
|
action = ppo._get_stock_valuation_layer_action(self.product_variant_ids.id)
|
||||||
|
else:
|
||||||
|
action = ppo._get_stock_valuation_layer_action()
|
||||||
|
action["domain"] = [('product_id', 'in', self.product_variant_ids.ids)]
|
||||||
|
return action
|
||||||
|
|
||||||
|
|
||||||
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = 'product.product'
|
||||||
|
|
||||||
|
def action_open_stock_valuation_layer(self):
|
||||||
|
self.ensure_one()
|
||||||
|
return self._get_stock_valuation_layer_action(self.id)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_stock_valuation_layer_action(self, product_id=None):
|
||||||
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
|
"stock_account.stock_valuation_layer_action")
|
||||||
|
if product_id:
|
||||||
|
action["context"] = {
|
||||||
|
'search_default_product_id': product_id,
|
||||||
|
'search_default_group_by_product_id': 1,
|
||||||
|
}
|
||||||
|
return action
|
||||||
54
stock_account_usability/views/product.xml
Normal file
54
stock_account_usability/views/product.xml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<record id="product_product_to_inventory_valuation" model="ir.actions.act_window">
|
||||||
|
<field name="name">Inventory Valuation</field>
|
||||||
|
<field name="res_model">stock.valuation.layer</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="groups_id" eval="[(4, ref('stock.group_stock_manager'))]"/>
|
||||||
|
<field name="context">{'search_default_group_by_product_id': 1, 'search_default_product_id': active_id}</field>
|
||||||
|
<field name="binding_model_id" ref="product.model_product_product" />
|
||||||
|
<field name="binding_view_types">form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
-->
|
||||||
|
<!-- product template only form view -->
|
||||||
|
<record id="product_template_form_view_procurement_button" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<div name="button_box" position="inside">
|
||||||
|
<button class="oe_stat_button"
|
||||||
|
name="action_open_stock_valuation_layer"
|
||||||
|
string="Inventory Valuation"
|
||||||
|
icon="fa-usd"
|
||||||
|
type="object" attrs="{'invisible': [('type', '!=', 'product')]}">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- product.product only form view -->
|
||||||
|
<record id="product_form_view_procurement_button" model="ir.ui.view">
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<div name="button_box" position="inside">
|
||||||
|
<button class="oe_stat_button"
|
||||||
|
name="action_open_stock_valuation_layer"
|
||||||
|
string="Inventory Valuation"
|
||||||
|
icon="fa-usd"
|
||||||
|
type="object" attrs="{'invisible': [('type', '!=', 'product')]}">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -13,6 +13,8 @@
|
|||||||
Stock Valuation XLSX
|
Stock Valuation XLSX
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
This module is designed to work with *Cost Method* = **Average Cost (AVCO)**.
|
||||||
|
|
||||||
This module generate nice XLSX stock valuation reports either:
|
This module generate nice XLSX stock valuation reports either:
|
||||||
|
|
||||||
* from a physical inventory,
|
* from a physical inventory,
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
return products.ids
|
return products.ids
|
||||||
|
|
||||||
def _prepare_product_fields(self):
|
def _prepare_product_fields(self):
|
||||||
return ['uom_id', 'name', 'default_code', 'categ_id']
|
return ['uom_id', 'name', 'default_code', 'barcode', 'categ_id']
|
||||||
|
|
||||||
def _prepare_expiry_depreciation_rules(self, company_id, past_date):
|
def _prepare_expiry_depreciation_rules(self, company_id, past_date):
|
||||||
rules = self.env['stock.expiry.depreciation.rule'].search_read([('company_id', '=', company_id)], ['start_limit_days', 'ratio'], order='start_limit_days desc')
|
rules = self.env['stock.expiry.depreciation.rule'].search_read([('company_id', '=', company_id)], ['start_limit_days', 'ratio'], order='start_limit_days desc')
|
||||||
@@ -137,33 +137,40 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
logger.debug('depreciation_rules=%s', rules)
|
logger.debug('depreciation_rules=%s', rules)
|
||||||
return rules
|
return rules
|
||||||
|
|
||||||
def compute_product_data(
|
@api.model
|
||||||
self, company_id, in_stock_product_ids, standard_price_past_date=False):
|
def compute_product_data(self, company_id, filter_product_ids, standard_price_dict):
|
||||||
self.ensure_one()
|
# standard_price_dict is a dictionnary with:
|
||||||
logger.debug('Start compute_product_data')
|
# keys = the keys that we expect in the result dict
|
||||||
ppo = self.env['product.product']
|
# values : a datetime object (for past date) or False (False means PRESENT)
|
||||||
|
logger.debug(
|
||||||
|
'Start compute_product_data standard_price_dict=%s', standard_price_dict)
|
||||||
|
ppo = self.env['product.product'].with_company(company_id)
|
||||||
|
svlo = self.env['stock.valuation.layer']
|
||||||
fields_list = self._prepare_product_fields()
|
fields_list = self._prepare_product_fields()
|
||||||
# if not standard_price_past_date: # TODO
|
# Do we need the present date?
|
||||||
if True:
|
if not all(standard_price_dict.values()):
|
||||||
fields_list.append('standard_price')
|
fields_list.append('standard_price')
|
||||||
products = ppo.search_read([('id', 'in', in_stock_product_ids)], fields_list)
|
products = ppo.search_read([('id', 'in', filter_product_ids)], fields_list)
|
||||||
product_id2data = {}
|
product_id2data = {}
|
||||||
for p in products:
|
for p in products:
|
||||||
logger.debug('p=%d', p['id'])
|
logger.debug('p=%d', p['id'])
|
||||||
if standard_price_past_date:
|
product_id2data[p['id']] = {}
|
||||||
# No more product.price.history on v14
|
for std_price_field_name, std_price_date in standard_price_dict.items():
|
||||||
# We are supposed to use stock.valuation.layer.revaluation
|
if not std_price_date: # present
|
||||||
# TODO migrate to stock.valuation.layer.revaluation
|
product_id2data[p['id']][std_price_field_name] = p['standard_price']
|
||||||
#history = ppho.search_read([
|
else:
|
||||||
# ('company_id', '=', company_id),
|
layer_rg = svlo.read_group(
|
||||||
# ('product_id', '=', p['id']),
|
[
|
||||||
# ('datetime', '<=', standard_price_past_date)],
|
('product_id', '=', p['id']),
|
||||||
# ['cost'], order='datetime desc, id desc', limit=1)
|
('company_id', '=', company_id),
|
||||||
#standard_price = history and history[0]['cost'] or 0.0
|
('create_date', '<=', std_price_date),
|
||||||
standard_price = p['standard_price'] # TODO remove this tmp stuff
|
],
|
||||||
else:
|
['value', 'quantity'],
|
||||||
standard_price = p['standard_price']
|
[])
|
||||||
product_id2data[p['id']] = {'standard_price': standard_price}
|
standard_price = 0
|
||||||
|
if layer_rg and layer_rg[0]['quantity']:
|
||||||
|
standard_price = layer_rg[0]['value'] / layer_rg[0]['quantity']
|
||||||
|
product_id2data[p['id']][std_price_field_name] = standard_price
|
||||||
for pfield in fields_list:
|
for pfield in fields_list:
|
||||||
if pfield.endswith('_id'):
|
if pfield.endswith('_id'):
|
||||||
product_id2data[p['id']][pfield] = p[pfield][0]
|
product_id2data[p['id']][pfield] = p[pfield][0]
|
||||||
@@ -381,9 +388,13 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
elif self.source == 'inventory':
|
elif self.source == 'inventory':
|
||||||
past_date = self.inventory_id.date
|
past_date = self.inventory_id.date
|
||||||
data, in_stock_products = self.compute_data_from_inventory(product_ids, prec_qty)
|
data, in_stock_products = self.compute_data_from_inventory(product_ids, prec_qty)
|
||||||
standard_price_past_date = past_date
|
if self.source == 'stock' and self.stock_date_type == 'present':
|
||||||
if not (self.source == 'stock' and self.stock_date_type == 'present') and self.standard_price_date == 'present':
|
|
||||||
standard_price_past_date = False
|
standard_price_past_date = False
|
||||||
|
else: # field standard_price_date is shown on screen
|
||||||
|
if self.standard_price_date == 'present':
|
||||||
|
standard_price_past_date = False
|
||||||
|
else:
|
||||||
|
standard_price_past_date = past_date
|
||||||
depreciation_rules = []
|
depreciation_rules = []
|
||||||
if apply_depreciation:
|
if apply_depreciation:
|
||||||
depreciation_rules = self._prepare_expiry_depreciation_rules(company_id, past_date)
|
depreciation_rules = self._prepare_expiry_depreciation_rules(company_id, past_date)
|
||||||
@@ -394,7 +405,7 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
in_stock_product_ids = list(in_stock_products.keys())
|
in_stock_product_ids = list(in_stock_products.keys())
|
||||||
product_id2data = self.compute_product_data(
|
product_id2data = self.compute_product_data(
|
||||||
company_id, in_stock_product_ids,
|
company_id, in_stock_product_ids,
|
||||||
standard_price_past_date=standard_price_past_date)
|
{'standard_price': standard_price_past_date})
|
||||||
data_res = self.group_result(data, split_by_lot, split_by_location)
|
data_res = self.group_result(data, split_by_lot, split_by_location)
|
||||||
categ_id2name = self.product_categ_id2name(self.categ_ids)
|
categ_id2name = self.product_categ_id2name(self.categ_ids)
|
||||||
uom_id2name = self.uom_id2name()
|
uom_id2name = self.uom_id2name()
|
||||||
@@ -506,11 +517,10 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
sheet.write_formula(i, cols['subtotal']['pos'], subtotal_formula, styles['regular_currency'], l['subtotal'])
|
sheet.write_formula(i, cols['subtotal']['pos'], subtotal_formula, styles['regular_currency'], l['subtotal'])
|
||||||
for col_name, col in cols.items():
|
for col_name, col in cols.items():
|
||||||
if not col.get('formula'):
|
if not col.get('formula'):
|
||||||
if col.get('type') == 'date':
|
if not l[col_name]:
|
||||||
if l[col_name]:
|
l[col_name] = '' # to avoid display of 31/12/1899 (dates) or '0' (char)
|
||||||
l[col_name] = fields.Date.from_string(l[col_name])
|
if col.get('type') == 'date' and l[col_name]:
|
||||||
else:
|
l[col_name] = fields.Date.from_string(l[col_name])
|
||||||
l[col_name] = '' # to avoid display of 31/12/1899
|
|
||||||
sheet.write(i, col['pos'], l[col_name], styles[col['style']])
|
sheet.write(i, col['pos'], l[col_name], styles[col['style']])
|
||||||
if categ_subtotal:
|
if categ_subtotal:
|
||||||
if categ_has_line:
|
if categ_has_line:
|
||||||
@@ -590,6 +600,7 @@ class StockValuationXlsx(models.TransientModel):
|
|||||||
def _prepare_cols(self):
|
def _prepare_cols(self):
|
||||||
cols = {
|
cols = {
|
||||||
'default_code': {'width': 18, 'style': 'regular', 'sequence': 10, 'title': _('Product Code')},
|
'default_code': {'width': 18, 'style': 'regular', 'sequence': 10, 'title': _('Product Code')},
|
||||||
|
'barcode': {'width': 18, 'style': 'regular', 'sequence': 10, 'title': _('Product Barcode')},
|
||||||
'product_name': {'width': 40, 'style': 'regular', 'sequence': 20, 'title': _('Product Name')},
|
'product_name': {'width': 40, 'style': 'regular', 'sequence': 20, 'title': _('Product Name')},
|
||||||
'loc_name': {'width': 25, 'style': 'regular_small', 'sequence': 30, 'title': _('Location Name')},
|
'loc_name': {'width': 25, 'style': 'regular_small', 'sequence': 30, 'title': _('Location Name')},
|
||||||
'lot_name': {'width': 18, 'style': 'regular', 'sequence': 40, 'title': _('Lot')},
|
'lot_name': {'width': 18, 'style': 'regular', 'sequence': 40, 'title': _('Lot')},
|
||||||
|
|||||||
@@ -41,17 +41,14 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="stock_valuation_xlsx_action" model="ir.actions.act_window">
|
<record id="stock_valuation_xlsx_action" model="ir.actions.act_window">
|
||||||
<field name="name">Stock Valuation XLSX</field>
|
<field name="name">Inventory Valuation XLSX</field>
|
||||||
<field name="res_model">stock.valuation.xlsx</field>
|
<field name="res_model">stock.valuation.xlsx</field>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="target">new</field>
|
<field name="target">new</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Replace native menu, to avoid user confusion -->
|
<!-- in v14, I don't replace the native menu any more, because the native menu shows valuation layers,
|
||||||
<record id="stock_account.menu_valuation" model="ir.ui.menu">
|
which can be useful -->
|
||||||
<field name="action" ref="stock_valuation_xlsx.stock_valuation_xlsx_action"/>
|
<menuitem id="stock_valuation_xlsx_menu" action="stock_valuation_xlsx_action" sequence="115" parent="stock.menu_warehouse_report"/>
|
||||||
<field name="name">Stock Valuation XLSX</field>
|
|
||||||
<field name="sequence">0</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -106,59 +106,6 @@ class StockVariationXlsx(models.TransientModel):
|
|||||||
products = self.env['product.product'].search(domain)
|
products = self.env['product.product'].search(domain)
|
||||||
return products.ids
|
return products.ids
|
||||||
|
|
||||||
def _prepare_product_fields(self):
|
|
||||||
return ['uom_id', 'name', 'default_code', 'categ_id']
|
|
||||||
|
|
||||||
def compute_product_data(
|
|
||||||
self, company_id, filter_product_ids,
|
|
||||||
standard_price_start_date=False, standard_price_end_date=False):
|
|
||||||
self.ensure_one()
|
|
||||||
logger.debug('Start compute_product_data')
|
|
||||||
ppo = self.env['product.product']
|
|
||||||
fields_list = self._prepare_product_fields()
|
|
||||||
# if not standard_price_start_date or not standard_price_end_date: # TODO
|
|
||||||
if True:
|
|
||||||
fields_list.append('standard_price')
|
|
||||||
products = ppo.search_read([('id', 'in', filter_product_ids)], fields_list)
|
|
||||||
product_id2data = {}
|
|
||||||
for p in products:
|
|
||||||
logger.debug('p=%d', p['id'])
|
|
||||||
if standard_price_start_date:
|
|
||||||
# No more product.price.history on v14
|
|
||||||
# We are supposed to use stock.valuation.layer.revaluation
|
|
||||||
# TODO migrate to stock.valuation.layer.revaluation
|
|
||||||
#history = ppho.search_read([
|
|
||||||
# ('company_id', '=', company_id),
|
|
||||||
# ('product_id', '=', p['id']),
|
|
||||||
# ('datetime', '<=', standard_price_start_date)],
|
|
||||||
# ['cost'], order='datetime desc, id desc', limit=1)
|
|
||||||
#start_standard_price = history and history[0]['cost'] or 0.0
|
|
||||||
start_standard_price = p['standard_price'] # TODO remove this tmp stuff
|
|
||||||
else:
|
|
||||||
start_standard_price = p['standard_price']
|
|
||||||
if standard_price_end_date:
|
|
||||||
#history = ppho.search_read([
|
|
||||||
# ('company_id', '=', company_id),
|
|
||||||
# ('product_id', '=', p['id']),
|
|
||||||
# ('datetime', '<=', standard_price_end_date)],
|
|
||||||
# ['cost'], order='datetime desc, id desc', limit=1)
|
|
||||||
#end_standard_price = history and history[0]['cost'] or 0.0
|
|
||||||
end_standard_price = p['standard_price'] # TODO remove this tmp stuff
|
|
||||||
else:
|
|
||||||
end_standard_price = p['standard_price']
|
|
||||||
|
|
||||||
product_id2data[p['id']] = {
|
|
||||||
'start_standard_price': start_standard_price,
|
|
||||||
'end_standard_price': end_standard_price,
|
|
||||||
}
|
|
||||||
for pfield in fields_list:
|
|
||||||
if pfield.endswith('_id'):
|
|
||||||
product_id2data[p['id']][pfield] = p[pfield][0]
|
|
||||||
else:
|
|
||||||
product_id2data[p['id']][pfield] = p[pfield]
|
|
||||||
logger.debug('End compute_product_data')
|
|
||||||
return product_id2data
|
|
||||||
|
|
||||||
def compute_data_from_stock(self, product_ids, prec_qty, start_date, end_date_type, end_date, company_id):
|
def compute_data_from_stock(self, product_ids, prec_qty, start_date, end_date_type, end_date, company_id):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
logger.debug('Start compute_data_from_stock past_date=%s end_date_type=%s, end_date=%s', start_date, end_date_type, end_date)
|
logger.debug('Start compute_data_from_stock past_date=%s end_date_type=%s, end_date=%s', start_date, end_date_type, end_date)
|
||||||
@@ -273,12 +220,13 @@ class StockVariationXlsx(models.TransientModel):
|
|||||||
standard_price_start_date = standard_price_end_date = False
|
standard_price_start_date = standard_price_end_date = False
|
||||||
if self.standard_price_start_date_type == 'start':
|
if self.standard_price_start_date_type == 'start':
|
||||||
standard_price_start_date = self.start_date
|
standard_price_start_date = self.start_date
|
||||||
if self.standard_price_end_date_type == 'end':
|
if self.standard_price_end_date_type == 'end' and self.end_date_type == 'past':
|
||||||
standard_price_end_date = self.end_date
|
standard_price_end_date = self.end_date
|
||||||
|
|
||||||
product_id2data = self.compute_product_data(
|
product_id2data = svxo.compute_product_data(
|
||||||
company_id, list(product_data.keys()),
|
company_id, list(product_data.keys()), {
|
||||||
standard_price_start_date, standard_price_end_date)
|
'start_standard_price': standard_price_start_date,
|
||||||
|
'end_standard_price': standard_price_end_date})
|
||||||
categ_id2name = svxo.product_categ_id2name(self.categ_ids)
|
categ_id2name = svxo.product_categ_id2name(self.categ_ids)
|
||||||
uom_id2name = svxo.uom_id2name()
|
uom_id2name = svxo.uom_id2name()
|
||||||
res = self.stringify_and_sort_result(
|
res = self.stringify_and_sort_result(
|
||||||
|
|||||||
@@ -43,13 +43,13 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="stock_variation_xlsx_action" model="ir.actions.act_window">
|
<record id="stock_variation_xlsx_action" model="ir.actions.act_window">
|
||||||
<field name="name">Stock Variation XLSX</field>
|
<field name="name">Inventory Variation XLSX</field>
|
||||||
<field name="res_model">stock.variation.xlsx</field>
|
<field name="res_model">stock.variation.xlsx</field>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="target">new</field>
|
<field name="target">new</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Replace native menu, to avoid user confusion -->
|
<!-- Replace native menu, to avoid user confusion -->
|
||||||
<menuitem id="stock_variation_xlsx_menu" action="stock_variation_xlsx_action" parent="stock.menu_warehouse_report" sequence="1"/>
|
<menuitem id="stock_variation_xlsx_menu" action="stock_variation_xlsx_action" parent="stock.menu_warehouse_report" sequence="119"/>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
Reference in New Issue
Block a user