diff --git a/README.md b/README.md
index 04c7afcfe5..d44bf63db7 100644
--- a/README.md
+++ b/README.md
@@ -25,39 +25,43 @@ addon | version | maintainers | summary
[product_template_multi_link](product_template_multi_link/) | 18.0.1.0.1 | | Product Multi Links (Template)
[product_template_multi_link_date_span](product_template_multi_link_date_span/) | 18.0.1.0.0 | | Add an optional date span for when a link is active.
[product_variant_multi_link](product_variant_multi_link/) | 18.0.1.0.0 | | Product Multi Links (Variant)
-[website_sale_acquirer_confirm_order](website_sale_acquirer_confirm_order/) | 18.0.1.0.0 | | eCommerce Confirm Order By Payment Provider
-[website_sale_attribute_filter_form_submit](website_sale_attribute_filter_form_submit/) | 18.0.1.0.0 | | Allow to apply manually the filters on the e-commerce
+[website_sale_acquirer_confirm_order](website_sale_acquirer_confirm_order/) | 18.0.1.0.1 | | eCommerce Confirm Order By Payment Provider
+[website_sale_attribute_filter_form_submit](website_sale_attribute_filter_form_submit/) | 18.0.1.0.1 | | Allow to apply manually the filters on the e-commerce
[website_sale_b2x_alt_price](website_sale_b2x_alt_price/) | 18.0.1.0.0 | | Display prices with(out) taxes in eCommerce, complementing normal mode
[website_sale_barcode_search](website_sale_barcode_search/) | 18.0.1.0.0 | | It improve website product search adding search by barcode
[website_sale_cart_expire](website_sale_cart_expire/) | 18.0.1.0.1 | | Cancel carts without activity after a configurable time
[website_sale_category_breadcrumb](website_sale_category_breadcrumb/) | 18.0.1.0.0 | | Displays Product Category Breadcrumb(s) in eCommerce
+[website_sale_charge_payment_fee](website_sale_charge_payment_fee/) | 18.0.1.0.0 | | Payment fee charged to customer
[website_sale_checkout_country_vat](website_sale_checkout_country_vat/) | 18.0.1.0.0 | | Autocomplete VAT in checkout process
-[website_sale_checkout_skip_payment](website_sale_checkout_skip_payment/) | 18.0.1.1.0 | | Skip payment for logged users in checkout process
+[website_sale_checkout_skip_payment](website_sale_checkout_skip_payment/) | 18.0.1.1.1 | | Skip payment for logged users in checkout process
[website_sale_comparison_hide_price](website_sale_comparison_hide_price/) | 18.0.1.0.0 | | Hide product prices on the shop
+[website_sale_empty_cart](website_sale_empty_cart/) | 18.0.1.0.0 | | Adds a button in the website cart to empty all
[website_sale_hide_empty_category](website_sale_hide_empty_category/) | 18.0.1.0.1 | | Hide any Product Categories that are empty
[website_sale_hide_price](website_sale_hide_price/) | 18.0.1.0.0 | | Hide product prices on the shop
[website_sale_order_shipping_modification](website_sale_order_shipping_modification/) | 18.0.1.0.0 | | Change the delivery address in quotes from the portal
-[website_sale_order_type](website_sale_order_type/) | 18.0.1.0.0 | | This module allows sale_order_type to work with website_sale.
+[website_sale_order_type](website_sale_order_type/) | 18.0.1.0.1 | | This module allows sale_order_type to work with website_sale.
[website_sale_product_assortment](website_sale_product_assortment/) | 18.0.1.1.0 | | Use product assortments to display products available on e-commerce.
[website_sale_product_attribute_filter_category](website_sale_product_attribute_filter_category/) | 18.0.1.0.1 | | Allow group attributes in shop by categories
-[website_sale_product_attribute_value_filter_existing](website_sale_product_attribute_value_filter_existing/) | 18.0.1.1.2 | | Allow hide attributes values not used in variants
-[website_sale_product_brand](website_sale_product_brand/) | 18.0.1.0.0 | | Product Brand Filtering in Website
+[website_sale_product_attribute_value_filter_existing](website_sale_product_attribute_value_filter_existing/) | 18.0.1.1.3 | | Allow hide attributes values not used in variants
+[website_sale_product_brand](website_sale_product_brand/) | 18.0.1.0.1 | | Product Brand Filtering in Website
+[website_sale_product_description](website_sale_product_description/) | 18.0.1.0.0 | | Shows custom e-Commerce description for products
[website_sale_product_detail_attribute_image](website_sale_product_detail_attribute_image/) | 18.0.1.0.0 | | Display attributes images in shop product detail
[website_sale_product_eprel](website_sale_product_eprel/) | 18.0.1.0.0 | | Display EPREL energy label and product info on website product page.
[website_sale_product_item_cart_custom_qty](website_sale_product_item_cart_custom_qty/) | 18.0.1.0.0 | | Allows to add to cart from product items a custom quantity.
+[website_sale_product_minimal_price](website_sale_product_minimal_price/) | 18.0.1.0.0 | | Display minimal price for products that has variants
[website_sale_product_reference_displayed](website_sale_product_reference_displayed/) | 18.0.1.0.0 | | Display product reference in e-commerce
[website_sale_product_sort](website_sale_product_sort/) | 18.0.1.0.0 | | Allow to define default sort criteria for e-commerce
-[website_sale_require_legal](website_sale_require_legal/) | 18.0.1.0.1 | | Force the user to accept legal tems to buy in the web shop
-[website_sale_secondary_unit](website_sale_secondary_unit/) | 18.0.1.0.0 | | Allow manage secondary units in website shop
+[website_sale_require_legal](website_sale_require_legal/) | 18.0.1.0.2 | | Force the user to accept legal tems to buy in the web shop
+[website_sale_secondary_unit](website_sale_secondary_unit/) | 18.0.1.0.1 | | Allow manage secondary units in website shop
[website_sale_stock_available](website_sale_stock_available/) | 18.0.1.0.0 | | Display 'Available to promise' in shop online instead of 'Free To Use Quantity'
[website_sale_stock_list_preview](website_sale_stock_list_preview/) | 18.0.1.0.0 | | Show the stock of products on the product previews
-[website_sale_stock_provisioning_date](website_sale_stock_provisioning_date/) | 18.0.1.0.0 | | Display provisioning date for a product in shop online
+[website_sale_stock_provisioning_date](website_sale_stock_provisioning_date/) | 18.0.1.0.1 | | Display provisioning date for a product in shop online
[website_sale_suggest_create_account](website_sale_suggest_create_account/) | 18.0.1.0.0 | | Suggest users to create an account when buying in the website
[website_sale_tax_toggle](website_sale_tax_toggle/) | 18.0.1.0.0 | | Allow display price in Shop with or without taxes
[website_sale_vat_required](website_sale_vat_required/) | 18.0.1.0.0 | | VAT number required in checkout form
-[website_sale_wishlist_hide_price](website_sale_wishlist_hide_price/) | 18.0.1.0.0 | | Hide product prices on the shop
+[website_sale_wishlist_hide_price](website_sale_wishlist_hide_price/) | 18.0.1.0.1 | | Hide product prices on the shop
[website_sale_wishlist_keep](website_sale_wishlist_keep/) | 18.0.1.0.0 | | Allows to add products to my cart but keep it in my wishlist"
-[website_snippet_product_category](website_snippet_product_category/) | 18.0.1.1.0 | | Adds a new snippet to show e-commerce categories
+[website_snippet_product_category](website_snippet_product_category/) | 18.0.1.1.1 | | Adds a new snippet to show e-commerce categories
[//]: # (end addons)
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml
index d6478fef42..ba0014d0c8 100644
--- a/setup/_metapackage/pyproject.toml
+++ b/setup/_metapackage/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "odoo-addons-oca-e-commerce"
-version = "18.0.20260601.0"
+version = "18.0.20260604.3"
dependencies = [
"odoo-addon-product_template_multi_link==18.0.*",
"odoo-addon-product_template_multi_link_date_span==18.0.*",
@@ -11,9 +11,11 @@ dependencies = [
"odoo-addon-website_sale_barcode_search==18.0.*",
"odoo-addon-website_sale_cart_expire==18.0.*",
"odoo-addon-website_sale_category_breadcrumb==18.0.*",
+ "odoo-addon-website_sale_charge_payment_fee==18.0.*",
"odoo-addon-website_sale_checkout_country_vat==18.0.*",
"odoo-addon-website_sale_checkout_skip_payment==18.0.*",
"odoo-addon-website_sale_comparison_hide_price==18.0.*",
+ "odoo-addon-website_sale_empty_cart==18.0.*",
"odoo-addon-website_sale_hide_empty_category==18.0.*",
"odoo-addon-website_sale_hide_price==18.0.*",
"odoo-addon-website_sale_order_shipping_modification==18.0.*",
@@ -22,9 +24,11 @@ dependencies = [
"odoo-addon-website_sale_product_attribute_filter_category==18.0.*",
"odoo-addon-website_sale_product_attribute_value_filter_existing==18.0.*",
"odoo-addon-website_sale_product_brand==18.0.*",
+ "odoo-addon-website_sale_product_description==18.0.*",
"odoo-addon-website_sale_product_detail_attribute_image==18.0.*",
"odoo-addon-website_sale_product_eprel==18.0.*",
"odoo-addon-website_sale_product_item_cart_custom_qty==18.0.*",
+ "odoo-addon-website_sale_product_minimal_price==18.0.*",
"odoo-addon-website_sale_product_reference_displayed==18.0.*",
"odoo-addon-website_sale_product_sort==18.0.*",
"odoo-addon-website_sale_require_legal==18.0.*",
diff --git a/website_sale_acquirer_confirm_order/README.rst b/website_sale_acquirer_confirm_order/README.rst
index a15ab6d2f2..9b293ebf77 100644
--- a/website_sale_acquirer_confirm_order/README.rst
+++ b/website_sale_acquirer_confirm_order/README.rst
@@ -11,7 +11,7 @@ eCommerce Confirm Order By Payment Provider
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:b4acb28514b2ec11b329e403c3c2ead4900831d4e7e0cf9bbed6186da3eb3a8a
+ !! source digest: sha256:de184824440be6e5460fb891bdcebebd36ec746d71fc9434642dcbeabe2a811a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
diff --git a/website_sale_acquirer_confirm_order/__manifest__.py b/website_sale_acquirer_confirm_order/__manifest__.py
index 6d17fa485b..24f815658d 100644
--- a/website_sale_acquirer_confirm_order/__manifest__.py
+++ b/website_sale_acquirer_confirm_order/__manifest__.py
@@ -4,7 +4,7 @@
"name": "eCommerce Confirm Order By Payment Provider",
"summary": "eCommerce Confirm Order By Payment Provider",
"author": "Tecnativa, Odoo Community Association (OCA)",
- "version": "18.0.1.0.0",
+ "version": "18.0.1.0.1",
"category": "Website/Website",
"website": "https://github.com/OCA/e-commerce",
"maintainers": ["pilarvargas-tecnativa"],
diff --git a/website_sale_acquirer_confirm_order/static/description/index.html b/website_sale_acquirer_confirm_order/static/description/index.html
index c7f7df6fc4..2914777bc1 100644
--- a/website_sale_acquirer_confirm_order/static/description/index.html
+++ b/website_sale_acquirer_confirm_order/static/description/index.html
@@ -372,7 +372,7 @@
eCommerce Confirm Order By Payment Provider
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:b4acb28514b2ec11b329e403c3c2ead4900831d4e7e0cf9bbed6186da3eb3a8a
+!! source digest: sha256:de184824440be6e5460fb891bdcebebd36ec746d71fc9434642dcbeabe2a811a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:2233f253d965a8e91a0b97d7f1bc9df6186a65b928310dd95431f530dd9eec47
+!! source digest: sha256:2090971a75ea6e22ec34cdb6640b98828d985360dcd170f15723debf714ba7ee
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
This module allows to configure the website filters in an no automatic
diff --git a/website_sale_attribute_filter_form_submit/templates/website_sale.xml b/website_sale_attribute_filter_form_submit/templates/website_sale.xml
index 6bf56de8cb..731e8dab09 100644
--- a/website_sale_attribute_filter_form_submit/templates/website_sale.xml
+++ b/website_sale_attribute_filter_form_submit/templates/website_sale.xml
@@ -46,18 +46,29 @@
class="list-group list-group-flush"
t-if="a.display_type == 'select' or a.display_type == 'multi'"
>
-
+
+
Configuration -> Payments -> Payment Acquirers
+
+open an acquirer and in CHARGE PAYMENT FEE tab, you can set the fee to
+be charged to customer.
+
+Known issues / Roadmap
+======================
+
+- As for now, this module does not handle express checkout.
+
+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
+-------
+
+* Agile Business Group
+* AITIC S.A.S
+* Quartile Limited
+* Studio73
+
+Contributors
+------------
+
+- Lorenzo Battistini
+
+- AITIC S.A.
+
+- Quartile Limited
+
+- `Studio73 `__:
+
+ - Miguel Gandia
+
+Maintainers
+-----------
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-miguel-S73| image:: https://github.com/miguel-S73.png?size=40px
+ :target: https://github.com/miguel-S73
+ :alt: miguel-S73
+
+Current `maintainer `__:
+
+|maintainer-miguel-S73|
+
+This module is part of the `OCA/e-commerce `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_charge_payment_fee/__init__.py b/website_sale_charge_payment_fee/__init__.py
new file mode 100644
index 0000000000..f7209b1710
--- /dev/null
+++ b/website_sale_charge_payment_fee/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import controllers
diff --git a/website_sale_charge_payment_fee/__manifest__.py b/website_sale_charge_payment_fee/__manifest__.py
new file mode 100644
index 0000000000..49f94e8d92
--- /dev/null
+++ b/website_sale_charge_payment_fee/__manifest__.py
@@ -0,0 +1,31 @@
+# Copyright 2018 Lorenzo Battistini - Agile Business Group
+# Copyright 2020 AITIC S.A.S
+# Copyright 2020 Quartile Limited
+# Copyright 2024 Miguel Gandia - Studio73
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
+{
+ "name": "eCommerce: charge payment fee",
+ "summary": "Payment fee charged to customer",
+ "version": "18.0.1.0.0",
+ "category": "Website",
+ "website": "https://github.com/OCA/e-commerce",
+ "maintainers": ["miguel-S73"],
+ "author": "Agile Business Group, "
+ "AITIC S.A.S, "
+ "Quartile Limited, "
+ "Studio73, "
+ "Odoo Community Association (OCA)",
+ "license": "LGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": ["payment", "website_sale"],
+ "data": ["views/payment_provider_views.xml", "views/website_sale_templates.xml"],
+ "assets": {
+ "web.assets_frontend": [
+ "website_sale_charge_payment_fee/static/src/js/website_sale_fee.esm.js",
+ ],
+ "web.assets_tests": [
+ "website_sale_charge_payment_fee/static/tests/tours/website_sale_fee_tour.esm.js",
+ ],
+ },
+}
diff --git a/website_sale_charge_payment_fee/controllers/__init__.py b/website_sale_charge_payment_fee/controllers/__init__.py
new file mode 100644
index 0000000000..12a7e529b6
--- /dev/null
+++ b/website_sale_charge_payment_fee/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
diff --git a/website_sale_charge_payment_fee/controllers/main.py b/website_sale_charge_payment_fee/controllers/main.py
new file mode 100644
index 0000000000..4dc63a9e16
--- /dev/null
+++ b/website_sale_charge_payment_fee/controllers/main.py
@@ -0,0 +1,43 @@
+# Copyright 2018 Lorenzo Battistini - Agile Business Group
+# Copyright 2020 AITIC S.A.S
+# Copyright 2020 Quartile Limited
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
+
+from odoo import http
+from odoo.http import request
+
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+
+
+class WebsiteSaleFee(WebsiteSale):
+ @http.route(
+ "/shop/payment", type="http", auth="public", website=True, sitemap=False
+ )
+ def shop_payment(self, **post):
+ order = request.website.sudo().sale_get_order()
+ render_values = self._get_shop_payment_values(order, **post)
+ provider_id = post.get("provider_id")
+ payment_option_id = post.get("payment_option_id")
+ payment_methods_sudo = render_values.get("payment_methods_sudo")
+ providers_sudo = render_values.get("providers_sudo")
+ selected_provider = False
+ if provider_id or providers_sudo:
+ if provider_id:
+ selected_provider = request.env["payment.provider"].browse(
+ int(provider_id)
+ )
+ else:
+ _selected_provider = [
+ provider_sudo
+ for provider_sudo in payment_methods_sudo.provider_ids
+ if provider_sudo in providers_sudo
+ ][:1]
+ if len(_selected_provider) > 0:
+ selected_provider = _selected_provider[0]
+ order.sudo().update_fee_line(selected_provider.sudo())
+ res = super().shop_payment(**post)
+ if payment_option_id:
+ res.qcontext["selected_payment_method"] = int(payment_option_id)
+ if selected_provider:
+ res.qcontext["selected_provider"] = selected_provider
+ return res
diff --git a/website_sale_charge_payment_fee/i18n/es.po b/website_sale_charge_payment_fee/i18n/es.po
new file mode 100644
index 0000000000..d0670ed20f
--- /dev/null
+++ b/website_sale_charge_payment_fee/i18n/es.po
@@ -0,0 +1,111 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_charge_payment_fee
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-04-17 16:07+0000\n"
+"PO-Revision-Date: 2025-04-17 16:07+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.method_form_fee
+msgid "(Fee:"
+msgstr "(Tasa:"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_provider__charge_fee
+msgid ""
+"An extra fee line will be added to online order when using this payment "
+"method"
+msgstr ""
+"Se añadirá una línea de tarifa adicional al pedido en línea cuando se "
+"utilice este método de pago"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.provider_form_fee_inherit
+msgid "Charge payment fee"
+msgstr "Cargo por pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_type
+msgid "Computation type"
+msgstr "Tipo de computación"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_currency_id
+msgid "Fee Currency"
+msgstr "Divisa de la Tasa"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_description
+msgid "Fee Description"
+msgstr "Descripción de Tasa"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_product_id
+msgid "Fee Product"
+msgstr "Producto de tarifa"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee
+msgid "Fee charged to customer"
+msgstr "Tarifa cobrada al cliente"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields.selection,name:website_sale_charge_payment_fee.selection__payment_provider__charge_fee_type__fixed
+msgid "Fixed"
+msgstr "Fijo"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_fixed_price
+msgid "Fixed Price"
+msgstr "Precio Fijo"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.payment_fee
+msgid "Payment Fee"
+msgstr "Cuota de pago:"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_sale_order__amount_payment_fee
+msgid "Payment Fee Amount"
+msgstr "Importe de la tarifa de pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_payment_provider
+msgid "Payment Provider"
+msgstr "Proveedor de pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_sale_order_line__payment_fee_line
+msgid "Payment fee line"
+msgstr "Línea de cuota pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_percentage
+#: model:ir.model.fields.selection,name:website_sale_charge_payment_fee.selection__payment_provider__charge_fee_type__percentage
+msgid "Percentage"
+msgstr "Porcentaje"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_provider__charge_fee_percentage
+msgid "Percentage applied to order total"
+msgstr "Porcentaje aplicado al total del pedido"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order
+msgid "Sales Order"
+msgstr "Pedido de venta"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de pedido de venta"
diff --git a/website_sale_charge_payment_fee/i18n/es_AR.po b/website_sale_charge_payment_fee/i18n/es_AR.po
new file mode 100644
index 0000000000..efad6ff54d
--- /dev/null
+++ b/website_sale_charge_payment_fee/i18n/es_AR.po
@@ -0,0 +1,113 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_charge_payment_fee
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-06-01 03:04+0000\n"
+"PO-Revision-Date: 2020-06-01 03:04+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.payment_tokens_list_fee
+msgid "(Fee:"
+msgstr "(Cargo:"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.cart_lines_fee
+msgid "Add one"
+msgstr "Agregue uno"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee
+msgid "An extra fee line will be added to online order when using this payment method"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.acquirer_form_fee_inherit
+msgid "Charge payment fee"
+msgstr "Cargo por pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_type
+msgid "Computation type"
+msgstr "Tipo de computación"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_description
+msgid "Fee Description"
+msgstr "Descripción de la tarifa"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_product_id
+msgid "Fee Product"
+msgstr "Producto de tarifa"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee
+msgid "Fee charged to customer"
+msgstr "Tarifa cobrada al cliente"
+
+#. module: website_sale_charge_payment_fee
+#: selection:payment.acquirer,charge_fee_type:0
+msgid "Fixed"
+msgstr "Fijo"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_fixed_price
+msgid "Fixed Price"
+msgstr "Precio fijo"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_payment_acquirer
+msgid "Payment Acquirer"
+msgstr "Medio de pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_sale_order_line__payment_fee_line
+msgid "Payment fee line"
+msgstr "Línea de pago"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_percentage
+#: selection:payment.acquirer,charge_fee_type:0
+msgid "Percentage"
+msgstr "Porcentaje"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_percentage
+msgid "Percentage applied to order total"
+msgstr "Porcentaje aplicado al total del pedido"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.cart_lines_fee
+msgid "Remove from cart"
+msgstr "Eliminar del carrito"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.cart_lines_fee
+msgid "Remove one"
+msgstr "Eliminar uno"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order
+msgid "Sale Order"
+msgstr "Pedido de venta"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de pedido de venta"
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_acquirer__charge_fee_tax_ids
+msgid "Taxes"
+msgstr "Impuestos"
+
diff --git a/website_sale_charge_payment_fee/i18n/website_sale_charge_payment_fee.pot b/website_sale_charge_payment_fee/i18n/website_sale_charge_payment_fee.pot
new file mode 100644
index 0000000000..b19ca5d7ad
--- /dev/null
+++ b/website_sale_charge_payment_fee/i18n/website_sale_charge_payment_fee.pot
@@ -0,0 +1,107 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_charge_payment_fee
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.method_form_fee
+msgid "(Fee:"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_provider__charge_fee
+msgid ""
+"An extra fee line will be added to online order when using this payment "
+"method"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.provider_form_fee_inherit
+msgid "Charge payment fee"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_type
+msgid "Computation type"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_currency_id
+msgid "Fee Currency"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_description
+msgid "Fee Description"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_product_id
+msgid "Fee Product"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee
+msgid "Fee charged to customer"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields.selection,name:website_sale_charge_payment_fee.selection__payment_provider__charge_fee_type__fixed
+msgid "Fixed"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_fixed_price
+msgid "Fixed Price"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model_terms:ir.ui.view,arch_db:website_sale_charge_payment_fee.payment_fee
+msgid "Payment Fee"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_sale_order__amount_payment_fee
+msgid "Payment Fee Amount"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_payment_provider
+msgid "Payment Provider"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_sale_order_line__payment_fee_line
+msgid "Payment fee line"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,field_description:website_sale_charge_payment_fee.field_payment_provider__charge_fee_percentage
+#: model:ir.model.fields.selection,name:website_sale_charge_payment_fee.selection__payment_provider__charge_fee_type__percentage
+msgid "Percentage"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model.fields,help:website_sale_charge_payment_fee.field_payment_provider__charge_fee_percentage
+msgid "Percentage applied to order total"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
+#. module: website_sale_charge_payment_fee
+#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
diff --git a/website_sale_charge_payment_fee/models/__init__.py b/website_sale_charge_payment_fee/models/__init__.py
new file mode 100644
index 0000000000..816b38e533
--- /dev/null
+++ b/website_sale_charge_payment_fee/models/__init__.py
@@ -0,0 +1,3 @@
+from . import payment_provider
+from . import sale_order
+from . import sale_order_line
diff --git a/website_sale_charge_payment_fee/models/payment_provider.py b/website_sale_charge_payment_fee/models/payment_provider.py
new file mode 100644
index 0000000000..67b26f5652
--- /dev/null
+++ b/website_sale_charge_payment_fee/models/payment_provider.py
@@ -0,0 +1,41 @@
+# Copyright 2018 Lorenzo Battistini - Agile Business Group
+# Copyright 2020 AITIC S.A.S
+# Copyright 2020 Quartile Limited
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
+
+from odoo import api, fields, models
+
+
+class PaymentProvider(models.Model):
+ _inherit = "payment.provider"
+
+ charge_fee = fields.Boolean(
+ "Fee charged to customer",
+ help="An extra fee line will be added to online order when using this "
+ "payment method",
+ )
+ charge_fee_description = fields.Text(
+ "Fee Description", compute="_compute_charge_fee_description"
+ )
+ charge_fee_product_id = fields.Many2one(
+ "product.product", string="Fee Product", domain="[('type', '=', 'service')]"
+ )
+ charge_fee_fixed_price = fields.Float("Fixed Price", digits="Product Price")
+ charge_fee_currency_id = fields.Many2one("res.currency", string="Fee Currency")
+ charge_fee_percentage = fields.Float(
+ "Percentage", help="Percentage applied to order total"
+ )
+ charge_fee_type = fields.Selection(
+ [("fixed", "Fixed"), ("percentage", "Percentage")],
+ string="Computation type",
+ default="fixed",
+ )
+
+ @api.depends("charge_fee_product_id")
+ def _compute_charge_fee_description(self):
+ for provider in self:
+ provider.charge_fee_description = (
+ provider.charge_fee_product_id.name
+ if provider.charge_fee_product_id
+ else None
+ )
diff --git a/website_sale_charge_payment_fee/models/sale_order.py b/website_sale_charge_payment_fee/models/sale_order.py
new file mode 100644
index 0000000000..7748aa2d1d
--- /dev/null
+++ b/website_sale_charge_payment_fee/models/sale_order.py
@@ -0,0 +1,83 @@
+# Copyright 2018 Lorenzo Battistini - Agile Business Group
+# Copyright 2020 AITIC S.A.S
+# Copyright 2020 Quartile Limited
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
+
+from odoo import api, fields, models
+
+
+class SaleOrder(models.Model):
+ _inherit = "sale.order"
+
+ # Follow the field definition as amount_delivery from
+ # the website_sale_delivery module.
+ amount_payment_fee = fields.Monetary(
+ compute="_compute_amount_payment_fee",
+ string="Payment Fee Amount",
+ store=True,
+ tracking=True,
+ )
+
+ def _compute_website_order_line(self):
+ res = super()._compute_website_order_line()
+ for order in self:
+ order.website_order_line = order.website_order_line.filtered(
+ lambda line: not line.payment_fee_line
+ )
+ return res
+
+ @api.depends(
+ "order_line.price_unit",
+ "order_line.tax_id",
+ "order_line.discount",
+ "order_line.product_uom_qty",
+ )
+ def _compute_amount_payment_fee(self):
+ for order in self:
+ if (
+ self.env["website"]
+ .get_current_website()
+ .show_line_subtotals_tax_selection
+ == "tax_excluded"
+ ):
+ order.amount_payment_fee = sum(
+ order.order_line.filtered("payment_fee_line").mapped(
+ "price_subtotal"
+ )
+ )
+ else:
+ order.amount_payment_fee = sum(
+ order.order_line.filtered("payment_fee_line").mapped("price_total")
+ )
+
+ def update_fee_line(self, provider):
+ self.ensure_one()
+ for line in self.order_line:
+ if line.payment_fee_line:
+ line.unlink()
+ if provider.charge_fee:
+ if provider.charge_fee_type == "fixed":
+ price = provider.charge_fee_fixed_price
+ if (
+ provider.charge_fee_currency_id.id
+ != self.pricelist_id.currency_id.id
+ ):
+ price = provider.charge_fee_currency_id._convert(
+ price,
+ self.pricelist_id.currency_id,
+ self.company_id,
+ self.date_order,
+ )
+ elif provider.charge_fee_type == "percentage":
+ price = (provider.charge_fee_percentage / 100.0) * self.amount_total
+ self.env["sale.order.line"].create(
+ {
+ "order_id": self.id,
+ "payment_fee_line": True,
+ "product_id": provider.charge_fee_product_id.id,
+ "product_uom": provider.charge_fee_product_id.uom_id.id,
+ "name": provider.charge_fee_description,
+ "price_unit": price,
+ "product_uom_qty": 1,
+ }
+ )
diff --git a/website_sale_charge_payment_fee/models/sale_order_line.py b/website_sale_charge_payment_fee/models/sale_order_line.py
new file mode 100644
index 0000000000..06150137ff
--- /dev/null
+++ b/website_sale_charge_payment_fee/models/sale_order_line.py
@@ -0,0 +1,12 @@
+# Copyright 2018 Lorenzo Battistini - Agile Business Group
+# Copyright 2020 AITIC S.A.S
+# Copyright 2020 Quartile Limited
+# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
+
+from odoo import fields, models
+
+
+class SaleOrderLine(models.Model):
+ _inherit = "sale.order.line"
+
+ payment_fee_line = fields.Boolean("Payment fee line", readonly=True)
diff --git a/website_sale_charge_payment_fee/pyproject.toml b/website_sale_charge_payment_fee/pyproject.toml
new file mode 100644
index 0000000000..4231d0cccb
--- /dev/null
+++ b/website_sale_charge_payment_fee/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/website_sale_charge_payment_fee/readme/CONFIGURE.md b/website_sale_charge_payment_fee/readme/CONFIGURE.md
new file mode 100644
index 0000000000..2fa4b33273
--- /dev/null
+++ b/website_sale_charge_payment_fee/readme/CONFIGURE.md
@@ -0,0 +1,6 @@
+Click
+
+Accounting -\> Configuration -\> Payments -\> Payment Acquirers
+
+open an acquirer and in CHARGE PAYMENT FEE tab, you can set the fee to
+be charged to customer.
diff --git a/website_sale_charge_payment_fee/readme/CONTRIBUTORS.md b/website_sale_charge_payment_fee/readme/CONTRIBUTORS.md
new file mode 100644
index 0000000000..712a916a40
--- /dev/null
+++ b/website_sale_charge_payment_fee/readme/CONTRIBUTORS.md
@@ -0,0 +1,9 @@
+- Lorenzo Battistini \<\>
+
+- AITIC S.A. \<\>
+
+- Quartile Limited \<\>
+
+- [Studio73](https://www.studio73.es):
+
+ > - Miguel Gandia
diff --git a/website_sale_charge_payment_fee/readme/DESCRIPTION.md b/website_sale_charge_payment_fee/readme/DESCRIPTION.md
new file mode 100644
index 0000000000..aefdfc90e3
--- /dev/null
+++ b/website_sale_charge_payment_fee/readme/DESCRIPTION.md
@@ -0,0 +1,3 @@
+This module allows to associate generic payment fee to online payment
+methods. Thus, when website user select a payment method with additional
+fee, an additional sale order line will be added to online order
diff --git a/website_sale_charge_payment_fee/readme/ROADMAP.md b/website_sale_charge_payment_fee/readme/ROADMAP.md
new file mode 100644
index 0000000000..ff8f68576e
--- /dev/null
+++ b/website_sale_charge_payment_fee/readme/ROADMAP.md
@@ -0,0 +1 @@
+- As for now, this module does not handle express checkout.
\ No newline at end of file
diff --git a/website_sale_charge_payment_fee/static/description/icon.png b/website_sale_charge_payment_fee/static/description/icon.png
new file mode 100644
index 0000000000..3a0328b516
Binary files /dev/null and b/website_sale_charge_payment_fee/static/description/icon.png differ
diff --git a/website_sale_charge_payment_fee/static/description/index.html b/website_sale_charge_payment_fee/static/description/index.html
new file mode 100644
index 0000000000..39589dcacc
--- /dev/null
+++ b/website_sale_charge_payment_fee/static/description/index.html
@@ -0,0 +1,463 @@
+
+
+
+
+
+README.rst
+
+
+
+
This module allows to associate generic payment fee to online payment
+methods. Thus, when website user select a payment method with additional
+fee, an additional sale order line will be added to online order
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.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+
+
diff --git a/website_sale_checkout_skip_payment/README.rst b/website_sale_checkout_skip_payment/README.rst
index 96ceb3fd25..75ece5499e 100644
--- a/website_sale_checkout_skip_payment/README.rst
+++ b/website_sale_checkout_skip_payment/README.rst
@@ -11,7 +11,7 @@ Website Sale Checkout Skip Payment
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:f9e268081037d75ba0cab6482f2d2effac0a636924b3880cd2014003640ba2e4
+ !! source digest: sha256:78d6f06d08dab36040f8f88d30aaccc09c5408f0f8aec95d100b8fd775b767a6
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
diff --git a/website_sale_checkout_skip_payment/__manifest__.py b/website_sale_checkout_skip_payment/__manifest__.py
index db81a371fc..e6fa71a044 100644
--- a/website_sale_checkout_skip_payment/__manifest__.py
+++ b/website_sale_checkout_skip_payment/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "Website Sale Checkout Skip Payment",
"summary": "Skip payment for logged users in checkout process",
- "version": "18.0.1.1.0",
+ "version": "18.0.1.1.1",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
"author": "Tecnativa, Odoo Community Association (OCA)",
diff --git a/website_sale_checkout_skip_payment/static/description/index.html b/website_sale_checkout_skip_payment/static/description/index.html
index 55882d5fd8..043de59017 100644
--- a/website_sale_checkout_skip_payment/static/description/index.html
+++ b/website_sale_checkout_skip_payment/static/description/index.html
@@ -372,7 +372,7 @@
Website Sale Checkout Skip Payment
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:f9e268081037d75ba0cab6482f2d2effac0a636924b3880cd2014003640ba2e4
+!! source digest: sha256:78d6f06d08dab36040f8f88d30aaccc09c5408f0f8aec95d100b8fd775b767a6
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
This module allows to logged users to checkout with no payment step. At
diff --git a/website_sale_checkout_skip_payment/static/tests/tours/website_sale_checkout_skip_payment_tour.esm.js b/website_sale_checkout_skip_payment/static/tests/tours/website_sale_checkout_skip_payment_tour.esm.js
index 97ee37201c..80a069d5b8 100644
--- a/website_sale_checkout_skip_payment/static/tests/tours/website_sale_checkout_skip_payment_tour.esm.js
+++ b/website_sale_checkout_skip_payment/static/tests/tours/website_sale_checkout_skip_payment_tour.esm.js
@@ -1,7 +1,5 @@
-/** @odoo-module **/
-
-import {registry} from "@web/core/registry";
import * as tourUtils from "@website_sale/js/tours/tour_utils";
+import {registry} from "@web/core/registry";
registry.category("web_tour.tours").add("website_sale_checkout_skip_payment", {
url: "/shop",
diff --git a/website_sale_empty_cart/README.rst b/website_sale_empty_cart/README.rst
new file mode 100644
index 0000000000..453efc9ab8
--- /dev/null
+++ b/website_sale_empty_cart/README.rst
@@ -0,0 +1,106 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
+=======================
+Website Sale Empty Cart
+=======================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:00ad4769e0a0beacb7ca580e67d57fe4cfcf1f68fcd5b929ad7d77d40d9721b6
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
+ :target: https://github.com/OCA/e-commerce/tree/18.0/website_sale_empty_cart
+ :alt: OCA/e-commerce
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/e-commerce-18-0/e-commerce-18-0-website_sale_empty_cart
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=18.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module adds a button in the website cart that let users remove all
+the selected products at once
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Configuration
+=============
+
+To configure this module, you need to:
+
+- To enable (or disable) the cart empty button for a website, go to
+ Website / Configuration / Settings. Then search the "Cart Empty
+ Button" and edit its value.
+
+Usage
+=====
+
+To use this module, you need to:
+
+1. Go to the "/shop/cart" path of your server website. Example:
+ "http://localhost:8069/shop/cart"
+2. You will see your cart. If it is empty, go to "Shop" and add some
+ products.
+3. Click on the "Empty Cart" button.
+4. You will see the cart with no products.
+
+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
+-------
+
+* Sygel
+
+Contributors
+------------
+
+- `Sygel `__:
+
+ - Alberto Martínez
+ - Valentin Vinagre
+ - Harald Panten
+
+Maintainers
+-----------
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/e-commerce `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_empty_cart/__init__.py b/website_sale_empty_cart/__init__.py
new file mode 100644
index 0000000000..5c2bd8c997
--- /dev/null
+++ b/website_sale_empty_cart/__init__.py
@@ -0,0 +1,4 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import controllers
+from . import models
diff --git a/website_sale_empty_cart/__manifest__.py b/website_sale_empty_cart/__manifest__.py
new file mode 100644
index 0000000000..48d631738d
--- /dev/null
+++ b/website_sale_empty_cart/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2025 Alberto Martínez
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ "name": "Website Sale Empty Cart",
+ "summary": "Adds a button in the website cart to empty all",
+ "version": "18.0.1.0.0",
+ "website": "https://github.com/OCA/e-commerce",
+ "author": "Sygel, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": [
+ "website_sale",
+ ],
+ "data": [
+ "views/cart_templates.xml",
+ "views/res_config_settings.xml",
+ ],
+}
diff --git a/website_sale_empty_cart/controllers/__init__.py b/website_sale_empty_cart/controllers/__init__.py
new file mode 100644
index 0000000000..f43232f012
--- /dev/null
+++ b/website_sale_empty_cart/controllers/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import main
diff --git a/website_sale_empty_cart/controllers/main.py b/website_sale_empty_cart/controllers/main.py
new file mode 100644
index 0000000000..585c4a07ca
--- /dev/null
+++ b/website_sale_empty_cart/controllers/main.py
@@ -0,0 +1,18 @@
+# Copyright 2025 Alberto Martínez
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import http
+from odoo.http import request
+
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+
+
+class WebsiteSaleEmptyCart(WebsiteSale):
+ @http.route("/shop/cart", type="http", auth="public", website=True, sitemap=False)
+ def cart(self, access_token=None, revive="", **post):
+ empty_cart = post.get("empty_cart")
+ if empty_cart:
+ order = request.website.sale_get_order()
+ if order:
+ order.order_line.unlink()
+ return super().cart(access_token, revive, **post)
diff --git a/website_sale_empty_cart/i18n/es.po b/website_sale_empty_cart/i18n/es.po
new file mode 100644
index 0000000000..b79df19f01
--- /dev/null
+++ b/website_sale_empty_cart/i18n/es.po
@@ -0,0 +1,48 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_empty_cart
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2025-10-13 08:51+0000\n"
+"PO-Revision-Date: 2025-10-13 08:51+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Cart Empty Button"
+msgstr "Botón de vaciado de carrito"
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_res_config_settings
+msgid "Config Settings"
+msgstr "Ajustes de configuración"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.total_empty_cart
+msgid "Empty Cart"
+msgstr "Vaciar carrito"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Enable or disable the cart empty button"
+msgstr "Habilitar o deshabilitar el botón de vaciado de carrito"
+
+#. module: website_sale_empty_cart
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_res_config_settings__cart_empty_button
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_website__cart_empty_button
+msgid "Is the cart empty button enabled?"
+msgstr "Está el botón de vaciado de carrito habilitado?"
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_website
+msgid "Website"
+msgstr "Sitio web"
diff --git a/website_sale_empty_cart/i18n/it.po b/website_sale_empty_cart/i18n/it.po
new file mode 100644
index 0000000000..5562f33846
--- /dev/null
+++ b/website_sale_empty_cart/i18n/it.po
@@ -0,0 +1,48 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_empty_cart
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 17.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2025-11-28 10:43+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: none\n"
+"Language: it\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"
+"X-Generator: Weblate 5.10.4\n"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Cart Empty Button"
+msgstr "Pulsante svuota carrello"
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_res_config_settings
+msgid "Config Settings"
+msgstr "Impostazioni configurazione"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.total_empty_cart
+msgid "Empty Cart"
+msgstr "Svuota carrello"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Enable or disable the cart empty button"
+msgstr "Abilita o disabilita il pulsante svuota carrello"
+
+#. module: website_sale_empty_cart
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_res_config_settings__cart_empty_button
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_website__cart_empty_button
+msgid "Is the cart empty button enabled?"
+msgstr "Il pulsante svuota carrello è abilitato?"
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_website
+msgid "Website"
+msgstr "Sito web"
diff --git a/website_sale_empty_cart/i18n/website_sale_empty_cart.pot b/website_sale_empty_cart/i18n/website_sale_empty_cart.pot
new file mode 100644
index 0000000000..85fca492ab
--- /dev/null
+++ b/website_sale_empty_cart/i18n/website_sale_empty_cart.pot
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_empty_cart
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Cart Empty Button"
+msgstr ""
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_res_config_settings
+msgid "Config Settings"
+msgstr ""
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.total_empty_cart
+msgid "Empty Cart"
+msgstr ""
+
+#. module: website_sale_empty_cart
+#: model_terms:ir.ui.view,arch_db:website_sale_empty_cart.res_config_settings_view_form
+msgid "Enable or disable the cart empty button"
+msgstr ""
+
+#. module: website_sale_empty_cart
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_res_config_settings__cart_empty_button
+#: model:ir.model.fields,field_description:website_sale_empty_cart.field_website__cart_empty_button
+msgid "Is the cart empty button enabled?"
+msgstr ""
+
+#. module: website_sale_empty_cart
+#: model:ir.model,name:website_sale_empty_cart.model_website
+msgid "Website"
+msgstr ""
diff --git a/website_sale_empty_cart/models/__init__.py b/website_sale_empty_cart/models/__init__.py
new file mode 100644
index 0000000000..a424e440f1
--- /dev/null
+++ b/website_sale_empty_cart/models/__init__.py
@@ -0,0 +1,4 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import res_config_settings
+from . import website
diff --git a/website_sale_empty_cart/models/res_config_settings.py b/website_sale_empty_cart/models/res_config_settings.py
new file mode 100644
index 0000000000..8e26f0be79
--- /dev/null
+++ b/website_sale_empty_cart/models/res_config_settings.py
@@ -0,0 +1,14 @@
+# Copyright 2025 Alberto Martínez
+# 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"
+
+ cart_empty_button = fields.Boolean(
+ string="Is the cart empty button enabled?",
+ related="website_id.cart_empty_button",
+ readonly=False,
+ )
diff --git a/website_sale_empty_cart/models/website.py b/website_sale_empty_cart/models/website.py
new file mode 100644
index 0000000000..33db903182
--- /dev/null
+++ b/website_sale_empty_cart/models/website.py
@@ -0,0 +1,10 @@
+# Copyright 2025 Alberto Martínez
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class Website(models.Model):
+ _inherit = "website"
+
+ cart_empty_button = fields.Boolean(string="Is the cart empty button enabled?")
diff --git a/website_sale_empty_cart/pyproject.toml b/website_sale_empty_cart/pyproject.toml
new file mode 100644
index 0000000000..4231d0cccb
--- /dev/null
+++ b/website_sale_empty_cart/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/website_sale_empty_cart/readme/CONFIGURE.md b/website_sale_empty_cart/readme/CONFIGURE.md
new file mode 100755
index 0000000000..8bb42620ea
--- /dev/null
+++ b/website_sale_empty_cart/readme/CONFIGURE.md
@@ -0,0 +1,3 @@
+To configure this module, you need to:
+
+- To enable (or disable) the cart empty button for a website, go to Website / Configuration / Settings. Then search the "Cart Empty Button" and edit its value.
diff --git a/website_sale_empty_cart/readme/CONTRIBUTORS.md b/website_sale_empty_cart/readme/CONTRIBUTORS.md
new file mode 100755
index 0000000000..f566245042
--- /dev/null
+++ b/website_sale_empty_cart/readme/CONTRIBUTORS.md
@@ -0,0 +1,4 @@
+- [Sygel](https://www.sygel.es):
+ - Alberto Martínez
+ - Valentin Vinagre
+ - Harald Panten
diff --git a/website_sale_empty_cart/readme/DESCRIPTION.md b/website_sale_empty_cart/readme/DESCRIPTION.md
new file mode 100755
index 0000000000..993007564c
--- /dev/null
+++ b/website_sale_empty_cart/readme/DESCRIPTION.md
@@ -0,0 +1 @@
+This module adds a button in the website cart that let users remove all the selected products at once
diff --git a/website_sale_empty_cart/readme/USAGE.md b/website_sale_empty_cart/readme/USAGE.md
new file mode 100755
index 0000000000..64a0c7b99d
--- /dev/null
+++ b/website_sale_empty_cart/readme/USAGE.md
@@ -0,0 +1,6 @@
+To use this module, you need to:
+
+1. Go to the "/shop/cart" path of your server website. Example: "http://localhost:8069/shop/cart"
+2. You will see your cart. If it is empty, go to "Shop" and add some products.
+3. Click on the "Empty Cart" button.
+4. You will see the cart with no products.
diff --git a/website_sale_empty_cart/static/description/icon.png b/website_sale_empty_cart/static/description/icon.png
new file mode 100644
index 0000000000..3a0328b516
Binary files /dev/null and b/website_sale_empty_cart/static/description/icon.png differ
diff --git a/website_sale_empty_cart/static/description/icon.svg b/website_sale_empty_cart/static/description/icon.svg
new file mode 100644
index 0000000000..a7a26d0932
--- /dev/null
+++ b/website_sale_empty_cart/static/description/icon.svg
@@ -0,0 +1,79 @@
+
+
+
+
diff --git a/website_sale_empty_cart/static/description/index.html b/website_sale_empty_cart/static/description/index.html
new file mode 100644
index 0000000000..82fb44aeda
--- /dev/null
+++ b/website_sale_empty_cart/static/description/index.html
@@ -0,0 +1,458 @@
+
+
+
+
+
+README.rst
+
+
+
+
To enable (or disable) the cart empty button for a website, go to
+Website / Configuration / Settings. Then search the “Cart Empty
+Button” and edit its value.
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.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/e-commerce project on GitHub.
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
@@ -412,15 +417,15 @@