Compare commits
88 Commits
14.0-imp-a
...
14-fix-mig
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79f76c40f2 | ||
|
|
fd31627fa6 | ||
|
|
2863de99f4 | ||
|
|
16ed41187f | ||
|
|
7129dd1cce | ||
|
|
d2cf9b73d8 | ||
|
|
d6cf5f82e7 | ||
|
|
e9350bac57 | ||
|
|
2e267d717f | ||
|
|
e8b43b67c1 | ||
|
|
f2b5b0b4dd | ||
|
|
a64c60a540 | ||
|
|
b48db5492d | ||
|
|
9026660416 | ||
|
|
d2a9f953b9 | ||
|
|
acff0a421d | ||
|
|
64f54a9389 | ||
|
|
08db759977 | ||
|
|
e07df6b45a | ||
|
|
fc58a9adf5 | ||
|
|
1d463a744d | ||
|
|
dbad21c13a | ||
|
|
aa16b70bdd | ||
|
|
eff63f2be2 | ||
|
|
937595ca2c | ||
|
|
9397bb9fce | ||
|
|
390ce75827 | ||
|
|
819d145763 | ||
|
|
45bbcc0cb3 | ||
|
|
6ddc1b86d5 | ||
|
|
d0b315f648 | ||
|
|
f1eeaa2e8a | ||
|
|
553f05c58f | ||
|
|
50ae5dc9cb | ||
|
|
9c7775dabb | ||
|
|
70f1f13edd | ||
|
|
989960c7c8 | ||
|
|
9b186028c3 | ||
|
|
c2c4957686 | ||
|
|
deb37a1688 | ||
|
|
6d3e4d83c7 | ||
|
|
d382aea22f | ||
|
|
688a07fc5e | ||
|
|
58afed17e5 | ||
|
|
b1b4620cdc | ||
|
|
164397fbac | ||
|
|
3ae427c5de | ||
|
|
db2cd72d04 | ||
|
|
44a92bde2d | ||
|
|
da8849e745 | ||
|
|
23222e997b | ||
|
|
3259a667eb | ||
|
|
9aa65925a9 | ||
|
|
f23aa52b08 | ||
|
|
f4687b886c | ||
|
|
daddd6c17c | ||
|
|
b790aac9d8 | ||
|
|
ca61dbce3f | ||
|
|
6242dec047 | ||
|
|
7b0e4bcb55 | ||
|
|
6c04b2dd5a | ||
|
|
01e209ed43 | ||
|
|
a69556bad0 | ||
|
|
82da5e1afb | ||
|
|
fd5e620373 | ||
|
|
9589db3abe | ||
|
|
c51a847f80 | ||
|
|
a800657f54 | ||
|
|
5fbe6d340a | ||
|
|
f3874a5903 | ||
|
|
f0faa58830 | ||
|
|
b38fc99978 | ||
|
|
372a18365c | ||
|
|
27d86cf151 | ||
|
|
d67141e128 | ||
|
|
02450832cb | ||
|
|
627c5980c9 | ||
|
|
6f27b13bf9 | ||
|
|
1de8676d4e | ||
|
|
9139955fac | ||
|
|
a5b5dd83a2 | ||
|
|
5f704d34a7 | ||
|
|
9087296a54 | ||
|
|
4ac5c23b30 | ||
|
|
403b24ffc1 | ||
|
|
85f8fe5b30 | ||
|
|
fde3dfae10 | ||
|
|
686c6f3900 |
27
account_bank_reconciliation_summary_xlsx/README.rst
Normal file
27
account_bank_reconciliation_summary_xlsx/README.rst
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
===============================
|
||||||
|
Bank Reconciliation Report XLSX
|
||||||
|
===============================
|
||||||
|
|
||||||
|
In Odoo v13+, a bank reconciliation report is not really needed because all the payments executed that are not debited/credited on the bank account are in separate waiting accounts. But accountants want a bank reconciliation report, so this module adds one, even if it is quite different from a classic bank reconciliation report.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
This module doesn't require any configuration.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
You can launch the Bank Reconciliation Report wizard from:
|
||||||
|
|
||||||
|
* the menu *Accounting > Reports > Bank > Bank Reconciliation*,
|
||||||
|
* the invoicing dashboard: on a bank journal, click on the options, then select *Bank Reconciliation*.
|
||||||
|
* the form view of a bank statement: click on the button *Bank Reconciliation Report*.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
2
account_bank_reconciliation_summary_xlsx/__init__.py
Normal file
2
account_bank_reconciliation_summary_xlsx/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import report
|
||||||
|
from . import wizard
|
||||||
21
account_bank_reconciliation_summary_xlsx/__manifest__.py
Normal file
21
account_bank_reconciliation_summary_xlsx/__manifest__.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Copyright 2017-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Bank Reconciliation Report",
|
||||||
|
"version": "14.0.1.0.0",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"author": "Akretion",
|
||||||
|
"website": "https://github.com/akretion/odoo-usability",
|
||||||
|
"summary": "Bank reconciliation XLSX report",
|
||||||
|
"depends": ["account", "report_xlsx"],
|
||||||
|
"data": [
|
||||||
|
"report/report.xml",
|
||||||
|
"wizard/bank_reconciliation_report_wizard_view.xml",
|
||||||
|
"views/account_bank_statement.xml",
|
||||||
|
"views/account_journal.xml",
|
||||||
|
"security/ir.model.access.csv",
|
||||||
|
],
|
||||||
|
"installable": True,
|
||||||
|
}
|
||||||
213
account_bank_reconciliation_summary_xlsx/i18n/fr.po
Normal file
213
account_bank_reconciliation_summary_xlsx/i18n/fr.po
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_bank_reconciliation_summary_xlsx
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2023-01-13 10:31+0000\n"
|
||||||
|
"PO-Revision-Date: 2023-01-13 10:31+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_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr "Montant"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Balance %s:"
|
||||||
|
msgstr "Solde %s :"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__journal_ids
|
||||||
|
msgid "Bank Journals"
|
||||||
|
msgstr "Journaux de banque"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.actions.act_window,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_action
|
||||||
|
#: model:ir.ui.menu,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_menu
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.account_journal_dashboard_kanban_view
|
||||||
|
msgid "Bank Reconciliation"
|
||||||
|
msgstr "Rapprochement bancaire"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.view_bank_statement_form
|
||||||
|
#, python-format
|
||||||
|
msgid "Bank Reconciliation Report"
|
||||||
|
msgstr "Rapport de rapprochement bancaire"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model,name:account_bank_reconciliation_summary_xlsx.model_bank_reconciliation_report_wizard
|
||||||
|
msgid "Bank Reconciliation Report Wizard"
|
||||||
|
msgstr "Assistant rapport de rapprochement bancaire"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.actions.report,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_xlsx
|
||||||
|
msgid "Bank Reconciliation XLSX"
|
||||||
|
msgstr "Rapprochement bancaire XLSX"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model,name:account_bank_reconciliation_summary_xlsx.model_report_bank_reconciliation_xlsx
|
||||||
|
msgid "Bank Reconciliation XLSX Report"
|
||||||
|
msgstr "Rapport de rapprochement bancaire XLSX"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.ui.menu,name:account_bank_reconciliation_summary_xlsx.menu_report_bank_root
|
||||||
|
msgid "Bank Reports"
|
||||||
|
msgstr "Rapports bancaires"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annuler"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__company_id
|
||||||
|
#, python-format
|
||||||
|
msgid "Company"
|
||||||
|
msgstr "Société"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Counter-part"
|
||||||
|
msgstr "Contre partie"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Créé par"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Créé le"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__date
|
||||||
|
#, python-format
|
||||||
|
msgid "Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_report_bank_reconciliation_xlsx__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields.selection,name:account_bank_reconciliation_summary_xlsx.selection__bank_reconciliation_report_wizard__move_state__draft_posted
|
||||||
|
msgid "Draft and Posted Entries"
|
||||||
|
msgstr "Écritures brouillon et comptabilisées"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__move_state
|
||||||
|
#, python-format
|
||||||
|
msgid "Entries"
|
||||||
|
msgstr "Écritures"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_form
|
||||||
|
msgid "Export XLSX"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Generated on %s"
|
||||||
|
msgstr "Généré le %s"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__id
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_report_bank_reconciliation_xlsx__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Journal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Label"
|
||||||
|
msgstr "Libellé"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_report_bank_reconciliation_xlsx____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Move Number"
|
||||||
|
msgstr "Numéro de pièce"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No bank journal selected."
|
||||||
|
msgstr "Aucun journal de banque sélectionné."
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "None"
|
||||||
|
msgstr "Aucun"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Partner"
|
||||||
|
msgstr "Partenaire"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: model:ir.model.fields.selection,name:account_bank_reconciliation_summary_xlsx.selection__bank_reconciliation_report_wizard__move_state__posted
|
||||||
|
msgid "Posted Entries"
|
||||||
|
msgstr "Écritures comptabilisées"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Ref."
|
||||||
|
msgstr "Réf."
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Sub-total:"
|
||||||
|
msgstr "Sous-total :"
|
||||||
|
|
||||||
|
#. module: account_bank_reconciliation_summary_xlsx
|
||||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "TOTAL:"
|
||||||
|
msgstr "TOTAL :"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from . import bank_reconciliation_xlsx
|
||||||
@@ -0,0 +1,296 @@
|
|||||||
|
# Copyright 2017-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import _, models
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
from datetime import datetime
|
||||||
|
from odoo.tools.misc import format_datetime
|
||||||
|
import pytz
|
||||||
|
|
||||||
|
|
||||||
|
class BankReconciliationXlsx(models.AbstractModel):
|
||||||
|
_name = "report.bank.reconciliation.xlsx"
|
||||||
|
_description = "Bank Reconciliation XLSX Report"
|
||||||
|
_inherit = "report.report_xlsx.abstract"
|
||||||
|
|
||||||
|
def _domain_add_move_state(self, wizard, domain):
|
||||||
|
if wizard.move_state == 'posted':
|
||||||
|
domain.append(('parent_state', '=', 'posted'))
|
||||||
|
elif wizard.move_state == 'draft_posted':
|
||||||
|
domain.append(('parent_state', 'in', ('draft', 'posted')))
|
||||||
|
|
||||||
|
def _get_account_balance(self, account, wizard):
|
||||||
|
domain = [
|
||||||
|
('account_id', '=', account.id),
|
||||||
|
('date', '<=', wizard.date),
|
||||||
|
('company_id', '=', wizard.company_id.id),
|
||||||
|
]
|
||||||
|
self._domain_add_move_state(wizard, domain)
|
||||||
|
res_rg = self.env['account.move.line'].read_group(domain, ['balance:sum'], [])
|
||||||
|
account_bal = res_rg and res_rg[0].get('balance', 0.0) or 0.0
|
||||||
|
return account_bal
|
||||||
|
|
||||||
|
def _prepare_payment_move_lines(self, journal, account, wizard, unreconciled_only=True):
|
||||||
|
domain = [
|
||||||
|
("company_id", "=", wizard.company_id.id),
|
||||||
|
("account_id", "=", account.id),
|
||||||
|
("journal_id", "=", journal.id),
|
||||||
|
("date", "<=", wizard.date),
|
||||||
|
]
|
||||||
|
if unreconciled_only:
|
||||||
|
limit_datetime_naive = datetime.combine(wizard.date, datetime.max.time())
|
||||||
|
tz = pytz.timezone(self.env.user.tz)
|
||||||
|
limit_datetime_aware = tz.localize(limit_datetime_naive)
|
||||||
|
limit_datetime_utc = limit_datetime_aware.astimezone(pytz.utc)
|
||||||
|
limit_datetime = limit_datetime_utc.replace(tzinfo=None)
|
||||||
|
domain += [
|
||||||
|
'|', ('full_reconcile_id', '=', False),
|
||||||
|
('full_reconcile_id.create_date', '>', limit_datetime)]
|
||||||
|
self._domain_add_move_state(wizard, domain)
|
||||||
|
mlines = self.env["account.move.line"].search(domain)
|
||||||
|
res = []
|
||||||
|
for mline in mlines:
|
||||||
|
move = mline.move_id
|
||||||
|
cpart = []
|
||||||
|
for line in move.line_ids:
|
||||||
|
if (
|
||||||
|
line.account_id != account
|
||||||
|
and line.account_id.code not in cpart
|
||||||
|
):
|
||||||
|
cpart.append(line.account_id.code)
|
||||||
|
counterpart = " ,".join(cpart)
|
||||||
|
res.append(
|
||||||
|
{
|
||||||
|
"date": mline.date,
|
||||||
|
"ref": move.ref or "",
|
||||||
|
"label": mline.name,
|
||||||
|
"partner": mline.partner_id.display_name or "",
|
||||||
|
"amount": mline.balance,
|
||||||
|
"move_name": move.name,
|
||||||
|
"counterpart": counterpart,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _write_move_lines_block(self, jdi, row, account, add2total=True):
|
||||||
|
sheet = jdi['sheet']
|
||||||
|
style = jdi['style']
|
||||||
|
style_suffix = not add2total and '_warn' or ''
|
||||||
|
subtotal = 0.0
|
||||||
|
mlines = self._prepare_payment_move_lines(jdi['journal'], account, jdi['wizard'])
|
||||||
|
if mlines or add2total:
|
||||||
|
sheet.write(row, 0, '%s %s' % (account.name, account.code), style['title' + style_suffix])
|
||||||
|
sheet.write(row, 1, "", style['title' + style_suffix])
|
||||||
|
|
||||||
|
if not mlines:
|
||||||
|
if add2total:
|
||||||
|
sheet.write(row, 2, _("None"), style['none'])
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
row += 1
|
||||||
|
col_labels = [
|
||||||
|
_("Date"),
|
||||||
|
_("Partner"),
|
||||||
|
_("Amount"),
|
||||||
|
_("Move Number"),
|
||||||
|
_("Counter-part"),
|
||||||
|
_("Ref."),
|
||||||
|
_("Label"),
|
||||||
|
]
|
||||||
|
col = 0
|
||||||
|
for col_label in col_labels:
|
||||||
|
sheet.write(row, col, col_label, style['col_header'])
|
||||||
|
col += 1
|
||||||
|
row += 1
|
||||||
|
start_line = row + 1
|
||||||
|
for mline in mlines:
|
||||||
|
sheet.write(row, 0, mline["date"], style['regular_date'])
|
||||||
|
sheet.write(row, 1, mline["partner"], style['regular'])
|
||||||
|
sheet.write(row, 2, mline["amount"], style['currency'])
|
||||||
|
sheet.write(row, 3, mline["move_name"], style['regular'])
|
||||||
|
sheet.write(row, 4, mline["counterpart"], style['regular'])
|
||||||
|
sheet.write(row, 5, mline["ref"], style['regular'])
|
||||||
|
sheet.write(row, 6, mline["label"], style['regular'])
|
||||||
|
subtotal += mline["amount"]
|
||||||
|
row += 1
|
||||||
|
end_line = row
|
||||||
|
|
||||||
|
for col in range(1):
|
||||||
|
sheet.write(row, col, "", style['title' + style_suffix])
|
||||||
|
sheet.write(row, 1, _("Sub-total:") + ' ', style['title_right' + style_suffix])
|
||||||
|
|
||||||
|
formula = '=SUM(%s%d:%s%d)' % (
|
||||||
|
jdi['total_col'], start_line, jdi['total_col'], end_line)
|
||||||
|
sheet.write_formula(row, 2, formula, style['currency_bg' + style_suffix], subtotal)
|
||||||
|
if add2total:
|
||||||
|
jdi['total'] += subtotal
|
||||||
|
jdi['total_formula'] += '+%s%d' % (jdi['total_col'], row + 1)
|
||||||
|
return row
|
||||||
|
|
||||||
|
def generate_xlsx_report(self, workbook, data, wizard):
|
||||||
|
if not wizard.journal_ids:
|
||||||
|
raise UserError(_("No bank journal selected."))
|
||||||
|
date_dt = wizard.date
|
||||||
|
company = wizard.company_id
|
||||||
|
style = self._get_style(workbook, company)
|
||||||
|
move_state_label = dict(
|
||||||
|
wizard.fields_get('move_state', 'selection')['move_state']['selection'])
|
||||||
|
generated_on_label = _('Generated on %s') % format_datetime(
|
||||||
|
self.env, datetime.utcnow())
|
||||||
|
for journal in wizard.journal_ids:
|
||||||
|
row = 0
|
||||||
|
sheet = workbook.add_worksheet(journal.code or journal.name)
|
||||||
|
jdi = {
|
||||||
|
'wizard': wizard,
|
||||||
|
'journal': journal,
|
||||||
|
'style': style,
|
||||||
|
'sheet': sheet,
|
||||||
|
'total': 0.0,
|
||||||
|
'total_formula': '=',
|
||||||
|
'total_col': 'C',
|
||||||
|
}
|
||||||
|
sheet.write(
|
||||||
|
row,
|
||||||
|
0,
|
||||||
|
_("Bank Reconciliation Report"),
|
||||||
|
style['doc_title'],
|
||||||
|
)
|
||||||
|
row += 1
|
||||||
|
sheet.write(row, 0, generated_on_label, style['small'])
|
||||||
|
sheet.set_row(0, 26)
|
||||||
|
sheet.set_column(0, 0, 10)
|
||||||
|
sheet.set_column(1, 1, 35)
|
||||||
|
sheet.set_column(2, 2, 15)
|
||||||
|
sheet.set_column(3, 3, 15)
|
||||||
|
sheet.set_column(4, 4, 25)
|
||||||
|
sheet.set_column(5, 5, 30)
|
||||||
|
sheet.set_column(6, 6, 60)
|
||||||
|
row += 3
|
||||||
|
sheet.write(row, 0, _("Company"), style['wizard_field'])
|
||||||
|
sheet.write(row, 1, wizard.company_id.display_name, style['wizard_value'])
|
||||||
|
row += 1
|
||||||
|
sheet.write(row, 0, _("Date"), style['wizard_field'])
|
||||||
|
sheet.write(row, 1, date_dt, style['wizard_value_date'])
|
||||||
|
row += 1
|
||||||
|
sheet.write(row, 0, _("Journal"), style['wizard_field'])
|
||||||
|
sheet.write(row, 1, journal.display_name, style['wizard_value'])
|
||||||
|
row += 1
|
||||||
|
sheet.write(row, 0, _("Entries"), style['wizard_field'])
|
||||||
|
sheet.write(row, 1, move_state_label[wizard.move_state], style['wizard_value'])
|
||||||
|
|
||||||
|
# 1) Show balance of bank account
|
||||||
|
row += 3
|
||||||
|
bank_account = journal.default_account_id
|
||||||
|
for col in range(1):
|
||||||
|
sheet.write(row, col, "", style['title'])
|
||||||
|
sheet.write(row, 1, _("Balance %s:") % bank_account.code + ' ', style['title_right'])
|
||||||
|
account_bal = self._get_account_balance(bank_account, wizard)
|
||||||
|
|
||||||
|
sheet.write(row, 2, account_bal, style['currency_bg'])
|
||||||
|
jdi['total'] += account_bal
|
||||||
|
jdi['total_formula'] += '%s%d' % (jdi['total_col'], row + 1)
|
||||||
|
|
||||||
|
row += 2
|
||||||
|
# 2) Show payment lines IN (debit)
|
||||||
|
debit_account = journal.payment_debit_account_id
|
||||||
|
row = self._write_move_lines_block(jdi, row, debit_account)
|
||||||
|
row += 2
|
||||||
|
# 3) Show payment lines OUT (credit)
|
||||||
|
credit_account = journal.payment_credit_account_id
|
||||||
|
row = self._write_move_lines_block(jdi, row, credit_account)
|
||||||
|
row += 2
|
||||||
|
|
||||||
|
for col in range(1):
|
||||||
|
sheet.write(row, col, "", style['title'])
|
||||||
|
sheet.write(row, 1, _("TOTAL:") + ' ', style['title_right'])
|
||||||
|
sheet.write_formula(
|
||||||
|
row, 2, jdi['total_formula'], style['currency_bg'], jdi['total'])
|
||||||
|
row += 3
|
||||||
|
|
||||||
|
# 4) Show suspense account lines
|
||||||
|
row = self._write_move_lines_block(
|
||||||
|
jdi, row, journal.suspense_account_id, add2total=False)
|
||||||
|
|
||||||
|
def _get_style(self, workbook, company):
|
||||||
|
style = {}
|
||||||
|
font_size = 10
|
||||||
|
light_grey = "#eeeeee"
|
||||||
|
title_blue = "#e6e6fa"
|
||||||
|
subtotal_orange = "#ffcc00"
|
||||||
|
title_warn = "#ff9999"
|
||||||
|
subtotal_warn = "#ffff99"
|
||||||
|
light_purple = "#ffdeff"
|
||||||
|
lang_code = self.env.user.lang
|
||||||
|
lang = False
|
||||||
|
if lang_code:
|
||||||
|
lang = self.env["res.lang"].search([("code", "=", lang_code)])
|
||||||
|
if not lang:
|
||||||
|
lang = self.env["res.lang"].search([], limit=1)
|
||||||
|
xls_date_format = (
|
||||||
|
lang.date_format.replace("%Y", "yyyy")
|
||||||
|
.replace("%m", "mm")
|
||||||
|
.replace("%d", "dd")
|
||||||
|
.replace("%y", "yy")
|
||||||
|
)
|
||||||
|
|
||||||
|
style['doc_title'] = workbook.add_format(
|
||||||
|
{"bold": True, "font_size": font_size + 4})
|
||||||
|
style['small'] = workbook.add_format({"font_size": font_size - 3})
|
||||||
|
style['col_header'] = workbook.add_format(
|
||||||
|
{
|
||||||
|
"bold": True,
|
||||||
|
"bg_color": light_grey,
|
||||||
|
"text_wrap": True,
|
||||||
|
"font_size": font_size,
|
||||||
|
"align": "center",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
title_style = {
|
||||||
|
"bold": True,
|
||||||
|
"bg_color": title_blue,
|
||||||
|
"font_size": font_size,
|
||||||
|
"align": "left",
|
||||||
|
}
|
||||||
|
style['title_right'] = workbook.add_format(dict(title_style, align="right"))
|
||||||
|
style['title'] = workbook.add_format(dict(title_style))
|
||||||
|
style['wizard_field'] = workbook.add_format(dict(title_style, bg_color=light_grey))
|
||||||
|
wizard_value_style = {
|
||||||
|
"bg_color": light_purple,
|
||||||
|
"bold": True,
|
||||||
|
"font_size": font_size,
|
||||||
|
"align": "left",
|
||||||
|
}
|
||||||
|
|
||||||
|
style['wizard_value'] = workbook.add_format(wizard_value_style)
|
||||||
|
style['wizard_value_date'] = workbook.add_format(
|
||||||
|
dict(wizard_value_style, num_format=xls_date_format))
|
||||||
|
style['none'] = workbook.add_format(
|
||||||
|
{"bold": True, "font_size": font_size, "align": "right", "bg_color": subtotal_orange}
|
||||||
|
)
|
||||||
|
# WARN for suspense account
|
||||||
|
style['title_warn'] = workbook.add_format(
|
||||||
|
dict(title_style, align="left", bg_color=title_warn))
|
||||||
|
style['title_right_warn'] = workbook.add_format(
|
||||||
|
dict(title_style, align="right", bg_color=title_warn))
|
||||||
|
style['regular'] = workbook.add_format({"font_size": font_size})
|
||||||
|
if "%" in xls_date_format:
|
||||||
|
# fallback
|
||||||
|
xls_date_format = "yyyy-mm-dd"
|
||||||
|
style['regular_date'] = workbook.add_format(
|
||||||
|
{"num_format": xls_date_format, "font_size": font_size, "align": "left"}
|
||||||
|
)
|
||||||
|
cur_format = "#,##0.00 %s" % (
|
||||||
|
company.currency_id.symbol or company.currency_id.name
|
||||||
|
)
|
||||||
|
# It seems that Excel replaces automatically the decimal
|
||||||
|
# and thousand separator by those of the language under which
|
||||||
|
# Excel runs
|
||||||
|
currency_style = {"num_format": cur_format, "font_size": font_size}
|
||||||
|
style['currency'] = workbook.add_format(currency_style)
|
||||||
|
style['currency_bg'] = workbook.add_format(
|
||||||
|
dict(currency_style, bg_color=subtotal_orange))
|
||||||
|
style['currency_bg_warn'] = workbook.add_format(
|
||||||
|
dict(currency_style, bg_color=subtotal_warn))
|
||||||
|
return style
|
||||||
18
account_bank_reconciliation_summary_xlsx/report/report.xml
Normal file
18
account_bank_reconciliation_summary_xlsx/report/report.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!--
|
||||||
|
Copyright 2017-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="bank_reconciliation_xlsx" model="ir.actions.report">
|
||||||
|
<field name="name">Bank Reconciliation XLSX</field>
|
||||||
|
<field name="model">bank.reconciliation.report.wizard</field>
|
||||||
|
<field name="report_type">xlsx</field>
|
||||||
|
<field name="report_name">bank.reconciliation.xlsx</field>
|
||||||
|
<field name="report_file">bank.reconciliation.xlsx</field>
|
||||||
|
<!-- print_report_name doesn't work here... -->
|
||||||
|
<field name="print_report_name">'bank_reconciliation-%s' % (object.date)</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_bank_reconciliation_report_wizard_user,Full access on bank.reconciliation.report.wizard,model_bank_reconciliation_report_wizard,account.group_account_user,1,1,1,1
|
||||||
|
access_bank_reconciliation_report_wizard_readonly,Full access on bank.reconciliation.report.wizard,model_bank_reconciliation_report_wizard,account.group_account_readonly,1,1,1,1
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!--
|
||||||
|
Copyright 2017-2020 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
<odoo>
|
||||||
|
<record id="view_bank_statement_form" model="ir.ui.view">
|
||||||
|
<field name="name">bank_rec_summary.account.bank.statement.form</field>
|
||||||
|
<field name="model">account.bank.statement</field>
|
||||||
|
<field name="inherit_id" ref="account.view_bank_statement_form" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<button name="button_reprocess" position="after">
|
||||||
|
<button
|
||||||
|
name="%(bank_reconciliation_report_wizard_action)d"
|
||||||
|
type="action"
|
||||||
|
string="Bank Reconciliation Report"
|
||||||
|
context="{'default_journal_ids': [journal_id]}"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!--
|
||||||
|
Copyright 2018-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
<odoo>
|
||||||
|
<!-- Accounting Dashboard -->
|
||||||
|
<record id="account_journal_dashboard_kanban_view" model="ir.ui.view">
|
||||||
|
<field
|
||||||
|
name="name"
|
||||||
|
>bank_reconciliation_summarry.account_journal_dashboard</field>
|
||||||
|
<field name="model">account.journal</field>
|
||||||
|
<field name="inherit_id" ref="account.account_journal_dashboard_kanban_view" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//a[@name='open_collect_money']/.." position="before">
|
||||||
|
<div name="bank_reconciliation_report">
|
||||||
|
<a
|
||||||
|
role="menuitem"
|
||||||
|
type="action"
|
||||||
|
name="%(bank_reconciliation_report_wizard_action)d"
|
||||||
|
context="{'default_journal_ids': [active_id]}"
|
||||||
|
>Bank Reconciliation</a>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from . import bank_reconciliation_report_wizard
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Copyright 2017-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class BankReconciliationReportWizard(models.TransientModel):
|
||||||
|
_name = "bank.reconciliation.report.wizard"
|
||||||
|
_description = "Bank Reconciliation Report Wizard"
|
||||||
|
_check_company_auto = True
|
||||||
|
|
||||||
|
company_id = fields.Many2one(
|
||||||
|
'res.company', string='Company',
|
||||||
|
ondelete='cascade', required=True,
|
||||||
|
default=lambda self: self.env.company)
|
||||||
|
date = fields.Date(required=True, default=fields.Date.context_today)
|
||||||
|
move_state = fields.Selection(
|
||||||
|
[("posted", "Posted Entries"), ("draft_posted", "Draft and Posted Entries")],
|
||||||
|
string="Entries",
|
||||||
|
required=True,
|
||||||
|
default="posted",
|
||||||
|
)
|
||||||
|
journal_ids = fields.Many2many(
|
||||||
|
"account.journal",
|
||||||
|
string="Bank Journals",
|
||||||
|
domain="[('type', '=', 'bank'), ('company_id', '=', company_id)]",
|
||||||
|
required=True,
|
||||||
|
check_company=True,
|
||||||
|
default=lambda self: self._default_journal_ids(),
|
||||||
|
)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _default_journal_ids(self):
|
||||||
|
journals = self.env["account.journal"].search(
|
||||||
|
[
|
||||||
|
("type", "=", "bank"),
|
||||||
|
("bank_account_id", "!=", False),
|
||||||
|
("company_id", "=", self.env.company.id),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
return journals
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!--
|
||||||
|
Copyright 2017-2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
<odoo>
|
||||||
|
<record id="bank_reconciliation_report_wizard_form" model="ir.ui.view">
|
||||||
|
<field name="name">bank.reconciliation.report.wizard.form</field>
|
||||||
|
<field name="model">bank.reconciliation.report.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<group name="main">
|
||||||
|
<field name="company_id" invisible="1" />
|
||||||
|
<field name="date" />
|
||||||
|
<field name="journal_ids" widget="many2many_tags" options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="move_state" widget="radio"/>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button
|
||||||
|
name="%(account_bank_reconciliation_summary_xlsx.bank_reconciliation_xlsx)d"
|
||||||
|
string="Export XLSX"
|
||||||
|
type="action"
|
||||||
|
class="btn-primary"
|
||||||
|
/>
|
||||||
|
<button special="cancel" string="Cancel" />
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<record id="bank_reconciliation_report_wizard_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Bank Reconciliation</field>
|
||||||
|
<field name="res_model">bank.reconciliation.report.wizard</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
<menuitem
|
||||||
|
id="menu_report_bank_root"
|
||||||
|
parent="account.menu_finance_reports"
|
||||||
|
name="Bank Reports"
|
||||||
|
sequence="12"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
id="bank_reconciliation_report_wizard_menu"
|
||||||
|
action="bank_reconciliation_report_wizard_action"
|
||||||
|
parent="menu_report_bank_root"
|
||||||
|
sequence="10"
|
||||||
|
/>
|
||||||
|
</odoo>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Account Invoice Update Wizard',
|
'name': 'Account Invoice Update Wizard',
|
||||||
'version': '12.0.1.0.0',
|
'version': '14.0.1.0.0',
|
||||||
'category': 'Accounting & Finance',
|
'category': 'Accounting & Finance',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
|
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
|
||||||
@@ -14,8 +14,9 @@
|
|||||||
'account',
|
'account',
|
||||||
],
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'wizard/account_invoice_update_view.xml',
|
'security/ir.model.access.csv',
|
||||||
'views/account_invoice.xml',
|
'wizard/account_move_update_view.xml',
|
||||||
],
|
'views/account_move.xml',
|
||||||
'installable': False,
|
],
|
||||||
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,243 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_invoice_update_wizard
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \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_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__price_subtotal
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_account_id
|
||||||
|
msgid "Analytic Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_tag_ids
|
||||||
|
msgid "Analytic Tags"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_bank_id
|
||||||
|
msgid "Bank Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Bill Reference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__company_id
|
||||||
|
msgid "Company"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__currency_id
|
||||||
|
msgid "Currency"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Customer Reference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__name
|
||||||
|
msgid "Description"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_type
|
||||||
|
msgid "Display Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_id
|
||||||
|
msgid "Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__invoice_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__line_ids
|
||||||
|
msgid "Invoice Lines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.actions.act_window,name:account_invoice_update_wizard.account_invoice_update_action
|
||||||
|
msgid "Invoice Update Wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move
|
||||||
|
msgid "Journal Entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Non-legal fields of invoice updated via the Invoice Update wizard."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_note
|
||||||
|
msgid "Note"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_id
|
||||||
|
msgid "Partner"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_payment_term_id
|
||||||
|
msgid "Payment Term"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__quantity
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__ref
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__user_id
|
||||||
|
msgid "Salesperson"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_section
|
||||||
|
msgid "Section"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__sequence
|
||||||
|
msgid "Sequence"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_origin
|
||||||
|
msgid "Source Document"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,help:account_invoice_update_wizard.field_account_move_line_update__display_type
|
||||||
|
msgid "Technical field for UX purpose."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"The original payment term '%s' doesn't have the same terms (number of terms "
|
||||||
|
"and/or amount) as the new payment term '%s'. You can only switch to a "
|
||||||
|
"payment term that has the same number of terms with the same amount."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"This wizard doesn't support the update of payment terms on an invoice which "
|
||||||
|
"is partially or fully paid."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__move_type
|
||||||
|
msgid "Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Update"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.view_move_form_inherit
|
||||||
|
msgid "Update Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Update Invoice Wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move_line_update
|
||||||
|
msgid "Update non-legal fields of invoice lines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__parent_id
|
||||||
|
msgid "Wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move_update
|
||||||
|
msgid "Wizard to update non-legal fields of invoice"
|
||||||
|
msgstr ""
|
||||||
250
account_invoice_update_wizard/i18n/fr.po
Normal file
250
account_invoice_update_wizard/i18n/fr.po
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_invoice_update_wizard
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \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_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__price_subtotal
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr "Montant"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_account_id
|
||||||
|
msgid "Analytic Account"
|
||||||
|
msgstr "Compte Analytique"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__analytic_tag_ids
|
||||||
|
msgid "Analytic Tags"
|
||||||
|
msgstr "Tag Analytique"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_bank_id
|
||||||
|
msgid "Bank Account"
|
||||||
|
msgstr "Compte Bancaire"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Bill Reference"
|
||||||
|
msgstr "Reference Client"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annuler"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__company_id
|
||||||
|
msgid "Company"
|
||||||
|
msgstr "Société"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Créé par"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Créé le"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__currency_id
|
||||||
|
msgid "Currency"
|
||||||
|
msgstr "Devise"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Customer Reference"
|
||||||
|
msgstr "Reference Client"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__name
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Description"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nom"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__display_type
|
||||||
|
msgid "Display Type"
|
||||||
|
msgstr "Type Affichage"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move__id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_id
|
||||||
|
msgid "Invoice"
|
||||||
|
msgstr "Facture"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__invoice_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__line_ids
|
||||||
|
msgid "Invoice Lines"
|
||||||
|
msgstr "Ligne de factures"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.actions.act_window,name:account_invoice_update_wizard.account_invoice_update_action
|
||||||
|
msgid "Invoice Update Wizard"
|
||||||
|
msgstr "Assistance de mise à jour de la facture"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move
|
||||||
|
msgid "Journal Entry"
|
||||||
|
msgstr "Entrée comptable"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Non-legal fields of invoice updated via the Invoice Update wizard."
|
||||||
|
msgstr "Champs non légaux mis à jour via l'assistant"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_note
|
||||||
|
msgid "Note"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__partner_id
|
||||||
|
msgid "Partner"
|
||||||
|
msgstr "Client"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_payment_term_id
|
||||||
|
msgid "Payment Term"
|
||||||
|
msgstr "Condition de paiement"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__quantity
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr "Quantité"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__ref
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr "Reference Client"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__user_id
|
||||||
|
msgid "Salesperson"
|
||||||
|
msgstr "Vendeur"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields.selection,name:account_invoice_update_wizard.selection__account_move_line_update__display_type__line_section
|
||||||
|
msgid "Section"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__sequence
|
||||||
|
msgid "Sequence"
|
||||||
|
msgstr "Sequence"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__invoice_origin
|
||||||
|
msgid "Source Document"
|
||||||
|
msgstr "Origine du document"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,help:account_invoice_update_wizard.field_account_move_line_update__display_type
|
||||||
|
msgid "Technical field for UX purpose."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"The original payment term '%s' doesn't have the same terms (number of terms "
|
||||||
|
"and/or amount) as the new payment term '%s'. You can only switch to a "
|
||||||
|
"payment term that has the same number of terms with the same amount."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: code:addons/account_invoice_update_wizard/wizard/account_move_update.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"This wizard doesn't support the update of payment terms on an invoice which "
|
||||||
|
"is partially or fully paid."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_update__move_type
|
||||||
|
msgid "Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Update"
|
||||||
|
msgstr "Mettre à jour"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.view_move_form_inherit
|
||||||
|
msgid "Update Invoice"
|
||||||
|
msgstr "Mettre à jour"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_invoice_update_wizard.account_invoice_update_form
|
||||||
|
msgid "Update Invoice Wizard"
|
||||||
|
msgstr "Assistant de mise à jour"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move_line_update
|
||||||
|
msgid "Update non-legal fields of invoice lines"
|
||||||
|
msgstr "Mettre à jour les champs non légaux des lignes de facture"
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model.fields,field_description:account_invoice_update_wizard.field_account_move_line_update__parent_id
|
||||||
|
msgid "Wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_invoice_update_wizard
|
||||||
|
#: model:ir.model,name:account_invoice_update_wizard.model_account_move_update
|
||||||
|
msgid "Wizard to update non-legal fields of invoice"
|
||||||
|
msgstr "Assistant pour mettre à jours les champs non légaux"
|
||||||
|
|
||||||
|
#~ msgid "Account"
|
||||||
|
#~ msgstr "Compte"
|
||||||
@@ -1 +1 @@
|
|||||||
from . import account_invoice
|
from . import account_move
|
||||||
|
|||||||
@@ -1,22 +1,18 @@
|
|||||||
# Copyright 2019 Camptocamp
|
# Copyright 2019-2022 Camptocamp
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields, api, _
|
from odoo import models
|
||||||
from odoo.exceptions import UserError
|
|
||||||
import odoo.addons.decimal_precision as dp
|
|
||||||
|
|
||||||
|
|
||||||
class AccountInvoice(models.Model):
|
class AccountMove(models.Model):
|
||||||
_inherit = 'account.invoice'
|
_inherit = 'account.move'
|
||||||
|
|
||||||
def prepare_update_wizard(self):
|
def prepare_update_wizard(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
wizard = self.env['account.invoice.update']
|
wizard = self.env['account.move.update']
|
||||||
res = wizard._prepare_default_get(self)
|
res = wizard._prepare_default_get(self)
|
||||||
action = self.env.ref(
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
'account_invoice_update_wizard.account_invoice_update_action'
|
'account_invoice_update_wizard.account_invoice_update_action')
|
||||||
).read()[0]
|
|
||||||
action['name'] = "Update Wizard"
|
action['name'] = "Update Wizard"
|
||||||
action['res_id'] = wizard.create(res).id
|
action['res_id'] = wizard.create(res).id
|
||||||
return action
|
return action
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_account_move_update,account.move.update.user,model_account_move_update,account.group_account_invoice,1,1,1,1
|
||||||
|
access_account_move_line_update,account.move.line.update.user,model_account_move_line_update,account.group_account_invoice,1,1,1,1
|
||||||
|
@@ -1 +1 @@
|
|||||||
from . import test_account_invoice_update_wizard
|
from . import test_account_move_update_wizard
|
||||||
|
|||||||
@@ -1,196 +0,0 @@
|
|||||||
# Copyright 2018-2019 Camptocamp
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
from odoo.tests.common import SavepointCase
|
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
|
|
||||||
class TestAccountInvoiceUpdateWizard(SavepointCase):
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def setUpClass(cls):
|
|
||||||
super().setUpClass()
|
|
||||||
cls.customer12 = cls.env.ref('base.res_partner_12')
|
|
||||||
cls.product16 = cls.env.ref('product.product_product_16')
|
|
||||||
cls.product24 = cls.env.ref('product.product_product_24')
|
|
||||||
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
|
|
||||||
|
|
||||||
cls.invoice1 = cls.env['account.invoice'].create({
|
|
||||||
'name': 'Test invoice',
|
|
||||||
'partner_id': cls.customer12.id,
|
|
||||||
})
|
|
||||||
cls.inv_line1 = cls.env['account.invoice.line'].create({
|
|
||||||
'invoice_id': cls.invoice1.id,
|
|
||||||
'name': "Line1",
|
|
||||||
'product_id': cls.product16.id,
|
|
||||||
'product_uom_id': uom_unit.id,
|
|
||||||
'account_id': cls.invoice1.account_id.id,
|
|
||||||
'price_unit': 42.0,
|
|
||||||
})
|
|
||||||
cls.inv_line2 = cls.env['account.invoice.line'].create({
|
|
||||||
'invoice_id': cls.invoice1.id,
|
|
||||||
'name': "Line2",
|
|
||||||
'product_id': cls.product24.id,
|
|
||||||
'product_uom_id': uom_unit.id,
|
|
||||||
'account_id': cls.invoice1.account_id.id,
|
|
||||||
'price_unit': 1111.1,
|
|
||||||
})
|
|
||||||
|
|
||||||
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
|
|
||||||
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
|
|
||||||
cls.atag1 = cls.env.ref('analytic.tag_contract')
|
|
||||||
cls.atag2 = cls.env['account.analytic.tag'].create({
|
|
||||||
'name': 'の',
|
|
||||||
})
|
|
||||||
|
|
||||||
def create_wizard(self, invoice):
|
|
||||||
res = self.invoice1.prepare_update_wizard()
|
|
||||||
self.wiz = self.env['account.invoice.update'].browse(res['res_id'])
|
|
||||||
|
|
||||||
def test_add_analytic_account_line1(self):
|
|
||||||
""" Add analytic account on an invoice line
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- update the move line
|
|
||||||
- create a new analytic line.
|
|
||||||
"""
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.account_analytic_id = self.aa1
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
|
||||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
|
||||||
|
|
||||||
def test_change_analytic_account_line1(self):
|
|
||||||
""" Change analytic account on an invoice line
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- update the move line
|
|
||||||
- update the existing analytic line."""
|
|
||||||
self.inv_line1.account_analytic_id = self.aa2
|
|
||||||
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.account_analytic_id = self.aa1
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
|
||||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
|
||||||
|
|
||||||
def test_error_grouped_move_lines(self):
|
|
||||||
""" Change analytic account on an invoice line
|
|
||||||
after the invoice has been approved where both
|
|
||||||
lines were grouped in the same move line.
|
|
||||||
|
|
||||||
This will raise an error.
|
|
||||||
"""
|
|
||||||
self.invoice1.journal_id.group_invoice_lines = True
|
|
||||||
|
|
||||||
self.inv_line2.product_id = self.product16
|
|
||||||
self.inv_line2.unit_price = 42.0
|
|
||||||
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
line1 = self.wiz.line_ids[0]
|
|
||||||
line1.account_analytic_id = self.aa1
|
|
||||||
with self.assertRaises(UserError):
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
def test_add_analytic_tags_line1(self):
|
|
||||||
""" Add analytic tags on an invoice line
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
This will update move line.
|
|
||||||
"""
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.analytic_tag_ids = self.atag2
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
|
||||||
self.assertFalse(related_ml.analytic_line_ids)
|
|
||||||
|
|
||||||
def test_change_analytic_tags_line1(self):
|
|
||||||
""" Change analytic tags on an invoice line
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
It will update move line and analytic line
|
|
||||||
"""
|
|
||||||
self.inv_line1.account_analytic_id = self.aa2
|
|
||||||
self.inv_line1.analytic_tag_ids = self.atag1
|
|
||||||
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.analytic_tag_ids = self.atag2
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
|
||||||
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
|
||||||
|
|
||||||
def test_add_analytic_info_line1(self):
|
|
||||||
""" Add analytic account and tags on an invoice line
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- update move line
|
|
||||||
- create an analytic line
|
|
||||||
"""
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.account_analytic_id = self.aa1
|
|
||||||
wiz_line.analytic_tag_ids = self.atag2
|
|
||||||
self.wiz.run()
|
|
||||||
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
|
||||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
|
||||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
|
||||||
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
|
||||||
|
|
||||||
def test_empty_analytic_account_line1(self):
|
|
||||||
""" Remove analytic account
|
|
||||||
after the invoice has been approved.
|
|
||||||
|
|
||||||
This will raise an error as it is not implemented.
|
|
||||||
"""
|
|
||||||
self.inv_line1.account_analytic_id = self.aa2
|
|
||||||
|
|
||||||
self.invoice1.action_invoice_open()
|
|
||||||
self.create_wizard(self.invoice1)
|
|
||||||
|
|
||||||
wiz_line = self.wiz.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == self.inv_line1)
|
|
||||||
wiz_line.account_analytic_id = False
|
|
||||||
self.wiz.run()
|
|
||||||
related_ml = self.invoice1.move_id.line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == self.product16)
|
|
||||||
self.assertFalse(related_ml.analytic_account_id)
|
|
||||||
self.assertFalse(related_ml.analytic_line_ids)
|
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
# Copyright 2018-2022 Camptocamp
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo.tests.common import SavepointCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestAccountInvoiceUpdateWizard(SavepointCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
cls.customer12 = cls.env.ref('base.res_partner_12')
|
||||||
|
cls.product16 = cls.env.ref('product.product_product_16')
|
||||||
|
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
|
||||||
|
|
||||||
|
cls.move1 = cls.env['account.move'].create({
|
||||||
|
'name': 'Test invoice',
|
||||||
|
'partner_id': cls.customer12.id,
|
||||||
|
'move_type': 'out_invoice',
|
||||||
|
'invoice_line_ids': [
|
||||||
|
[0, None, {
|
||||||
|
'name': 'Line1',
|
||||||
|
'product_id': cls.product16.id,
|
||||||
|
'product_uom_id': uom_unit.id,
|
||||||
|
'quantity': 1,
|
||||||
|
'price_unit': 42.0,
|
||||||
|
'credit': 42.0,
|
||||||
|
'debit': 0
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
|
||||||
|
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
|
||||||
|
cls.atag1 = cls.env.ref('analytic.tag_contract')
|
||||||
|
cls.atag2 = cls.env['account.analytic.tag'].create({
|
||||||
|
'name': 'の',
|
||||||
|
})
|
||||||
|
|
||||||
|
def create_wizard(self, move):
|
||||||
|
res = move.prepare_update_wizard()
|
||||||
|
self.wiz = self.env['account.move.update'].browse(res['res_id'])
|
||||||
|
|
||||||
|
def test_add_analytic_account_line1(self):
|
||||||
|
""" Add analytic account on a move line
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- update the move line
|
||||||
|
- create a new analytic line.
|
||||||
|
"""
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_account_id = self.aa1
|
||||||
|
self.wiz.run()
|
||||||
|
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||||
|
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||||
|
|
||||||
|
def test_change_analytic_account_line1(self):
|
||||||
|
""" Change analytic account on a move line
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- update the move line
|
||||||
|
- update the existing analytic line."""
|
||||||
|
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||||
|
move_line1.analytic_account_id = self.aa2
|
||||||
|
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_account_id = self.aa1
|
||||||
|
self.wiz.run()
|
||||||
|
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||||
|
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||||
|
|
||||||
|
def test_add_analytic_tags_line1(self):
|
||||||
|
""" Add analytic tags on a move line
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
This will update move line.
|
||||||
|
"""
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_tag_ids = self.atag2
|
||||||
|
self.wiz.run()
|
||||||
|
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||||
|
self.assertFalse(related_ml.analytic_line_ids)
|
||||||
|
|
||||||
|
def test_change_analytic_tags_line1(self):
|
||||||
|
""" Change analytic tags on a move line
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
It will update move line and analytic line
|
||||||
|
"""
|
||||||
|
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||||
|
move_line1.analytic_account_id = self.aa2
|
||||||
|
move_line1.analytic_tag_ids = self.atag1
|
||||||
|
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_tag_ids = self.atag2
|
||||||
|
self.wiz.run()
|
||||||
|
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||||
|
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
||||||
|
|
||||||
|
def test_add_analytic_info_line1(self):
|
||||||
|
""" Add analytic account and tags on a move line
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- update move line
|
||||||
|
- create an analytic line
|
||||||
|
"""
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_account_id = self.aa1
|
||||||
|
wiz_line.analytic_tag_ids = self.atag2
|
||||||
|
self.wiz.run()
|
||||||
|
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||||
|
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||||
|
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||||
|
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
||||||
|
|
||||||
|
def test_empty_analytic_account_line1(self):
|
||||||
|
""" Remove analytic account
|
||||||
|
after the move has been approved.
|
||||||
|
|
||||||
|
This will raise an error as it is not implemented.
|
||||||
|
"""
|
||||||
|
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||||
|
move_line1.analytic_account_id = self.aa2
|
||||||
|
|
||||||
|
self.move1._post()
|
||||||
|
self.create_wizard(self.move1)
|
||||||
|
|
||||||
|
wiz_line = self.wiz.line_ids.filtered(
|
||||||
|
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||||
|
wiz_line.analytic_account_id = False
|
||||||
|
self.wiz.run()
|
||||||
|
related_ml = self.move1.invoice_line_ids.filtered(
|
||||||
|
lambda rec: rec.product_id == self.product16)
|
||||||
|
self.assertFalse(related_ml.analytic_account_id)
|
||||||
|
self.assertFalse(related_ml.analytic_line_ids)
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
-->
|
|
||||||
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<record id="invoice_supplier_form" model="ir.ui.view">
|
|
||||||
<field name="model">account.invoice</field>
|
|
||||||
<field name="inherit_id" ref="account.invoice_supplier_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<button name="action_invoice_draft" position="before">
|
|
||||||
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
|
||||||
</button>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="invoice_form" model="ir.ui.view">
|
|
||||||
<field name="model">account.invoice</field>
|
|
||||||
<field name="inherit_id" ref="account.invoice_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<button name="action_invoice_draft" position="before">
|
|
||||||
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="open,paid" groups="account.group_account_invoice"/>
|
|
||||||
</button>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
19
account_invoice_update_wizard/views/account_move.xml
Normal file
19
account_invoice_update_wizard/views/account_move.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_move_form_inherit" model="ir.ui.view">
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="inherit_id" ref="account.view_move_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<button name="button_draft" position="before">
|
||||||
|
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -1 +1 @@
|
|||||||
from . import account_invoice_update
|
from . import account_move_update
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
# Copyright 2018-2019 Camptocamp
|
# Copyright 2018-2022 Camptocamp
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
@@ -7,38 +7,34 @@ from odoo.exceptions import UserError
|
|||||||
import odoo.addons.decimal_precision as dp
|
import odoo.addons.decimal_precision as dp
|
||||||
|
|
||||||
|
|
||||||
class AccountInvoiceUpdate(models.TransientModel):
|
class AccountMoveUpdate(models.TransientModel):
|
||||||
_name = 'account.invoice.update'
|
_name = 'account.move.update'
|
||||||
_description = 'Wizard to update non-legal fields of invoice'
|
_description = 'Wizard to update non-legal fields of invoice'
|
||||||
|
|
||||||
invoice_id = fields.Many2one(
|
invoice_id = fields.Many2one(
|
||||||
'account.invoice', string='Invoice', required=True,
|
'account.move', string='Invoice', required=True,
|
||||||
readonly=True)
|
readonly=True)
|
||||||
type = fields.Selection(related='invoice_id.type', readonly=True)
|
move_type = fields.Selection(related='invoice_id.move_type')
|
||||||
company_id = fields.Many2one(
|
company_id = fields.Many2one(related='invoice_id.company_id')
|
||||||
related='invoice_id.company_id', readonly=True)
|
partner_id = fields.Many2one(related='invoice_id.partner_id')
|
||||||
partner_id = fields.Many2one(
|
|
||||||
related='invoice_id.partner_id', readonly=True)
|
|
||||||
user_id = fields.Many2one('res.users', string='Salesperson')
|
user_id = fields.Many2one('res.users', string='Salesperson')
|
||||||
payment_term_id = fields.Many2one(
|
invoice_payment_term_id = fields.Many2one(
|
||||||
'account.payment.term', string='Payment Term')
|
'account.payment.term', string='Payment Term')
|
||||||
reference = fields.Char(string='Invoice Reference')
|
ref = fields.Char(string='Reference') # field label is customized in the view
|
||||||
name = fields.Char(string='Reference/Description')
|
invoice_origin = fields.Char(string='Source Document')
|
||||||
origin = fields.Char(string='Source Document')
|
|
||||||
comment = fields.Text('Additional Information')
|
|
||||||
partner_bank_id = fields.Many2one(
|
partner_bank_id = fields.Many2one(
|
||||||
'res.partner.bank', string='Bank Account')
|
'res.partner.bank', string='Bank Account')
|
||||||
line_ids = fields.One2many(
|
line_ids = fields.One2many(
|
||||||
'account.invoice.line.update', 'parent_id', string='Invoice Lines')
|
'account.move.line.update', 'parent_id', string='Invoice Lines')
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _simple_fields2update(self):
|
def _simple_fields2update(self):
|
||||||
'''List boolean, date, datetime, char, text fields'''
|
'''List boolean, date, datetime, char, text fields'''
|
||||||
return ['reference', 'name', 'origin', 'comment']
|
return ['ref', 'invoice_origin']
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _m2o_fields2update(self):
|
def _m2o_fields2update(self):
|
||||||
return ['payment_term_id', 'user_id', 'partner_bank_id']
|
return ['invoice_payment_term_id', 'user_id', 'partner_bank_id']
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _prepare_default_get(self, invoice):
|
def _prepare_default_get(self, invoice):
|
||||||
@@ -52,19 +48,21 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
aa_tags = [(6, 0, aa_tags.ids)] if aa_tags else False
|
aa_tags = [(6, 0, aa_tags.ids)] if aa_tags else False
|
||||||
res['line_ids'].append([0, 0, {
|
res['line_ids'].append([0, 0, {
|
||||||
'invoice_line_id': line.id,
|
'invoice_line_id': line.id,
|
||||||
|
'sequence': line.sequence,
|
||||||
'name': line.name,
|
'name': line.name,
|
||||||
'quantity': line.quantity,
|
'quantity': line.quantity,
|
||||||
'price_subtotal': line.price_subtotal,
|
'price_subtotal': line.price_subtotal,
|
||||||
'account_analytic_id': line.account_analytic_id.id,
|
'analytic_account_id': line.analytic_account_id.id,
|
||||||
|
'currency_id': line.currency_id.id,
|
||||||
'analytic_tag_ids': aa_tags,
|
'analytic_tag_ids': aa_tags,
|
||||||
'display_type': line.display_type,
|
'display_type': line.display_type,
|
||||||
}])
|
}])
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.onchange('type')
|
@api.onchange('move_type')
|
||||||
def type_on_change(self):
|
def move_type_on_change(self):
|
||||||
res = {'domain': {}}
|
res = {'domain': {}}
|
||||||
if self.type in ('out_invoice', 'out_refund'):
|
if self.move_type in ('out_invoice', 'out_refund'):
|
||||||
res['domain']['partner_bank_id'] =\
|
res['domain']['partner_bank_id'] =\
|
||||||
"[('partner_id.ref_company_ids', 'in', [company_id])]"
|
"[('partner_id.ref_company_ids', 'in', [company_id])]"
|
||||||
else:
|
else:
|
||||||
@@ -72,7 +70,6 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
"[('partner_id', '=', partner_id)]"
|
"[('partner_id', '=', partner_id)]"
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _prepare_invoice(self):
|
def _prepare_invoice(self):
|
||||||
vals = {}
|
vals = {}
|
||||||
inv = self.invoice_id
|
inv = self.invoice_id
|
||||||
@@ -82,8 +79,8 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
for m2ofield in self._m2o_fields2update():
|
for m2ofield in self._m2o_fields2update():
|
||||||
if self[m2ofield] != inv[m2ofield]:
|
if self[m2ofield] != inv[m2ofield]:
|
||||||
vals[m2ofield] = self[m2ofield].id or False
|
vals[m2ofield] = self[m2ofield].id or False
|
||||||
if 'payment_term_id' in vals:
|
if 'invoice_payment_term_id' in vals:
|
||||||
pterm_list = self.payment_term_id.compute(
|
pterm_list = self.invoice_payment_term_id.compute(
|
||||||
value=1, date_ref=inv.date_invoice)[0]
|
value=1, date_ref=inv.date_invoice)[0]
|
||||||
if pterm_list:
|
if pterm_list:
|
||||||
vals['date_due'] = max(line[0] for line in pterm_list)
|
vals['date_due'] = max(line[0] for line in pterm_list)
|
||||||
@@ -91,15 +88,15 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _line_simple_fields2update(self):
|
def _line_simple_fields2update(self):
|
||||||
return ["name",]
|
return ["name"]
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _line_m2o_fields2update(self):
|
def _line_m2o_fields2update(self):
|
||||||
return ["account_analytic_id",]
|
return ["analytic_account_id"]
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _line_m2m_fields2update(self):
|
def _line_m2m_fields2update(self):
|
||||||
return ["analytic_tag_ids",]
|
return ["analytic_tag_ids"]
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _prepare_invoice_line(self, line):
|
def _prepare_invoice_line(self, line):
|
||||||
@@ -115,87 +112,45 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
vals[field] = [(6, 0, line[field].ids)]
|
vals[field] = [(6, 0, line[field].ids)]
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
@api.multi
|
def _prepare_move_line_and_analytic_line(self, inv_line):
|
||||||
def _prepare_move(self):
|
|
||||||
mvals = {}
|
|
||||||
inv = self.invoice_id
|
|
||||||
ini_ref = inv.move_id.ref
|
|
||||||
ref = inv.reference or inv.name
|
|
||||||
if ini_ref != ref:
|
|
||||||
mvals['ref'] = ref
|
|
||||||
return mvals
|
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _get_matching_inv_line(self, move_line):
|
|
||||||
""" Find matching invoice line by product """
|
|
||||||
# TODO make it accept more case as lines won't
|
|
||||||
# be grouped unless journal.group_invoice_line is True
|
|
||||||
inv_line = self.invoice_id.invoice_line_ids.filtered(
|
|
||||||
lambda rec: rec.product_id == move_line.product_id)
|
|
||||||
if len(inv_line) != 1:
|
|
||||||
raise UserError(
|
|
||||||
"Cannot match a single invoice line to move line %s" %
|
|
||||||
move_line.name)
|
|
||||||
return inv_line
|
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _prepare_move_line(self, inv_line):
|
|
||||||
mlvals = {}
|
mlvals = {}
|
||||||
inv_line_upd = self.line_ids.filtered(
|
|
||||||
lambda rec: rec.invoice_line_id == inv_line)
|
|
||||||
|
|
||||||
ini_aa = inv_line.account_analytic_id
|
|
||||||
new_aa = inv_line_upd.account_analytic_id
|
|
||||||
|
|
||||||
if ini_aa != new_aa:
|
|
||||||
mlvals['analytic_account_id'] = new_aa.id
|
|
||||||
|
|
||||||
ini_aa_tags = inv_line.analytic_tag_ids
|
|
||||||
new_aa_tags = inv_line_upd.analytic_tag_ids
|
|
||||||
|
|
||||||
if ini_aa_tags != new_aa_tags:
|
|
||||||
mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)]
|
|
||||||
return mlvals
|
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _prepare_analytic_line(self, inv_line):
|
|
||||||
alvals = {}
|
alvals = {}
|
||||||
inv_line_upd = self.line_ids.filtered(
|
inv_line_upd = self.line_ids.filtered(
|
||||||
lambda rec: rec.invoice_line_id == inv_line)
|
lambda rec: rec.invoice_line_id == inv_line)
|
||||||
|
|
||||||
ini_aa = inv_line.account_analytic_id
|
ini_aa = inv_line.analytic_account_id
|
||||||
new_aa = inv_line_upd.account_analytic_id
|
new_aa = inv_line_upd.analytic_account_id
|
||||||
|
|
||||||
if ini_aa != new_aa:
|
if ini_aa != new_aa:
|
||||||
|
mlvals['analytic_account_id'] = new_aa.id
|
||||||
alvals['account_id'] = new_aa.id
|
alvals['account_id'] = new_aa.id
|
||||||
|
|
||||||
ini_aa_tags = inv_line.analytic_tag_ids
|
ini_aa_tags = inv_line.analytic_tag_ids
|
||||||
new_aa_tags = inv_line_upd.analytic_tag_ids
|
new_aa_tags = inv_line_upd.analytic_tag_ids
|
||||||
|
|
||||||
if ini_aa_tags != new_aa_tags:
|
if ini_aa_tags != new_aa_tags:
|
||||||
|
mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)]
|
||||||
alvals['tag_ids'] = [(6, None, new_aa_tags.ids)]
|
alvals['tag_ids'] = [(6, None, new_aa_tags.ids)]
|
||||||
return alvals
|
return mlvals, alvals
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _update_payment_term_move(self):
|
def _update_payment_term_move(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
inv = self.invoice_id
|
inv = self.invoice_id
|
||||||
if (
|
if (
|
||||||
self.payment_term_id and
|
self.invoice_payment_term_id and
|
||||||
self.payment_term_id != inv.payment_term_id and
|
self.invoice_payment_term_id != inv.invoice_payment_term_id):
|
||||||
inv.move_id):
|
|
||||||
# I don't update pay term when the invoice is partially (or fully)
|
# I don't update pay term when the invoice is partially (or fully)
|
||||||
# paid because if you have a payment term with several lines
|
# paid because if you have a payment term with several lines
|
||||||
# of the same amount, you would also have to take into account
|
# of the same amount, you would also have to take into account
|
||||||
# the reconcile marks to put the new maturity date on the right
|
# the reconcile marks to put the new maturity date on the right
|
||||||
# lines
|
# lines
|
||||||
if inv.payment_ids:
|
if inv.payment_id:
|
||||||
raise UserError(_(
|
raise UserError(_(
|
||||||
"This wizard doesn't support the update of payment "
|
"This wizard doesn't support the update of payment "
|
||||||
"terms on an invoice which is partially or fully "
|
"terms on an invoice which is partially or fully "
|
||||||
"paid."))
|
"paid."))
|
||||||
prec = self.env['decimal.precision'].precision_get('Account')
|
prec = self.env['decimal.precision'].precision_get('Account')
|
||||||
term_res = self.payment_term_id.compute(
|
term_res = self.invoice_payment_term_id.compute(
|
||||||
inv.amount_total, inv.date_invoice)[0]
|
inv.amount_total, inv.date_invoice)[0]
|
||||||
new_pterm = {} # key = int(amount * 100), value = [date1, date2]
|
new_pterm = {} # key = int(amount * 100), value = [date1, date2]
|
||||||
for entry in term_res:
|
for entry in term_res:
|
||||||
@@ -220,11 +175,10 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
"new payment term '%s'. You can only switch to a "
|
"new payment term '%s'. You can only switch to a "
|
||||||
"payment term that has the same number of terms "
|
"payment term that has the same number of terms "
|
||||||
"with the same amount.") % (
|
"with the same amount.") % (
|
||||||
inv.payment_term_id.name, self.payment_term_id.name))
|
inv.invoice_payment_term_id.name, self.invoice_payment_term_id.name))
|
||||||
for line in lines:
|
for line in lines:
|
||||||
line.date_maturity = new_pterm[iamount].pop()
|
line.date_maturity = new_pterm[iamount].pop()
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
inv = self.invoice_id
|
inv = self.invoice_id
|
||||||
@@ -235,28 +189,24 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
if ivals:
|
if ivals:
|
||||||
updated = True
|
updated = True
|
||||||
inv.write(ivals)
|
inv.write(ivals)
|
||||||
if inv.move_id:
|
if inv:
|
||||||
mvals = self._prepare_move()
|
for ml in inv.line_ids.filtered(
|
||||||
if mvals:
|
|
||||||
inv.move_id.write(mvals)
|
|
||||||
for ml in inv.move_id.line_ids.filtered(
|
|
||||||
# we are only interested in invoice lines, not tax lines
|
# we are only interested in invoice lines, not tax lines
|
||||||
lambda rec: bool(rec.product_id)
|
lambda rec: bool(rec.product_id)
|
||||||
):
|
):
|
||||||
if ml.credit == 0.0:
|
if ml.credit == 0.0:
|
||||||
continue
|
continue
|
||||||
inv_line = self._get_matching_inv_line(ml)
|
analytic_account = ml.analytic_account_id
|
||||||
mlvals = self._prepare_move_line(inv_line)
|
mlvals, alvals = self._prepare_move_line_and_analytic_line(ml)
|
||||||
if mlvals:
|
if mlvals:
|
||||||
updated = True
|
updated = True
|
||||||
ml.write(mlvals)
|
ml.write(mlvals)
|
||||||
aalines = ml.analytic_line_ids
|
aalines = ml.analytic_line_ids
|
||||||
alvals = self._prepare_analytic_line(inv_line)
|
|
||||||
if aalines and alvals:
|
if aalines and alvals:
|
||||||
updated = True
|
updated = True
|
||||||
if ('account_id' in alvals and
|
if ('account_id' in alvals and
|
||||||
alvals['account_id'] is False):
|
alvals['account_id'] is False):
|
||||||
former_aa = inv_line.account_analytic_id
|
former_aa = analytic_account
|
||||||
to_remove_aalines = aalines.filtered(
|
to_remove_aalines = aalines.filtered(
|
||||||
lambda rec: rec.account_id == former_aa)
|
lambda rec: rec.account_id == former_aa)
|
||||||
# remove existing analytic line
|
# remove existing analytic line
|
||||||
@@ -279,24 +229,26 @@ class AccountInvoiceUpdate(models.TransientModel):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class AccountInvoiceLineUpdate(models.TransientModel):
|
class AccountMoveLineUpdate(models.TransientModel):
|
||||||
_name = 'account.invoice.line.update'
|
_name = 'account.move.line.update'
|
||||||
_description = 'Update non-legal fields of invoice lines'
|
_description = 'Update non-legal fields of invoice lines'
|
||||||
|
_order = "sequence, name"
|
||||||
|
|
||||||
|
sequence = fields.Integer()
|
||||||
parent_id = fields.Many2one(
|
parent_id = fields.Many2one(
|
||||||
'account.invoice.update', string='Wizard', ondelete='cascade')
|
'account.move.update', string='Wizard', ondelete='cascade')
|
||||||
invoice_line_id = fields.Many2one(
|
invoice_line_id = fields.Many2one(
|
||||||
'account.invoice.line', string='Invoice Line', readonly=True)
|
'account.move.line', string='Invoice Line', readonly=True)
|
||||||
name = fields.Text(string='Description', required=True)
|
name = fields.Text(string='Description', required=True)
|
||||||
display_type = fields.Selection([
|
display_type = fields.Selection([
|
||||||
('line_section', "Section"),
|
('line_section', "Section"),
|
||||||
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
|
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
|
||||||
quantity = fields.Float(
|
quantity = fields.Float(
|
||||||
string='Quantity', digits=dp.get_precision('Product Unit of Measure'),
|
string='Quantity', digits='Product Unit of Measure', readonly=True)
|
||||||
readonly=True)
|
price_subtotal = fields.Monetary(
|
||||||
price_subtotal = fields.Float(
|
string='Amount', readonly=True)
|
||||||
string='Amount', readonly=True, digits=dp.get_precision('Account'))
|
analytic_account_id = fields.Many2one(
|
||||||
account_analytic_id = fields.Many2one(
|
|
||||||
'account.analytic.account', string='Analytic Account')
|
'account.analytic.account', string='Analytic Account')
|
||||||
analytic_tag_ids = fields.Many2many(
|
analytic_tag_ids = fields.Many2many(
|
||||||
'account.analytic.tag', string='Analytic Tags')
|
'account.analytic.tag', string='Analytic Tags')
|
||||||
|
currency_id = fields.Many2one('res.currency', readonly=True)
|
||||||
@@ -7,32 +7,33 @@
|
|||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record id="account_invoice_update_form" model="ir.ui.view">
|
<record id="account_invoice_update_form" model="ir.ui.view">
|
||||||
<field name="model">account.invoice.update</field>
|
<field name="model">account.move.update</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Update Invoice Wizard">
|
<form string="Update Invoice Wizard">
|
||||||
<group name="main">
|
<group name="main">
|
||||||
<field name="invoice_id" invisible="1"/>
|
<field name="invoice_id" invisible="1"/>
|
||||||
<field name="type" invisible="1"/>
|
<field name="move_type" invisible="1"/>
|
||||||
<field name="company_id" invisible="1"/>
|
<field name="company_id" invisible="1"/>
|
||||||
<field name="partner_id" invisible="1"/>
|
<field name="partner_id" invisible="1"/>
|
||||||
<field name="reference" attrs="{'invisible': [('type', 'not in', ('in_invoice', 'in_refund'))]}"/>
|
<field string="Bill Reference" attrs="{'invisible': [('move_type', 'not in', ('in_invoice', 'in_refund'))]}" name="ref"/>
|
||||||
<field name="origin"/>
|
<field string="Customer Reference" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}" name="ref"/>
|
||||||
<field name="name"/>
|
<field name="invoice_origin"/>
|
||||||
<field name="payment_term_id" widget="selection"/>
|
<!-- update of payment term is broken -->
|
||||||
|
<!-- <field name="invoice_payment_term_id" widget="selection"/>-->
|
||||||
<field name="partner_bank_id"/>
|
<field name="partner_bank_id"/>
|
||||||
<field name="user_id"/>
|
<field name="user_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True}"/>
|
||||||
<field name="comment"/>
|
|
||||||
</group>
|
</group>
|
||||||
<group name="lines">
|
<group name="lines">
|
||||||
<field name="line_ids" nolabel="1">
|
<field name="line_ids" nolabel="1" widget="section_and_note_one2many">
|
||||||
<tree editable="bottom" create="false" delete="false" edit="true">
|
<tree editable="bottom" create="false" delete="false" edit="true">
|
||||||
<field name="invoice_line_id" invisible="1"/>
|
<field name="invoice_line_id" invisible="1"/>
|
||||||
<field name="display_type" invisible="1"/>
|
<field name="display_type" invisible="1"/>
|
||||||
|
<field name="currency_id" invisible="1"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="quantity" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
<field name="quantity" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
||||||
<field name="price_subtotal" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
<field name="price_subtotal" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
||||||
<field name="account_analytic_id" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting"/>
|
<field name="analytic_account_id" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting"/>
|
||||||
<field name="analytic_tag_ids" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting" widget="many2many_tags"/>
|
<field name="analytic_tag_ids" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_tags" widget="many2many_tags"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</group>
|
</group>
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
|
|
||||||
<record id="account_invoice_update_action" model="ir.actions.act_window">
|
<record id="account_invoice_update_action" model="ir.actions.act_window">
|
||||||
<field name="name">Invoice Update Wizard</field>
|
<field name="name">Invoice Update Wizard</field>
|
||||||
<field name="res_model">account.invoice.update</field>
|
<field name="res_model">account.move.update</field>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="target">new</field>
|
<field name="target">new</field>
|
||||||
</record>
|
</record>
|
||||||
39
account_invoice_update_wizard_payment_mode/README.rst
Normal file
39
account_invoice_update_wizard_payment_mode/README.rst
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
Account Invoice Update Wizard
|
||||||
|
=============================
|
||||||
|
|
||||||
|
This module adds a button *Update Invoice* on Customer and Supplier invoices in
|
||||||
|
Open or Paid state. This button starts a wizard which allows the user to update
|
||||||
|
non-legal fields of the invoice:
|
||||||
|
|
||||||
|
* Source Document
|
||||||
|
* Reference/Description
|
||||||
|
* Payment terms (update allowed only to a payment term with same number of terms
|
||||||
|
of the same amount and on invoices without any payment)
|
||||||
|
* Bank Account
|
||||||
|
* Salesman
|
||||||
|
* Notes
|
||||||
|
* Description of invoice lines
|
||||||
|
* Analytic account
|
||||||
|
* Analytic tags
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues
|
||||||
|
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
|
||||||
|
check there if your issue has already been reported. If you spotted it first,
|
||||||
|
help us smash it by providing detailed and welcomed feedback.
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* Florian da Costa <florian.dacosta@akretion.com>
|
||||||
|
* Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
|
||||||
|
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
|
||||||
|
* Mykhailo Panarin <m.panarin@mobilunity.com>
|
||||||
|
* Artem Kostyuk <a.kostyuk@mobilunity.com>
|
||||||
1
account_invoice_update_wizard_payment_mode/__init__.py
Normal file
1
account_invoice_update_wizard_payment_mode/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import wizard
|
||||||
17
account_invoice_update_wizard_payment_mode/__manifest__.py
Normal file
17
account_invoice_update_wizard_payment_mode/__manifest__.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Account Invoice Update Wizard Payment Mode',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Accounting & Finance',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Add Payment Mode to Invoice Update Wizard',
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
|
'depends': ['account_invoice_update_wizard', 'account_payment_partner'],
|
||||||
|
'data': ['wizard/account_move_update_view.xml'],
|
||||||
|
'installable': True,
|
||||||
|
'auto_install': True,
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_move_form_inherit" model="ir.ui.view">
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="inherit_id" ref="account.view_move_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<button name="button_draft" position="before">
|
||||||
|
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
from . import account_move_update
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
|
||||||
|
class AccountMoveUpdate(models.TransientModel):
|
||||||
|
_inherit = 'account.move.update'
|
||||||
|
|
||||||
|
payment_mode_filter_type_domain = fields.Char(
|
||||||
|
related='invoice_id.payment_mode_filter_type_domain')
|
||||||
|
partner_bank_filter_type_domain = fields.Many2one(
|
||||||
|
related='invoice_id.partner_bank_filter_type_domain')
|
||||||
|
bank_account_required = fields.Boolean(
|
||||||
|
related='invoice_id.bank_account_required')
|
||||||
|
payment_mode_id = fields.Many2one("account.payment.mode")
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _m2o_fields2update(self):
|
||||||
|
m2o_list = super()._m2o_fields2update()
|
||||||
|
m2o_list.append('payment_mode_id')
|
||||||
|
return m2o_list
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="account_invoice_update_form" model="ir.ui.view">
|
||||||
|
<field name="model">account.move.update</field>
|
||||||
|
<field name="inherit_id" ref="account_invoice_update_wizard.account_invoice_update_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="partner_bank_id" position="before">
|
||||||
|
<field name="payment_mode_filter_type_domain" invisible="1"/>
|
||||||
|
<field name="partner_bank_filter_type_domain" invisible="1"/>
|
||||||
|
<field name="bank_account_required" invisible="1"/>
|
||||||
|
<field name="payment_mode_id" domain="[('payment_type', '=', payment_mode_filter_type_domain), ('company_id', '=', company_id)]"/>
|
||||||
|
</field>
|
||||||
|
<field name="partner_bank_id" position="attributes">
|
||||||
|
<attribute name="domain">
|
||||||
|
[('partner_id', '=', partner_bank_filter_type_domain),
|
||||||
|
'|',('company_id', '=', company_id),('company_id', '=', False)]
|
||||||
|
</attribute>
|
||||||
|
<attribute name="attrs">{'required': [('bank_account_required', '=', True),('move_type', 'in', ('in_invoice', 'in_refund'))]}</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
0
account_menu_usability/__init__.py
Normal file
0
account_menu_usability/__init__.py
Normal file
18
account_menu_usability/__manifest__.py
Normal file
18
account_menu_usability/__manifest__.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Account Menu Usability',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Accounting & Finance',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Small usability enhancements in account_menu module',
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
|
'depends': ['account_menu'],
|
||||||
|
'data': [
|
||||||
|
'views/account_menu.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
20
account_menu_usability/views/account_menu.xml
Normal file
20
account_menu_usability/views/account_menu.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Accounting Templates are useful only when creating a new company/loading
|
||||||
|
a chart of accounts, so we put it under 'Settings > Technical' and not
|
||||||
|
under 'Invoicing > Configuration' which already has a lot of menu entries -->
|
||||||
|
<record id="account_menu.menu_account_coa_settings" model="ir.ui.menu">
|
||||||
|
<field name="name">Accounting Templates</field>
|
||||||
|
<field name="parent_id" ref="base.menu_custom"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
1
account_move_label_copy/__init__.py
Normal file
1
account_move_label_copy/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
29
account_move_label_copy/__manifest__.py
Normal file
29
account_move_label_copy/__manifest__.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Copyright 2022 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Account Move Label Copy',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Accounting & Finance',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'When creating a Journal Entry manually, copy label from line to line',
|
||||||
|
'description': """
|
||||||
|
Account Move Label Copy
|
||||||
|
=======================
|
||||||
|
|
||||||
|
This module is ONLY for users who don't accept to use the 'Reference' (ref) to store the description of the journal entry (the recommended method), but want to use the label on the lines for that purpose (name field of account.move.line). With this module, the label of the first line will be copied by default to the other lines upon creation of each line.
|
||||||
|
|
||||||
|
I don't recommend the use of this module.
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'http://www.akretion.com',
|
||||||
|
'depends': [
|
||||||
|
'account',
|
||||||
|
'base_view_inheritance_extension',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'views/account_move.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
1
account_move_label_copy/models/__init__.py
Normal file
1
account_move_label_copy/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import account_move
|
||||||
13
account_move_label_copy/models/account_move.py
Normal file
13
account_move_label_copy/models/account_move.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountMove(models.Model):
|
||||||
|
_inherit = "account.move"
|
||||||
|
|
||||||
|
default_move_line_name = fields.Char(
|
||||||
|
related='line_ids.name',
|
||||||
|
string='Default Journal Item Label')
|
||||||
23
account_move_label_copy/views/account_move.xml
Normal file
23
account_move_label_copy/views/account_move.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_move_form" model="ir.ui.view">
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="inherit_id" ref="account.view_move_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="narration" position="after">
|
||||||
|
<field name="default_move_line_name" invisible="1"/>
|
||||||
|
</field>
|
||||||
|
<xpath expr="//page[@id='aml_tab']/field[@name='line_ids']" position="attributes">
|
||||||
|
<attribute name="context" operation="python_dict" key="default_name">default_move_line_name</attribute>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
from . import models
|
from . import models
|
||||||
from . import wizard
|
from . import wizard
|
||||||
|
from .hooks import post_init_hook
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Account Usability',
|
'name': 'Account Usability',
|
||||||
'version': '14.0.1.0.0',
|
'version': '14.0.1.1.0',
|
||||||
'category': 'Accounting & Finance',
|
'category': 'Accounting & Finance',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Small usability enhancements in account module',
|
'summary': 'Small usability enhancements in account module',
|
||||||
@@ -12,7 +12,6 @@
|
|||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': [
|
'depends': [
|
||||||
'account',
|
'account',
|
||||||
'base_view_inheritance_extension',
|
|
||||||
'base_usability', # needed only to access base_usability.group_nobody
|
'base_usability', # needed only to access base_usability.group_nobody
|
||||||
# in v12, I may create a module only for group_nobody
|
# in v12, I may create a module only for group_nobody
|
||||||
],
|
],
|
||||||
@@ -30,9 +29,9 @@
|
|||||||
'views/account_tax.xml',
|
'views/account_tax.xml',
|
||||||
'views/product.xml',
|
'views/product.xml',
|
||||||
'views/res_config_settings.xml',
|
'views/res_config_settings.xml',
|
||||||
'views/res_partner.xml',
|
|
||||||
'views/res_company.xml',
|
'views/res_company.xml',
|
||||||
'views/account_report.xml',
|
'views/account_report.xml',
|
||||||
|
'views/account_reconcile_model.xml',
|
||||||
'wizard/account_invoice_mark_sent_view.xml',
|
'wizard/account_invoice_mark_sent_view.xml',
|
||||||
'wizard/account_group_generate_view.xml',
|
'wizard/account_group_generate_view.xml',
|
||||||
'wizard/account_payment_register_views.xml',
|
'wizard/account_payment_register_views.xml',
|
||||||
@@ -41,4 +40,5 @@
|
|||||||
],
|
],
|
||||||
'qweb': ['static/src/xml/account_payment.xml'],
|
'qweb': ['static/src/xml/account_payment.xml'],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
"post_init_hook": "post_init_hook",
|
||||||
}
|
}
|
||||||
|
|||||||
32
account_usability/dashboard-balance_plus_outstanding.diff
Normal file
32
account_usability/dashboard-balance_plus_outstanding.diff
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
diff --git a/addons/account/models/account_journal_dashboard.py b/addons/account/models/account_journal_dashboard.py
|
||||||
|
index 49e166e5823..5e352c03d7a 100644
|
||||||
|
--- a/addons/account/models/account_journal_dashboard.py
|
||||||
|
+++ b/addons/account/models/account_journal_dashboard.py
|
||||||
|
@@ -309,6 +309,7 @@ class account_journal(models.Model):
|
||||||
|
'has_at_least_one_statement': has_at_least_one_statement,
|
||||||
|
'nb_lines_bank_account_balance': nb_lines_bank_account_balance,
|
||||||
|
'outstanding_pay_account_balance': formatLang(self.env, currency.round(outstanding_pay_account_balance), currency_obj=currency),
|
||||||
|
+ 'account_balance_plus_outstanding': formatLang(self.env, currency.round(bank_account_balance + outstanding_pay_account_balance), currency_obj=currency),
|
||||||
|
'nb_lines_outstanding_pay_account_balance': nb_lines_outstanding_pay_account_balance,
|
||||||
|
'last_balance': formatLang(self.env, currency.round(last_balance) + 0.0, currency_obj=currency),
|
||||||
|
'number_draft': number_draft,
|
||||||
|
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml
|
||||||
|
index 347a36c265e..fd7fb7b67ca 100644
|
||||||
|
--- a/addons/account/views/account_journal_dashboard_view.xml
|
||||||
|
+++ b/addons/account/views/account_journal_dashboard_view.xml
|
||||||
|
@@ -278,6 +278,15 @@
|
||||||
|
<span><t t-esc="dashboard.outstanding_pay_account_balance"/></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
+ <div class="row" t-if="dashboard.nb_lines_outstanding_pay_account_balance > 0">
|
||||||
|
+ <div id="dashboard_account_balance_plus_outstanding" class="col overflow-hidden text-left">
|
||||||
|
+ <span title="Balance + Outstanding">Balance + Outstanding</span>
|
||||||
|
+ </div>
|
||||||
|
+ <div class="col-auto text-right">
|
||||||
|
+ <span><t t-esc="dashboard.account_balance_plus_outstanding"/></span>
|
||||||
|
+ </div>
|
||||||
|
+ </div>
|
||||||
|
+
|
||||||
|
<t t-if="dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance">
|
||||||
|
<div class="row" name="latest_statement">
|
||||||
|
<div class="col overflow-hidden text-left">
|
||||||
9
account_usability/hooks.py
Normal file
9
account_usability/hooks.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Copyright 2022 Akretion (https://www.akretion.com).
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import SUPERUSER_ID, api
|
||||||
|
|
||||||
|
def post_init_hook(cr, registry):
|
||||||
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
|
env["account.move.line"].update_matching_number()
|
||||||
691
account_usability/i18n/account_usability.pot
Normal file
691
account_usability/i18n/account_usability.pot
Normal file
@@ -0,0 +1,691 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_usability
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"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_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"%d account groups already exists in company '%s'. This wizard is designed to"
|
||||||
|
" generate account groups from scratch."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_account
|
||||||
|
msgid "Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Account Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move_reversal
|
||||||
|
msgid "Account Move Reversal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_reconciliation_widget
|
||||||
|
msgid "Account Reconciliation widget"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_assets_id
|
||||||
|
msgid "Account Type Current Assets"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_liabilities_id
|
||||||
|
msgid "Account Type Current Liabilities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__account_reconcile
|
||||||
|
msgid "Allow Reconciliation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.constraint,message:account_usability.constraint_account_analytic_account_code_company_unique
|
||||||
|
msgid ""
|
||||||
|
"An analytic account with the same code already exists in the same company!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_analytic_account
|
||||||
|
msgid "Analytic Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "Are you sure to unreconcile all the entrie of the bank statement?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__partner_bank_id
|
||||||
|
msgid ""
|
||||||
|
"Bank Account Number to which the invoice will be paid. A Company bank "
|
||||||
|
"account if this is a Customer Invoice or Vendor Credit Note, otherwise a "
|
||||||
|
"Partner bank account number."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.ui.menu,name:account_usability.res_partner_bank_account_config_menu
|
||||||
|
msgid "Bank Accounts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_bank_statement
|
||||||
|
msgid "Bank Statement"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_bank_statement_line
|
||||||
|
msgid "Bank Statement Line"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.ui.menu,name:account_usability.res_bank_account_config_menu
|
||||||
|
msgid "Banks"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__account_reconcile
|
||||||
|
msgid ""
|
||||||
|
"Check this box if this account allows invoices & payments matching of "
|
||||||
|
"journal items."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
|
msgid "Code"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_company
|
||||||
|
msgid "Companies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_res_partner
|
||||||
|
msgid "Contact"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_credit_ids
|
||||||
|
msgid "Credit journal items that are matched with this journal item."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Current Year"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__date
|
||||||
|
msgid "Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_debit_ids
|
||||||
|
msgid "Debit journal items that are matched with this journal item."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Debit or Credit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_date_due
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__invoice_date_due
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__invoice_date_due
|
||||||
|
msgid "Due Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__end_date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_search
|
||||||
|
msgid "End Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_fiscal_position
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__property_account_position_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_users__property_account_position_id
|
||||||
|
msgid "Fiscal Position"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_fiscalyear
|
||||||
|
msgid "Fiscal Year"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__fiscal_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_payment__fiscal_position_id
|
||||||
|
msgid ""
|
||||||
|
"Fiscal positions are used to adapt taxes and accounts for particular "
|
||||||
|
"customers or sales orders/invoices. The default value comes from the "
|
||||||
|
"customer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__full_reconcile_id
|
||||||
|
msgid "Full Reconcile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Fully Reconciled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid "Generate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.actions.act_window,name:account_usability.account_group_generate_action
|
||||||
|
#: model:ir.model,name:account_usability.model_account_group_generate
|
||||||
|
#: model:ir.ui.menu,name:account_usability.account_group_generate_menu
|
||||||
|
msgid "Generate Account Groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid "Generate account groups"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_analytic_account_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
|
msgid "Group"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
|
msgid "Group By"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_attachment
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_attachment
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_attachment
|
||||||
|
msgid "Has Attachment"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_discount
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_discount
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_discount
|
||||||
|
msgid "Has Discount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__hide_bank_statement_balance
|
||||||
|
msgid "Hide Bank Statement Balance"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_incoterms
|
||||||
|
msgid "Incoterms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__transfer_account_id
|
||||||
|
msgid "Inter-Banks Transfer Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_config_settings__transfer_account_id
|
||||||
|
msgid ""
|
||||||
|
"Intermediary account used when moving money from a liquidity account to "
|
||||||
|
"another"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__product_barcode
|
||||||
|
msgid "International Article Number used for product identification."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__invoice_warn
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_users__invoice_warn
|
||||||
|
msgid "Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
|
msgid "Invoice Legal Terms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_line
|
||||||
|
msgid "Invoice Line"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_report_tree
|
||||||
|
msgid "Invoices Analysis"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_report
|
||||||
|
msgid "Invoices Statistics"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_journal
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__journal_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__journal_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__journal_id
|
||||||
|
msgid "Journal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move
|
||||||
|
msgid "Journal Entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_move_line
|
||||||
|
msgid "Journal Item"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_account____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_analytic_account____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_incoterms____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_partial_reconcile____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_mark_sent__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
|
msgid "Legal Terms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__static_invoice_terms
|
||||||
|
msgid "Legal Terms on Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__level
|
||||||
|
msgid "Level"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.actions.act_window,name:account_usability.account_invoice_mark_sent_action
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Mark as Sent"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid "Mark invoices as sent"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "Missing Attachment"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_partial_reconcile
|
||||||
|
msgid "Partial Reconcile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_credit_ids
|
||||||
|
msgid "Partial Reconcile Credit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_debit_ids
|
||||||
|
msgid "Partial Reconcile Debit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__industry_id
|
||||||
|
msgid "Partner Industry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_payment_term_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__invoice_payment_term_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__invoice_payment_term_id
|
||||||
|
msgid "Payment Terms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/account_move.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Please post the following entries before reconciliation :"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__name_prefix
|
||||||
|
msgid "Prefix"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_account_reconcile_model
|
||||||
|
msgid ""
|
||||||
|
"Preset to create journal entries during a invoices and payments matching"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Previous Year"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_form
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__product_barcode
|
||||||
|
msgid "Product Barcode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_product_template
|
||||||
|
msgid "Product Template"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_product__purchase_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__purchase_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__purchase_price_type
|
||||||
|
msgid "Purchase Price Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__partner_bank_id
|
||||||
|
msgid "Recipient Bank"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__ref
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__ref
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__ref
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__date
|
||||||
|
msgid "Reversal date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__sale_dates
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__sale_dates
|
||||||
|
msgid "Sale Dates"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_product__sale_price_type
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__sale_price_type
|
||||||
|
msgid "Sale Price Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_partner__invoice_warn
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_users__invoice_warn
|
||||||
|
msgid ""
|
||||||
|
"Selecting the \"Warning\" option will notify user with the message, "
|
||||||
|
"Selecting \"Blocking Message\" will throw an exception with the message and "
|
||||||
|
"block the flow. The Message has to be written in the next field."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "Sent"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__start_date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_search
|
||||||
|
msgid "Start Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model,name:account_usability.model_product_supplierinfo
|
||||||
|
msgid "Supplier Pricelist"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.product_supplierinfo_tree_view
|
||||||
|
msgid "Tax"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/product.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Tax excl."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/models/product.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Tax incl."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid ""
|
||||||
|
"The code of account '%s' is %d caracters. It cannot be inferior to level "
|
||||||
|
"(%d)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_partner__property_account_position_id
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_res_users__property_account_position_id
|
||||||
|
msgid ""
|
||||||
|
"The fiscal position determines the taxes/accounts used for this contact."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "The level must be >= 1."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_move__sale_dates
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_payment__sale_dates
|
||||||
|
msgid ""
|
||||||
|
"This information appears on invoice qweb report (you may use it for your own"
|
||||||
|
" report)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
|
msgid ""
|
||||||
|
"This wizard is designed to auto-generate account groups from the chart of "
|
||||||
|
"account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
|
msgid ""
|
||||||
|
"This wizard will mark as <i>sent</i> all the selected invoices in open or "
|
||||||
|
"paid state."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
|
msgid "To Send"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__amount_total
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__amount_total
|
||||||
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__amount_total
|
||||||
|
msgid "Total"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.res_config_settings_view_form
|
||||||
|
msgid ""
|
||||||
|
"Transit account when you transfer money from a bank account of your company "
|
||||||
|
"to another bank account of your company."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
|
msgid "Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "Unreconcile All"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
|
msgid "Unreconciled or Partially Reconciled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
|
msgid "View Journal Entry"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
||||||
|
msgid "View Journal Entry Form"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_usability
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
|
#: model:ir.model.fields,help:account_usability.field_account_journal__hide_bank_statement_balance
|
||||||
|
msgid ""
|
||||||
|
"You may want to enable this option when your bank journal is generated from "
|
||||||
|
"a bank statement file that doesn't handle start/end balance (QIF for "
|
||||||
|
"instance) and you don't want to enter the start/end balance manually: it "
|
||||||
|
"will prevent the display of wrong information in the accounting dashboard "
|
||||||
|
"and on bank statements."
|
||||||
|
msgstr ""
|
||||||
@@ -7,15 +7,14 @@ msgstr ""
|
|||||||
"Project-Id-Version: Odoo Server 14.0\n"
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-06-01 14:17+0000\n"
|
"POT-Creation-Date: 2022-06-01 14:17+0000\n"
|
||||||
"PO-Revision-Date: 2022-06-01 16:22+0200\n"
|
"PO-Revision-Date: 2022-09-18 18:55+0200\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: Alpis Traduction et Interprétation <info@alpis.fr>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: \n"
|
"X-Generator: Poedit 2.0.4\n"
|
||||||
"X-Generator: Poedit 3.0.1\n"
|
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
@@ -24,6 +23,8 @@ msgid ""
|
|||||||
"%d account groups already exists in company '%s'. This wizard is designed "
|
"%d account groups already exists in company '%s'. This wizard is designed "
|
||||||
"to generate account groups from scratch."
|
"to generate account groups from scratch."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"%d des groupes de comptes existent déjà dans la société '%s'. Cet "
|
||||||
|
"assistant est conçu pour créer des groupes de comptes à partir de zéro."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_account
|
#: model:ir.model,name:account_usability.model_account_account
|
||||||
@@ -34,12 +35,12 @@ msgstr "Compte"
|
|||||||
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Account Groups"
|
msgid "Account Groups"
|
||||||
msgstr ""
|
msgstr "Groupes de comptes"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_move_reversal
|
#: model:ir.model,name:account_usability.model_account_move_reversal
|
||||||
msgid "Account Move Reversal"
|
msgid "Account Move Reversal"
|
||||||
msgstr ""
|
msgstr "Extourne d'écritures"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_reconciliation_widget
|
#: model:ir.model,name:account_usability.model_account_reconciliation_widget
|
||||||
@@ -49,12 +50,12 @@ msgstr "Outils de lettrage de compte"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_assets_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_assets_id
|
||||||
msgid "Account Type Current Assets"
|
msgid "Account Type Current Assets"
|
||||||
msgstr ""
|
msgstr "Type de compte actif circulant"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_liabilities_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__account_type_current_liabilities_id
|
||||||
msgid "Account Type Current Liabilities"
|
msgid "Account Type Current Liabilities"
|
||||||
msgstr ""
|
msgstr "Type de compte Dettes à court terme"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__account_reconcile
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__account_reconcile
|
||||||
@@ -66,6 +67,7 @@ msgstr "Autoriser le lettrage"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"An analytic account with the same code already exists in the same company!"
|
"An analytic account with the same code already exists in the same company!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Un compte analytique avec le même code existe déjà dans la même société !"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_analytic_account
|
#: model:ir.model,name:account_usability.model_account_analytic_account
|
||||||
@@ -74,14 +76,14 @@ msgstr "Compte analytique"
|
|||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
msgid "Are you sure to unreconcile all the entrie of the bank statement?"
|
msgid "Are you sure to unreconcile all the entries of the bank statement?"
|
||||||
msgstr "Êtes-vous sûr de vouloir délettrer toute les écritures du relevés?"
|
msgstr "Êtes-vous sûr de vouloir délettrer toutes les écritures du relevé ?"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__balance
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__balance
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
||||||
msgid "Balance"
|
msgid "Balance"
|
||||||
msgstr ""
|
msgstr "Solde"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__partner_bank_id
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
@@ -92,7 +94,7 @@ msgid ""
|
|||||||
"Partner bank account number."
|
"Partner bank account number."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Numéro du compte bancaire sur lequel la facture sera payée. Un compte "
|
"Numéro du compte bancaire sur lequel la facture sera payée. Un compte "
|
||||||
"bancaire de la Société s'il s'agit d'une facture client ou d'un avoir du "
|
"bancaire de la société s'il s'agit d'une facture client ou d'un avoir du "
|
||||||
"fournisseur, sinon un numéro de compte bancaire du tiers."
|
"fournisseur, sinon un numéro de compte bancaire du tiers."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
@@ -103,12 +105,12 @@ msgstr "Comptes bancaires"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_bank_statement
|
#: model:ir.model,name:account_usability.model_account_bank_statement
|
||||||
msgid "Bank Statement"
|
msgid "Bank Statement"
|
||||||
msgstr "Relevé bancaire"
|
msgstr "Relevé de compte"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_bank_statement_line
|
#: model:ir.model,name:account_usability.model_account_bank_statement_line
|
||||||
msgid "Bank Statement Line"
|
msgid "Bank Statement Line"
|
||||||
msgstr "Ligne de relevé bancaire"
|
msgstr "Ligne de relevé de compte"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.ui.menu,name:account_usability.res_bank_account_config_menu
|
#: model:ir.ui.menu,name:account_usability.res_bank_account_config_menu
|
||||||
@@ -133,7 +135,7 @@ msgstr ""
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
msgid "Code"
|
msgid "Code"
|
||||||
msgstr ""
|
msgstr "Code"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_res_company
|
#: model:ir.model,name:account_usability.model_res_company
|
||||||
@@ -148,7 +150,7 @@ msgstr "Paramètres de configuration"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_res_partner
|
#: model:ir.model,name:account_usability.model_res_partner
|
||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr ""
|
msgstr "Contact"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_uid
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__create_uid
|
||||||
@@ -165,29 +167,29 @@ msgstr "Créé le"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_credit_ids
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_credit_ids
|
||||||
msgid "Credit journal items that are matched with this journal item."
|
msgid "Credit journal items that are matched with this journal item."
|
||||||
msgstr "Pièces au crédit qui correspondent à cette pièce."
|
msgstr "Écritures comptables au crédit qui correspondent à cette écriture comptable."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
msgid "Current Year"
|
msgid "Current Year"
|
||||||
msgstr ""
|
msgstr "Année en cours"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__date
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__date
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__date
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__date
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__date
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__date
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr "Date"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_debit_ids
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__matched_debit_ids
|
||||||
msgid "Debit journal items that are matched with this journal item."
|
msgid "Debit journal items that are matched with this journal item."
|
||||||
msgstr "Pièces au débit qui correspondent avec cette pièce."
|
msgstr "Écritures comptables au débit qui correspondent avec cette écriture comptable."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
msgid "Debit or Credit"
|
msgid "Debit or Credit"
|
||||||
msgstr ""
|
msgstr "Débit ou crédit"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_account__display_name
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__display_name
|
||||||
@@ -248,19 +250,19 @@ msgid ""
|
|||||||
"customers or sales orders/invoices. The default value comes from the "
|
"customers or sales orders/invoices. The default value comes from the "
|
||||||
"customer."
|
"customer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
" Les positions fiscales sont utilisées pour adapter les taxes et les "
|
"Les positions fiscales sont utilisées pour adapter les taxes et les comptes "
|
||||||
"comptes à des clients particuliers ou à des bons de commande/factures. La "
|
"à des clients particuliers ou à des bons de commande/factures. La valeur "
|
||||||
"valeur par défaut provient du client."
|
"par défaut provient du client."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__full_reconcile_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__full_reconcile_id
|
||||||
msgid "Full Reconcile"
|
msgid "Full Reconcile"
|
||||||
msgstr ""
|
msgstr "Marque de lettrage"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
msgid "Fully Reconciled"
|
msgid "Fully Reconciled"
|
||||||
msgstr "Lettrage Complet"
|
msgstr "Lettré totalement"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
@@ -272,18 +274,13 @@ msgstr "Générer"
|
|||||||
#: model:ir.model,name:account_usability.model_account_group_generate
|
#: model:ir.model,name:account_usability.model_account_group_generate
|
||||||
#: model:ir.ui.menu,name:account_usability.account_group_generate_menu
|
#: model:ir.ui.menu,name:account_usability.account_group_generate_menu
|
||||||
msgid "Generate Account Groups"
|
msgid "Generate Account Groups"
|
||||||
msgstr ""
|
msgstr "Générer les groupes de comptes"
|
||||||
|
|
||||||
#. module: account_usability
|
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
|
||||||
msgid "Generate account groups"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_analytic_account_search
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_analytic_account_search
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_search
|
||||||
msgid "Group"
|
msgid "Group"
|
||||||
msgstr ""
|
msgstr "Groupe"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
@@ -295,20 +292,20 @@ msgstr "Regrouper par"
|
|||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_attachment
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_attachment
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_attachment
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_attachment
|
||||||
msgid "Has Attachment"
|
msgid "Has Attachment"
|
||||||
msgstr ""
|
msgstr "Possède une pièce jointe"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_discount
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__has_discount
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_discount
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__has_discount
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_discount
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__has_discount
|
||||||
msgid "Has Discount"
|
msgid "Has Discount"
|
||||||
msgstr ""
|
msgstr "A une réduction"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_journal__hide_bank_statement_balance
|
#: model:ir.model.fields,field_description:account_usability.field_account_journal__hide_bank_statement_balance
|
||||||
msgid "Hide Bank Statement Balance"
|
msgid "Hide Bank Statement Balance"
|
||||||
msgstr ""
|
msgstr "Masquer le solde du relevé bancaire"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_account__id
|
#: model:ir.model.fields,field_description:account_usability.field_account_account__id
|
||||||
@@ -330,12 +327,12 @@ msgstr ""
|
|||||||
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__id
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__id
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_res_partner__id
|
#: model:ir.model.fields,field_description:account_usability.field_res_partner__id
|
||||||
msgid "ID"
|
msgid "ID"
|
||||||
msgstr "Identifiant"
|
msgstr "ID"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_incoterms
|
#: model:ir.model,name:account_usability.model_account_incoterms
|
||||||
msgid "Incoterms"
|
msgid "Incoterms"
|
||||||
msgstr ""
|
msgstr "Incoterms"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__transfer_account_id
|
#: model:ir.model.fields,field_description:account_usability.field_res_config_settings__transfer_account_id
|
||||||
@@ -355,6 +352,7 @@ msgstr ""
|
|||||||
#: model:ir.model.fields,help:account_usability.field_account_move_line__product_barcode
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__product_barcode
|
||||||
msgid "International Article Number used for product identification."
|
msgid "International Article Number used for product identification."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Numéro d'article international (IAN) utilisé pour identifier cet article."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_invoice
|
#: model:ir.model,name:account_usability.model_account_invoice
|
||||||
@@ -366,7 +364,7 @@ msgstr "Facture"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
msgid "Invoice Legal Terms"
|
msgid "Invoice Legal Terms"
|
||||||
msgstr ""
|
msgstr "Mentions légales sur les factures"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_invoice_line
|
#: model:ir.model,name:account_usability.model_account_invoice_line
|
||||||
@@ -389,7 +387,7 @@ msgstr "Statistiques des factures"
|
|||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__journal_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__journal_id
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__journal_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__journal_id
|
||||||
msgid "Journal"
|
msgid "Journal"
|
||||||
msgstr ""
|
msgstr "Journal"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_move
|
#: model:ir.model,name:account_usability.model_account_move
|
||||||
@@ -438,12 +436,12 @@ msgstr "Mis à jour le"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_company_form
|
||||||
msgid "Legal Terms"
|
msgid "Legal Terms"
|
||||||
msgstr ""
|
msgstr "Mentions légales"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_res_company__static_invoice_terms
|
#: model:ir.model.fields,field_description:account_usability.field_res_company__static_invoice_terms
|
||||||
msgid "Legal Terms on Invoice"
|
msgid "Legal Terms on Invoice"
|
||||||
msgstr ""
|
msgstr "Mentions légales sur les factures"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__level
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__level
|
||||||
@@ -460,12 +458,12 @@ msgstr "Marquer comme envoyé"
|
|||||||
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
|
#: model:ir.model,name:account_usability.model_account_invoice_mark_sent
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
msgid "Mark invoices as sent"
|
msgid "Mark invoices as sent"
|
||||||
msgstr "Marquer les factures comme envoyé"
|
msgstr "Marquer les factures comme envoyées"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
msgid "Missing Attachment"
|
msgid "Missing Attachment"
|
||||||
msgstr ""
|
msgstr "Pièce jointe manquante"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_account_partial_reconcile
|
#: model:ir.model,name:account_usability.model_account_partial_reconcile
|
||||||
@@ -475,17 +473,17 @@ msgstr "Lettrage partiel"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_credit_ids
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_credit_ids
|
||||||
msgid "Partial Reconcile Credit"
|
msgid "Partial Reconcile Credit"
|
||||||
msgstr ""
|
msgstr "Crédit de lettrage partiel"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_debit_ids
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__matched_debit_ids
|
||||||
msgid "Partial Reconcile Debit"
|
msgid "Partial Reconcile Debit"
|
||||||
msgstr ""
|
msgstr "Débit de lettrage partiel"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__industry_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_invoice_report__industry_id
|
||||||
msgid "Partner Industry"
|
msgid "Partner Industry"
|
||||||
msgstr ""
|
msgstr "Secteur d’activité du partenaire"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_payment_term_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__invoice_payment_term_id
|
||||||
@@ -498,7 +496,7 @@ msgstr "Conditions de paiement"
|
|||||||
#: code:addons/account_usability/models/account_move.py:0
|
#: code:addons/account_usability/models/account_move.py:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Please post the following entries before reconciliation :"
|
msgid "Please post the following entries before reconciliation :"
|
||||||
msgstr ""
|
msgstr "Veuillez comptabiliser les pièces suivantes avant le lettrage :"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__name_prefix
|
#: model:ir.model.fields,field_description:account_usability.field_account_group_generate__name_prefix
|
||||||
@@ -516,17 +514,17 @@ msgstr ""
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
msgid "Previous Year"
|
msgid "Previous Year"
|
||||||
msgstr ""
|
msgstr "Année précédente"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_form
|
||||||
msgid "Print"
|
msgid "Print"
|
||||||
msgstr ""
|
msgstr "Imprimer"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__product_barcode
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__product_barcode
|
||||||
msgid "Product Barcode"
|
msgid "Product Barcode"
|
||||||
msgstr ""
|
msgstr "Code barre du produit"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model,name:account_usability.model_product_template
|
#: model:ir.model,name:account_usability.model_product_template
|
||||||
@@ -538,7 +536,7 @@ msgstr "Modèle de produit"
|
|||||||
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__purchase_price_type
|
#: model:ir.model.fields,field_description:account_usability.field_product_supplierinfo__purchase_price_type
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_product_template__purchase_price_type
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__purchase_price_type
|
||||||
msgid "Purchase Price Type"
|
msgid "Purchase Price Type"
|
||||||
msgstr ""
|
msgstr "Type de prix d’achat"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__partner_bank_id
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__partner_bank_id
|
||||||
@@ -549,7 +547,7 @@ msgstr "Compte bancaire destinataire"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__reconcile_string
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_line__reconcile_string
|
||||||
msgid "Reconcile"
|
msgid "Reconcile"
|
||||||
msgstr ""
|
msgstr "Lettrer"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__ref
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__ref
|
||||||
@@ -561,20 +559,20 @@ msgstr "Référence"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__date
|
#: model:ir.model.fields,field_description:account_usability.field_account_move_reversal__date
|
||||||
msgid "Reversal date"
|
msgid "Reversal date"
|
||||||
msgstr "Date de renversement"
|
msgstr "Date d'extourne"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__sale_dates
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__sale_dates
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__sale_dates
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__sale_dates
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__sale_dates
|
||||||
msgid "Sale Dates"
|
msgid "Sale Dates"
|
||||||
msgstr ""
|
msgstr "Dates de vente"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_product_product__sale_price_type
|
#: model:ir.model.fields,field_description:account_usability.field_product_product__sale_price_type
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_product_template__sale_price_type
|
#: model:ir.model.fields,field_description:account_usability.field_product_template__sale_price_type
|
||||||
msgid "Sale Price Type"
|
msgid "Sale Price Type"
|
||||||
msgstr ""
|
msgstr "Type de prix de vente"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_res_partner__invoice_warn
|
#: model:ir.model.fields,help:account_usability.field_res_partner__invoice_warn
|
||||||
@@ -608,19 +606,19 @@ msgstr "Liste prix fournisseur"
|
|||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.product_supplierinfo_tree_view
|
#: model_terms:ir.ui.view,arch_db:account_usability.product_supplierinfo_tree_view
|
||||||
msgid "Tax"
|
msgid "Tax"
|
||||||
msgstr ""
|
msgstr "Taxe"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: code:addons/account_usability/models/product.py:0
|
#: code:addons/account_usability/models/product.py:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Tax excl."
|
msgid "Tax excl."
|
||||||
msgstr ""
|
msgstr "HT"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: code:addons/account_usability/models/product.py:0
|
#: code:addons/account_usability/models/product.py:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Tax incl."
|
msgid "Tax incl."
|
||||||
msgstr ""
|
msgstr "TTC"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_move_line__balance
|
#: model:ir.model.fields,help:account_usability.field_account_move_line__balance
|
||||||
@@ -638,6 +636,8 @@ msgid ""
|
|||||||
"The code of account '%s' is %d caracters. It cannot be inferior to level "
|
"The code of account '%s' is %d caracters. It cannot be inferior to level "
|
||||||
"(%d)."
|
"(%d)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Le code du compte '%s' fait %d caractères. Il ne peut pas être de niveau "
|
||||||
|
"inférieur à (%d)."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_res_partner__property_account_position_id
|
#: model:ir.model.fields,help:account_usability.field_res_partner__property_account_position_id
|
||||||
@@ -651,16 +651,18 @@ msgstr ""
|
|||||||
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
#: code:addons/account_usability/wizard/account_group_generate.py:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "The level must be >= 1."
|
msgid "The level must be >= 1."
|
||||||
msgstr ""
|
msgstr "Le niveau doit être >= 1."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__sale_dates
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement_line__sale_dates
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_move__sale_dates
|
#: model:ir.model.fields,help:account_usability.field_account_move__sale_dates
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_payment__sale_dates
|
#: model:ir.model.fields,help:account_usability.field_account_payment__sale_dates
|
||||||
msgid ""
|
msgid ""
|
||||||
"This information appears on invoice qweb report (you may use it for your "
|
"This information appear on invoice qweb report (you may use it for your "
|
||||||
"own report)"
|
"own report)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Cette information apparait sur le rapport qweb de la facture (vous "
|
||||||
|
"pouvez les utiliser pour votre propre rapport)"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_group_generate_form
|
||||||
@@ -668,25 +670,28 @@ msgid ""
|
|||||||
"This wizard is designed to auto-generate account groups from the chart of "
|
"This wizard is designed to auto-generate account groups from the chart of "
|
||||||
"account."
|
"account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Cet assistant est conçu pour générer automatiquement les groupes de comptes "
|
||||||
|
"à partir du plan comptable."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.account_invoice_mark_sent_form
|
||||||
msgid ""
|
msgid ""
|
||||||
"This wizard will mark as <i>sent</i> all the selected invoices in open or "
|
"This wizard will mark as <i>sent</i> all the selected posted invoices."
|
||||||
"paid state."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Cet assistant marquera comme <i>envoyées</i> toutes les factures "
|
||||||
|
"sélectionnées et comptabilisées."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_invoice_filter
|
||||||
msgid "To Send"
|
msgid "To Send"
|
||||||
msgstr ""
|
msgstr "À envoyer"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__amount_total
|
#: model:ir.model.fields,field_description:account_usability.field_account_bank_statement_line__amount_total
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_move__amount_total
|
#: model:ir.model.fields,field_description:account_usability.field_account_move__amount_total
|
||||||
#: model:ir.model.fields,field_description:account_usability.field_account_payment__amount_total
|
#: model:ir.model.fields,field_description:account_usability.field_account_payment__amount_total
|
||||||
msgid "Total"
|
msgid "Total"
|
||||||
msgstr ""
|
msgstr "Total"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.res_config_settings_view_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.res_config_settings_view_form
|
||||||
@@ -694,31 +699,33 @@ msgid ""
|
|||||||
"Transit account when you transfer money from a bank account of your company "
|
"Transit account when you transfer money from a bank account of your company "
|
||||||
"to another bank account of your company."
|
"to another bank account of your company."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Compte de transit lorsque vous transférez de l'argent d'un compte bancaire "
|
||||||
|
"de votre entreprise vers un autre compte bancaire de votre entreprise."
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_journal_search
|
||||||
msgid "Type"
|
msgid "Type"
|
||||||
msgstr ""
|
msgstr "Type"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
msgid "Unreconcile All"
|
msgid "Unreconcile All"
|
||||||
msgstr "Tous délettrés"
|
msgstr "Tout délettrer"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_account_move_line_filter
|
||||||
msgid "Unreconciled or Partially Reconciled"
|
msgid "Unreconciled or Partially Reconciled"
|
||||||
msgstr "Non Lettré ou Partiellement Lettré"
|
msgstr "Non lettré ou partiellement lettré"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_bank_statement_form
|
||||||
msgid "View Journal Entry"
|
msgid "View Journal Entry"
|
||||||
msgstr ""
|
msgstr "Voir la pièce comptable"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
#: model_terms:ir.ui.view,arch_db:account_usability.view_move_line_tree
|
||||||
msgid "View Journal Entry Form"
|
msgid "View Journal Entry Form"
|
||||||
msgstr ""
|
msgstr "Voir la pièce comptable en vue formulaire"
|
||||||
|
|
||||||
#. module: account_usability
|
#. module: account_usability
|
||||||
#: model:ir.model.fields,help:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
#: model:ir.model.fields,help:account_usability.field_account_bank_statement__hide_bank_statement_balance
|
||||||
@@ -730,3 +737,8 @@ msgid ""
|
|||||||
"will prevent the display of wrong information in the accounting dashboard "
|
"will prevent the display of wrong information in the accounting dashboard "
|
||||||
"and on bank statements."
|
"and on bank statements."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Vous pouvez activer cette option lorsque votre journal bancaire est généré "
|
||||||
|
"à partir d'un fichier de relevés bancaires qui ne gère pas le solde de "
|
||||||
|
"début/fin (par exemple QIF) et que vous ne souhaitez pas saisir le solde de "
|
||||||
|
"début/fin manuellement : cela empêchera l'affichage d'informations erronées "
|
||||||
|
"dans le tableau de bord comptable et sur les relevés bancaires."
|
||||||
|
|||||||
9
account_usability/migrations/14.0.1.1.0/post-migrate.py
Normal file
9
account_usability/migrations/14.0.1.1.0/post-migrate.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Copyright 2020 ACSONE SA/NV
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import SUPERUSER_ID, api
|
||||||
|
|
||||||
|
|
||||||
|
def migrate(cr, version):
|
||||||
|
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||||
|
env["account.move.line"].update_matching_number()
|
||||||
@@ -10,11 +10,11 @@ class AccountBankStatement(models.Model):
|
|||||||
_inherit = 'account.bank.statement'
|
_inherit = 'account.bank.statement'
|
||||||
|
|
||||||
start_date = fields.Date(
|
start_date = fields.Date(
|
||||||
compute='_compute_dates', string='Start Date', readonly=True,
|
compute='_compute_dates', string='Start Date', store=True)
|
||||||
store=True)
|
|
||||||
end_date = fields.Date(
|
end_date = fields.Date(
|
||||||
compute='_compute_dates', string='End Date', readonly=True,
|
compute='_compute_dates', string='End Date', store=True)
|
||||||
store=True)
|
line_count = fields.Integer(
|
||||||
|
compute='_compute_dates', string='# of Lines', store=True)
|
||||||
hide_bank_statement_balance = fields.Boolean(
|
hide_bank_statement_balance = fields.Boolean(
|
||||||
related='journal_id.hide_bank_statement_balance', readonly=True)
|
related='journal_id.hide_bank_statement_balance', readonly=True)
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@ class AccountBankStatement(models.Model):
|
|||||||
dates = [line.date for line in st.line_ids]
|
dates = [line.date for line in st.line_ids]
|
||||||
st.start_date = dates and min(dates) or False
|
st.start_date = dates and min(dates) or False
|
||||||
st.end_date = dates and max(dates) or False
|
st.end_date = dates and max(dates) or False
|
||||||
|
st.line_count = len(dates)
|
||||||
|
|
||||||
def _check_balance_end_real_same_as_computed(self):
|
def _check_balance_end_real_same_as_computed(self):
|
||||||
for stmt in self:
|
for stmt in self:
|
||||||
@@ -42,6 +43,13 @@ class AccountBankStatement(models.Model):
|
|||||||
res.append((statement.id, name))
|
res.append((statement.id, name))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def button_reopen(self):
|
||||||
|
self = self.with_context(skip_undo_reconciliation=True)
|
||||||
|
return super().button_reopen()
|
||||||
|
|
||||||
|
def button_undo_reconciliation(self):
|
||||||
|
self.line_ids.button_undo_reconciliation()
|
||||||
|
|
||||||
|
|
||||||
class AccountBankStatementLine(models.Model):
|
class AccountBankStatementLine(models.Model):
|
||||||
_inherit = 'account.bank.statement.line'
|
_inherit = 'account.bank.statement.line'
|
||||||
@@ -88,3 +96,9 @@ class AccountBankStatementLine(models.Model):
|
|||||||
'res_id': self.move_id.id,
|
'res_id': self.move_id.id,
|
||||||
})
|
})
|
||||||
return action
|
return action
|
||||||
|
|
||||||
|
def button_undo_reconciliation(self):
|
||||||
|
if self._context.get("skip_undo_reconciliation"):
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
return super().button_undo_reconciliation()
|
||||||
|
|||||||
@@ -9,21 +9,25 @@ class AccountJournal(models.Model):
|
|||||||
_inherit = 'account.journal'
|
_inherit = 'account.journal'
|
||||||
|
|
||||||
hide_bank_statement_balance = fields.Boolean(
|
hide_bank_statement_balance = fields.Boolean(
|
||||||
string='Hide Bank Statement Balance',
|
string='Hide and Disable Bank Statement Balance',
|
||||||
help="You may want to enable this option when your bank "
|
help="When this option is enabled, the start and end balance is "
|
||||||
"journal is generated from a bank statement file that "
|
"not displayed on the bank statement form view, and the check of "
|
||||||
"doesn't handle start/end balance (QIF for instance) and "
|
"the end balance vs the real end balance is disabled. When you enable "
|
||||||
"you don't want to enter the start/end balance manually: it "
|
"this option, you process the statement lines without considering "
|
||||||
"will prevent the display of wrong information in the accounting "
|
"the start/end balance and you regularly check the accounting balance "
|
||||||
"dashboard and on bank statements.")
|
"of the bank account vs the amount of your bank account "
|
||||||
# Used to set default user_type_id on account fields
|
"(the 2 processes are managed separately)."
|
||||||
account_type_current_liabilities_id = fields.Many2one(
|
)
|
||||||
'account.account.type',
|
# Used to set default user_type_id on account fields via context
|
||||||
default=lambda self: self.env.ref('account.data_account_type_current_liabilities').id)
|
|
||||||
account_type_current_assets_id = fields.Many2one(
|
account_type_current_assets_id = fields.Many2one(
|
||||||
'account.account.type',
|
'account.account.type',
|
||||||
default=lambda self: self.env.ref('account.data_account_type_current_assets').id)
|
default=lambda self: self.env.ref('account.data_account_type_current_assets').id)
|
||||||
|
|
||||||
|
# SQL constraint in the 'account' module: unique(code, name, company_id) !!!
|
||||||
|
_sql_constraints = [(
|
||||||
|
'code_unique', 'unique(code, company_id)',
|
||||||
|
'Another journal already has this code in this company!')]
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
|
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
@@ -42,6 +46,22 @@ class AccountJournal(models.Model):
|
|||||||
res.append((journal.id, name))
|
res.append((journal.id, name))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def open_outstanding_payments(self):
|
||||||
|
self.ensure_one()
|
||||||
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
|
"account.action_account_moves_all")
|
||||||
|
action['domain'] = [
|
||||||
|
('account_id', 'in', (self.payment_debit_account_id.id, self.payment_credit_account_id.id)),
|
||||||
|
('journal_id', '=', self.id),
|
||||||
|
('display_type', 'not in', ('line_section', 'line_note')),
|
||||||
|
('parent_state', '!=', 'cancel'),
|
||||||
|
]
|
||||||
|
action['context'] = {
|
||||||
|
'search_default_unreconciled': True,
|
||||||
|
'search_default_posted': True,
|
||||||
|
}
|
||||||
|
return action
|
||||||
|
|
||||||
# @api.constrains('default_credit_account_id', 'default_debit_account_id')
|
# @api.constrains('default_credit_account_id', 'default_debit_account_id')
|
||||||
# def _check_account_type_on_bank_journal(self):
|
# def _check_account_type_on_bank_journal(self):
|
||||||
# bank_acc_type = self.env.ref('account.data_account_type_liquidity')
|
# bank_acc_type = self.env.ref('account.data_account_type_liquidity')
|
||||||
|
|||||||
@@ -2,12 +2,16 @@
|
|||||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
|
import logging
|
||||||
|
|
||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
from odoo.osv import expression
|
||||||
from odoo.tools import float_is_zero
|
from odoo.tools import float_is_zero
|
||||||
from odoo.tools.misc import format_date
|
from odoo.tools.misc import format_date
|
||||||
from odoo.osv import expression
|
|
||||||
from datetime import timedelta
|
_logger = logging.getLogger(__name__)
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
|
|
||||||
class AccountMove(models.Model):
|
class AccountMove(models.Model):
|
||||||
@@ -34,7 +38,7 @@ class AccountMove(models.Model):
|
|||||||
search='_search_has_attachment', readonly=True)
|
search='_search_has_attachment', readonly=True)
|
||||||
sale_dates = fields.Char(
|
sale_dates = fields.Char(
|
||||||
compute="_compute_sales_dates", readonly=True,
|
compute="_compute_sales_dates", readonly=True,
|
||||||
help="This information appears on invoice qweb report "
|
help="This information appear on invoice qweb report "
|
||||||
"(you may use it for your own report)")
|
"(you may use it for your own report)")
|
||||||
|
|
||||||
def _compute_has_discount(self):
|
def _compute_has_discount(self):
|
||||||
@@ -108,6 +112,16 @@ class AccountMove(models.Model):
|
|||||||
# self.invalidate_cache()
|
# self.invalidate_cache()
|
||||||
# return res
|
# return res
|
||||||
|
|
||||||
|
def _reverse_moves(self, default_values_list=None, cancel=False):
|
||||||
|
reverse_moves = super()._reverse_moves(
|
||||||
|
default_values_list=default_values_list, cancel=cancel)
|
||||||
|
# In the simple scenario 1 invoice -> 1 refund, we add a message in the chatter
|
||||||
|
# of the invoice and in the chatter of the refund
|
||||||
|
if len(self) == 1 and len(reverse_moves) == 1:
|
||||||
|
self.message_post(body=_("A reverse journal entry <a href=# data-oe-model=account.move data-oe-id=%d>%s</a> has been generated.") % (reverse_moves.id, reverse_moves.display_name))
|
||||||
|
reverse_moves.message_post(body=_("This journal entry has been generated as the reverse of <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>.") % (self.id, self.display_name))
|
||||||
|
return reverse_moves
|
||||||
|
|
||||||
def delete_lines_qty_zero(self):
|
def delete_lines_qty_zero(self):
|
||||||
lines = self.env['account.move.line'].search([
|
lines = self.env['account.move.line'].search([
|
||||||
('display_type', '=', False),
|
('display_type', '=', False),
|
||||||
@@ -217,7 +231,7 @@ class AccountMove(models.Model):
|
|||||||
if self.is_purchase_document(include_receipts=True):
|
if self.is_purchase_document(include_receipts=True):
|
||||||
tax_lock_date = self.company_id.tax_lock_date
|
tax_lock_date = self.company_id.tax_lock_date
|
||||||
if invoice_date and tax_lock_date and has_tax and invoice_date <= tax_lock_date:
|
if invoice_date and tax_lock_date and has_tax and invoice_date <= tax_lock_date:
|
||||||
invoice_date = tax_lock_date + timedelta(days=1)
|
invoice_date = tax_lock_date + timedelta(days=1)
|
||||||
date = invoice_date
|
date = invoice_date
|
||||||
return date
|
return date
|
||||||
|
|
||||||
@@ -238,21 +252,8 @@ class AccountMoveLine(models.Model):
|
|||||||
full_reconcile_id = fields.Many2one(string='Full Reconcile')
|
full_reconcile_id = fields.Many2one(string='Full Reconcile')
|
||||||
matched_debit_ids = fields.One2many(string='Partial Reconcile Debit')
|
matched_debit_ids = fields.One2many(string='Partial Reconcile Debit')
|
||||||
matched_credit_ids = fields.One2many(string='Partial Reconcile Credit')
|
matched_credit_ids = fields.One2many(string='Partial Reconcile Credit')
|
||||||
reconcile_string = fields.Char(
|
|
||||||
compute='_compute_reconcile_string', string='Reconcile', store=True)
|
|
||||||
# for optional display in tree view
|
# for optional display in tree view
|
||||||
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
|
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
|
||||||
balance = fields.Monetary(
|
|
||||||
string='Balance',
|
|
||||||
default=0.0,
|
|
||||||
currency_field='company_currency_id',
|
|
||||||
compute="_compute_balance",
|
|
||||||
store=True)
|
|
||||||
|
|
||||||
@api.depends("credit", "debit")
|
|
||||||
def _compute_balance(self):
|
|
||||||
for line in self:
|
|
||||||
line.balance = line.debit - line.credit
|
|
||||||
|
|
||||||
def show_account_move_form(self):
|
def show_account_move_form(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
@@ -266,17 +267,26 @@ class AccountMoveLine(models.Model):
|
|||||||
})
|
})
|
||||||
return action
|
return action
|
||||||
|
|
||||||
@api.depends(
|
def update_matching_number(self):
|
||||||
'full_reconcile_id', 'matched_debit_ids', 'matched_credit_ids')
|
records = self.search([("matching_number", "=", "P")])
|
||||||
def _compute_reconcile_string(self):
|
_logger.info(f"Update partial reconcile number for {len(records)} lines")
|
||||||
for line in self:
|
records.compute_partial_matching_number()
|
||||||
rec_str = False
|
|
||||||
if line.full_reconcile_id:
|
def compute_partial_matching_number(self):
|
||||||
rec_str = line.full_reconcile_id.name
|
# TODO maybe it will be better to have the same maching_number for
|
||||||
else:
|
# all partial so it will be easier to group by
|
||||||
rec_str = ', '.join([
|
for record in self:
|
||||||
'a%d' % pr.id for pr in line.matched_debit_ids + line.matched_credit_ids])
|
if record.matching_number == "P":
|
||||||
line.reconcile_string = rec_str
|
matching_number = ", ".join([
|
||||||
|
"a%d" % pr.id
|
||||||
|
for pr in record.matched_debit_ids + record.matched_credit_ids
|
||||||
|
])
|
||||||
|
# use sql to avoid triggering python checks
|
||||||
|
self.env.cr.execute(
|
||||||
|
"""
|
||||||
|
UPDATE account_move_line SET matching_number = %s WHERE id = %s
|
||||||
|
""", (matching_number, record.id)
|
||||||
|
)
|
||||||
|
|
||||||
def _get_computed_name(self):
|
def _get_computed_name(self):
|
||||||
# This is useful when you want to have the product code in a dedicated
|
# This is useful when you want to have the product code in a dedicated
|
||||||
|
|||||||
@@ -13,19 +13,34 @@
|
|||||||
<field name="model">account.bank.statement</field>
|
<field name="model">account.bank.statement</field>
|
||||||
<field name="inherit_id" ref="account.view_bank_statement_form"/>
|
<field name="inherit_id" ref="account.view_bank_statement_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<button name="button_reopen" position="attributes">
|
||||||
|
<attribute name="confirm">Are you sure ? Don't do 'Reset to New' if you just want to modify the bank journal entry of an existing statement line.</attribute>
|
||||||
|
</button>
|
||||||
|
<button name="button_reopen" position="after">
|
||||||
|
<button
|
||||||
|
name="button_undo_reconciliation"
|
||||||
|
type="object"
|
||||||
|
confirm="Are you sure to unreconcile all the entries of the bank statement?"
|
||||||
|
states="open"
|
||||||
|
string="Unreconcile All"/>
|
||||||
|
</button>
|
||||||
<xpath expr="//field[@name='line_ids']/tree/button[@name='button_undo_reconciliation']" position="after">
|
<xpath expr="//field[@name='line_ids']/tree/button[@name='button_undo_reconciliation']" position="after">
|
||||||
<field name="move_id" invisible="1"/>
|
<field name="move_id" invisible="1"/>
|
||||||
<button name="show_account_move" type="object"
|
<button name="show_account_move" type="object"
|
||||||
title="View Journal Entry" icon="fa-arrow-right"/>
|
title="View Journal Entry" icon="fa-arrow-right"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<field name="date" position="after">
|
<xpath expr="//field[@name='balance_end_real']/.." position="after">
|
||||||
<field name="start_date"/>
|
<field name="start_date"/>
|
||||||
<field name="end_date"/>
|
<field name="end_date"/>
|
||||||
<field name="hide_bank_statement_balance" invisible="1"/>
|
<field name="hide_bank_statement_balance" invisible="1"/>
|
||||||
</field>
|
<field name="line_count"/>
|
||||||
|
</xpath>
|
||||||
<field name="date" position="attributes">
|
<field name="date" position="attributes">
|
||||||
<attribute name="invisible">1</attribute>
|
<attribute name="invisible">1</attribute>
|
||||||
</field>
|
</field>
|
||||||
|
<field name="journal_id" position="attributes">
|
||||||
|
<attribute name="widget"></attribute>
|
||||||
|
</field>
|
||||||
<label for="balance_start" position="attributes">
|
<label for="balance_start" position="attributes">
|
||||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
</label>
|
</label>
|
||||||
@@ -41,6 +56,9 @@
|
|||||||
<group name="sale_total" position="attributes">
|
<group name="sale_total" position="attributes">
|
||||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
</group>
|
</group>
|
||||||
|
<div role="alert" position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': ['|', '|', ('hide_bank_statement_balance', '=', True), ('previous_statement_id', '=', False), ('is_valid_balance_start', '=', True)]}</attribute>
|
||||||
|
</div>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -49,12 +67,30 @@
|
|||||||
<field name="model">account.bank.statement</field>
|
<field name="model">account.bank.statement</field>
|
||||||
<field name="inherit_id" ref="account.view_bank_statement_tree"/>
|
<field name="inherit_id" ref="account.view_bank_statement_tree"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<!-- Remove is_difference_zero condition for colors -->
|
||||||
|
<attribute name="decoration-danger"></attribute>
|
||||||
|
<attribute name="decoration-info">state == 'open'</attribute>
|
||||||
|
</tree>
|
||||||
<field name="date" position="attributes">
|
<field name="date" position="attributes">
|
||||||
<attribute name="invisible">1</attribute>
|
<attribute name="invisible">1</attribute>
|
||||||
</field>
|
</field>
|
||||||
<field name="journal_id" position="after">
|
<field name="journal_id" position="after">
|
||||||
<field name="start_date"/>
|
<field name="start_date"/>
|
||||||
<field name="end_date"/>
|
<field name="end_date"/>
|
||||||
|
<field name="line_count" optional="show"/>
|
||||||
|
</field>
|
||||||
|
<field name="balance_start" position="attributes">
|
||||||
|
<attribute name="optional">show</attribute>
|
||||||
|
</field>
|
||||||
|
<field name="balance_end_real" position="attributes">
|
||||||
|
<attribute name="optional">show</attribute>
|
||||||
|
</field>
|
||||||
|
<field name="state" position="attributes">
|
||||||
|
<attribute name="widget">badge</attribute>
|
||||||
|
<attribute name="decoration-info">state == 'open'</attribute>
|
||||||
|
<attribute name="decoration-warning">state == 'posted'</attribute>
|
||||||
|
<attribute name="decoration-success">state == 'confirm'</attribute>
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -14,11 +14,10 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="bank_statements_source" position="after">
|
<field name="bank_statements_source" position="after">
|
||||||
<field name="hide_bank_statement_balance" groups="account.group_account_readonly"/>
|
<field name="hide_bank_statement_balance" groups="account.group_account_readonly"/>
|
||||||
<field name="account_type_current_liabilities_id" invisible="1"/>
|
|
||||||
<field name="account_type_current_assets_id" invisible="1"/>
|
<field name="account_type_current_assets_id" invisible="1"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="suspense_account_id" position="attributes">
|
<field name="suspense_account_id" position="attributes">
|
||||||
<attribute name="context">{'default_user_type_id': account_type_current_liabilities_id, 'default_reconcile': True}</attribute>
|
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': False}</attribute>
|
||||||
</field>
|
</field>
|
||||||
<field name="payment_debit_account_id" position="attributes">
|
<field name="payment_debit_account_id" position="attributes">
|
||||||
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
|
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
|
||||||
@@ -40,6 +39,9 @@
|
|||||||
<xpath expr="//div[@name='latest_statement']/.." position="attributes">
|
<xpath expr="//div[@name='latest_statement']/.." position="attributes">
|
||||||
<attribute name="t-if">dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance and !record.hide_bank_statement_balance.raw_value</attribute>
|
<attribute name="t-if">dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance and !record.hide_bank_statement_balance.raw_value</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<t t-esc="dashboard.outstanding_pay_account_balance" position="replace">
|
||||||
|
<a name="open_outstanding_payments" type="object" title="Outstanding Payments/Receipts"><t t-esc="dashboard.outstanding_pay_account_balance"/></a>
|
||||||
|
</t>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -13,4 +13,9 @@ under "Accounting > Configuration", because most users will try to find it there
|
|||||||
|
|
||||||
<menuitem id="res_partner_bank_account_config_menu" action="base.action_res_partner_bank_account_form" parent="account.account_banks_menu" sequence="20"/>
|
<menuitem id="res_partner_bank_account_config_menu" action="base.action_res_partner_bank_account_form" parent="account.account_banks_menu" sequence="20"/>
|
||||||
|
|
||||||
|
<record id="account.menu_finance" model="ir.ui.menu">
|
||||||
|
<!-- Replace "Invoicing" by "Accounting" -->
|
||||||
|
<field name="name">Accounting</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -38,9 +38,11 @@
|
|||||||
<xpath expr="//field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="attributes">
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="attributes">
|
||||||
<attribute name="optional">show</attribute>
|
<attribute name="optional">show</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='currency_id']" position="attributes">
|
||||||
|
<attribute name="optional">show</attribute>
|
||||||
|
</xpath>
|
||||||
<xpath expr="//field[@name='line_ids']/tree/field[@name='tax_tag_ids']" position="after">
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='tax_tag_ids']" position="after">
|
||||||
<field name="matching_number" optional="hide"/>
|
<field name="matching_number" optional="show"/>
|
||||||
<field name="reconcile_string" optional="show"/>
|
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='product_id']" position="after">
|
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='product_id']" position="after">
|
||||||
<field name="product_barcode" optional="hide"/>
|
<field name="product_barcode" optional="hide"/>
|
||||||
@@ -48,6 +50,16 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="view_invoice_tree" model="ir.ui.view">
|
||||||
|
<field name="model">account.move</field>
|
||||||
|
<field name="inherit_id" ref="account.view_invoice_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="amount_residual_signed" position="attributes">
|
||||||
|
<attribute name="optional">show</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record id="view_account_invoice_filter" model="ir.ui.view">
|
<record id="view_account_invoice_filter" model="ir.ui.view">
|
||||||
<field name="name">account_usability.account.move.search</field>
|
<field name="name">account_usability.account.move.search</field>
|
||||||
<field name="model">account.move</field>
|
<field name="model">account.move</field>
|
||||||
@@ -59,7 +71,13 @@
|
|||||||
<filter name="sent" string="Sent" domain="[('is_move_sent', '=', True), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
|
<filter name="sent" string="Sent" domain="[('is_move_sent', '=', True), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
|
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
|
||||||
</filter>
|
</filter>
|
||||||
|
<filter name="salesperson" position="before">
|
||||||
|
<filter name="commercial_partner_groupby" string="Commercial Partner" context="{'group_by': 'commercial_partner_id'}"/>
|
||||||
|
</filter>
|
||||||
|
<filter name="status" position="after">
|
||||||
|
<filter name="payment_state_groupby" string="Payment Status" context="{'group_by': 'payment_state'}"/>
|
||||||
|
</filter>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -71,7 +89,7 @@
|
|||||||
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
|
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="credit" position="after">
|
<field name="credit" position="after">
|
||||||
<field name="balance" sum="Balance" />
|
<field name="balance" sum="Balance" optional="show"/>
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -87,20 +105,21 @@
|
|||||||
<separator/>
|
<separator/>
|
||||||
</filter>
|
</filter>
|
||||||
<field name="partner_id" position="after">
|
<field name="partner_id" position="after">
|
||||||
<field name="reconcile_string" />
|
<field name="matching_number" />
|
||||||
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
|
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
|
||||||
</field>
|
</field>
|
||||||
<filter name="unreconciled" position="before">
|
<filter name="unreconciled" position="before">
|
||||||
<filter name="reconciled" string="Fully Reconciled" domain="[('reconciled', '=', True)]"/>
|
<filter name="reconciled" string="Fully Reconciled" domain="[('account_id.reconcile', '=', True), ('full_reconcile_id', '!=', False)]"/>
|
||||||
</filter>
|
</filter>
|
||||||
<filter name="unreconciled" position="attributes">
|
<filter name="unreconciled" position="attributes">
|
||||||
<attribute name="string">Unreconciled or Partially Reconciled</attribute>
|
<attribute name="string">Unreconciled or Partially Reconciled</attribute>
|
||||||
<attribute name="domain">[('reconciled', '=', False), ('balance', '!=', 0), ('account_id.reconcile', '=', True)]</attribute>
|
|
||||||
</filter>
|
</filter>
|
||||||
<!--
|
|
||||||
<field name="name" position="attributes">
|
<field name="name" position="attributes">
|
||||||
<attribute name="string">Name or Reference</attribute>
|
<attribute name="string">Label, Reference, Account or Partner</attribute>
|
||||||
</field> -->
|
</field>
|
||||||
|
<field name="name" position="before">
|
||||||
|
<field name="move_id" position="move"/>
|
||||||
|
</field>
|
||||||
<field name="partner_id" position="attributes">
|
<field name="partner_id" position="attributes">
|
||||||
<attribute name="domain">['|', ('parent_id', '=', False), ('is_company', '=', True)]</attribute>
|
<attribute name="domain">['|', ('parent_id', '=', False), ('is_company', '=', True)]</attribute>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
20
account_usability/views/account_reconcile_model.xml
Normal file
20
account_usability/views/account_reconcile_model.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_account_reconcile_model_form" model="ir.ui.view">
|
||||||
|
<field name="model">account.reconcile.model</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_reconcile_model_form" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='analytic_account_id']" position="attributes">
|
||||||
|
<attribute name="optional">show</attribute> <!-- native value: hide -->
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright 2017-2020 Akretion (http://www.akretion.com/)
|
|
||||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
-->
|
|
||||||
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
|
|
||||||
<record id="view_partner_property_form" model="ir.ui.view">
|
|
||||||
<field name="name">account_usability.res.partner.form</field>
|
|
||||||
<field name="model">res.partner</field>
|
|
||||||
<field name="inherit_id" ref="account.view_partner_property_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<field name="property_account_position_id" position="attributes">
|
|
||||||
<attribute name="widget">selection</attribute>
|
|
||||||
</field>
|
|
||||||
<xpath expr="//field[@name='bank_ids']/tree/field[@name='acc_number']" position="after">
|
|
||||||
<field name="acc_type"/>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -10,6 +10,9 @@ class AccountGroupGenerate(models.TransientModel):
|
|||||||
_name = 'account.group.generate'
|
_name = 'account.group.generate'
|
||||||
_description = 'Generate Account Groups'
|
_description = 'Generate Account Groups'
|
||||||
|
|
||||||
|
company_id = fields.Many2one(
|
||||||
|
'res.company', string='Company', required=True,
|
||||||
|
default=lambda self: self.env.company)
|
||||||
name_prefix = fields.Char(string='Prefix', required=True, default='Comptes')
|
name_prefix = fields.Char(string='Prefix', required=True, default='Comptes')
|
||||||
level = fields.Integer(default=2, required=True)
|
level = fields.Integer(default=2, required=True)
|
||||||
|
|
||||||
@@ -18,7 +21,7 @@ class AccountGroupGenerate(models.TransientModel):
|
|||||||
raise UserError(_("The level must be >= 1."))
|
raise UserError(_("The level must be >= 1."))
|
||||||
ago = self.env['account.group']
|
ago = self.env['account.group']
|
||||||
aao = self.env['account.account']
|
aao = self.env['account.account']
|
||||||
company = self.env.company
|
company = self.company_id
|
||||||
groups = ago.search([('company_id', '=', company.id)])
|
groups = ago.search([('company_id', '=', company.id)])
|
||||||
if groups:
|
if groups:
|
||||||
raise UserError(_(
|
raise UserError(_(
|
||||||
|
|||||||
@@ -11,11 +11,12 @@
|
|||||||
<field name="name">account.group.generate.form</field>
|
<field name="name">account.group.generate.form</field>
|
||||||
<field name="model">account.group.generate</field>
|
<field name="model">account.group.generate</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Generate account groups">
|
<form>
|
||||||
<p>
|
<p>
|
||||||
This wizard is designed to auto-generate account groups from the chart of account.
|
This wizard is designed to auto-generate account groups from the chart of account.
|
||||||
</p>
|
</p>
|
||||||
<group name="main">
|
<group name="main">
|
||||||
|
<field name="company_id" groups="base.group_multi_company"/>
|
||||||
<field name="name_prefix"/>
|
<field name="name_prefix"/>
|
||||||
<field name="level"/>
|
<field name="level"/>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Mark invoices as sent">
|
<form string="Mark invoices as sent">
|
||||||
<p>
|
<p>
|
||||||
This wizard will mark as <i>sent</i> all the selected invoices in open or paid state.
|
This wizard will mark as <i>sent</i> all the selected posted invoices.
|
||||||
</p>
|
</p>
|
||||||
<footer>
|
<footer>
|
||||||
<button type="object" name="run" string="Mark as Sent" class="btn-primary"/>
|
<button type="object" name="run" string="Mark as Sent" class="btn-primary"/>
|
||||||
|
|||||||
@@ -2,21 +2,29 @@
|
|||||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, fields, models
|
from odoo import api, models, _
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
class AccountMoveReversal(models.TransientModel):
|
class AccountMoveReversal(models.TransientModel):
|
||||||
_inherit = 'account.move.reversal'
|
_inherit = 'account.move.reversal'
|
||||||
|
|
||||||
|
# Set default reversal date to original move + 1 day
|
||||||
|
# and raise error if original move has already been reversed
|
||||||
|
# WARNING: this wizard is also used to generate refunds
|
||||||
@api.model
|
@api.model
|
||||||
def _default_date(self):
|
def default_get(self, fields_list):
|
||||||
date_dt = None
|
res = super().default_get(fields_list)
|
||||||
if (
|
assert self._context.get('active_model') == 'account.move'
|
||||||
self._context.get('active_model') == 'account.move' and
|
amo = self.env['account.move']
|
||||||
self._context.get('active_id')):
|
moves = amo.browse(self._context['active_ids'])
|
||||||
move = self.env['account.move'].browse(self._context['active_id'])
|
if len(moves) == 1 and moves.move_type not in ('out_invoice', 'in_invoice'):
|
||||||
date_dt = move.date + relativedelta(days=1)
|
res['date'] = moves.date + relativedelta(days=1)
|
||||||
return date_dt
|
reversed_move = amo.search([('reversed_entry_id', 'in', moves.ids)], limit=1)
|
||||||
|
if reversed_move:
|
||||||
date = fields.Date(default=_default_date)
|
raise UserError(_(
|
||||||
|
"Move '%s' has already been reversed by move '%s'.") % (
|
||||||
|
reversed_move.reversed_entry_id.display_name,
|
||||||
|
reversed_move.display_name))
|
||||||
|
return res
|
||||||
|
|||||||
@@ -17,8 +17,10 @@
|
|||||||
'views/res_partner.xml',
|
'views/res_partner.xml',
|
||||||
'views/res_partner_bank.xml',
|
'views/res_partner_bank.xml',
|
||||||
'views/res_country.xml',
|
'views/res_country.xml',
|
||||||
|
'views/res_company.xml',
|
||||||
'views/ir_module.xml',
|
'views/ir_module.xml',
|
||||||
'views/ir_sequence.xml',
|
'views/ir_sequence.xml',
|
||||||
|
'views/ir_property.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, SUPERUSER_ID
|
from odoo import api, fields, models, SUPERUSER_ID
|
||||||
import logging
|
import logging
|
||||||
|
from odoo.tools.misc import format_datetime
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -25,3 +27,8 @@ class ResUsers(models.Model):
|
|||||||
user.login, user.id)
|
user.login, user.id)
|
||||||
logger.info(
|
logger.info(
|
||||||
'END setting company_id=False on partners related to users')
|
'END setting company_id=False on partners related to users')
|
||||||
|
|
||||||
|
def _report_print_datetime(self, lang_code):
|
||||||
|
# Used to print current datetime in a report in the user's timezone
|
||||||
|
res = format_datetime(self.env, fields.Datetime.now(), lang_code=lang_code)
|
||||||
|
return res
|
||||||
|
|||||||
40
base_usability/views/ir_property.xml
Normal file
40
base_usability/views/ir_property.xml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="ir_property_view_tree" model="ir.ui.view">
|
||||||
|
<field name="model">ir.property</field>
|
||||||
|
<field name="inherit_id" ref="base.ir_property_view_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="type" position="after">
|
||||||
|
<field name="value_reference" optional="show"/>
|
||||||
|
<field name="value_integer" optional="hide"/>
|
||||||
|
<field name="value_float" optional="hide"/>
|
||||||
|
<field name="value_datetime" optional="hide"/>
|
||||||
|
<field name="value_text" optional="hide"/>
|
||||||
|
</field>
|
||||||
|
<field name="type" position="attributes">
|
||||||
|
<attribute name="optional">hide</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="ir_property_view_search" model="ir.ui.view">
|
||||||
|
<field name="model">ir.property</field>
|
||||||
|
<field name="inherit_id" ref="base.ir_property_view_search"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search position="inside">
|
||||||
|
<group name="groupby">
|
||||||
|
<filter name="field_groupby" string="Field" context="{'group_by': 'fields_id'}"/>
|
||||||
|
<filter name="company_groupby" string="Company" context="{'group_by': 'company_id'}"/>
|
||||||
|
</group>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
20
base_usability/views/res_company.xml
Normal file
20
base_usability/views/res_company.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_company_tree" model="ir.ui.view">
|
||||||
|
<field name="model">res.company</field>
|
||||||
|
<field name="inherit_id" ref="base.view_company_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="name" position="after">
|
||||||
|
<field name="currency_id" optional="show" groups="base.group_multi_currency"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -19,4 +19,10 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- By default, the menu entry "CRM > Sales > My Activities" is limited to
|
||||||
|
the sales Manager. The Sale user should be able to see it -->
|
||||||
|
<record id="crm.crm_lead_menu_my_activities" model="ir.ui.menu">
|
||||||
|
<field name="groups_id" eval="[(6, 0, [])]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Developer Menu',
|
"name": "Developer Menu",
|
||||||
'version': '12.0.0.0.0',
|
"version": "14.0.0.0.0",
|
||||||
'category': 'Tools',
|
"category": "Tools",
|
||||||
'license': 'AGPL-3',
|
"license": "AGPL-3",
|
||||||
'summary': "Menu Shortcut for developer usage",
|
"summary": "Menu Shortcut for developer usage",
|
||||||
'description': """
|
"description": """
|
||||||
Developer menu
|
Developer menu
|
||||||
==============
|
==============
|
||||||
|
|
||||||
@@ -21,11 +21,13 @@ near `Technical` menu
|
|||||||
This module has been written by David Béal
|
This module has been written by David Béal
|
||||||
from Akretion <david.beal@akretion.com>.
|
from Akretion <david.beal@akretion.com>.
|
||||||
""",
|
""",
|
||||||
'author': 'Akretion',
|
"author": "Akretion",
|
||||||
'website': 'http://www.akretion.com',
|
"website": "https://www.akretion.com",
|
||||||
'depends': ['mail'],
|
"depends": [
|
||||||
'data': [
|
"mail",
|
||||||
'menu_view.xml'
|
|
||||||
],
|
],
|
||||||
'installable': False,
|
"data": [
|
||||||
|
"menu_view.xml",
|
||||||
|
],
|
||||||
|
"installable": True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<menuitem id="conf_tech" parent="base.menu_administration" name="🧰" groups="base.group_erp_manager" sequence="100"/>
|
<menuitem id="conf_tech" parent="base.menu_administration" name="🧰" groups="base.group_erp_manager" sequence="1"/>
|
||||||
<menuitem id="model" name="Model" parent="conf_tech" action="base.action_model_model" sequence="10"/>
|
<menuitem id="model" name="Model" parent="conf_tech" action="base.action_model_model" sequence="10"/>
|
||||||
<menuitem id="view" name="View" parent="conf_tech" action="base.action_ui_view" sequence="20" />
|
<menuitem id="view" name="View" parent="conf_tech" action="base.action_ui_view" sequence="20" />
|
||||||
<menuitem id="rec_rule" name="Record Rule" parent="conf_tech" action="base.action_rule" sequence="30" />
|
<menuitem id="rec_rule" name="Record Rule" parent="conf_tech" action="base.action_rule" sequence="30" />
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ def web_m2x_options_create(cr, registry):
|
|||||||
env = Environment(cr, SUPERUSER_ID, {})
|
env = Environment(cr, SUPERUSER_ID, {})
|
||||||
config_parameter = env['ir.config_parameter'].search(
|
config_parameter = env['ir.config_parameter'].search(
|
||||||
[('key', '=', 'web_m2x_options.create')])
|
[('key', '=', 'web_m2x_options.create')])
|
||||||
if config_parameter and config_parameter.value != 'False':
|
if config_parameter:
|
||||||
config_parameter.write({'value': 'False'})
|
config_parameter.write({'value': 'False'})
|
||||||
else:
|
else:
|
||||||
env['ir.config_parameter'].create({
|
env['ir.config_parameter'].create({
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Small usability improvements on mails:
|
|||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['mail'],
|
'depends': ['mail'],
|
||||||
'data': [
|
'data': [
|
||||||
#'views/mail_view.xml',
|
'views/mail_activity.xml',
|
||||||
#'data/mail_data.xml',
|
#'data/mail_data.xml',
|
||||||
#'wizard/email_template_preview_view.xml',
|
#'wizard/email_template_preview_view.xml',
|
||||||
#'wizard/mail_compose_message_view.xml',
|
#'wizard/mail_compose_message_view.xml',
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
from . import res_partner
|
from . import res_partner
|
||||||
|
from . import mail_activity
|
||||||
from . import mail_template
|
from . import mail_template
|
||||||
|
|||||||
24
mail_usability/models/mail_activity.py
Normal file
24
mail_usability/models/mail_activity.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com).
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class MailActivity(models.Model):
|
||||||
|
_inherit = 'mail.activity'
|
||||||
|
|
||||||
|
res_model_name = fields.Char(related='res_model_id.name', string='Document Type')
|
||||||
|
|
||||||
|
def jump_to_record(self):
|
||||||
|
self.ensure_one()
|
||||||
|
action = {}
|
||||||
|
if self.res_id and self.res_model and self.res_name:
|
||||||
|
action.update({
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': self.res_name,
|
||||||
|
'res_model': self.res_model,
|
||||||
|
'view_mode': 'form',
|
||||||
|
'res_id': self.res_id,
|
||||||
|
})
|
||||||
|
return action
|
||||||
52
mail_usability/views/mail_activity.xml
Normal file
52
mail_usability/views/mail_activity.xml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="mail_activity_view_search" model="ir.ui.view">
|
||||||
|
<field name="model">mail.activity</field>
|
||||||
|
<field name="inherit_id" ref="mail.mail_activity_view_search"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<filter name="activities_upcoming_all" position="after">
|
||||||
|
<separator/>
|
||||||
|
<filter string="My Activities" domain="[('user_id', '=', uid)]" name="my_activities"/>
|
||||||
|
</filter>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="mail_activity_view_tree" model="ir.ui.view">
|
||||||
|
<field name="model">mail.activity</field>
|
||||||
|
<field name="inherit_id" ref="mail.mail_activity_view_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="summary" position="after">
|
||||||
|
<field name="user_id" optional="show" widget="many2one_avatar_user"/>
|
||||||
|
</field>
|
||||||
|
<field name="res_name" position="before">
|
||||||
|
<button name="jump_to_record" type="object" attrs="{'invisible': [('res_name', '=', False)]}" icon="fa-binoculars" string="Go to source" class="text-warning" invisible="not context.get('mail_activity_main_view')"/>
|
||||||
|
</field>
|
||||||
|
<field name="res_name" position="after">
|
||||||
|
<field name="res_model_name" invisible="not context.get('mail_activity_main_view')"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="mail_activity_view_form_popup" model="ir.ui.view">
|
||||||
|
<field name="model">mail.activity</field>
|
||||||
|
<field name="inherit_id" ref="mail.mail_activity_view_form_popup"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="activity_type_id" position="before">
|
||||||
|
<field name="res_name" invisible="not context.get('mail_activity_main_view')"/>
|
||||||
|
<field name="res_model_name" invisible="not context.get('mail_activity_main_view')"/>
|
||||||
|
</field>
|
||||||
|
<button name="action_close_dialog" position="before">
|
||||||
|
<button name="jump_to_record" type="object" attrs="{'invisible': [('res_id', '=', False)]}" class="btn-primary" string="Go to source" invisible="not context.get('mail_activity_main_view')"/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -48,7 +48,7 @@ class ProductTemplate(models.Model):
|
|||||||
_inherit = ['product.template', 'product.categ.tax.mixin']
|
_inherit = ['product.template', 'product.categ.tax.mixin']
|
||||||
_name = 'product.template'
|
_name = 'product.template'
|
||||||
|
|
||||||
@api.constrains('taxes_id', 'supplier_taxes_id')
|
@api.constrains('taxes_id', 'supplier_taxes_id', 'categ_id')
|
||||||
def _check_tax_categ(self):
|
def _check_tax_categ(self):
|
||||||
# self.name != 'Pay Debt' is a stupid hack to avoid blocking the
|
# self.name != 'Pay Debt' is a stupid hack to avoid blocking the
|
||||||
# installation of the module 'pos_debt_notebook'
|
# installation of the module 'pos_debt_notebook'
|
||||||
|
|||||||
2
product_detailed_type/__init__.py
Normal file
2
product_detailed_type/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
from .post_install import set_product_detailed_type
|
||||||
19
product_detailed_type/__manifest__.py
Normal file
19
product_detailed_type/__manifest__.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright 2023 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Product Detailed Type',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Product',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'summary': 'Backport detailed_type from v16 to v14',
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
|
'depends': ['product'],
|
||||||
|
'data': [
|
||||||
|
'views/product.xml',
|
||||||
|
],
|
||||||
|
'post_init_hook': 'set_product_detailed_type',
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
1
product_detailed_type/models/__init__.py
Normal file
1
product_detailed_type/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import product_template
|
||||||
25
product_detailed_type/models/product_template.py
Normal file
25
product_detailed_type/models/product_template.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# Copyright 2023 Odoo SA (contains code copy-pasted from Odoo v16)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = 'product.template'
|
||||||
|
|
||||||
|
detailed_type = fields.Selection([
|
||||||
|
('consu', 'Consumable'),
|
||||||
|
('service', 'Service'),
|
||||||
|
], string='Product Type', default='consu', required=True, tracking=True)
|
||||||
|
type = fields.Selection(compute='_compute_type', store=True, string="Type")
|
||||||
|
|
||||||
|
def _detailed_type_mapping(self):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
@api.depends('detailed_type')
|
||||||
|
def _compute_type(self):
|
||||||
|
type_mapping = self._detailed_type_mapping()
|
||||||
|
for record in self:
|
||||||
|
record.type = type_mapping.get(record.detailed_type, record.detailed_type)
|
||||||
7
product_detailed_type/post_install.py
Normal file
7
product_detailed_type/post_install.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
|
||||||
|
def set_product_detailed_type(cr, registry):
|
||||||
|
cr.execute('UPDATE product_template SET detailed_type=type')
|
||||||
47
product_detailed_type/views/product.xml
Normal file
47
product_detailed_type/views/product.xml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="product_template_tree_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_tree_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="type" position="after">
|
||||||
|
<field name="detailed_type" optional="hide" readonly="1"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_template_form_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="type" position="after">
|
||||||
|
<field name="detailed_type"/>
|
||||||
|
</field>
|
||||||
|
<field name="type" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_template_search_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_search_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<filter name="type" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</filter>
|
||||||
|
<filter name="type" position="after">
|
||||||
|
<filter name="detailed_type_groupby" string="Product Type" context="{'group_by': 'detailed_type'}"/>
|
||||||
|
</filter>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
1
product_detailed_type_stock/__init__.py
Normal file
1
product_detailed_type_stock/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
16
product_detailed_type_stock/__manifest__.py
Normal file
16
product_detailed_type_stock/__manifest__.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Copyright 2023 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Product Detailed Type Stock',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Product',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'summary': 'Glue module between product_detailed_type and stock',
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
|
'depends': ['product_detailed_type', 'stock'],
|
||||||
|
'installable': True,
|
||||||
|
'auto_install': True,
|
||||||
|
}
|
||||||
1
product_detailed_type_stock/models/__init__.py
Normal file
1
product_detailed_type_stock/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import product_template
|
||||||
13
product_detailed_type_stock/models/product_template.py
Normal file
13
product_detailed_type_stock/models/product_template.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = 'product.template'
|
||||||
|
|
||||||
|
detailed_type = fields.Selection(selection_add=[
|
||||||
|
('product', 'Storable Product')
|
||||||
|
], ondelete={'product': 'set default'})
|
||||||
@@ -41,6 +41,7 @@ This module has been written by Alexis de Lattre from Akretion
|
|||||||
'barcodes',
|
'barcodes',
|
||||||
'base_report_to_printer',
|
'base_report_to_printer',
|
||||||
],
|
],
|
||||||
|
'external_dependencies': {'python': ['python-barcode>=0.14.0']},
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'wizard/product_print_zpl_barcode_view.xml',
|
'wizard/product_print_zpl_barcode_view.xml',
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# Copyright 2020-2023 Akretion France (http://www.akretion.com/)
|
||||||
# Copyright 2020 Akretion France (http://www.akretion.com/)
|
|
||||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
from stdnum.ean import calc_check_digit
|
from stdnum.ean import calc_check_digit, is_valid
|
||||||
|
from barcode import EAN13, EAN8
|
||||||
|
from barcode.writer import ImageWriter, SVGWriter
|
||||||
|
import base64
|
||||||
|
import io
|
||||||
|
|
||||||
|
|
||||||
class ProductTemplate(models.Model):
|
class ProductTemplate(models.Model):
|
||||||
@@ -34,8 +37,8 @@ class ProductTemplate(models.Model):
|
|||||||
"print_zpl_barcode_from_product_template on product '%s' "
|
"print_zpl_barcode_from_product_template on product '%s' "
|
||||||
"because it has %d variants and not just one.")
|
"because it has %d variants and not just one.")
|
||||||
% (self.display_name, self.product_variant_count))
|
% (self.display_name, self.product_variant_count))
|
||||||
action = self.env.ref(
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
'product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0]
|
'product_print_zpl_barcode.product_print_zpl_barcode_action')
|
||||||
action['context'] = {
|
action['context'] = {
|
||||||
'active_id': self.product_variant_ids[0].id,
|
'active_id': self.product_variant_ids[0].id,
|
||||||
'active_model': 'product.product',
|
'active_model': 'product.product',
|
||||||
@@ -46,6 +49,50 @@ class ProductTemplate(models.Model):
|
|||||||
class ProductProduct(models.Model):
|
class ProductProduct(models.Model):
|
||||||
_inherit = 'product.product'
|
_inherit = 'product.product'
|
||||||
|
|
||||||
|
# Not useful for ZPL, but it is often useful to have a barcode image field
|
||||||
|
barcode_image_png = fields.Binary(
|
||||||
|
compute='_compute_barcode_image_png',
|
||||||
|
string='PNG Barcode Image')
|
||||||
|
barcode_image_svg = fields.Binary(
|
||||||
|
compute='_compute_barcode_image_svg',
|
||||||
|
string='SVG Barcode Image')
|
||||||
|
|
||||||
|
def _get_barcode_image(self, img_format):
|
||||||
|
self.ensure_one()
|
||||||
|
barcode = self.barcode
|
||||||
|
if not barcode:
|
||||||
|
return False
|
||||||
|
res = False
|
||||||
|
if isinstance(barcode, str) and len(barcode) in (8, 13) and is_valid(barcode):
|
||||||
|
barcode_obj = False
|
||||||
|
if img_format == 'svg':
|
||||||
|
writer = SVGWriter()
|
||||||
|
elif img_format == 'png':
|
||||||
|
writer = ImageWriter()
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
if len(barcode) == 13:
|
||||||
|
barcode_obj = EAN13(barcode, writer=writer, guardbar=True)
|
||||||
|
elif len(barcode) == 8:
|
||||||
|
barcode_obj = EAN8(barcode, writer=writer, guardbar=True)
|
||||||
|
if barcode_obj:
|
||||||
|
barcode_file = io.BytesIO()
|
||||||
|
barcode_obj.write(barcode_file)
|
||||||
|
barcode_file.seek(0)
|
||||||
|
barcode_img = barcode_file.read()
|
||||||
|
res = base64.b64encode(barcode_img)
|
||||||
|
return res
|
||||||
|
|
||||||
|
@api.depends('barcode')
|
||||||
|
def _compute_barcode_image_svg(self):
|
||||||
|
for product in self:
|
||||||
|
product.barcode_image_svg = product._get_barcode_image('svg')
|
||||||
|
|
||||||
|
@api.depends('barcode')
|
||||||
|
def _compute_barcode_image_png(self):
|
||||||
|
for product in self:
|
||||||
|
product.barcode_image_png = product._get_barcode_image('png')
|
||||||
|
|
||||||
def generate_barcode_from_product_product(self):
|
def generate_barcode_from_product_product(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
if self.barcode:
|
if self.barcode:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
from odoo import api, fields, models, _
|
from odoo import api, fields, models, _
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
from odoo.tools import float_compare, float_is_zero
|
from odoo.tools import float_compare, float_is_zero
|
||||||
from stdnum.ean import is_valid
|
from stdnum.ean import is_valid, calc_check_digit
|
||||||
import base64
|
import base64
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -55,8 +55,7 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
|
|
||||||
product_id = fields.Many2one(
|
product_id = fields.Many2one(
|
||||||
'product.product', string='Product', required=True, readonly=True)
|
'product.product', string='Product', required=True, readonly=True)
|
||||||
uom_id = fields.Many2one(
|
uom_id = fields.Many2one(related='product_id.uom_id')
|
||||||
related='product_id.uom_id', readonly=True)
|
|
||||||
# 1 line = un peu moins de 30
|
# 1 line = un peu moins de 30
|
||||||
product_name = fields.Char('Product Label', required=True, size=56)
|
product_name = fields.Char('Product Label', required=True, size=56)
|
||||||
nomenclature_id = fields.Many2one(
|
nomenclature_id = fields.Many2one(
|
||||||
@@ -64,15 +63,13 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
rule_id = fields.Many2one(
|
rule_id = fields.Many2one(
|
||||||
'barcode.rule', string='Barcode Rule', readonly=True,
|
'barcode.rule', string='Barcode Rule', readonly=True,
|
||||||
compute='_compute_rule_id')
|
compute='_compute_rule_id')
|
||||||
barcode_type = fields.Selection(
|
barcode_type = fields.Selection(related='rule_id.type', string="Barcode Type")
|
||||||
related='rule_id.type', readonly=True, string="Barcode Type")
|
|
||||||
label_size = fields.Selection([
|
label_size = fields.Selection([
|
||||||
('38x25', '38x25 mm'),
|
('38x25', '38x25 mm'),
|
||||||
], required=True, default='38x25', string='Label Size')
|
], required=True, default='38x25')
|
||||||
pricelist_id = fields.Many2one(
|
pricelist_id = fields.Many2one(
|
||||||
'product.pricelist', string='Pricelist', required=True)
|
'product.pricelist', string='Pricelist', required=True)
|
||||||
currency_id = fields.Many2one(
|
currency_id = fields.Many2one(related='pricelist_id.currency_id')
|
||||||
related='pricelist_id.currency_id', readonly=True)
|
|
||||||
# TODO: for the moment, we only support weight, but...
|
# TODO: for the moment, we only support weight, but...
|
||||||
quantity = fields.Float(digits='Stock Weight')
|
quantity = fields.Float(digits='Stock Weight')
|
||||||
price_uom = fields.Monetary(
|
price_uom = fields.Monetary(
|
||||||
@@ -140,14 +137,14 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
"of the barcode pattern (%s).")
|
"of the barcode pattern (%s).")
|
||||||
% (pbarcode, len(pbarcode), len(prefix), prefix))
|
% (pbarcode, len(pbarcode), len(prefix), prefix))
|
||||||
barcode = pbarcode[0:len(prefix)]
|
barcode = pbarcode[0:len(prefix)]
|
||||||
# print "barcode=", barcode
|
# print("barcode=", barcode)
|
||||||
# print "pattern=", pattern
|
# print("pattern=", pattern)
|
||||||
m = re.search('\{N+D+\}', pattern)
|
m = re.search('\{N+D+\}', pattern)
|
||||||
# print "m=", m
|
# print("m=", m)
|
||||||
assert m
|
assert m
|
||||||
pattern_val = m.group(0)
|
pattern_val = m.group(0)
|
||||||
pattern_val = pattern_val[1:-1]
|
pattern_val = pattern_val[1:-1]
|
||||||
# print "pattern_val=", pattern_val
|
# print("pattern_val=", pattern_val)
|
||||||
max_value = 10**pattern_val.count('N')
|
max_value = 10**pattern_val.count('N')
|
||||||
if float_compare(value, max_value, precision_digits=prec) != -1:
|
if float_compare(value, max_value, precision_digits=prec) != -1:
|
||||||
raise UserError(_(
|
raise UserError(_(
|
||||||
@@ -166,11 +163,15 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
value_d_ext = value_d + '0' * pattern_val.count('D')
|
value_d_ext = value_d + '0' * pattern_val.count('D')
|
||||||
# 2) cut at the right size
|
# 2) cut at the right size
|
||||||
barcode += value_d_ext[0:pattern_val.count('D')]
|
barcode += value_d_ext[0:pattern_val.count('D')]
|
||||||
# print "barcode=", barcode
|
# print("barcode=", barcode)
|
||||||
# Add checksum
|
# Add checksum
|
||||||
if self.rule_id.encoding == 'ean13':
|
if self.rule_id.encoding == 'ean13':
|
||||||
barcode = bno.sanitize_ean(barcode)
|
# I don't call bno.sanitize_ean() due to this bug:
|
||||||
# print "barcode FINAL=", barcode
|
# https://github.com/odoo/odoo/pull/114112
|
||||||
|
barcode = barcode + calc_check_digit(barcode)
|
||||||
|
assert len(barcode) == 13
|
||||||
|
assert is_valid(barcode)
|
||||||
|
# print("barcode FINAL=", barcode)
|
||||||
zpl_unicode = self._price_weight_barcode_type_zpl() % {
|
zpl_unicode = self._price_weight_barcode_type_zpl() % {
|
||||||
'product_name': self.product_name,
|
'product_name': self.product_name,
|
||||||
'ean_zpl_command': len(self.barcode) == 8 and 'B8' or 'BE',
|
'ean_zpl_command': len(self.barcode) == 8 and 'B8' or 'BE',
|
||||||
@@ -270,7 +271,8 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
'zpl_filename': 'barcode_%s.zpl' % vals['barcode'],
|
'zpl_filename': 'barcode_%s.zpl' % vals['barcode'],
|
||||||
})
|
})
|
||||||
self.write(vals)
|
self.write(vals)
|
||||||
action = self.env.ref('product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0]
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
|
'product_print_zpl_barcode.product_print_zpl_barcode_action')
|
||||||
action.update({
|
action.update({
|
||||||
'res_id': self.id,
|
'res_id': self.id,
|
||||||
'context': self._context,
|
'context': self._context,
|
||||||
@@ -285,7 +287,8 @@ class ProductPrintZplBarcode(models.TransientModel):
|
|||||||
self.zpl_filename, base64.decodebytes(self.zpl_file), format='raw')
|
self.zpl_filename, base64.decodebytes(self.zpl_file), format='raw')
|
||||||
action = True
|
action = True
|
||||||
if self._context.get('print_and_new'):
|
if self._context.get('print_and_new'):
|
||||||
action = self.env.ref('product_print_zpl_barcode.product_print_zpl_barcode_action').sudo().read()[0]
|
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||||
|
'product_print_zpl_barcode.product_print_zpl_barcode_action')
|
||||||
action.update({
|
action.update({
|
||||||
'views': False,
|
'views': False,
|
||||||
'context': self._context,
|
'context': self._context,
|
||||||
|
|||||||
1
product_priority_star/__init__.py
Normal file
1
product_priority_star/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import models
|
||||||
26
product_priority_star/__manifest__.py
Normal file
26
product_priority_star/__manifest__.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Product Priority Star',
|
||||||
|
'version': '14.0.1.0.0',
|
||||||
|
'category': 'Product',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Add a priority star on product',
|
||||||
|
'description': """
|
||||||
|
Product Priority Star
|
||||||
|
=====================
|
||||||
|
|
||||||
|
This module adds a priority star on products (like on pickings and manufacturing order). If the star is yellow, the product will be displayed at the top.
|
||||||
|
|
||||||
|
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'https://github.com/akretion/odoo-usability',
|
||||||
|
'depends': ['product'],
|
||||||
|
'excludes': ['product_priority'],
|
||||||
|
'data': ['views/product_template.xml'],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
1
product_priority_star/models/__init__.py
Normal file
1
product_priority_star/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import product
|
||||||
20
product_priority_star/models/product.py
Normal file
20
product_priority_star/models/product.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = 'product.template'
|
||||||
|
_order = "priority desc, name, id"
|
||||||
|
|
||||||
|
priority = fields.Selection([
|
||||||
|
('0', 'Normal'),
|
||||||
|
('1', 'Top List'),
|
||||||
|
], default='0', index=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = 'product.product'
|
||||||
|
_order = 'priority desc, default_code, name, id'
|
||||||
41
product_priority_star/views/product_template.xml
Normal file
41
product_priority_star/views/product_template.xml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="product_template_tree_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_tree_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="sequence" position="after">
|
||||||
|
<field name="priority" widget="priority" optional="show" nolabel="1"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_template_form_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="name" position="before">
|
||||||
|
<field name="priority" widget="priority" class="mr-3"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_template_kanban_view" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_kanban_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="lst_price" position="after">
|
||||||
|
<field name="priority" widget="priority"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -35,7 +35,7 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
|
|||||||
'views/product_pricelist_item.xml',
|
'views/product_pricelist_item.xml',
|
||||||
'views/product_template_view.xml',
|
'views/product_template_view.xml',
|
||||||
'views/product_product.xml',
|
'views/product_product.xml',
|
||||||
'views/uom_uom.xml',
|
'views/product_config_menu.xml',
|
||||||
'views/product_category_view.xml',
|
'views/product_category_view.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ from odoo import fields, models
|
|||||||
class ProductSupplierinfo(models.Model):
|
class ProductSupplierinfo(models.Model):
|
||||||
_inherit = 'product.supplierinfo'
|
_inherit = 'product.supplierinfo'
|
||||||
|
|
||||||
name = fields.Many2one(domain=[('parent_id', '=', False)])
|
name = fields.Many2one(domain=[('parent_id', '=', False)], ondelete='restrict')
|
||||||
|
|||||||
34
product_usability/views/product_config_menu.xml
Normal file
34
product_usability/views/product_config_menu.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
When the module stock and sale are not installed,
|
||||||
|
there is no menu entry for UoM nor Product Categories !
|
||||||
|
This set of menu entries entre Configuration > Technical fixes this
|
||||||
|
-->
|
||||||
|
|
||||||
|
<menuitem id="product_config_menu" parent="base.menu_custom"
|
||||||
|
name="Products" sequence="150"/>
|
||||||
|
|
||||||
|
<menuitem id="product_template_config_menu" parent="product_config_menu"
|
||||||
|
action="product.product_template_action_all" sequence="10"/>
|
||||||
|
|
||||||
|
<menuitem id="product_product_config_menu" parent="product_config_menu"
|
||||||
|
action="product.product_normal_action" sequence="20"/>
|
||||||
|
|
||||||
|
<menuitem id="product_categ_config_menu" parent="product_config_menu"
|
||||||
|
action="product.product_category_action_form" sequence="30"/>
|
||||||
|
|
||||||
|
<menuitem id="uom_uom_config_menu" parent="product_config_menu"
|
||||||
|
action="uom.product_uom_form_action" sequence="40" />
|
||||||
|
|
||||||
|
<menuitem id="uom_categ_config_menu" parent="product_config_menu"
|
||||||
|
action="uom.product_uom_categ_form_action" sequence="50" />
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
Copyright 2022 Akretion France (http://www.akretion.com/)
|
|
||||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
-->
|
|
||||||
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<!-- When the module stock and sale are not installed,
|
|
||||||
there is no menu entry for UoM ! These menu entry fixes this -->
|
|
||||||
|
|
||||||
<menuitem id="uom_config_menu" parent="base.menu_custom"
|
|
||||||
name="Units of Measure" sequence="150"/>
|
|
||||||
|
|
||||||
<menuitem id="uom_categ_config_menu" parent="uom_config_menu"
|
|
||||||
action="uom.product_uom_categ_form_action" sequence="10" />
|
|
||||||
|
|
||||||
<menuitem id="uom_uom_config_menu" parent="uom_config_menu"
|
|
||||||
action="uom.product_uom_form_action" sequence="20" />
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
'data': [
|
'data': [
|
||||||
'views/purchase_order.xml',
|
'views/purchase_order.xml',
|
||||||
'views/purchase_report.xml',
|
'views/purchase_report.xml',
|
||||||
|
'views/account_move.xml',
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
from . import purchase_order
|
from . import purchase_order
|
||||||
from . import product_template
|
from . import product_template
|
||||||
from . import res_partner
|
from . import res_partner
|
||||||
|
from . import account_move
|
||||||
|
|||||||
21
purchase_usability/models/account_move.py
Normal file
21
purchase_usability/models/account_move.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import models
|
||||||
|
|
||||||
|
|
||||||
|
class AccountMove(models.Model):
|
||||||
|
_inherit = 'account.move'
|
||||||
|
|
||||||
|
def delete_lines_qty_zero(self):
|
||||||
|
# When a user pulls a PO from a supplier invoice, it creates
|
||||||
|
# all lines including lines that haven't been received. It can be time-consuming
|
||||||
|
# to delete all these lines with qty = 0
|
||||||
|
self.ensure_one()
|
||||||
|
lines = self.env['account.move.line'].search([
|
||||||
|
('move_id', '=', self.id),
|
||||||
|
('quantity', '=', 0),
|
||||||
|
('display_type', '=', False),
|
||||||
|
])
|
||||||
|
lines.unlink()
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user