Compare commits

...

14 Commits

Author SHA1 Message Date
Kev-Roche
4f90a7fd91 [14.0][IMP] account_usability translation FR 2022-06-01 16:25:41 +02:00
Alexis de Lattre
1fd25be02f mail_no_portal: also remove the powered by Odoo at the bottom of the mail
Because the OCA/social module 'mail_debrand' doesn't work cf github.com/OCA/social/issues/839
2022-05-18 20:06:24 +02:00
Alexis de Lattre
174fac6d88 Add module mail_no_portal 2022-05-18 19:42:39 +02:00
Alexis de Lattre
9507d1fbd8 product_usability: add field barcode_type
Remove field barcode_code128, which was buggy
2022-05-16 19:30:48 +02:00
Alexis de Lattre
a89f1a9ae7 stock_valuation_xlsx: add barcode in report
Don't display '0' when the product code is empty
2022-05-16 19:30:05 +02:00
Alexis de Lattre
abb36545d9 stock_account_usability: add shortcut to stock.valuation.layer from product form view 2022-05-13 18:35:57 +02:00
Alexis de Lattre
296746ce6e stock_valuation_xlsx: restore past cost price support, using stock valuation layers
Don't replace the native menu entry any more.
Code refactoring between the 2 wizards
Improve multi-company support
2022-05-13 17:25:05 +02:00
Kev-Roche
d0a9ec27ef [UPD] pos_usability translation 2022-05-09 18:58:39 +02:00
beau sebastien
d3989e96d7 Merge pull request #171 from akretion/14.0-account-usability-add-balance
[IMP] add balance
2022-05-02 16:36:03 +02:00
Kev-Roche
f1a0aa6253 pos_usability : add pos initial amount 2022-04-27 22:02:38 +02:00
Alexis de Lattre
c7bd3319a9 product_usability: add a menu entry for UoMs in Configuration > Technique
This allows to have a menu entry for UoM even when the sale and stock
modules are NOT installed.
2022-04-22 08:58:43 +02:00
Sébastien BEAU
fe96425d84 [IMP] show team on partner in no dev mode 2022-04-12 12:30:26 +02:00
Sébastien BEAU
a59c2e774a [IMP] add balance 2022-04-11 13:43:40 +02:00
beau sebastien
cad0654983 Merge pull request #170 from akretion/14.0-add-company-tracking
[IMP] add tracking
2022-04-11 09:33:31 +02:00
26 changed files with 1158 additions and 132 deletions

View 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 ""

View File

@@ -242,6 +242,17 @@ class AccountMoveLine(models.Model):
compute='_compute_reconcile_string', string='Reconcile', store=True)
# for optional display in tree view
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):
self.ensure_one()

View File

@@ -70,6 +70,9 @@
<field name="matching_number" position="after">
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
</field>
<field name="credit" position="after">
<field name="balance" sum="Balance" />
</field>
</field>
</record>

View File

View 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,
}

View 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>

View File

@@ -4,20 +4,119 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-11 13:11+0000\n"
"PO-Revision-Date: 2019-10-11 15:11+0200\n"
"Last-Translator: <>\n"
"POT-Creation-Date: 2022-05-09 16:56+0000\n"
"PO-Revision-Date: 2022-05-09 18:57+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"
"Language: fr\n"
"X-Generator: Poedit 2.0.6\n"
"X-Generator: Poedit 3.0.1\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
#: model_terms:ir.ui.view,arch_db:pos_usability.report_saledetails
msgid "Amount"
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é. "

View File

@@ -15,6 +15,20 @@
<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>
<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>
</record>

View File

@@ -21,17 +21,21 @@ The usability enhancements include:
* 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>.
""",
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['product'],
"external_dependencies": {"python": ["stdnum"]},
'data': [
'views/product_supplierinfo_view.xml',
'views/product_pricelist_view.xml',
'views/product_pricelist_item.xml',
'views/product_template_view.xml',
'views/product_product.xml',
'views/uom_uom.xml',
'views/product_category_view.xml',
],
'installable': True,

View File

@@ -4,6 +4,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models, fields
from stdnum.ean import is_valid
class ProductProduct(models.Model):
@@ -13,9 +14,7 @@ class ProductProduct(models.Model):
barcode = fields.Char(tracking=20)
weight = fields.Float(tracking=30)
active = fields.Boolean(tracking=40)
barcode_code128 = fields.Char(
compute='_compute_barcode_code128',
help="Barcode in Code128-B with start char, checksum and stop char")
barcode_type = fields.Char(compute='_compute_barcode_type')
_sql_constraints = [(
# Maybe it could be better to have a constrain per company
@@ -28,30 +27,17 @@ class ProductProduct(models.Model):
'This internal reference already exists!')]
@api.model
def _compute_code128_checksum(self, code):
# This is NOT a full implementation of code128 checksum
csum = 104 # Start B
i = 0
for char in code:
i += 1
char_val = ord(char) - 32
csum += char_val * i
remainder = csum % 103
checksum = chr(remainder + 32)
return checksum
def _get_barcode_type(self, barcode):
barcode_type = False
if barcode:
size = len(barcode)
if size == 13 and is_valid(barcode):
barcode_type = 'EAN13'
elif size == 8 and is_valid(barcode):
barcode_type = 'EAN8'
return barcode_type
@api.depends('barcode')
def _compute_barcode_code128(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)
def _compute_barcode_type(self):
for product in self:
code128 = False
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
product.barcode_type = self._get_barcode_type(product.barcode)

View File

@@ -3,7 +3,7 @@
# @author Raphaël Valyi <rvalyi@akretion.com>
# 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):
@@ -31,3 +31,14 @@ class ProductTemplate(models.Model):
purchase_ok = fields.Boolean(tracking=90)
active = fields.Boolean(tracking=100)
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

View File

@@ -21,4 +21,16 @@
</field>
</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>

View File

@@ -19,4 +19,17 @@
</field>
</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>

View 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>

View File

@@ -22,6 +22,7 @@
'views/product_pricelist_item.xml',
'views/account_move.xml',
'views/res_company.xml',
"views/res_partner.xml",
],
'installable': True,
}

View 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>

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -22,6 +22,9 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
'author': 'Akretion',
'website': 'http://www.akretion.com',
'depends': ['stock_account', 'stock_usability'],
'data': ['views/stock_move.xml'],
'data': [
'views/stock_move.xml',
'views/product.xml',
],
'installable': True,
}

View File

@@ -0,0 +1 @@
from . import product

View 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

View 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>

View File

@@ -13,6 +13,8 @@
Stock Valuation XLSX
====================
This module is designed to work with *Cost Method* = **Average Cost (AVCO)**.
This module generate nice XLSX stock valuation reports either:
* from a physical inventory,

View File

@@ -124,7 +124,7 @@ class StockValuationXlsx(models.TransientModel):
return products.ids
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):
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)
return rules
def compute_product_data(
self, company_id, in_stock_product_ids, standard_price_past_date=False):
self.ensure_one()
logger.debug('Start compute_product_data')
ppo = self.env['product.product']
@api.model
def compute_product_data(self, company_id, filter_product_ids, standard_price_dict):
# standard_price_dict is a dictionnary with:
# keys = the keys that we expect in the result dict
# 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()
# if not standard_price_past_date: # TODO
if True:
# Do we need the present date?
if not all(standard_price_dict.values()):
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 = {}
for p in products:
logger.debug('p=%d', p['id'])
if standard_price_past_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_past_date)],
# ['cost'], order='datetime desc, id desc', limit=1)
#standard_price = history and history[0]['cost'] or 0.0
standard_price = p['standard_price'] # TODO remove this tmp stuff
else:
standard_price = p['standard_price']
product_id2data[p['id']] = {'standard_price': standard_price}
product_id2data[p['id']] = {}
for std_price_field_name, std_price_date in standard_price_dict.items():
if not std_price_date: # present
product_id2data[p['id']][std_price_field_name] = p['standard_price']
else:
layer_rg = svlo.read_group(
[
('product_id', '=', p['id']),
('company_id', '=', company_id),
('create_date', '<=', std_price_date),
],
['value', 'quantity'],
[])
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:
if pfield.endswith('_id'):
product_id2data[p['id']][pfield] = p[pfield][0]
@@ -381,9 +388,13 @@ class StockValuationXlsx(models.TransientModel):
elif self.source == 'inventory':
past_date = self.inventory_id.date
data, in_stock_products = self.compute_data_from_inventory(product_ids, prec_qty)
standard_price_past_date = past_date
if not (self.source == 'stock' and self.stock_date_type == 'present') and self.standard_price_date == 'present':
if self.source == 'stock' and self.stock_date_type == 'present':
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 = []
if apply_depreciation:
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())
product_id2data = self.compute_product_data(
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)
categ_id2name = self.product_categ_id2name(self.categ_ids)
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'])
for col_name, col in cols.items():
if not col.get('formula'):
if col.get('type') == 'date':
if l[col_name]:
l[col_name] = fields.Date.from_string(l[col_name])
else:
l[col_name] = '' # to avoid display of 31/12/1899
if not l[col_name]:
l[col_name] = '' # to avoid display of 31/12/1899 (dates) or '0' (char)
if col.get('type') == 'date' and l[col_name]:
l[col_name] = fields.Date.from_string(l[col_name])
sheet.write(i, col['pos'], l[col_name], styles[col['style']])
if categ_subtotal:
if categ_has_line:
@@ -590,6 +600,7 @@ class StockValuationXlsx(models.TransientModel):
def _prepare_cols(self):
cols = {
'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')},
'loc_name': {'width': 25, 'style': 'regular_small', 'sequence': 30, 'title': _('Location Name')},
'lot_name': {'width': 18, 'style': 'regular', 'sequence': 40, 'title': _('Lot')},

View File

@@ -41,17 +41,14 @@
</record>
<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="view_mode">form</field>
<field name="target">new</field>
</record>
<!-- Replace native menu, to avoid user confusion -->
<record id="stock_account.menu_valuation" model="ir.ui.menu">
<field name="action" ref="stock_valuation_xlsx.stock_valuation_xlsx_action"/>
<field name="name">Stock Valuation XLSX</field>
<field name="sequence">0</field>
</record>
<!-- in v14, I don't replace the native menu any more, because the native menu shows valuation layers,
which can be useful -->
<menuitem id="stock_valuation_xlsx_menu" action="stock_valuation_xlsx_action" sequence="115" parent="stock.menu_warehouse_report"/>
</odoo>

View File

@@ -106,59 +106,6 @@ class StockVariationXlsx(models.TransientModel):
products = self.env['product.product'].search(domain)
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):
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)
@@ -273,12 +220,13 @@ class StockVariationXlsx(models.TransientModel):
standard_price_start_date = standard_price_end_date = False
if self.standard_price_start_date_type == 'start':
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
product_id2data = self.compute_product_data(
company_id, list(product_data.keys()),
standard_price_start_date, standard_price_end_date)
product_id2data = svxo.compute_product_data(
company_id, list(product_data.keys()), {
'start_standard_price': standard_price_start_date,
'end_standard_price': standard_price_end_date})
categ_id2name = svxo.product_categ_id2name(self.categ_ids)
uom_id2name = svxo.uom_id2name()
res = self.stringify_and_sort_result(

View File

@@ -43,13 +43,13 @@
</record>
<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="view_mode">form</field>
<field name="target">new</field>
</record>
<!-- 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>