From 6b8d47f5c0212aceba359c4909c1e2e6a8fb1e1e Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 21 Feb 2022 22:52:54 +0100 Subject: [PATCH 01/10] Add module account_cash_deposit This module manages cash deposits (cash to bank) and cash orders (bank to cash) --- account_cash_deposit/README.rst | 1 + account_cash_deposit/__init__.py | 2 + account_cash_deposit/__manifest__.py | 30 + account_cash_deposit/data/cash_unit_cad.xml | 96 +++ account_cash_deposit/data/cash_unit_chf.xml | 122 ++++ account_cash_deposit/data/cash_unit_eur.xml | 139 ++++ account_cash_deposit/data/cash_unit_usd.xml | 122 ++++ account_cash_deposit/data/sequence.xml | 22 + .../i18n/account_cash_deposit.pot | 672 +++++++++++++++++ account_cash_deposit/i18n/fr.po | 675 ++++++++++++++++++ account_cash_deposit/models/__init__.py | 3 + .../models/account_cash_deposit.py | 418 +++++++++++ account_cash_deposit/models/cash_unit.py | 148 ++++ account_cash_deposit/models/res_currency.py | 11 + account_cash_deposit/readme/CONFIGURE.rst | 11 + account_cash_deposit/readme/CONTRIBUTORS.rst | 1 + account_cash_deposit/readme/DESCRIPTION.rst | 1 + account_cash_deposit/readme/USAGE.rst | 13 + account_cash_deposit/report/report.xml | 20 + .../report/report_cashdeposit.xml | 104 +++ .../security/ir.model.access.csv | 6 + account_cash_deposit/security/security.xml | 13 + .../static/description/cash_deposit_form.png | Bin 0 -> 93239 bytes .../static/description/currency_form_view.png | Bin 0 -> 79946 bytes account_cash_deposit/tests/__init__.py | 1 + .../tests/test_cash_deposit.py | 129 ++++ .../views/account_cash_deposit.xml | 218 ++++++ account_cash_deposit/views/cash_unit.xml | 72 ++ account_cash_deposit/views/res_currency.xml | 21 + account_cash_deposit/wizards/__init__.py | 1 + .../wizards/account_cash_order_reception.py | 27 + .../account_cash_order_reception_view.xml | 42 ++ 32 files changed, 3141 insertions(+) create mode 100644 account_cash_deposit/README.rst create mode 100644 account_cash_deposit/__init__.py create mode 100644 account_cash_deposit/__manifest__.py create mode 100644 account_cash_deposit/data/cash_unit_cad.xml create mode 100644 account_cash_deposit/data/cash_unit_chf.xml create mode 100644 account_cash_deposit/data/cash_unit_eur.xml create mode 100644 account_cash_deposit/data/cash_unit_usd.xml create mode 100644 account_cash_deposit/data/sequence.xml create mode 100644 account_cash_deposit/i18n/account_cash_deposit.pot create mode 100644 account_cash_deposit/i18n/fr.po create mode 100644 account_cash_deposit/models/__init__.py create mode 100644 account_cash_deposit/models/account_cash_deposit.py create mode 100644 account_cash_deposit/models/cash_unit.py create mode 100644 account_cash_deposit/models/res_currency.py create mode 100644 account_cash_deposit/readme/CONFIGURE.rst create mode 100644 account_cash_deposit/readme/CONTRIBUTORS.rst create mode 100644 account_cash_deposit/readme/DESCRIPTION.rst create mode 100644 account_cash_deposit/readme/USAGE.rst create mode 100644 account_cash_deposit/report/report.xml create mode 100644 account_cash_deposit/report/report_cashdeposit.xml create mode 100644 account_cash_deposit/security/ir.model.access.csv create mode 100644 account_cash_deposit/security/security.xml create mode 100644 account_cash_deposit/static/description/cash_deposit_form.png create mode 100644 account_cash_deposit/static/description/currency_form_view.png create mode 100644 account_cash_deposit/tests/__init__.py create mode 100644 account_cash_deposit/tests/test_cash_deposit.py create mode 100644 account_cash_deposit/views/account_cash_deposit.xml create mode 100644 account_cash_deposit/views/cash_unit.xml create mode 100644 account_cash_deposit/views/res_currency.xml create mode 100644 account_cash_deposit/wizards/__init__.py create mode 100644 account_cash_deposit/wizards/account_cash_order_reception.py create mode 100644 account_cash_deposit/wizards/account_cash_order_reception_view.xml diff --git a/account_cash_deposit/README.rst b/account_cash_deposit/README.rst new file mode 100644 index 00000000..262ac821 --- /dev/null +++ b/account_cash_deposit/README.rst @@ -0,0 +1 @@ +Will be auto-generated from readme subdir diff --git a/account_cash_deposit/__init__.py b/account_cash_deposit/__init__.py new file mode 100644 index 00000000..aee8895e --- /dev/null +++ b/account_cash_deposit/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/account_cash_deposit/__manifest__.py b/account_cash_deposit/__manifest__.py new file mode 100644 index 00000000..160692c8 --- /dev/null +++ b/account_cash_deposit/__manifest__.py @@ -0,0 +1,30 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Account Cash Deposit", + "version": "14.0.1.0.0", + "category": "Accounting", + "license": "AGPL-3", + "summary": "Manage cash deposits and cash orders", + "author": "Akretion, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/account-financial-tools", + "depends": ["account"], + "data": [ + "security/ir.model.access.csv", + "security/security.xml", + "wizards/account_cash_order_reception_view.xml", + "data/sequence.xml", + "data/cash_unit_eur.xml", + "data/cash_unit_usd.xml", + "data/cash_unit_chf.xml", + "data/cash_unit_cad.xml", + "views/account_cash_deposit.xml", + "views/cash_unit.xml", + "views/res_currency.xml", + "report/report.xml", + "report/report_cashdeposit.xml", + ], + "installable": True, +} diff --git a/account_cash_deposit/data/cash_unit_cad.xml b/account_cash_deposit/data/cash_unit_cad.xml new file mode 100644 index 00000000..7c08897a --- /dev/null +++ b/account_cash_deposit/data/cash_unit_cad.xml @@ -0,0 +1,96 @@ + + + + + + + note + 100 + + + + note + 50 + deposit + + + + note + 20 + deposit + + + + note + 10 + deposit + + + + note + 5 + deposit + + + + coin + 2 + + + + coin + 1 + + + + coin + 0.25 + + + + coin + 0.1 + + + + coin + 0.05 + + + + + coinroll + 2 + 25 + + + + coinroll + 1 + 25 + + + + coinroll + 0.25 + 40 + + + + coinroll + 0.1 + 50 + + + + coinroll + 0.05 + 40 + + diff --git a/account_cash_deposit/data/cash_unit_chf.xml b/account_cash_deposit/data/cash_unit_chf.xml new file mode 100644 index 00000000..f9aab062 --- /dev/null +++ b/account_cash_deposit/data/cash_unit_chf.xml @@ -0,0 +1,122 @@ + + + + + + + note + 1000 + + + + note + 200 + + + + note + 100 + + + + note + 50 + deposit + + + + note + 20 + deposit + + + + note + 10 + deposit + + + + coin + 5 + + + + coin + 2 + + + + coin + 1 + + + + coin + 0.5 + + + + coin + 0.2 + + + + coin + 0.1 + + + + coin + 0.05 + + + + + coinroll + 5 + 50 + + + + coinroll + 2 + 50 + + + + coinroll + 1 + 50 + + + + coinroll + 0.5 + 50 + + + + coinroll + 0.2 + 50 + + + + coinroll + 0.1 + 50 + + + + coinroll + 0.05 + 50 + + + diff --git a/account_cash_deposit/data/cash_unit_eur.xml b/account_cash_deposit/data/cash_unit_eur.xml new file mode 100644 index 00000000..a02195db --- /dev/null +++ b/account_cash_deposit/data/cash_unit_eur.xml @@ -0,0 +1,139 @@ + + + + + + + note + 500 + + + + note + 200 + + + + note + 100 + + + + note + 50 + deposit + + + + note + 20 + deposit + + + + note + 10 + deposit + + + + note + 5 + deposit + + + + coin + 2 + + + + coin + 1 + + + + coin + 0.5 + + + + coin + 0.2 + + + + coin + 0.1 + + + + coin + 0.05 + + + + coin + 0.02 + + + + coin + 0.01 + + + + + coinroll + 2 + 25 + + + + coinroll + 1 + 25 + + + + coinroll + 0.5 + 40 + + + + coinroll + 0.2 + 40 + + + + coinroll + 0.1 + 40 + + + + coinroll + 0.05 + 50 + + + + coinroll + 0.02 + 50 + + + + coinroll + 0.01 + 50 + + + diff --git a/account_cash_deposit/data/cash_unit_usd.xml b/account_cash_deposit/data/cash_unit_usd.xml new file mode 100644 index 00000000..4c844c56 --- /dev/null +++ b/account_cash_deposit/data/cash_unit_usd.xml @@ -0,0 +1,122 @@ + + + + + + + note + 100 + + + + note + 50 + deposit + + + + note + 20 + deposit + + + + note + 10 + deposit + + + + note + 5 + deposit + + + + note + 2 + deposit + + + + note + 1 + deposit + + + + + + + coin + 1 + + + + coin + 0.5 + + + + coin + 0.25 + + + + coin + 0.1 + + + + coin + 0.05 + + + + coin + 0.01 + + + + + coinroll + 1 + 25 + + + + coinroll + 0.5 + 20 + + + + coinroll + 0.25 + 40 + + + + coinroll + 0.1 + 50 + + + + coinroll + 0.05 + 40 + + + + coinroll + 0.01 + 50 + + + diff --git a/account_cash_deposit/data/sequence.xml b/account_cash_deposit/data/sequence.xml new file mode 100644 index 00000000..054307fb --- /dev/null +++ b/account_cash_deposit/data/sequence.xml @@ -0,0 +1,22 @@ + + + + + Account Cash Deposit + account.cash.deposit + CASH-DEP- + 3 + + + + Account Cash Order + account.cash.order + CASH-ORDER- + 3 + + + diff --git a/account_cash_deposit/i18n/account_cash_deposit.pot b/account_cash_deposit/i18n/account_cash_deposit.pot new file mode 100644 index 00000000..144d1b9a --- /dev/null +++ b/account_cash_deposit/i18n/account_cash_deposit.pot @@ -0,0 +1,672 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_cash_deposit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-03 17:51+0000\n" +"PO-Revision-Date: 2022-03-03 17:51+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Currency:" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Date:" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Order Date:" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Total:" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_name_company_unique +msgid "" +"A cash deposit/order with this reference already exists in this company." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_cash_unit_unique +msgid "A line already exists for this cash unit." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__active +msgid "Active" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_ids +msgid "Activities" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_state +msgid "Activity State" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.cash_unit_form +msgid "Archived" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__auto_create +msgid "Auto Create" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Back to Draft" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__bank_journal_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Bank Account" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank Account Number to Credit:" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank Account Number to Debit:" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank:" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__both +msgid "Both" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_order_reception_form +msgid "Cancel" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__cash_journal_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Cash Box" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__operation_type__deposit +msgid "Cash Deposit" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_account_cash_deposit_line +msgid "Cash Deposit Lines" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.actions.report,name:account_cash_deposit.report_account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_account_cash_deposit +msgid "Cash Deposit/Order" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_deposit_action +#: model:ir.ui.menu,name:account_cash_deposit.account_cash_deposit_menu +msgid "Cash Deposits" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__order_id +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__operation_type__order +msgid "Cash Order" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_order_reception_action +#: model:ir.model,name:account_cash_deposit.model_account_cash_order_reception +msgid "Cash Order Reception" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_order_action +#: model:ir.ui.menu,name:account_cash_deposit.account_cash_order_menu +msgid "Cash Orders" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Cash Received" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__date +msgid "Cash Reception Date" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.cash_unit_action +#: model:ir.model,name:account_cash_deposit.model_cash_unit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__cash_unit_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Cash Unit" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__cash_unit_ids +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.view_currency_form +msgid "Cash Units" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/wizards/account_cash_order_reception.py:0 +#, python-format +msgid "Cash reception confirmed on %s." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__coin +msgid "Coin" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__coinroll_qty +msgid "Coin Quantity" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__coinroll +msgid "Coin Roll" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__company_id +msgid "Company" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_order_reception_form +msgid "Confirm Cash Reception" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Confirm Order" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__confirmed +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Confirmed" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__create_uid +msgid "Created by" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__create_date +msgid "Created on" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_res_currency +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__currency_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Currency" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__date +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Date" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__deposit +msgid "Deposit" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__display_name +msgid "Display Name" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__done +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Done" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__draft +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Draft" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/cash_unit.py:0 +#, python-format +msgid "For a coin roll, the coin quantity must be strictly positive." +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Group By" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__id +msgid "ID" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_needaction +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_unread +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__auto_create +msgid "" +"If set, a line for this cash unit will be created by default on a new cash " +"deposit or a new cash order or both." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__move_id +msgid "Journal Entry" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__line_ids +msgid "Lines" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_ids +msgid "Messages" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "Missing Outstanding Payments Account on bank journal '%s'." +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "Missing Outstanding Receipts Account on bank journal '%s'." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__note +msgid "Note" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__notes +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Notes" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "" +"On {deposit}, the cash journal {cash_journal} is not in the selected " +"currency {currency}." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__operation_type +msgid "Operation Type" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__order +msgid "Order" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__order_date +msgid "Order Date" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__parent_id +msgid "Parent" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Print" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__qty +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Quantity" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__is_reconcile +msgid "Reconcile" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__name +msgid "Reference" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__state +msgid "Status" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__subtotal +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Subtotal" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "The %s is not in draft state, so you cannot delete it." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_coinroll_qty_positive +msgid "The coin quantity must be positive." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_qty_positive +msgid "The quantity must be positive or null." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_value_positive +msgid "The value must be strictly positive." +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "There are no non-zero lines on %s!" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__cash_type +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__coinroll_qty +msgid "This field should never be modified." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__value +msgid "" +"This field should never be modified. For a coin roll, you must enter the " +"value of the coin." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__total_amount +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__total_amount +msgid "Total Amount" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__total_value +msgid "Total Value" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__tree_order +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__tree_order +msgid "Tree Order" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__cash_type +msgid "Type" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__date +msgid "Used as date for the journal entry." +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Validate" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__value +msgid "Value" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "" +"You must delete cash lines that are linked to a currency other than %s." +msgstr "" diff --git a/account_cash_deposit/i18n/fr.po b/account_cash_deposit/i18n/fr.po new file mode 100644 index 00000000..db138319 --- /dev/null +++ b/account_cash_deposit/i18n/fr.po @@ -0,0 +1,675 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_cash_deposit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-03 11:19+0000\n" +"PO-Revision-Date: 2022-03-03 11:19+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Currency:" +msgstr "Devise :" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Date:" +msgstr "Date :" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Order Date:" +msgstr "Date de commande :" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Total:" +msgstr "Total :" + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_name_company_unique +msgid "" +"A cash deposit/order with this reference already exists in this company." +msgstr "Une commande/remise d'espèces existe déjà avec cette référence dans la même société." + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_cash_unit_unique +msgid "A line already exists for this cash unit." +msgstr "Une ligne existe déjà avec cette unité d'espèces." + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__active +msgid "Active" +msgstr "Actif" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_ids +msgid "Activities" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_state +msgid "Activity State" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.cash_unit_form +msgid "Archived" +msgstr "Archivé" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__auto_create +msgid "Auto Create" +msgstr "Création automatique" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Back to Draft" +msgstr "Retour en brouillon" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__bank_journal_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Bank Account" +msgstr "Compte bancaire" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank Account Number to Credit:" +msgstr "Numéro de compte bancaire à créditer :" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank Account Number to Debit:" +msgstr "Numéro de compte bancaire à débiter :" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Bank:" +msgstr "Banque :" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__both +msgid "Both" +msgstr "Les deux" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_order_reception_form +msgid "Cancel" +msgstr "Annuler" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__cash_journal_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Cash Box" +msgstr "Caisse" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__operation_type__deposit +msgid "Cash Deposit" +msgstr "Remise d'espèces" + +#. module: account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_account_cash_deposit_line +msgid "Cash Deposit Lines" +msgstr "Lignes de remise d'espèces" + +#. module: account_cash_deposit +#: model:ir.actions.report,name:account_cash_deposit.report_account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_account_cash_deposit +msgid "Cash Deposit/Order" +msgstr "Commande/remise d'espèces" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_deposit_action +#: model:ir.ui.menu,name:account_cash_deposit.account_cash_deposit_menu +msgid "Cash Deposits" +msgstr "Remises d'espèces" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__order_id +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__operation_type__order +msgid "Cash Order" +msgstr "Commande d'espèces" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_order_reception_action +#: model:ir.model,name:account_cash_deposit.model_account_cash_order_reception +msgid "Cash Order Reception" +msgstr "Réception de la commande d'espèces" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.account_cash_order_action +#: model:ir.ui.menu,name:account_cash_deposit.account_cash_order_menu +msgid "Cash Orders" +msgstr "Commandes d'espèces" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Cash Received" +msgstr "Èspèces reçues" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__date +msgid "Cash Reception Date" +msgstr "Date de réception des espèces" + +#. module: account_cash_deposit +#: model:ir.actions.act_window,name:account_cash_deposit.cash_unit_action +#: model:ir.model,name:account_cash_deposit.model_cash_unit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__cash_unit_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Cash Unit" +msgstr "Unité d'espèces" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__cash_unit_ids +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.view_currency_form +msgid "Cash Units" +msgstr "Unités d'espèces" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/wizards/account_cash_order_reception.py:0 +#, python-format +msgid "Cash reception confirmed on %s." +msgstr "Réception d'espèces confirmée le %s." + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__coin +msgid "Coin" +msgstr "Pièce" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__coinroll_qty +msgid "Coin Quantity" +msgstr "Quantité de pièces" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__coinroll +msgid "Coin Roll" +msgstr "Rouleau de pièces" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__company_id +msgid "Company" +msgstr "Société" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_order_reception_form +msgid "Confirm Cash Reception" +msgstr "Confirmer la réception d'espèces" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Confirm Order" +msgstr "Confirmer la commande" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__confirmed +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Confirmed" +msgstr "Confirmé" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__create_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__create_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: account_cash_deposit +#: model:ir.model,name:account_cash_deposit.model_res_currency +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__currency_id +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__currency_id +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Currency" +msgstr "Devise" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__date +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Date" +msgstr "Date" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__deposit +msgid "Deposit" +msgstr "Remise" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__display_name +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__done +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Done" +msgstr "Fait" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__account_cash_deposit__state__draft +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Draft" +msgstr "Brouillon" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/cash_unit.py:0 +#, python-format +msgid "For a coin roll, the coin quantity must be strictly positive." +msgstr "Pour un rouleau d'espèces, la quantité de pièces doit être strictement positive." + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search +msgid "Group By" +msgstr "Groupé par" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__id +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency__id +msgid "ID" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_needaction +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_unread +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__auto_create +msgid "" +"If set, a line for this cash unit will be created by default on a new cash " +"deposit or a new cash order or both." +msgstr "Si coché, une ligne sera créé par défault pour cette unité d'espèce " +"sur les nouvelles remises d'espèce ou les nouvelles commandes d'espèces ou les deux." + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__move_id +msgid "Journal Entry" +msgstr "Pièce comptable" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit____last_update +#: model:ir.model.fields,field_description:account_cash_deposit.field_res_currency____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__write_uid +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__write_date +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__line_ids +msgid "Lines" +msgstr "Lignes" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_ids +msgid "Messages" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "Missing Outstanding Payments Account on bank journal '%s'." +msgstr "Compte de paiements sortants non configuré sur le journal de banque '%s'." + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "Missing Outstanding Receipts Account on bank journal '%s'." +msgstr "Compte de paiements entrants non configuré sur le journal de banque '%s'." + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__cash_type__note +msgid "Note" +msgstr "Billet" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__notes +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Notes" +msgstr "Notes" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "" +"On {deposit}, the cash journal {cash_journal} is not in the selected " +"currency {currency}." +msgstr "Sur {deposit}, la caisse {cash_journal} n'est pas dans la devise " +"sélectionnée {currency}." + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__operation_type +msgid "Operation Type" +msgstr "Type d'opération" + +#. module: account_cash_deposit +#: model:ir.model.fields.selection,name:account_cash_deposit.selection__cash_unit__auto_create__order +msgid "Order" +msgstr "Commande" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__order_date +msgid "Order Date" +msgstr "Date de commande" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__parent_id +msgid "Parent" +msgstr "Parent" + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Print" +msgstr "Imprimer" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__qty +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Quantity" +msgstr "Quantité" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__is_reconcile +msgid "Reconciled" +msgstr "Lettré" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__name +msgid "Reference" +msgstr "Référence" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__state +msgid "Status" +msgstr "État" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__subtotal +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit +msgid "Subtotal" +msgstr "Sous-total" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "The %s is not in draft state, so you cannot delete it." +msgstr "La %s n'est pas à l'état brouillon, donc vous ne pouvez pas la supprimer." + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_coinroll_qty_positive +msgid "The coin quantity must be positive." +msgstr "La quantité de pièces doit être positive." + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_qty_positive +msgid "The quantity must be positive or null." +msgstr "La quantité doit être positive ou nulle." + +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_value_positive +msgid "The value must be strictly positive." +msgstr "La valeur doit être strictement positive." + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "There are no non-zero lines on %s!" +msgstr "Il n'y a aucune ligne non nulle sur %s !" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__cash_type +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__coinroll_qty +msgid "This field should never be modified." +msgstr "Ce champ ne doit jamais être modifié." + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_cash_unit__value +msgid "" +"This field should never be modified. For a coin roll, you must enter the " +"value of the coin." +msgstr "Ce champ ne doit jamais être modifié. Pour un rouleau de pièces, " +"vous devez entrer la valeur de la pièce." + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__total_amount +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_order_reception__total_amount +msgid "Total Amount" +msgstr "Montant total" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__total_value +msgid "Total Value" +msgstr "Valeur totale" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit_line__tree_order +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__tree_order +msgid "Tree Order" +msgstr "Ordre dans la liste" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__cash_type +msgid "Type" +msgstr "Type" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__date +msgid "Used as date for the journal entry." +msgstr "Utilisé commande date pour la pièce comptable." + +#. module: account_cash_deposit +#: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_form +msgid "Validate" +msgstr "Valider" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_cash_unit__value +msgid "Value" +msgstr "Valeur" + +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "" +"You must delete cash lines that are linked to a currency other than %s." +msgstr "Vous devez supprimer les lignes liées à une devise autre que %s." diff --git a/account_cash_deposit/models/__init__.py b/account_cash_deposit/models/__init__.py new file mode 100644 index 00000000..9a7db64d --- /dev/null +++ b/account_cash_deposit/models/__init__.py @@ -0,0 +1,3 @@ +from . import cash_unit +from . import res_currency +from . import account_cash_deposit diff --git a/account_cash_deposit/models/account_cash_deposit.py b/account_cash_deposit/models/account_cash_deposit.py new file mode 100644 index 00000000..5d7750c0 --- /dev/null +++ b/account_cash_deposit/models/account_cash_deposit.py @@ -0,0 +1,418 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + + +class AccountCashDeposit(models.Model): + _name = "account.cash.deposit" + _description = "Cash Deposit/Order" + _inherit = ["mail.thread", "mail.activity.mixin"] + _order = "date desc, id desc" + _check_company_auto = True + + name = fields.Char( + string="Reference", size=64, readonly=True, default="/", copy=False + ) + operation_type = fields.Selection( + [ + ("deposit", "Cash Deposit"), + ("order", "Cash Order"), + ], + required=True, + string="Operation Type", + readonly=True, + ) + line_ids = fields.One2many( + "account.cash.deposit.line", + "parent_id", + string="Lines", + readonly=True, + states={"draft": [("readonly", "=", False)]}, + ) + order_date = fields.Date( + default=fields.Date.context_today, + readonly=True, + states={"draft": [("readonly", "=", False)]}, + ) + date = fields.Date( + string="Date", + readonly=True, + tracking=True, + copy=False, + help="Used as date for the journal entry.", + ) + cash_journal_id = fields.Many2one( + "account.journal", + string="Cash Box", + domain="[('company_id', '=', company_id), ('type', '=', 'cash')]", + required=True, + check_company=True, + readonly=True, + states={"draft": [("readonly", "=", False)]}, + tracking=True, + ) + currency_id = fields.Many2one( + "res.currency", + string="Currency", + required=True, + tracking=True, + readonly=True, + states={"draft": [("readonly", "=", False)]}, + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("confirmed", "Confirmed"), # step only for orders, not for deposits + ("done", "Done"), + ], + string="Status", + default="draft", + readonly=True, + tracking=True, + ) + move_id = fields.Many2one( + "account.move", + string="Journal Entry", + readonly=True, + check_company=True, + ) + bank_journal_id = fields.Many2one( + "account.journal", + string="Bank Account", + required=True, + domain="[('company_id', '=', company_id), ('type', '=', 'bank'), " + "('bank_account_id', '!=', False)]", + check_company=True, + readonly=True, + states={"draft": [("readonly", "=", False)]}, + tracking=True, + ) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + readonly=True, + states={"draft": [("readonly", "=", False)]}, + tracking=True, + ) + total_amount = fields.Monetary( + compute="_compute_total_amount", + string="Total Amount", + store=True, + currency_field="currency_id", + tracking=True, + ) + is_reconcile = fields.Boolean( + compute="_compute_is_reconcile", store=True, string="Reconciled" + ) + notes = fields.Text() + + _sql_constraints = [ + ( + "name_company_unique", + "unique(company_id, name)", + "A cash deposit/order with this reference already exists in this company.", + ) + ] + + @api.constrains("cash_journal_id", "currency_id") + def _check_deposit(self): + for rec in self: + if rec.currency_id and rec.cash_journal_id: + if ( + rec.cash_journal_id.currency_id + and rec.currency_id != rec.cash_journal_id.currency_id + ) or ( + not rec.cash_journal_id.currency_id + and rec.currency_id != rec.company_id.currency_id + ): + raise ValidationError( + _( + "On {deposit}, the cash journal {cash_journal} is not " + "in the selected currency {currency}." + ).format( + deposit=rec.display_name, + cash_journal=rec.cash_journal_id.display_name, + currency=rec.currency_id.name, + ) + ) + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + ajo = self.env["account.journal"] + company = self.env.company + currency = company.currency_id + # pre-set cash_journal_id and bank_journal_id if there is only one + domain = [("company_id", "=", company.id)] + cash_journals = ajo.search( + domain + + [ + ("type", "=", "cash"), + "|", + ("currency_id", "=", False), + ("currency_id", "=", currency.id), + ] + ) + if len(cash_journals) == 1: + res["cash_journal_id"] = cash_journals.id + bank_journals = ajo.search( + domain + [("type", "=", "bank"), ("bank_account_id", "!=", False)] + ) + if len(bank_journals) == 1: + res["bank_journal_id"] = bank_journals.id + res.update( + { + "company_id": company.id, + "currency_id": currency.id, + } + ) + if res.get("operation_type"): + cash_units = self.env["cash.unit"].search( + [ + ("auto_create", "in", ("both", res["operation_type"])), + ("currency_id", "=", currency.id), + ] + ) + res["line_ids"] = [(0, 0, {"cash_unit_id": cu.id}) for cu in cash_units] + return res + + @api.depends("line_ids.subtotal") + def _compute_total_amount(self): + rg_res = self.env["account.cash.deposit.line"].read_group( + [("parent_id", "in", self.ids)], + ["parent_id", "subtotal"], + ["parent_id"], + ) + mapped_data = {x["parent_id"][0]: x["subtotal"] for x in rg_res} + for rec in self: + rec.total_amount = mapped_data.get(rec.id, 0) + + @api.depends("move_id.line_ids.reconciled", "company_id") + def _compute_is_reconcile(self): + for rec in self: + reconcile = False + if rec.move_id: + for line in rec.move_id.line_ids: + if ( + line.account_id.id != rec.cash_journal_id.default_account_id.id + and line.reconciled + ): + reconcile = True + rec.is_reconcile = reconcile + + def unlink(self): + for rec in self: + if rec.state != "draft": + raise UserError( + _("The %s is not in draft state, so you cannot delete it.") + % rec.display_name + ) + return super().unlink() + + def backtodraft(self): + for rec in self: + if rec.move_id: + move = rec.move_id + # It will raise here if journal_id.update_posted = False + if move.state == "posted": + move.button_draft() + move.unlink() + rec.write({"state": "draft"}) + + @api.model + def create(self, vals): + if "company_id" in vals: + self = self.with_company(vals["company_id"]) + if vals.get("name", "/") == "/": + if ( + vals.get("operation_type") == "order" + or self._context.get("default_operation_type") == "order" + ): + vals["name"] = self.env["ir.sequence"].next_by_code( + "account.cash.order", vals.get("order_date") + ) + else: + vals["name"] = self.env["ir.sequence"].next_by_code( + "account.cash.deposit" + ) + return super().create(vals) + + def name_get(self): + res = [] + type2label = dict( + self.fields_get("operation_type", "selection")["operation_type"][ + "selection" + ] + ) + for rec in self: + res.append((rec.id, " ".join([type2label[self.operation_type], self.name]))) + return res + + def confirm_order(self): + self.ensure_one() + assert self.operation_type == "order", "Wrong operation type" + self._del_empty_lines() + self.write({"state": "confirmed"}) + + def _del_empty_lines(self, raise_if_empty=True): + self.ensure_one() + self.line_ids.filtered(lambda x: x.qty == 0).unlink() + if raise_if_empty and not self.line_ids: + raise UserError(_("There are no non-zero lines on %s!") % self.display_name) + + def _prepare_account_move(self, vals): + self.ensure_one() + date = vals["date"] + op_type = self.operation_type + total_amount_comp_cur = self.currency_id._convert( + self.total_amount, self.company_id.currency_id, self.company_id, date + ) + if not self.company_id.transfer_account_id: + raise UserError(_("The Inter-Banks Transfer Account is not configured.")) + bank_account_id = self.company_id.transfer_account_id.id + + cash_debit = cash_credit = bank_debit = bank_credit = 0.0 + if op_type == "deposit": + cash_credit = total_amount_comp_cur + bank_debit = total_amount_comp_cur + else: + cash_debit = total_amount_comp_cur + bank_credit = total_amount_comp_cur + # Cash move line + cash_vals = { + "account_id": self.cash_journal_id.default_account_id.id, + "partner_id": False, + "debit": cash_debit, + "credit": cash_credit, + "currency_id": self.currency_id.id, + "amount_currency": self.total_amount * (op_type == "deposit" and -1 or 1), + } + # Bank move line + bank_vals = { + "account_id": bank_account_id, + "partner_id": False, + "debit": bank_debit, + "credit": bank_credit, + "currency_id": self.currency_id.id, + "amount_currency": self.total_amount * (op_type == "deposit" and 1 or -1), + } + move_vals = { + "journal_id": self.cash_journal_id.id, + "date": date, + "ref": self.display_name, + "company_id": self.company_id.id, + "line_ids": [(0, 0, cash_vals), (0, 0, bank_vals)], + } + return move_vals + + def _prepare_validate(self, force_date=None): + vals = {"state": "done"} + if force_date: + vals["date"] = force_date + else: + vals["date"] = fields.Date.context_today(self) + return vals + + def validate(self, force_date=None): + self.ensure_one() + self._del_empty_lines() + vals = self._prepare_validate(force_date=force_date) + move_vals = self._prepare_account_move(vals) + move = self.env["account.move"].create(move_vals) + move.action_post() + vals["move_id"] = move.id + self.write(vals) + + @api.onchange("currency_id") + def currency_change(self): + if self.currency_id and self.operation_type: + line_obj = self.env["account.cash.deposit.line"] + new_lines = self.env["account.cash.deposit.line"] + cash_units = self.env["cash.unit"].search( + [ + ("auto_create", "in", ("both", self.operation_type)), + ("currency_id", "=", self.currency_id.id), + ] + ) + for cunit in cash_units: + new_lines += line_obj.new({"cash_unit_id": cunit.id}) + self.line_ids = new_lines + domain = [("company_id", "=", self.company_id.id), ("type", "=", "cash")] + if self.currency_id == self.company_id.currency_id: + cash_journals = self.env["account.journal"].search( + domain + + [ + "|", + ("currency_id", "=", False), + ("currency_id", "=", self.currency_id.id), + ] + ) + if len(cash_journals) == 1: + self.cash_journal_id = cash_journals.id + else: + self.cash_journal_id = False + else: + cash_journals = self.env["account.journal"].search( + domain + [("currency_id", "=", self.currency_id.id)] + ) + if len(cash_journals) == 1: + self.cash_journal_id = cash_journals.id + else: + self.cash_journal_id = False + + def get_report(self): + report = self.env.ref("account_cash_deposit.report_account_cash_deposit") + action = report.with_context({"discard_logo_check": True}).report_action(self) + return action + + +class AccountCashDepositLine(models.Model): + _name = "account.cash.deposit.line" + _description = "Cash Deposit Lines" + _order = "tree_order desc" + + parent_id = fields.Many2one("account.cash.deposit", ondelete="cascade") + qty = fields.Integer(string="Quantity") + cash_unit_id = fields.Many2one( + "cash.unit", required=True, domain="[('currency_id', '=', currency_id)]" + ) + tree_order = fields.Float(related="cash_unit_id.tree_order", store=True) + subtotal = fields.Monetary(compute="_compute_subtotal", store=True) + currency_id = fields.Many2one(related="parent_id.currency_id", store=True) + + _sql_constraints = [ + ("qty_positive", "CHECK(qty >= 0)", "The quantity must be positive or null."), + ( + "cash_unit_unique", + "unique(cash_unit_id, parent_id)", + "A line already exists for this cash unit.", + ), + ] + + @api.constrains("currency_id", "cash_unit_id") + def _check_lines(self): + for line in self: + if ( + line.currency_id + and line.cash_unit_id + and line.currency_id != line.cash_unit_id.currency_id + ): + raise ValidationError( + _( + "You must delete cash lines that are linked to a currency " + "other than %s." + ) + % line.currency_id.name + ) + + @api.depends("cash_unit_id", "qty") + def _compute_subtotal(self): + for line in self: + subtotal = 0 + if line.cash_unit_id: + subtotal = line.cash_unit_id.total_value * line.qty + line.subtotal = subtotal diff --git a/account_cash_deposit/models/cash_unit.py b/account_cash_deposit/models/cash_unit.py new file mode 100644 index 00000000..f2a44316 --- /dev/null +++ b/account_cash_deposit/models/cash_unit.py @@ -0,0 +1,148 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.tools.misc import format_amount + + +class CashUnit(models.Model): + _name = "cash.unit" + _description = "Cash Unit" + _order = "currency_id, tree_order desc" + _rec_name = "value" + + currency_id = fields.Many2one("res.currency", ondelete="cascade") + active = fields.Boolean(default=True) + tree_order = fields.Float(compute="_compute_all", store=True) + cash_type = fields.Selection( + [ + ("note", "Note"), + ("coin", "Coin"), + ("coinroll", "Coin Roll"), + ], + string="Type", + required=True, + help="This field should never be modified.", + ) + coinroll_qty = fields.Integer( + string="Coin Quantity", help="This field should never be modified." + ) + value = fields.Monetary( + required=True, + help="This field should never be modified. For a coin roll, " + "you must enter the value of the coin.", + ) + total_value = fields.Monetary(compute="_compute_all", store=True) + auto_create = fields.Selection( + [ + ("deposit", "Deposit"), + ("order", "Order"), + ("both", "Both"), + ], + help="If set, a line for this cash unit will be created by default " + "on a new cash deposit or a new cash order or both.", + ) + + _sql_constraints = [ + ( + "coinroll_qty_positive", + "CHECK(coinroll_qty >= 0)", + "The coin quantity must be positive.", + ), + ("value_positive", "CHECK(value > 0)", "The value must be strictly positive."), + ] + + @api.constrains("cash_type", "coinroll_qty") + def _check_cash_unit(self): + for rec in self: + if rec.cash_type == "coinroll" and rec.coinroll_qty <= 0: + raise ValidationError( + _("For a coin roll, the coin quantity must be strictly positive.") + ) + + @api.depends("coinroll_qty", "cash_type", "value") + def _compute_all(self): + # I want bank notes first, then coinrolls, then coins + # This is a hack, but it is designed to work fine with + # all currencies of the planet ! + type2multiplier = { + "note": 1000000, + "coinroll": 1000, + "coin": 1, + } + for rec in self: + qty = rec.cash_type == "coinroll" and rec.coinroll_qty or 1 + total_value = rec.value * qty + rec.tree_order = type2multiplier.get(rec.cash_type, 0) * total_value + rec.total_value = total_value + + def _get_value_label(self, value): + self.ensure_one() + symbol_position = self.currency_id.position + symbol = self.currency_id.symbol + int_value = int(round(value)) + # if value is an integer + if self.currency_id.compare_amounts(value, int_value) == 0: + amount_label = str(int_value) + if symbol_position == "before": + value_label = "%s %s" % (symbol, amount_label) + else: + value_label = "%s %s" % (amount_label, symbol) + else: + value_label = format_amount(self.env, value, self.currency_id) + return value_label + + def name_get(self): + res = [] + type2label = dict( + self.fields_get("cash_type", "selection")["cash_type"]["selection"] + ) + for rec in self: + cash_type_label = type2label.get(rec.cash_type) + value_label = rec._get_value_label(rec.value) + if rec.cash_type == "coinroll": + total_value_label = rec._get_value_label(rec.total_value) + label = "%s %s x %d (%s)" % ( + cash_type_label, + value_label, + rec.coinroll_qty, + total_value_label, + ) + else: + label = "%s %s" % (cash_type_label, value_label) + res.append((rec.id, label)) + return res + + @api.model + def name_search(self, name="", args=None, operator="ilike", limit=100): + if args is None: + args = [] + if name and operator == "ilike": + if name.isdigit(): + recs = self.search([("value", "=", name)] + args, limit=limit) + if recs: + return recs.name_get() + value = False + try: + value = float(name) + except Exception: + pass + if value: + recs = self.search([("value", "=", value)] + args, limit=limit) + if recs: + return recs.name_get() + lang = self.env["res.lang"]._lang_get(self.env.user.lang) + if lang: + decimal_sep = lang.decimal_point + if decimal_sep and decimal_sep != ".": + try: + value = float(name.replace(decimal_sep, ".", 1)) + except Exception: + pass + if value: + recs = self.search([("value", "=", value)] + args, limit=limit) + if recs: + return recs.name_get() + return super().name_search(name=name, args=args, operator=operator, limit=limit) diff --git a/account_cash_deposit/models/res_currency.py b/account_cash_deposit/models/res_currency.py new file mode 100644 index 00000000..6dcc3430 --- /dev/null +++ b/account_cash_deposit/models/res_currency.py @@ -0,0 +1,11 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCurrency(models.Model): + _inherit = "res.currency" + + cash_unit_ids = fields.One2many("cash.unit", "currency_id", string="Cash Units") diff --git a/account_cash_deposit/readme/CONFIGURE.rst b/account_cash_deposit/readme/CONFIGURE.rst new file mode 100644 index 00000000..06668fcf --- /dev/null +++ b/account_cash_deposit/readme/CONFIGURE.rst @@ -0,0 +1,11 @@ +First, for each currency of your cash boxes, you must define the bank notes and coin rolls for that currency (coin rolls are often standardised by the Central Bank). You can also definie the coins, but it's not useful if your bank only accept coin rolls and not coins. + +.. figure:: static/description/currency_form_view.png + :scale: 100 % + :alt: Currency form view + +To save time for new users, this module provides the bank notes, coins and coin rolls for several currencies (EUR, USD, CAD, etc.). If it is not the case for your currency, it would be very nice of you to contribute it (you can use the file *account_cash_deposit/data/cash_unit_eur.xml* as an example). + +To save time when encoding the cash deposits/orders, you can set the parameter *Auto Create* on the bank notes and/or coin rolls that you use very often. + +On the Accounting configuration page, in the section *Bank & Cash*, the *Inter-Banks Transfer Account* must be configured. diff --git a/account_cash_deposit/readme/CONTRIBUTORS.rst b/account_cash_deposit/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..ff65d68c --- /dev/null +++ b/account_cash_deposit/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/account_cash_deposit/readme/DESCRIPTION.rst b/account_cash_deposit/readme/DESCRIPTION.rst new file mode 100644 index 00000000..ef8b2afa --- /dev/null +++ b/account_cash_deposit/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds support for **cash deposits at the bank**. It also supports the other way around: **ordering cash at the bank**. It allows to declare the kind of cash you want to deposit (or order): bank notes, coins and coin rolls and the quantity for each of them. Coins are rarely used, because most banks only allow to deposit/order coin rolls. diff --git a/account_cash_deposit/readme/USAGE.rst b/account_cash_deposit/readme/USAGE.rst new file mode 100644 index 00000000..28366d82 --- /dev/null +++ b/account_cash_deposit/readme/USAGE.rst @@ -0,0 +1,13 @@ +To create a new cash **deposit**, go to the menu *Invoicing > Accounting > Miscellaneous > Cash Deposits* and click on *Create*: select the currency, the cash box from which you will take the cash out and the bank journal corresponding to the bank account on which you want to deposit the cash. Then create/edit lines to enter the quantity for each kind of bank note and coin rolls. Then, you can print a PDF report designed to be a kind of delivery report for the cash. Upon validation, Odoo will generate a journal entry in the cash journal that: + +* credits the cash account, +* debits the inter-banks transfer account. + +.. figure:: static/description/cash_deposit_form.png + :scale: 100 % + :alt: Cash Deposit form view + +The process is very similar when **ordering** cash but you have to use another menu entry: menu *Invoicing > Accounting > Miscellaneous > Cash Orders*. Select the currency, the cash box that will receive the cash and the bank account from which the bank will take the money. Create/edit lines to enter the details of your order (bank notes, coin rolls). Then, you can confirm the order and print a PDF report designed to be sent to your bank as a cash order. Eventually, when the bank delivers the cash to you, you should validate the cash order and Odoo will generate a journal entry in the cash journal that: + +* debits the cash account, +* credits the inter-banks transfer account. diff --git a/account_cash_deposit/report/report.xml b/account_cash_deposit/report/report.xml new file mode 100644 index 00000000..b83c5ae8 --- /dev/null +++ b/account_cash_deposit/report/report.xml @@ -0,0 +1,20 @@ + + + + + Cash Deposit/Order + account.cash.deposit + qweb-pdf + account_cash_deposit.report_cashdeposit + account_cash_deposit.report_cashdeposit + '%s%s' % (object.display_name.replace(' ', '_'), object.state == 'draft' and '-draft' or '') + + report + + diff --git a/account_cash_deposit/report/report_cashdeposit.xml b/account_cash_deposit/report/report_cashdeposit.xml new file mode 100644 index 00000000..ed355c7d --- /dev/null +++ b/account_cash_deposit/report/report_cashdeposit.xml @@ -0,0 +1,104 @@ + + + + + diff --git a/account_cash_deposit/security/ir.model.access.csv b/account_cash_deposit/security/ir.model.access.csv new file mode 100644 index 00000000..1ae75b94 --- /dev/null +++ b/account_cash_deposit/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_cash_deposit_user,Full rights on account.cash.deposit to Accountant,model_account_cash_deposit,account.group_account_user,1,1,1,1 +access_account_cash_deposit_line_user,Full rights on account.cash.deposit.line to Accountant,model_account_cash_deposit_line,account.group_account_user,1,1,1,1 +access_account_cash_order_reception,Full rights on account.cash.order.reception wizard,model_account_cash_order_reception,account.group_account_user,1,1,1,1 +cash_unit_read,Read rights on cash.unit to everybody,model_cash_unit,,1,0,0,0 +cash_unit_full,Full rights on cash.unit to System group,model_cash_unit,base.group_system,1,1,1,1 diff --git a/account_cash_deposit/security/security.xml b/account_cash_deposit/security/security.xml new file mode 100644 index 00000000..f42479cf --- /dev/null +++ b/account_cash_deposit/security/security.xml @@ -0,0 +1,13 @@ + + + + + Cash Deposit multi-company + + [('company_id', 'in', company_ids)] + + diff --git a/account_cash_deposit/static/description/cash_deposit_form.png b/account_cash_deposit/static/description/cash_deposit_form.png new file mode 100644 index 0000000000000000000000000000000000000000..e240933360341cbf40ba8b0fead86aee7cba1a49 GIT binary patch literal 93239 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

;Ha*KtJholUBQ&JL$8!mDv`OUfn%9 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 literal 0 HcmV?d00001 diff --git a/account_cash_deposit/tests/__init__.py b/account_cash_deposit/tests/__init__.py new file mode 100644 index 00000000..03896123 --- /dev/null +++ b/account_cash_deposit/tests/__init__.py @@ -0,0 +1 @@ +from . import test_cash_deposit diff --git a/account_cash_deposit/tests/test_cash_deposit.py b/account_cash_deposit/tests/test_cash_deposit.py new file mode 100644 index 00000000..c911fea8 --- /dev/null +++ b/account_cash_deposit/tests/test_cash_deposit.py @@ -0,0 +1,129 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from datetime import date, timedelta + +from odoo.tests.common import TransactionCase + + +class TestAccountCashDeposit(TransactionCase): + def setUp(self): + super().setUp() + self.company = self.env.ref("base.main_company") + self.currency = self.company.currency_id + self.cash_journal = self.env["account.journal"].search( + [("type", "=", "cash"), ("company_id", "=", self.company.id)], limit=1 + ) + self.bank_journal = self.env["account.journal"].search( + [("type", "=", "bank"), ("company_id", "=", self.company.id)], limit=1 + ) + self.cash_unit_note = self.env["cash.unit"].search( + [("currency_id", "=", self.currency.id), ("cash_type", "=", "note")], + limit=1, + ) + self.cash_unit_coinroll = self.env["cash.unit"].search( + [("currency_id", "=", self.currency.id), ("cash_type", "=", "coinroll")], + limit=1, + ) + self.all_cash_units = self.env["cash.unit"].search( + [("currency_id", "=", self.currency.id)] + ) + self.date = date.today() + self.yesterday = date.today() - timedelta(days=1) + self.deposit_seq = self.env["ir.sequence"].search( + [("code", "=", "account.cash.deposit")] + ) + self.order_seq = self.env["ir.sequence"].search( + [("code", "=", "account.cash.order")] + ) + + def test_cash_order(self): + self.all_cash_units.write({"auto_create": "both"}) + order = ( + self.env["account.cash.deposit"] + .with_context(default_operation_type="order") + .create( + { + "company_id": self.company.id, + "currency_id": self.currency.id, + "cash_journal_id": self.cash_journal.id, + "bank_journal_id": self.bank_journal.id, + } + ) + ) + self.assertEqual(len(order.line_ids), len(self.all_cash_units)) + self.assertEqual(order.state, "draft") + self.assertTrue(order.name.startswith(self.order_seq.prefix)) + self.assertEqual(order.operation_type, "order") + line_note = self.env["account.cash.deposit.line"].search( + [ + ("cash_unit_id", "=", self.cash_unit_note.id), + ("parent_id", "=", order.id), + ] + ) + line_note.write({"qty": 5}) + line_note = self.env["account.cash.deposit.line"].search( + [ + ("cash_unit_id", "=", self.cash_unit_coinroll.id), + ("parent_id", "=", order.id), + ] + ) + line_note.write({"qty": 2}) + total = ( + 5 * self.cash_unit_note.total_value + + 2 * self.cash_unit_coinroll.total_value + ) + self.assertFalse(order.currency_id.compare_amounts(order.total_amount, total)) + order.confirm_order() + self.assertEqual(order.state, "confirmed") + self.assertEqual(len(order.line_ids), 2) + wizard = ( + self.env["account.cash.order.reception"] + .with_context(default_order_id=order.id) + .create({"date": self.yesterday}) + ) + wizard.run() + self.assertEqual(order.state, "done") + self.assertEqual(order.date, self.yesterday) + self.assertTrue(order.move_id) + self.assertEqual(len(order.move_id.line_ids), 2) + self.assertEqual(order.move_id.date, order.date) + self.assertEqual(order.move_id.journal_id, order.cash_journal_id) + self.assertEqual(order.move_id.ref, order.display_name) + + def test_cash_deposit(self): + deposit = ( + self.env["account.cash.deposit"] + .with_context(default_operation_type="deposit") + .create( + { + "company_id": self.company.id, + "currency_id": self.currency.id, + "cash_journal_id": self.cash_journal.id, + "bank_journal_id": self.bank_journal.id, + "line_ids": [ + (0, 0, {"cash_unit_id": self.cash_unit_note.id, "qty": 3}), + (0, 0, {"cash_unit_id": self.cash_unit_coinroll.id, "qty": 6}), + ], + } + ) + ) + self.assertEqual(len(deposit.line_ids), 2) + self.assertEqual(deposit.state, "draft") + self.assertTrue(deposit.name.startswith(self.deposit_seq.prefix)) + self.assertEqual(deposit.operation_type, "deposit") + total = ( + 3 * self.cash_unit_note.total_value + + 6 * self.cash_unit_coinroll.total_value + ) + self.assertFalse( + deposit.currency_id.compare_amounts(deposit.total_amount, total) + ) + deposit.validate() + self.assertEqual(deposit.state, "done") + self.assertTrue(deposit.move_id) + self.assertEqual(len(deposit.move_id.line_ids), 2) + self.assertEqual(deposit.move_id.date, deposit.date) + self.assertEqual(deposit.move_id.journal_id, deposit.cash_journal_id) + self.assertEqual(deposit.move_id.ref, deposit.display_name) diff --git a/account_cash_deposit/views/account_cash_deposit.xml b/account_cash_deposit/views/account_cash_deposit.xml new file mode 100644 index 00000000..10efbf3a --- /dev/null +++ b/account_cash_deposit/views/account_cash_deposit.xml @@ -0,0 +1,218 @@ + + + + + account.cash.deposit + +
+
+ +
+ +
+ +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+
+
+ + account.cash.deposit + + + + + + + + + + + + + + + + + + account.cash.deposit + + + + + + + + + + + + + + + + + + + + + Cash Deposits + account.cash.deposit + tree,form + [('operation_type', '=', 'deposit')] + {'default_operation_type': 'deposit'} + + + + + Cash Orders + account.cash.deposit + tree,form + [('operation_type', '=', 'order')] + {'default_operation_type': 'order'} + + + + + + +
diff --git a/account_cash_deposit/views/cash_unit.xml b/account_cash_deposit/views/cash_unit.xml new file mode 100644 index 00000000..f5d9e216 --- /dev/null +++ b/account_cash_deposit/views/cash_unit.xml @@ -0,0 +1,72 @@ + + + + + + cash.unit + +
+ + + + + + + + + + + +
+
+ + + cash.unit + + + + + + + + + + + + + + + Cash Unit + cash.unit + tree,form + {'cash_unit_main_view': True} + + +
diff --git a/account_cash_deposit/views/res_currency.xml b/account_cash_deposit/views/res_currency.xml new file mode 100644 index 00000000..1481a43e --- /dev/null +++ b/account_cash_deposit/views/res_currency.xml @@ -0,0 +1,21 @@ + + + + + + res.currency + + + + + + + + + + + diff --git a/account_cash_deposit/wizards/__init__.py b/account_cash_deposit/wizards/__init__.py new file mode 100644 index 00000000..01e460e7 --- /dev/null +++ b/account_cash_deposit/wizards/__init__.py @@ -0,0 +1 @@ +from . import account_cash_order_reception diff --git a/account_cash_deposit/wizards/account_cash_order_reception.py b/account_cash_deposit/wizards/account_cash_order_reception.py new file mode 100644 index 00000000..ad9ed4d8 --- /dev/null +++ b/account_cash_deposit/wizards/account_cash_order_reception.py @@ -0,0 +1,27 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.tools.misc import format_date + + +class AccountCashOrderReception(models.TransientModel): + _name = "account.cash.order.reception" + _description = "Cash Order Reception" + + order_id = fields.Many2one( + "account.cash.deposit", readonly=True, string="Cash Order" + ) + date = fields.Date( + string="Cash Reception Date", default=fields.Date.context_today, required=True + ) + total_amount = fields.Monetary(related="order_id.total_amount") + currency_id = fields.Many2one(related="order_id.currency_id") + + def run(self): + self.ensure_one() + self.order_id.message_post( + body=_("Cash reception confirmed on %s.") % format_date(self.env, self.date) + ) + self.order_id.validate(force_date=self.date) diff --git a/account_cash_deposit/wizards/account_cash_order_reception_view.xml b/account_cash_deposit/wizards/account_cash_order_reception_view.xml new file mode 100644 index 00000000..f5ae8f2a --- /dev/null +++ b/account_cash_deposit/wizards/account_cash_order_reception_view.xml @@ -0,0 +1,42 @@ + + + + + + account.cash.order.reception + +
+ + + + + + +
+
+
+
+
+ + + Cash Order Reception + account.cash.order.reception + form + new + + +
From d3f5206b39a092754a1cdad97eef224aadda4b35 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 16 Mar 2022 09:56:43 +0000 Subject: [PATCH 02/10] [UPD] Update account_cash_deposit.pot --- .../i18n/account_cash_deposit.pot | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/account_cash_deposit/i18n/account_cash_deposit.pot b/account_cash_deposit/i18n/account_cash_deposit.pot index 144d1b9a..a4dbaef0 100644 --- a/account_cash_deposit/i18n/account_cash_deposit.pot +++ b/account_cash_deposit/i18n/account_cash_deposit.pot @@ -6,8 +6,6 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-03-03 17:51+0000\n" -"PO-Revision-Date: 2022-03-03 17:51+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,6 +13,13 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: account_cash_deposit +#: model:ir.actions.report,print_report_name:account_cash_deposit.report_account_cash_deposit +msgid "" +"'%s%s' % (object.display_name.replace(' ', '_'), object.state == 'draft' and" +" '-draft' or '')" +msgstr "" + #. module: account_cash_deposit #: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit msgid "Currency:" @@ -355,6 +360,7 @@ msgstr "" #. module: account_cash_deposit #: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_sms_error msgid "If checked, some messages have a delivery error." msgstr "" @@ -420,18 +426,6 @@ msgstr "" msgid "Messages" msgstr "" -#. module: account_cash_deposit -#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 -#, python-format -msgid "Missing Outstanding Payments Account on bank journal '%s'." -msgstr "" - -#. module: account_cash_deposit -#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 -#, python-format -msgid "Missing Outstanding Receipts Account on bank journal '%s'." -msgstr "" - #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__my_activity_date_deadline msgid "My Activity Deadline" @@ -529,7 +523,7 @@ msgstr "" #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__is_reconcile -msgid "Reconcile" +msgid "Reconciled" msgstr "" #. module: account_cash_deposit @@ -542,6 +536,11 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__state msgid "Status" @@ -568,6 +567,12 @@ msgstr "" msgid "The %s is not in draft state, so you cannot delete it." msgstr "" +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "The Inter-Banks Transfer Account is not configured." +msgstr "" + #. module: account_cash_deposit #: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_coinroll_qty_positive msgid "The coin quantity must be positive." From 4114a79528444ce6dcf89a67451bbb7ce4c2dac7 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 16 Mar 2022 10:17:47 +0000 Subject: [PATCH 03/10] [UPD] README.rst --- account_cash_deposit/README.rst | 106 ++++- .../static/description/index.html | 447 ++++++++++++++++++ 2 files changed, 552 insertions(+), 1 deletion(-) create mode 100644 account_cash_deposit/static/description/index.html diff --git a/account_cash_deposit/README.rst b/account_cash_deposit/README.rst index 262ac821..3aa47591 100644 --- a/account_cash_deposit/README.rst +++ b/account_cash_deposit/README.rst @@ -1 +1,105 @@ -Will be auto-generated from readme subdir +==================== +Account Cash Deposit +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github + :target: https://github.com/OCA/account-financial-tools/tree/14.0/account_cash_deposit + :alt: OCA/account-financial-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_cash_deposit + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/92/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds support for **cash deposits at the bank**. It also supports the other way around: **ordering cash at the bank**. It allows to declare the kind of cash you want to deposit (or order): bank notes, coins and coin rolls and the quantity for each of them. Coins are rarely used, because most banks only allow to deposit/order coin rolls. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +First, for each currency of your cash boxes, you must define the bank notes and coin rolls for that currency (coin rolls are often standardised by the Central Bank). You can also definie the coins, but it's not useful if your bank only accept coin rolls and not coins. + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/14.0/account_cash_deposit/static/description/currency_form_view.png + :scale: 100 % + :alt: Currency form view + +To save time for new users, this module provides the bank notes, coins and coin rolls for several currencies (EUR, USD, CAD, etc.). If it is not the case for your currency, it would be very nice of you to contribute it (you can use the file *account_cash_deposit/data/cash_unit_eur.xml* as an example). + +To save time when encoding the cash deposits/orders, you can set the parameter *Auto Create* on the bank notes and/or coin rolls that you use very often. + +On the Accounting configuration page, in the section *Bank & Cash*, the *Inter-Banks Transfer Account* must be configured. + +Usage +===== + +To create a new cash **deposit**, go to the menu *Invoicing > Accounting > Miscellaneous > Cash Deposits* and click on *Create*: select the currency, the cash box from which you will take the cash out and the bank journal corresponding to the bank account on which you want to deposit the cash. Then create/edit lines to enter the quantity for each kind of bank note and coin rolls. Then, you can print a PDF report designed to be a kind of delivery report for the cash. Upon validation, Odoo will generate a journal entry in the cash journal that: + +* credits the cash account, +* debits the inter-banks transfer account. + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/14.0/account_cash_deposit/static/description/cash_deposit_form.png + :scale: 100 % + :alt: Cash Deposit form view + +The process is very similar when **ordering** cash but you have to use another menu entry: menu *Invoicing > Accounting > Miscellaneous > Cash Orders*. Select the currency, the cash box that will receive the cash and the bank account from which the bank will take the money. Create/edit lines to enter the details of your order (bank notes, coin rolls). Then, you can confirm the order and print a PDF report designed to be sent to your bank as a cash order. Eventually, when the bank delivers the cash to you, you should validate the cash order and Odoo will generate a journal entry in the cash journal that: + +* debits the cash account, +* credits the inter-banks transfer account. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Alexis de Lattre + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/account-financial-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_cash_deposit/static/description/index.html b/account_cash_deposit/static/description/index.html new file mode 100644 index 00000000..578d57f4 --- /dev/null +++ b/account_cash_deposit/static/description/index.html @@ -0,0 +1,447 @@ + + + + + + +Account Cash Deposit + + + +
+

Account Cash Deposit

+ + +

Beta License: AGPL-3 OCA/account-financial-tools Translate me on Weblate Try me on Runbot

+

This module adds support for cash deposits at the bank. It also supports the other way around: ordering cash at the bank. It allows to declare the kind of cash you want to deposit (or order): bank notes, coins and coin rolls and the quantity for each of them. Coins are rarely used, because most banks only allow to deposit/order coin rolls.

+

Table of contents

+ +
+

Configuration

+

First, for each currency of your cash boxes, you must define the bank notes and coin rolls for that currency (coin rolls are often standardised by the Central Bank). You can also definie the coins, but it’s not useful if your bank only accept coin rolls and not coins.

+
+Currency form view +
+

To save time for new users, this module provides the bank notes, coins and coin rolls for several currencies (EUR, USD, CAD, etc.). If it is not the case for your currency, it would be very nice of you to contribute it (you can use the file account_cash_deposit/data/cash_unit_eur.xml as an example).

+

To save time when encoding the cash deposits/orders, you can set the parameter Auto Create on the bank notes and/or coin rolls that you use very often.

+

On the Accounting configuration page, in the section Bank & Cash, the Inter-Banks Transfer Account must be configured.

+
+
+

Usage

+

To create a new cash deposit, go to the menu Invoicing > Accounting > Miscellaneous > Cash Deposits and click on Create: select the currency, the cash box from which you will take the cash out and the bank journal corresponding to the bank account on which you want to deposit the cash. Then create/edit lines to enter the quantity for each kind of bank note and coin rolls. Then, you can print a PDF report designed to be a kind of delivery report for the cash. Upon validation, Odoo will generate a journal entry in the cash journal that:

+
    +
  • credits the cash account,
  • +
  • debits the inter-banks transfer account.
  • +
+
+Cash Deposit form view +
+

The process is very similar when ordering cash but you have to use another menu entry: menu Invoicing > Accounting > Miscellaneous > Cash Orders. Select the currency, the cash box that will receive the cash and the bank account from which the bank will take the money. Create/edit lines to enter the details of your order (bank notes, coin rolls). Then, you can confirm the order and print a PDF report designed to be sent to your bank as a cash order. Eventually, when the bank delivers the cash to you, you should validate the cash order and Odoo will generate a journal entry in the cash journal that:

+
    +
  • debits the cash account,
  • +
  • credits the inter-banks transfer account.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/account-financial-tools project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From e448e08371a28593157ec34745450e56b472fc30 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 16 Mar 2022 10:17:47 +0000 Subject: [PATCH 04/10] [ADD] icon.png --- account_cash_deposit/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 account_cash_deposit/static/description/icon.png diff --git a/account_cash_deposit/static/description/icon.png b/account_cash_deposit/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 665fb166938267ab66e3a6c1dfb4e3ddbebbd154 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 17 May 2022 19:56:01 +0200 Subject: [PATCH 05/10] account_cash_deposit: add support for loose coins in deposits Adds a new field for loose coin amount for deposits: this field is useful if your bank has a coin counting machine that allows you to deposit coins without putting them in rolls. --- .../models/account_cash_deposit.py | 19 +++++++++++++++++-- .../tests/test_cash_deposit.py | 4 +++- .../views/account_cash_deposit.xml | 4 ++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/account_cash_deposit/models/account_cash_deposit.py b/account_cash_deposit/models/account_cash_deposit.py index 5d7750c0..4a76008c 100644 --- a/account_cash_deposit/models/account_cash_deposit.py +++ b/account_cash_deposit/models/account_cash_deposit.py @@ -98,6 +98,16 @@ class AccountCashDeposit(models.Model): states={"draft": [("readonly", "=", False)]}, tracking=True, ) + coin_amount = fields.Monetary( + string="Loose Coin Amount", + currency_field="currency_id", + readonly=True, + states={"draft": [("readonly", "=", False)]}, + tracking=True, + help="If your bank has a coin counting machine, enter the total amount " + "of coins counted by the machine instead of creating a line for each type " + "of coin.", + ) total_amount = fields.Monetary( compute="_compute_total_amount", string="Total Amount", @@ -115,7 +125,12 @@ class AccountCashDeposit(models.Model): "name_company_unique", "unique(company_id, name)", "A cash deposit/order with this reference already exists in this company.", - ) + ), + ( + "coin_amount_positive", + "CHECK(coin_amount >= 0)", + "The loose coin amount must be positive or null.", + ), ] @api.constrains("cash_journal_id", "currency_id") @@ -189,7 +204,7 @@ class AccountCashDeposit(models.Model): ) mapped_data = {x["parent_id"][0]: x["subtotal"] for x in rg_res} for rec in self: - rec.total_amount = mapped_data.get(rec.id, 0) + rec.total_amount = mapped_data.get(rec.id, 0) + rec.coin_amount @api.depends("move_id.line_ids.reconciled", "company_id") def _compute_is_reconcile(self): diff --git a/account_cash_deposit/tests/test_cash_deposit.py b/account_cash_deposit/tests/test_cash_deposit.py index c911fea8..ed351b5f 100644 --- a/account_cash_deposit/tests/test_cash_deposit.py +++ b/account_cash_deposit/tests/test_cash_deposit.py @@ -93,6 +93,7 @@ class TestAccountCashDeposit(TransactionCase): self.assertEqual(order.move_id.ref, order.display_name) def test_cash_deposit(self): + coin_amount = 12.42 deposit = ( self.env["account.cash.deposit"] .with_context(default_operation_type="deposit") @@ -102,6 +103,7 @@ class TestAccountCashDeposit(TransactionCase): "currency_id": self.currency.id, "cash_journal_id": self.cash_journal.id, "bank_journal_id": self.bank_journal.id, + "coin_amount": coin_amount, "line_ids": [ (0, 0, {"cash_unit_id": self.cash_unit_note.id, "qty": 3}), (0, 0, {"cash_unit_id": self.cash_unit_coinroll.id, "qty": 6}), @@ -116,7 +118,7 @@ class TestAccountCashDeposit(TransactionCase): total = ( 3 * self.cash_unit_note.total_value + 6 * self.cash_unit_coinroll.total_value - ) + ) + coin_amount self.assertFalse( deposit.currency_id.compare_amounts(deposit.total_amount, total) ) diff --git a/account_cash_deposit/views/account_cash_deposit.xml b/account_cash_deposit/views/account_cash_deposit.xml index 10efbf3a..e8a74d41 100644 --- a/account_cash_deposit/views/account_cash_deposit.xml +++ b/account_cash_deposit/views/account_cash_deposit.xml @@ -68,6 +68,10 @@ /> + From ba0d99036fa9f42c3634e2ae7d578f377c548e7a Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 30 Jun 2022 16:41:43 +0000 Subject: [PATCH 06/10] account_cash_deposit: allow to specify date --- account_cash_deposit/models/account_cash_deposit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/account_cash_deposit/models/account_cash_deposit.py b/account_cash_deposit/models/account_cash_deposit.py index 4a76008c..13202e97 100644 --- a/account_cash_deposit/models/account_cash_deposit.py +++ b/account_cash_deposit/models/account_cash_deposit.py @@ -39,7 +39,7 @@ class AccountCashDeposit(models.Model): ) date = fields.Date( string="Date", - readonly=True, + states={"done": [("readonly", "=", True)]}, tracking=True, copy=False, help="Used as date for the journal entry.", @@ -281,7 +281,7 @@ class AccountCashDeposit(models.Model): def _prepare_account_move(self, vals): self.ensure_one() - date = vals["date"] + date = vals.get("date") or self.date op_type = self.operation_type total_amount_comp_cur = self.currency_id._convert( self.total_amount, self.company_id.currency_id, self.company_id, date @@ -328,7 +328,7 @@ class AccountCashDeposit(models.Model): vals = {"state": "done"} if force_date: vals["date"] = force_date - else: + elif not self.date: vals["date"] = fields.Date.context_today(self) return vals From 262ed2c5ab5bfca6fe104942322e11a7ce295aec Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 12 Dec 2022 14:33:08 +0000 Subject: [PATCH 07/10] [UPD] Update account_cash_deposit.pot --- .../i18n/account_cash_deposit.pot | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/account_cash_deposit/i18n/account_cash_deposit.pot b/account_cash_deposit/i18n/account_cash_deposit.pot index a4dbaef0..ffa4699f 100644 --- a/account_cash_deposit/i18n/account_cash_deposit.pot +++ b/account_cash_deposit/i18n/account_cash_deposit.pot @@ -371,6 +371,13 @@ msgid "" "deposit or a new cash order or both." msgstr "" +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__coin_amount +msgid "" +"If your bank has a coin counting machine, enter the total amount of coins " +"counted by the machine instead of creating a line for each type of coin." +msgstr "" + #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_is_follower msgid "Is Follower" @@ -411,6 +418,11 @@ msgstr "" msgid "Lines" msgstr "" +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__coin_amount +msgid "Loose Coin Amount" +msgstr "" + #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_main_attachment_id msgid "Main Attachment" @@ -578,6 +590,11 @@ msgstr "" msgid "The coin quantity must be positive." msgstr "" +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_coin_amount_positive +msgid "The loose coin amount must be positive or null." +msgstr "" + #. module: account_cash_deposit #: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_qty_positive msgid "The quantity must be positive or null." From 26c6b373c29e59c4143ddab5b27bd61f2c3775e0 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 12 Dec 2022 14:40:01 +0000 Subject: [PATCH 08/10] account_cash_deposit 14.0.1.1.0 --- account_cash_deposit/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_cash_deposit/__manifest__.py b/account_cash_deposit/__manifest__.py index 160692c8..9135f19d 100644 --- a/account_cash_deposit/__manifest__.py +++ b/account_cash_deposit/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Account Cash Deposit", - "version": "14.0.1.0.0", + "version": "14.0.1.1.0", "category": "Accounting", "license": "AGPL-3", "summary": "Manage cash deposits and cash orders", From 6c68352033126b1535e95740e3f3cad88b111670 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 12 Dec 2022 14:40:26 +0000 Subject: [PATCH 09/10] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: account-financial-tools-14.0/account-financial-tools-14.0-account_cash_deposit Translate-URL: https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_cash_deposit/ --- account_cash_deposit/i18n/fr.po | 86 ++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 22 deletions(-) diff --git a/account_cash_deposit/i18n/fr.po b/account_cash_deposit/i18n/fr.po index db138319..3c53d2de 100644 --- a/account_cash_deposit/i18n/fr.po +++ b/account_cash_deposit/i18n/fr.po @@ -10,11 +10,19 @@ msgstr "" "PO-Revision-Date: 2022-03-03 11:19+0000\n" "Last-Translator: \n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: account_cash_deposit +#: model:ir.actions.report,print_report_name:account_cash_deposit.report_account_cash_deposit +msgid "" +"'%s%s' % (object.display_name.replace(' ', '_'), object.state == 'draft' and " +"'-draft' or '')" +msgstr "" + #. module: account_cash_deposit #: model_terms:ir.ui.view,arch_db:account_cash_deposit.report_cashdeposit msgid "Currency:" @@ -39,7 +47,9 @@ msgstr "Total :" #: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_name_company_unique msgid "" "A cash deposit/order with this reference already exists in this company." -msgstr "Une commande/remise d'espèces existe déjà avec cette référence dans la même société." +msgstr "" +"Une commande/remise d'espèces existe déjà avec cette référence dans la même " +"société." #. module: account_cash_deposit #: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_cash_unit_unique @@ -321,7 +331,9 @@ msgstr "" #: code:addons/account_cash_deposit/models/cash_unit.py:0 #, python-format msgid "For a coin roll, the coin quantity must be strictly positive." -msgstr "Pour un rouleau d'espèces, la quantité de pièces doit être strictement positive." +msgstr "" +"Pour un rouleau d'espèces, la quantité de pièces doit être strictement " +"positive." #. module: account_cash_deposit #: model_terms:ir.ui.view,arch_db:account_cash_deposit.account_cash_deposit_search @@ -355,6 +367,7 @@ msgstr "" #. module: account_cash_deposit #: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_error +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__message_has_sms_error msgid "If checked, some messages have a delivery error." msgstr "" @@ -363,8 +376,16 @@ msgstr "" msgid "" "If set, a line for this cash unit will be created by default on a new cash " "deposit or a new cash order or both." -msgstr "Si coché, une ligne sera créé par défault pour cette unité d'espèce " -"sur les nouvelles remises d'espèce ou les nouvelles commandes d'espèces ou les deux." +msgstr "" +"Si coché, une ligne sera créé par défault pour cette unité d'espèce sur les " +"nouvelles remises d'espèce ou les nouvelles commandes d'espèces ou les deux." + +#. module: account_cash_deposit +#: model:ir.model.fields,help:account_cash_deposit.field_account_cash_deposit__coin_amount +msgid "" +"If your bank has a coin counting machine, enter the total amount of coins " +"counted by the machine instead of creating a line for each type of coin." +msgstr "" #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_is_follower @@ -406,6 +427,11 @@ msgstr "Dernière mise à jour le" msgid "Lines" msgstr "Lignes" +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__coin_amount +msgid "Loose Coin Amount" +msgstr "" + #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_main_attachment_id msgid "Main Attachment" @@ -421,18 +447,6 @@ msgstr "" msgid "Messages" msgstr "" -#. module: account_cash_deposit -#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 -#, python-format -msgid "Missing Outstanding Payments Account on bank journal '%s'." -msgstr "Compte de paiements sortants non configuré sur le journal de banque '%s'." - -#. module: account_cash_deposit -#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 -#, python-format -msgid "Missing Outstanding Receipts Account on bank journal '%s'." -msgstr "Compte de paiements entrants non configuré sur le journal de banque '%s'." - #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__my_activity_date_deadline msgid "My Activity Deadline" @@ -495,7 +509,8 @@ msgstr "" msgid "" "On {deposit}, the cash journal {cash_journal} is not in the selected " "currency {currency}." -msgstr "Sur {deposit}, la caisse {cash_journal} n'est pas dans la devise " +msgstr "" +"Sur {deposit}, la caisse {cash_journal} n'est pas dans la devise " "sélectionnée {currency}." #. module: account_cash_deposit @@ -544,6 +559,11 @@ msgstr "Référence" msgid "Responsible User" msgstr "" +#. module: account_cash_deposit +#: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__state msgid "Status" @@ -568,13 +588,25 @@ msgstr "Sous-total" #: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 #, python-format msgid "The %s is not in draft state, so you cannot delete it." -msgstr "La %s n'est pas à l'état brouillon, donc vous ne pouvez pas la supprimer." +msgstr "" +"La %s n'est pas à l'état brouillon, donc vous ne pouvez pas la supprimer." + +#. module: account_cash_deposit +#: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 +#, python-format +msgid "The Inter-Banks Transfer Account is not configured." +msgstr "" #. module: account_cash_deposit #: model:ir.model.constraint,message:account_cash_deposit.constraint_cash_unit_coinroll_qty_positive msgid "The coin quantity must be positive." msgstr "La quantité de pièces doit être positive." +#. module: account_cash_deposit +#: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_coin_amount_positive +msgid "The loose coin amount must be positive or null." +msgstr "" + #. module: account_cash_deposit #: model:ir.model.constraint,message:account_cash_deposit.constraint_account_cash_deposit_line_qty_positive msgid "The quantity must be positive or null." @@ -602,8 +634,9 @@ msgstr "Ce champ ne doit jamais être modifié." msgid "" "This field should never be modified. For a coin roll, you must enter the " "value of the coin." -msgstr "Ce champ ne doit jamais être modifié. Pour un rouleau de pièces, " -"vous devez entrer la valeur de la pièce." +msgstr "" +"Ce champ ne doit jamais être modifié. Pour un rouleau de pièces, vous devez " +"entrer la valeur de la pièce." #. module: account_cash_deposit #: model:ir.model.fields,field_description:account_cash_deposit.field_account_cash_deposit__total_amount @@ -670,6 +703,15 @@ msgstr "" #. module: account_cash_deposit #: code:addons/account_cash_deposit/models/account_cash_deposit.py:0 #, python-format -msgid "" -"You must delete cash lines that are linked to a currency other than %s." +msgid "You must delete cash lines that are linked to a currency other than %s." msgstr "Vous devez supprimer les lignes liées à une devise autre que %s." + +#, python-format +#~ msgid "Missing Outstanding Payments Account on bank journal '%s'." +#~ msgstr "" +#~ "Compte de paiements sortants non configuré sur le journal de banque '%s'." + +#, python-format +#~ msgid "Missing Outstanding Receipts Account on bank journal '%s'." +#~ msgstr "" +#~ "Compte de paiements entrants non configuré sur le journal de banque '%s'." From 65dc46c91e966d4cb753840cf188d0c8a482c837 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 12 Dec 2022 21:12:46 +0100 Subject: [PATCH 10/10] [MIG] account_cash_deposit to v16 --- account_cash_deposit/__manifest__.py | 2 +- .../models/account_cash_deposit.py | 68 +++++++++---------- account_cash_deposit/models/cash_unit.py | 12 ++-- .../report/report_cashdeposit.xml | 31 +++++---- .../views/account_cash_deposit.xml | 14 +++- account_cash_deposit/views/cash_unit.xml | 5 +- account_cash_deposit/views/res_currency.xml | 2 +- .../odoo/addons/account_cash_deposit | 1 + setup/account_cash_deposit/setup.py | 6 ++ 9 files changed, 85 insertions(+), 56 deletions(-) create mode 120000 setup/account_cash_deposit/odoo/addons/account_cash_deposit create mode 100644 setup/account_cash_deposit/setup.py diff --git a/account_cash_deposit/__manifest__.py b/account_cash_deposit/__manifest__.py index 9135f19d..92e15d85 100644 --- a/account_cash_deposit/__manifest__.py +++ b/account_cash_deposit/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Account Cash Deposit", - "version": "14.0.1.1.0", + "version": "16.0.1.0.0", "category": "Accounting", "license": "AGPL-3", "summary": "Manage cash deposits and cash orders", diff --git a/account_cash_deposit/models/account_cash_deposit.py b/account_cash_deposit/models/account_cash_deposit.py index 13202e97..d741b739 100644 --- a/account_cash_deposit/models/account_cash_deposit.py +++ b/account_cash_deposit/models/account_cash_deposit.py @@ -22,7 +22,6 @@ class AccountCashDeposit(models.Model): ("order", "Cash Order"), ], required=True, - string="Operation Type", readonly=True, ) line_ids = fields.One2many( @@ -38,7 +37,6 @@ class AccountCashDeposit(models.Model): states={"draft": [("readonly", "=", False)]}, ) date = fields.Date( - string="Date", states={"done": [("readonly", "=", True)]}, tracking=True, copy=False, @@ -56,7 +54,6 @@ class AccountCashDeposit(models.Model): ) currency_id = fields.Many2one( "res.currency", - string="Currency", required=True, tracking=True, readonly=True, @@ -92,7 +89,6 @@ class AccountCashDeposit(models.Model): ) company_id = fields.Many2one( "res.company", - string="Company", required=True, readonly=True, states={"draft": [("readonly", "=", False)]}, @@ -110,7 +106,7 @@ class AccountCashDeposit(models.Model): ) total_amount = fields.Monetary( compute="_compute_total_amount", - string="Total Amount", + precompute=True, store=True, currency_field="currency_id", tracking=True, @@ -195,16 +191,15 @@ class AccountCashDeposit(models.Model): res["line_ids"] = [(0, 0, {"cash_unit_id": cu.id}) for cu in cash_units] return res - @api.depends("line_ids.subtotal") + @api.depends("line_ids.subtotal", "coin_amount") def _compute_total_amount(self): - rg_res = self.env["account.cash.deposit.line"].read_group( - [("parent_id", "in", self.ids)], - ["parent_id", "subtotal"], - ["parent_id"], - ) - mapped_data = {x["parent_id"][0]: x["subtotal"] for x in rg_res} + # With precompute=True, we can't use read_group() any more, + # because it won't work with NewID for rec in self: - rec.total_amount = mapped_data.get(rec.id, 0) + rec.coin_amount + total_amount = rec.coin_amount + for line in rec.line_ids: + total_amount += line.subtotal + rec.total_amount = total_amount @api.depends("move_id.line_ids.reconciled", "company_id") def _compute_is_reconcile(self): @@ -231,30 +226,35 @@ class AccountCashDeposit(models.Model): def backtodraft(self): for rec in self: if rec.move_id: + if rec.is_reconcile: + raise UserError( + _("%s has already been credited/debited on the bank account.") + % rec.display_name + ) move = rec.move_id - # It will raise here if journal_id.update_posted = False if move.state == "posted": move.button_draft() - move.unlink() + move.with_context(force_delete=True).unlink() rec.write({"state": "draft"}) - @api.model - def create(self, vals): - if "company_id" in vals: - self = self.with_company(vals["company_id"]) - if vals.get("name", "/") == "/": - if ( - vals.get("operation_type") == "order" - or self._context.get("default_operation_type") == "order" - ): - vals["name"] = self.env["ir.sequence"].next_by_code( - "account.cash.order", vals.get("order_date") - ) - else: - vals["name"] = self.env["ir.sequence"].next_by_code( - "account.cash.deposit" - ) - return super().create(vals) + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if "company_id" in vals: + self = self.with_company(vals["company_id"]) + if vals.get("name", "/") == "/": + if ( + vals.get("operation_type") == "order" + or self._context.get("default_operation_type") == "order" + ): + vals["name"] = self.env["ir.sequence"].next_by_code( + "account.cash.order", vals.get("order_date") + ) + else: + vals["name"] = self.env["ir.sequence"].next_by_code( + "account.cash.deposit" + ) + return super().create(vals_list) def name_get(self): res = [] @@ -381,7 +381,7 @@ class AccountCashDeposit(models.Model): def get_report(self): report = self.env.ref("account_cash_deposit.report_account_cash_deposit") - action = report.with_context({"discard_logo_check": True}).report_action(self) + action = report.with_context(discard_logo_check=True).report_action(self) return action @@ -396,7 +396,7 @@ class AccountCashDepositLine(models.Model): "cash.unit", required=True, domain="[('currency_id', '=', currency_id)]" ) tree_order = fields.Float(related="cash_unit_id.tree_order", store=True) - subtotal = fields.Monetary(compute="_compute_subtotal", store=True) + subtotal = fields.Monetary(compute="_compute_subtotal", store=True, precompute=True) currency_id = fields.Many2one(related="parent_id.currency_id", store=True) _sql_constraints = [ diff --git a/account_cash_deposit/models/cash_unit.py b/account_cash_deposit/models/cash_unit.py index f2a44316..bd0135e5 100644 --- a/account_cash_deposit/models/cash_unit.py +++ b/account_cash_deposit/models/cash_unit.py @@ -2,10 +2,14 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging + from odoo import _, api, fields, models from odoo.exceptions import ValidationError from odoo.tools.misc import format_amount +logger = logging.getLogger(__name__) + class CashUnit(models.Model): _name = "cash.unit" @@ -127,8 +131,8 @@ class CashUnit(models.Model): value = False try: value = float(name) - except Exception: - pass + except ValueError: + logger.debug("name %s is not a float. Make pylint happy.", name) if value: recs = self.search([("value", "=", value)] + args, limit=limit) if recs: @@ -139,8 +143,8 @@ class CashUnit(models.Model): if decimal_sep and decimal_sep != ".": try: value = float(name.replace(decimal_sep, ".", 1)) - except Exception: - pass + except ValueError: + logger.debug("name %s is not a float. Make pylint happy.", name) if value: recs = self.search([("value", "=", value)] + args, limit=limit) if recs: diff --git a/account_cash_deposit/report/report_cashdeposit.xml b/account_cash_deposit/report/report_cashdeposit.xml index ed355c7d..363f58d3 100644 --- a/account_cash_deposit/report/report_cashdeposit.xml +++ b/account_cash_deposit/report/report_cashdeposit.xml @@ -56,8 +56,8 @@ Cash Unit - Quantity - Subtotal + Quantity + Subtotal @@ -68,27 +68,30 @@ t-field="line.cash_unit_id.display_name" /> - + - - + + + + + + Loose Coins: + + + + + - + Total: - - + + diff --git a/account_cash_deposit/views/account_cash_deposit.xml b/account_cash_deposit/views/account_cash_deposit.xml index e8a74d41..44ee74f3 100644 --- a/account_cash_deposit/views/account_cash_deposit.xml +++ b/account_cash_deposit/views/account_cash_deposit.xml @@ -66,6 +66,7 @@ name="currency_id" groups="base.group_multi_currency" /> + + @@ -87,6 +89,7 @@ @@ -129,7 +132,11 @@ optional="hide" /> - + + diff --git a/account_cash_deposit/views/cash_unit.xml b/account_cash_deposit/views/cash_unit.xml index f5d9e216..f2f71ec9 100644 --- a/account_cash_deposit/views/cash_unit.xml +++ b/account_cash_deposit/views/cash_unit.xml @@ -17,7 +17,10 @@ attrs="{'invisible': [('active', '=', True)]}" /> - + - + diff --git a/setup/account_cash_deposit/odoo/addons/account_cash_deposit b/setup/account_cash_deposit/odoo/addons/account_cash_deposit new file mode 120000 index 00000000..76cfbf7a --- /dev/null +++ b/setup/account_cash_deposit/odoo/addons/account_cash_deposit @@ -0,0 +1 @@ +../../../../account_cash_deposit \ No newline at end of file diff --git a/setup/account_cash_deposit/setup.py b/setup/account_cash_deposit/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/account_cash_deposit/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)