From c2f7b6ab5d5b1419e532cbb66953e90b060b59d9 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:38:07 +0100 Subject: [PATCH 01/24] [ADD] rental_base_extension Move Rental Positions screen from Configuration/Debug to the top-level Rentals menu, making it accessible to all sales users without needing debug mode. --- rental_base_extension/README.rst | 88 ++++ rental_base_extension/__init__.py | 0 rental_base_extension/__manifest__.py | 19 + rental_base_extension/readme/CONTRIBUTORS.rst | 3 + rental_base_extension/readme/DESCRIPTION.rst | 18 + .../static/description/icon.png | Bin 0 -> 6342 bytes .../static/description/index.html | 441 ++++++++++++++++++ rental_base_extension/views/sale_views.xml | 14 + .../odoo/addons/rental_base_extension | 1 + setup/rental_base_extension/setup.py | 6 + 10 files changed, 590 insertions(+) create mode 100644 rental_base_extension/README.rst create mode 100644 rental_base_extension/__init__.py create mode 100644 rental_base_extension/__manifest__.py create mode 100644 rental_base_extension/readme/CONTRIBUTORS.rst create mode 100644 rental_base_extension/readme/DESCRIPTION.rst create mode 100644 rental_base_extension/static/description/icon.png create mode 100644 rental_base_extension/static/description/index.html create mode 100644 rental_base_extension/views/sale_views.xml create mode 120000 setup/rental_base_extension/odoo/addons/rental_base_extension create mode 100644 setup/rental_base_extension/setup.py diff --git a/rental_base_extension/README.rst b/rental_base_extension/README.rst new file mode 100644 index 000000000..3cf8cad39 --- /dev/null +++ b/rental_base_extension/README.rst @@ -0,0 +1,88 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================== +Rental Base Extension +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:09ab96bf14c0b83294c077459048e953907a79975688866d7ca219537c451e41 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-nuobit%2Fodoo--addons-lightgray.png?logo=github + :target: https://github.com/nuobit/odoo-addons/tree/16.0/rental_base_extension + :alt: nuobit/odoo-addons + +|badge1| |badge2| |badge3| + +This module extends ``rental_base`` to improve the rental order experience +with better menu visibility and product filtering. + +Rental Positions menu +~~~~~~~~~~~~~~~~~~~~~ + +The ``rental_base`` module places the Rental Positions screen (the ``sale.rental`` +list) under Configuration and restricts it to debug mode. This module moves it +to the top level of the Rentals menu as the first entry, visible to all sales +users, since it is the primary screen for tracking rental status. + +Product filter on rental order lines +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When creating a rental order, the product dropdown on order lines only shows +rental service products (i.e. products linked to a rented physical product +via ``rented_product_id``). This prevents users from accidentally selecting +non-rental products on rental orders. + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* NuoBiT Solutions SL + +Contributors +~~~~~~~~~~~~ + +* `NuoBiT `__: + + * Eric Antones + +Maintainers +~~~~~~~~~~~ + +This module is part of the `nuobit/odoo-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/rental_base_extension/__init__.py b/rental_base_extension/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/rental_base_extension/__manifest__.py b/rental_base_extension/__manifest__.py new file mode 100644 index 000000000..056bfc846 --- /dev/null +++ b/rental_base_extension/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +{ + "name": "Rental Base Extension", + "summary": "Improves rental orders with menu visibility" " and product filtering.", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "category": "Rental", + "author": "NuoBiT Solutions SL", + "website": "https://github.com/nuobit/odoo-addons", + "license": "AGPL-3", + "depends": [ + "rental_base", + ], + "data": [ + "views/sale_views.xml", + ], +} diff --git a/rental_base_extension/readme/CONTRIBUTORS.rst b/rental_base_extension/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..866096fcb --- /dev/null +++ b/rental_base_extension/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `NuoBiT `__: + + * Eric Antones diff --git a/rental_base_extension/readme/DESCRIPTION.rst b/rental_base_extension/readme/DESCRIPTION.rst new file mode 100644 index 000000000..821335542 --- /dev/null +++ b/rental_base_extension/readme/DESCRIPTION.rst @@ -0,0 +1,18 @@ +This module extends ``rental_base`` to improve the rental order experience +with better menu visibility and product filtering. + +Rental Positions menu +~~~~~~~~~~~~~~~~~~~~~ + +The ``rental_base`` module places the Rental Positions screen (the ``sale.rental`` +list) under Configuration and restricts it to debug mode. This module moves it +to the top level of the Rentals menu as the first entry, visible to all sales +users, since it is the primary screen for tracking rental status. + +Product filter on rental order lines +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When creating a rental order, the product dropdown on order lines only shows +rental service products (i.e. products linked to a rented physical product +via ``rented_product_id``). This prevents users from accidentally selecting +non-rental products on rental orders. diff --git a/rental_base_extension/static/description/icon.png b/rental_base_extension/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd641e792c30455187ca30940bc0f329ce8bbb0 GIT binary patch literal 6342 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 literal 0 HcmV?d00001 diff --git a/rental_base_extension/static/description/index.html b/rental_base_extension/static/description/index.html new file mode 100644 index 000000000..05892bfe6 --- /dev/null +++ b/rental_base_extension/static/description/index.html @@ -0,0 +1,441 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Rental Base Extension

+ +

Alpha License: AGPL-3 nuobit/odoo-addons

+

This module extends rental_base to improve the rental order experience +with better menu visibility and product filtering.

+
+

Rental Positions menu

+

The rental_base module places the Rental Positions screen (the sale.rental +list) under Configuration and restricts it to debug mode. This module moves it +to the top level of the Rentals menu as the first entry, visible to all sales +users, since it is the primary screen for tracking rental status.

+
+
+

Product filter on rental order lines

+

When creating a rental order, the product dropdown on order lines only shows +rental service products (i.e. products linked to a rented physical product +via rented_product_id). This prevents users from accidentally selecting +non-rental products on rental orders.

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Bug Tracker

+

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

+

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

+
+ +
+
+

Authors

+
    +
  • NuoBiT Solutions SL
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the nuobit/odoo-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/rental_base_extension/views/sale_views.xml b/rental_base_extension/views/sale_views.xml new file mode 100644 index 000000000..f391c01d3 --- /dev/null +++ b/rental_base_extension/views/sale_views.xml @@ -0,0 +1,14 @@ + + + + + + + 1 + + + diff --git a/setup/rental_base_extension/odoo/addons/rental_base_extension b/setup/rental_base_extension/odoo/addons/rental_base_extension new file mode 120000 index 000000000..4df51e264 --- /dev/null +++ b/setup/rental_base_extension/odoo/addons/rental_base_extension @@ -0,0 +1 @@ +../../../../rental_base_extension \ No newline at end of file diff --git a/setup/rental_base_extension/setup.py b/setup/rental_base_extension/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/rental_base_extension/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 44ce76003100ee39f37dac68dff48a70ad47e6cd Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:38:34 +0100 Subject: [PATCH 02/24] [IMP] rental_base_extension: filter product dropdown on rental order lines Restrict the product selector on sale order lines to only show rental service products (those linked to a rented product via rented_product_id), preventing users from accidentally selecting non-rental products when creating rental orders. --- rental_base_extension/views/sale_views.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rental_base_extension/views/sale_views.xml b/rental_base_extension/views/sale_views.xml index f391c01d3..ca797872e 100644 --- a/rental_base_extension/views/sale_views.xml +++ b/rental_base_extension/views/sale_views.xml @@ -11,4 +11,24 @@ eval="[(6, 0, [ref('sales_team.group_sale_salesman')])]" /> + + + + rental_base_extension.view_order_form + sale.order + + + + + [('sale_ok', '=', True), + ('rented_product_id', '!=', False), + '|', ('company_id', '=', False), + ('company_id', '=', parent.company_id)] + + + + From eb0378a8f97f3d0e81fcce0e60a01a654b6664d9 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:38:53 +0100 Subject: [PATCH 03/24] [I18N] rental_base_extension: add Catalan and Spanish translations Provide complete ca.po and es.po translations covering all field labels, menus, messages and help texts for the rental_base module. --- rental_base_extension/README.rst | 6 + rental_base_extension/__manifest__.py | 3 +- rental_base_extension/i18n/ca.po | 641 +++++++++++++++++ rental_base_extension/i18n/es.po | 653 ++++++++++++++++++ rental_base_extension/readme/DESCRIPTION.rst | 6 + .../static/description/index.html | 5 + 6 files changed, 1313 insertions(+), 1 deletion(-) create mode 100644 rental_base_extension/i18n/ca.po create mode 100644 rental_base_extension/i18n/es.po diff --git a/rental_base_extension/README.rst b/rental_base_extension/README.rst index 3cf8cad39..f5a320ea6 100644 --- a/rental_base_extension/README.rst +++ b/rental_base_extension/README.rst @@ -45,6 +45,12 @@ rental service products (i.e. products linked to a rented physical product via ``rented_product_id``). This prevents users from accidentally selecting non-rental products on rental orders. +Catalan and Spanish translations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Provides Catalan and Spanish translations for ``rental_base``, which does not +ship with these languages. + .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. Only for development or testing purpose, do not use in production. diff --git a/rental_base_extension/__manifest__.py b/rental_base_extension/__manifest__.py index 056bfc846..9dc001fa3 100644 --- a/rental_base_extension/__manifest__.py +++ b/rental_base_extension/__manifest__.py @@ -3,7 +3,8 @@ { "name": "Rental Base Extension", - "summary": "Improves rental orders with menu visibility" " and product filtering.", + "summary": "Improves rental orders with menu visibility," + " product filtering and translations.", "version": "16.0.1.0.0", "development_status": "Alpha", "category": "Rental", diff --git a/rental_base_extension/i18n/ca.po b/rental_base_extension/i18n/ca.po new file mode 100644 index 000000000..148397fac --- /dev/null +++ b/rental_base_extension/i18n/ca.po @@ -0,0 +1,641 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * rental_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-09 11:00+0000\n" +"PO-Revision-Date: 2026-03-09 11:00+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"\n" +"Order: %(order)s\n" +"Line with product: '%(product)s'\n" +"\n" +"Please use instead the button 'Update Times' in the order to correctly update the order line's times, its timeline entry, contract and its stock moves and pickings as required." +msgstr "" +"\n" +"Comanda: %(order)s\n" +"Línia amb producte: '%(product)s'\n" +"\n" +"Si us plau, utilitzeu el botó 'Actualitzar temps' a la comanda per actualitzar correctament els temps de la línia de comanda, la seva entrada de cronologia, contracte i els seus moviments d'estoc i albarans segons sigui necessari." + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.sale_start_end_dates +msgid "" +msgstr "" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • %(name)s: %(start_date)s - %(end_date)s->%(date_start)s - " +"%(date_end)s
  • " +msgstr "" +"
  • %(name)s: %(start_date)s - %(end_date)s->%(date_start)s - " +"%(date_end)s
  • " + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • (All lines): %(default_start_date)s -%(default_end_date)s-> " +"%(date_start)s - %(date_end)s
  • " +msgstr "" +"
  • (Totes les línies): %(default_start_date)s -%(default_end_date)s-> " +"%(date_start)s - %(date_end)s
  • " + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • (Lines: %(from_line)s - %(to_line)s): %(default_start_date)s - " +"%(default_end_date)s -> %(date_start)s - %(date_end)s
  • " +msgstr "" +"
  • (Línies: %(from_line)s - %(to_line)s): %(default_start_date)s - " +"%(default_end_date)s -> %(date_start)s - %(date_end)s
  • " + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "&nbsp;" +msgstr "" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__all_line +msgid "All Lines" +msgstr "Totes les línies" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Attributes" +msgstr "Atributs" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "" +"By changing the start and end dates of order lines, the dates are also updated in the timeline,the related stock pickings and contracts, if available.\n" +" Attention: The ordered quantities are not updated!" +msgstr "" +"En canviar les dates d'inici i fi de les línies de comanda, les dates també s'actualitzen a la cronologia, als albarans d'estoc relacionats i als contractes, si estan disponibles.\n" +" Atenció: Les quantitats demanades no s'actualitzen!" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_product_product__rental +#: model:ir.model.fields,field_description:rental_base.field_product_template__rental +msgid "Can be Rent" +msgstr "Es pot llogar" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.rental_product_search_view +msgid "Can be Rented" +msgstr "Es pot llogar" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "Cancel" +msgstr "Cancel·la" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__change +msgid "Change" +msgstr "Canvi" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_config +msgid "Configuration" +msgstr "Configuració" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Configure your products with variants" +msgstr "Configura els teus productes amb variants" + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_orders +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_quotations +msgid "Create a new quotation, the first step of a new sale!" +msgstr "Crea un nou pressupost, el primer pas d'una nova venda!" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__create_uid +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__create_date +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_credit_notes +msgid "Customer Credit Notes" +msgstr "Notes de crèdit del client" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_invoices2 +msgid "Customer Invoices" +msgstr "Factures del client" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customers +#: model:ir.ui.menu,name:rental_base.menu_top_customer +msgid "Customers" +msgstr "Clients" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_end +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__date_end +msgid "Date End" +msgstr "Data de fi" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_in_line +msgid "Date In Line" +msgstr "Data a la línia" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_start +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__date_start +msgid "Date Start" +msgstr "Data d'inici" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Day(s)" +msgstr "Dia(es)" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order__default_end_date +msgid "Default End Date" +msgstr "Data de fi per defecte" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order__default_start_date +msgid "Default Start Date" +msgstr "Data d'inici per defecte" + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_sale_order_line__rental_qty_uom +msgid "Default unit of measure used for all stock operations." +msgstr "Unitat de mesura per defecte utilitzada per a totes les operacions d'estoc." + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.stock_picking_action_picking_type_in +#: model_terms:ir.actions.act_window,help:rental_base.stock_picking_action_picking_type_out +msgid "Define a new transfer" +msgstr "Defineix una nova transferència" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Delivered Rental Quantity" +msgstr "Quantitat de lloguer lliurada" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery +msgid "Delivery" +msgstr "Lliurament" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Description" +msgstr "Descripció" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_update_sale_line_date_line +msgid "Details for updating sale order line dates" +msgstr "Detalls per actualitzar les dates de les línies de comanda de venda" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__display_name +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__display_name +msgid "Display Name" +msgstr "Nom per mostrar" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__end_date +msgid "End Date" +msgstr "Data de fi" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__from_line +msgid "From" +msgstr "Des de" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__id +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__id +msgid "ID" +msgstr "ID" + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__all_line +msgid "" +"If set, all order lines of this order are updated with the given dates." +msgstr "" +"Si s'activa, totes les línies de comanda d'aquesta comanda s'actualitzen amb les dates indicades." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__date_in_line +msgid "If set, you can set an individual date in every selected position." +msgstr "Si s'activa, es pot establir una data individual a cada posició seleccionada." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__from_line +msgid "" +"In order to update one or several order lines, please set a number referring" +" to the first order line that should to be changed." +msgstr "" +"Per actualitzar una o diverses línies de comanda, si us plau indiqueu un número que faci referència a la primera línia de comanda que s'ha de canviar." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__to_line +msgid "" +"In order to update one or several order lines, please set a number referring" +" to the last order line that should to be changed." +msgstr "" +"Per actualitzar una o diverses línies de comanda, si us plau indiqueu un número que faci referència a l'última línia de comanda que s'ha de canviar." + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.stock_picking_action_picking_type_in +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery_incoming +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery_incoming +msgid "Incoming Deliveries" +msgstr "Lliuraments entrants" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Incoming shipment is in state %s. You cannot change the end date anymore." +msgstr "" +"L'enviament entrant està en estat %s. Ja no podeu canviar la data de fi." + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Invoiced Rental Time" +msgstr "Temps de lloguer facturat" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_invoices +#: model:ir.ui.menu,name:rental_base.menu_vendor_invoices +msgid "Invoices" +msgstr "Factures" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Invoicing" +msgstr "Facturació" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date____last_update +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line____last_update +msgid "Last Modified on" +msgstr "Última modificació el" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__write_uid +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__write_uid +msgid "Last Updated by" +msgstr "Última actualització per" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__write_date +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__write_date +msgid "Last Updated on" +msgstr "Última actualització el" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Missing \"Rental to Extend\" on the sale order line with rental service " +"%(name)s." +msgstr "" +"Falta \"Lloguer a estendre\" a la línia de comanda de venda amb servei de lloguer %(name)s." + +#. module: rental_base +#: model:uom.uom,name:rental_base.product_uom_month +msgid "Month(s)" +msgstr "Mes(os)" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the \"new rental\" sale order line with product \"%(name)s\", we should " +"have a rental service product!" +msgstr "" +"A la línia de comanda de venda de \"nou lloguer\" amb producte \"%(name)s\", hauria d'haver-hi un producte de servei de lloguer!" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the sale order line with product %(name)s you are trying to sell a rented" +" product with a quantity (%(qty)s) that is different from the rented " +"quantity (%(sell_rental_qty)s). This is not supported." +msgstr "" +"A la línia de comanda de venda amb producte %(name)s esteu intentant vendre un producte llogat amb una quantitat (%(qty)s) diferent de la quantitat llogada (%(sell_rental_qty)s). Això no és compatible." + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the sale order line with rental service %(name)s ,you are trying to " +"extend a rental with a rental quantity (%(rental_qty)s) that is different " +"from the quantity of the original rental (%(ext_rental_qty)s). This is not " +"supported." +msgstr "" +"A la línia de comanda de venda amb servei de lloguer %(name)s, esteu intentant estendre un lloguer amb una quantitat de lloguer (%(rental_qty)s) diferent de la quantitat del lloguer original (%(ext_rental_qty)s). Això no és compatible." + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_orders +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_quotations +msgid "" +"Once the quotation is confirmed, it becomes a sales order.
    You will be " +"able to create an invoice and collect the payment." +msgstr "" +"Un cop confirmat el pressupost, es converteix en una comanda de venda.
    Podreu crear una factura i cobrar el pagament." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__order_id +msgid "Order" +msgstr "Comanda" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Information" +msgstr "Informació de la comanda" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__order_line_id +msgid "Order Line" +msgstr "Línia de comanda" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Reference" +msgstr "Referència de la comanda" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Type" +msgstr "Tipus de comanda" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Ordered Rental Time" +msgstr "Temps de lloguer demanat" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_orders +msgid "Orders" +msgstr "Comandes" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.stock_picking_action_picking_type_out +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery_outgoing +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery_outgoing +msgid "Outgoing Deliveries" +msgstr "Lliuraments sortints" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Outgoing shipment is in state %(state)s. You cannot change the start date " +"anymore." +msgstr "" +"L'enviament sortint està en estat %(state)s. Ja no podeu canviar la data d'inici." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__line_ids +msgid "Positions" +msgstr "Posicions" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_product_template +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__product_id +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Product" +msgstr "Producte" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__rental_qty_uom +msgid "Product Unit of Measure" +msgstr "Unitat de mesura del producte" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_product_product +msgid "Product Variant" +msgstr "Variant de producte" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.view_rental_product_action +msgid "Product Variants" +msgstr "Variants de producte" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_config_products +#: model:ir.ui.menu,name:rental_base.menu_master_data +#: model:ir.ui.menu,name:rental_base.menu_products +msgid "Products" +msgstr "Productes" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_quotations +msgid "Quotations" +msgstr "Pressupostos" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__rental +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Rental" +msgstr "Lloguer" + +#. module: rental_base +#: model:sale.order.type,name:rental_base.rental_sale_type +msgid "Rental Order" +msgstr "Comanda de lloguer" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_orders +#: model:ir.ui.menu,name:rental_base.menu_rental_orders +msgid "Rental Orders" +msgstr "Comandes de lloguer" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_rental_positions +msgid "Rental Positions" +msgstr "Posicions de lloguer" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Quantity" +msgstr "Quantitat de lloguer" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_quotations +#: model:ir.ui.menu,name:rental_base.menu_rental_quotations +msgid "Rental Quotations" +msgstr "Pressupostos de lloguer" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Settings" +msgstr "Configuració de lloguer" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Time Unit" +msgstr "Unitat de temps de lloguer" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Times" +msgstr "Temps de lloguer" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_rental_root +msgid "Rentals" +msgstr "Lloguers" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_sale_order +msgid "Sales Order" +msgstr "Comanda de venda" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línia de comanda de venda" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_ir_sequence +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__sequence +msgid "Sequence" +msgstr "Seqüència" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.sale_start_end_dates +msgid "Service Period" +msgstr "Període de servei" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_configuration +#: model:ir.ui.menu,name:rental_base.menu_settings +msgid "Settings" +msgstr "Configuració" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__start_date +msgid "Start Date" +msgstr "Data d'inici" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "The value in 'To' is less then the value in 'From'." +msgstr "El valor de 'Fins a' és inferior al valor de 'Des de'." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__to_line +msgid "To" +msgstr "Fins a" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Transport" +msgstr "Transport" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "Update" +msgstr "Actualitza" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "Update Date of Sale Order Lines" +msgstr "Actualitzar data de les línies de comanda de venda" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_update_sale_line_date +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Update Times" +msgstr "Actualitzar temps" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_vendor_bills +msgid "Vendor Bills" +msgstr "Factures de proveïdor" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_vendor_credit_notes +msgid "Vendor Credit Notes" +msgstr "Notes de crèdit del proveïdor" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_top_vendor +#: model:ir.ui.menu,name:rental_base.menu_vendors +msgid "Vendors" +msgstr "Proveïdors" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__wizard_id +msgid "Wizard" +msgstr "Assistent" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_update_sale_line_date +msgid "Wizard for updating sale order line dates" +msgstr "Assistent per actualitzar les dates de les línies de comanda de venda" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"You are not allowed to change the 'end date' in an order line of a confirmed" +" order." +msgstr "" +"No teniu permís per canviar la 'data de fi' a una línia de comanda d'una comanda confirmada." + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"You are not allowed to change the 'start date' in an order line of a " +"confirmed order." +msgstr "" +"No teniu permís per canviar la 'data d'inici' a una línia de comanda d'una comanda confirmada." diff --git a/rental_base_extension/i18n/es.po b/rental_base_extension/i18n/es.po new file mode 100644 index 000000000..4019ef344 --- /dev/null +++ b/rental_base_extension/i18n/es.po @@ -0,0 +1,653 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * rental_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-09 11:00+0000\n" +"PO-Revision-Date: 2026-03-09 11:00+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"\n" +"Order: %(order)s\n" +"Line with product: '%(product)s'\n" +"\n" +"Please use instead the button 'Update Times' in the order to correctly update the order line's times, its timeline entry, contract and its stock moves and pickings as required." +msgstr "" +"\n" +"Pedido: %(order)s\n" +"Línea con producto: '%(product)s'\n" +"\n" +"Por favor, utilice el botón 'Actualizar tiempos' en el pedido para actualizar correctamente los tiempos de la línea de pedido, su entrada de cronología, contrato y sus movimientos de stock y albaranes según sea necesario." + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.sale_start_end_dates +msgid "" +msgstr "" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • %(name)s: %(start_date)s - %(end_date)s->%(date_start)s - " +"%(date_end)s
  • " +msgstr "" +"
  • %(name)s: %(start_date)s - %(end_date)s->%(date_start)s - " +"%(date_end)s
  • " + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • (All lines): %(default_start_date)s -%(default_end_date)s-> " +"%(date_start)s - %(date_end)s
  • " +msgstr "" +"
  • (Todas las líneas): %(default_start_date)s -%(default_end_date)s-> " +"%(date_start)s - %(date_end)s
  • " + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "" +"
  • (Lines: %(from_line)s - %(to_line)s): %(default_start_date)s - " +"%(default_end_date)s -> %(date_start)s - %(date_end)s
  • " +msgstr "" +"
  • (Líneas: %(from_line)s - %(to_line)s): %(default_start_date)s - " +"%(default_end_date)s -> %(date_start)s - %(date_end)s
  • " + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "&nbsp;" +msgstr "" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__all_line +msgid "All Lines" +msgstr "Todas las líneas" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Attributes" +msgstr "Atributos" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "" +"By changing the start and end dates of order lines, the dates are also updated in the timeline,the related stock pickings and contracts, if available.\n" +" Attention: The ordered quantities are not updated!" +msgstr "" +"Al cambiar las fechas de inicio y fin de las líneas de pedido, las fechas también se actualizan en la cronología, los albaranes de stock relacionados y los contratos, si están disponibles.\n" +" Atención: ¡Las cantidades pedidas no se actualizan!" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_product_product__rental +#: model:ir.model.fields,field_description:rental_base.field_product_template__rental +msgid "Can be Rent" +msgstr "Se puede alquilar" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.rental_product_search_view +msgid "Can be Rented" +msgstr "Se puede alquilar" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__change +msgid "Change" +msgstr "Cambio" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_config +msgid "Configuration" +msgstr "Configuración" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Configure your products with variants" +msgstr "Configure sus productos con variantes" + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_orders +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_quotations +msgid "Create a new quotation, the first step of a new sale!" +msgstr "¡Cree un nuevo presupuesto, el primer paso de una nueva venta!" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__create_uid +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__create_date +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_credit_notes +msgid "Customer Credit Notes" +msgstr "Notas de crédito del cliente" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_invoices2 +msgid "Customer Invoices" +msgstr "Facturas del cliente" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customers +#: model:ir.ui.menu,name:rental_base.menu_top_customer +msgid "Customers" +msgstr "Clientes" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_end +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__date_end +msgid "Date End" +msgstr "Fecha de fin" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_in_line +msgid "Date In Line" +msgstr "Fecha en la línea" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__date_start +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__date_start +msgid "Date Start" +msgstr "Fecha de inicio" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Day(s)" +msgstr "Día(s)" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order__default_end_date +msgid "Default End Date" +msgstr "Fecha de fin por defecto" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order__default_start_date +msgid "Default Start Date" +msgstr "Fecha de inicio por defecto" + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_sale_order_line__rental_qty_uom +msgid "Default unit of measure used for all stock operations." +msgstr "Unidad de medida por defecto utilizada para todas las operaciones de stock." + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.stock_picking_action_picking_type_in +#: model_terms:ir.actions.act_window,help:rental_base.stock_picking_action_picking_type_out +msgid "Define a new transfer" +msgstr "Defina una nueva transferencia" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Delivered Rental Quantity" +msgstr "Cantidad de alquiler entregada" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery +msgid "Delivery" +msgstr "Entrega" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Description" +msgstr "Descripción" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_update_sale_line_date_line +msgid "Details for updating sale order line dates" +msgstr "Detalles para actualizar las fechas de las líneas de pedido de venta" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__display_name +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__end_date +msgid "End Date" +msgstr "Fecha de fin" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__from_line +msgid "From" +msgstr "Desde" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__id +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__id +msgid "ID" +msgstr "ID" + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__all_line +msgid "" +"If set, all order lines of this order are updated with the given dates." +msgstr "" +"Si se activa, todas las líneas del pedido se actualizan con las fechas indicadas." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__date_in_line +msgid "If set, you can set an individual date in every selected position." +msgstr "Si se activa, puede establecer una fecha individual en cada posición seleccionada." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__from_line +msgid "" +"In order to update one or several order lines, please set a number referring" +" to the first order line that should to be changed." +msgstr "" +"Para actualizar una o varias líneas de pedido, indique un número que haga " +"referencia a la primera línea de pedido que debe modificarse." + +#. module: rental_base +#: model:ir.model.fields,help:rental_base.field_update_sale_line_date__to_line +msgid "" +"In order to update one or several order lines, please set a number referring" +" to the last order line that should to be changed." +msgstr "" +"Para actualizar una o varias líneas de pedido, indique un número que haga " +"referencia a la última línea de pedido que debe modificarse." + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.stock_picking_action_picking_type_in +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery_incoming +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery_incoming +msgid "Incoming Deliveries" +msgstr "Entregas entrantes" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Incoming shipment is in state %s. You cannot change the end date anymore." +msgstr "" +"El envío entrante está en estado %s. Ya no puede cambiar la fecha de fin." + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Invoiced Rental Time" +msgstr "Tiempo de alquiler facturado" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_invoices +#: model:ir.ui.menu,name:rental_base.menu_vendor_invoices +msgid "Invoices" +msgstr "Facturas" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Invoicing" +msgstr "Facturación" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date____last_update +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__write_uid +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__write_date +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Missing \"Rental to Extend\" on the sale order line with rental service " +"%(name)s." +msgstr "" +"Falta \"Alquiler a extender\" en la línea de pedido de venta con servicio de alquiler " +"%(name)s." + +#. module: rental_base +#: model:uom.uom,name:rental_base.product_uom_month +msgid "Month(s)" +msgstr "Mes(es)" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the \"new rental\" sale order line with product \"%(name)s\", we should " +"have a rental service product!" +msgstr "" +"En la línea de pedido de venta de \"nuevo alquiler\" con producto \"%(name)s\", " +"¡debería haber un producto de servicio de alquiler!" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the sale order line with product %(name)s you are trying to sell a rented" +" product with a quantity (%(qty)s) that is different from the rented " +"quantity (%(sell_rental_qty)s). This is not supported." +msgstr "" +"En la línea de pedido de venta con producto %(name)s está intentando vender un " +"producto alquilado con una cantidad (%(qty)s) diferente de la cantidad " +"alquilada (%(sell_rental_qty)s). Esto no está soportado." + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"On the sale order line with rental service %(name)s ,you are trying to " +"extend a rental with a rental quantity (%(rental_qty)s) that is different " +"from the quantity of the original rental (%(ext_rental_qty)s). This is not " +"supported." +msgstr "" +"En la línea de pedido de venta con servicio de alquiler %(name)s, está intentando " +"extender un alquiler con una cantidad de alquiler (%(rental_qty)s) diferente " +"de la cantidad del alquiler original (%(ext_rental_qty)s). Esto no está " +"soportado." + +#. module: rental_base +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_orders +#: model_terms:ir.actions.act_window,help:rental_base.action_rental_quotations +msgid "" +"Once the quotation is confirmed, it becomes a sales order.
    You will be " +"able to create an invoice and collect the payment." +msgstr "" +"Una vez confirmado el presupuesto, se convierte en un pedido de venta.
    Podrá " +"crear una factura y cobrar el pago." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__order_id +msgid "Order" +msgstr "Pedido" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Information" +msgstr "Información del pedido" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__order_line_id +msgid "Order Line" +msgstr "Línea de pedido" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Reference" +msgstr "Referencia del pedido" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Order Type" +msgstr "Tipo de pedido" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Ordered Rental Time" +msgstr "Tiempo de alquiler pedido" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_orders +msgid "Orders" +msgstr "Pedidos" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.stock_picking_action_picking_type_out +#: model:ir.ui.menu,name:rental_base.menu_customer_delivery_outgoing +#: model:ir.ui.menu,name:rental_base.menu_vendor_delivery_outgoing +msgid "Outgoing Deliveries" +msgstr "Entregas salientes" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"Outgoing shipment is in state %(state)s. You cannot change the start date " +"anymore." +msgstr "" +"El envío saliente está en estado %(state)s. Ya no puede cambiar la fecha de inicio." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__line_ids +msgid "Positions" +msgstr "Posiciones" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_product_template +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__product_id +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Product" +msgstr "Producto" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__rental_qty_uom +msgid "Product Unit of Measure" +msgstr "Unidad de medida del producto" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_product_product +msgid "Product Variant" +msgstr "Variante de producto" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.view_rental_product_action +msgid "Product Variants" +msgstr "Variantes de producto" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_config_products +#: model:ir.ui.menu,name:rental_base.menu_master_data +#: model:ir.ui.menu,name:rental_base.menu_products +msgid "Products" +msgstr "Productos" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_customer_quotations +msgid "Quotations" +msgstr "Presupuestos" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__rental +#: model_terms:ir.ui.view,arch_db:rental_base.res_config_settings_view_form +msgid "Rental" +msgstr "Alquiler" + +#. module: rental_base +#: model:sale.order.type,name:rental_base.rental_sale_type +msgid "Rental Order" +msgstr "Pedido de alquiler" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_orders +#: model:ir.ui.menu,name:rental_base.menu_rental_orders +msgid "Rental Orders" +msgstr "Pedidos de alquiler" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_rental_positions +msgid "Rental Positions" +msgstr "Posiciones de alquiler" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Quantity" +msgstr "Cantidad de alquiler" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_quotations +#: model:ir.ui.menu,name:rental_base.menu_rental_quotations +msgid "Rental Quotations" +msgstr "Presupuestos de alquiler" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Settings" +msgstr "Configuración de alquiler" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Time Unit" +msgstr "Unidad de tiempo de alquiler" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Rental Times" +msgstr "Tiempos de alquiler" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_rental_root +msgid "Rentals" +msgstr "Alquileres" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_sale_order +msgid "Sales Order" +msgstr "Pedido de venta" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de pedido de venta" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_ir_sequence +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.sale_start_end_dates +msgid "Service Period" +msgstr "Período de servicio" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_rental_configuration +#: model:ir.ui.menu,name:rental_base.menu_settings +msgid "Settings" +msgstr "Configuración" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_sale_order_line__start_date +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "The value in 'To' is less then the value in 'From'." +msgstr "El valor de 'Hasta' es inferior al valor de 'Desde'." + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date__to_line +msgid "To" +msgstr "Hasta" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Transport" +msgstr "Transporte" + +#. module: rental_base +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +msgid "Update" +msgstr "Actualizar" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/wizard/update_sale_line_date.py:0 +#, python-format +msgid "Update Date of Sale Order Lines" +msgstr "Actualizar fecha de las líneas de pedido de venta" + +#. module: rental_base +#: model:ir.actions.act_window,name:rental_base.action_update_sale_line_date +#: model_terms:ir.ui.view,arch_db:rental_base.update_sale_line_date_form +#: model_terms:ir.ui.view,arch_db:rental_base.view_order_form +msgid "Update Times" +msgstr "Actualizar tiempos" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_vendor_bills +msgid "Vendor Bills" +msgstr "Facturas de proveedor" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_vendor_credit_notes +msgid "Vendor Credit Notes" +msgstr "Notas de crédito del proveedor" + +#. module: rental_base +#: model:ir.ui.menu,name:rental_base.menu_top_vendor +#: model:ir.ui.menu,name:rental_base.menu_vendors +msgid "Vendors" +msgstr "Proveedores" + +#. module: rental_base +#: model:ir.model.fields,field_description:rental_base.field_update_sale_line_date_line__wizard_id +msgid "Wizard" +msgstr "Asistente" + +#. module: rental_base +#: model:ir.model,name:rental_base.model_update_sale_line_date +msgid "Wizard for updating sale order line dates" +msgstr "Asistente para actualizar las fechas de las líneas de pedido de venta" + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"You are not allowed to change the 'end date' in an order line of a confirmed" +" order." +msgstr "" +"No tiene permiso para cambiar la 'fecha de fin' en una línea de pedido de un pedido " +"confirmado." + +#. module: rental_base +#. odoo-python +#: code:addons/rental_base/models/sale.py:0 +#, python-format +msgid "" +"You are not allowed to change the 'start date' in an order line of a " +"confirmed order." +msgstr "" +"No tiene permiso para cambiar la 'fecha de inicio' en una línea de pedido de un " +"pedido confirmado." diff --git a/rental_base_extension/readme/DESCRIPTION.rst b/rental_base_extension/readme/DESCRIPTION.rst index 821335542..965535953 100644 --- a/rental_base_extension/readme/DESCRIPTION.rst +++ b/rental_base_extension/readme/DESCRIPTION.rst @@ -16,3 +16,9 @@ When creating a rental order, the product dropdown on order lines only shows rental service products (i.e. products linked to a rented physical product via ``rented_product_id``). This prevents users from accidentally selecting non-rental products on rental orders. + +Catalan and Spanish translations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Provides Catalan and Spanish translations for ``rental_base``, which does not +ship with these languages. diff --git a/rental_base_extension/static/description/index.html b/rental_base_extension/static/description/index.html index 05892bfe6..dad4f9149 100644 --- a/rental_base_extension/static/description/index.html +++ b/rental_base_extension/static/description/index.html @@ -390,6 +390,11 @@

    Product filter on rental order lines

    rental service products (i.e. products linked to a rented physical product via rented_product_id). This prevents users from accidentally selecting non-rental products on rental orders.

    + +
    +

    Catalan and Spanish translations

    +

    Provides Catalan and Spanish translations for rental_base, which does not +ship with these languages.

    Important

    This is an alpha version, the data model and design can change at any time without warning. From 7dbb7898f1a9df09714474f314dad3da063411dc Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:39:23 +0100 Subject: [PATCH 04/24] [ADD] sale_rental_extension Add kanban and calendar views for rental positions with state badges, partner avatar with image zoom on hover, "Today" filter and state searchpanel. Include SCSS fix to prevent zoom popup flickering by disabling pointer-events on the popover overlay. --- sale_rental_extension/README.rst | 74 +++ sale_rental_extension/__init__.py | 0 sale_rental_extension/__manifest__.py | 24 + sale_rental_extension/readme/CONTRIBUTORS.rst | 3 + sale_rental_extension/readme/DESCRIPTION.rst | 4 + .../static/description/icon.png | Bin 0 -> 6342 bytes .../static/description/index.html | 435 ++++++++++++++++++ .../static/src/scss/sale_rental_kanban.scss | 9 + .../views/sale_rental_views.xml | 136 ++++++ .../odoo/addons/sale_rental_extension | 1 + setup/sale_rental_extension/setup.py | 6 + 11 files changed, 692 insertions(+) create mode 100644 sale_rental_extension/README.rst create mode 100644 sale_rental_extension/__init__.py create mode 100644 sale_rental_extension/__manifest__.py create mode 100644 sale_rental_extension/readme/CONTRIBUTORS.rst create mode 100644 sale_rental_extension/readme/DESCRIPTION.rst create mode 100644 sale_rental_extension/static/description/icon.png create mode 100644 sale_rental_extension/static/description/index.html create mode 100644 sale_rental_extension/static/src/scss/sale_rental_kanban.scss create mode 100644 sale_rental_extension/views/sale_rental_views.xml create mode 120000 setup/sale_rental_extension/odoo/addons/sale_rental_extension create mode 100644 setup/sale_rental_extension/setup.py diff --git a/sale_rental_extension/README.rst b/sale_rental_extension/README.rst new file mode 100644 index 000000000..2542356f8 --- /dev/null +++ b/sale_rental_extension/README.rst @@ -0,0 +1,74 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================== +Sale Rental Extension +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a061c711656169d5bfe7ac7cc5c6a265d3ca9e40db2a9b3057aaef7d3fe85978 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-nuobit%2Fodoo--addons-lightgray.png?logo=github + :target: https://github.com/nuobit/odoo-addons/tree/16.0/sale_rental_extension + :alt: nuobit/odoo-addons + +|badge1| |badge2| |badge3| + +This module extends ``sale_rental`` to improve the rental positions experience: + +* Kanban and calendar views for the Rental Positions screen +* Searchpanel with state filter and "Today" filter + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* NuoBiT Solutions SL + +Contributors +~~~~~~~~~~~~ + +* `NuoBiT `__: + + * Eric Antones + +Maintainers +~~~~~~~~~~~ + +This module is part of the `nuobit/odoo-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/sale_rental_extension/__init__.py b/sale_rental_extension/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sale_rental_extension/__manifest__.py b/sale_rental_extension/__manifest__.py new file mode 100644 index 000000000..54538d25e --- /dev/null +++ b/sale_rental_extension/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +{ + "name": "Sale Rental Extension", + "summary": "Adds kanban view, calendar and filters for rental positions.", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "category": "Rental", + "author": "NuoBiT Solutions SL", + "website": "https://github.com/nuobit/odoo-addons", + "license": "AGPL-3", + "depends": [ + "sale_rental", + ], + "data": [ + "views/sale_rental_views.xml", + ], + "assets": { + "web.assets_backend": [ + "sale_rental_extension/static/src/scss/sale_rental_kanban.scss", + ], + }, +} diff --git a/sale_rental_extension/readme/CONTRIBUTORS.rst b/sale_rental_extension/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..866096fcb --- /dev/null +++ b/sale_rental_extension/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `NuoBiT `__: + + * Eric Antones diff --git a/sale_rental_extension/readme/DESCRIPTION.rst b/sale_rental_extension/readme/DESCRIPTION.rst new file mode 100644 index 000000000..647829b09 --- /dev/null +++ b/sale_rental_extension/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module extends ``sale_rental`` to improve the rental positions experience: + +* Kanban and calendar views for the Rental Positions screen +* Searchpanel with state filter and "Today" filter diff --git a/sale_rental_extension/static/description/icon.png b/sale_rental_extension/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd641e792c30455187ca30940bc0f329ce8bbb0 GIT binary patch literal 6342 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 literal 0 HcmV?d00001 diff --git a/sale_rental_extension/static/description/index.html b/sale_rental_extension/static/description/index.html new file mode 100644 index 000000000..32bff4f8f --- /dev/null +++ b/sale_rental_extension/static/description/index.html @@ -0,0 +1,435 @@ + + + + + +README.rst + + + +

    + + + +Odoo Community Association + +
    +

    Sale Rental Extension

    + +

    Alpha License: AGPL-3 nuobit/odoo-addons

    +

    This module extends sale_rental to improve the rental positions experience:

    +
      +
    • Kanban and calendar views for the Rental Positions screen
    • +
    • Searchpanel with state filter and “Today” filter
    • +
    +
    +

    Important

    +

    This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

    +
    +

    Table of contents

    + +
    +

    Bug Tracker

    +

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

    +

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

    +
    +
    +

    Credits

    +
    +

    Authors

    +
      +
    • NuoBiT Solutions SL
    • +
    +
    +
    +

    Contributors

    + +
    +
    +

    Maintainers

    +

    This module is part of the nuobit/odoo-addons project on GitHub.

    +

    You are welcome to contribute.

    +
    +
    +
    +
    + + diff --git a/sale_rental_extension/static/src/scss/sale_rental_kanban.scss b/sale_rental_extension/static/src/scss/sale_rental_kanban.scss new file mode 100644 index 000000000..3475c2e29 --- /dev/null +++ b/sale_rental_extension/static/src/scss/sale_rental_kanban.scss @@ -0,0 +1,9 @@ +// Copyright 2026 NuoBiT Solutions SL - Eric Antones +// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +// Prevent the image zoom popup from capturing mouse events. +// Without this, hovering over a small thumbnail causes flickering: +// mouse enters popup → leaves thumbnail → popup closes → loop. +.o_popover:has(.o_image_zoom) { + pointer-events: none; +} diff --git a/sale_rental_extension/views/sale_rental_views.xml b/sale_rental_extension/views/sale_rental_views.xml new file mode 100644 index 000000000..270e001c8 --- /dev/null +++ b/sale_rental_extension/views/sale_rental_views.xml @@ -0,0 +1,136 @@ + + + + + sale.rental.view.kanban + sale.rental + + + + + + + + + + + + +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    + +
    + + + + + ud. + +
    +
    +
    +
    + + + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + sale.rental.view.calendar + sale.rental + + + + + + + + + + + + + sale.rental.search.inherit.sale_rental_extension + sale.rental + + + + + + + + + + + + + + + + + tree,kanban,calendar,form,pivot + +
    diff --git a/setup/sale_rental_extension/odoo/addons/sale_rental_extension b/setup/sale_rental_extension/odoo/addons/sale_rental_extension new file mode 120000 index 000000000..c1ec61d86 --- /dev/null +++ b/setup/sale_rental_extension/odoo/addons/sale_rental_extension @@ -0,0 +1 @@ +../../../../sale_rental_extension \ No newline at end of file diff --git a/setup/sale_rental_extension/setup.py b/setup/sale_rental_extension/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/sale_rental_extension/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 660570fe923c6f05469f5195af83e4d133cde164 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:44:39 +0100 Subject: [PATCH 05/24] [IMP] sale_rental_extension: add configurable signature for rental deliveries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add configurable rental signature terms on company level with a settings page (Settings → Rental → Signature). Patch the signature widget to show a custom dialog with the configured terms rendered as HTML and a "Confirm & Sign" button when signing rental delivery orders. Add is_rental_picking computed field on stock.picking to detect rental deliveries. --- sale_rental_extension/README.rst | 3 + sale_rental_extension/__init__.py | 1 + sale_rental_extension/__manifest__.py | 7 +- sale_rental_extension/models/__init__.py | 3 + sale_rental_extension/models/res_company.py | 12 ++++ .../models/res_config_settings.py | 13 ++++ sale_rental_extension/models/stock_picking.py | 21 ++++++ sale_rental_extension/readme/DESCRIPTION.rst | 3 + .../static/description/index.html | 3 + .../static/src/js/.eslintrc.yml | 2 + .../static/src/js/signature_widget.js | 66 +++++++++++++++++++ .../static/src/xml/signature_dialog.xml | 39 +++++++++++ .../views/res_config_settings_views.xml | 30 +++++++++ .../views/stock_picking_views.xml | 15 +++++ 14 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 sale_rental_extension/models/__init__.py create mode 100644 sale_rental_extension/models/res_company.py create mode 100644 sale_rental_extension/models/res_config_settings.py create mode 100644 sale_rental_extension/models/stock_picking.py create mode 100644 sale_rental_extension/static/src/js/.eslintrc.yml create mode 100644 sale_rental_extension/static/src/js/signature_widget.js create mode 100644 sale_rental_extension/static/src/xml/signature_dialog.xml create mode 100644 sale_rental_extension/views/res_config_settings_views.xml create mode 100644 sale_rental_extension/views/stock_picking_views.xml diff --git a/sale_rental_extension/README.rst b/sale_rental_extension/README.rst index 2542356f8..a0db9698c 100644 --- a/sale_rental_extension/README.rst +++ b/sale_rental_extension/README.rst @@ -30,6 +30,9 @@ This module extends ``sale_rental`` to improve the rental positions experience: * Kanban and calendar views for the Rental Positions screen * Searchpanel with state filter and "Today" filter +* Configurable signature terms for rental delivery orders + (Settings → Rental → Signature) +* Custom signature dialog with "Confirm & Sign" button on rental pickings .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. diff --git a/sale_rental_extension/__init__.py b/sale_rental_extension/__init__.py index e69de29bb..0650744f6 100644 --- a/sale_rental_extension/__init__.py +++ b/sale_rental_extension/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_rental_extension/__manifest__.py b/sale_rental_extension/__manifest__.py index 54538d25e..26e779afd 100644 --- a/sale_rental_extension/__manifest__.py +++ b/sale_rental_extension/__manifest__.py @@ -3,7 +3,8 @@ { "name": "Sale Rental Extension", - "summary": "Adds kanban view, calendar and filters for rental positions.", + "summary": "Adds kanban view, calendar, configurable signature terms" + " and filters for rental positions.", "version": "16.0.1.0.0", "development_status": "Alpha", "category": "Rental", @@ -14,11 +15,15 @@ "sale_rental", ], "data": [ + "views/res_config_settings_views.xml", "views/sale_rental_views.xml", + "views/stock_picking_views.xml", ], "assets": { "web.assets_backend": [ + "sale_rental_extension/static/src/js/signature_widget.js", "sale_rental_extension/static/src/scss/sale_rental_kanban.scss", + "sale_rental_extension/static/src/xml/signature_dialog.xml", ], }, } diff --git a/sale_rental_extension/models/__init__.py b/sale_rental_extension/models/__init__.py new file mode 100644 index 000000000..e6c1f2d92 --- /dev/null +++ b/sale_rental_extension/models/__init__.py @@ -0,0 +1,3 @@ +from . import res_company +from . import res_config_settings +from . import stock_picking diff --git a/sale_rental_extension/models/res_company.py b/sale_rental_extension/models/res_company.py new file mode 100644 index 000000000..0490f3e45 --- /dev/null +++ b/sale_rental_extension/models/res_company.py @@ -0,0 +1,12 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + rental_signature_terms = fields.Html( + translate=True, + ) diff --git a/sale_rental_extension/models/res_config_settings.py b/sale_rental_extension/models/res_config_settings.py new file mode 100644 index 000000000..99e8ded9d --- /dev/null +++ b/sale_rental_extension/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + rental_signature_terms = fields.Html( + related="company_id.rental_signature_terms", + readonly=False, + ) diff --git a/sale_rental_extension/models/stock_picking.py b/sale_rental_extension/models/stock_picking.py new file mode 100644 index 000000000..5a328e8fc --- /dev/null +++ b/sale_rental_extension/models/stock_picking.py @@ -0,0 +1,21 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from odoo import fields, models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + is_rental_picking = fields.Boolean( + compute="_compute_is_rental_picking", + ) + + def _compute_is_rental_picking(self): + rental_type = self.env.ref( + "rental_base.rental_sale_type", raise_if_not_found=False + ) + for picking in self: + picking.is_rental_picking = ( + rental_type and picking.sale_id.type_id == rental_type + ) diff --git a/sale_rental_extension/readme/DESCRIPTION.rst b/sale_rental_extension/readme/DESCRIPTION.rst index 647829b09..600321b2b 100644 --- a/sale_rental_extension/readme/DESCRIPTION.rst +++ b/sale_rental_extension/readme/DESCRIPTION.rst @@ -2,3 +2,6 @@ This module extends ``sale_rental`` to improve the rental positions experience: * Kanban and calendar views for the Rental Positions screen * Searchpanel with state filter and "Today" filter +* Configurable signature terms for rental delivery orders + (Settings → Rental → Signature) +* Custom signature dialog with "Confirm & Sign" button on rental pickings diff --git a/sale_rental_extension/static/description/index.html b/sale_rental_extension/static/description/index.html index 32bff4f8f..3f117eb9d 100644 --- a/sale_rental_extension/static/description/index.html +++ b/sale_rental_extension/static/description/index.html @@ -379,6 +379,9 @@

    Sale Rental Extension

    • Kanban and calendar views for the Rental Positions screen
    • Searchpanel with state filter and “Today” filter
    • +
    • Configurable signature terms for rental delivery orders +(Settings → Rental → Signature)
    • +
    • Custom signature dialog with “Confirm & Sign” button on rental pickings

    Important

    diff --git a/sale_rental_extension/static/src/js/.eslintrc.yml b/sale_rental_extension/static/src/js/.eslintrc.yml new file mode 100644 index 000000000..add5a7856 --- /dev/null +++ b/sale_rental_extension/static/src/js/.eslintrc.yml @@ -0,0 +1,2 @@ +parserOptions: + sourceType: module diff --git a/sale_rental_extension/static/src/js/signature_widget.js b/sale_rental_extension/static/src/js/signature_widget.js new file mode 100644 index 000000000..a91d14c4d --- /dev/null +++ b/sale_rental_extension/static/src/js/signature_widget.js @@ -0,0 +1,66 @@ +/** @odoo-module */ +/* Copyright 2026 NuoBiT Solutions SL - Eric Antones + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ + +import {SignatureDialog} from "@web/core/signature/signature_dialog"; +import {SignatureWidget} from "@web/views/widgets/signature/signature"; +import {patch} from "web.utils"; + +patch(SignatureWidget.prototype, "sale_rental_extension.SignatureWidget", { + async onClickSignature() { + const {record} = this.props; + const isRental = + record.resModel === "stock.picking" && record.data.is_rental_picking; + if (!isRental) { + return this._super(...arguments); + } + const companyId = record.data.company_id && record.data.company_id[0]; + let rentalTerms = ""; + if (companyId) { + const result = await this.orm.read( + "res.company", + [companyId], + ["rental_signature_terms"] + ); + if (result.length && result[0].rental_signature_terms) { + rentalTerms = owl.markup(result[0].rental_signature_terms); + } + } + const nameAndSignatureProps = { + mode: "draw", + displaySignatureRatio: 3, + signatureType: "signature", + noInputName: true, + }; + const {fullName} = this.props; + let defaultName = ""; + if (fullName) { + let signName = null; + const fullNameData = record.data[fullName]; + if (record.fields[fullName].type === "many2one") { + signName = fullNameData && fullNameData[1]; + } else { + signName = fullNameData; + } + defaultName = signName === "" ? undefined : signName; + } + nameAndSignatureProps.defaultFont = this.props.defaultFont; + const dialogProps = { + defaultName, + nameAndSignatureProps, + uploadSignature: (data) => this.uploadSignature(data), + isRental: true, + rentalTerms, + }; + this.dialogService.add(SignatureDialog, dialogProps); + }, +}); + +patch(SignatureDialog.prototype, "sale_rental_extension.SignatureDialog", { + setup() { + this._super(...arguments); + if (this.props.isRental) { + this.title = this.env._t("Delivery Signature"); + } + }, +}); diff --git a/sale_rental_extension/static/src/xml/signature_dialog.xml b/sale_rental_extension/static/src/xml/signature_dialog.xml new file mode 100644 index 000000000..7d5f562fa --- /dev/null +++ b/sale_rental_extension/static/src/xml/signature_dialog.xml @@ -0,0 +1,39 @@ + + + + + + +
    +
    By clicking Adopt & Sign, I agree that the chosen signature/initials will be a valid electronic representation of my hand-written signature/initials for all purposes when it is used on documents, including legally binding contracts.
    + + + + + + + + diff --git a/sale_rental_extension/views/res_config_settings_views.xml b/sale_rental_extension/views/res_config_settings_views.xml new file mode 100644 index 000000000..eedeecd87 --- /dev/null +++ b/sale_rental_extension/views/res_config_settings_views.xml @@ -0,0 +1,30 @@ + + + + + res.config.settings.view.form.inherit.sale_rental_extension + res.config.settings + + +
    +

    Signature

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/sale_rental_extension/views/stock_picking_views.xml b/sale_rental_extension/views/stock_picking_views.xml new file mode 100644 index 000000000..aa3196605 --- /dev/null +++ b/sale_rental_extension/views/stock_picking_views.xml @@ -0,0 +1,15 @@ + + + + + stock.picking.form.inherit.sale_rental_extension + stock.picking + + + + + + + + From c2425747eb49875c805b697261af8350707925ce Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 22:46:27 +0100 Subject: [PATCH 06/24] [I18N] sale_rental_extension: add Catalan and Spanish translations Provide ca.po and es.po translations covering field labels, view titles, signature dialog text and settings descriptions for the module. --- sale_rental_extension/README.rst | 1 + sale_rental_extension/__manifest__.py | 2 +- sale_rental_extension/i18n/ca.po | 714 ++++++++++++++++++ sale_rental_extension/i18n/es.po | 714 ++++++++++++++++++ sale_rental_extension/readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 1 + 6 files changed, 1432 insertions(+), 1 deletion(-) create mode 100644 sale_rental_extension/i18n/ca.po create mode 100644 sale_rental_extension/i18n/es.po diff --git a/sale_rental_extension/README.rst b/sale_rental_extension/README.rst index a0db9698c..09e607c1e 100644 --- a/sale_rental_extension/README.rst +++ b/sale_rental_extension/README.rst @@ -33,6 +33,7 @@ This module extends ``sale_rental`` to improve the rental positions experience: * Configurable signature terms for rental delivery orders (Settings → Rental → Signature) * Custom signature dialog with "Confirm & Sign" button on rental pickings +* Catalan and Spanish translations .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. diff --git a/sale_rental_extension/__manifest__.py b/sale_rental_extension/__manifest__.py index 26e779afd..d7b556200 100644 --- a/sale_rental_extension/__manifest__.py +++ b/sale_rental_extension/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Sale Rental Extension", "summary": "Adds kanban view, calendar, configurable signature terms" - " and filters for rental positions.", + " and translations for rental positions.", "version": "16.0.1.0.0", "development_status": "Alpha", "category": "Rental", diff --git a/sale_rental_extension/i18n/ca.po b/sale_rental_extension/i18n/ca.po new file mode 100644 index 000000000..a65fedf28 --- /dev/null +++ b/sale_rental_extension/i18n/ca.po @@ -0,0 +1,714 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_rental +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-09 11:00+0000\n" +"PO-Revision-Date: 2026-03-09 11:00+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_rental__in_state +#: model:ir.model.fields,help:sale_rental.field_sale_rental__out_state +#: model:ir.model.fields,help:sale_rental.field_sale_rental__sell_state +msgid "" +"* New: When the stock move is created and not yet confirmed.\n" +"* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n" +"* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n" +"* Available: When products are reserved, it is set to 'Available'.\n" +"* Done: When the shipment is processed, the state is 'Done'." +msgstr "" +"* Nou: Quan el moviment d'estoc es crea i encara no s'ha confirmat.\n" +"* Esperant un altre moviment: Aquest estat es pot veure quan un moviment espera un altre, per exemple en un flux encadenat.\n" +"* Esperant disponibilitat: S'arriba a aquest estat quan la resolució de l'aprovisionament no és directa. Pot necessitar l'execució del planificador, un component a fabricar...\n" +"* Disponible: Quan els productes estan reservats, s'estableix a 'Disponible'.\n" +"* Fet: Quan l'enviament es processa, l'estat és 'Fet'." + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__in +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Back In" +msgstr "Tornat" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__can_sell_rental +msgid "Can Sell from Rental" +msgstr "Es pot vendre des del lloguer" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "Can't find any generic 'Rent' route." +msgstr "No es pot trobar cap ruta genèrica de 'Lloguer'." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "Can't find any generic 'Sell Rented Product' route." +msgstr "No es pot trobar cap ruta genèrica de 'Vendre producte llogat'." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +msgid "Cancel" +msgstr "Cancel·la" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__cancel +msgid "Cancelled" +msgstr "Cancel·lat" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "Cannot sell the rental {} because it has not been delivered" +msgstr "No es pot vendre el lloguer {} perquè no s'ha lliurat" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__company_id +msgid "Company" +msgstr "Companyia" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__copy_image +msgid "Copy Product Image" +msgstr "Copiar imatge del producte" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +msgid "Create" +msgstr "Crea" + +#. module: sale_rental +#: model:ir.actions.act_window,name:sale_rental.create_rental_product_action +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +msgid "Create Rental Service" +msgstr "Crear servei de lloguer" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_create_rental_product +msgid "Create the Rental Service Product" +msgstr "Crear el producte de servei de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__create_uid +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__create_date +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__partner_id +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Customer" +msgstr "Client" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__default_code +msgid "Default Code" +msgstr "Codi per defecte" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "Delivery" +msgstr "Lliurament" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_picking_id +msgid "Delivery Order" +msgstr "Ordre de lliurament" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__display_name +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__display_name +msgid "Display Name" +msgstr "Nom per mostrar" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__end_date +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "End Date" +msgstr "Data de fi" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_rental__end_date +msgid "" +"End Date of the Rental (extensions included), taking into account " +"all the extensions sold to the customer." +msgstr "" +"Data de fi del lloguer (extensions incloses), tenint en compte totes les " +"extensions venudes al client." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Group By" +msgstr "Agrupa per" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__id +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__id +msgid "ID" +msgstr "ID" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_state +msgid "In Move State" +msgstr "Estat del moviment d'entrada" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_move_id +msgid "Incoming Move" +msgstr "Moviment d'entrada" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_order_line__rental_qty +#: model:ir.model.fields,help:sale_rental.field_sale_rental__rental_qty +msgid "Indicate the number of items that will be rented." +msgstr "Indica el nombre d'articles que es llogaran." + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product____last_update +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental____last_update +msgid "Last Modified on" +msgstr "Última modificació el" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__write_uid +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__write_uid +msgid "Last Updated by" +msgstr "Última actualització per" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__write_date +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__write_date +msgid "Last Updated on" +msgstr "Última actualització el" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"Missing 'Rental to Extend' on the sale order line with rental service {}" +msgstr "" +"Falta 'Lloguer a estendre' a la línia de comanda de venda amb servei de " +"lloguer {}" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_order_line__rental_type__new_rental +msgid "New Rental" +msgstr "Nou lloguer" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "Not enough stock !" +msgstr "No hi ha prou estoc!" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the 'new rental' sale order line with product '{}', we should have a " +"rental service product !" +msgstr "" +"A la línia de comanda de venda de 'nou lloguer' amb producte '{}', hauria " +"d'haver-hi un producte de servei de lloguer!" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with product %(name)s you are trying to sell a rented" +" product with a quantity (%(uom_qty)s) that is different from the rented " +"quantity (%(rental_qty)s). This is not supported." +msgstr "" +"A la línia de comanda de venda amb producte %(name)s esteu intentant vendre " +"un producte llogat amb una quantitat (%(uom_qty)s) diferent de la quantitat " +"llogada (%(rental_qty)s). Això no és compatible." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with product '%(name)s' the Product Quantity " +"(%(uom_qty)s) should be the number of days (%(days)s) multiplied by the " +"Rental Quantity (%(rental_qty)s)." +msgstr "" +"A la línia de comanda de venda amb producte '%(name)s' la quantitat de " +"producte (%(uom_qty)s) hauria de ser el nombre de dies (%(days)s) " +"multiplicat per la quantitat de lloguer (%(rental_qty)s)." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with rental service %(name)s, you are trying to " +"extend a rental with a rental quantity %(qty)s that is different from the " +"quantity of the original rental %(rental_qty)s. This is not supported." +msgstr "" +"A la línia de comanda de venda amb servei de lloguer %(name)s, esteu " +"intentant estendre un lloguer amb una quantitat de lloguer %(qty)s diferent " +"de la quantitat del lloguer original %(rental_qty)s. Això no és compatible." + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__ordered +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Ordered" +msgstr "Reservat" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__out +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Out" +msgstr "Entregat" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_state +msgid "Out Move State" +msgstr "Estat del moviment de sortida" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_move_id +msgid "Outgoing Move" +msgstr "Moviment de sortida" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_view_location_id +msgid "Parent Rental" +msgstr "Lloguer pare" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_product_template +msgid "Product" +msgstr "Producte" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__categ_id +msgid "Product Category" +msgstr "Categoria de producte" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_product_product +msgid "Product Variant" +msgstr "Variant de producte" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__hw_product_id +msgid "Product to Rent" +msgstr "Producte a llogar" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_quant +msgid "Quants" +msgstr "Quants" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "RENT-{}" +msgstr "LLOG-{}" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_picking_id +msgid "Receipt" +msgstr "Rebut" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rental_service_ids +msgid "Related Rental Services" +msgstr "Serveis de lloguer relacionats" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rented_product_id +msgid "Related Rented Product" +msgstr "Producte llogat relacionat" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:stock.route,name:sale_rental.route_warehouse0_rental +#, python-format +msgid "Rent" +msgstr "Llogar" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model,name:sale_rental.model_sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.view_warehouse +#, python-format +msgid "Rental" +msgstr "Lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_allowed +msgid "Rental Allowed" +msgstr "Lloguer permès" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_order_line__rental_type__rental_extension +msgid "Rental Extension" +msgstr "Extensió de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__extension_order_line_ids +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Rental Extensions" +msgstr "Extensions de lloguer" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_in_location_id +#, python-format +msgid "Rental In" +msgstr "Entrada de lloguer" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_out_location_id +#, python-format +msgid "Rental Out" +msgstr "Sortida de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__sale_price_per_day +msgid "Rental Price per Day" +msgstr "Preu de lloguer per dia" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental_qty +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rental_qty +msgid "Rental Quantity" +msgstr "Quantitat de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_route_id +msgid "Rental Route" +msgstr "Ruta de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_order_id +msgid "Rental SO" +msgstr "Comanda de venda de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_order_line_id +msgid "Rental SO Line" +msgstr "Línia de comanda de venda de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rental_product_id +msgid "Rental Service" +msgstr "Servei de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__name +msgid "Rental Service Name" +msgstr "Nom del servei de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rental_service_tmpl_ids +#: model:ir.model.fields,field_description:sale_rental.field_product_template__rental_service_tmpl_ids +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +msgid "Rental Services" +msgstr "Serveis de lloguer" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental_type +msgid "Rental Type" +msgstr "Tipus de lloguer" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "Rental of a {}" +msgstr "Lloguer d'un {}" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_product_product_25_product_template +msgid "Rental of one Acoustic Bloc Screens" +msgstr "Lloguer d'un panell acústic" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_product_product_20_product_template +msgid "Rental of one Flipover" +msgstr "Lloguer d'un rotafolis" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_consu_delivery_01_product_template +msgid "Rental of one Three-Seat Sofa" +msgstr "Lloguer d'un sofà de tres places" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__extension_rental_id +msgid "Rental to Extend" +msgstr "Lloguer a estendre" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__sell_rental_id +msgid "Rental to Sell" +msgstr "Lloguer a vendre" + +#. module: sale_rental +#: model:ir.actions.act_window,name:sale_rental.sale_rental_action +#: model:ir.ui.menu,name:sale_rental.sale_rental_menu +msgid "Rentals" +msgstr "Lloguers" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rented_product_tmpl_id +#: model:ir.model.fields,field_description:sale_rental.field_product_template__rented_product_tmpl_id +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rented_product_id +msgid "Rented Product" +msgstr "Producte llogat" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "Return" +msgstr "Retorn" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_sale_order +msgid "Sales Order" +msgstr "Comanda de venda" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línia de comanda de venda" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Sales Rentals" +msgstr "Lloguers de vendes" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Search Rentals" +msgstr "Cerca lloguers" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_picking_id +msgid "Sell Delivery Order" +msgstr "Ordre de lliurament de venda" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_state +msgid "Sell Move State" +msgstr "Estat del moviment de venda" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_order_line_ids +#: model:stock.route,name:sale_rental.route_warehouse0_sell_rented_product +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#, python-format +msgid "Sell Rented Product" +msgstr "Vendre producte llogat" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__sell_rented_product_route_id +msgid "Sell Rented Product Route" +msgstr "Ruta de vendre producte llogat" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__sell_progress +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Sell in progress" +msgstr "Venda en curs" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_move_id +msgid "Selling Move" +msgstr "Moviment de venda" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Selling Order Line" +msgstr "Línia de comanda de venda" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__sold +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Sold" +msgstr "Venut" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_date +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Start Date" +msgstr "Data d'inici" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__state +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "State" +msgstr "Estat" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_rule +msgid "Stock Rule" +msgstr "Regla d'estoc" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "The Rental Input stock location is not set on the warehouse {}" +msgstr "La ubicació d'estoc d'entrada de lloguer no està configurada al magatzem {}" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "The Rental Output stock location is not set on the warehouse {}" +msgstr "La ubicació d'estoc de sortida de lloguer no està configurada al magatzem {}" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"The Rental Service of the Rental Extension you just selected is '{}' and " +"it's not the same as the Product currently selected in this Sale Order Line." +msgstr "" +"El servei de lloguer de l'extensió de lloguer que acabeu de seleccionar és " +"'{}' i no és el mateix que el producte seleccionat actualment en aquesta " +"línia de comanda de venda." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "The rental product '{}' must be of type 'Service'." +msgstr "El producte de lloguer '{}' ha de ser de tipus 'Servei'." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "" +"The rental product '{}' must have the option 'Must Have Start and End Dates'" +" checked." +msgstr "" +"El producte de lloguer '{}' ha de tenir l'opció 'Ha de tenir dates d'inici " +"i fi' activada." + +#. module: sale_rental +#: model:ir.model.constraint,message:sale_rental.constraint_sale_order_line_rental_qty_positive +msgid "The rental quantity must be positive or null." +msgstr "La quantitat de lloguer ha de ser positiva o zero." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "The unit of measure of the rental product '{}' must be 'Day'." +msgstr "La unitat de mesura del producte de lloguer '{}' ha de ser 'Dia'." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Total" +msgstr "Total" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Unit of Measure" +msgstr "Unitat de mesura" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_warehouse +msgid "Warehouse" +msgstr "Magatzem" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "Wrong active_model. Should never happen." +msgstr "active_model incorrecte. No hauria de passar mai." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"You want to rent %(rental_qty).2f %(uom_name)s but you only have " +"%(available_qty).2f %(uom_name)s currently available on the stock location " +"'%(rental_name)s' ! Make sure that you get some units back in the mean time " +"or re-supply the stock location '%(rental_name)s'." +msgstr "" +"Voleu llogar %(rental_qty).2f %(uom_name)s però només teniu " +"%(available_qty).2f %(uom_name)s disponibles actualment a la ubicació " +"d'estoc '%(rental_name)s'! Assegureu-vos que recupereu algunes unitats " +"mentrestant o reaprovisioneu la ubicació d'estoc '%(rental_name)s'." + +#. module: sale_rental_extension +#. odoo-javascript +#: code:addons/sale_rental_extension/static/src/js/signature_widget.js:0 +#, python-format +msgid "Delivery Signature" +msgstr "Signatura de lliurament" + +#. module: sale_rental_extension +#. odoo-javascript +#: code:addons/sale_rental_extension/static/src/xml/signature_dialog.xml:0 +#, python-format +msgid "Confirm & Sign" +msgstr "Confirmar i signar" + +#. module: sale_rental_extension +#: model:ir.model.fields,field_description:sale_rental_extension.field_res_company__rental_signature_terms +#: model:ir.model.fields,field_description:sale_rental_extension.field_res_config_settings__rental_signature_terms +msgid "Rental Signature Terms" +msgstr "Condicions de signatura de lloguer" + +#. module: sale_rental_extension +#: model_terms:ir.ui.view,arch_db:sale_rental_extension.res_config_settings_view_form +msgid "Signature" +msgstr "Signatura" + +#. module: sale_rental_extension +#: model_terms:ir.ui.view,arch_db:sale_rental_extension.res_config_settings_view_form +msgid "" +"Terms shown in the signature dialog when signing a rental delivery order. " +"Leave empty to use the default text." +msgstr "" +"Condicions mostrades al diàleg de signatura en signar un albarà de lloguer. " +"Deixeu buit per utilitzar el text per defecte." diff --git a/sale_rental_extension/i18n/es.po b/sale_rental_extension/i18n/es.po new file mode 100644 index 000000000..f059ccbaa --- /dev/null +++ b/sale_rental_extension/i18n/es.po @@ -0,0 +1,714 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_rental +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-09 11:00+0000\n" +"PO-Revision-Date: 2026-03-09 11:00+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_rental__in_state +#: model:ir.model.fields,help:sale_rental.field_sale_rental__out_state +#: model:ir.model.fields,help:sale_rental.field_sale_rental__sell_state +msgid "" +"* New: When the stock move is created and not yet confirmed.\n" +"* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n" +"* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to be manufactured...\n" +"* Available: When products are reserved, it is set to 'Available'.\n" +"* Done: When the shipment is processed, the state is 'Done'." +msgstr "" +"* Nuevo: Cuando el movimiento de stock se crea y aún no se ha confirmado.\n" +"* Esperando otro movimiento: Este estado se ve cuando un movimiento espera a otro, por ejemplo en un flujo encadenado.\n" +"* Esperando disponibilidad: Se alcanza este estado cuando la resolución del aprovisionamiento no es directa. Puede necesitar la ejecución del planificador, un componente a fabricar...\n" +"* Disponible: Cuando los productos están reservados, se establece a 'Disponible'.\n" +"* Hecho: Cuando el envío se procesa, el estado es 'Hecho'." + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__in +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Back In" +msgstr "Devuelto" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__can_sell_rental +msgid "Can Sell from Rental" +msgstr "Se puede vender desde el alquiler" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "Can't find any generic 'Rent' route." +msgstr "No se puede encontrar ninguna ruta genérica de 'Alquiler'." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "Can't find any generic 'Sell Rented Product' route." +msgstr "No se puede encontrar ninguna ruta genérica de 'Vender producto alquilado'." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__cancel +msgid "Cancelled" +msgstr "Cancelado" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "Cannot sell the rental {} because it has not been delivered" +msgstr "No se puede vender el alquiler {} porque no se ha entregado" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__company_id +msgid "Company" +msgstr "Compañía" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__copy_image +msgid "Copy Product Image" +msgstr "Copiar imagen del producto" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +msgid "Create" +msgstr "Crear" + +#. module: sale_rental +#: model:ir.actions.act_window,name:sale_rental.create_rental_product_action +#: model_terms:ir.ui.view,arch_db:sale_rental.create_rental_product_form +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +msgid "Create Rental Service" +msgstr "Crear servicio de alquiler" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_create_rental_product +msgid "Create the Rental Service Product" +msgstr "Crear el producto de servicio de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__create_uid +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__create_date +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__partner_id +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Customer" +msgstr "Cliente" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__default_code +msgid "Default Code" +msgstr "Código por defecto" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "Delivery" +msgstr "Entrega" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_picking_id +msgid "Delivery Order" +msgstr "Orden de entrega" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__display_name +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__end_date +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "End Date" +msgstr "Fecha de fin" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_rental__end_date +msgid "" +"End Date of the Rental (extensions included), taking into account " +"all the extensions sold to the customer." +msgstr "" +"Fecha de fin del alquiler (extensiones incluidas), teniendo en cuenta todas " +"las extensiones vendidas al cliente." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__id +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__id +msgid "ID" +msgstr "ID" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_state +msgid "In Move State" +msgstr "Estado del movimiento de entrada" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_move_id +msgid "Incoming Move" +msgstr "Movimiento de entrada" + +#. module: sale_rental +#: model:ir.model.fields,help:sale_rental.field_sale_order_line__rental_qty +#: model:ir.model.fields,help:sale_rental.field_sale_rental__rental_qty +msgid "Indicate the number of items that will be rented." +msgstr "Indica el número de artículos que se alquilarán." + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product____last_update +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__write_uid +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__write_date +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"Missing 'Rental to Extend' on the sale order line with rental service {}" +msgstr "" +"Falta 'Alquiler a extender' en la línea de pedido de venta con servicio de alquiler {}" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_order_line__rental_type__new_rental +msgid "New Rental" +msgstr "Nuevo alquiler" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "Not enough stock !" +msgstr "¡No hay suficiente stock!" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the 'new rental' sale order line with product '{}', we should have a " +"rental service product !" +msgstr "" +"En la línea de pedido de venta de 'nuevo alquiler' con producto '{}', " +"¡debería haber un producto de servicio de alquiler!" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with product %(name)s you are trying to sell a rented" +" product with a quantity (%(uom_qty)s) that is different from the rented " +"quantity (%(rental_qty)s). This is not supported." +msgstr "" +"En la línea de pedido de venta con producto %(name)s está intentando vender " +"un producto alquilado con una cantidad (%(uom_qty)s) diferente de la " +"cantidad alquilada (%(rental_qty)s). Esto no es compatible." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with product '%(name)s' the Product Quantity " +"(%(uom_qty)s) should be the number of days (%(days)s) multiplied by the " +"Rental Quantity (%(rental_qty)s)." +msgstr "" +"En la línea de pedido de venta con producto '%(name)s' la cantidad de " +"producto (%(uom_qty)s) debería ser el número de días (%(days)s) multiplicado " +"por la cantidad de alquiler (%(rental_qty)s)." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"On the sale order line with rental service %(name)s, you are trying to " +"extend a rental with a rental quantity %(qty)s that is different from the " +"quantity of the original rental %(rental_qty)s. This is not supported." +msgstr "" +"En la línea de pedido de venta con servicio de alquiler %(name)s, está " +"intentando extender un alquiler con una cantidad de alquiler %(qty)s " +"diferente de la cantidad del alquiler original %(rental_qty)s. Esto no es " +"compatible." + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__ordered +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Ordered" +msgstr "Reservado" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__out +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Out" +msgstr "Entregado" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_state +msgid "Out Move State" +msgstr "Estado del movimiento de salida" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__out_move_id +msgid "Outgoing Move" +msgstr "Movimiento de salida" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_view_location_id +msgid "Parent Rental" +msgstr "Alquiler padre" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_product_template +msgid "Product" +msgstr "Producto" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__categ_id +msgid "Product Category" +msgstr "Categoría de producto" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_product_product +msgid "Product Variant" +msgstr "Variante de producto" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__hw_product_id +msgid "Product to Rent" +msgstr "Producto a alquilar" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_quant +msgid "Quants" +msgstr "Quants" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "RENT-{}" +msgstr "ALQ-{}" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__in_picking_id +msgid "Receipt" +msgstr "Recepción" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rental_service_ids +msgid "Related Rental Services" +msgstr "Servicios de alquiler relacionados" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rented_product_id +msgid "Related Rented Product" +msgstr "Producto alquilado relacionado" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:stock.route,name:sale_rental.route_warehouse0_rental +#, python-format +msgid "Rent" +msgstr "Alquilar" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model,name:sale_rental.model_sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.view_warehouse +#, python-format +msgid "Rental" +msgstr "Alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_allowed +msgid "Rental Allowed" +msgstr "Alquiler permitido" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_order_line__rental_type__rental_extension +msgid "Rental Extension" +msgstr "Extensión de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__extension_order_line_ids +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Rental Extensions" +msgstr "Extensiones de alquiler" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_in_location_id +#, python-format +msgid "Rental In" +msgstr "Entrada de alquiler" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_out_location_id +#, python-format +msgid "Rental Out" +msgstr "Salida de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__sale_price_per_day +msgid "Rental Price per Day" +msgstr "Precio de alquiler por día" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental_qty +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rental_qty +msgid "Rental Quantity" +msgstr "Cantidad de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__rental_route_id +msgid "Rental Route" +msgstr "Ruta de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_order_id +msgid "Rental SO" +msgstr "Pedido de venta de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_order_line_id +msgid "Rental SO Line" +msgstr "Línea de pedido de venta de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rental_product_id +msgid "Rental Service" +msgstr "Servicio de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_create_rental_product__name +msgid "Rental Service Name" +msgstr "Nombre del servicio de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rental_service_tmpl_ids +#: model:ir.model.fields,field_description:sale_rental.field_product_template__rental_service_tmpl_ids +#: model_terms:ir.ui.view,arch_db:sale_rental.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:sale_rental.product_template_only_form_view +msgid "Rental Services" +msgstr "Servicios de alquiler" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__rental_type +msgid "Rental Type" +msgstr "Tipo de alquiler" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "Rental of a {}" +msgstr "Alquiler de un {}" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_product_product_25_product_template +msgid "Rental of one Acoustic Bloc Screens" +msgstr "Alquiler de un panel acústico" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_product_product_20_product_template +msgid "Rental of one Flipover" +msgstr "Alquiler de un rotafolios" + +#. module: sale_rental +#: model:product.template,name:sale_rental.rent_consu_delivery_01_product_template +msgid "Rental of one Three-Seat Sofa" +msgstr "Alquiler de un sofá de tres plazas" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__extension_rental_id +msgid "Rental to Extend" +msgstr "Alquiler a extender" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_order_line__sell_rental_id +msgid "Rental to Sell" +msgstr "Alquiler a vender" + +#. module: sale_rental +#: model:ir.actions.act_window,name:sale_rental.sale_rental_action +#: model:ir.ui.menu,name:sale_rental.sale_rental_menu +msgid "Rentals" +msgstr "Alquileres" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_product_product__rented_product_tmpl_id +#: model:ir.model.fields,field_description:sale_rental.field_product_template__rented_product_tmpl_id +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__rented_product_id +msgid "Rented Product" +msgstr "Producto alquilado" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_tree +msgid "Return" +msgstr "Devolución" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_sale_order +msgid "Sales Order" +msgstr "Pedido de venta" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea de pedido de venta" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Sales Rentals" +msgstr "Alquileres de ventas" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Search Rentals" +msgstr "Buscar alquileres" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_picking_id +msgid "Sell Delivery Order" +msgstr "Orden de entrega de venta" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_state +msgid "Sell Move State" +msgstr "Estado del movimiento de venta" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_order_line_ids +#: model:stock.route,name:sale_rental.route_warehouse0_sell_rented_product +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +#, python-format +msgid "Sell Rented Product" +msgstr "Vender producto alquilado" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_stock_warehouse__sell_rented_product_route_id +msgid "Sell Rented Product Route" +msgstr "Ruta de vender producto alquilado" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__sell_progress +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Sell in progress" +msgstr "Venta en curso" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__sell_move_id +msgid "Selling Move" +msgstr "Movimiento de venta" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Selling Order Line" +msgstr "Línea de pedido de venta" + +#. module: sale_rental +#: model:ir.model.fields.selection,name:sale_rental.selection__sale_rental__state__sold +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Sold" +msgstr "Vendido" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__start_date +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: sale_rental +#: model:ir.model.fields,field_description:sale_rental.field_sale_rental__state +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_search +msgid "State" +msgstr "Estado" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_rule +msgid "Stock Rule" +msgstr "Regla de stock" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "The Rental Input stock location is not set on the warehouse {}" +msgstr "La ubicación de stock de entrada de alquiler no está configurada en el almacén {}" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/stock_warehouse.py:0 +#, python-format +msgid "The Rental Output stock location is not set on the warehouse {}" +msgstr "La ubicación de stock de salida de alquiler no está configurada en el almacén {}" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"The Rental Service of the Rental Extension you just selected is '{}' and " +"it's not the same as the Product currently selected in this Sale Order Line." +msgstr "" +"El servicio de alquiler de la extensión de alquiler que acaba de seleccionar " +"es '{}' y no es el mismo que el producto seleccionado actualmente en esta " +"línea de pedido de venta." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "The rental product '{}' must be of type 'Service'." +msgstr "El producto de alquiler '{}' debe ser de tipo 'Servicio'." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "" +"The rental product '{}' must have the option 'Must Have Start and End Dates'" +" checked." +msgstr "" +"El producto de alquiler '{}' debe tener la opción 'Debe tener fechas de " +"inicio y fin' activada." + +#. module: sale_rental +#: model:ir.model.constraint,message:sale_rental.constraint_sale_order_line_rental_qty_positive +msgid "The rental quantity must be positive or null." +msgstr "La cantidad de alquiler debe ser positiva o cero." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/product.py:0 +#, python-format +msgid "The unit of measure of the rental product '{}' must be 'Day'." +msgstr "La unidad de medida del producto de alquiler '{}' debe ser 'Día'." + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Total" +msgstr "Total" + +#. module: sale_rental +#: model_terms:ir.ui.view,arch_db:sale_rental.sale_rental_form +msgid "Unit of Measure" +msgstr "Unidad de medida" + +#. module: sale_rental +#: model:ir.model,name:sale_rental.model_stock_warehouse +msgid "Warehouse" +msgstr "Almacén" + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/wizard/create_rental_product.py:0 +#, python-format +msgid "Wrong active_model. Should never happen." +msgstr "active_model incorrecto. No debería ocurrir nunca." + +#. module: sale_rental +#. odoo-python +#: code:addons/sale_rental/models/sale_order.py:0 +#, python-format +msgid "" +"You want to rent %(rental_qty).2f %(uom_name)s but you only have " +"%(available_qty).2f %(uom_name)s currently available on the stock location " +"'%(rental_name)s' ! Make sure that you get some units back in the mean time " +"or re-supply the stock location '%(rental_name)s'." +msgstr "" +"Quiere alquilar %(rental_qty).2f %(uom_name)s pero solo tiene " +"%(available_qty).2f %(uom_name)s disponibles actualmente en la ubicación de " +"stock '%(rental_name)s'. Asegúrese de recuperar algunas unidades mientras " +"tanto o reaprovisione la ubicación de stock '%(rental_name)s'." + +#. module: sale_rental_extension +#. odoo-javascript +#: code:addons/sale_rental_extension/static/src/js/signature_widget.js:0 +#, python-format +msgid "Delivery Signature" +msgstr "Firma de entrega" + +#. module: sale_rental_extension +#. odoo-javascript +#: code:addons/sale_rental_extension/static/src/xml/signature_dialog.xml:0 +#, python-format +msgid "Confirm & Sign" +msgstr "Confirmar y firmar" + +#. module: sale_rental_extension +#: model:ir.model.fields,field_description:sale_rental_extension.field_res_company__rental_signature_terms +#: model:ir.model.fields,field_description:sale_rental_extension.field_res_config_settings__rental_signature_terms +msgid "Rental Signature Terms" +msgstr "Condiciones de firma de alquiler" + +#. module: sale_rental_extension +#: model_terms:ir.ui.view,arch_db:sale_rental_extension.res_config_settings_view_form +msgid "Signature" +msgstr "Firma" + +#. module: sale_rental_extension +#: model_terms:ir.ui.view,arch_db:sale_rental_extension.res_config_settings_view_form +msgid "" +"Terms shown in the signature dialog when signing a rental delivery order. " +"Leave empty to use the default text." +msgstr "" +"Condiciones mostradas en el diálogo de firma al firmar un albarán de alquiler. " +"Dejar vacío para utilizar el texto por defecto." diff --git a/sale_rental_extension/readme/DESCRIPTION.rst b/sale_rental_extension/readme/DESCRIPTION.rst index 600321b2b..898705bac 100644 --- a/sale_rental_extension/readme/DESCRIPTION.rst +++ b/sale_rental_extension/readme/DESCRIPTION.rst @@ -5,3 +5,4 @@ This module extends ``sale_rental`` to improve the rental positions experience: * Configurable signature terms for rental delivery orders (Settings → Rental → Signature) * Custom signature dialog with "Confirm & Sign" button on rental pickings +* Catalan and Spanish translations diff --git a/sale_rental_extension/static/description/index.html b/sale_rental_extension/static/description/index.html index 3f117eb9d..d56aecd42 100644 --- a/sale_rental_extension/static/description/index.html +++ b/sale_rental_extension/static/description/index.html @@ -382,6 +382,7 @@

    Sale Rental Extension

  • Configurable signature terms for rental delivery orders (Settings → Rental → Signature)
  • Custom signature dialog with “Confirm & Sign” button on rental pickings
  • +
  • Catalan and Spanish translations
  • Important

    From 0db482cf0f18a08b61d9ae1c8a69f4836a5417a1 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 23:02:42 +0100 Subject: [PATCH 07/24] [IMP] sale_rental_extension: add group by rented product in search view Allow grouping rental positions by rented product in the search view, making it easier to see all rentals for a specific product at a glance. --- sale_rental_extension/views/sale_rental_views.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sale_rental_extension/views/sale_rental_views.xml b/sale_rental_extension/views/sale_rental_views.xml index 270e001c8..38c9588e9 100644 --- a/sale_rental_extension/views/sale_rental_views.xml +++ b/sale_rental_extension/views/sale_rental_views.xml @@ -121,6 +121,13 @@ domain="['|', ('start_date', '=', context_today().strftime('%Y-%m-%d')), ('end_date', '=', context_today().strftime('%Y-%m-%d'))]" /> + + + From 573df1126e45dcdc11541ede33d93ab96febec85 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 23:27:14 +0100 Subject: [PATCH 08/24] [IMP] rental_base_extension: hide Can be Rented on service products MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rental checkbox only applies to stockable products (physical items that can be rented out). Hide it on service products where it has no effect — rental services are identified by their rented_product_id link, not by this boolean. --- rental_base_extension/__manifest__.py | 1 + rental_base_extension/views/product_views.xml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 rental_base_extension/views/product_views.xml diff --git a/rental_base_extension/__manifest__.py b/rental_base_extension/__manifest__.py index 9dc001fa3..b2abfbde3 100644 --- a/rental_base_extension/__manifest__.py +++ b/rental_base_extension/__manifest__.py @@ -15,6 +15,7 @@ "rental_base", ], "data": [ + "views/product_views.xml", "views/sale_views.xml", ], } diff --git a/rental_base_extension/views/product_views.xml b/rental_base_extension/views/product_views.xml new file mode 100644 index 000000000..3c87dbcf3 --- /dev/null +++ b/rental_base_extension/views/product_views.xml @@ -0,0 +1,18 @@ + + + + + + product.template.form.inherit.rental_base_extension + product.template + + + + + {'invisible': [('type', '=', 'service')]} + + + + + From 00853d11a6da360c9386fdcc3800d0987a180eeb Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 23:40:34 +0100 Subject: [PATCH 09/24] [IMP] rental_base_extension: require Can be Rented to create rental service Only show the "Create Rental Service" button on product forms when the product is stockable and has the "Can be Rented" checkbox enabled. This enforces a clear workflow: first mark the product as rentable, then create the rental service. --- rental_base_extension/views/product_views.xml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/rental_base_extension/views/product_views.xml b/rental_base_extension/views/product_views.xml index 3c87dbcf3..76e4c3481 100644 --- a/rental_base_extension/views/product_views.xml +++ b/rental_base_extension/views/product_views.xml @@ -15,4 +15,39 @@ + + + + product.product.form.inherit.rental_base_extension + product.product + + + + + + + + product.template.only.form.inherit.rental_base_extension + product.template + + + + + From 590721be8d63fb2ed63ef17454c5d7cf9ec12911 Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Mon, 9 Mar 2026 23:48:45 +0100 Subject: [PATCH 10/24] [IMP] rental_base_extension: reorganize rental fields into dedicated section Move rental-related fields (rented_product_id, rental_service_ids, rental_service_tmpl_ids and "Create Rental Service" button) out of the Sale group into a new "Rentals" group section on both product.product and product.template forms. The original fields in the sale group are hidden with invisible="1" and the new section is only visible on stockable products that have the "Can be Rented" flag enabled. On the template form the section also hides when there are multiple variants (product_variant_count > 1). --- rental_base_extension/views/product_views.xml | 67 +++++++++++++++++-- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/rental_base_extension/views/product_views.xml b/rental_base_extension/views/product_views.xml index 76e4c3481..c8cdebb18 100644 --- a/rental_base_extension/views/product_views.xml +++ b/rental_base_extension/views/product_views.xml @@ -16,23 +16,50 @@ - + product.product.form.inherit.rental_base_extension product.product + + + + 1 + + + + 1 + + + + + + + + + + + - + + + + - + - + + + + - +
    Picked-up
    Late Return
    -
    Returned
    + +
    Late
    @@ -162,10 +159,11 @@ @@ -216,12 +214,16 @@ t-attf-class="#{record.is_late.raw_value ? 'text-danger' : 'text-muted'}" > - Late + + Pickup: Return: @@ -229,17 +231,20 @@
    -
    +
    @@ -268,6 +273,29 @@ + + + + + sale.order.calendar.rental + sale.order + + + + + + + + + + @@ -403,6 +431,12 @@ + + 4 + calendar + + + From a77a1ba7ba1104f6d5617fed7a3e347d5b7c2e7c Mon Sep 17 00:00:00 2001 From: Eric Antones Date: Tue, 17 Mar 2026 14:40:01 +0100 Subject: [PATCH 15/24] [FIX] sale_rental_extension: detect rental orders by rental_type The _compute_is_rental_order method only checked order_line.rental, which is a computed field from product_id.rental (product template). When a rental service product's template did not have rental=True, the order was not recognized as a rental order and rental_status was never computed, even though sale.rental records and stock moves existed correctly. Now also checks order_line.rental_type so orders with rental lines are always detected regardless of the product's rental flag. Additionally, _compute_rental_status now handles the case where rental_ids is empty on a confirmed order (e.g. product missing rented_product_id) by defaulting to "pickup" instead of "returned". Add tests covering the full rental status lifecycle (draft, pickup, return, returned, cancel), the product without rental flag scenario, and the empty rental_ids scenario. --- sale_rental_extension/models/sale_order.py | 10 +- sale_rental_extension/tests/__init__.py | 1 + .../tests/test_rental_status.py | 156 ++++++++++++++++++ .../views/sale_order_rental_views.xml | 60 +++++-- 4 files changed, 208 insertions(+), 19 deletions(-) create mode 100644 sale_rental_extension/tests/__init__.py create mode 100644 sale_rental_extension/tests/test_rental_status.py diff --git a/sale_rental_extension/models/sale_order.py b/sale_rental_extension/models/sale_order.py index 6f9f5ac2f..fb375bca8 100644 --- a/sale_rental_extension/models/sale_order.py +++ b/sale_rental_extension/models/sale_order.py @@ -41,10 +41,14 @@ class SaleOrder(models.Model): compute="_compute_rental_duration", ) - @api.depends("order_line.rental") + def _get_rental_type(self): + return self.env.ref("rental_base.rental_sale_type", raise_if_not_found=False) + + @api.depends("type_id") def _compute_is_rental_order(self): + rental_type = self._get_rental_type() for order in self: - order.is_rental_order = any(line.rental for line in order.order_line) + order.is_rental_order = bool(rental_type and order.type_id == rental_type) @api.depends( "state", @@ -62,7 +66,7 @@ def _compute_rental_status(self): order.rental_status = order.state elif order.state in ("sale", "done"): rental_states = order.rental_ids.mapped("state") - if any(s == "ordered" for s in rental_states): + if not rental_states or any(s == "ordered" for s in rental_states): order.rental_status = "pickup" order.next_action_date = order.default_start_date elif any(s in ("out", "sell_progress") for s in rental_states): diff --git a/sale_rental_extension/tests/__init__.py b/sale_rental_extension/tests/__init__.py new file mode 100644 index 000000000..95d8a8bce --- /dev/null +++ b/sale_rental_extension/tests/__init__.py @@ -0,0 +1 @@ +from . import test_rental_status diff --git a/sale_rental_extension/tests/test_rental_status.py b/sale_rental_extension/tests/test_rental_status.py new file mode 100644 index 000000000..18cfc709b --- /dev/null +++ b/sale_rental_extension/tests/test_rental_status.py @@ -0,0 +1,156 @@ +# Copyright 2026 NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from datetime import timedelta + +from odoo import fields +from odoo.tests import common, tagged + + +@tagged("post_install", "-at_install") +class TestRentalStatus(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.category_all = cls.env.ref("product.product_category_all") + cls.rental_sale_type = cls.env.ref("rental_base.rental_sale_type") + cls.uom_day = cls.env.ref("uom.product_uom_day") + cls.warehouse0 = cls.env.ref("stock.warehouse0") + cls.partner = cls.env["res.partner"].create( + { + "name": "Test Partner", + "email": "test@test.com", + } + ) + cls.product_hw = cls.env["product.product"].create( + { + "name": "Rental Hardware", + "type": "product", + "categ_id": cls.category_all.id, + } + ) + cls.service_rental = ( + cls.env["create.rental.product"] + .with_context(active_model="product.product", active_id=cls.product_hw.id) + .create( + { + "hw_product_id": cls.product_hw.id, + "name": "Rental of Rental Hardware (Day)", + "categ_id": cls.product_hw.categ_id.id, + "copy_image": True, + } + ) + .create_rental_product() + ) + cls.service_rental = cls.env["product.product"].browse( + cls.service_rental["res_id"] + ) + cls.service_rental.write( + { + "uom_id": cls.uom_day.id, + "uom_po_id": cls.uom_day.id, + "list_price": 100, + } + ) + cls.service_rental.rental = True + + def _create_rental_order(self, **kwargs): + today = fields.Date.today() + date_start = kwargs.get("date_start", today + timedelta(days=1)) + date_end = kwargs.get("date_end", today + timedelta(days=5)) + date_qty = (date_end - date_start).days + 1 + return self.env["sale.order"].create( + { + "type_id": self.rental_sale_type.id, + "partner_id": self.partner.id, + "partner_invoice_id": self.partner.id, + "partner_shipping_id": self.partner.id, + "pricelist_id": self.env.ref("product.list0").id, + "picking_policy": "direct", + "warehouse_id": self.warehouse0.id, + "order_line": [ + ( + 0, + 0, + { + "name": "Rental Service", + "product_id": self.service_rental.id, + "rental": True, + "rental_type": "new_rental", + "rental_qty": 1, + "product_uom_qty": date_qty, + "start_date": date_start, + "end_date": date_end, + "price_unit": 100, + "product_uom": self.uom_day.id, + }, + ) + ], + } + ) + + def _create_and_confirm_rental_order(self): + order = self._create_rental_order() + order.action_confirm() + return order + + def test_confirmed_rental_status_pickup(self): + """Confirmed rental with sale.rental records should have 'pickup' status.""" + order = self._create_and_confirm_rental_order() + self.assertTrue(order.rental_ids) + self.assertEqual(order.rental_status, "pickup") + + def test_confirmed_rental_status_pickup_product_without_rental_flag(self): + """Confirmed rental with product missing rental=True on template + should still be recognized as a rental order.""" + self.service_rental.rental = False + order = self._create_and_confirm_rental_order() + self.assertTrue(order.is_rental_order) + self.assertTrue(order.rental_ids) + self.assertEqual(order.rental_status, "pickup") + + def test_confirmed_rental_status_pickup_without_rental_records(self): + """Confirmed rental order without sale.rental records should be 'pickup', + not 'returned'. This happens when a product is not a proper rental + service (missing rented_product_id) but the order is created from + the rental menu.""" + order = self._create_and_confirm_rental_order() + order.rental_ids.unlink() + order._compute_rental_status() + self.assertFalse(order.rental_ids) + self.assertEqual(order.rental_status, "pickup") + + def test_rental_status_draft(self): + """Draft rental order should have 'draft' status.""" + order = self._create_rental_order() + self.assertEqual(order.rental_status, "draft") + + def test_rental_status_cancel(self): + """Cancelled rental order should have 'cancel' status.""" + order = self._create_and_confirm_rental_order() + order._action_cancel() + self.assertEqual(order.rental_status, "cancel") + + def test_rental_status_return(self): + """Rental with completed outgoing picking should have 'return' status.""" + order = self._create_and_confirm_rental_order() + rental = order.rental_ids + out_picking = rental.out_move_id.picking_id + out_picking.action_assign() + out_picking.move_ids.quantity_done = out_picking.move_ids.product_uom_qty + out_picking.button_validate() + self.assertEqual(order.rental_status, "return") + + def test_rental_status_returned(self): + """Rental with both pickings completed should have 'returned' status.""" + order = self._create_and_confirm_rental_order() + rental = order.rental_ids + out_picking = rental.out_move_id.picking_id + out_picking.action_assign() + out_picking.move_ids.quantity_done = out_picking.move_ids.product_uom_qty + out_picking.button_validate() + in_picking = rental.in_move_id.picking_id + in_picking.action_assign() + in_picking.move_ids.quantity_done = in_picking.move_ids.product_uom_qty + in_picking.button_validate() + self.assertEqual(order.rental_status, "returned") diff --git a/sale_rental_extension/views/sale_order_rental_views.xml b/sale_rental_extension/views/sale_order_rental_views.xml index 78228367b..cf48e9220 100644 --- a/sale_rental_extension/views/sale_order_rental_views.xml +++ b/sale_rental_extension/views/sale_order_rental_views.xml @@ -39,6 +39,11 @@ + + + 1 + +