From 16b0178190504d983de15d7e931c51862c00d86c Mon Sep 17 00:00:00 2001 From: filoquin Date: Wed, 14 Sep 2022 07:49:34 -0300 Subject: [PATCH 1/2] [ADD] Add website sale installment module --- website_sale_installment/__init__.py | 2 + website_sale_installment/__manifest__.py | 26 ++++++ .../controllers/__init__.py | 1 + website_sale_installment/controllers/main.py | 18 ++++ website_sale_installment/models/__init__.py | 3 + .../models/account_card.py | 8 ++ .../models/product_template.py | 43 ++++++++++ website_sale_installment/models/website.py | 22 +++++ .../static/src/js/card_installment.js | 82 +++++++++++++++++++ .../static/src/xml/card_installment.xml | 32 ++++++++ .../views/account_card.xml | 27 ++++++ .../views/res_config_setting.xml | 29 +++++++ website_sale_installment/views/templates.xml | 60 ++++++++++++++ 13 files changed, 353 insertions(+) create mode 100644 website_sale_installment/__init__.py create mode 100644 website_sale_installment/__manifest__.py create mode 100644 website_sale_installment/controllers/__init__.py create mode 100644 website_sale_installment/controllers/main.py create mode 100644 website_sale_installment/models/__init__.py create mode 100644 website_sale_installment/models/account_card.py create mode 100644 website_sale_installment/models/product_template.py create mode 100644 website_sale_installment/models/website.py create mode 100644 website_sale_installment/static/src/js/card_installment.js create mode 100644 website_sale_installment/static/src/xml/card_installment.xml create mode 100644 website_sale_installment/views/account_card.xml create mode 100644 website_sale_installment/views/res_config_setting.xml create mode 100644 website_sale_installment/views/templates.xml diff --git a/website_sale_installment/__init__.py b/website_sale_installment/__init__.py new file mode 100644 index 00000000..f7209b17 --- /dev/null +++ b/website_sale_installment/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import controllers diff --git a/website_sale_installment/__manifest__.py b/website_sale_installment/__manifest__.py new file mode 100644 index 00000000..0a8a9885 --- /dev/null +++ b/website_sale_installment/__manifest__.py @@ -0,0 +1,26 @@ +{ + 'name': 'Website Sale Card Installment', + 'category': 'Website', + 'summary': 'Website Sale', + 'version': "15.0.1.0.0", + 'author': 'ADHOC SA', + 'website': 'www.adhoc.com.ar', + 'license': 'AGPL-3', + 'depends': [ + 'website', + 'website_sale', + 'card_installment', + ], + 'data': [ + 'views/templates.xml', + 'views/account_card.xml', + 'views/res_config_setting.xml', + ], + 'assets': { + 'web.assets_frontend': [ + 'website_sale_installment/static/src/js/card_installment.js', + ], + }, + 'installable': True, + 'application': False, +} diff --git a/website_sale_installment/controllers/__init__.py b/website_sale_installment/controllers/__init__.py new file mode 100644 index 00000000..deec4a8b --- /dev/null +++ b/website_sale_installment/controllers/__init__.py @@ -0,0 +1 @@ +from . import main \ No newline at end of file diff --git a/website_sale_installment/controllers/main.py b/website_sale_installment/controllers/main.py new file mode 100644 index 00000000..6389bc08 --- /dev/null +++ b/website_sale_installment/controllers/main.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.http import request + + +class WebsiteSale(http.Controller): + @http.route(['/installment_prices'], type='json', auth="public", methods=['POST'], website=True) + def product_installment(self, product_tmpl, product, **post): + product_tmpl_id = request.env['product.template'].browse(int(product_tmpl)).exists() + return product_tmpl_id._website_installment_variant_tree(int(product)) + + @http.route(['/installment_page/'], type='http', auth="public", methods=['GET'], website=True) + def page_product_installment(self, product, **post): + render_values = { + 'installment_tree': product._website_installment_tree(), + 'product_template': product, + } + return request.render("website_sale_installment.product_installment_page", render_values) diff --git a/website_sale_installment/models/__init__.py b/website_sale_installment/models/__init__.py new file mode 100644 index 00000000..1c49ff7a --- /dev/null +++ b/website_sale_installment/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_template +from . import account_card +from . import website \ No newline at end of file diff --git a/website_sale_installment/models/account_card.py b/website_sale_installment/models/account_card.py new file mode 100644 index 00000000..8b85c030 --- /dev/null +++ b/website_sale_installment/models/account_card.py @@ -0,0 +1,8 @@ +from odoo import models + + +class AccountCard(models.Model): + + _inherit = ['account.card', 'website.published.multi.mixin'] + _name = 'account.card' + diff --git a/website_sale_installment/models/product_template.py b/website_sale_installment/models/product_template.py new file mode 100644 index 00000000..5468a329 --- /dev/null +++ b/website_sale_installment/models/product_template.py @@ -0,0 +1,43 @@ +from odoo import fields, models + + +class ProductTemplate(models.Model): + + _inherit = 'product.template' + + def _website_installment_tree(self): + self.ensure_one() + current_website = self.env['website'].get_current_website() + installment_ids = self.env['account.card.installment'].sudo().search([ + ('card_id.website_published', '=', True) + ]) + pricelist = current_website.get_current_pricelist() + + context = dict(self.env.context, quantity=1, pricelist=pricelist.id) + product_template = self.with_context(context) + list_price = product_template.price_compute('list_price')[product_template.id] + tax_price = product_template.taxes_id.compute_all(list_price)['total_included'] + return installment_ids.card_installment_tree(tax_price) + + def _website_installment_variant_tree(self, product_id): + self.ensure_one() + current_website = self.env['website'].get_current_website() + installment_ids = self.env['account.card.installment'].sudo().search([ + ('card_id.website_published', '=', True) + ]) + pricelist = current_website.get_current_pricelist() + combination_info = self._get_combination_info(product_id=product_id, add_qty=1, pricelist=pricelist) + return installment_ids.card_installment_tree(combination_info['list_price']) + + def _get_combination_info(self, combination=False, product_id=False, add_qty=1, pricelist=False, parent_combination=False, only_template=False): + + combination_info = super()._get_combination_info(combination, product_id, + add_qty, pricelist, parent_combination, only_template) + combination_info['installment_price'] = [] + if self.env.context.get('website_id'): + website = self.env['website'].get_current_website() + if website.installment_price_id: + combination_info['installment_price'] = website.installment_price_id.card_installment_tree(combination_info['price']) + + return combination_info + diff --git a/website_sale_installment/models/website.py b/website_sale_installment/models/website.py new file mode 100644 index 00000000..9e61f353 --- /dev/null +++ b/website_sale_installment/models/website.py @@ -0,0 +1,22 @@ +from odoo import fields, models + + +class Website(models.Model): + + _inherit = 'website' + + installment_price_id = fields.Many2one( + 'account.card.instalment', + string='Second price', + ) + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + installment_price_id = fields.Many2one( + 'account.card.instalment', + string='Second price', + related='website_id.installment_price_id', + readonly=False + ) diff --git a/website_sale_installment/static/src/js/card_installment.js b/website_sale_installment/static/src/js/card_installment.js new file mode 100644 index 00000000..2b11f83c --- /dev/null +++ b/website_sale_installment/static/src/js/card_installment.js @@ -0,0 +1,82 @@ +odoo.define('website_sale_installment.installment_popup', function (require) { + 'use strict'; + + + var core = require('web.core'); + var publicWidget = require('web.public.widget'); + const Dialog = require('web.Dialog'); + var utils = require('web.utils'); + var website_sale_utils = require('website_sale.utils'); + var VariantMixin = require('sale.VariantMixin'); + + var qweb = core.qweb; + var _t = core._t; + publicWidget.registry.installmentPopup = publicWidget.Widget.extend( { + xmlDependencies: ['/website_sale_installment/static/src/xml/card_installment.xml'], + //template: 'website_sale_installment.instalment_popup', + selector: '.js_card', + init: function () { + this._super.apply(this, arguments); + }, + events: { + 'change .card': '_onChangeCardSelector', + 'click .o_installment_button': '_openInstallmentPopUp', + }, + _openInstallmentPopUp: function(event){ + let product_product_id = document.querySelector('input.product_id').value; + let product_template_id = document.querySelector('input.product_template_id').value; + var self = this; + this._rpc({ + route: '/installment_prices', + params: { + product_tmpl: product_template_id, + product: product_product_id, + }, + }).then(function (data) { + let content = $(qweb.render('website_sale_installment.instalment_popup', { + installment_tree: data, + _priceToStr: VariantMixin._priceToStr + })); + + const dialog = new Dialog(this, { + size: 'medium', + title: "Calcula tus cuotas", + renderFooter: false , + $content: content , + }); + dialog._opened.then(() => { + let card_selector = dialog.el.querySelector('.o_card_selector'); + card_selector.addEventListener('change', function(event){ + self._onChangeDialogCardSelector(event, dialog.el); + }); + }); + dialog.open(); + + }); + }, + _onChangeDialogCardSelector : function(event, dialog_element){ + let selected_card = event.target.options[event.target.selectedIndex]; + let all_installment_list = dialog_element.querySelectorAll('.o_card_list'); + for(var i = 0, all = all_installment_list.length; i < all; i++){ + all_installment_list[i].classList.add("d-none"); + } + if (selected_card.value){ + let installment_list = dialog_element.querySelector('#o_card_' + selected_card.value); + if (installment_list) installment_list.classList.remove("d-none"); + } + + }, + _onChangeCardSelector : function(event){ + let selected_card = event.target.options[event.target.selectedIndex]; + let all_installment_list = this.el.querySelectorAll('.o_card_list'); + for(var i = 0, all = all_installment_list.length; i < all; i++){ + all_installment_list[i].classList.add("d-none"); + } + if (selected_card.value){ + let installment_list = this.el.querySelector('#o_card_' + selected_card.value); + installment_list.classList.remove("d-none"); + } + + }, + }); +}); diff --git a/website_sale_installment/static/src/xml/card_installment.xml b/website_sale_installment/static/src/xml/card_installment.xml new file mode 100644 index 00000000..bbbe694a --- /dev/null +++ b/website_sale_installment/static/src/xml/card_installment.xml @@ -0,0 +1,32 @@ + + + +
+ + +
+
+ +
+ +
+
+ +
    +
  • + Un pago de + cuotas de + cuotas de + + (total + + ) +
  • +
+ +
+ +
diff --git a/website_sale_installment/views/account_card.xml b/website_sale_installment/views/account_card.xml new file mode 100644 index 00000000..9bb9901b --- /dev/null +++ b/website_sale_installment/views/account_card.xml @@ -0,0 +1,27 @@ + + + + account_card.tree + account.card + + + + + + + + + + account_card.form + account.card + + + + + + + + + + + diff --git a/website_sale_installment/views/res_config_setting.xml b/website_sale_installment/views/res_config_setting.xml new file mode 100644 index 00000000..6dbfbe69 --- /dev/null +++ b/website_sale_installment/views/res_config_setting.xml @@ -0,0 +1,29 @@ + + + + res.config.settings.view.form.inherit.website.sale + res.config.settings + + +
+
+

Prices

+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/website_sale_installment/views/templates.xml b/website_sale_installment/views/templates.xml new file mode 100644 index 00000000..4c13b1b0 --- /dev/null +++ b/website_sale_installment/views/templates.xml @@ -0,0 +1,60 @@ + + + + + + + + + + From bd203507f0d7ec7096d53ce708ed7327896ac4c6 Mon Sep 17 00:00:00 2001 From: filoquin Date: Mon, 19 Sep 2022 11:44:19 -0300 Subject: [PATCH 2/2] [WIP] Agrego cuotas en los items de producto --- website_sale_installment/__init__.py | 1 + website_sale_installment/__manifest__.py | 2 +- .../models/product_template.py | 4 +- website_sale_installment/models/website.py | 17 ++------- website_sale_installment/views/templates.xml | 38 ++++++++++++++++++- website_sale_installment/wizards/__init__.py | 1 + .../{views => wizards}/res_config_setting.xml | 4 +- .../wizards/res_config_settings.py | 12 ++++++ 8 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 website_sale_installment/wizards/__init__.py rename website_sale_installment/{views => wizards}/res_config_setting.xml (95%) create mode 100644 website_sale_installment/wizards/res_config_settings.py diff --git a/website_sale_installment/__init__.py b/website_sale_installment/__init__.py index f7209b17..b6de2276 100644 --- a/website_sale_installment/__init__.py +++ b/website_sale_installment/__init__.py @@ -1,2 +1,3 @@ from . import models from . import controllers +from . import wizards diff --git a/website_sale_installment/__manifest__.py b/website_sale_installment/__manifest__.py index 0a8a9885..415f020e 100644 --- a/website_sale_installment/__manifest__.py +++ b/website_sale_installment/__manifest__.py @@ -14,7 +14,7 @@ 'data': [ 'views/templates.xml', 'views/account_card.xml', - 'views/res_config_setting.xml', + 'wizards/res_config_setting.xml', ], 'assets': { 'web.assets_frontend': [ diff --git a/website_sale_installment/models/product_template.py b/website_sale_installment/models/product_template.py index 5468a329..51f60b4f 100644 --- a/website_sale_installment/models/product_template.py +++ b/website_sale_installment/models/product_template.py @@ -36,8 +36,8 @@ def _get_combination_info(self, combination=False, product_id=False, add_qty=1, combination_info['installment_price'] = [] if self.env.context.get('website_id'): website = self.env['website'].get_current_website() - if website.installment_price_id: - combination_info['installment_price'] = website.installment_price_id.card_installment_tree(combination_info['price']) + if website.installment_price_ids: + combination_info['installment_price'] = website.installment_price_ids.card_installment_tree(combination_info['price']) return combination_info diff --git a/website_sale_installment/models/website.py b/website_sale_installment/models/website.py index 9e61f353..9ca0abed 100644 --- a/website_sale_installment/models/website.py +++ b/website_sale_installment/models/website.py @@ -5,18 +5,7 @@ class Website(models.Model): _inherit = 'website' - installment_price_id = fields.Many2one( - 'account.card.instalment', - string='Second price', - ) - - -class ResConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' - - installment_price_id = fields.Many2one( - 'account.card.instalment', - string='Second price', - related='website_id.installment_price_id', - readonly=False + installment_price_ids = fields.Many2many( + 'account.card.installment', + string='Installments', ) diff --git a/website_sale_installment/views/templates.xml b/website_sale_installment/views/templates.xml index 4c13b1b0..729ebadf 100644 --- a/website_sale_installment/views/templates.xml +++ b/website_sale_installment/views/templates.xml @@ -1,5 +1,32 @@ + + + - + diff --git a/website_sale_installment/wizards/__init__.py b/website_sale_installment/wizards/__init__.py new file mode 100644 index 00000000..aba22284 --- /dev/null +++ b/website_sale_installment/wizards/__init__.py @@ -0,0 +1 @@ +from . import res_config_settings \ No newline at end of file diff --git a/website_sale_installment/views/res_config_setting.xml b/website_sale_installment/wizards/res_config_setting.xml similarity index 95% rename from website_sale_installment/views/res_config_setting.xml rename to website_sale_installment/wizards/res_config_setting.xml index 6dbfbe69..c31f9b15 100644 --- a/website_sale_installment/views/res_config_setting.xml +++ b/website_sale_installment/wizards/res_config_setting.xml @@ -11,12 +11,12 @@
-
diff --git a/website_sale_installment/wizards/res_config_settings.py b/website_sale_installment/wizards/res_config_settings.py new file mode 100644 index 00000000..a7711192 --- /dev/null +++ b/website_sale_installment/wizards/res_config_settings.py @@ -0,0 +1,12 @@ +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + installment_price_ids = fields.Many2many( + 'account.card.installment', + string='Installments', + related='website_id.installment_price_ids', + readonly=False + )