From 70d6afa368db4ff7fd4e8171dc925ff06783bd81 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Thu, 16 Oct 2025 09:53:31 +0300 Subject: [PATCH 1/8] 18.0 mig deltatech purchase add extra line (#2162) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [IMP] Introduce new module for extra lines in purchase orders * Update module references for purchase extra line Replaced all occurrences of "Sale Add Extra Line" with "Purchase Add Extra Line" across documentation, metadata, and references. Adjusted links and descriptions to accurately reflect the new module context. * Actualizează versiunea modulului la 18.0.1.0.1 Modifică versiunea în fișierul `__manifest__.py` pentru a reflecta upgrade-ul la versiunea 18.0.1.0.1. Această actualizare asigură compatibilitatea cu noile schimbări din fluxul de dezvoltare. --- deltatech_purchase_add_extra_line/README.rst | 70 +++ deltatech_purchase_add_extra_line/__init__.py | 4 + .../__manifest__.py | 17 + .../models/__init__.py | 6 + .../models/product_template.py | 14 + .../models/purchase.py | 64 +++ .../pyproject.toml | 3 + .../readme/DESCRIPTION.md | 6 + .../static/description/icon.png | Bin 0 -> 11702 bytes .../static/description/index.html | 421 ++++++++++++++++++ .../static/description/logo-terrabit.png | Bin 0 -> 3047 bytes .../static/description/main_screenshot.png | Bin 0 -> 13007 bytes .../tests/__init__.py | 3 + .../views/product_view.xml | 19 + .../views/purchase_view.xml | 15 + 15 files changed, 642 insertions(+) create mode 100644 deltatech_purchase_add_extra_line/README.rst create mode 100644 deltatech_purchase_add_extra_line/__init__.py create mode 100644 deltatech_purchase_add_extra_line/__manifest__.py create mode 100644 deltatech_purchase_add_extra_line/models/__init__.py create mode 100644 deltatech_purchase_add_extra_line/models/product_template.py create mode 100644 deltatech_purchase_add_extra_line/models/purchase.py create mode 100644 deltatech_purchase_add_extra_line/pyproject.toml create mode 100644 deltatech_purchase_add_extra_line/readme/DESCRIPTION.md create mode 100644 deltatech_purchase_add_extra_line/static/description/icon.png create mode 100644 deltatech_purchase_add_extra_line/static/description/index.html create mode 100644 deltatech_purchase_add_extra_line/static/description/logo-terrabit.png create mode 100644 deltatech_purchase_add_extra_line/static/description/main_screenshot.png create mode 100644 deltatech_purchase_add_extra_line/tests/__init__.py create mode 100644 deltatech_purchase_add_extra_line/views/product_view.xml create mode 100644 deltatech_purchase_add_extra_line/views/purchase_view.xml diff --git a/deltatech_purchase_add_extra_line/README.rst b/deltatech_purchase_add_extra_line/README.rst new file mode 100644 index 0000000000..ba91171454 --- /dev/null +++ b/deltatech_purchase_add_extra_line/README.rst @@ -0,0 +1,70 @@ +======================= +Purchase Add Extra Line +======================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c062bc9c14aec836be0e0e0622364b98825b7133ec9c7093f624fe57f88ddb88 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-dhongu%2Fdeltatech-lightgray.png?logo=github + :target: https://github.com/dhongu/deltatech/tree/17.0/deltatech_purchase_add_extra_line + :alt: dhongu/deltatech + +|badge1| |badge2| |badge3| + +- Features: + + - Automatically adds an extra line for configured products in sale + purchase + - The product added in the extra line can be configured in the product + template + - The unit price of the extra line is computed from the percent + configured in the product. If the percent is zero, the price will be + the list price of the added product + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `Terrabit Issues `_. +In case of trouble, please check there if your issue has already been reported. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Terrabit +* Dorin Hongu + +Maintainers +----------- + +.. |maintainer-dhongu| image:: https://github.com/dhongu.png?size=40px + :target: https://github.com/dhongu + :alt: dhongu + +Current maintainer: + +|maintainer-dhongu| + +This module is part of the `dhongu/deltatech `_ project on GitHub. + +You are welcome to contribute. \ No newline at end of file diff --git a/deltatech_purchase_add_extra_line/__init__.py b/deltatech_purchase_add_extra_line/__init__.py new file mode 100644 index 0000000000..58fcc5c01e --- /dev/null +++ b/deltatech_purchase_add_extra_line/__init__.py @@ -0,0 +1,4 @@ +# © 2025 Deltatech +# See README.rst file on addons root folder for license details + +from . import models diff --git a/deltatech_purchase_add_extra_line/__manifest__.py b/deltatech_purchase_add_extra_line/__manifest__.py new file mode 100644 index 0000000000..3e5b01bb08 --- /dev/null +++ b/deltatech_purchase_add_extra_line/__manifest__.py @@ -0,0 +1,17 @@ +# © 2025 Deltatech +# See README.rst file on addons root folder for license details + +{ + "name": "Purchase Add Extra Line", + "summary": "Purchase Add Extra Line", + "version": "18.0.1.0.1", + "category": "Sales", + "author": "Terrabit, Dorin Hongu", + "website": "https://www.terrabit.ro", + "depends": ["purchase"], + "license": "LGPL-3", + "data": ["views/product_view.xml", "views/purchase_view.xml"], + "images": ["static/description/main_screenshot.png"], + "development_status": "Production/Stable", + "maintainers": ["dhongu"], +} diff --git a/deltatech_purchase_add_extra_line/models/__init__.py b/deltatech_purchase_add_extra_line/models/__init__.py new file mode 100644 index 0000000000..ef4fbed961 --- /dev/null +++ b/deltatech_purchase_add_extra_line/models/__init__.py @@ -0,0 +1,6 @@ +# © 2025 Deltatech +# See README.rst file on addons root folder for license details + + +from . import product_template +from . import purchase diff --git a/deltatech_purchase_add_extra_line/models/product_template.py b/deltatech_purchase_add_extra_line/models/product_template.py new file mode 100644 index 0000000000..dd272a661c --- /dev/null +++ b/deltatech_purchase_add_extra_line/models/product_template.py @@ -0,0 +1,14 @@ +# © 2025 Deltatech +# Dorin Hongu 1(B)CH$1X&2~8z8s@2=4B#!6CR?fZ!I~mc?1v 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 g@&8Uu6OF_i#F + + + + +Purchase Add Extra Line + + + +
+

Purchase Add Extra Line

+ + +

Production/Stable License: LGPL-3 dhongu/deltatech

+
    +
  • Features:
      +
    • Automatically adds an extra line for configured products in sale +purchase
    • +
    • The product added in the extra line can be configured in the product +template
    • +
    • The unit price of the extra line is computed from the percent +configured in the product. If the percent is zero, the price will be +the list price of the added product
    • +
    +
  • +
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on Terrabit Issues. +In case of trouble, please check there if your issue has already been reported.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Terrabit
  • +
  • Dorin Hongu
  • +
+
+
+

Maintainers

+

Current maintainer:

+

dhongu

+

This module is part of the dhongu/deltatech project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/deltatech_purchase_add_extra_line/static/description/logo-terrabit.png b/deltatech_purchase_add_extra_line/static/description/logo-terrabit.png new file mode 100644 index 0000000000000000000000000000000000000000..8b23ccdd371b63cfa87fdea531374b662e586588 GIT binary patch literal 3047 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 literal 0 HcmV?d00001 diff --git a/deltatech_purchase_add_extra_line/static/description/main_screenshot.png b/deltatech_purchase_add_extra_line/static/description/main_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4292c67867d7109f0b442e4aa89e044ea3784027 GIT binary patch literal 13007 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 amlP94zL)6v#Q + + + + product.template.form + product.template + + + + + + + + + + + + + diff --git a/deltatech_purchase_add_extra_line/views/purchase_view.xml b/deltatech_purchase_add_extra_line/views/purchase_view.xml new file mode 100644 index 0000000000..b96272b50a --- /dev/null +++ b/deltatech_purchase_add_extra_line/views/purchase_view.xml @@ -0,0 +1,15 @@ + + + + + purchase.order.form.extra + purchase.order + + + + + + + + + From 86201074ac9c296ab082beb7ac9eb90fa234bff5 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Thu, 16 Oct 2025 10:14:03 +0300 Subject: [PATCH 2/8] =?UTF-8?q?[FIX]=20Corecteaz=C4=83=20asocierea=20`orde?= =?UTF-8?q?r=5Fid`=20=C8=99i=20structura=20vizualiz=C4=83rii?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corectează referința `order_id` din modelul `sale`, utilizând `line.order_id.id` pentru a asigura consistența și funcționalitatea corectă. Modifică structura XML în vizualizarea achizițiilor astfel încât să utilizeze `` în loc de `` pentru afișarea câmpurilor din `order_line`. --- deltatech_purchase_add_extra_line/views/purchase_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltatech_purchase_add_extra_line/views/purchase_view.xml b/deltatech_purchase_add_extra_line/views/purchase_view.xml index b96272b50a..90135bce6f 100644 --- a/deltatech_purchase_add_extra_line/views/purchase_view.xml +++ b/deltatech_purchase_add_extra_line/views/purchase_view.xml @@ -6,7 +6,7 @@ purchase.order - + From 39c2298a930a96535f72547288c0435fe4055458 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Tue, 21 Oct 2025 14:26:49 +0300 Subject: [PATCH 3/8] =?UTF-8?q?[IMP]=20Actualizeaz=C4=83=20linkurile=20?= =?UTF-8?q?=C8=99i=20descrierile=20modulelor=20la=20versiunea=2018.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Actualizează referințele URL din documentație și descrieri pentru a reflecta trecerea la versiunea 18.0. Adaugă noi detalii despre funcționalitățile din schimbări de prețuri și alte module --- deltatech_purchase_add_extra_line/README.rst | 4 ++-- .../static/description/index.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deltatech_purchase_add_extra_line/README.rst b/deltatech_purchase_add_extra_line/README.rst index ba91171454..582dedfa87 100644 --- a/deltatech_purchase_add_extra_line/README.rst +++ b/deltatech_purchase_add_extra_line/README.rst @@ -17,7 +17,7 @@ Purchase Add Extra Line :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-dhongu%2Fdeltatech-lightgray.png?logo=github - :target: https://github.com/dhongu/deltatech/tree/17.0/deltatech_purchase_add_extra_line + :target: https://github.com/dhongu/deltatech/tree/18.0/deltatech_purchase_add_extra_line :alt: dhongu/deltatech |badge1| |badge2| |badge3| @@ -65,6 +65,6 @@ Current maintainer: |maintainer-dhongu| -This module is part of the `dhongu/deltatech `_ project on GitHub. +This module is part of the `dhongu/deltatech `_ project on GitHub. You are welcome to contribute. \ No newline at end of file diff --git a/deltatech_purchase_add_extra_line/static/description/index.html b/deltatech_purchase_add_extra_line/static/description/index.html index 0349bf23e5..709a6f5cd0 100644 --- a/deltatech_purchase_add_extra_line/static/description/index.html +++ b/deltatech_purchase_add_extra_line/static/description/index.html @@ -369,7 +369,7 @@

Purchase Add Extra Line

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:c062bc9c14aec836be0e0e0622364b98825b7133ec9c7093f624fe57f88ddb88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: LGPL-3 dhongu/deltatech

+

Production/Stable License: LGPL-3 dhongu/deltatech

  • Features:
    • Automatically adds an extra line for configured products in sale @@ -412,7 +412,7 @@

      Authors

      Maintainers

      Current maintainer:

      dhongu

      -

      This module is part of the dhongu/deltatech project on GitHub.

      +

      This module is part of the dhongu/deltatech project on GitHub.

      You are welcome to contribute.

      From 3d259d3d62389b7679fb1cd81e31b49d3594fe85 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Sun, 9 Nov 2025 04:11:44 +0200 Subject: [PATCH 4/8] =?UTF-8?q?[IMP]=20Adaug=C4=83=20metadate=20pentru=20p?= =?UTF-8?q?roiecte=20=C8=99i=20elimin=C4=83=20dependin=C8=9Be?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce informații de metadate `project` în fișierele `pyproject.toml` pentru fiecare modul din folderul `deltatech`. Șterge fișierul `requirements.txt`, consolidând gestionarea dependințelor în cadrul fiecărui modul. Aceste schimbări standardizează structura proiectului și îmbunătățesc gestionarea dependințelor. --- deltatech_purchase_add_extra_line/pyproject.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/deltatech_purchase_add_extra_line/pyproject.toml b/deltatech_purchase_add_extra_line/pyproject.toml index 4231d0cccb..15e2c3f593 100644 --- a/deltatech_purchase_add_extra_line/pyproject.toml +++ b/deltatech_purchase_add_extra_line/pyproject.toml @@ -1,3 +1,8 @@ [build-system] -requires = ["whool"] +requires = [ + "whool", +] build-backend = "whool.buildapi" + +[project] +name = "odoo-addon-deltatech-purchase-add-extra-line" From b592ac642f583d851502020cbfeff2c71d6bd1cd Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Wed, 25 Mar 2026 10:20:59 +0200 Subject: [PATCH 5/8] 18.0 description (#2422) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Șterge fișierele README redundante pentru modulele `deltatech` Se elimină fișierele `README.rst` din modulele `deltatech_widget_many2one_badge`, `deltatech_queue_job` și `deltatech_pos_stock`, deoarece conțin informații generate automat și redundante. Această modificare simplifică structura proiectului, evitând duplicarea informațiilor și asigurând că documentația principală este centralizată. * Actualizează documentația pentru modulul `deltatech_widget_many2one_badge` Adaugă un fișier complet și detaliat de documentație (`README.rst`) și îmbunătățește formatul fișierului `DESCRIPTION.md`. Actualizările includ ghiduri de instalare, exemple de utilizare și informații despre soluționarea problemelor, oferind o descriere clară și structurat organizată a * Actualizează link-urile și formatul documentației modulului Corectează URL-urile din documentație pentru a reflecta ramura corectă (`17.0`) și ajustează formatarea fișierului `DESCRIPTION.md`. Modificările îmbunătățesc claritatea documentației și asigură coerența cu structura proiectului. * Actualizează link-urile pentru ramura 18.0 Modifică URL-urile din documentația modulului `deltatech_widget_many2one_badge`, reflectând trecerea de la ramura `17.0` la `18.0`. Aceste ajustări asigură corectitudinea și relevanța link-urilor din documentație. * Actualizează referința `maintainer-tools` în pre-commit Modifică versiunea de referință a repository-ului `maintainer-tools` din fișierul `.pre-commit-config.yaml` pentru a utiliza cea mai recentă revizie. Această actualizare asigură accesul la îmbunătățiri și corecții recente ale uneltelor utilizate. * Corectează terminologia licențelor în documentație Înlocuiește termenul `licence` cu `license` în toate fișierele README și HTML pentru coerență cu standardele internaționale. Această modificare îmbunătățește claritatea documentației și asigură conformitatea termenilor utilizați. * Îmbunătățește formatul documentației modulului Actualizează structura și stilizarea fișierului `DESCRIPTION.md` pentru a folosi convenții standard de formatare: titluri delimitate, liste structurate, și exemple de cod mai clare. Modificările îmbunătățesc lizibilitatea și coerența documentației, oferind o experiență mai bună utilizatorilor. * Corectează termenii `licence` în `license` în documentație Înlocuiește utilizarea termenului `licence` cu `license` în fișierele README și HTML pentru a respecta convențiile lingvistice internaționale. Modificarea asigură coerența și claritatea termenilor utilizați în documentele proiectului. * Actualizează documentația pentru `deltatech_queue_job` Îmbunătățește structura și formatarea fișierelor `USAGE.md` și `DESCRIPTION.md` prin utilizarea convențiilor standard de formatare pentru titluri, liste, și exemple de cod. Modificările cresc lizibilitatea, claritatea, și coerența documentației pentru utilizatori. * Actualizează documentația pentru `deltatech_queue_job` Îmbunătățește descrierea funcționalităților modulului prin adăugarea detaliilor despre caracteristici și beneficii. Modificările includ ajustarea stilului, structurii și clarității textului pentru o mai bună înțelegere a utilizatorilor. * Actualizează descrierea modulelor pentru claritate Îmbunătățește dokumentația în fișierele `DESCRIPTION.md` ale mai multor module, integrând o structură clară și detalii suplimentare despre funcționalitățile cheie. Această modificare sporește lizibilitatea și oferă utilizatorilor o înțelegere mai bună a beneficiilor fiecărui modul. * Actualizează documentația modulelor pentru claritate Îmbunătățește descrierea fișierelor README și HTML ale mai multor module, oferind detalii suplimentare despre funcționalitățile cheie. Modificările includ structurarea clară a informațiilor și corespondența cu convențiile standard, sporind lizibilitatea și utilitatea documentației. * Actualizează descrierea pentru modulele `deltatech_invoice_weight` și `deltatech_watermark` Îmbunătățește structura și claritatea fișierelor `DESCRIPTION.md` ale modulelor prin adăugarea unor detalii extinse despre funcționalități, utilizare și beneficii. Aceste modificări cresc lizibilitatea documentației și oferă informații mai clare pentru utilizatori. * Îmbunătățește documentația modulelor `deltatech_website_city`, `deltatech_move_negative_stock` și `deltatech_product_extension` Actualizează descrierile din fișierele README și HTML, adăugând detalii extinse despre caracteristici și utilizare. Modificările includ o structură mai clară, liste cu puncte cheie și un stil uniform, sporind lizibilitatea și utilitatea documentației pentru utilizatori. * Actualizează descrierea pentru modulele `deltatech_logistic_docs`, `deltatech_cash` și `deltatech_watermark` Îmbunătățește conținutul fișierelor `DESCRIPTION.md` și `README.rst` pentru a include detalii suplimentare despre funcționalități, utilizare și beneficii. Modificările adaugă structură clară, liste detaliate și formatare uniformă, sporind lizibilitatea și oferind informații mai utile utilizatorilor. * Actualizează descrierea pentru mai multe module Îmbunătățește structura și claritatea fișierelor de documentație, incluzând detalii extinse despre funcționalitățile cheie și exemple de utilizare. Modificările adaugă o structură uniformă, liste clar definite și informații utile pentru utilizatori. * Actualizează descrierea modulelor `deltatech` Îmbunătățește documentația fișierelor `DESCRIPTION.md` pentru modulele afectate, adăugând detalii clare despre funcționalități, beneficii și exemple de utilizare. Modificările includ o structură uniformă, liste clar definite și un stil consistent, sporind lizibilitatea și utilitatea informațiilor pentru utilizatori. * Actualizează descrierea modulelor `deltatech_sale_cost_product` și `deltatech_account` Îmbunătățește documentația fișierelor `DESCRIPTION.md` pentru modulele respective, adăugând detalii clare despre caracteristici, beneficii și exemple de utilizare. Modificările includ structuri uniforme, liste bine definite și un stil consistent, crescând lizibilitatea și utilitatea informațiilor pentru utilizatori. * Actualizează descrierea pentru `deltatech_restricted_access` Marchează modulul ca **Obsolet** și extinde documentația pentru a include detalii despre funcționalitățile cheie, utilizare și restricții de acces. Modificările îmbunătățesc claritatea, structura și utilitatea informațiilor pentru utilizatori. * Marchează modulul `deltatech_gln` ca **Obsolet** și actualizează documentația Extinde descrierea din `DESCRIPTION.md` pentru a include detalii suplimentare despre funcționalitățile cheie oferite, utilizare și recomandări pentru migrarea la modulul `account_add_gln`. Modificările îmbunătățesc claritatea și structura informațiilor, oferind un ghid util pentru utilizatori. * Actualizează descrierea pentru modulele `deltatech` Îmbunătățește documentația `README.rst` și `DESCRIPTION.md` pentru mai multe module, incluzând detalii extinse despre funcționalități, utilizare și beneficii. Modificările introduc o structură clară, un stil consistent și liste bine definite, sporind lizibilitatea și utilitatea informațiilor pentru utilizatori. * Actualizează documentația pentru modulele marcate ca **Obsolet** Îmbunătățește fișierele `README.rst` și `DESCRIPTION.md` pentru modulele `deltatech_restricted_access`, `deltatech_gln` și `deltatech_saleorder_type`. Modificările includ semnalarea clară a stării de **Obsolet** și ajustări de formatare pentru a spori claritatea și lizibilitatea documentației. * Actualizează documentația pentru modulele marcate ca **Obsolet** Îmbunătățește fișierele `README.rst` și resursele HTML pentru modulele `deltatech_restricted_access` și `deltatech_gln`. Modificările includ marcarea clară a stării de **Obsolet**, detalii extinse despre funcționalități și utilizare, precum și ajustări de formatare pentru a spori lizibilitatea și claritatea documentației. * Marchează clar starea de **Obsolet** pentru `deltatech_gln` Adaugă un rând suplimentar în `DESCRIPTION.md` pentru a indica explicit starea de **Obsolet** a modulului. Această modificare îmbunătățește claritatea informațiilor oferite utilizatorilor. * Actualizează descrierea pentru `deltatech_saleorder_pickup_list` Extinde conținutul fișierului `DESCRIPTION.md`, adăugând informații detaliate despre funcționalitățile noi, beneficiile aduse și pașii de utilizare pentru raportul **Pickup List**. Modificările îmbunătățesc claritatea, structura și utilitatea documentației pentru utilizatori. * Actualizează documentația pentru mai multe module Extinde fișierele `README.rst` și `DESCRIPTION.md` pentru a include informații detaliate despre funcționalități, beneficii și utilizare. Modificările adaugă marcaje de **Obsolet**, îmbunătățesc claritatea informațiilor și asigură un stil unitar în întreaga documentație. * Actualizează descrierea pentru `deltatech_product_reordering_limit` Extinde documentația din `DESCRIPTION.md` pentru a include informații detaliate despre funcționalitățile modulului, beneficiile aduse și pașii de utilizare. Modificările îmbunătățesc claritatea, structura și utilitatea informațiilor pentru utilizatori. * Actualizează descrierea mai multor module marcate ca **Obsolet** Adaugă informații detaliate în fișierele `README.rst` și resursele HTML pentru modulele relevante, clarificând starea de **Obsolet**, funcționalitățile de bază și recomandările de migrare. Modificările asigură un stil unitar, crește lizibilitatea și oferă utilizatorilor o documentație mai utilă și coerentă. * Actualizează descrierea pentru mai multe module `deltatech` Extinde fișierele `DESCRIPTION.md` pentru modulele relevante, adăugând detalii despre funcționalități, beneficii și pașii de utilizare. Modificările îmbunătățesc claritatea documentației, oferind utilizatorilor informații mai detaliate și bine structurate. * Actualizează documentația pentru mai multe module `deltatech` Extinde fișierele `README.rst`, `DESCRIPTION.md` și resursele HTML pentru modulele specificate. Actualizările includ detalii extinse privind funcționalitățile, beneficiile și pașii de utilizare, asigurând un stil consistent și lizibilitate crescută. * Actualizează descrierea pentru `deltatech_mrp_set_delivery` Extinde documentația din `DESCRIPTION.md` pentru a detalia funcționalitățile modulului, incluzând integrarea cu **Phantom BoM**, validările de securitate și utilizarea în producție. Modificările îmbunătățesc claritatea și oferă utilizatorilor o înțelegere mai bună a beneficiilor modulului. * Adaugă descriere detaliată pentru `deltatech_purchase_mail` Extinde fișierele `README.rst` și `index.html` pentru a documenta funcționalitatea nouă de trimitere a emailurilor în loturi pentru multiple comenzi de achiziție, incluzând atașamente XLSX și PDF. Actualizările oferă utilizatorilor detalii clare despre beneficiile funcției, pașii de utilizare și personalizarea șabloanelor de email. * Actualizează descrierea pentru mai multe module `deltatech` Extinde fișierele `DESCRIPTION.md` pentru modulele relevante, adăugând informații detaliate despre funcționalități, beneficii și * Extinde descrierea pentru mai multe module `deltatech` Actualizează fișierele `README.rst` și resursele HTML pentru modulele relevante, incluzând detalii despre funcționalități, beneficii și pașii de utilizare. Modificările asigură un stil consistent al documentației și cresc claritatea informațiilor pentru utilizatori. * Actualizează descrierea pentru mai multe module `deltatech` Extinde fișierele `DESCRIPTION.md` pentru a include informații detaliate despre funcționalitățile modulului, beneficiile oferite și pașii de utilizare. Modificările îmbunătățesc claritatea, lizibilitatea și structura documentației, oferind utilizatorilor informații mai bine organizate. * Actualizează documentația pentru mai multe module `deltatech` Extinde fișierele `DESCRIPTION.md`, `README.rst` și resursele HTML pentru a include informații detaliate despre funcționalități, beneficii și pașii de utilizare. Modificările îmbunătățesc claritatea, lizibilitatea și oferă utilizatorilor o documentație bine structurată și ușor de urmărit. * Actualizează descrierea pentru mai multe module `deltatech` Extinde fișierele `README.rst`, `DESCRIPTION.md` și resursele HTML pentru modulele relevante, adăugând detalii clare despre funcționalități, beneficii și pașii de utilizare. Modificările îmbunătățesc claritatea documentației, asigură un stil unitar și oferă utilizatorilor informații bine structurate și ușor de urmărit. --- deltatech_purchase_add_extra_line/README.rst | 53 +++++++++++--- .../readme/DESCRIPTION.md | 31 +++++++-- .../static/description/index.html | 69 +++++++++++++------ 3 files changed, 117 insertions(+), 36 deletions(-) diff --git a/deltatech_purchase_add_extra_line/README.rst b/deltatech_purchase_add_extra_line/README.rst index 582dedfa87..5eeb9d231e 100644 --- a/deltatech_purchase_add_extra_line/README.rst +++ b/deltatech_purchase_add_extra_line/README.rst @@ -13,7 +13,7 @@ Purchase Add Extra Line .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status :alt: Production/Stable -.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-dhongu%2Fdeltatech-lightgray.png?logo=github @@ -22,15 +22,50 @@ Purchase Add Extra Line |badge1| |badge2| |badge3| -- Features: +Purchase Add Extra Line Extension +================================= - - Automatically adds an extra line for configured products in sale - purchase - - The product added in the extra line can be configured in the product - template - - The unit price of the extra line is computed from the percent - configured in the product. If the percent is zero, the price will be - the list price of the added product +This module introduces an automated process for adding extra lines +(e.g., service fees, handling charges, or supplementary products) to +Purchase Orders in Odoo. It's designed to help procurement teams +consistently apply additional costs or items based on the primary +products being purchased. + +Key Features +============ + +1. **Configurable Extra Products**: + + - Allows users to define an **Extra Product** directly on the product + template. + - Enables automated adding of this extra line whenever the primary + product is added to a Purchase Order. + +2. **Flexible Pricing Logic**: + + - The unit price for the extra line can be computed as a + **percentage** of the primary product's price. + - If the percentage is set to zero, the system uses the standard + **List Price** of the extra product. + +3. **Procurement Efficiency**: + + - Reduces manual entry errors and ensures that all mandatory + supplementary costs or items are included in every relevant + Purchase Order. + +Usage +===== + +1. Go to **Purchase > Products > Products**. +2. Open a product and locate the **Extra Line Configuration** (typically + in the Purchase or a dedicated tab). +3. Select the **Extra Product** you want to associate and set the + **Percentage** (if applicable). +4. Create a new **Purchase Order** and add the primary product to the + order lines. +5. The system will automatically add the extra product as a separate + line with the pre-calculated price. **Table of contents** diff --git a/deltatech_purchase_add_extra_line/readme/DESCRIPTION.md b/deltatech_purchase_add_extra_line/readme/DESCRIPTION.md index 3471174205..a21d036959 100644 --- a/deltatech_purchase_add_extra_line/readme/DESCRIPTION.md +++ b/deltatech_purchase_add_extra_line/readme/DESCRIPTION.md @@ -1,6 +1,27 @@ -- Features: +Purchase Add Extra Line Extension +================================= - - Automatically adds an extra line for configured products in sale purchase - - The product added in the extra line can be configured in the product template - - The unit price of the extra line is computed from the percent configured in the product. If the percent is zero, the - price will be the list price of the added product +This module introduces an automated process for adding extra lines (e.g., service fees, handling charges, or supplementary products) to Purchase Orders in Odoo. It's designed to help procurement teams consistently apply additional costs or items based on the primary products being purchased. + +Key Features +============ + +1. **Configurable Extra Products**: + * Allows users to define an **Extra Product** directly on the product template. + * Enables automated adding of this extra line whenever the primary product is added to a Purchase Order. + +2. **Flexible Pricing Logic**: + * The unit price for the extra line can be computed as a **percentage** of the primary product's price. + * If the percentage is set to zero, the system uses the standard **List Price** of the extra product. + +3. **Procurement Efficiency**: + * Reduces manual entry errors and ensures that all mandatory supplementary costs or items are included in every relevant Purchase Order. + +Usage +===== + +1. Go to **Purchase > Products > Products**. +2. Open a product and locate the **Extra Line Configuration** (typically in the Purchase or a dedicated tab). +3. Select the **Extra Product** you want to associate and set the **Percentage** (if applicable). +4. Create a new **Purchase Order** and add the primary product to the order lines. +5. The system will automatically add the extra product as a separate line with the pre-calculated price. diff --git a/deltatech_purchase_add_extra_line/static/description/index.html b/deltatech_purchase_add_extra_line/static/description/index.html index 709a6f5cd0..a506e5648e 100644 --- a/deltatech_purchase_add_extra_line/static/description/index.html +++ b/deltatech_purchase_add_extra_line/static/description/index.html @@ -369,47 +369,72 @@

      Purchase Add Extra Line

      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:c062bc9c14aec836be0e0e0622364b98825b7133ec9c7093f624fe57f88ddb88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

      Production/Stable License: LGPL-3 dhongu/deltatech

      -
        -
      • Features:
          -
        • Automatically adds an extra line for configured products in sale -purchase
        • -
        • The product added in the extra line can be configured in the product -template
        • -
        • The unit price of the extra line is computed from the percent -configured in the product. If the percent is zero, the price will be -the list price of the added product
        • +

          Production/Stable License: LGPL-3 dhongu/deltatech

          +
          +

          Purchase Add Extra Line Extension

          +

          This module introduces an automated process for adding extra lines +(e.g., service fees, handling charges, or supplementary products) to +Purchase Orders in Odoo. It’s designed to help procurement teams +consistently apply additional costs or items based on the primary +products being purchased.

          +
          +
          +

          Key Features

          +
            +
          1. Configurable Extra Products:
              +
            • Allows users to define an Extra Product directly on the product +template.
            • +
            • Enables automated adding of this extra line whenever the primary +product is added to a Purchase Order.
          2. -
        -

        Table of contents

        -
        -
          -
        • Bug Tracker
        • -
        • Credits
            -
          • Authors
          • -
          • Maintainers
          • +
          • Flexible Pricing Logic:
              +
            • The unit price for the extra line can be computed as a +percentage of the primary product’s price.
            • +
            • If the percentage is set to zero, the system uses the standard +List Price of the extra product.
          • +
          • Procurement Efficiency:
              +
            • Reduces manual entry errors and ensures that all mandatory +supplementary costs or items are included in every relevant +Purchase Order.
            +
          • + +
        +
        +

        Usage

        +
          +
        1. Go to Purchase > Products > Products.
        2. +
        3. Open a product and locate the Extra Line Configuration (typically +in the Purchase or a dedicated tab).
        4. +
        5. Select the Extra Product you want to associate and set the +Percentage (if applicable).
        6. +
        7. Create a new Purchase Order and add the primary product to the +order lines.
        8. +
        9. The system will automatically add the extra product as a separate +line with the pre-calculated price.
        10. +
        +

        Table of contents

        -

        Bug Tracker

        +

        Bug Tracker

        Bugs are tracked on Terrabit Issues. In case of trouble, please check there if your issue has already been reported.

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

        -

        Credits

        +

        Credits

        -

        Authors

        +

        Authors

        • Terrabit
        • Dorin Hongu
        -

        Maintainers

        +

        Maintainers

        Current maintainer:

        dhongu

        This module is part of the dhongu/deltatech project on GitHub.

        From b0d00047709a5d6d0b7f38ac2aa9763a0fd05e16 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Wed, 22 Apr 2026 14:59:54 +0300 Subject: [PATCH 6/8] =?UTF-8?q?Adaug=C4=83=20gestionarea=20produselor=20su?= =?UTF-8?q?plimentare=20=C3=AEn=20comenzi=20de=20achizi=C8=9Bie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extinde logica pentru produse suplimentare, incluzând verificări și sincronizări ale liniilor principale și suplimentare. Adaugă teste unitare pentru validarea funcționalității și incrementează versiunea modulului la **18.0.1.0.2** pentru a reflecta modificările. --- .../__manifest__.py | 2 +- .../models/purchase.py | 73 +++++++++------ .../tests/__init__.py | 2 + .../tests/test_purchase.py | 92 +++++++++++++++++++ 4 files changed, 141 insertions(+), 28 deletions(-) create mode 100644 deltatech_purchase_add_extra_line/tests/test_purchase.py diff --git a/deltatech_purchase_add_extra_line/__manifest__.py b/deltatech_purchase_add_extra_line/__manifest__.py index 3e5b01bb08..5c83e27027 100644 --- a/deltatech_purchase_add_extra_line/__manifest__.py +++ b/deltatech_purchase_add_extra_line/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Add Extra Line", "summary": "Purchase Add Extra Line", - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "category": "Sales", "author": "Terrabit, Dorin Hongu", "website": "https://www.terrabit.ro", diff --git a/deltatech_purchase_add_extra_line/models/purchase.py b/deltatech_purchase_add_extra_line/models/purchase.py index 5d8eafceb6..0e84ee0103 100644 --- a/deltatech_purchase_add_extra_line/models/purchase.py +++ b/deltatech_purchase_add_extra_line/models/purchase.py @@ -10,6 +10,14 @@ class PurchaseOrder(models.Model): _inherit = "purchase.order" + def action_rfq_send(self): + self.order_line.with_context(backend=True).check_extra_product() + return super().action_rfq_send() + + def print_quotation(self): + self.order_line.with_context(backend=True).check_extra_product() + return super().print_quotation() + @api.onchange("order_line") def onchange_order_line(self): """ @@ -24,10 +32,17 @@ class PurchaseOrderLine(models.Model): line_uuid = fields.Char() + @api.model_create_multi + def create(self, vals_list): + res = super().create(vals_list) + for line in res: + line.check_extra_product() + return res + def unlink(self): for line in self: if line.product_id.extra_product_id: - extra_line_id = self.order_id.order_line.filtered( + extra_line_id = line.order_id.order_line.filtered( lambda l: line.line_uuid is not False and l.line_uuid == line.line_uuid and l.id != line.id ) if extra_line_id: @@ -36,29 +51,33 @@ def unlink(self): def check_extra_product(self): for line in self: - if line.product_id.extra_product_id: - extra_product = line.product_id.extra_product_id - extra_line_id = self.order_id.order_line.filtered( - lambda l: line.line_uuid is not False and l.line_uuid == line.line_uuid and l.id != line.id - ) - if not extra_line_id: - new_uuid = str(uuid.uuid4()) - values = { - "product_qty": line.product_qty * (line.product_id.extra_qty or 1.0), - "product_id": extra_product.id, - "product_uom": extra_product.uom_id.id, - "state": "draft", - "order_id": line.order_id.id, - "sequence": line.sequence + 1, - "line_uuid": new_uuid, - } - backend = self.env.context.get("backend", False) - if backend: - extra_line_id = line.order_id.order_line.new(values) - else: - extra_line_id = line.order_id.order_line.create(values) - line.line_uuid = new_uuid - - extra_line_id.product_qty = line.product_qty * (line.product_id.extra_qty or 1.0) - if line.product_id.extra_percent: - extra_line_id.price_unit = line.price_unit * (line.product_id.extra_percent or 0.0) / 100.0 + if line.order_id.state not in ["draft", "sent"]: + continue + if not line.product_id.extra_product_id: + continue + extra_product = line.product_id.extra_product_id + extra_line_id = line.order_id.order_line.filtered( + lambda l: line.line_uuid is not False and l.line_uuid == line.line_uuid and l.id != line.id + ) + if not extra_line_id: + new_uuid = str(uuid.uuid4()) + values = { + "product_qty": line.product_qty * (line.product_id.extra_qty or 1.0), + "product_id": extra_product.id, + "product_uom": extra_product.uom_id.id, + "state": "draft", + "order_id": line.order_id.id, + "sequence": line.sequence + 1, + "line_uuid": new_uuid, + } + backend = self.env.context.get("backend", False) + if backend: + extra_line_id = line.order_id.order_line.new(values) + else: + extra_line_id = line.order_id.order_line.create(values) + line.line_uuid = new_uuid + product_qty = line.product_qty * (line.product_id.extra_qty or 1.0) + if product_qty != extra_line_id.product_qty: + extra_line_id.product_qty = product_qty + if line.product_id.extra_percent: + extra_line_id.price_unit = line.price_unit * (line.product_id.extra_percent or 0.0) / 100.0 diff --git a/deltatech_purchase_add_extra_line/tests/__init__.py b/deltatech_purchase_add_extra_line/tests/__init__.py index d93f261a5b..cdc51e8650 100644 --- a/deltatech_purchase_add_extra_line/tests/__init__.py +++ b/deltatech_purchase_add_extra_line/tests/__init__.py @@ -1,3 +1,5 @@ # © 2025 Deltatech # Dorin Hongu +# See README.rst file on addons root folder for license details + +from odoo.tests import Form +from odoo.tests.common import TransactionCase + + +class TestPurchaseAddExtraLine(TransactionCase): + def setUp(self): + super().setUp() + # Create a vendor + self.vendor = self.env["res.partner"].create({"name": "Vendor A", "supplier_rank": 1}) + + seller_ids = [(0, 0, {"partner_id": self.vendor.id})] + + # Extra product (will be auto-added) + self.extra_product = self.env["product.product"].create( + { + "name": "Extra Product", + "type": "consu", + "standard_price": 20.0, + "list_price": 30.0, + "seller_ids": seller_ids, + } + ) + # Main product configured to add the extra product + self.main_product = self.env["product.product"].create( + { + "name": "Main Product", + "type": "consu", + "standard_price": 100.0, + "list_price": 150.0, + "seller_ids": seller_ids, + "extra_product_id": self.extra_product.id, + "extra_percent": 10.0, # price of extra line = 10% of main line price + "extra_qty": 2.0, # qty of extra line = 2x main qty + } + ) + + def test_purchase_extra_line_creation_update_and_unlink(self): + # Create RFQ + po_form = Form(self.env["purchase.order"]) + po_form.partner_id = self.vendor + with po_form.order_line.new() as line_form: + line_form.product_id = self.main_product + line_form.product_qty = 5 + po = po_form.save() + + # After saving, an extra line should be present + self.assertEqual(len(po.order_line), 2, "There should be two lines: main and extra") + + # Identify lines + main_line = po.order_line.filtered(lambda l: l.product_id == self.main_product) + self.assertEqual(len(main_line), 1, "Exactly one main line expected") + extra_line = po.order_line.filtered(lambda l: l.product_id == self.extra_product) + self.assertEqual(len(extra_line), 1, "Exactly one extra line expected") + + # Both lines should share the same line_uuid + self.assertTrue(main_line.line_uuid, "Main line must have a line_uuid set") + self.assertEqual( + main_line.line_uuid, + extra_line.line_uuid, + "Main and extra lines should share the same line_uuid", + ) + + # Quantities and price unit checks + self.assertEqual( + extra_line.product_qty, + 5 * 2.0, + "Extra line quantity should be main_qty * extra_qty", + ) + # price_unit of extra line = main price * extra_percent / 100 + self.assertAlmostEqual( + extra_line.price_unit, + main_line.price_unit * 0.10, + msg="Extra line price should be 10% of main line price", + ) + + # Update main quantity and re-check propagation + main_line.product_qty = 7 + # In a real form, onchange would handle this; call method explicitly for the test + main_line.check_extra_product() + self.assertEqual( + extra_line.product_qty, + 7 * 2.0, + "After update, extra line quantity should follow main qty", + ) + + # Deleting main line should remove the paired extra line too + main_line.unlink() + self.assertEqual(len(po.order_line), 0, "Both main and extra lines should be removed after unlink") From 95c2a8a634f00a11b203f3a777ff6596ea4b4cdc Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Wed, 20 May 2026 02:13:55 +0300 Subject: [PATCH 7/8] [UPD] __manifest__.py: update version to 19.0.1.0.2 --- deltatech_purchase_add_extra_line/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deltatech_purchase_add_extra_line/__manifest__.py b/deltatech_purchase_add_extra_line/__manifest__.py index 5c83e27027..1b729b11ae 100644 --- a/deltatech_purchase_add_extra_line/__manifest__.py +++ b/deltatech_purchase_add_extra_line/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Purchase Add Extra Line", "summary": "Purchase Add Extra Line", - "version": "18.0.1.0.2", + "version": "19.0.1.0.2", "category": "Sales", "author": "Terrabit, Dorin Hongu", "website": "https://www.terrabit.ro", From 7c46ca694604f617f79f9e849498b47d1d996d83 Mon Sep 17 00:00:00 2001 From: Dorin Hongu Date: Wed, 20 May 2026 02:19:45 +0300 Subject: [PATCH 8/8] [FIX] purchase: correct product_uom field name in extra line addition --- deltatech_purchase_add_extra_line/models/purchase.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deltatech_purchase_add_extra_line/models/purchase.py b/deltatech_purchase_add_extra_line/models/purchase.py index 0e84ee0103..1f37dacabf 100644 --- a/deltatech_purchase_add_extra_line/models/purchase.py +++ b/deltatech_purchase_add_extra_line/models/purchase.py @@ -64,8 +64,7 @@ def check_extra_product(self): values = { "product_qty": line.product_qty * (line.product_id.extra_qty or 1.0), "product_id": extra_product.id, - "product_uom": extra_product.uom_id.id, - "state": "draft", + "product_uom_id": extra_product.uom_id.id, "order_id": line.order_id.id, "sequence": line.sequence + 1, "line_uuid": new_uuid,