diff --git a/website_sale_installment/__init__.py b/website_sale_installment/__init__.py new file mode 100644 index 00000000..b6de2276 --- /dev/null +++ b/website_sale_installment/__init__.py @@ -0,0 +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 new file mode 100644 index 00000000..415f020e --- /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', + 'wizards/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..51f60b4f --- /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_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 new file mode 100644 index 00000000..9ca0abed --- /dev/null +++ b/website_sale_installment/models/website.py @@ -0,0 +1,11 @@ +from odoo import fields, models + + +class Website(models.Model): + + _inherit = 'website' + + installment_price_ids = fields.Many2many( + 'account.card.installment', + string='Installments', + ) 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/templates.xml b/website_sale_installment/views/templates.xml new file mode 100644 index 00000000..729ebadf --- /dev/null +++ b/website_sale_installment/views/templates.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + 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/wizards/res_config_setting.xml b/website_sale_installment/wizards/res_config_setting.xml new file mode 100644 index 00000000..c31f9b15 --- /dev/null +++ b/website_sale_installment/wizards/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/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 + )