From f1c2213c0a947b27a2198489ff29a95611adc10a Mon Sep 17 00:00:00 2001 From: eLBati Date: Mon, 4 Jun 2018 16:54:54 +0200 Subject: [PATCH 01/24] ADD website_sale_charge_payment_fee ADD website_sale_charge_payment_fee_delivery: link module ADD website_sale_charge_payment_fee_quote: link module --- website_sale_charge_payment_fee/README.rst | 78 +++++++++++++++ website_sale_charge_payment_fee/__init__.py | 5 + .../__manifest__.py | 23 +++++ .../controllers/__init__.py | 4 + .../controllers/website_sale.py | 31 ++++++ website_sale_charge_payment_fee/i18n/it.po | 98 +++++++++++++++++++ .../models/__init__.py | 5 + .../models/payment.py | 32 ++++++ .../models/sale.py | 44 +++++++++ .../readme/CONFIGURE.rst | 5 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../static/src/js/website_sale_fee.js | 26 +++++ .../templates/website_sale.xml | 60 ++++++++++++ .../views/payment_view.xml | 40 ++++++++ 15 files changed, 453 insertions(+) create mode 100644 website_sale_charge_payment_fee/README.rst create mode 100644 website_sale_charge_payment_fee/__init__.py create mode 100644 website_sale_charge_payment_fee/__manifest__.py create mode 100644 website_sale_charge_payment_fee/controllers/__init__.py create mode 100644 website_sale_charge_payment_fee/controllers/website_sale.py create mode 100644 website_sale_charge_payment_fee/i18n/it.po create mode 100644 website_sale_charge_payment_fee/models/__init__.py create mode 100644 website_sale_charge_payment_fee/models/payment.py create mode 100644 website_sale_charge_payment_fee/models/sale.py create mode 100644 website_sale_charge_payment_fee/readme/CONFIGURE.rst create mode 100644 website_sale_charge_payment_fee/readme/CONTRIBUTORS.rst create mode 100644 website_sale_charge_payment_fee/readme/DESCRIPTION.rst create mode 100644 website_sale_charge_payment_fee/static/src/js/website_sale_fee.js create mode 100644 website_sale_charge_payment_fee/templates/website_sale.xml create mode 100644 website_sale_charge_payment_fee/views/payment_view.xml diff --git a/website_sale_charge_payment_fee/README.rst b/website_sale_charge_payment_fee/README.rst new file mode 100644 index 0000000000..8c51f4f944 --- /dev/null +++ b/website_sale_charge_payment_fee/README.rst @@ -0,0 +1,78 @@ +============================= +eCommerce: charge payment fee +============================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github + :target: https://github.com/OCA/e-commerce/tree/10.0/website_sale_charge_payment_fee + :alt: OCA/e-commerce +.. |badge4| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/113/10.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| + +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 + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +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. + +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 smashing 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 + +Contributors +~~~~~~~~~~~~ + +* Lorenzo Battistini + +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_charge_payment_fee/__init__.py b/website_sale_charge_payment_fee/__init__.py new file mode 100644 index 0000000000..17a5bf9ce5 --- /dev/null +++ b/website_sale_charge_payment_fee/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +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..18e2f6b951 --- /dev/null +++ b/website_sale_charge_payment_fee/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Lorenzo Battistini - Agile Business Group +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +{ + "name": "eCommerce: charge payment fee", + "summary": "Payment fee charged to customer", + "version": "10.0.1.0.0", + "development_status": "Beta", + "category": "Website", + "website": "https://github.com/OCA/e-commerce", + "author": "Agile Business Group, Odoo Community Association (OCA)", + "license": "LGPL-3", + "application": False, + "installable": True, + "depends": [ + "website_sale", + ], + "data": [ + "views/payment_view.xml", + "templates/website_sale.xml" + ], +} 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..ac49d820bd --- /dev/null +++ b/website_sale_charge_payment_fee/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import website_sale diff --git a/website_sale_charge_payment_fee/controllers/website_sale.py b/website_sale_charge_payment_fee/controllers/website_sale.py new file mode 100644 index 0000000000..50cf76fdef --- /dev/null +++ b/website_sale_charge_payment_fee/controllers/website_sale.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo.http import request +from odoo import http +from odoo.addons.website_sale.controllers.main import WebsiteSale + + +class WebsiteSaleFee(WebsiteSale): + + @http.route() + def payment(self, **post): + res = super(WebsiteSaleFee, self).payment(**post) + values = res.qcontext + order = request.website.sale_get_order() + payment_fee_id = post.get('payment_fee_id') + if payment_fee_id or 'acquirers' in values: + # If 'acquirers' in values, default behaviour when acquirers are + # present, we update the order with the first one + # (see 'payment' template) + # If payment_fee_id, it means user selected it + # (see website_sale_fee.js) + if payment_fee_id: + selected_acquirer = request.env[ + 'payment.acquirer'].browse(int(payment_fee_id)) + values['selected_acquirer'] = selected_acquirer + else: + selected_acquirer = values['acquirers'][0] + order.sudo().update_fee_line(selected_acquirer.sudo()) + return request.render("website_sale.payment", values) + return res diff --git a/website_sale_charge_payment_fee/i18n/it.po b/website_sale_charge_payment_fee/i18n/it.po new file mode 100644 index 0000000000..15be98d9df --- /dev/null +++ b/website_sale_charge_payment_fee/i18n/it.po @@ -0,0 +1,98 @@ +# 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 10.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-06-08 10:08+0000\n" +"PO-Revision-Date: 2018-06-08 10:08+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:ir.ui.view,arch_db:website_sale_charge_payment_fee.payment_fee +msgid "(Fee:" +msgstr "(Tariffa:" + +#. 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 "Una tariffa aggiuntiva verrà aggiunta all'ordine online quando si utilizza questo metodo di pagamento" + +#. module: website_sale_charge_payment_fee +#: model:ir.ui.view,arch_db:website_sale_charge_payment_fee.acquirer_form_fee +msgid "Charge payment fee" +msgstr "Addebita tariffa di pagamento" + +#. 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 di calcolo" + +#. 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 "Descrizione tariffa" + +#. 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 "Prodotto tariffa" + +#. 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 "Tariffa addebitata al cliente" + +#. module: website_sale_charge_payment_fee +#: selection:payment.acquirer,charge_fee_type:0 +msgid "Fixed" +msgstr "Fisso" + +#. 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 "Prezzo Fisso" + +#. module: website_sale_charge_payment_fee +#: model:ir.model,name:website_sale_charge_payment_fee.model_payment_acquirer +msgid "Payment Acquirer" +msgstr "Acquirente di Pagamento" + +#. 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 "Riga tariffa pagamento" + +#. 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 "Percentuale" + +#. 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 "Percentuale applicata al totale dell'ordine" + +#. module: website_sale_charge_payment_fee +#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: website_sale_charge_payment_fee +#: model:ir.model,name:website_sale_charge_payment_fee.model_sale_order_line +msgid "Sales Order Line" +msgstr "Riga d'Ordine di Vendita" + +#. 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 "Imposte" + 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..b80a3a9e3e --- /dev/null +++ b/website_sale_charge_payment_fee/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import payment +from . import sale diff --git a/website_sale_charge_payment_fee/models/payment.py b/website_sale_charge_payment_fee/models/payment.py new file mode 100644 index 0000000000..3788f0acf1 --- /dev/null +++ b/website_sale_charge_payment_fee/models/payment.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import models, fields, api +import odoo.addons.decimal_precision as dp + + +class PaymentAcquirer(models.Model): + _inherit = 'payment.acquirer' + + 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") + charge_fee_product_id = fields.Many2one( + 'product.product', string="Fee Product") + charge_fee_tax_ids = fields.Many2many( + 'account.tax', string='Taxes') + charge_fee_fixed_price = fields.Float( + 'Fixed Price', digits=dp.get_precision('Product Price')) + 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.onchange("charge_fee_product_id") + def onchange_charge_fee_product_id(self): + if self.charge_fee_product_id: + self.charge_fee_description = self.charge_fee_product_id.name diff --git a/website_sale_charge_payment_fee/models/sale.py b/website_sale_charge_payment_fee/models/sale.py new file mode 100644 index 0000000000..989f9a79a2 --- /dev/null +++ b/website_sale_charge_payment_fee/models/sale.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import models, fields + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + def update_fee_line(self, acquirer): + for line in self.order_line: + if line.payment_fee_line: + line.unlink() + if acquirer.charge_fee: + if acquirer.charge_fee_type == 'fixed': + price = acquirer.charge_fee_fixed_price + if ( + self.company_id.currency_id.id != + self.pricelist_id.currency_id.id + ): + price = self.company_id.currency_id.with_context( + date=self.date_order + ).compute(price, self.pricelist_id.currency_id) + elif acquirer.charge_fee_type == 'percentage': + price = ( + acquirer.charge_fee_percentage / 100.0 + ) * self.amount_total + self.env['sale.order.line'].create({ + 'order_id': self.id, + 'payment_fee_line': True, + 'product_id': acquirer.charge_fee_product_id.id, + 'product_uom': acquirer.charge_fee_product_id.uom_id.id, + 'name': acquirer.charge_fee_description, + 'price_unit': price, + 'product_uom_qty': 1, + 'tax_id': [ + (6, 0, [t.id for t in acquirer.charge_fee_tax_ids]) + ], + }) + + +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/readme/CONFIGURE.rst b/website_sale_charge_payment_fee/readme/CONFIGURE.rst new file mode 100644 index 0000000000..66a127433f --- /dev/null +++ b/website_sale_charge_payment_fee/readme/CONFIGURE.rst @@ -0,0 +1,5 @@ +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.rst b/website_sale_charge_payment_fee/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..65a7e30bc6 --- /dev/null +++ b/website_sale_charge_payment_fee/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Lorenzo Battistini diff --git a/website_sale_charge_payment_fee/readme/DESCRIPTION.rst b/website_sale_charge_payment_fee/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..229cd5325a --- /dev/null +++ b/website_sale_charge_payment_fee/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +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/static/src/js/website_sale_fee.js b/website_sale_charge_payment_fee/static/src/js/website_sale_fee.js new file mode 100644 index 0000000000..1f01b75309 --- /dev/null +++ b/website_sale_charge_payment_fee/static/src/js/website_sale_fee.js @@ -0,0 +1,26 @@ +$(document).ready(function () { + + if (_.str.startsWith(window.location.pathname, "/shop/payment")) { + var $pay_button = $('.oe_sale_acquirer_button button'); + $pay_button.prop('disabled', false); + + // When choosing a payment, update the quotation. Disable the 'Pay + // Now' button to avoid being redirected to payment acquirer if the delivery carrier update is + // not over. + var $payment_method = $("#payment_method"); + var $selected_acquirer_id = $("input[name='selected_acquirer_id']"); + var selected_acquirer_id = $selected_acquirer_id.val(); + $payment_method.find("input[name='acquirer']").click(function (ev) { + var payment_id = $(ev.currentTarget).val(); + // We need to check selected_acquirer_id because website_sale module clicks on checked acquirer at page load. + // See website_sale/static/src/js/website_sale_payment.js : + // .find("input[name='acquirer']:checked").click(); + // Without this check, redirect would be performed right after page load + if (selected_acquirer_id != null && payment_id != selected_acquirer_id) { + $pay_button.prop('disabled', true); + window.location.href = '/shop/payment?payment_fee_id=' + payment_id; + } + }); + } + +}); diff --git a/website_sale_charge_payment_fee/templates/website_sale.xml b/website_sale_charge_payment_fee/templates/website_sale.xml new file mode 100644 index 0000000000..2d772d42f2 --- /dev/null +++ b/website_sale_charge_payment_fee/templates/website_sale.xml @@ -0,0 +1,60 @@ + + +