diff --git a/README.md b/README.md index 0872285bc..1c4471384 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ addon | version | maintainers | summary [deltatech_cron_monitor_webhook](deltatech_cron_monitor_webhook/) | 19.0.1.0.0 | dhongu | Run cron jobs from webhook [deltatech_data_sheet](deltatech_data_sheet/) | 19.0.1.0.0 | dhongu | Data Sheet [deltatech_data_sheet_website](deltatech_data_sheet_website/) | 19.0.1.0.0 | dhongu | Data Sheet -[deltatech_dc](deltatech_dc/) | 19.0.1.0.11 | dhongu | Print Declaration of Conformity -[deltatech_delivery_status](deltatech_delivery_status/) | 19.0.2.2.0 | dhongu | Carrier status on picking +[deltatech_dc](deltatech_dc/) | 19.0.1.0.12 | dhongu | Print Declaration of Conformity +[deltatech_delivery_status](deltatech_delivery_status/) | 19.0.2.3.0 | dhongu | Carrier status on picking [deltatech_discount_policy](deltatech_discount_policy/) | 19.0.1.0.0 | VoicuStefan2001 | Bring back Odoo 17 discount policy [deltatech_download](deltatech_download/) | 19.0.0.1.2 | dhongu | Generare fisier [deltatech_dropshipping](deltatech_dropshipping/) | 19.0.1.1.0 | dhongu | Delivery address in picking @@ -52,6 +52,7 @@ addon | version | maintainers | summary [deltatech_followup](deltatech_followup/) | 19.0.0.1.1 | danila12 | Simple invoice followup, with automatic e-mails [deltatech_generic_partner_restriction](deltatech_generic_partner_restriction/) | 19.0.2.0.0 | cojocariudaniel1 | Restrict payment journals for the generic partner [deltatech_gln](deltatech_gln/) | 19.0.1.0.0 | dhongu | Partner Global Location Number +[deltatech_image_optimize](deltatech_image_optimize/) | 19.0.1.8.1 | dhongu | Recompress oversized image attachments to reclaim filestore space [deltatech_invoice_number](deltatech_invoice_number/) | 19.0.1.0.0 | dhongu | Renumbering invoice [deltatech_invoice_picking](deltatech_invoice_picking/) | 19.0.1.0.10 | dhongu | Facturare livrari [deltatech_invoice_picking_automatically](deltatech_invoice_picking_automatically/) | 19.0.0.0.4 | dhongu | Generate invoice automatically from picking after validation @@ -60,7 +61,7 @@ addon | version | maintainers | summary [deltatech_invoice_report](deltatech_invoice_report/) | 19.0.1.0.8 | dhongu | Invoice Report [deltatech_invoice_to_draft](deltatech_invoice_to_draft/) | 19.0.2.0.1 | dhongu | Restricted access to reset account move to draft [deltatech_invoice_weight](deltatech_invoice_weight/) | 19.0.1.0.2 | dhongu | Invoice Weight -[deltatech_kit_price](deltatech_kit_price/) | 19.0.0.0.1 | danila12 | Compute product cost price in sale order line based on kit +[deltatech_kit_price](deltatech_kit_price/) | 19.0.0.0.2 | danila12 | Compute product cost price in sale order line based on kit [deltatech_ledger](deltatech_ledger/) | 19.0.0.0.1 | VoicuStefan2001 | Deltatech Ledger [deltatech_line_counter](deltatech_line_counter/) | 19.0.1.0.0 | VoicuStefan2001 | Count lines of code in selected modules [deltatech_list_view](deltatech_list_view/) | 19.0.1.0.1 | | List View Select Text @@ -80,6 +81,7 @@ addon | version | maintainers | summary [deltatech_no_quick_create](deltatech_no_quick_create/) | 19.0.2.0.1 | dhongu | Disable quick_create [deltatech_notification_sound](deltatech_notification_sound/) | 19.0.2.0.0 | dhongu | Notification Sound [deltatech_partner_generic](deltatech_partner_generic/) | 19.0.1.0.0 | dhongu | Gneric partner +[deltatech_partner_merge](deltatech_partner_merge/) | 19.0.1.0.0 | | Merge partners duplicated on the same VAT number, in bulk, in minutes instead of hours [deltatech_payment_forecast](deltatech_payment_forecast/) | 19.0.0.0.1 | dhongu | Generates a report to estimate payments at a certain date [deltatech_payment_term](deltatech_payment_term/) | 19.0.2.0.1 | dhongu | Term Rate Wizard [deltatech_picking_restrict](deltatech_picking_restrict/) | 19.0.1.0.0 | danila12 | Restrict picking validation to a certain security group @@ -88,7 +90,7 @@ addon | version | maintainers | summary [deltatech_picking_transit](deltatech_picking_transit/) | 19.0.0.0.9 | VoicuStefan2001 | Automate internal transfer from transit location [deltatech_pos_fix](deltatech_pos_fix/) | 19.0.1.0.0 | dhongu | Fix POS total calculation when using tax-included fiscal position mapping [deltatech_pos_product_filter](deltatech_pos_product_filter/) | 19.0.1.0.0 | dhongu | Searching pos order using product -[deltatech_pos_stock](deltatech_pos_stock/) | 19.0.1.0.0 | dhongu | Display stock in POS +[deltatech_pos_stock](deltatech_pos_stock/) | 19.0.1.1.0 | dhongu | Display stock in POS [deltatech_price_categ](deltatech_price_categ/) | 19.0.1.0.1 | dhongu | Price List: Bronze Silver and Gold in product [deltatech_pricelist](deltatech_pricelist/) | 19.0.1.0.0 | dhongu | Price list currency [deltatech_pricelist_line_viewer](deltatech_pricelist_line_viewer/) | 19.0.0.0.2 | VoicuStefan2001 | Creates a list view for the lines of a price list for search and management @@ -101,22 +103,23 @@ addon | version | maintainers | summary [deltatech_product_labels](deltatech_product_labels/) | 19.0.1.1.4 | | Print Labels on Products [deltatech_product_list](deltatech_product_list/) | 19.0.1.0.1 | dhongu | Define products lists [deltatech_product_mpn](deltatech_product_mpn/) | 19.0.0.0.1 | VoicuStefan2001 | Add MPN to product +[deltatech_product_reordering_limit](deltatech_product_reordering_limit/) | 19.0.1.0.2 | VoicuStefan2001 | Custom reordering limits for products [deltatech_product_trade_markup](deltatech_product_trade_markup/) | 19.0.1.0.1 | dhongu | Product trade markup [deltatech_product_unique_code](deltatech_product_unique_code/) | 19.0.1.0.0 | VoicuStefan2001 | Restrict duplicate default_code and barcode including archived products [deltatech_product_visibility](deltatech_product_visibility/) | 19.0.1.0.0 | VoicuStefan2001 | Scor colorat de vizibilitate a produsului pe website (semafor + defalcare pe criterii) [deltatech_project_price_list](deltatech_project_price_list/) | 19.0.1.0.0 | | Project-level pricelist used when creating Sales Orders from a project [deltatech_promissory_note](deltatech_promissory_note/) | 19.0.1.0.3 | danila12 | Manage Promissory Note -[deltatech_purchase_add_extra_line](deltatech_purchase_add_extra_line/) | 19.0.1.2.0 | dhongu | Purchase Add Extra Line +[deltatech_purchase_add_extra_line](deltatech_purchase_add_extra_line/) | 19.0.1.3.0 | dhongu | Purchase Add Extra Line [deltatech_purchase_create_bill_button](deltatech_purchase_create_bill_button/) | 19.0.1.0.0 | dhongu | Restores the one-click Create Bill button and vendor reference copy on the purchase order form [deltatech_purchase_mail](deltatech_purchase_mail/) | 19.0.1.1.0 | | Select multiple purchase orders and send an email with XLSX summary and attached PDFs [deltatech_purchase_phase](deltatech_purchase_phase/) | 19.0.1.2.6 | dhongu | Purchase Order Stage [deltatech_purchase_picking_status](deltatech_purchase_picking_status/) | 19.0.1.0.1 | danila12 | Get purchase status from pickings [deltatech_purchase_price](deltatech_purchase_price/) | 19.0.1.2.8 | dhongu | Update vendor price after reception [deltatech_purchase_stock](deltatech_purchase_stock/) | 19.0.1.0.1 | dhongu | Purchase Stock -[deltatech_purchase_ubl](deltatech_purchase_ubl/) | 19.0.1.2.2 | dhongu | Import UBL XML vendor invoices to update prices, validate receipts, and create vendor bills +[deltatech_purchase_ubl](deltatech_purchase_ubl/) | 19.0.1.2.4 | dhongu | Import UBL XML vendor invoices to update prices, validate receipts, and create vendor bills [deltatech_purchase_xls](deltatech_purchase_xls/) | 19.0.1.0.0 | dhongu | Import/export purchase line from/to Excel [deltatech_putaway_strategy](deltatech_putaway_strategy/) | 19.0.1.0.7 | dhongu | Location capacities and enhanced putaway strategy for Inventory -[deltatech_queue_job](deltatech_queue_job/) | 19.0.1.3.0 | dhongu | Deltatech Queue Job +[deltatech_queue_job](deltatech_queue_job/) | 19.0.1.4.0 | dhongu | Deltatech Queue Job [deltatech_ral](deltatech_ral/) | 19.0.1.0.4 | | RAL [deltatech_reception_note](deltatech_reception_note/) | 19.0.0.1.2 | dhongu | Batch reception note [deltatech_record_type](deltatech_record_type/) | 19.0.1.1.12 | VoicuStefan2001 | Manage multiple record types @@ -125,21 +128,21 @@ addon | version | maintainers | summary [deltatech_report_prn](deltatech_report_prn/) | 19.0.1.1.0 | dhongu | Raport PRN [deltatech_restrict_reports](deltatech_restrict_reports/) | 19.0.1.0.0 | danila12 | Restrict Sales Analysis and Invoice Analysis reports by group: own records, all records, or no access. [deltatech_rpc_audit](deltatech_rpc_audit/) | 19.0.1.2.0 | dhongu | Log XML-RPC / JSON-RPC calls with the real client IP -[deltatech_sale_activity_report](deltatech_sale_activity_report/) | 19.0.1.0.0 | VoicuStefan2001 | Adds a last modified field to the sale order +[deltatech_sale_activity_report](deltatech_sale_activity_report/) | 19.0.1.1.0 | VoicuStefan2001 | Adds a last modified field to the sale order [deltatech_sale_activity_search](deltatech_sale_activity_search/) | 19.0.0.0.0 | VoicuStefan2001 | Adds a field with the active activity types on that sale order [deltatech_sale_add_extra_line](deltatech_sale_add_extra_line/) | 19.0.1.4.0 | dhongu | Sale Add Extra Line [deltatech_sale_add_extra_line_pos](deltatech_sale_add_extra_line_pos/) | 19.0.1.0.0 | dhongu | POS Add Extra Line [deltatech_sale_analysis_vat](deltatech_sale_analysis_vat/) | 19.0.1.0.1 | dhongu | VAT rate dimension in Invoice Analysis and Point of Sale Analysis -[deltatech_sale_commission](deltatech_sale_commission/) | 19.0.1.4.5 | dhongu | Compute sale commission +[deltatech_sale_commission](deltatech_sale_commission/) | 19.0.1.5.0 | dhongu | Compute sale commission [deltatech_sale_contact](deltatech_sale_contact/) | 19.0.1.0.21 | dhongu | Limit contacts insale order [deltatech_sale_cost_product](deltatech_sale_cost_product/) | 19.0.0.0.2 | dhongu | Sale Cost on Order [deltatech_sale_currency](deltatech_sale_currency/) | 19.0.0.0.0 | dhongu | This module allows you to manage sales orders in a different currency than the invoice currency. [deltatech_sale_feedback](deltatech_sale_feedback/) | 19.0.1.0.5 | dhongu | Sale Feedback [deltatech_sale_invoice_status](deltatech_sale_invoice_status/) | 19.0.0.0.1 | danila12 | Sale Invoice Status will not be To Be Invoiced if services present and products are not delivered -[deltatech_sale_margin](deltatech_sale_margin/) | 19.0.1.1.1 | dhongu | Check price in sale order +[deltatech_sale_margin](deltatech_sale_margin/) | 19.0.1.2.0 | dhongu | Check price in sale order [deltatech_sale_multiple](deltatech_sale_multiple/) | 19.0.1.1.1 | dhongu | Sale quantity multiple [deltatech_sale_multiple_website](deltatech_sale_multiple_website/) | 19.0.1.1.0 | dhongu | Enforce product quantity multiples in eCommerce -[deltatech_sale_pallet](deltatech_sale_pallet/) | 19.0.1.0.8 | dhongu | Sale pallet +[deltatech_sale_pallet](deltatech_sale_pallet/) | 19.0.1.0.9 | dhongu | Sale pallet [deltatech_sale_pallet_website](deltatech_sale_pallet_website/) | 19.0.1.0.0 | dhongu | Sale pallet [deltatech_sale_payment](deltatech_sale_payment/) | 19.0.1.1.4 | dhongu | Payment button in sale order [deltatech_sale_phone](deltatech_sale_phone/) | 19.0.1.0.2 | dhongu | Show partner phone in sale order @@ -151,7 +154,7 @@ addon | version | maintainers | summary [deltatech_sale_return_cause](deltatech_sale_return_cause/) | 19.0.0.0.8 | VoicuStefan2001 | Return Cause [deltatech_sale_stage](deltatech_sale_stage/) | 19.0.1.2.5 | dhongu | Sale Order Stage [deltatech_sale_team](deltatech_sale_team/) | 19.0.1.0.2 | | Sale Team Access -[deltatech_sale_xls](deltatech_sale_xls/) | 19.0.1.0.0 | VoicuStefan2001 | Import/export sale line from/to Excel +[deltatech_sale_xls](deltatech_sale_xls/) | 19.0.1.0.1 | VoicuStefan2001 | Import/export sale line from/to Excel [deltatech_saleorder_pickup_list](deltatech_saleorder_pickup_list/) | 19.0.1.0.0 | | Pickup list report from sale order [deltatech_saleorder_search](deltatech_saleorder_search/) | 19.0.1.0.2 | danila12 | Search sale order by partner e-mail, phone [deltatech_secondary_uom](deltatech_secondary_uom/) | 19.0.1.1.0 | dhongu | Product specific conversion factors between units of measure (SAP MARM style) @@ -161,16 +164,16 @@ addon | version | maintainers | summary [deltatech_stock_close](deltatech_stock_close/) | 19.0.1.1.0 | dhongu danila12 | Close stock operations at date [deltatech_stock_count_zero](deltatech_stock_count_zero/) | 19.0.0.0.0 | VoicuStefan2001 | Set inventory line to 0 when empty count is requested [deltatech_stock_delivery](deltatech_stock_delivery/) | 19.0.1.0.0 | dhongu | Adding button in invoice for display reception or delivery -[deltatech_stock_inventory](deltatech_stock_inventory/) | 19.0.2.7.2 | dhongu | Inventory Old Method +[deltatech_stock_inventory](deltatech_stock_inventory/) | 19.0.2.7.3 | dhongu | Inventory Old Method [deltatech_stock_inventory_product_display](deltatech_stock_inventory_product_display/) | 19.0.0.0.0 | VoicuStefan2001 | Adds product display button on sales and invoices to see the stock of the products in the order [deltatech_stock_negative](deltatech_stock_negative/) | 19.0.2.0.7 | dhongu | Negative stocks are not allowed -[deltatech_stock_picking_activity_report](deltatech_stock_picking_activity_report/) | 19.0.1.0.0 | VoicuStefan2001 | Tracks activities and changes on stock pickings +[deltatech_stock_picking_activity_report](deltatech_stock_picking_activity_report/) | 19.0.1.1.0 | VoicuStefan2001 | Tracks activities and changes on stock pickings [deltatech_stock_removal_priority](deltatech_stock_removal_priority/) | 19.0.1.0.0 | dhongu | Stock Removal Location by Priority [deltatech_stock_report](deltatech_stock_report/) | 19.0.1.0.4 | dhongu | Report with positions from picking lists [deltatech_stock_reseller](deltatech_stock_reseller/) | 19.0.1.0.2 | dhongu | Report report reseller -[deltatech_tc](deltatech_tc/) | 19.0.1.1.0 | dhongu | Base for Terrabit Connect: station registry, outbound job queue, REST endpoints (X-Station-Key) and HTTP calls into the customer's local network. +[deltatech_tc](deltatech_tc/) | 19.0.1.1.1 | dhongu | Base for Terrabit Connect: station registry, outbound job queue, REST endpoints (X-Station-Key) and HTTP calls into the customer's local network. [deltatech_team_logo](deltatech_team_logo/) | 19.0.1.0.0 | | Logo de firmă în rapoarte în funcție de echipa de vânzare -[deltatech_test_system](deltatech_test_system/) | 19.0.0.0.8 | dhongu | Set system status: test or production +[deltatech_test_system](deltatech_test_system/) | 19.0.0.0.9 | dhongu | Set system status: test or production [deltatech_transport_change](deltatech_transport_change/) | 19.0.0.1.4 | | Export configuration changes to CSV and manage transport through Git [deltatech_vendor_stock](deltatech_vendor_stock/) | 19.0.1.1.8 | dhongu | Vendor stock availability [deltatech_warehouse_arrangement](deltatech_warehouse_arrangement/) | 19.0.0.1.2 | | Manages warehouse locations, parallel to standard Odoo locations @@ -197,6 +200,7 @@ addon | version | maintainers | summary [deltatech_website_sale_portal](deltatech_website_sale_portal/) | 19.0.1.0.1 | dhongu | eCommerce Portal extension [deltatech_website_sale_sort](deltatech_website_sale_sort/) | 19.0.1.0.2 | dhongu | Additional sorting criteria [deltatech_website_sale_status](deltatech_website_sale_status/) | 19.0.2.0.5 | dhongu | Additional filters sales orders by status +[deltatech_website_searchbar](deltatech_website_searchbar/) | 19.0.1.0.0 | dhongu | Reduce autocomplete requests by increasing debounce and adding minimum term length [deltatech_website_short_description](deltatech_website_short_description/) | 19.0.1.0.3 | dhongu | eCommerce short description [deltatech_website_stock_availability](deltatech_website_stock_availability/) | 19.0.1.0.9 | dhongu | eCommerce Stock Availability and lead time [deltatech_website_vat_validation](deltatech_website_vat_validation/) | 19.0.0.0.1 | dhongu | VAT Validation diff --git a/deltatech_dc/README.rst b/deltatech_dc/README.rst index 045cde54c..5f176873e 100644 --- a/deltatech_dc/README.rst +++ b/deltatech_dc/README.rst @@ -29,6 +29,22 @@ Declaration of Conformity .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.1.0.12 (2026-08-15) +------------------------ + +- Fix: added the missing ``stock_account`` dependency. + ``report/report_dc.py`` calls + ``account.move._get_invoiced_lot_values()``, which is defined in + ``stock_account`` (and extended by ``sale_stock``). The module only + worked when another addon in the same database pulled + ``stock_account`` in. + Bug Tracker =========== diff --git a/deltatech_dc/static/description/index.html b/deltatech_dc/static/description/index.html index 4a26c11b2..34e4f266c 100644 --- a/deltatech_dc/static/description/index.html +++ b/deltatech_dc/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_delivery_status/README.rst b/deltatech_delivery_status/README.rst index fadab032c..c75c43ef9 100644 --- a/deltatech_delivery_status/README.rst +++ b/deltatech_delivery_status/README.rst @@ -118,6 +118,25 @@ and payment processes. Changelog ========= +19.0.2.3.0 +========== + +- Comenzile cu livrarea amânată pot fi acum **găsite**: filtru „Livrare + amânată" în căutarea comenzilor de vânzare și „Amânată" în căutarea + transferurilor. Fără ele, un flux care cere eliberare manuală era + practic imposibil de operat — butonul „Eliberează" apare doar pe + comanda deschisă, iar comenzile care așteptau nu erau vizibile + nicăieri. +- ``sale.order.postponed_delivery`` devine **căutabil** (metodă + ``search`` care se traduce în ``picking_ids.postponed``, câmp stocat). + Fiind calculat și nestocat, nu putea fi folosit în niciun domeniu — + nici în filtre predefinite, nici în filtre personalizate create de + utilizator din interfață. +- Acțiunile server „Postpone Delivery" / „Release Delivery" au acum + ``binding_model_id``, deci apar în meniul *Acțiuni* și permit operarea + **în masă** din lista de comenzi, nu doar una câte una. +- Test nou pentru căutarea pe ``postponed_delivery`` (inclusiv negarea). + 19.0.2.2.0 (2026-08-04) ----------------------- diff --git a/deltatech_delivery_status/static/description/index.html b/deltatech_delivery_status/static/description/index.html index 7a315ca36..f98e2cf5f 100644 --- a/deltatech_delivery_status/static/description/index.html +++ b/deltatech_delivery_status/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_image_optimize/README.rst b/deltatech_image_optimize/README.rst index de77f5d02..ca9310389 100644 --- a/deltatech_image_optimize/README.rst +++ b/deltatech_image_optimize/README.rst @@ -14,7 +14,7 @@ Image Optimizer :target: https://odoo-community.org/page/development-status :alt: Beta .. |badge2| image:: https://img.shields.io/badge/github-dhongu%2Fdeltatech-lightgray.png?logo=github - :target: https://github.com/dhongu/deltatech/tree/18.0/deltatech_image_optimize + :target: https://github.com/dhongu/deltatech/tree/19.0/deltatech_image_optimize :alt: dhongu/deltatech |badge1| |badge2| @@ -30,7 +30,8 @@ For each targeted image the module: - downscales it to a maximum side of ``max_dim`` pixels (default 1920); - re-encodes photos without transparency as progressive **JPEG** at the configured quality (default 85); -- keeps images with transparency as optimized **PNG** (alpha preserved); +- keeps genuinely transparent images as **WebP** (alpha preserved), or + as optimized **PNG** when the Pillow build has no WebP encoder; - skips animated GIFs (never flattens the animation); - keeps the result only when it is actually smaller. @@ -43,25 +44,127 @@ skipped on the next run. Because Odoo creates a fresh attachment whenever an image field is updated, newly uploaded or changed images are picked up automatically. +How much space you actually get back +------------------------------------ + +The batch methods return two figures, and the difference between them +matters: + ++----------------+-----------------------------------------------------+ +| Key | Meaning | ++================+=====================================================+ +| ``freed`` | sum of the per-attachment size difference | ++----------------+-----------------------------------------------------+ +| ``freed_disk`` | only the attachments whose filestore file was | +| | **not** shared | ++----------------+-----------------------------------------------------+ + +Odoo stores one file per checksum, so attachments with identical content +share a single file. Recompressing one of them frees nothing while the +others still point at the old file. On a catalog that reuses the same +picture across products, ``freed`` therefore overstates the saving — on +a real deployment it counted **29 GB** where the disk gave back about +**4 GB**, because 815 000 image attachments lived in 508 000 files. + +Use ``freed_disk`` when you report space. Use ``freed`` only to see how +much lighter the images themselves got — which is the real win on a +website, since that is bytes off every page load, regardless of +deduplication. + +To measure the whole database rather than one run: + +.. code:: sql + + SELECT pg_size_pretty(sum(sz)) FROM ( + SELECT DISTINCT ON (checksum) file_size AS sz + FROM ir_attachment WHERE res_field IS NOT NULL AND checksum IS NOT NULL + ORDER BY checksum, id + ) t; + +Note also that the filestore grows *before* it shrinks: the new file is +written while the old one is still referenced, and the space comes back +only when the filestore GC runs (the scheduled action does it at the end +of each pass). + Configuration ------------- System Parameters (Settings → Technical → System Parameters): -+--------------------------------------------+-------------------------------+----------------------+ -| Key | Default | Meaning | -+============================================+===============================+======================+ -| ``deltatech_image_optimize.quality`` | 85 | JPEG quality (1..95) | -+--------------------------------------------+-------------------------------+----------------------+ -| ``deltatech_image_optimize.max_dim`` | 1920 | max side in pixels | -+--------------------------------------------+-------------------------------+----------------------+ -| ``deltatech_image_optimize.min_size`` | 102400 | only images larger | -| | | than this (bytes) | -+--------------------------------------------+-------------------------------+----------------------+ -| ``deltatech_image_optimize.batch`` | 1000 | images per cron run | -+--------------------------------------------+-------------------------------+----------------------+ -| ``deltatech_image_optimize.target_fields`` | image_1920,image_variant_1920 | fields to optimize | -+--------------------------------------------+-------------------------------+----------------------+ ++-----------------------------------------------+------------------------------------------+----------------------+ +| Key | Default | Meaning | ++===============================================+==========================================+======================+ +| ``deltatech_image_optimize.quality`` | 85 | JPEG quality (1..95) | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.max_dim`` | 1920 | max side in pixels | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.min_size`` | 102400 | only images larger | +| | | than this (bytes) | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.batch`` | 50 | images per cron run | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.flush_every`` | 20 | flush/invalidate the | +| | | ORM cache every N | +| | | images | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.target_fields`` | image_1920,image_variant_1920 | original fields to | +| | | optimize | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.webp_quality`` | 85 | WebP quality for | +| | | transparent images | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.force_jpeg`` | 0 | ignore alpha, always | +| | | JPEG — | +| | | **destructive, see | +| | | below** | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.variant_fields`` | image_1024,image_512,image_256,image_128 | resized variants to | +| | | recompress in place | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.variant_quality`` | 85 | quality for | +| | | re-encoding the | +| | | variants | ++-----------------------------------------------+------------------------------------------+----------------------+ +| ``deltatech_image_optimize.variant_min_size`` | 20480 | only recompress | +| | | variants larger than | +| | | this (bytes) | ++-----------------------------------------------+------------------------------------------+----------------------+ + +⚠ ``force_jpeg`` is destructive — probe before enabling it +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``force_jpeg=1`` makes the optimizer ignore the alpha channel entirely. +JPEG has no transparency, so every transparent area is **flattened to +black**, and the original is gone: the optimized image is written +through the record, so the previous attachment no longer exists. There +is no undo — the images have to be re-imported from wherever they came +from. + +Enable it only on a catalog you have *verified* has no real +transparency. "The originals are stored elsewhere" is not that +verification: it covers resolution, not the alpha channel. A catalog +that looks like solid white product shots can still be a third +transparent PNGs — this is what happened on a real deployment, where 32% +of a 40-image sample turned out to have real alpha. + +Probe it first, without writing anything (``_dt_image_recompress`` is a +pure function — it returns the bytes and the chosen format, and touches +nothing): + +.. code:: python + + A = env["ir.attachment"].sudo() + counts = {} + for att in A.search([("res_field", "in", ["image_1920", "image_variant_1920"]), + ("mimetype", "=", "image/png"), ("file_size", ">", 51200)], limit=40): + _data, fmt = A._dt_image_recompress(att.raw, 78, 1280, 85, False) + counts[fmt] = counts.get(fmt, 0) + 1 + print(counts) # any WEBP/PNG result = images that force_jpeg would destroy + +Every ``WEBP`` or ``PNG`` in that count is an image with real +transparency. If there is even one, leave ``force_jpeg`` at ``0`` — the +module already sends opaque images to JPEG on its own, so you lose +almost nothing by keeping it off. Scheduled action ---------------- @@ -75,7 +178,7 @@ shell: .. code:: python - while env["ir.attachment"]._dt_image_optimize_run(limit=2000)["scanned"]: + while env["ir.attachment"]._dt_image_optimize_run(limit=200)["scanned"]: env.cr.commit() **Table of contents** @@ -89,6 +192,175 @@ Changelog Changelog ========= +19.0.1.8.1 (2026) +----------------- + +- ``data/ir_cron.xml`` is now ``noupdate="1"``. It was not, so **every + module upgrade reapplied ``active = False`` and switched the scheduled + action back off**, silently, however long ago someone had enabled it. + Seen in production: the cron was enabled one day, an upgrade the next + morning disabled it again, and nothing in the logs said so -- it + simply never ran. ``ir_config_parameter.xml`` already had the flag, + which is why the tuned parameters survived the same upgrade while the + cron did not. +- Existing databases: the flag stops future upgrades from touching the + record, but it cannot restore a cron already switched off. Check + Settings > Technical > Scheduled Actions after upgrading, and + re-enable it if it was on before. + +19.0.1.8.0 (2026) +----------------- + +- The batch methods now also return ``freed_disk``, and log it next to + ``freed``. ``freed`` sums the per-attachment size difference, which + **overstates the saving** whenever the same picture is used on several + records: Odoo keeps one file per checksum, so recompressing one + attachment frees nothing while the others still reference the old + file. On a real deployment the run reported **29 GB** where the disk + gave back about **4 GB** -- 815 000 image attachments living in 508 + 000 files. ``freed_disk`` counts only attachments whose file was not + shared, so it is the figure to quote when someone asks how much space + this recovers. +- The check reads ``store_fname`` (indexed, and derived from the + checksum) before the write, since writing replaces it. +- ``readme/DESCRIPTION.md`` explains the difference, gives the SQL to + measure real occupancy across the whole database, and notes that the + filestore grows before it shrinks -- the space returns only once the + GC runs. + +19.0.1.7.0 (2026) +----------------- + +- **Transparent images now really become WebP.** They were silently + falling back to optimized PNG on most databases. + ``odoo/tools/image.py`` runs ``Image.preinit()`` and then sets + ``Image._initialized = 2``; preinit registers only + BMP/GIF/JPEG/PPM/PNG, and the flag makes Pillow believe ``init()`` + already ran, so ``save(format="WEBP")`` raises ``KeyError: 'WEBP'`` + even where Pillow is built with libwebp and ``features.check("webp")`` + returns True. The module now imports ``PIL.WebPImagePlugin`` + explicitly, which registers the format — ``Image.init()`` alone does + not help, it returns early on ``_initialized >= 2``. Same approach + already used by ``deltatech_website_watermark``. +- ``WEBP_OK`` (a constant computed at import time) is replaced by + ``_webp_available()``, resolved on first use and cached. The old + constant made the module behave **differently from one database to + another**: where another module registering the WebP plugin happened + to be imported first, transparent images became WebP; everywhere else + the identical code produced PNG, with no error anywhere. Import order + is not something a result should depend on. +- The test suite asks the module for WebP support instead of probing at + import, so ``test_transparent_image_becomes_webp`` actually runs. It + had been skipping itself with "Pillow build lacks WebP support" — on + builds that encode WebP fine. + +Impact: on catalogs with real transparency, those images now compress as +WebP (typically ~70% smaller than the PNG fallback) instead of staying +nearly uncompressed. No change for opaque images. + +19.0.1.6.0 (2026) +----------------- + +- Document that ``force_jpeg`` is **destructive**, in both places where + it is read: ``readme/DESCRIPTION.md`` and the comment above the + parameter in ``data/ir_config_parameter.xml``. It flattens + transparency to black and the original cannot be recovered, because + the optimized image is written through the record and the previous + attachment is gone. +- Add a probe snippet that measures how much of a catalog has real + transparency *before* the parameter is enabled, using + ``_dt_image_recompress`` (a pure function — it returns bytes and + format, writes nothing). +- The rationale is a real deployment: ``force_jpeg=1`` was enabled on a + catalog believed to have no transparency, and 32% of a 40-image sample + turned out to have real alpha. The first 20 optimized images were + destroyed before it was caught. +- Bring the configuration table in ``DESCRIPTION.md`` up to date: it was + missing ``flush_every``, ``force_jpeg``, ``webp_quality`` and the + three ``variant_*`` keys, and still advertised the old ``batch`` + default of 1000. Also state that transparent images go to WebP, with + PNG as the fallback when the Pillow build has no WebP encoder. + +19.0.1.5.1 (2026) +----------------- + +- Migration to Odoo 19.0. No functional change: the module only relies + on stable ``ir.attachment`` API (``raw``, ``res_field``, + ``_gc_file_store``) which is unchanged in 19.0. +- Add the Odoo Apps marketing banner + (``static/description/main_screenshot.png``). + +18.0.1.5.1 (2025) +----------------- + +- Lower the default/installed ``batch`` from 200-1000 to **50**. On + production, a large batch of big/high-resolution images could exceed + the cron worker's time/CPU limit; the resulting interrupt looked like + a normal per-image failure and left the rest of that batch silently + flagged as "processed" without actually being optimized. A small batch + keeps each cron run well within limits. If you raise it, verify + converted images actually shrank. + +18.0.1.5.0 (2025) +----------------- + +- New ``force_jpeg`` parameter: when the catalog images are never really + transparent (solid colored background), set it to 1 to ignore the + alpha channel and always produce JPEG (max savings, no WebP + dependency). + +18.0.1.4.0 (2025) +----------------- + +- Transparency is now decided by the *actual* alpha content, not the + mode: RGBA/palette images that are effectively opaque go to JPEG (big + savings), only genuinely transparent images go to WebP. Palette images + are normalized first. This fixes "transparent" PNGs that previously + stayed uncompressed. +- Genuinely transparent images with no WebP support keep an optimized + PNG (never flattened to a solid background). + +18.0.1.3.0 (2025) +----------------- + +- Images with transparency are now converted to **WebP** (alpha + preserved, ~70% smaller than PNG) instead of being kept as PNG. New + ``webp_quality`` parameter (default 85). +- Because Odoo cannot resize WebP, a WebP original is written directly + on its attachment (never through the record field, which would + regenerate full-size variants); the variants are converted in place + separately. +- Opaque images keep going to JPEG. + +18.0.1.2.0 (2025) +----------------- + +- Configurable ``flush_every`` parameter (memory flush/invalidate/gc + frequency). Lower it to 2-3 for very high-resolution images (e.g. 20 + MP) so the cron and batch runs stay within memory on heavy images. +- ``gc.collect()`` at each flush point. +- The scheduled action now runs a filestore GC at the end (single writer + → can grab the lock), so cron-driven runs actually reclaim disk space. + +18.0.1.1.0 (2025) +----------------- + +- Step 2 — recompress the stored resized variants + (image_1024/512/256/128) in place (``att.write({'raw': ...})``), at a + configurable ``variant_quality``, without resizing and without + touching the original (no related write-back). +- New parameters: ``variant_fields``, ``variant_quality``, + ``variant_min_size``. +- The scheduled action now optimizes originals **and** variants. + +18.0.1.0.1 (2025) +----------------- + +- Keep memory flat over large batches: flush and invalidate the ORM + cache every 20 images (avoids the worker/shell being killed on big + batches). +- Lower the default batch size to 200. + 18.0.1.0.0 (2025) ----------------- @@ -133,6 +405,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_image_optimize/static/description/index.html b/deltatech_image_optimize/static/description/index.html index 7d3ed18f8..e77b1267b 100644 --- a/deltatech_image_optimize/static/description/index.html +++ b/deltatech_image_optimize/static/description/index.html @@ -360,44 +360,95 @@ -
-

Image Optimizer

+
+
+ Odoo Partner  •  Terrabit +

Image Optimizer

+

Recompress oversized image attachments to reclaim filestore space

+
+ Odoo 19.0 + Online • Odoo.sh • On-premise + Optional support +
+
+
-

Beta dhongu/deltatech

-

Image Optimizer

-

Recompresses oversized original image attachments (image_1920 -and image_variant_1920 by default) to reclaim filestore space.

+

Recompresses oversized original image attachments (image_1920 +and image_variant_1920 by default) to reclaim filestore space.

For each targeted image the module:

-
    -
  • downscales it to a maximum side of max_dim pixels (default 1920);
  • -
  • re-encodes photos without transparency as progressive JPEG at the -configured quality (default 85);
  • -
  • keeps images with transparency as optimized PNG (alpha preserved);
  • -
  • skips animated GIFs (never flattens the animation);
  • -
  • keeps the result only when it is actually smaller.
  • -
+
  • downscales it to a maximum side of max_dim pixels (default 1920);
  • re-encodes photos without transparency as progressive JPEG at the +configured quality (default 85);
  • keeps genuinely transparent images as WebP (alpha preserved), or +as optimized PNG when the Pillow build has no WebP encoder;
  • skips animated GIFs (never flattens the animation);
  • keeps the result only when it is actually smaller.

The optimized image is written back through the owning record, so -Odoo regenerates the resized variants (image_1024/512/256/128) from +Odoo regenerates the resized variants (image_1024/512/256/128) from the new, smaller original.

-

Processed attachments are flagged (deltatech_image_optimized) and +

Processed attachments are flagged (deltatech_image_optimized) and skipped on the next run. Because Odoo creates a fresh attachment whenever an image field is updated, newly uploaded or changed images are picked up automatically.

+
+

How much space you actually get back

+

The batch methods return two figures, and the difference between them +matters:

+ ++++ + + + + + + + + + + + + + +
KeyMeaning
freedsum of the per-attachment size difference
freed_diskonly the attachments whose filestore file was +not shared
+

Odoo stores one file per checksum, so attachments with identical content +share a single file. Recompressing one of them frees nothing while the +others still point at the old file. On a catalog that reuses the same +picture across products, freed therefore overstates the saving — on +a real deployment it counted 29 GB where the disk gave back about +4 GB, because 815 000 image attachments lived in 508 000 files.

+

Use freed_disk when you report space. Use freed only to see how +much lighter the images themselves got — which is the real win on a +website, since that is bytes off every page load, regardless of +deduplication.

+

To measure the whole database rather than one run:

+
+SELECT pg_size_pretty(sum(sz)) FROM (
+    SELECT DISTINCT ON (checksum) file_size AS sz
+    FROM ir_attachment WHERE res_field IS NOT NULL AND checksum IS NOT NULL
+    ORDER BY checksum, id
+) t;
+
+

Note also that the filestore grows before it shrinks: the new file is +written while the old one is still referenced, and the space comes back +only when the filestore GC runs (the scheduled action does it at the end +of each pass).

+
-

Configuration

+

Configuration

System Parameters (Settings → Technical → System Parameters):

---+++ @@ -406,90 +457,153 @@

Configuration

- + - + - + - - + + - + + + + + - + + + + + + + + + + + + + + + + + + + + +
Key
deltatech_image_optimize.quality
deltatech_image_optimize.quality 85 JPEG quality (1..95)
deltatech_image_optimize.max_dim
deltatech_image_optimize.max_dim 1920 max side in pixels
deltatech_image_optimize.min_size
deltatech_image_optimize.min_size 102400 only images larger than this (bytes)
deltatech_image_optimize.batch1000
deltatech_image_optimize.batch50 images per cron run
deltatech_image_optimize.target_fields
deltatech_image_optimize.flush_every20flush/invalidate the +ORM cache every N +images
deltatech_image_optimize.target_fields image_1920,image_variant_1920fields to optimizeoriginal fields to +optimize
deltatech_image_optimize.webp_quality85WebP quality for +transparent images
deltatech_image_optimize.force_jpeg0ignore alpha, always +JPEG — +destructive, see +below
deltatech_image_optimize.variant_fieldsimage_1024,image_512,image_256,image_128resized variants to +recompress in place
deltatech_image_optimize.variant_quality85quality for +re-encoding the +variants
deltatech_image_optimize.variant_min_size20480only recompress +variants larger than +this (bytes)
+
+

force_jpeg is destructive — probe before enabling it

+

force_jpeg=1 makes the optimizer ignore the alpha channel entirely. +JPEG has no transparency, so every transparent area is flattened to +black, and the original is gone: the optimized image is written +through the record, so the previous attachment no longer exists. There +is no undo — the images have to be re-imported from wherever they came +from.

+

Enable it only on a catalog you have verified has no real +transparency. “The originals are stored elsewhere” is not that +verification: it covers resolution, not the alpha channel. A catalog +that looks like solid white product shots can still be a third +transparent PNGs — this is what happened on a real deployment, where 32% +of a 40-image sample turned out to have real alpha.

+

Probe it first, without writing anything (_dt_image_recompress is a +pure function — it returns the bytes and the chosen format, and touches +nothing):

+
+A = env["ir.attachment"].sudo()
+counts = {}
+for att in A.search([("res_field", "in", ["image_1920", "image_variant_1920"]),
+                     ("mimetype", "=", "image/png"), ("file_size", ">", 51200)], limit=40):
+    _data, fmt = A._dt_image_recompress(att.raw, 78, 1280, 85, False)
+    counts[fmt] = counts.get(fmt, 0) + 1
+print(counts)  # any WEBP/PNG result = images that force_jpeg would destroy
+
+

Every WEBP or PNG in that count is an image with real +transparency. If there is even one, leave force_jpeg at 0 — the +module already sends opaque images to JPEG on its own, so you lose +almost nothing by keeping it off.

+
-

Scheduled action

-

Image Optimizer: recompress oversized images runs daily. It is +

Scheduled action

+

Image Optimizer: recompress oversized images runs daily. It is disabled by default — review the configuration, test on staging, then enable it.

For a large one-time backlog you can loop the batch method from the shell:

-while env["ir.attachment"]._dt_image_optimize_run(limit=2000)["scanned"]:
+while env["ir.attachment"]._dt_image_optimize_run(limit=200)["scanned"]:
     env.cr.commit()
 
-

Table of contents

-
-
-
-

Changelog

-
-
-

Changelog

-
-

18.0.1.0.0 (2025)

-
    -
  • Initial release.
  • -
  • Add ir.attachment.deltatech_image_optimized marker field.
  • -
  • Recompress original image attachments (image_1920 / -image_variant_1920): downscale to max_dim, JPEG (quality -tuned) for opaque images, optimized PNG for images with alpha, skip -animated GIFs.
  • -
  • Write the optimized image back through the owning record so Odoo -regenerates the resized variants from the smaller original.
  • -
  • Configurable via ir.config_parameter (quality, max_dim, min_size, -batch, target_fields).
  • -
  • Daily scheduled action -Image Optimizer: recompress oversized images, disabled by default.
  • -
-

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.

+

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

You are welcome to contribute.

+
+
+
+

Need help getting started?

+

+ We are an Odoo partner building apps for the Romanian market (SAGA & WinMentor + export; Romanian accounting localization in progress). Direct support from the team + that built the module.

+ Contact Terrabit → +
+
TERRABIT
+
+ © Terrabit Solutions SRL  •  + terrabit.ro +  •  Odoo apps for Romania, Ireland & Moldova +
+
+
+
diff --git a/deltatech_kit_price/README.rst b/deltatech_kit_price/README.rst index 67396f4e8..c9b09f48d 100644 --- a/deltatech_kit_price/README.rst +++ b/deltatech_kit_price/README.rst @@ -68,6 +68,25 @@ Usage .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.0.0.2 (2026-08-15) +----------------------- + +- Fix: added the missing ``mrp_account`` dependency. + ``_compute_purchase_price()`` calls + ``product.product._compute_bom_price()``, which is defined in + ``mrp_account``. Since ``mrp_account`` is ``auto_install`` and Odoo 19 + test databases are built with ``--skip-auto-install``, the module only + worked when another addon in the same database required + ``mrp_account`` explicitly (``deltatech_mrp_cost`` did). Installed on + its own, both tests failed with + ``AttributeError: 'product.product' object has no attribute '_compute_bom_price'``. + Bug Tracker =========== diff --git a/deltatech_kit_price/static/description/index.html b/deltatech_kit_price/static/description/index.html index 03320bcb1..ef156011f 100644 --- a/deltatech_kit_price/static/description/index.html +++ b/deltatech_kit_price/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_partner_merge/README.rst b/deltatech_partner_merge/README.rst new file mode 100644 index 000000000..75478f907 --- /dev/null +++ b/deltatech_partner_merge/README.rst @@ -0,0 +1,98 @@ +===================== +Partner Merge in Bulk +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:52af57a948e35cc060d2788eb07f2e3c2b70a493007accb58ea92e834f263b57 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/github-dhongu%2Fdeltatech-lightgray.png?logo=github + :target: https://github.com/dhongu/deltatech/tree/19.0/deltatech_partner_merge + :alt: dhongu/deltatech + +|badge1| |badge2| + +Merges partner records that share the same VAT number, in bulk. + +Odoo's own merge wizard walks the foreign keys **group by group**: for +every pair it goes through all ~158 columns that reference +``res_partner``. Fine for a handful of duplicates; for thousands of +groups it means hundreds of thousands of statements and does not finish +in any reasonable window. + +This module inverts the loops — **one statement per column for the whole +batch** — and keeps foreign keys enabled throughout, so integrity is +guaranteed by PostgreSQL rather than by the procedure being right. On a +production database of 538.000 partners, merging 5.350 records took +about four and a half minutes. + +**Safety.** The simulation is not a flag you can forget: it runs the +whole merge on a separate transaction and rolls it back, so it cannot +write even if something is wrong. Applying is a distinct step, guarded +by its own access group, and refuses to finish if any reference is left +pointing at an absorbed record. + +**What it does not touch by itself.** Groups whose unreconciled balance +is spread over several records are classified apart — merging those +moves money between ledgers and belongs with the accountant. Also left +out: groups holding your own company record, groups with portal users on +more than one record, and groups whose names differ completely on the +same VAT number. + +**Kept record.** Chosen by document volume — most invoices, then most +sales orders, then oldest. Since that is not the same as name quality, +the surviving record is flagged when its name looks mangled at import, +with the names of the absorbed records alongside for correction. + +The same procedure is available as plain SQL scripts in +``deltatech/scripts/partner_merge/``, for when it has to be run outside +Odoo. + +**Table of contents** + +.. contents:: + :local: + +Changelog +========= + +19.0.1.0.0 (2026-08-18) +----------------------- + +- Add: bulk merge of partners duplicated on the same VAT number, with + classification, guards, simulation on a rolled-back transaction, and + verification against a snapshot taken before the merge. Wraps the SQL + procedure from ``deltatech/scripts/partner_merge/``, validated on a + client's staging database (575 records merged in three batches, zero + discrepancies on invoices, orders, deliveries and unreconciled + balance). + +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 + +Maintainers +----------- + +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_partner_merge/static/description/index.html b/deltatech_partner_merge/static/description/index.html new file mode 100644 index 000000000..ec709ef4b --- /dev/null +++ b/deltatech_partner_merge/static/description/index.html @@ -0,0 +1,454 @@ + + + + + +Partner Merge in Bulk + + + +
+
+ Odoo Partner  •  Terrabit +

Partner Merge in Bulk

+

Merge partners duplicated on the same VAT number, in bulk, in minutes instead of hours

+
+ Odoo 19.0 + Online • Odoo.sh • On-premise + Optional support +
+
+ +
+ +

Merges partner records that share the same VAT number, in bulk.

+

Odoo’s own merge wizard walks the foreign keys group by group: for +every pair it goes through all ~158 columns that reference +res_partner. Fine for a handful of duplicates; for thousands of +groups it means hundreds of thousands of statements and does not finish +in any reasonable window.

+

This module inverts the loops — one statement per column for the whole +batch — and keeps foreign keys enabled throughout, so integrity is +guaranteed by PostgreSQL rather than by the procedure being right. On a +production database of 538.000 partners, merging 5.350 records took +about four and a half minutes.

+

Safety. The simulation is not a flag you can forget: it runs the +whole merge on a separate transaction and rolls it back, so it cannot +write even if something is wrong. Applying is a distinct step, guarded +by its own access group, and refuses to finish if any reference is left +pointing at an absorbed record.

+

What it does not touch by itself. Groups whose unreconciled balance +is spread over several records are classified apart — merging those +moves money between ledgers and belongs with the accountant. Also left +out: groups holding your own company record, groups with portal users on +more than one record, and groups whose names differ completely on the +same VAT number.

+

Kept record. Chosen by document volume — most invoices, then most +sales orders, then oldest. Since that is not the same as name quality, +the surviving record is flagged when its name looks mangled at import, +with the names of the absorbed records alongside for correction.

+

The same procedure is available as plain SQL scripts in +deltatech/scripts/partner_merge/, for when it has to be run outside +Odoo.

+
+

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
  • +
+
+
+

Maintainers

+

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

+

You are welcome to contribute.

+
+
+
+
+
+

Need help getting started?

+

+ We are an Odoo partner building apps for the Romanian market (SAGA & WinMentor + export; Romanian accounting localization in progress). Direct support from the team + that built the module.

+ Contact Terrabit → +
+
TERRABIT
+
+ © Terrabit Solutions SRL  •  + terrabit.ro +  •  Odoo apps for Romania, Ireland & Moldova +
+
+
+ +
+ + diff --git a/deltatech_pos_fix/README.rst b/deltatech_pos_fix/README.rst index 55cfccfe7..a90351c8b 100644 --- a/deltatech_pos_fix/README.rst +++ b/deltatech_pos_fix/README.rst @@ -23,7 +23,7 @@ Deltatech POS Fix |badge1| |badge2| |badge3| Deltatech POS Fix ------------------ +================= Fix POS total calculation when using tax-included fiscal position mapping. @@ -39,7 +39,7 @@ generating invoices from POS orders (Python), ensuring consistency across the entire flow. Features -~~~~~~~~ +-------- - Corrects unit price recalculation in POS when taxes change through the fiscal position. @@ -49,7 +49,7 @@ Features reflect the correct tax mapping. Installation -~~~~~~~~~~~~ +------------ 1. Copy the module into the addons folder. 2. Update the module list in Odoo. diff --git a/deltatech_pos_fix/readme/DESCRIPTION.md b/deltatech_pos_fix/readme/DESCRIPTION.md index de79c34d7..794dd9f55 100644 --- a/deltatech_pos_fix/readme/DESCRIPTION.md +++ b/deltatech_pos_fix/readme/DESCRIPTION.md @@ -1,4 +1,4 @@ -## Deltatech POS Fix +# Deltatech POS Fix Fix POS total calculation when using tax-included fiscal position mapping. @@ -6,13 +6,13 @@ When a product has a tax-included tax and a fiscal position maps it to a non-inc This fix is applied both in the POS interface (JavaScript) and when generating invoices from POS orders (Python), ensuring consistency across the entire flow. -### Features +## Features - Corrects unit price recalculation in POS when taxes change through the fiscal position. - Ensures consistency between the Sales module and POS regarding the treatment of included taxes. - Adapts the unit price on invoice lines generated from POS orders to reflect the correct tax mapping. -### Installation +## Installation 1. Copy the module into the addons folder. 2. Update the module list in Odoo. diff --git a/deltatech_pos_fix/static/description/index.html b/deltatech_pos_fix/static/description/index.html index aa3fbd60c..84a2c10b4 100644 --- a/deltatech_pos_fix/static/description/index.html +++ b/deltatech_pos_fix/static/description/index.html @@ -405,33 +405,33 @@

deltatech_pos_fix module. +

+
-

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.

+

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

You are welcome to contribute.

+

Need help getting started?

diff --git a/deltatech_pos_stock/README.rst b/deltatech_pos_stock/README.rst index cc6bc56fb..586c4bb6f 100644 --- a/deltatech_pos_stock/README.rst +++ b/deltatech_pos_stock/README.rst @@ -17,7 +17,7 @@ Deltatech POS Stock :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/18.0/deltatech_pos_stock + :target: https://github.com/dhongu/deltatech/tree/19.0/deltatech_pos_stock :alt: dhongu/deltatech |badge1| |badge2| |badge3| @@ -40,6 +40,47 @@ Key features: .. contents:: :local: +Changelog +========= + +19.0.1.1.0 (2026-08-19) +----------------------- + +- Fixed stale stock badge: ``qty_available`` is a non-stored computed + field, so a sale (which writes on ``stock.quant``, not on + ``product.template``) never bumps the template's ``write_date``. The + POS incremental sync filters on ``write_date``, so it never re-sent + the recalculated quantity to sessions already open — the badge could + stay frozen at a days-old value. +- ``stock.quant`` now pushes a live ``STOCK_SYNCHRONISATION`` bus + notification (reusing the same ``pos.bus.mixin`` channel core uses for + ``notify_synchronisation``) whenever a product's on-hand quantity + changes, to every open POS session with ``display_stock`` enabled. The + frontend subscribes to it and merges the fresh ``product.template`` + data straight into the in-memory model, independent of the + ``write_date``-based sync. + +19.0.1.0.0 (2026-08-14) +----------------------- + +- Migrated to Odoo 19.0. +- Stock loading moved from ``product.product`` to ``product.template``: + in 19.0 the POS product card receives a template, so ``qty_available`` + has to be loaded on the template. +- Adapted to the 19.0 loading API: ``_load_pos_data_fields()`` now + receives the ``pos.config`` recordset and the removed + ``_load_pos_data()`` hook was replaced by ``_load_pos_data_read()``. +- POS JS patch adapted to the 19.0 asset paths + (``app/components/product_card``, ``app/hooks/pos_hook``) and the + removed ``getProductPriceFormatted()`` helper was replaced by + ``getTaxDetails()`` + ``formatCurrency()``, honouring the + ``iface_tax_included`` setting. +- Card template anchored on ``div.product-content``; the + ``div.product-information-tag`` element it used to extend no longer + exists in 19.0. +- Added a POS frontend test asserting that the badge renders both the + price and the on-hand quantity. + Bug Tracker =========== @@ -68,6 +109,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_pos_stock/static/description/index.html b/deltatech_pos_stock/static/description/index.html index 6c95cc0ef..bdaa3d1b8 100644 --- a/deltatech_pos_stock/static/description/index.html +++ b/deltatech_pos_stock/static/description/index.html @@ -404,7 +404,7 @@

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.

diff --git a/deltatech_purchase_add_extra_line/README.rst b/deltatech_purchase_add_extra_line/README.rst index 5ef76ac10..c72877586 100644 --- a/deltatech_purchase_add_extra_line/README.rst +++ b/deltatech_purchase_add_extra_line/README.rst @@ -80,6 +80,16 @@ Usage Changelog ========= +19.0.1.3.0 +---------- + +- [FIX] ``check_extra_product`` now also runs on ``write()`` of + ``product_qty``, ``product_id`` or ``price_unit``: previously it only + ran on ``create()`` and on the form's live ``onchange_order_line``, so + a quantity change saved through an inline list edit, an import or an + XML-RPC write left the extra line at its old quantity and price + (ticket #9275) + 19.0.1.2.0 ---------- diff --git a/deltatech_purchase_add_extra_line/static/description/index.html b/deltatech_purchase_add_extra_line/static/description/index.html index 989b8f480..1d1800c1c 100644 --- a/deltatech_purchase_add_extra_line/static/description/index.html +++ b/deltatech_purchase_add_extra_line/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_purchase_ubl/README.rst b/deltatech_purchase_ubl/README.rst index a45d64689..7f3e56a5e 100644 --- a/deltatech_purchase_ubl/README.rst +++ b/deltatech_purchase_ubl/README.rst @@ -68,6 +68,46 @@ Changelog Changelog ========= +[19.0.1.2.4] - 2026-08-20 +------------------------- + +Fixed +~~~~~ + +- **Bug**: ``depends`` listed ``purchase`` + ``stock`` separately, but + the module actually uses fields defined by their glue module + ``purchase_stock`` (``purchase.order.picking_ids``, + ``stock.picking.purchase_id``) in + ``_find_receipt``/``_validate_receipt_quantities``. ``purchase_stock`` + is ``auto_install=True``, and CI's test database init runs with + ``--skip-auto-install`` (Odoo ≥ 19) - so it was only ever getting + installed incidentally, when another module in the same CI shard + happened to declare it explicitly. ``depends`` now lists + ``purchase_stock`` directly instead of ``purchase`` + ``stock``. + +[19.0.1.2.3] - 2026-08-20 +------------------------- + +Fixed +~~~~~ + +- **Bug** (found via ticket #9287): auto-creating the vendor bill + whenever the source document identifies an invoice number (added in + 19.0.1.2.1) ran regardless of the purchase order's state. A + draft/unconfirmed order has ``qty_to_invoice = 0`` on every line + (``purchase_order_line._compute_qty_invoiced`` only computes a nonzero + value once the order is ``state == "purchase"``), so + ``action_create_invoice()`` still "succeeded" but produced a vendor + bill with every line at zero quantity/amount — a useless ghost + document. This hit the SPV auto-import flow, where a purchase order + can be created and attached to its XML before it is ever confirmed. + + - ``_process_invoice_data`` now skips vendor bill creation (logging + why) when the resolved order isn't confirmed yet + (``state not in ("purchase", "done")``), instead of silently + creating an empty bill. + - Added test ``test_vendor_bill_skipped_when_order_not_confirmed``. + [19.0.1.2.2] - 2026-07-18 ------------------------- diff --git a/deltatech_purchase_ubl/static/description/index.html b/deltatech_purchase_ubl/static/description/index.html index 9dc2a9169..d8af4f873 100644 --- a/deltatech_purchase_ubl/static/description/index.html +++ b/deltatech_purchase_ubl/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_queue_job/README.rst b/deltatech_queue_job/README.rst index e020642c2..4bcb5faff 100644 --- a/deltatech_queue_job/README.rst +++ b/deltatech_queue_job/README.rst @@ -194,6 +194,27 @@ Changelog Changelog ========= +19.0.1.4.0 +---------- + +- Fix: jobs cancelled through the dependency chain are now removed by + the autovacuum cron. ``Job.cancel_dependent_jobs()`` cancels them with + a raw SQL ``UPDATE queue_job SET state = ...`` that writes nothing + else, while ``queue.job.autovacuum()`` selects what to delete by + ``date_done`` or ``date_cancelled`` — so a job cancelled that way was + never collected, however long it sat there. A production instance had + 189.644 such jobs, 53% of the table and all of them + ``marketplace_write`` cancelled in chains during marketplace sync. + ``models/job_patch.py`` stamps ``date_cancelled`` right after the + chain cancellation (the query itself cannot be fixed at the source: it + is shared with ``enqueue_waiting()``, where a cancellation date would + be wrong). +- Imp: ``autovacuum()`` also removes terminal jobs left with no + completion date at all, keyed on ``date_created`` and on the same + per-channel ``removal_interval``. This collects what piled up before + the fix; jobs in ``failed`` state are never touched, they are the only + ones worth keeping for diagnosis. + 19.0.1.3.0 ---------- diff --git a/deltatech_queue_job/static/description/index.html b/deltatech_queue_job/static/description/index.html index 0cf5533cb..e760cee19 100644 --- a/deltatech_queue_job/static/description/index.html +++ b/deltatech_queue_job/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_sale_activity_report/README.rst b/deltatech_sale_activity_report/README.rst index b29f5a6f2..781060c19 100644 --- a/deltatech_sale_activity_report/README.rst +++ b/deltatech_sale_activity_report/README.rst @@ -33,6 +33,34 @@ Features: .. contents:: :local: +Changelog +========= + +19.0.1.1.0 (2026-08-15) +----------------------- + +**Fix** — jurnalul de activitate nu mai stochează conținutul câmpurilor +binare. + +Modificarea unui câmp binar al comenzii (eticheta AWB, semnătura) scria +în ``activity_log`` întregul conținut base64 al fișierului. Aceeași +problemă a umflat cu 1,7 GB baza unui client prin modulul echivalent +pentru transferuri; aici măsura este preventivă — la scara actuală +jurnalul comenzilor rămâne mic, dar ``sale.order`` are aceleași câmpuri +binare. + +Acum: + +- câmpurile binare sunt ignorate complet la jurnalizare — nici nu mai + sunt citite din filestore, deci scrierea pe comandă este și mai + rapidă; +- valorile de câmp jurnalizate sunt scurtate la 200 de caractere (2000 + pentru câmpurile x2many, descrise linie cu linie), cu marcarea + numărului de caractere tăiate; +- mesajele din chatter sunt scurtate la 2000 de caractere; +- jurnalul unei zile este plafonat la 64 kB, păstrând activitatea + recentă. + Bug Tracker =========== diff --git a/deltatech_sale_activity_report/static/description/index.html b/deltatech_sale_activity_report/static/description/index.html index 5ca3dc6b0..35754a253 100644 --- a/deltatech_sale_activity_report/static/description/index.html +++ b/deltatech_sale_activity_report/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_sale_commission/README.rst b/deltatech_sale_commission/README.rst index eccdc091f..f188954c9 100644 --- a/deltatech_sale_commission/README.rst +++ b/deltatech_sale_commission/README.rst @@ -45,6 +45,22 @@ Sale Commission .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.1.5.0 (2026-08-20) +----------------------- + +- ``account.move.line._check_sale_price`` now honours the company policy + ``res.company.sale_margin_check_mode`` from ``deltatech_sale_margin``. + It used to raise unconditionally, which meant a company allowed to + sell below cost would pass the sale order and then hit the wall at + invoicing — once the goods were already delivered. The constraint + still blocks in ``block`` mode, which stays the default. + Bug Tracker =========== diff --git a/deltatech_sale_commission/static/description/index.html b/deltatech_sale_commission/static/description/index.html index 7af241953..1abf10dd0 100644 --- a/deltatech_sale_commission/static/description/index.html +++ b/deltatech_sale_commission/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_sale_margin/README.rst b/deltatech_sale_margin/README.rst index 007e657e8..386cf3788 100644 --- a/deltatech_sale_margin/README.rst +++ b/deltatech_sale_margin/README.rst @@ -28,6 +28,22 @@ Sale Margin price - Warning/Error on sale order if sale price is below the purchase price + - Configurable reaction per company (Settings > Sales > Pricing): + block the sale, warn only, or no check. "Warn only" flags the line + and shows a banner without ever blocking - for businesses where + selling below cost is a routine part of the trade (perishable goods, + stock clearance, commercial gestures). + - The cost is compared in the unit of the sale order line, and the + comparison stays silent when the line unit and the product base unit + belong to different unit families - Odoo 19 converts any pair of + units by their absolute factors, so a wrong ``uom_id`` would + otherwise report every line as below cost. + +sale.margin_limit and sale.margin_limit_check_validate are configurable +from Settings > Sales. sale.margin_limit is the margin percentage below +which a line is reported: 0 reports only negative margins, a negative +value tolerates a loss of up to that percentage, a positive value also +reports thin but positive margins. sale.check_price_website - parmanetru pentru verificare pret pentru comenzile de pe website sale.margin_limit_check_validate - system @@ -40,6 +56,94 @@ draft sale orders) .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.1.2.0 (2026-08-20) +----------------------- + +- **New: the reaction to a below-cost sale is configurable per company** + — ``res.company.sale_margin_check_mode``, in Settings > Sales > + Pricing: + + - ``block`` (default, unchanged behaviour): the price cannot be saved + and the order cannot be confirmed, unless the user belongs to the + bypass groups; + - ``warn``: nothing is ever blocked. The line is flagged, the order + shows a banner saying it can still be confirmed, and confirming it + leaves a single note in the chatter; + - ``off``: no flag, no banner, no block. + + ``warn`` exists for businesses where selling below cost is a routine + part of the trade — perishable goods, stock clearance, commercial + gestures. Blocking there stops the daily work, while the actual need + is to make it visible and let the seller decide. Existing databases + keep the historical behaviour: the default is ``block`` and no + migration changes it. + +- **New: ``sale.order.line.margin_below_limit``** — the line is flagged + (orange row in the order lines) as soon as the seller leaves the price + field, which is where the decision is made. The flag is readable by + anyone: it says THAT the margin is under the limit, not what the cost + is, so it does not leak the cost to sellers who are not allowed to see + it. The figure stays on the native, group-restricted + ``margin_percent``. + +- **New: unit guard on the comparison.** ``purchase_price`` is brought + into the line unit by ``sale_margin`` / ``sale_stock_margin`` through + ``product_id.uom_id._compute_price(...)``. Odoo 19 removed the unit + category, so that multiplies by the absolute factors without checking + the family — the root of the kilogram hierarchy is the gram, so a cost + of 3.00 per Unit becomes 3000.00 per kg (measured, not assumed). A + product whose ``uom_id`` is wrong would therefore report EVERY line as + below cost and the warning would be dismissed as noise from day one. + The comparison now stays silent when the line unit and the product's + base unit belong to different families. New helper + ``uom.uom._dt_root_uom()``. + +- **New: the margin settings are reachable from the interface.** + ``sale.margin_limit`` and ``sale.margin_limit_check_validate`` existed + but were only reachable through System Parameters, so in practice + nobody configured them. They are now exposed in Settings > Sales, next + to the reaction mode. ``sale.margin_limit`` doubles as the warning + threshold: 0 reports only negative margins, a negative value tolerates + a loss of up to that percentage, a positive value also reports thin + but positive margins. + +- The onchange modal ("Do not sell below the purchase price") now only + appears in ``block`` mode. Where selling below cost is routine, a + modal on every line ends up being dismissed reflexively without being + read; the flagged row carries the same signal without interrupting. + +- In ``warn`` mode ``check_sale_price`` stays silent on purpose. It runs + on every ``write`` of a line, so the native ``message_post`` branch + produced one chatter entry per keystroke on the price. The decision is + now logged exactly once, on confirmation. + +- ``sale_stock_margin`` is now a declared dependency. It was already + pulled in by ``auto_install``, but the cost used by the check comes + from it (the real valuation of the delivery), so the behaviour should + not depend on install order. + +- **19 tests.** They run as an operator who is OUTSIDE the bypass + groups, with a dedicated test asserting that: running them as root or + admin proves nothing, since both belong to + ``group_sale_below_purchase_price`` and the native check would not + have blocked them either. Each mechanism was validated by sabotage — + forcing the mode back to ``block`` breaks 4 tests, removing the + chatter note or the banner wording breaks 2 more, disabling the unit + guard breaks 1. + +- Two pre-existing behaviours are now pinned down by tests, because they + are easy to misread: in ``block`` mode the block fires from + ``sale.order.line.write``, so an order created through the API with + inline lines and confirmed without touching a line is NOT blocked; + blocking on confirmation requires + ``sale.margin_limit_check_validate``. + Bug Tracker =========== diff --git a/deltatech_sale_margin/static/description/index.html b/deltatech_sale_margin/static/description/index.html index ea695c4bb..6ce104595 100644 --- a/deltatech_sale_margin/static/description/index.html +++ b/deltatech_sale_margin/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -388,10 +389,25 @@

uom_id would +otherwise report every line as below cost. -

sale.check_price_website - parmanetru pentru verificare pret pentru +

sale.margin_limit and sale.margin_limit_check_validate are configurable +from Settings > Sales. sale.margin_limit is the margin percentage below +which a line is reported: 0 reports only negative margins, a negative +value tolerates a loss of up to that percentage, a positive value also +reports thin but positive margins.

+

sale.check_price_website - parmanetru pentru verificare pret pentru comenzile de pe website sale.margin_limit_check_validate - system parameter - if set, the verificaion is made at order confirmation (users with no rights to sell below margin/purchase price can still create diff --git a/deltatech_sale_pallet/README.rst b/deltatech_sale_pallet/README.rst index 8aae38087..7bc624382 100644 --- a/deltatech_sale_pallet/README.rst +++ b/deltatech_sale_pallet/README.rst @@ -35,6 +35,20 @@ Features: .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.1.0.9 (2026-08-15) +----------------------- + +- Fix: added the missing ``stock`` dependency. The tests call + ``stock.quant._update_available_quantity()``, which passed only + because other addons installed alongside brought ``stock`` into the + database. + Bug Tracker =========== diff --git a/deltatech_sale_pallet/static/description/index.html b/deltatech_sale_pallet/static/description/index.html index 1f8c215a9..5b1e2601f 100644 --- a/deltatech_sale_pallet/static/description/index.html +++ b/deltatech_sale_pallet/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_sale_xls/README.rst b/deltatech_sale_xls/README.rst index ba3e70048..ad0c84fe3 100644 --- a/deltatech_sale_xls/README.rst +++ b/deltatech_sale_xls/README.rst @@ -35,6 +35,19 @@ Features .. contents:: :local: +Changelog +========= + +19.0.1.0.1 +---------- + +- [FIX] ``sale.order.line.load()`` raised ``AttributeError`` when + importing without ``default_order_id``/``active_id`` in context + (``fields.index`` is a list method, not a dict) +- [FIX] iterating over ``data`` while calling ``data.remove(record)`` + skipped the record right after a removed one, so some unmatched lines + silently passed validation + Bug Tracker =========== diff --git a/deltatech_sale_xls/static/description/index.html b/deltatech_sale_xls/static/description/index.html index 60bf6c9f7..549c0501f 100644 --- a/deltatech_sale_xls/static/description/index.html +++ b/deltatech_sale_xls/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_stock_inventory/README.rst b/deltatech_stock_inventory/README.rst index cd8a738a5..300536f5d 100644 --- a/deltatech_stock_inventory/README.rst +++ b/deltatech_stock_inventory/README.rst @@ -133,6 +133,17 @@ Usage Changelog ========= +19.0.2.7.3 (2026-08-15) +----------------------- + +- Imp: ``stock.inventory.line.partner_id`` is now indexed — a foreign + key to ``res_partner`` on a table that grows with every stock count. + Context: ``res_partner`` is referenced by ~158 foreign-key columns; on + a production database 77 of them had no index, so a single partner + deletion triggered sequential scans over 3.180 MB of tables. Deleting + 5.350 merged partner records took over 8 minutes without indexes and + 190 seconds with them, foreign keys left ENABLED. + 19.0.2.7.2 (2026-08-05) ----------------------- diff --git a/deltatech_stock_inventory/static/description/index.html b/deltatech_stock_inventory/static/description/index.html index cb6da2260..acf687f62 100644 --- a/deltatech_stock_inventory/static/description/index.html +++ b/deltatech_stock_inventory/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_stock_picking_activity_report/README.rst b/deltatech_stock_picking_activity_report/README.rst index 04264a582..10c7ca658 100644 --- a/deltatech_stock_picking_activity_report/README.rst +++ b/deltatech_stock_picking_activity_report/README.rst @@ -37,6 +37,33 @@ Features: .. contents:: :local: +Changelog +========= + +19.0.1.1.0 (2026-08-15) +----------------------- + +**Fix** — jurnalul de activitate nu mai stochează conținutul câmpurilor +binare. + +Modificarea unui câmp binar de pe transfer (eticheta AWB, semnătura) +scria în ``activity_log`` întregul conținut base64 al fișierului. Pe o +instanță de producție asta însemna o medie de 32 kB per înregistrare, cu +vârfuri de 1,7 MB, și circa 1,7 GB în baza de date la doar două luni de +activitate păstrată. + +Acum: + +- câmpurile binare sunt ignorate complet la jurnalizare — nici nu mai + sunt citite din filestore, deci scrierea pe transfer este și mai + rapidă; +- valorile de câmp jurnalizate sunt scurtate la 200 de caractere (2000 + pentru câmpurile x2many, descrise linie cu linie), cu marcarea + numărului de caractere tăiate; +- mesajele din chatter sunt scurtate la 2000 de caractere; +- jurnalul unei zile este plafonat la 64 kB, păstrând activitatea + recentă. + Bug Tracker =========== diff --git a/deltatech_stock_picking_activity_report/static/description/index.html b/deltatech_stock_picking_activity_report/static/description/index.html index 3e22b54d3..6c10b2647 100644 --- a/deltatech_stock_picking_activity_report/static/description/index.html +++ b/deltatech_stock_picking_activity_report/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_tc/README.rst b/deltatech_tc/README.rst index 3653a1b14..ade41c0b9 100644 --- a/deltatech_tc/README.rst +++ b/deltatech_tc/README.rst @@ -284,6 +284,14 @@ the feature module is installed. Changelog ========= +19.0.1.1.1 (2026-08-15) +----------------------- + +- Fix: added the missing ``bus`` dependency. The manual heartbeat + notification uses ``self.env["bus.bus"]._sendone()``, which is defined + in ``bus``. The module only worked when another addon in the same + database brought ``bus`` in. + 19.0.1.1.0 (2026-08-11) ----------------------- diff --git a/deltatech_tc/static/description/index.html b/deltatech_tc/static/description/index.html index f6c3f790e..1f66187a9 100644 --- a/deltatech_tc/static/description/index.html +++ b/deltatech_tc/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_test_system/README.rst b/deltatech_test_system/README.rst index 281ec50ba..174d6718c 100644 --- a/deltatech_test_system/README.rst +++ b/deltatech_test_system/README.rst @@ -29,6 +29,20 @@ Features: .. contents:: :local: +Changelog +========= + +Changelog +========= + +19.0.0.0.9 (2026-08-15) +----------------------- + +- Fix: added the missing ``base_setup`` dependency. The settings view + inherits ``base_setup.res_config_settings_view_form``, so installing + the module on a database without ``base_setup`` failed with + ``External ID not found``. + Bug Tracker =========== diff --git a/deltatech_test_system/static/description/index.html b/deltatech_test_system/static/description/index.html index b77dc15b7..bf3734d8d 100644 --- a/deltatech_test_system/static/description/index.html +++ b/deltatech_test_system/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { diff --git a/deltatech_website_searchbar/README.rst b/deltatech_website_searchbar/README.rst index e69de29bb..3175b1e94 100644 --- a/deltatech_website_searchbar/README.rst +++ b/deltatech_website_searchbar/README.rst @@ -0,0 +1,124 @@ +============================== +Website Searchbar Optimization +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:22f27ff08a9bef38b7bcd0dd086782573a6aab80590d62d537065007500d1c70 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/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 + :target: https://github.com/dhongu/deltatech/tree/19.0/deltatech_website_searchbar + :alt: dhongu/deltatech + +|badge1| |badge2| |badge3| + +Website Searchbar Optimization +============================== + +This module reduces the number of autocomplete requests sent to +``/website/snippet/autocomplete`` by applying two complementary +optimizations to the website search bar widget. + +Key Features +============ + +1. **Increased Debounce Delay**: + + - Increases the debounce delay from the default **400ms to 800ms**. + - The autocomplete request is triggered only after the user stops + typing for 800ms, reducing unnecessary intermediate requests. + +2. **Minimum Search Term Length**: + + - Adds a minimum term length check of **4 characters** before sending + any request. + - If the search term (after trimming whitespace) is shorter than 4 + characters, the autocomplete dropdown is cleared without making a + server request. + - This prevents requests for very short, non-specific terms that + would return too many results anyway. + +How It Works +============ + +The module patches the standard ``SearchBar`` public interaction from +``website`` using Odoo's ``patch()`` mechanism: + +- In ``setup()``, the ``t-on-input`` entry of ``dynamicContent`` is + replaced with a debounced handler using the new 800ms delay. +- In ``onInput()``, a length check is performed before calling + ``fetch()``. Terms shorter than 4 characters trigger only a local + ``render()`` call to clear the dropdown. + +Usage +===== + +Install the module and the optimizations are applied automatically to +all website search bars. No configuration is required. The constants +``MIN_SEARCH_TERM_LENGTH`` (4) and ``DEBOUNCE_DELAY`` (800ms) can be +adjusted directly in ``static/src/js/searchbar.esm.js`` if different +values are needed. + +**Table of contents** + +.. contents:: + :local: + +Changelog +========= + +19.0.1.0.0 (2026-08-14) +----------------------- + +- Migration to 19.0: the website search bar is no longer a + ``publicWidget`` (``@website/snippets/s_searchbar/000``), it is the + ``SearchBar`` public interaction + (``@website/snippets/s_searchbar/search_bar``). The override was + rewritten as a ``patch()`` on that interaction -- the debounce delay + is now set on the ``t-on-input`` entry of ``dynamicContent`` in + ``setup()``, and the minimum term length is checked in ``onInput()`` + against ``this.inputEl.value`` instead of the removed ``this.$input``. + Behaviour is unchanged: 800 ms debounce and no request under 4 + characters. + +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_website_searchbar/static/description/index.html b/deltatech_website_searchbar/static/description/index.html index a66b63d9f..5eae017b3 100644 --- a/deltatech_website_searchbar/static/description/index.html +++ b/deltatech_website_searchbar/static/description/index.html @@ -3,7 +3,7 @@ -eCommerce Sale Order status +Website Searchbar Optimization -

-

eCommerce Sale Order status

+
+
+ Odoo Partner  •  Terrabit +

Website Searchbar Optimization

+

Reduce autocomplete requests by increasing debounce and adding minimum term length

+
+ Odoo 19.0 + Online • Odoo.sh • On-premise + Optional support +
+
+
-

Mature dhongu/deltatech

-
    -
  • Features:
      -
    • Additional filters sales orders by status
    • +
      +

      This module reduces the number of autocomplete requests sent to +/website/snippet/autocomplete by applying two complementary +optimizations to the website search bar widget.

      +
      +
      +

      Key Features

      +
        +
      1. Increased Debounce Delay:
          +
        • Increases the debounce delay from the default 400ms to 800ms.
        • +
        • The autocomplete request is triggered only after the user stops +typing for 800ms, reducing unnecessary intermediate requests.
      2. -
    -

    Etape

    -
    -
      -
    • Plasată - comanda este plasată pe website de client
    • -
    • În procesare – comanda introdusă de operator
    • -
    • Așteaptă disponibilitate - nu sunt disponibile toate produsele
    • -
    • Amânată - livrarea a fost amânată
    • -
    • De livrat - produsele sunt disponibile și se poate face -livrarea
    • -
    • În livrare – produsele au fost predate la curier
    • -
    • Livrată - produsele au ajuns la client
    • -
    • Anulată - comanda de vânzare a fost anulată
    • -
    • Returnată - comanda a fost returnată de către client
    • -
    -
    -

    Table of contents

    -
    -
      -
    • Bug Tracker
    • -
    • Credits
        -
      • Authors
      • -
      • Maintainers
      • +
      • Minimum Search Term Length:
          +
        • Adds a minimum term length check of 4 characters before sending +any request.
        • +
        • If the search term (after trimming whitespace) is shorter than 4 +characters, the autocomplete dropdown is cleared without making a +server request.
        • +
        • This prevents requests for very short, non-specific terms that +would return too many results anyway.
      • + +
    +
    +

    How It Works

    +

    The module patches the standard SearchBar public interaction from +website using Odoo’s patch() mechanism:

    +
      +
    • In setup(), the t-on-input entry of dynamicContent is +replaced with a debounced handler using the new 800ms delay.
    • +
    • In onInput(), a length check is performed before calling +fetch(). Terms shorter than 4 characters trigger only a local +render() call to clear the dropdown.
    +
    +

    Usage

    +

    Install the module and the optimizations are applied automatically to +all website search bars. No configuration is required. The constants +MIN_SEARCH_TERM_LENGTH (4) and DEBOUNCE_DELAY (800ms) can be +adjusted directly in static/src/js/searchbar.esm.js if different +values are needed.

    +
    -

    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.

    +

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

    You are welcome to contribute.

    +
+
+
+

Need help getting started?

+

+ We are an Odoo partner building apps for the Romanian market (SAGA & WinMentor + export; Romanian accounting localization in progress). Direct support from the team + that built the module.

+ Contact Terrabit → +
+
TERRABIT
+
+ © Terrabit Solutions SRL  •  + terrabit.ro +  •  Odoo apps for Romania, Ireland & Moldova +
+
+
+