Create a new invoice and add discounts in any of the three discount
+fields given. They go in order of precedence so discount 2 will be
+calculated over discount 1 and discount 3 over the result of discount 2.
+For example, let’s divide by two on every discount:
+
Unit price: 600.00 ->
+
+
+
Disc. 1 = 50% -> Amount = 300.00
+
Disc. 2 = 50% -> Amount = 150.00
+
Disc. 3 = 50% -> Amount = 75.00
+
+
+
You can also use negative values to charge instead of discount:
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
diff --git a/website_search_products/controllers/__init__.py b/account_invoice_triple_discount/tests/__init__.py
similarity index 60%
rename from website_search_products/controllers/__init__.py
rename to account_invoice_triple_discount/tests/__init__.py
index 2f34e6e..354de27 100644
--- a/website_search_products/controllers/__init__.py
+++ b/account_invoice_triple_discount/tests/__init__.py
@@ -1,3 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from . import controller
+from . import test_invoice_triple_discount
diff --git a/account_invoice_triple_discount/tests/test_invoice_triple_discount.py b/account_invoice_triple_discount/tests/test_invoice_triple_discount.py
new file mode 100644
index 0000000..0831044
--- /dev/null
+++ b/account_invoice_triple_discount/tests/test_invoice_triple_discount.py
@@ -0,0 +1,244 @@
+# Copyright 2017 Tecnativa - David Vidal
+# Copyright 2023 Simone Rubino - Aion Tech
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo.tests import Form
+
+from odoo.addons.base.tests.common import BaseCommon
+
+
+class TestInvoiceTripleDiscount(BaseCommon):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.Account = cls.env["account.account"]
+ cls.AccountMove = cls.env["account.move"]
+ cls.AccountMoveLine = cls.env["account.move.line"]
+ cls.AccountTax = cls.env["account.tax"]
+ cls.Partner = cls.env["res.partner"]
+ cls.Journal = cls.env["account.journal"]
+
+ cls.tax = cls.AccountTax.create(
+ {
+ "name": "TAX 15%",
+ "amount_type": "percent",
+ "type_tax_use": "purchase",
+ "amount": 15.0,
+ "country_id": cls.env.ref("base.us").id,
+ }
+ )
+ cls.account = cls.Account.create(
+ {
+ "name": "Test account",
+ "code": "TEST",
+ "account_type": "asset_receivable",
+ "reconcile": True,
+ }
+ )
+ cls.sale_journal = cls.Journal.search([("type", "=", "sale")], limit=1)
+
+ def create_simple_invoice(self, amount):
+ invoice_form = Form(
+ self.AccountMove.with_context(
+ default_move_type="out_invoice",
+ default_journal_id=self.sale_journal.id,
+ )
+ )
+ invoice_form.partner_id = self.partner
+
+ with invoice_form.invoice_line_ids.new() as line_form:
+ line_form.name = "Line 1"
+ line_form.quantity = 1
+ line_form.price_unit = amount
+ line_form.tax_ids.clear()
+ line_form.tax_ids.add(self.tax)
+
+ invoice = invoice_form.save()
+ return invoice
+
+ def test_01_discounts(self):
+ """Tests multiple discounts in line with taxes"""
+ invoice = self.create_simple_invoice(200)
+
+ invoice_form = Form(invoice)
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = 50.0
+ invoice_form.save()
+
+ invoice_line = invoice.invoice_line_ids[0]
+
+ # Adds a first discount
+ self.assertEqual(invoice.amount_total, 115.0)
+
+ # Adds a second discount over the price calculated before
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount2 = 40.0
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 69.0)
+
+ # Adds a third discount over the price calculated before
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount3 = 50.0
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 34.5)
+
+ # Deletes first discount
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = 0
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 69)
+
+ # Charge 5% over price:
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = -5
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 72.45)
+
+ self.assertEqual(invoice_line.price_unit, 200)
+
+ def test_02_discounts_multiple_lines(self):
+ invoice = self.create_simple_invoice(200)
+ invoice_form = Form(invoice)
+ with invoice_form.invoice_line_ids.new() as line_form:
+ line_form.name = "Line 2"
+ line_form.quantity = 1
+ line_form.price_unit = 500
+ line_form.tax_ids.clear()
+ invoice_form.save()
+
+ invoice_line2 = invoice.invoice_line_ids[1]
+ self.assertEqual(invoice_line2.price_subtotal, 500.0)
+
+ with invoice_form.invoice_line_ids.edit(1) as line_form:
+ line_form.discount3 = 50.0
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 480.0)
+
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = 50.0
+ invoice_form.save()
+ self.assertEqual(invoice.amount_total, 365.0)
+
+ def test_03_discounts_decimals_price(self):
+ """
+ Tests discount with decimals price
+ causing a round up after discount
+ """
+ invoice = self.create_simple_invoice(0)
+ invoice_form = Form(invoice)
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.name = "Line Decimals"
+ line_form.quantity = 9950
+ line_form.price_unit = 0.14
+ line_form.tax_ids.clear()
+ invoice_form.save()
+
+ invoice_line1 = invoice.invoice_line_ids[0]
+
+ self.assertEqual(invoice_line1.price_subtotal, 1393.0)
+
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = 15.0
+ invoice_form.save()
+
+ self.assertEqual(invoice_line1.price_subtotal, 1184.05)
+
+ def test_04_discounts_decimals_tax(self):
+ """
+ Tests amount tax with discount
+ """
+ invoice = self.create_simple_invoice(0)
+ invoice_form = Form(invoice)
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.name = "Line Decimals"
+ line_form.quantity = 9950
+ line_form.price_unit = 0.14
+ line_form.discount1 = 0
+ line_form.discount2 = 0
+ invoice_form.save()
+
+ self.assertEqual(invoice.amount_tax, 208.95)
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.discount1 = 15.0
+ invoice_form.save()
+
+ def test_06_round_discount(self):
+ """Discount value is rounded correctly"""
+ invoice = self.create_simple_invoice(0)
+ invoice_line = invoice.invoice_line_ids[0]
+ invoice_line.discount1 = 100
+ self.assertEqual(invoice_line.discount1, 100)
+ self.assertEqual(invoice_line.discount, 100)
+
+ def test_07_round_tax_discount(self):
+ """Discount value is rounded correctly when taxes change"""
+ invoice = self.create_simple_invoice(0)
+ invoice_line = invoice.invoice_line_ids[0]
+ invoice_line.discount1 = 100
+ invoice_line.tax_ids = False
+ self.assertEqual(invoice_line.discount1, 100)
+ self.assertEqual(invoice_line.discount, 100)
+
+ def test_09_create_with_main_discount(self):
+ """
+ Tests if creating a invoice line with main discount field
+ set correctly discount1, discount2 and discount3
+ """
+ invoice = self.create_simple_invoice(0)
+
+ invoice_line2 = self.AccountMoveLine.create(
+ {
+ "move_id": invoice.id,
+ "name": "Line With Main Discount",
+ "quantity": 1,
+ "price_unit": 1000,
+ "discount": 10,
+ "tax_ids": [],
+ }
+ )
+
+ # 1000 * 0.9
+ self.assertEqual(invoice_line2.price_subtotal, 900.0)
+ self.assertEqual(invoice_line2.discount1, 10.0)
+ self.assertEqual(invoice_line2.discount2, 0.0)
+ self.assertEqual(invoice_line2.discount3, 0.0)
+
+ def test_10_create_invoice_with_discounts(self):
+ invoice = self.env["account.move"].create(
+ {
+ "partner_id": self.partner.id,
+ "move_type": "out_invoice",
+ "invoice_line_ids": [
+ (
+ 0,
+ 0,
+ {
+ "name": "Line 1",
+ "quantity": 1,
+ "price_unit": 100,
+ "discount1": 30,
+ "discount2": 20,
+ "discount3": 10,
+ },
+ )
+ ],
+ }
+ )
+ invoice_line1 = invoice.invoice_line_ids[0]
+ self.assertEqual(invoice_line1.discount1, 30.0)
+ self.assertEqual(invoice_line1.discount2, 20.0)
+ self.assertEqual(invoice_line1.discount3, 10.0)
+
+ def test_tax_compute_with_lock_date(self):
+ # Check that the tax computation works even if the lock date is set
+ invoice = self.create_simple_invoice(0)
+ invoice_form = Form(invoice)
+ with invoice_form.invoice_line_ids.edit(0) as line_form:
+ line_form.name = "Line Decimals"
+ line_form.quantity = 9950
+ line_form.price_unit = 0.14
+ line_form.discount1 = 10
+ line_form.discount2 = 20
+ invoice_form.save()
+ invoice.action_post()
+ self.env.user.company_id.fiscalyear_lock_date = "2000-01-01"
diff --git a/account_invoice_triple_discount/views/account_move.xml b/account_invoice_triple_discount/views/account_move.xml
new file mode 100644
index 0000000..5f5a051
--- /dev/null
+++ b/account_invoice_triple_discount/views/account_move.xml
@@ -0,0 +1,39 @@
+
+
+
+ account.invoice.triple.discount.form
+ account.move
+
+
+
+ hide
+ Total discount
+
+
+
+
+
+
+
+ Total discount
+
+
+
+
+
+
+
+
+
diff --git a/account_invoice_triple_discount_readonly/README.rst b/account_invoice_triple_discount_readonly/README.rst
new file mode 100644
index 0000000..3291a25
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/README.rst
@@ -0,0 +1,165 @@
+==========================================
+Account Invoice Triple Discount Readonly
+==========================================
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+|badge1| |badge2|
+
+This module fixes a bug in ``account_invoice_triple_discount`` when combined with ``purchase_triple_discount``.
+
+**Problem Solved:**
+
+In purchase orders, when configuring discounts in the ``discount2`` or ``discount3`` columns:
+
+* Upon saving, all discounts were accumulated in the ``discount1`` column
+* The ``discount2`` and ``discount3`` fields were reset to zero
+* This occurred because the original mixin's ``write`` method always reset these fields
+
+**Solution:**
+
+The module overrides the ``write`` method of ``triple.discount.mixin`` to:
+
+#. Detect if ``discount1``, ``discount2`` or ``discount3`` are being explicitly modified
+#. If there are explicit discounts, ignore the computed ``discount`` field
+#. If only the ``discount`` field comes, maintain legacy behavior
+#. Make the total ``discount`` field readonly in relevant views
+
+**Additional Features:**
+
+* Makes the ``discount`` field (total discount) **readonly** in:
+
+ * Partner form view (``res.partner``)
+ * Supplier info in product form (``product.supplierinfo``)
+ * Purchase order lines (``purchase.order.line``)
+ * Account move lines (``account.move.line``)
+ * Base mixin (``triple.discount.mixin``)
+
+* Forces users to work only with the ``discount1``, ``discount2`` and ``discount3`` columns
+* Avoids confusion between computed total and individual discounts
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Installation
+============
+
+To install this module, you need to:
+
+#. Ensure dependencies are installed:
+
+ * account_invoice_triple_discount (OCA)
+ * purchase_triple_discount (OCA)
+
+#. Update the Apps list
+#. Search for "Account Invoice Triple Discount Readonly"
+#. Click Install
+
+Configuration
+=============
+
+No additional configuration is required after installation. The module automatically:
+
+* Makes the total discount field readonly
+* Preserves individual discount values on save
+* Maintains backward compatibility with existing discounts
+
+Usage
+=====
+
+After installation:
+
+**Working with Discounts:**
+
+#. The total discount field will be readonly and automatically calculated
+#. Always use ``discount1``, ``discount2``, and ``discount3`` fields to set discounts
+#. When saving, the individual discount values will be preserved correctly
+
+**Example:**
+
+::
+
+ Product: Widget
+ Price: 100.00€
+ Discount 1: 10% → 90.00€
+ Discount 2: 5% → 85.50€
+ Discount 3: 2% → 83.79€
+
+ Total discount: 16.21% (displayed, readonly)
+
+**Before this module:**
+
+After saving, you would see:
+
+::
+
+ Discount 1: 16.21% ❌ (accumulated)
+ Discount 2: 0% ❌ (reset)
+ Discount 3: 0% ❌ (reset)
+
+**After this module:**
+
+After saving, you correctly see:
+
+::
+
+ Discount 1: 10% ✅
+ Discount 2: 5% ✅
+ Discount 3: 2% ✅
+ Total: 16.21% (readonly, calculated)
+
+**Important:**
+
+* Do not try to edit the total discount field (it's readonly)
+* Always work with the three individual discount columns
+* The total is recalculated automatically
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Criptomart
+
+Funding
+~~~~~~~
+
+* Elika Bilbo
+
+Contributors
+~~~~~~~~~~~~
+
+* `Criptomart `_:
+
+ * Bug fix and implementation
+ * Override logic for write method
+
+Other credits
+~~~~~~~~~~~~~
+
+This module fixes a critical bug in the interaction between OCA's ``account_invoice_triple_discount`` and ``purchase_triple_discount`` modules, ensuring discount values are preserved correctly across all document types.
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by Criptomart.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+This module is part of the `Criptomart/addons-cm `_ project on GitHub.
diff --git a/account_invoice_triple_discount_readonly/README.md b/account_invoice_triple_discount_readonly/README_DEV.md
similarity index 100%
rename from account_invoice_triple_discount_readonly/README.md
rename to account_invoice_triple_discount_readonly/README_DEV.md
diff --git a/account_invoice_triple_discount_readonly/__manifest__.py b/account_invoice_triple_discount_readonly/__manifest__.py
index a9ce583..f265c4b 100644
--- a/account_invoice_triple_discount_readonly/__manifest__.py
+++ b/account_invoice_triple_discount_readonly/__manifest__.py
@@ -1,18 +1,12 @@
-# Copyright 2025
+# Copyright 2025 - Today Criptomart
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-{
+{ # noqa: B018
"name": "Account Invoice Triple Discount Readonly",
- "version": "16.0.1.0.0",
+ "version": "18.0.1.0.0",
"summary": "Make total discount readonly and fix discount2/discount3 write issue",
"license": "AGPL-3",
- "author": "Criptomart",
- "website": "https://github.com/OCA/account-invoicing",
+ "author": "Odoo Community Association (OCA), Criptomart",
+ "maintainers": ["Criptomart"],
+ "website": "https://git.criptomart.net/criptomart/addons-cm",
"depends": ["account_invoice_triple_discount", "purchase_triple_discount"],
- "data": [
- "views/product_supplierinfo_view.xml",
- "views/res_partner_view.xml",
- "views/purchase_order_view.xml",
- "views/account_move_view.xml",
- ],
- "installable": True,
}
diff --git a/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py b/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py
index d222b00..2d727da 100644
--- a/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py
+++ b/account_invoice_triple_discount_readonly/models/triple_discount_mixin.py
@@ -1,4 +1,5 @@
-from odoo import fields, models
+from odoo import fields
+from odoo import models
class TripleDiscountMixin(models.AbstractModel):
diff --git a/account_invoice_triple_discount_readonly/oca_dependencies.txt b/account_invoice_triple_discount_readonly/oca_dependencies.txt
new file mode 100644
index 0000000..fece1fc
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/oca_dependencies.txt
@@ -0,0 +1,5 @@
+# OCA Dependencies for account_invoice_triple_discount_readonly
+# Format: repository_name branch
+
+account-invoicing https://github.com/OCA/account-invoicing.git 18.0
+purchase-workflow https://github.com/OCA/purchase-workflow.git 18.0
diff --git a/account_invoice_triple_discount_readonly/readme/CONFIGURE.rst b/account_invoice_triple_discount_readonly/readme/CONFIGURE.rst
new file mode 100644
index 0000000..3b8f500
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/CONFIGURE.rst
@@ -0,0 +1,5 @@
+No additional configuration is required after installation. The module automatically:
+
+* Makes the total discount field readonly
+* Preserves individual discount values on save
+* Maintains backward compatibility with existing discounts
diff --git a/account_invoice_triple_discount_readonly/readme/CONTRIBUTORS.rst b/account_invoice_triple_discount_readonly/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000..91ae056
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/CONTRIBUTORS.rst
@@ -0,0 +1,4 @@
+* `Criptomart `_:
+
+ * Bug fix and implementation
+ * Override logic for write method
diff --git a/account_invoice_triple_discount_readonly/readme/CREDITS.rst b/account_invoice_triple_discount_readonly/readme/CREDITS.rst
new file mode 100644
index 0000000..11757f2
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/CREDITS.rst
@@ -0,0 +1,11 @@
+**Authors:**
+
+* Criptomart
+
+**Funding:**
+
+* Elika Bilbo
+
+**Other credits:**
+
+This module fixes a critical bug in the interaction between OCA's ``account_invoice_triple_discount`` and ``purchase_triple_discount`` modules, ensuring discount values are preserved correctly across all document types.
diff --git a/account_invoice_triple_discount_readonly/readme/DESCRIPTION.rst b/account_invoice_triple_discount_readonly/readme/DESCRIPTION.rst
new file mode 100644
index 0000000..4cc7f4b
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/DESCRIPTION.rst
@@ -0,0 +1,31 @@
+This module fixes a bug in ``account_invoice_triple_discount`` when combined with ``purchase_triple_discount``.
+
+**Problem Solved:**
+
+In purchase orders, when configuring discounts in the ``discount2`` or ``discount3`` columns:
+
+* Upon saving, all discounts were accumulated in the ``discount1`` column
+* The ``discount2`` and ``discount3`` fields were reset to zero
+* This occurred because the original mixin's ``write`` method always reset these fields
+
+**Solution:**
+
+The module overrides the ``write`` method of ``triple.discount.mixin`` to:
+
+#. Detect if ``discount1``, ``discount2`` or ``discount3`` are being explicitly modified
+#. If there are explicit discounts, ignore the computed ``discount`` field
+#. If only the ``discount`` field comes, maintain legacy behavior
+#. Make the total ``discount`` field readonly in relevant views
+
+**Additional Features:**
+
+* Makes the ``discount`` field (total discount) **readonly** in:
+
+ * Partner form view (``res.partner``)
+ * Supplier info in product form (``product.supplierinfo``)
+ * Purchase order lines (``purchase.order.line``)
+ * Account move lines (``account.move.line``)
+ * Base mixin (``triple.discount.mixin``)
+
+* Forces users to work only with the ``discount1``, ``discount2`` and ``discount3`` columns
+* Avoids confusion between computed total and individual discounts
diff --git a/account_invoice_triple_discount_readonly/readme/INSTALL.rst b/account_invoice_triple_discount_readonly/readme/INSTALL.rst
new file mode 100644
index 0000000..6ce6b71
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/INSTALL.rst
@@ -0,0 +1,10 @@
+To install this module, you need to:
+
+#. Ensure dependencies are installed:
+
+ * account_invoice_triple_discount (OCA)
+ * purchase_triple_discount (OCA)
+
+#. Update the Apps list
+#. Search for "Account Invoice Triple Discount Readonly"
+#. Click Install
diff --git a/account_invoice_triple_discount_readonly/readme/USAGE.rst b/account_invoice_triple_discount_readonly/readme/USAGE.rst
new file mode 100644
index 0000000..c4fc52d
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/readme/USAGE.rst
@@ -0,0 +1,46 @@
+After installation:
+
+**Working with Discounts:**
+
+#. The total discount field will be readonly and automatically calculated
+#. Always use ``discount1``, ``discount2``, and ``discount3`` fields to set discounts
+#. When saving, the individual discount values will be preserved correctly
+
+**Example:**
+
+::
+
+ Product: Widget
+ Price: 100.00€
+ Discount 1: 10% → 90.00€
+ Discount 2: 5% → 85.50€
+ Discount 3: 2% → 83.79€
+
+ Total discount: 16.21% (displayed, readonly)
+
+**Before this module:**
+
+After saving, you would see:
+
+::
+
+ Discount 1: 16.21% ❌ (accumulated)
+ Discount 2: 0% ❌ (reset)
+ Discount 3: 0% ❌ (reset)
+
+**After this module:**
+
+After saving, you correctly see:
+
+::
+
+ Discount 1: 10% ✅
+ Discount 2: 5% ✅
+ Discount 3: 2% ✅
+ Total: 16.21% (readonly, calculated)
+
+**Important:**
+
+* Do not try to edit the total discount field (it's readonly)
+* Always work with the three individual discount columns
+* The total is recalculated automatically
diff --git a/account_invoice_triple_discount_readonly/static/description/icon.png b/account_invoice_triple_discount_readonly/static/description/icon.png
new file mode 100644
index 0000000..d4a79d1
Binary files /dev/null and b/account_invoice_triple_discount_readonly/static/description/icon.png differ
diff --git a/account_invoice_triple_discount_readonly/tests/__init__.py b/account_invoice_triple_discount_readonly/tests/__init__.py
new file mode 100644
index 0000000..4c7cb7d
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/tests/__init__.py
@@ -0,0 +1,3 @@
+from . import test_triple_discount_mixin
+from . import test_account_move
+from . import test_purchase_order
diff --git a/account_invoice_triple_discount_readonly/tests/test_account_move.py b/account_invoice_triple_discount_readonly/tests/test_account_move.py
new file mode 100644
index 0000000..a84ff41
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/tests/test_account_move.py
@@ -0,0 +1,213 @@
+# Copyright (C) 2025: Criptomart (https://criptomart.net)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo.tests import tagged
+from odoo.tests.common import TransactionCase
+
+
+@tagged("post_install", "-at_install")
+class TestAccountMove(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ # Create a partner
+ cls.partner = cls.env["res.partner"].create(
+ {
+ "name": "Test Customer",
+ "email": "customer@test.com",
+ }
+ )
+
+ # Create a product
+ cls.product = cls.env["product.product"].create(
+ {
+ "name": "Test Product Invoice",
+ "type": "consu",
+ "list_price": 200.0,
+ "standard_price": 100.0,
+ }
+ )
+
+ # Create tax
+ cls.tax = cls.env["account.tax"].create(
+ {
+ "name": "Test Tax 10%",
+ "amount": 10.0,
+ "amount_type": "percent",
+ "type_tax_use": "sale",
+ }
+ )
+
+ # Create an invoice
+ cls.invoice = cls.env["account.move"].create(
+ {
+ "move_type": "out_invoice",
+ "partner_id": cls.partner.id,
+ "invoice_date": "2026-01-01",
+ }
+ )
+
+ # Create invoice line
+ cls.invoice_line = cls.env["account.move.line"].create(
+ {
+ "move_id": cls.invoice.id,
+ "product_id": cls.product.id,
+ "quantity": 5,
+ "price_unit": 200.0,
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 2.0,
+ "tax_ids": [(6, 0, [cls.tax.id])],
+ }
+ )
+
+ def test_invoice_line_discount_readonly(self):
+ """Test that discount field is readonly in invoice lines"""
+ field = self.invoice_line._fields["discount"]
+ self.assertTrue(
+ field.readonly, "Discount field should be readonly in invoice lines"
+ )
+
+ def test_invoice_line_write_with_explicit_discounts(self):
+ """Test writing invoice line with explicit discounts"""
+ self.invoice_line.write(
+ {
+ "discount": 30.0, # Should be ignored
+ "discount1": 15.0,
+ "discount2": 10.0,
+ "discount3": 5.0,
+ }
+ )
+
+ self.assertEqual(self.invoice_line.discount1, 15.0)
+ self.assertEqual(self.invoice_line.discount2, 10.0)
+ self.assertEqual(self.invoice_line.discount3, 5.0)
+
+ def test_invoice_line_legacy_discount(self):
+ """Test legacy discount behavior in invoice lines"""
+ self.invoice_line.write(
+ {
+ "discount": 20.0,
+ }
+ )
+
+ # Should map to discount1 and reset others
+ self.assertEqual(self.invoice_line.discount1, 20.0)
+ self.assertEqual(self.invoice_line.discount2, 0.0)
+ self.assertEqual(self.invoice_line.discount3, 0.0)
+
+ def test_invoice_line_price_calculation(self):
+ """Test that price subtotal is calculated correctly with triple discount"""
+ self.invoice_line.write(
+ {
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 0.0,
+ }
+ )
+
+ # Base: 5 * 200 = 1000
+ # After 10% discount: 900
+ # After 5% discount: 855
+ expected_subtotal = 5 * 200 * 0.9 * 0.95
+ self.assertAlmostEqual(
+ self.invoice_line.price_subtotal, expected_subtotal, places=2
+ )
+
+ def test_multiple_invoice_lines(self):
+ """Test multiple invoice lines with different discounts"""
+ line2 = self.env["account.move.line"].create(
+ {
+ "move_id": self.invoice.id,
+ "product_id": self.product.id,
+ "quantity": 3,
+ "price_unit": 150.0,
+ "discount1": 20.0,
+ "discount2": 10.0,
+ "discount3": 5.0,
+ "tax_ids": [(6, 0, [self.tax.id])],
+ }
+ )
+
+ # Verify both lines have correct discounts
+ self.assertEqual(self.invoice_line.discount1, 10.0)
+ self.assertEqual(line2.discount1, 20.0)
+ self.assertEqual(line2.discount2, 10.0)
+ self.assertEqual(line2.discount3, 5.0)
+
+ def test_invoice_line_update_quantity(self):
+ """Test updating quantity doesn't affect discounts"""
+ initial_discount1 = self.invoice_line.discount1
+ initial_discount2 = self.invoice_line.discount2
+
+ self.invoice_line.write(
+ {
+ "quantity": 10,
+ }
+ )
+
+ # Discounts should remain unchanged
+ self.assertEqual(self.invoice_line.discount1, initial_discount1)
+ self.assertEqual(self.invoice_line.discount2, initial_discount2)
+ # Quantity should be updated
+ self.assertEqual(self.invoice_line.quantity, 10)
+
+ def test_invoice_line_update_price(self):
+ """Test updating price doesn't affect discounts"""
+ initial_discount1 = self.invoice_line.discount1
+
+ self.invoice_line.write(
+ {
+ "price_unit": 250.0,
+ }
+ )
+
+ # Discount should remain unchanged
+ self.assertEqual(self.invoice_line.discount1, initial_discount1)
+ # Price should be updated
+ self.assertEqual(self.invoice_line.price_unit, 250.0)
+
+ def test_invoice_with_zero_discounts(self):
+ """Test invoice line with all zero discounts"""
+ self.invoice_line.write(
+ {
+ "discount1": 0.0,
+ "discount2": 0.0,
+ "discount3": 0.0,
+ }
+ )
+
+ # All discounts should be zero
+ self.assertEqual(self.invoice_line.discount, 0.0)
+ self.assertEqual(self.invoice_line.discount1, 0.0)
+ self.assertEqual(self.invoice_line.discount2, 0.0)
+ self.assertEqual(self.invoice_line.discount3, 0.0)
+
+ # Subtotal should be quantity * price
+ expected = 5 * 200
+ self.assertEqual(self.invoice_line.price_subtotal, expected)
+
+ def test_invoice_line_combined_operations(self):
+ """Test combined operations on invoice line"""
+ # Update multiple fields at once
+ self.invoice_line.write(
+ {
+ "quantity": 8,
+ "price_unit": 180.0,
+ "discount1": 12.0,
+ "discount2": 6.0,
+ "discount3": 0.0, # Reset discount3 explicitly
+ }
+ )
+
+ # All fields should be updated correctly
+ self.assertEqual(self.invoice_line.quantity, 8)
+ self.assertEqual(self.invoice_line.price_unit, 180.0)
+ self.assertEqual(self.invoice_line.discount1, 12.0)
+ self.assertEqual(self.invoice_line.discount2, 6.0)
+ self.assertEqual(self.invoice_line.discount3, 0.0)
+
+ # Calculate expected subtotal: 8 * 180 * (1-0.12) * (1-0.06)
+ expected = 8 * 180 * 0.88 * 0.94
+ self.assertAlmostEqual(self.invoice_line.price_subtotal, expected, places=2)
diff --git a/account_invoice_triple_discount_readonly/tests/test_purchase_order.py b/account_invoice_triple_discount_readonly/tests/test_purchase_order.py
new file mode 100644
index 0000000..cd12fe5
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/tests/test_purchase_order.py
@@ -0,0 +1,217 @@
+# Copyright (C) 2025: Criptomart (https://criptomart.net)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo.tests import tagged
+from odoo.tests.common import TransactionCase
+
+
+@tagged("post_install", "-at_install")
+class TestPurchaseOrder(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ # Create a supplier
+ cls.supplier = cls.env["res.partner"].create(
+ {
+ "name": "Test Supplier",
+ "email": "supplier@test.com",
+ "supplier_rank": 1,
+ }
+ )
+
+ # Create a product template first, then get the variant
+ cls.product_template = cls.env["product.template"].create(
+ {
+ "name": "Test Product PO",
+ "type": "consu",
+ "list_price": 150.0,
+ "standard_price": 80.0,
+ }
+ )
+ # Get the auto-created product variant
+ cls.product = cls.product_template.product_variant_ids[0]
+
+ # Create a purchase order
+ cls.purchase_order = cls.env["purchase.order"].create(
+ {
+ "partner_id": cls.supplier.id,
+ }
+ )
+
+ # Create purchase order line
+ cls.po_line = cls.env["purchase.order.line"].create(
+ {
+ "order_id": cls.purchase_order.id,
+ "product_id": cls.product.id,
+ "product_qty": 10,
+ "price_unit": 150.0,
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 2.0,
+ }
+ )
+
+ def test_po_line_discount_readonly(self):
+ """Test that discount field is readonly in PO lines"""
+ field = self.po_line._fields["discount"]
+ self.assertTrue(field.readonly, "Discount field should be readonly in PO lines")
+
+ def test_po_line_write_with_explicit_discounts(self):
+ """Test writing PO line with explicit discounts"""
+ self.po_line.write(
+ {
+ "discount": 25.0, # Should be ignored
+ "discount1": 12.0,
+ "discount2": 8.0,
+ "discount3": 4.0,
+ }
+ )
+
+ self.assertEqual(self.po_line.discount1, 12.0)
+ self.assertEqual(self.po_line.discount2, 8.0)
+ self.assertEqual(self.po_line.discount3, 4.0)
+
+ def test_po_line_legacy_discount(self):
+ """Test legacy discount behavior in PO lines"""
+ self.po_line.write(
+ {
+ "discount": 18.0,
+ }
+ )
+
+ # Should map to discount1 and reset others
+ self.assertEqual(self.po_line.discount1, 18.0)
+ self.assertEqual(self.po_line.discount2, 0.0)
+ self.assertEqual(self.po_line.discount3, 0.0)
+
+ def test_po_line_price_calculation(self):
+ """Test that price subtotal is calculated correctly with triple discount"""
+ self.po_line.write(
+ {
+ "discount1": 15.0,
+ "discount2": 10.0,
+ "discount3": 5.0,
+ }
+ )
+
+ # Base: 10 * 150 = 1500
+ # After 15% discount: 1275
+ # After 10% discount: 1147.5
+ # After 5% discount: 1090.125
+ expected_subtotal = 10 * 150 * 0.85 * 0.90 * 0.95
+ self.assertAlmostEqual(self.po_line.price_subtotal, expected_subtotal, places=2)
+
+ def test_multiple_po_lines(self):
+ """Test multiple PO lines with different discounts"""
+ line2 = self.env["purchase.order.line"].create(
+ {
+ "order_id": self.purchase_order.id,
+ "product_id": self.product.id,
+ "product_qty": 5,
+ "price_unit": 120.0,
+ "discount1": 20.0,
+ "discount2": 15.0,
+ "discount3": 10.0,
+ }
+ )
+
+ # Verify both lines have correct discounts
+ self.assertEqual(self.po_line.discount1, 15.0)
+ self.assertEqual(line2.discount1, 20.0)
+ self.assertEqual(line2.discount2, 15.0)
+ self.assertEqual(line2.discount3, 10.0)
+
+ def test_po_line_update_quantity(self):
+ """Test updating quantity doesn't affect discounts"""
+ initial_discount1 = self.po_line.discount1
+ initial_discount2 = self.po_line.discount2
+
+ self.po_line.write(
+ {
+ "product_qty": 20,
+ }
+ )
+
+ # Discounts should remain unchanged
+ self.assertEqual(self.po_line.discount1, initial_discount1)
+ self.assertEqual(self.po_line.discount2, initial_discount2)
+ # Quantity should be updated
+ self.assertEqual(self.po_line.product_qty, 20)
+
+ def test_po_line_update_price(self):
+ """Test updating price doesn't affect discounts"""
+ initial_discount1 = self.po_line.discount1
+
+ self.po_line.write(
+ {
+ "price_unit": 200.0,
+ }
+ )
+
+ # Discount should remain unchanged
+ self.assertEqual(self.po_line.discount1, initial_discount1)
+ # Price should be updated
+ self.assertEqual(self.po_line.price_unit, 200.0)
+
+ def test_po_with_zero_discounts(self):
+ """Test PO line with all zero discounts"""
+ self.po_line.write(
+ {
+ "discount1": 0.0,
+ "discount2": 0.0,
+ "discount3": 0.0,
+ }
+ )
+
+ # All discounts should be zero
+ self.assertEqual(self.po_line.discount, 0.0)
+ self.assertEqual(self.po_line.discount1, 0.0)
+ self.assertEqual(self.po_line.discount2, 0.0)
+ self.assertEqual(self.po_line.discount3, 0.0)
+
+ # Subtotal should be quantity * price
+ expected = 10 * 150
+ self.assertEqual(self.po_line.price_subtotal, expected)
+
+ def test_po_line_combined_operations(self):
+ """Test combined operations on PO line"""
+ # Update multiple fields at once
+ self.po_line.write(
+ {
+ "product_qty": 15,
+ "price_unit": 175.0,
+ "discount1": 18.0,
+ "discount2": 12.0,
+ "discount3": 6.0,
+ }
+ )
+
+ # All fields should be updated correctly
+ self.assertEqual(self.po_line.product_qty, 15)
+ self.assertEqual(self.po_line.price_unit, 175.0)
+ self.assertEqual(self.po_line.discount1, 18.0)
+ self.assertEqual(self.po_line.discount2, 12.0)
+ self.assertEqual(self.po_line.discount3, 6.0)
+
+ # Calculate expected subtotal
+ expected = 15 * 175 * 0.82 * 0.88 * 0.94
+ self.assertAlmostEqual(self.po_line.price_subtotal, expected, places=2)
+
+ def test_po_confirm_with_discounts(self):
+ """Test confirming PO doesn't alter discounts"""
+ self.po_line.write(
+ {
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 2.0,
+ }
+ )
+
+ # Confirm the purchase order
+ self.purchase_order.button_confirm()
+
+ # Discounts should remain unchanged after confirmation
+ self.assertEqual(self.po_line.discount1, 10.0)
+ self.assertEqual(self.po_line.discount2, 5.0)
+ self.assertEqual(self.po_line.discount3, 2.0)
diff --git a/account_invoice_triple_discount_readonly/tests/test_triple_discount_mixin.py b/account_invoice_triple_discount_readonly/tests/test_triple_discount_mixin.py
new file mode 100644
index 0000000..33b931f
--- /dev/null
+++ b/account_invoice_triple_discount_readonly/tests/test_triple_discount_mixin.py
@@ -0,0 +1,243 @@
+# Copyright (C) 2025: Criptomart (https://criptomart.net)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo.tests import tagged
+from odoo.tests.common import TransactionCase
+
+
+@tagged("post_install", "-at_install")
+class TestTripleDiscountMixin(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ # Create a partner
+ cls.partner = cls.env["res.partner"].create(
+ {
+ "name": "Test Partner",
+ }
+ )
+
+ # Create a product template first, then get the variant
+ cls.product_template = cls.env["product.template"].create(
+ {
+ "name": "Test Product",
+ "type": "consu",
+ "list_price": 100.0,
+ "standard_price": 50.0,
+ }
+ )
+ # Get the auto-created product variant
+ cls.product = cls.product_template.product_variant_ids[0]
+
+ # Create a purchase order
+ cls.purchase_order = cls.env["purchase.order"].create(
+ {
+ "partner_id": cls.partner.id,
+ }
+ )
+
+ # Create a purchase order line
+ cls.po_line = cls.env["purchase.order.line"].create(
+ {
+ "order_id": cls.purchase_order.id,
+ "product_id": cls.product.id,
+ "product_qty": 10,
+ "price_unit": 100.0,
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 2.0,
+ }
+ )
+
+ def test_discount_field_is_readonly(self):
+ """Test that the discount field is readonly"""
+ field = self.po_line._fields["discount"]
+ self.assertTrue(field.readonly, "Discount field should be readonly")
+
+ def test_write_with_explicit_discounts(self):
+ """Test writing with explicit discount1, discount2, discount3"""
+ # Write with explicit discounts
+ self.po_line.write(
+ {
+ "discount": 20.0, # This should be ignored
+ "discount1": 15.0,
+ "discount2": 10.0,
+ "discount3": 5.0,
+ }
+ )
+
+ # Verify explicit discounts were applied
+ self.assertEqual(self.po_line.discount1, 15.0)
+ self.assertEqual(self.po_line.discount2, 10.0)
+ self.assertEqual(self.po_line.discount3, 5.0)
+
+ # The computed discount field should reflect the combined discounts
+ # Formula: 100 - (100 * (1 - 0.15) * (1 - 0.10) * (1 - 0.05))
+ expected_discount = 100 - (100 * 0.85 * 0.90 * 0.95)
+ self.assertAlmostEqual(self.po_line.discount, expected_discount, places=2)
+
+ def test_write_only_discount1(self):
+ """Test writing only discount1 explicitly"""
+ self.po_line.write(
+ {
+ "discount": 25.0, # This should be ignored
+ "discount1": 20.0,
+ }
+ )
+
+ # Only discount1 should change
+ self.assertEqual(self.po_line.discount1, 20.0)
+ # Others should remain unchanged
+ self.assertEqual(self.po_line.discount2, 5.0)
+ self.assertEqual(self.po_line.discount3, 2.0)
+
+ def test_write_only_discount2(self):
+ """Test writing only discount2 explicitly"""
+ self.po_line.write(
+ {
+ "discount": 30.0, # This should be ignored
+ "discount2": 12.0,
+ }
+ )
+
+ # Only discount2 should change
+ self.assertEqual(self.po_line.discount2, 12.0)
+ # Others should remain unchanged from previous test
+ self.assertEqual(self.po_line.discount1, 20.0)
+ self.assertEqual(self.po_line.discount3, 2.0)
+
+ def test_write_only_discount3(self):
+ """Test writing only discount3 explicitly"""
+ self.po_line.write(
+ {
+ "discount": 35.0, # This should be ignored
+ "discount3": 8.0,
+ }
+ )
+
+ # Only discount3 should change
+ self.assertEqual(self.po_line.discount3, 8.0)
+ # Others should remain unchanged from previous tests
+ self.assertEqual(self.po_line.discount1, 20.0)
+ self.assertEqual(self.po_line.discount2, 12.0)
+
+ def test_write_legacy_discount_only(self):
+ """Test legacy behavior: writing only discount field"""
+ # Reset to known state first
+ self.po_line.write(
+ {
+ "discount1": 10.0,
+ "discount2": 5.0,
+ "discount3": 2.0,
+ }
+ )
+
+ # Write only discount (legacy behavior)
+ self.po_line.write(
+ {
+ "discount": 25.0,
+ }
+ )
+
+ # Should map to discount1 and reset others
+ self.assertEqual(self.po_line.discount1, 25.0)
+ self.assertEqual(self.po_line.discount2, 0.0)
+ self.assertEqual(self.po_line.discount3, 0.0)
+
+ def test_write_multiple_times(self):
+ """Test writing multiple times to ensure consistency"""
+ # First write
+ self.po_line.write(
+ {
+ "discount1": 10.0,
+ "discount2": 10.0,
+ }
+ )
+
+ self.assertEqual(self.po_line.discount1, 10.0)
+ self.assertEqual(self.po_line.discount2, 10.0)
+
+ # Second write
+ self.po_line.write(
+ {
+ "discount": 5.0,
+ "discount3": 5.0,
+ }
+ )
+
+ # discount3 should change, others remain
+ self.assertEqual(self.po_line.discount1, 10.0)
+ self.assertEqual(self.po_line.discount2, 10.0)
+ self.assertEqual(self.po_line.discount3, 5.0)
+
+ def test_write_zero_discounts(self):
+ """Test writing zero discounts"""
+ self.po_line.write(
+ {
+ "discount1": 0.0,
+ "discount2": 0.0,
+ "discount3": 0.0,
+ }
+ )
+
+ self.assertEqual(self.po_line.discount1, 0.0)
+ self.assertEqual(self.po_line.discount2, 0.0)
+ self.assertEqual(self.po_line.discount3, 0.0)
+ self.assertEqual(self.po_line.discount, 0.0)
+
+ def test_write_combined_scenario(self):
+ """Test a realistic combined scenario"""
+ # Initial state
+ self.po_line.write(
+ {
+ "discount1": 15.0,
+ "discount2": 5.0,
+ "discount3": 0.0,
+ }
+ )
+
+ # User tries to update discount field (should be ignored if explicit discounts present)
+ self.po_line.write(
+ {
+ "discount": 50.0,
+ "discount1": 20.0,
+ }
+ )
+
+ # discount1 should be updated, others unchanged
+ self.assertEqual(self.po_line.discount1, 20.0)
+ self.assertEqual(self.po_line.discount2, 5.0)
+ self.assertEqual(self.po_line.discount3, 0.0)
+
+ def test_discount_calculation_accuracy(self):
+ """Test that discount calculation is accurate"""
+ self.po_line.write(
+ {
+ "discount1": 10.0,
+ "discount2": 10.0,
+ "discount3": 10.0,
+ }
+ )
+
+ # Combined discount: 100 - (100 * 0.9 * 0.9 * 0.9) = 27.1
+ expected = 100 - (100 * 0.9 * 0.9 * 0.9)
+ self.assertAlmostEqual(self.po_line.discount, expected, places=2)
+
+ def test_write_without_discount_field(self):
+ """Test writing other fields without touching discount fields"""
+ initial_discount1 = self.po_line.discount1
+
+ # Write other fields
+ self.po_line.write(
+ {
+ "product_qty": 20,
+ "price_unit": 150.0,
+ }
+ )
+
+ # Discounts should remain unchanged
+ self.assertEqual(self.po_line.discount1, initial_discount1)
+ # But other fields should be updated
+ self.assertEqual(self.po_line.product_qty, 20)
+ self.assertEqual(self.po_line.price_unit, 150.0)
diff --git a/account_invoice_triple_discount_readonly/views/account_move_view.xml b/account_invoice_triple_discount_readonly/views/account_move_view.xml
index b44c4d2..c3e1fa0 100644
--- a/account_invoice_triple_discount_readonly/views/account_move_view.xml
+++ b/account_invoice_triple_discount_readonly/views/account_move_view.xml
@@ -1,7 +1,7 @@
-
+
account.invoice.triple.discount.readonlyaccount.move
@@ -10,12 +10,7 @@
ref="account_invoice_triple_discount.invoice_triple_discount_form_view"
/>
-
- 1
-
+
-
-
- product.supplierinfo
-
-
-
- 1
-
-
-
-
-
-
- product.supplierinfo
-
-
-
- 1
-
-
-
+
diff --git a/account_invoice_triple_discount_readonly/views/purchase_order_view.xml b/account_invoice_triple_discount_readonly/views/purchase_order_view.xml
index c082397..6ea6258 100644
--- a/account_invoice_triple_discount_readonly/views/purchase_order_view.xml
+++ b/account_invoice_triple_discount_readonly/views/purchase_order_view.xml
@@ -1,28 +1,6 @@
-
-
- purchase.order.triple.discount.readonly
- purchase.order
-
-
-
- 1
-
-
- 1
-
-
-
+
diff --git a/account_invoice_triple_discount_readonly/views/res_partner_view.xml b/account_invoice_triple_discount_readonly/views/res_partner_view.xml
index 8a18830..20426de 100644
--- a/account_invoice_triple_discount_readonly/views/res_partner_view.xml
+++ b/account_invoice_triple_discount_readonly/views/res_partner_view.xml
@@ -1,18 +1,6 @@
-
-
- res.partner
-
-
-
- 1
-
-
-
+
diff --git a/barcode_generator_partner/README.rst b/barcode_generator_partner/README.rst
deleted file mode 100644
index 0352349..0000000
--- a/barcode_generator_partner/README.rst
+++ /dev/null
@@ -1,124 +0,0 @@
-==============================
-Generate Barcodes for Partners
-==============================
-
-..
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! This file is generated by oca-gen-addon-readme !!
- !! changes will be overwritten. !!
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:0c984bdd1b103633bb285af4d69763047cc898ed9b6e3499c164a41d8e300f99
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
- :target: https://odoo-community.org/page/development-status
- :alt: Beta
-.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
- :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
- :alt: License: AGPL-3
-.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--barcode-lightgray.png?logo=github
- :target: https://github.com/OCA/stock-logistics-barcode/tree/12.0/barcodes_generator_partner
- :alt: OCA/stock-logistics-barcode
-.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/stock-logistics-barcode-12-0/stock-logistics-barcode-12-0-barcodes_generator_partner
- :alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/stock-logistics-barcode&target_branch=12.0
- :alt: Try me on Runboat
-
-|badge1| |badge2| |badge3| |badge4| |badge5|
-
-This module expands Odoo functionality, allowing user to generate barcode
-depending on a given barcode rule for Partners.
-
-For example, a typical pattern for partners is "042........." that means
-that:
-
-* the EAN13 code will begin by '042'
-* followed by 0 digits (named Barcode Base in this module)
-* a 13 digit control
-
-With this module, it is possible to:
-
-* Assign a pattern (barcode.rule) to a res.partner
-
-* Define a Barcode base:
- * manually, if the base of the barcode must be set by a user. (typically an
- internal code defined in your company)
- * automaticaly by a sequence, if you want to let Odoo to increment a
- sequence. (typical case of a customer number incrementation)
-
-* Generate a barcode, based on the defined pattern and the barcode base
-
-**Table of contents**
-
-.. contents::
- :local:
-
-Configuration
-=============
-
-* To configure this module, see the 'Configuration' Section of the description of the module 'barcodes_generator_abstract'
-
-Usage
-=====
-
-To use this module, you need to:
-
-* Go to a Customer/Contact form, Sales & Purchases Tab:
-
-1 for manual generation
- * Set a Barcode Rule
- * Set a Barcode Base
- * click on the button 'Generate Barcode (Using Barcode Rule)'
-
-2 for automatic generation
- * Set a Barcode Rule
- * click on the button 'Generate Base (Using Sequence)'
- * click on the button 'Generate Barcode (Using Barcode Rule)'
-
-.. image:: https://raw.githubusercontent.com/barcodes_generator_partner/static/description/res_partner_sequence_generation.png
- :width: 1100px
-
-Bug Tracker
-===========
-
-Bugs are tracked on `GitHub Issues `_.
-In case of trouble, please check there if your issue has already been reported.
-If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
-
-Do not contact contributors directly about support or help with technical issues.
-
-Credits
-=======
-
-Authors
-~~~~~~~
-
-* GRAP
-* La Louve
-
-Contributors
-~~~~~~~~~~~~
-
-* Sylvain LE GAL (https://twitter.com/legalsylvain)
-* Dave Lasley
-* Druidoo (https://druidoo.io)
-
-Maintainers
-~~~~~~~~~~~
-
-This module is maintained by the OCA.
-
-.. image:: https://odoo-community.org/logo.png
- :alt: Odoo Community Association
- :target: https://odoo-community.org
-
-OCA, or the Odoo Community Association, is a nonprofit organization whose
-mission is to support the collaborative development of Odoo features and
-promote its widespread use.
-
-This module is part of the `OCA/stock-logistics-barcode `_ project on GitHub.
-
-You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/barcode_generator_partner/__init__.py b/barcode_generator_partner/__init__.py
deleted file mode 100644
index 83e553a..0000000
--- a/barcode_generator_partner/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from . import models
diff --git a/barcode_generator_partner/__manifest__.py b/barcode_generator_partner/__manifest__.py
deleted file mode 100644
index 609cd7a..0000000
--- a/barcode_generator_partner/__manifest__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2014-Today GRAP (http://www.grap.coop)
-# Copyright (C) 2016-Today La Louve (http://www.lalouve.net)
-# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-{
- "name": "Generate Barcodes for Partners",
- "summary": "Generate Barcodes for Partners",
- "version": "16.0.1.0.1",
- "category": "Tools",
- "author": "GRAP," "La Louve," "Odoo Community Association (OCA)",
- "website": "https://github.com/OCA/stock-logistics-barcode",
- "license": "AGPL-3",
- "depends": [
- "barcodes_generator_abstract",
- "point_of_sale",
- ],
- "data": [
- "views/view_res_partner.xml",
- ],
- "demo": [
- "demo/ir_sequence.xml",
- "demo/barcode_rule.xml",
- "demo/res_partner.xml",
- "demo/function.xml",
- ],
-}
diff --git a/barcode_generator_partner/demo/barcode_rule.xml b/barcode_generator_partner/demo/barcode_rule.xml
deleted file mode 100644
index b3c7ee0..0000000
--- a/barcode_generator_partner/demo/barcode_rule.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
- Partner Rule (Generated Barcode)
-
- client
- 998
- ean13
- 042.........
-
-
-
-
-
-
diff --git a/barcode_generator_partner/demo/function.xml b/barcode_generator_partner/demo/function.xml
deleted file mode 100644
index a2469da..0000000
--- a/barcode_generator_partner/demo/function.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/barcode_generator_partner/demo/ir_sequence.xml b/barcode_generator_partner/demo/ir_sequence.xml
deleted file mode 100644
index 2aa10aa..0000000
--- a/barcode_generator_partner/demo/ir_sequence.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
- Partner Sequence (Generated Barcode)
- 10
- 1
-
-
-
diff --git a/barcode_generator_partner/demo/res_partner.xml b/barcode_generator_partner/demo/res_partner.xml
deleted file mode 100644
index 147e9ff..0000000
--- a/barcode_generator_partner/demo/res_partner.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- Partner with Generated Barcode
-
-
-
-
diff --git a/barcode_generator_partner/i18n/barcodes_generator_partner.pot b/barcode_generator_partner/i18n/barcodes_generator_partner.pot
deleted file mode 100644
index 2f1890a..0000000
--- a/barcode_generator_partner/i18n/barcodes_generator_partner.pot
+++ /dev/null
@@ -1,100 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 12.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: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "Generate Model"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Partners"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
diff --git a/barcode_generator_partner/i18n/es.po b/barcode_generator_partner/i18n/es.po
deleted file mode 100644
index b061309..0000000
--- a/barcode_generator_partner/i18n/es.po
+++ /dev/null
@@ -1,110 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-# Translators:
-# enjolras , 2018
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 10.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-02-15 02:01+0000\n"
-"PO-Revision-Date: 2018-02-15 02:01+0000\n"
-"Last-Translator: enjolras , 2018\n"
-"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr "Regla de código de barras"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "Generate Model"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Partners"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
-#~ msgid "Barcode Base"
-#~ msgstr "Base de código de barras"
-
-#~ msgid "barcode.rule"
-#~ msgstr "barcode.rule"
diff --git a/barcode_generator_partner/i18n/es_ES.po b/barcode_generator_partner/i18n/es_ES.po
deleted file mode 100644
index 1be7bea..0000000
--- a/barcode_generator_partner/i18n/es_ES.po
+++ /dev/null
@@ -1,128 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-# Translators:
-# OCA Transbot , 2017
-# Fernando Lara , 2017
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 10.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-05-02 00:27+0000\n"
-"PO-Revision-Date: 2017-05-02 00:27+0000\n"
-"Last-Translator: Fernando Lara , 2017\n"
-"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/"
-"es_ES/)\n"
-"Language: es_ES\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr "Regla del codigo de barras"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-#, fuzzy
-msgid "Generate Model"
-msgstr "Generar Tipo"
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Partners"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
-#~ msgid ""
-#~ "Allow to generate barcode, including a number (a base) in the final "
-#~ "barcode.\n"
-#~ " 'Base Set Manually' : User should set manually the value of the barcode "
-#~ "base\n"
-#~ " 'Base managed by Sequence': User will use a button to generate a new "
-#~ "base. This base will be generated by a sequence"
-#~ msgstr ""
-#~ "Permitir generar código de barras, incluyendo un número (una base) en el "
-#~ "código de barras final.'U+23CE'\n"
-#~ "'Base Set Manually': El usuario debe establecer manualmente el valor del "
-#~ "código de barras base'U+23CE'\n"
-#~ "'Base administrada por Secuencia': El usuario utilizará un botón para "
-#~ "generar una nueva base. Esta base será generada por una secuencia"
-
-#~ msgid "Barcode Base"
-#~ msgstr "Base de código de barras"
-
-#~ msgid "barcode.rule"
-#~ msgstr "regla.barra de codigos"
diff --git a/barcode_generator_partner/i18n/fr.po b/barcode_generator_partner/i18n/fr.po
deleted file mode 100644
index 246d6ca..0000000
--- a/barcode_generator_partner/i18n/fr.po
+++ /dev/null
@@ -1,127 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-# Translators:
-# OCA Transbot , 2017
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 10.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-05-02 00:27+0000\n"
-"PO-Revision-Date: 2017-05-02 00:27+0000\n"
-"Last-Translator: OCA Transbot , 2017\n"
-"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr "Règle de code barre"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr "Générer un code barre (via règle de codes barre)"
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr "Générer une base (via une séquence)"
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-#, fuzzy
-msgid "Generate Model"
-msgstr "Type de génération"
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-#, fuzzy
-msgid "Partners"
-msgstr "Partenaire"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
-#~ msgid ""
-#~ "Allow to generate barcode, including a number (a base) in the final "
-#~ "barcode.\n"
-#~ " 'Base Set Manually' : User should set manually the value of the barcode "
-#~ "base\n"
-#~ " 'Base managed by Sequence': User will use a button to generate a new "
-#~ "base. This base will be generated by a sequence"
-#~ msgstr ""
-#~ "Autorise à générer des codes barre en incluant un numéro (base du code "
-#~ "barre) dans le code barre final.\n"
-#~ " 'Base indiquée manuellement' : L'utilisateur devra indiquer manuellement "
-#~ "la base du barcode\n"
-#~ " 'Base gérée via une séquence': L'utilisateur devra utiliser un boutton "
-#~ "pour générer une nouvelle base. Cette base sera générée par une séquence"
-
-#~ msgid "Barcode Base"
-#~ msgstr "Base du code Barre"
-
-#~ msgid "barcode.rule"
-#~ msgstr "barcode.rule"
diff --git a/barcode_generator_partner/i18n/hr.po b/barcode_generator_partner/i18n/hr.po
deleted file mode 100644
index a3884f4..0000000
--- a/barcode_generator_partner/i18n/hr.po
+++ /dev/null
@@ -1,128 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-# Translators:
-# Bole , 2017
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 10.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-02-15 02:01+0000\n"
-"PO-Revision-Date: 2018-02-15 02:01+0000\n"
-"Last-Translator: Bole , 2017\n"
-"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
-"Language: hr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr "Barkod pravilo"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr "Generiraj barkod (koristeći pravilo)"
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr "Generiraj osnovno ( koristi br.krug)"
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-#, fuzzy
-msgid "Generate Model"
-msgstr "Tip generatora"
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-#, fuzzy
-msgid "Partners"
-msgstr "Partner"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
-#~ msgid ""
-#~ "Allow to generate barcode, including a number (a base) in the final "
-#~ "barcode.\n"
-#~ " 'Base Set Manually' : User should set manually the value of the barcode "
-#~ "base\n"
-#~ " 'Base managed by Sequence': User will use a button to generate a new "
-#~ "base. This base will be generated by a sequence"
-#~ msgstr ""
-#~ "Omogućuje generiranje barkodova, uključujući broj(osnova) u finalnom "
-#~ "barkodu.\n"
-#~ "'Osnova postavljena ručno' : korisnik treba ručno postaviti vrijednost "
-#~ "osnovice barkoda.\n"
-#~ "'Osnova prema sekvenci' : korisnik će koristiti guzmb za generirnje nove "
-#~ "osnove. Ta osnova će biti generirana iz sekvence."
-
-#~ msgid "Barcode Base"
-#~ msgstr "Osnova barkodova"
-
-#~ msgid "barcode.rule"
-#~ msgstr "barcode.rule"
diff --git a/barcode_generator_partner/i18n/nl_NL.po b/barcode_generator_partner/i18n/nl_NL.po
deleted file mode 100644
index 5496f50..0000000
--- a/barcode_generator_partner/i18n/nl_NL.po
+++ /dev/null
@@ -1,108 +0,0 @@
-# Translation of Odoo Server.
-# This file contains the translation of the following modules:
-# * barcodes_generator_partner
-#
-# Translators:
-# Peter Hageman , 2017
-msgid ""
-msgstr ""
-"Project-Id-Version: Odoo Server 10.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-07-07 15:18+0000\n"
-"PO-Revision-Date: 2017-07-07 15:18+0000\n"
-"Last-Translator: Peter Hageman , 2017\n"
-"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/"
-"teams/23907/nl_NL/)\n"
-"Language: nl_NL\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Alias"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_barcode_rule
-msgid "Barcode Rule"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Client"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model,name:barcodes_generator_partner.model_res_partner
-msgid "Contact"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Barcode (Using Barcode Rule)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model_terms:ir.ui.view,arch_db:barcodes_generator_partner.view_res_partner_form
-msgid "Generate Base (Using Sequence)"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "Generate Model"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,help:barcodes_generator_partner.field_barcode_rule__generate_model
-msgid "If 'Generate Type' is set, mention the model related to this rule."
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Lot"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Package"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Partners"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Products"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,generate_model:0
-msgid "Stock Location"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: model:ir.model.fields,field_description:barcodes_generator_partner.field_barcode_rule__type
-msgid "Type"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Unit Product"
-msgstr ""
-
-#. module: barcodes_generator_partner
-#: selection:barcode.rule,type:0
-msgid "Weighted Product"
-msgstr ""
-
-#~ msgid "barcode.rule"
-#~ msgstr "barcode.rule"
diff --git a/barcode_generator_partner/models/__init__.py b/barcode_generator_partner/models/__init__.py
deleted file mode 100644
index d04ceba..0000000
--- a/barcode_generator_partner/models/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from . import barcode_rule
-from . import res_partner
diff --git a/barcode_generator_partner/models/barcode_rule.py b/barcode_generator_partner/models/barcode_rule.py
deleted file mode 100644
index 5442fb5..0000000
--- a/barcode_generator_partner/models/barcode_rule.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (C) 2014-Today GRAP (http://www.grap.coop)
-# Copyright (C) 2016-Today La Louve (http://www.lalouve.net)
-# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from odoo import fields, models
-
-
-class BarcodeRule(models.Model):
- _inherit = "barcode.rule"
-
- generate_model = fields.Selection(selection_add=[("res.partner", "Partners")])
diff --git a/barcode_generator_partner/models/res_partner.py b/barcode_generator_partner/models/res_partner.py
deleted file mode 100644
index 63490f2..0000000
--- a/barcode_generator_partner/models/res_partner.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (C) 2014-Today GRAP (http://www.grap.coop)
-# Copyright (C) 2016-Today La Louve (http://www.lalouve.net)
-# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from odoo import models
-
-
-class ResPartner(models.Model):
- _name = "res.partner"
- _inherit = ["res.partner", "barcode.generate.mixin"]
diff --git a/barcode_generator_partner/readme/CONFIGURE.rst b/barcode_generator_partner/readme/CONFIGURE.rst
deleted file mode 100644
index f49c227..0000000
--- a/barcode_generator_partner/readme/CONFIGURE.rst
+++ /dev/null
@@ -1 +0,0 @@
-* To configure this module, see the 'Configuration' Section of the description of the module 'barcodes_generator_abstract'
diff --git a/barcode_generator_partner/readme/CONTRIBUTORS.rst b/barcode_generator_partner/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 26d1341..0000000
--- a/barcode_generator_partner/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-* Sylvain LE GAL (https://twitter.com/legalsylvain)
-* Dave Lasley
-* Druidoo (https://druidoo.io)
-* Armand POLMARD (https://github.com/ArPol-developpement)
diff --git a/barcode_generator_partner/readme/DESCRIPTION.rst b/barcode_generator_partner/readme/DESCRIPTION.rst
deleted file mode 100644
index 12c9c26..0000000
--- a/barcode_generator_partner/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-This module expands Odoo functionality, allowing user to generate barcode
-depending on a given barcode rule for Partners.
-
-For example, a typical pattern for partners is "042........." that means
-that:
-
-* the EAN13 code will begin by '042'
-* followed by 0 digits (named Barcode Base in this module)
-* a 13 digit control
-
-With this module, it is possible to:
-
-* Assign a pattern (barcode.rule) to a res.partner
-
-* Define a Barcode base:
- * manually, if the base of the barcode must be set by a user. (typically an
- internal code defined in your company)
- * automaticaly by a sequence, if you want to let Odoo to increment a
- sequence. (typical case of a customer number incrementation)
-
-* Generate a barcode, based on the defined pattern and the barcode base
diff --git a/barcode_generator_partner/readme/USAGE.rst b/barcode_generator_partner/readme/USAGE.rst
deleted file mode 100644
index 952c993..0000000
--- a/barcode_generator_partner/readme/USAGE.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-To use this module, you need to:
-
-* Go to a Customer/Contact form, Sales & Purchases Tab:
-
-1 for manual generation
- * Set a Barcode Rule
- * Set a Barcode Base
- * click on the button 'Generate Barcode (Using Barcode Rule)'
-
-2 for automatic generation
- * Set a Barcode Rule
- * click on the button 'Generate Base (Using Sequence)'
- * click on the button 'Generate Barcode (Using Barcode Rule)'
-
-.. image:: /barcodes_generator_partner/static/description/res_partner_sequence_generation.png
- :width: 1100px
diff --git a/barcode_generator_partner/static/description/icon.png b/barcode_generator_partner/static/description/icon.png
deleted file mode 100644
index 00f4e89..0000000
Binary files a/barcode_generator_partner/static/description/icon.png and /dev/null differ
diff --git a/barcode_generator_partner/static/description/res_partner_sequence_generation.png b/barcode_generator_partner/static/description/res_partner_sequence_generation.png
deleted file mode 100644
index 4b16e35..0000000
Binary files a/barcode_generator_partner/static/description/res_partner_sequence_generation.png and /dev/null differ
diff --git a/barcode_generator_partner/tests/__init__.py b/barcode_generator_partner/tests/__init__.py
deleted file mode 100644
index 22d1a55..0000000
--- a/barcode_generator_partner/tests/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from . import test_barcodes_generator_partner
diff --git a/barcode_generator_partner/tests/test_barcodes_generator_partner.py b/barcode_generator_partner/tests/test_barcodes_generator_partner.py
deleted file mode 100644
index 2c72523..0000000
--- a/barcode_generator_partner/tests/test_barcodes_generator_partner.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2016-Today GRAP (http://www.grap.coop)
-# Copyright (C) 2016-Today La Louve (http://www.lalouve.net)
-# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-from odoo.tests.common import TransactionCase
-
-
-class Tests(TransactionCase):
- """Tests for 'Barcodes Generate"""
-
- def setUp(self):
- super().setUp()
- self.partner_obj = self.env["res.partner"]
-
- # Test Section
- def test_01_sequence_generation_partner(self):
- self.partner = self.partner_obj.browse(
- self.ref("barcodes_generator_partner.res_partner_barcode")
- )
- self.partner.generate_barcode()
- self.assertEqual(
- self.partner.barcode_base,
- 1,
- "Incorrect base Generation (by sequence) for Partner.",
- )
- self.assertEqual(
- self.partner.barcode,
- "0420000000013",
- "Barcode Generation (by sequence) for Partner."
- "Incorrect EAN13 Generated. Pattern : %s - Base : %s"
- % (self.partner.barcode_rule_id.pattern, self.partner.barcode_base),
- )
diff --git a/barcode_generator_partner/views/view_res_partner.xml b/barcode_generator_partner/views/view_res_partner.xml
deleted file mode 100644
index 4050f09..0000000
--- a/barcode_generator_partner/views/view_res_partner.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
- res.partner
-
-
-
-
-
-
-
-
-
-
- {'readonly': [('generate_type', '=', 'sequence')]}
-
-
-
-
-
-
-
-
-
diff --git a/check_addon.sh b/check_addon.sh
new file mode 100755
index 0000000..5f9c63c
--- /dev/null
+++ b/check_addon.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+# Script para verificar rápidamente un addon específico
+
+set -e
+
+if [ -z "$1" ]; then
+ echo "Uso: $0 "
+ echo "Ejemplo: $0 account_invoice_triple_discount"
+ exit 1
+fi
+
+ADDON_NAME=$1
+ADDON_PATH="./$ADDON_NAME"
+
+if [ ! -d "$ADDON_PATH" ]; then
+ echo "Error: El addon '$ADDON_NAME' no existe en este directorio"
+ exit 1
+fi
+
+if [ ! -f "$ADDON_PATH/__manifest__.py" ] && [ ! -f "$ADDON_PATH/__openerp__.py" ]; then
+ echo "Error: '$ADDON_NAME' no parece ser un addon válido de Odoo"
+ exit 1
+fi
+
+echo "=========================================="
+echo "Verificando addon: $ADDON_NAME"
+echo "=========================================="
+echo ""
+
+echo "1. Ejecutando black..."
+black --check "$ADDON_PATH" || (echo "❌ Black encontró problemas de formato" && black "$ADDON_PATH" && echo "✅ Formateado con black")
+
+echo ""
+echo "2. Ejecutando isort..."
+isort --check-only "$ADDON_PATH" || (echo "❌ isort encontró problemas" && isort "$ADDON_PATH" && echo "✅ Imports ordenados con isort")
+
+echo ""
+echo "3. Ejecutando flake8..."
+flake8 "$ADDON_PATH" && echo "✅ flake8 pasó correctamente" || echo "❌ flake8 encontró problemas"
+
+echo ""
+echo "4. Ejecutando pylint (checks mandatorios)..."
+pylint --rcfile=.pylintrc-mandatory "$ADDON_PATH" && echo "✅ pylint mandatorio pasó correctamente" || echo "❌ pylint mandatorio encontró problemas"
+
+echo ""
+echo "5. Ejecutando pylint (checks opcionales)..."
+pylint --rcfile=.pylintrc --exit-zero "$ADDON_PATH"
+
+echo ""
+echo "=========================================="
+echo "Verificación completa de $ADDON_NAME"
+echo "=========================================="
diff --git a/check_tax_config.sh b/check_tax_config.sh
new file mode 100755
index 0000000..ff65e98
--- /dev/null
+++ b/check_tax_config.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Verificar configuración de impuestos
+
+echo "=========================================="
+echo "Verificando configuración de impuestos"
+echo "=========================================="
+
+docker-compose exec -T db psql -U odoo -d odoo << 'SQL'
+-- Verificar impuestos de venta y su configuración de price_include
+SELECT
+ at.id,
+ at.name,
+ at.amount,
+ at.price_include,
+ at.type_tax_use,
+ rc.name as company
+FROM account_tax at
+LEFT JOIN res_company rc ON at.company_id = rc.id
+WHERE at.type_tax_use = 'sale'
+ AND at.active = true
+ORDER BY at.amount DESC
+LIMIT 20;
+SQL
+
+echo ""
+echo "Nota: Si price_include = false (f), entonces el precio NO incluye IVA"
+echo " Si price_include = true (t), entonces el precio SÍ incluye IVA"
diff --git a/code_backend_theme/README.rst b/code_backend_theme/README.rst
deleted file mode 100644
index 82f6d7d..0000000
--- a/code_backend_theme/README.rst
+++ /dev/null
@@ -1,40 +0,0 @@
-Code Backend Theme
-==================
-* Code Backend Theme module for Odoo 16 community editions
-
-Installation
-============
- - www.odoo.com/documentation/16.0/setup/install.html
- - Install our custom addon
-
-License
--------
-General Public License, Version 3 (LGPL v3).
-(https://www.odoo.com/documentation/user/14.0/legal/licenses/licenses.html)
-
-Company
--------
-* 'Cybrosys Techno Solutions '__
-
-Credits
--------
-* 'Cybrosys Techno Solutions '__
-
-Contacts
---------
-* Mail Contact : odoo@cybrosys.com
-
-Bug Tracker
------------
-Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
-
-Maintainer
-==========
-This module is maintained by Cybrosys Technologies.
-
-For support and more information, please visit https://www.cybrosys.com
-
-Further information
-===================
-HTML Description: ``__
-
diff --git a/code_backend_theme/__init__.py b/code_backend_theme/__init__.py
deleted file mode 100644
index 5042f46..0000000
--- a/code_backend_theme/__init__.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# -*- coding: utf-8 -*-
-#############################################################################
-#
-# Cybrosys Technologies Pvt. Ltd.
-#
-# Copyright (C) 2021-TODAY Cybrosys Technologies()
-# Author: Cybrosys Techno Solutions()
-#
-# You can modify it under the terms of the GNU LESSER
-# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
-#
-# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
-# (LGPL v3) along with this program.
-# If not, see .
-#
-#############################################################################
-from .hooks import test_pre_init_hook, test_post_init_hook
diff --git a/code_backend_theme/__manifest__.py b/code_backend_theme/__manifest__.py
deleted file mode 100644
index 7f344dc..0000000
--- a/code_backend_theme/__manifest__.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# -*- coding: utf-8 -*-
-#############################################################################
-#
-# Cybrosys Technologies Pvt. Ltd.
-#
-# Copyright (C) 2021-TODAY Cybrosys Technologies()
-# Author: Cybrosys Techno Solutions()
-#
-# You can modify it under the terms of the GNU LESSER
-# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
-#
-# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
-# (LGPL v3) along with this program.
-# If not, see .
-#
-#############################################################################
-
-{
- "name": "Code Backend Theme V16",
- "description": """Minimalist and elegant backend theme for Odoo 16, Backend Theme, Theme""",
- "summary": "Code Backend Theme V16 is an attractive theme for backend",
- "category": "Themes/Backend",
- "version": "16.0.1.0.2",
- 'author': 'Cybrosys Techno Solutions',
- 'company': 'Cybrosys Techno Solutions',
- 'maintainer': 'Cybrosys Techno Solutions',
- 'website': "https://www.cybrosys.com",
- "depends": ['base', 'web', 'mail'],
- "data": [
- 'views/layout.xml',
- 'views/icons.xml',
- ],
- 'assets': {
- 'web.assets_backend': [
- 'code_backend_theme/static/src/xml/styles.xml',
- 'code_backend_theme/static/src/xml/top_bar.xml',
- 'code_backend_theme/static/src/scss/theme_accent.scss',
- 'code_backend_theme/static/src/scss/navigation_bar.scss',
- 'code_backend_theme/static/src/scss/datetimepicker.scss',
- 'code_backend_theme/static/src/scss/theme.scss',
- 'code_backend_theme/static/src/scss/sidebar.scss',
- 'code_backend_theme/static/src/js/chrome/sidebar_menu.js',
- 'code_backend_theme/static/src/js/fields/colors.js',
- ],
- 'web.assets_frontend': [
- 'code_backend_theme/static/src/scss/login.scss',
- ],
- },
- 'images': [
- 'static/description/banner.png',
- 'static/description/theme_screenshot.png',
- ],
- 'license': 'LGPL-3',
- 'pre_init_hook': 'test_pre_init_hook',
- 'post_init_hook': 'test_post_init_hook',
- 'installable': True,
- 'application': False,
- 'auto_install': False,
-}
diff --git a/code_backend_theme/doc/RELEASE_NOTES.md b/code_backend_theme/doc/RELEASE_NOTES.md
deleted file mode 100644
index 0364c2d..0000000
--- a/code_backend_theme/doc/RELEASE_NOTES.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Module
-
-#### 17.10.2022
-#### Version 16.0.1.0.0
-#### ADD
-Initial Commit
diff --git a/code_backend_theme/hooks.py b/code_backend_theme/hooks.py
deleted file mode 100644
index 81a996b..0000000
--- a/code_backend_theme/hooks.py
+++ /dev/null
@@ -1,292 +0,0 @@
-"""Hooks for Changing Menu Web_icon"""
-# -*- coding: utf-8 -*-
-#############################################################################
-#
-# Cybrosys Technologies Pvt. Ltd.
-#
-# Copyright (C) 2021-TODAY Cybrosys Technologies()
-# Author: Cybrosys Techno Solutions()
-#
-# You can modify it under the terms of the GNU LESSER
-# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
-#
-# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
-# (LGPL v3) along with this program.
-# If not, see .
-#
-#############################################################################
-import base64
-
-from odoo import api, SUPERUSER_ID
-from odoo.modules import get_module_resource
-
-
-def test_pre_init_hook(cr):
- """pre init hook"""
-
- env = api.Environment(cr, SUPERUSER_ID, {})
- menu_item = env['ir.ui.menu'].search([('parent_id', '=', False)])
-
- for menu in menu_item:
- if menu.name == 'Contacts':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Contacts.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Link Tracker':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Link Tracker.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Dashboards':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Dashboards.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Sales':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Sales.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Invoicing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Invoicing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Inventory':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Inventory.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Purchase':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Purchase.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Calendar':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Calendar.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'CRM':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'CRM.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Note' or menu.name == 'Notes':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Note.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Website':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Website.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Point of Sale':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Point of Sale.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Manufacturing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Manufacturing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Repairs':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Repairs.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Email Marketing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Email Marketing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'SMS Marketing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'SMS Marketing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Project':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Project.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Surveys':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Surveys.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Employees':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Employees.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Recruitment':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Recruitment.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Attendances':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Attendances.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Time Off':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Time Off.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Expenses':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Expenses.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Maintenance':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Maintenance.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Live Chat':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Live Chat.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Lunch':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Lunch.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Fleet':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Fleet.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Timesheets':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Timesheets.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Events':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Events.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'eLearning':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'eLearning.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Members':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Members.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
-
-
-def test_post_init_hook(cr, registry):
- """post init hook"""
-
- env = api.Environment(cr, SUPERUSER_ID, {})
- menu_item = env['ir.ui.menu'].search([('parent_id', '=', False)])
-
- for menu in menu_item:
- if menu.name == 'Contacts':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Contacts.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Link Tracker':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Link Tracker.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Dashboards':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Dashboards.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Sales':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Sales.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Invoicing' or menu.name == 'Accounting':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Invoicing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Inventory':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Inventory.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Purchase':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Purchase.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Calendar':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Calendar.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'CRM':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'CRM.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Note':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Note.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Website':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Website.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Point of Sale':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Point of Sale.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Manufacturing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Manufacturing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Repairs':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Repairs.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Email Marketing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Email Marketing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'SMS Marketing':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'SMS Marketing.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Project':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Project.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Surveys':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Surveys.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Employees':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Employees.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Recruitment':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Recruitment.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Attendances':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Attendances.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Time Off':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Time Off.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Expenses':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Expenses.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Maintenance':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Maintenance.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Live Chat':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Live Chat.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Lunch':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Lunch.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Fleet':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Fleet.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Timesheets':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Timesheets.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Events':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Events.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'eLearning':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'eLearning.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
- if menu.name == 'Members':
- img_path = get_module_resource(
- 'code_backend_theme', 'static', 'src', 'img', 'icons', 'Members.png')
- menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
diff --git a/code_backend_theme/static/description/assets/all_screens.png b/code_backend_theme/static/description/assets/all_screens.png
deleted file mode 100644
index dda177c..0000000
Binary files a/code_backend_theme/static/description/assets/all_screens.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/easily-access-menu.gif b/code_backend_theme/static/description/assets/easily-access-menu.gif
deleted file mode 100644
index 08340f3..0000000
Binary files a/code_backend_theme/static/description/assets/easily-access-menu.gif and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/hero.png b/code_backend_theme/static/description/assets/hero.png
deleted file mode 100644
index e4415fd..0000000
Binary files a/code_backend_theme/static/description/assets/hero.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/check.png b/code_backend_theme/static/description/assets/icons/check.png
deleted file mode 100644
index c8e85f5..0000000
Binary files a/code_backend_theme/static/description/assets/icons/check.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/chevron.png b/code_backend_theme/static/description/assets/icons/chevron.png
deleted file mode 100644
index 2089293..0000000
Binary files a/code_backend_theme/static/description/assets/icons/chevron.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/cogs.png b/code_backend_theme/static/description/assets/icons/cogs.png
deleted file mode 100644
index 95d0bad..0000000
Binary files a/code_backend_theme/static/description/assets/icons/cogs.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/consultation.png b/code_backend_theme/static/description/assets/icons/consultation.png
deleted file mode 100644
index 8319d4b..0000000
Binary files a/code_backend_theme/static/description/assets/icons/consultation.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/ecom-black.png b/code_backend_theme/static/description/assets/icons/ecom-black.png
deleted file mode 100644
index a9385ff..0000000
Binary files a/code_backend_theme/static/description/assets/icons/ecom-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/education-black.png b/code_backend_theme/static/description/assets/icons/education-black.png
deleted file mode 100644
index 3eb09b2..0000000
Binary files a/code_backend_theme/static/description/assets/icons/education-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/hotel-black.png b/code_backend_theme/static/description/assets/icons/hotel-black.png
deleted file mode 100644
index 130f613..0000000
Binary files a/code_backend_theme/static/description/assets/icons/hotel-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/license.png b/code_backend_theme/static/description/assets/icons/license.png
deleted file mode 100644
index a586979..0000000
Binary files a/code_backend_theme/static/description/assets/icons/license.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/lifebuoy.png b/code_backend_theme/static/description/assets/icons/lifebuoy.png
deleted file mode 100644
index 658d56c..0000000
Binary files a/code_backend_theme/static/description/assets/icons/lifebuoy.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/manufacturing-black.png b/code_backend_theme/static/description/assets/icons/manufacturing-black.png
deleted file mode 100644
index 697eb0e..0000000
Binary files a/code_backend_theme/static/description/assets/icons/manufacturing-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/pos-black.png b/code_backend_theme/static/description/assets/icons/pos-black.png
deleted file mode 100644
index 97c0f90..0000000
Binary files a/code_backend_theme/static/description/assets/icons/pos-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/puzzle.png b/code_backend_theme/static/description/assets/icons/puzzle.png
deleted file mode 100644
index 65cf854..0000000
Binary files a/code_backend_theme/static/description/assets/icons/puzzle.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/restaurant-black.png b/code_backend_theme/static/description/assets/icons/restaurant-black.png
deleted file mode 100644
index 4a35eb9..0000000
Binary files a/code_backend_theme/static/description/assets/icons/restaurant-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/service-black.png b/code_backend_theme/static/description/assets/icons/service-black.png
deleted file mode 100644
index 301ab51..0000000
Binary files a/code_backend_theme/static/description/assets/icons/service-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/trading-black.png b/code_backend_theme/static/description/assets/icons/trading-black.png
deleted file mode 100644
index 9398ba2..0000000
Binary files a/code_backend_theme/static/description/assets/icons/trading-black.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/training.png b/code_backend_theme/static/description/assets/icons/training.png
deleted file mode 100644
index 884ca02..0000000
Binary files a/code_backend_theme/static/description/assets/icons/training.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/update.png b/code_backend_theme/static/description/assets/icons/update.png
deleted file mode 100644
index ecbc5a0..0000000
Binary files a/code_backend_theme/static/description/assets/icons/update.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/user.png b/code_backend_theme/static/description/assets/icons/user.png
deleted file mode 100644
index 6ffb23d..0000000
Binary files a/code_backend_theme/static/description/assets/icons/user.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/icons/wrench.png b/code_backend_theme/static/description/assets/icons/wrench.png
deleted file mode 100644
index 6c04dea..0000000
Binary files a/code_backend_theme/static/description/assets/icons/wrench.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/menu_focus.png b/code_backend_theme/static/description/assets/menu_focus.png
deleted file mode 100644
index dc7b00c..0000000
Binary files a/code_backend_theme/static/description/assets/menu_focus.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/categories.png b/code_backend_theme/static/description/assets/misc/categories.png
deleted file mode 100644
index bedf1e0..0000000
Binary files a/code_backend_theme/static/description/assets/misc/categories.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/check-box.png b/code_backend_theme/static/description/assets/misc/check-box.png
deleted file mode 100644
index 42caf24..0000000
Binary files a/code_backend_theme/static/description/assets/misc/check-box.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/compass.png b/code_backend_theme/static/description/assets/misc/compass.png
deleted file mode 100644
index d5fed8f..0000000
Binary files a/code_backend_theme/static/description/assets/misc/compass.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/corporate.png b/code_backend_theme/static/description/assets/misc/corporate.png
deleted file mode 100644
index 2eb13ed..0000000
Binary files a/code_backend_theme/static/description/assets/misc/corporate.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/customer-support.png b/code_backend_theme/static/description/assets/misc/customer-support.png
deleted file mode 100644
index 79efc72..0000000
Binary files a/code_backend_theme/static/description/assets/misc/customer-support.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/cybrosys-logo.png b/code_backend_theme/static/description/assets/misc/cybrosys-logo.png
deleted file mode 100644
index cc3cc0c..0000000
Binary files a/code_backend_theme/static/description/assets/misc/cybrosys-logo.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/features.png b/code_backend_theme/static/description/assets/misc/features.png
deleted file mode 100644
index b41769f..0000000
Binary files a/code_backend_theme/static/description/assets/misc/features.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/logo.png b/code_backend_theme/static/description/assets/misc/logo.png
deleted file mode 100644
index 478462d..0000000
Binary files a/code_backend_theme/static/description/assets/misc/logo.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/pictures.png b/code_backend_theme/static/description/assets/misc/pictures.png
deleted file mode 100644
index 56d255f..0000000
Binary files a/code_backend_theme/static/description/assets/misc/pictures.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/pie-chart.png b/code_backend_theme/static/description/assets/misc/pie-chart.png
deleted file mode 100644
index 426e052..0000000
Binary files a/code_backend_theme/static/description/assets/misc/pie-chart.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/right-arrow.png b/code_backend_theme/static/description/assets/misc/right-arrow.png
deleted file mode 100644
index 730984a..0000000
Binary files a/code_backend_theme/static/description/assets/misc/right-arrow.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/star.png b/code_backend_theme/static/description/assets/misc/star.png
deleted file mode 100644
index 2eb9ab2..0000000
Binary files a/code_backend_theme/static/description/assets/misc/star.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/support.png b/code_backend_theme/static/description/assets/misc/support.png
deleted file mode 100644
index 4f18b8b..0000000
Binary files a/code_backend_theme/static/description/assets/misc/support.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/misc/whatsapp.png b/code_backend_theme/static/description/assets/misc/whatsapp.png
deleted file mode 100644
index d513a53..0000000
Binary files a/code_backend_theme/static/description/assets/misc/whatsapp.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/1.png b/code_backend_theme/static/description/assets/modules/1.png
deleted file mode 100644
index 5238bde..0000000
Binary files a/code_backend_theme/static/description/assets/modules/1.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/2.png b/code_backend_theme/static/description/assets/modules/2.png
deleted file mode 100644
index 1ae7cfe..0000000
Binary files a/code_backend_theme/static/description/assets/modules/2.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/3.png b/code_backend_theme/static/description/assets/modules/3.png
deleted file mode 100644
index 3c3ff1a..0000000
Binary files a/code_backend_theme/static/description/assets/modules/3.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/4.png b/code_backend_theme/static/description/assets/modules/4.png
deleted file mode 100644
index 3fae463..0000000
Binary files a/code_backend_theme/static/description/assets/modules/4.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/5.gif b/code_backend_theme/static/description/assets/modules/5.gif
deleted file mode 100644
index 2a5f8e6..0000000
Binary files a/code_backend_theme/static/description/assets/modules/5.gif and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/modules/6.png b/code_backend_theme/static/description/assets/modules/6.png
deleted file mode 100644
index 7f28152..0000000
Binary files a/code_backend_theme/static/description/assets/modules/6.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/resp-gif.gif b/code_backend_theme/static/description/assets/resp-gif.gif
deleted file mode 100644
index f6939e0..0000000
Binary files a/code_backend_theme/static/description/assets/resp-gif.gif and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/responsive.jpg b/code_backend_theme/static/description/assets/responsive.jpg
deleted file mode 100644
index 06cb4e9..0000000
Binary files a/code_backend_theme/static/description/assets/responsive.jpg and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/1.png b/code_backend_theme/static/description/assets/screenshots/1.png
deleted file mode 100644
index ae85974..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/1.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/10.newlookoftabs.png b/code_backend_theme/static/description/assets/screenshots/10.newlookoftabs.png
deleted file mode 100644
index a365ac4..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/10.newlookoftabs.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/10.png b/code_backend_theme/static/description/assets/screenshots/10.png
deleted file mode 100644
index bbdb1f2..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/10.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/11.png b/code_backend_theme/static/description/assets/screenshots/11.png
deleted file mode 100644
index 9569c40..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/11.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/11.recruitment.png b/code_backend_theme/static/description/assets/screenshots/11.recruitment.png
deleted file mode 100644
index cf5f0a4..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/11.recruitment.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/12.png b/code_backend_theme/static/description/assets/screenshots/12.png
deleted file mode 100644
index 2efcdb2..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/12.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/12.saleskanban.png b/code_backend_theme/static/description/assets/screenshots/12.saleskanban.png
deleted file mode 100644
index cd444ff..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/12.saleskanban.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/13.modified kanban employee.png b/code_backend_theme/static/description/assets/screenshots/13.modified kanban employee.png
deleted file mode 100644
index 3d30005..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/13.modified kanban employee.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/13.png b/code_backend_theme/static/description/assets/screenshots/13.png
deleted file mode 100644
index 2032c09..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/13.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/14.png b/code_backend_theme/static/description/assets/screenshots/14.png
deleted file mode 100644
index 72daae4..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/14.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/15.sidebarwithlistview.png b/code_backend_theme/static/description/assets/screenshots/15.sidebarwithlistview.png
deleted file mode 100644
index a15a09f..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/15.sidebarwithlistview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/16grapghview.png b/code_backend_theme/static/description/assets/screenshots/16grapghview.png
deleted file mode 100644
index f30cacb..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/16grapghview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/17.attendanceview.png b/code_backend_theme/static/description/assets/screenshots/17.attendanceview.png
deleted file mode 100644
index 93001bc..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/17.attendanceview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/2.groupbyview.png b/code_backend_theme/static/description/assets/screenshots/2.groupbyview.png
deleted file mode 100644
index babf27b..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/2.groupbyview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/2.png b/code_backend_theme/static/description/assets/screenshots/2.png
deleted file mode 100644
index ed8bf28..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/2.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/3.png b/code_backend_theme/static/description/assets/screenshots/3.png
deleted file mode 100644
index 82147fb..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/3.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/3.settings page.png b/code_backend_theme/static/description/assets/screenshots/3.settings page.png
deleted file mode 100644
index ea62e8c..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/3.settings page.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/4.discusspage.png b/code_backend_theme/static/description/assets/screenshots/4.discusspage.png
deleted file mode 100644
index c81b6bd..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/4.discusspage.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/4.png b/code_backend_theme/static/description/assets/screenshots/4.png
deleted file mode 100644
index 593473d..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/4.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/5.png b/code_backend_theme/static/description/assets/screenshots/5.png
deleted file mode 100644
index 9d323ce..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/5.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/5.productskanaban.png b/code_backend_theme/static/description/assets/screenshots/5.productskanaban.png
deleted file mode 100644
index 8305b92..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/5.productskanaban.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/6.png b/code_backend_theme/static/description/assets/screenshots/6.png
deleted file mode 100644
index 26a82e8..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/6.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/6.purchase view.png b/code_backend_theme/static/description/assets/screenshots/6.purchase view.png
deleted file mode 100644
index 140a74f..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/6.purchase view.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/7.png b/code_backend_theme/static/description/assets/screenshots/7.png
deleted file mode 100644
index 0c0816a..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/7.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/7.productviewsmartbuttons.png b/code_backend_theme/static/description/assets/screenshots/7.productviewsmartbuttons.png
deleted file mode 100644
index 1f30fcf..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/7.productviewsmartbuttons.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/8.png b/code_backend_theme/static/description/assets/screenshots/8.png
deleted file mode 100644
index 9e7e3a3..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/8.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/8error.png b/code_backend_theme/static/description/assets/screenshots/8error.png
deleted file mode 100644
index 447fa01..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/8error.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/9.png b/code_backend_theme/static/description/assets/screenshots/9.png
deleted file mode 100644
index 515cba7..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/9.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/Form view.png b/code_backend_theme/static/description/assets/screenshots/Form view.png
deleted file mode 100644
index 4563357..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/Form view.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/code_backend_screenshots.png b/code_backend_theme/static/description/assets/screenshots/code_backend_screenshots.png
deleted file mode 100644
index 607b257..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/code_backend_screenshots.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/kanabangroupview.png b/code_backend_theme/static/description/assets/screenshots/kanabangroupview.png
deleted file mode 100644
index d6f3f0d..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/kanabangroupview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/listview.png b/code_backend_theme/static/description/assets/screenshots/listview.png
deleted file mode 100644
index a816045..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/listview.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/login.png b/code_backend_theme/static/description/assets/screenshots/login.png
deleted file mode 100644
index cb6e824..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/login.png and /dev/null differ
diff --git a/code_backend_theme/static/description/assets/screenshots/modal.png b/code_backend_theme/static/description/assets/screenshots/modal.png
deleted file mode 100644
index b89e182..0000000
Binary files a/code_backend_theme/static/description/assets/screenshots/modal.png and /dev/null differ
diff --git a/code_backend_theme/static/description/banner.png b/code_backend_theme/static/description/banner.png
deleted file mode 100644
index e62c9f3..0000000
Binary files a/code_backend_theme/static/description/banner.png and /dev/null differ
diff --git a/code_backend_theme/static/description/icon.png b/code_backend_theme/static/description/icon.png
deleted file mode 100644
index 260f9ab..0000000
Binary files a/code_backend_theme/static/description/icon.png and /dev/null differ
diff --git a/code_backend_theme/static/description/index.html b/code_backend_theme/static/description/index.html
deleted file mode 100644
index 1645027..0000000
--- a/code_backend_theme/static/description/index.html
+++ /dev/null
@@ -1,1108 +0,0 @@
-
-
-
-
-
- Code Backend Theme
-
-
- Minimalist and Elegant Backend
- Theme for Odoo 16
-
-
-
-
-
-
-
-
-
-
-
-
-
- The Code Backend Theme V16 Gives You a Fully Modified View with
- a Full Screen Display.
- This is a Minimalist and Elegant Backend Theme for Odoo 16.
- This Theme Will Change Your Old Experience to a New Experience
- With Odoo.
- It is a Perfect Choice for Your Odoo Backend and an Attractive
- Theme for Your Odoo 16.
- It will Give You a Clean Layout with a New Color Combination and
- a Modified Font. It has a
- Sidebar with
- New App Icons and Company Logo. This Will Change Your Old
- Kanban, List and Form Views to A Fully
- Modified View.
-
-
-
-
- Please make sure that you install
- all
- your apps prior to the installation of this theme.
-
- Now take advantage of everything your dashboard has to
- offer even on the go. Our design are
- now
- fully responsive enabling you to view and manage
- everything from the comfort of your mobile
- device. Everything
- has been designed in a meticulous fashion so that every
- view snaps itself to fit the size of
- the
- device you are using, be it smartphones, tablet or any
- other portables, our theme adjusts
- itself
- to fit the screen size.
-
-
-
-
Fully responsive
-
-
-
-
-
Fly-out hamburger menu on the left
-
-
-
-
-
Fits perfectly to all screen sizes
-
-
-
-
-
Quick access menu at the bottom in discuss
-
-
-
-
-
-
-
-
-
-
-
-
-
Kanban Group View
-
- The Code Backend Theme V16 Gives You a Fully Modified Kanban
- View and Kanban Group View.
- The Section Wise Separated Stages give a Pleasant Experience
- And an Extraordinary Design
- To Your Content Tiles Making The Tiles Look Great.
- It will Give You a Clean Layout with the New Color
- Combination and a Modified Font.
-
-
-
-
-
-
Modified Font
-
-
-
-
-
New Color Combination
-
-
-
-
-
Full Screen View
-
-
-
-
-
-
-
Stages are Separated in View
-
-
-
-
-
Clean Layout
-
-
-
-
-
Buttons with New Colors
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
List View
-
- The All new Code Backend Theme V16 Gives You The Fully
- Modified List View and This Table Design
- is Also Have Awesome Design and it Gives You More Beauty for
- Your Odoo Backend.
- It will Give You a Clean Layout with the New Color
- Combination and a Modified Font.
-
-
-
-
-
-
Modified Table Style
-
-
-
-
-
New Color Combination
-
-
-
-
-
New Scroll Bar
-
-
-
-
-
-
-
New Status Tag
-
-
-
-
-
New Scrollbar
-
-
-
-
-
Buttons with New Colors
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Form View
-
- Code Backend Theme Gives You The Fully Modified Form View
- with a Full Screen Experience. It will
- Give You a Clean Layout with the New Color Combination
- and a Modified Font.
-
-
-
-
-
-
Modified Form Style
-
-
-
-
-
Full Screen Form View
-
-
-
-
-
New Looks for Tabs
-
-
-
-
-
-
-
New Style for Required Field
-
-
-
-
-
New Chatter Style Under Form View
-
-
-
-
-
New Looks for Status Button
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Overview
-
- Code Backend Theme V16 is an Attractive Theme for Your
- Odoo 16.
- This Theme Will Change Improve Your Experience With
- Odoo.
- This is a Minimalist and Elegant Backend Theme for Odoo
- 16 And Can Offer a Perfect Choice
- for
- Your Odoo Backend.
-
-
-
-
-
Modified Structure for All Type Views
-
-
-
-
-
New Style for Active Menus, Radio Buttons and Checkboxes
-
-
-
-
New Color Combination
-
-
-
-
-
New Look for All Applications
-
-
-
-
A Clean layout and New Font Style
-
-
-
-
Sidebar with New Menu Icons
-
-
-
-
-
-
-
-
-
-
- New
-
-
- All-New Menu Design
-
-
- The All-New Menu Design is Main Attractive Section for
- the Code Backend Theme. The Sidebar
- have New Minimalist
- Icons for Applications in Odoo. Also the Sidebar Have
- Closing and Opening Option.
- Customisable Logo Attached in Sidebar
- That is Automatically Fetch Your Company Logo.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Easily Access Sidebar
- Menu
-
- Reveal the sidebar menu with just a click. Sidebar menu
- features all the relevant links to
- navigate
- through the application.
- Hiding the sidebar leaves more space on the main area
- offering a distraction-free view that lets
- you
- focus on what matters the most.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Screenshots
-
-
-
-
-
-
-
-
- 1
-
-
Login Page
-
-
-
-
-
-
-
-
-
-
-
-
- 2
-
-
Group By View
-
-
-
-
-
-
-
-
-
-
-
-
- 3
-
-
Settings Page
-
-
-
-
-
-
-
-
-
-
-
-
- 4
-
-
Discuss Page
-
-
-
-
-
-
-
-
-
-
-
-
- 5
-
-
Product Kanban View
-
-
-
-
-
-
-
-
-
-
-
-
- 6
-
-
Purchase List View
-
-
-
-
-
-
-
-
-
-
-
-
- 7
-
-
Product View with Smart Buttons
-
-
-
-
-
-
-
-
-
-
-
- 8
-
-
Modified Alert Notifications are
- Placed on the Right Bottom of Display
-
-
-
-
-
-
-
-
-
-
-
-
-
- 9
-
-
Wizards and User Error Popups
-
-
-
-
-
-
-
-
-
-
-
-
- 10
-
-
New Looks for The Tabs
-
-
-
-
-
-
-
-
-
-
-
-
- 11
-
-
Recruitment Kanban View With
- Ribbons
-
-
-
-
-
-
-
-
-
-
-
- 12
-
-
Sales Kanban View
-
-
-
-
-
-
-
-
-
-
-
-
- 13
-
-
Modified Kanban View for Employees
- With New Designed Category Section
-
-
-
-
-
-
-
-
-
-
-
-
-
- 14
-
-
Sidebar with List View
-
-
-
-
-
-
-
-
-
-
-
-
-
- 15
-
-
Attendance Pages
-
-
-
-
-
-
-
-
-
-
-
-
- 16
-
-
Graphs with Sidebar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Our Services
-
-
-
-
-
-
-
- Odoo
- Customization
-
-
-
-
-
-
-
- Odoo
- Implementation
-
-
-
-
-
-
-
- Odoo
- Support
-
-
-
-
-
-
-
- Hire
- Odoo
- Developer
-
-
-
-
-
-
-
- Odoo
- Integration
-
-
-
-
-
-
-
- Odoo
- Migration
-
-
-
-
-
-
-
- Odoo
- Consultancy
-
-
-
-
-
-
-
- Odoo
- Implementation
-
-
-
-
-
-
-
- Odoo
- Licensing Consultancy
-
-
-
-
-
-
-
-
-
-
-
- Our Industries
-
-
-
-
-
-
- Trading
-
-
- Easily
- procure
- and
- sell your products
-
-
-
-
-
-
-
- POS
-
-
- Easy
- configuration
- and convivial experience
-
-
-
-
-
-
-
- Education
-
-
- A
- platform for
- educational management
-
-
-
-
-
-
-
- Manufacturing
-
-
- Plan,
- track and
- schedule your operations
-
-
-
-
-
-
- E-commerce & Website
-
-
- Mobile
- friendly,
- awe-inspiring product pages
-
-
-
-
-
-
- Service Management
-
-
- Keep
- track of
- services and invoice
-
-
-
-
-
-
- Restaurant
-
-
- Run
- your bar or
- restaurant methodically
-
-
-
-
-
-
- Hotel Management
-
-
- An
- all-inclusive
- hotel management application