From 19aa12b8df9193c6ff050ddc7a996e802f45d6e4 Mon Sep 17 00:00:00 2001 From: Nguyen Minh Chien Date: Mon, 17 May 2021 03:44:34 +0000 Subject: [PATCH 1/8] [ADD] Product Returns and Refunds: Credit member at POS --- pos_payment_credit/__init__.py | 3 + pos_payment_credit/__manifest__.py | 26 +++++ .../data/account_journal_data.xml | 14 +++ pos_payment_credit/i18n/fr.po | 98 ++++++++++++++++ .../i18n/pos_payment_credit.pot | 98 ++++++++++++++++ .../12.0.1.0.1/post-update_payment_method.py | 19 +++ pos_payment_credit/models/__init__.py | 4 + .../models/account_bank_statement_line.py | 39 +++++++ pos_payment_credit/models/account_journal.py | 29 +++++ pos_payment_credit/models/res_partner.py | 31 +++++ pos_payment_credit/readme/CONTRIBUTORS.rst | 1 + pos_payment_credit/readme/DESCRIPTION.rst | 3 + pos_payment_credit/static/src/js/pos.js | 31 +++++ pos_payment_credit/static/src/js/screen.js | 109 ++++++++++++++++++ pos_payment_credit/static/src/xml/pos.xml | 26 +++++ .../views/account_journal_view.xml | 20 ++++ pos_payment_credit/views/assets.xml | 10 ++ pos_payment_credit/views/res_partner_view.xml | 16 +++ pos_payment_credit/wizard/__init__.py | 2 + pos_payment_credit/wizard/pos_make_payment.py | 13 +++ .../wizard/pos_make_payment_view.xml | 16 +++ 21 files changed, 608 insertions(+) create mode 100644 pos_payment_credit/__init__.py create mode 100644 pos_payment_credit/__manifest__.py create mode 100644 pos_payment_credit/data/account_journal_data.xml create mode 100644 pos_payment_credit/i18n/fr.po create mode 100644 pos_payment_credit/i18n/pos_payment_credit.pot create mode 100644 pos_payment_credit/migrations/12.0.1.0.1/post-update_payment_method.py create mode 100644 pos_payment_credit/models/__init__.py create mode 100644 pos_payment_credit/models/account_bank_statement_line.py create mode 100644 pos_payment_credit/models/account_journal.py create mode 100644 pos_payment_credit/models/res_partner.py create mode 100644 pos_payment_credit/readme/CONTRIBUTORS.rst create mode 100644 pos_payment_credit/readme/DESCRIPTION.rst create mode 100644 pos_payment_credit/static/src/js/pos.js create mode 100644 pos_payment_credit/static/src/js/screen.js create mode 100644 pos_payment_credit/static/src/xml/pos.xml create mode 100644 pos_payment_credit/views/account_journal_view.xml create mode 100644 pos_payment_credit/views/assets.xml create mode 100644 pos_payment_credit/views/res_partner_view.xml create mode 100644 pos_payment_credit/wizard/__init__.py create mode 100644 pos_payment_credit/wizard/pos_make_payment.py create mode 100644 pos_payment_credit/wizard/pos_make_payment_view.xml diff --git a/pos_payment_credit/__init__.py b/pos_payment_credit/__init__.py new file mode 100644 index 0000000000..0217b0f920 --- /dev/null +++ b/pos_payment_credit/__init__.py @@ -0,0 +1,3 @@ + +from . import models +from . import wizard diff --git a/pos_payment_credit/__manifest__.py b/pos_payment_credit/__manifest__.py new file mode 100644 index 0000000000..fe49894948 --- /dev/null +++ b/pos_payment_credit/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright 2016-2018 Sylvain LE GAL (https://twitter.com/legalsylvain) +# Copyright 2018 David Vidal +# Copyright 2018 Lambda IS DOOEL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Point of Sale Payment Credit', + 'version': '12.0.1.0.1', + 'category': 'Point Of Sale', + 'author': 'Trobz', + 'license': 'AGPL-3', + 'depends': [ + 'point_of_sale', + ], + 'data': [ + 'data/account_journal_data.xml', + "views/assets.xml", + 'views/account_journal_view.xml', + 'views/res_partner_view.xml', + 'wizard/pos_make_payment_view.xml', + ], + "qweb": [ + "static/src/xml/pos.xml", + ], + 'installable': True, +} diff --git a/pos_payment_credit/data/account_journal_data.xml b/pos_payment_credit/data/account_journal_data.xml new file mode 100644 index 0000000000..1469ab5152 --- /dev/null +++ b/pos_payment_credit/data/account_journal_data.xml @@ -0,0 +1,14 @@ + + + + + Credit + CRD + bank + + + 100 + + + + diff --git a/pos_payment_credit/i18n/fr.po b/pos_payment_credit/i18n/fr.po new file mode 100644 index 0000000000..499b759593 --- /dev/null +++ b/pos_payment_credit/i18n/fr.po @@ -0,0 +1,98 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_payment_credit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-04 09:40+0000\n" +"PO-Revision-Date: 2021-05-04 09:40+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: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_bank_statement_import_journal_creation__is_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_journal__is_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_pos_make_payment__is_credit +msgid "Allow to add credit for members" +msgstr "Permettre d'allouer un crédit aux membres" + +#. module: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_res_partner__credit_amount +#: model:ir.model.fields,field_description:pos_payment_credit.field_res_users__credit_amount +msgid "Available Credit" +msgstr "Crédit disponible" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:16 +#: code:addons/pos_payment_credit/static/src/xml/pos.xml:9 +#, python-format +msgid "Available Credit:" +msgstr "Crédit disponible:" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Ligne de relevé bancaire" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:41 +#, python-format +msgid "Confirming" +msgstr "Confirmer" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_res_partner +msgid "Contact" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/xml/pos.xml:19 +#: model_terms:ir.ui.view,arch_db:pos_payment_credit.view_partner_property_form_inherit +#, python-format +msgid "Credit" +msgstr "Crédit" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:42 +#, python-format +msgid "Pay using the member's available credit?" +msgstr "Payer en utilisant le crédit disponible du membre?" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:82 +#, python-format +msgid "Error" +msgstr "Erreur" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_account_journal +msgid "Journal" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_bank_statement_line__partner_id +msgid "Partner" +msgstr "Partenaire" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_pos_make_payment +msgid "Point of Sale Payment" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:83 +#, python-format +msgid "The credit amount is invalid!" +msgstr "Le montant du crédit saisi est incorrect" diff --git a/pos_payment_credit/i18n/pos_payment_credit.pot b/pos_payment_credit/i18n/pos_payment_credit.pot new file mode 100644 index 0000000000..2c1475cf64 --- /dev/null +++ b/pos_payment_credit/i18n/pos_payment_credit.pot @@ -0,0 +1,98 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_payment_credit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-05-04 09:40+0000\n" +"PO-Revision-Date: 2021-05-04 09:40+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: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_bank_statement_import_journal_creation__is_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_journal__is_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_pos_make_payment__is_credit +msgid "Allow to add credit for members" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_res_partner__credit_amount +#: model:ir.model.fields,field_description:pos_payment_credit.field_res_users__credit_amount +msgid "Available Credit" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:16 +#: code:addons/pos_payment_credit/static/src/xml/pos.xml:9 +#, python-format +msgid "Available Credit:" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:41 +#, python-format +msgid "Confirming" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_res_partner +msgid "Contact" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/xml/pos.xml:19 +#: model_terms:ir.ui.view,arch_db:pos_payment_credit.view_partner_property_form_inherit +#, python-format +msgid "Credit" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:42 +#, python-format +msgid "Pay using the member's available credit?" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:82 +#, python-format +msgid "Error" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_account_journal +msgid "Journal" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model.fields,field_description:pos_payment_credit.field_account_bank_statement_line__partner_id +msgid "Partner" +msgstr "" + +#. module: pos_payment_credit +#: model:ir.model,name:pos_payment_credit.model_pos_make_payment +msgid "Point of Sale Payment" +msgstr "" + +#. module: pos_payment_credit +#. openerp-web +#: code:addons/pos_payment_credit/static/src/js/screen.js:83 +#, python-format +msgid "The credit amount is invalid!" +msgstr "" diff --git a/pos_payment_credit/migrations/12.0.1.0.1/post-update_payment_method.py b/pos_payment_credit/migrations/12.0.1.0.1/post-update_payment_method.py new file mode 100644 index 0000000000..013f221f72 --- /dev/null +++ b/pos_payment_credit/migrations/12.0.1.0.1/post-update_payment_method.py @@ -0,0 +1,19 @@ +from odoo import api, SUPERUSER_ID + + +def migrate(cr, version): + """ + ADD `credit` to the payment methods of all point of sale + """ + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + credit_journal = env.ref('pos_payment_credit.credit_journal', False) + pos_configs = env['pos.config'].search([]) + if credit_journal and pos_configs: + # because of the stupid `_check_company_payment` constraint does + # not support multi-records. + for rec in pos_configs: + rec.write({ + 'journal_ids': [(4, credit_journal.id)] + }) + cr.execute("UPDATE account_journal SET sequence=10 WHERE sequence ISNULL") diff --git a/pos_payment_credit/models/__init__.py b/pos_payment_credit/models/__init__.py new file mode 100644 index 0000000000..779bd715e6 --- /dev/null +++ b/pos_payment_credit/models/__init__.py @@ -0,0 +1,4 @@ + +from . import account_bank_statement_line +from . import account_journal +from . import res_partner diff --git a/pos_payment_credit/models/account_bank_statement_line.py b/pos_payment_credit/models/account_bank_statement_line.py new file mode 100644 index 0000000000..809980c2f6 --- /dev/null +++ b/pos_payment_credit/models/account_bank_statement_line.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright since 2009 Trobz (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import api, fields, models + + +class AccountBankStatementLine(models.Model): + _inherit = 'account.bank.statement.line' + + partner_id = fields.Many2one( + inverse="_inverse_partner_id" + ) + + @api.multi + def _inverse_partner_id(self): + """ + Update the credit amount + """ + lines = self.filtered( + lambda l: l.amount and l.partner_id and l.journal_id.is_credit) + for line in lines: + line.sudo().partner_id.credit_amount -= line.amount diff --git a/pos_payment_credit/models/account_journal.py b/pos_payment_credit/models/account_journal.py new file mode 100644 index 0000000000..7fd8b26767 --- /dev/null +++ b/pos_payment_credit/models/account_journal.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright since 2009 Trobz (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import fields, models + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + is_credit = fields.Boolean( + string="Allow to add credit for members" + ) diff --git a/pos_payment_credit/models/res_partner.py b/pos_payment_credit/models/res_partner.py new file mode 100644 index 0000000000..621343b5a1 --- /dev/null +++ b/pos_payment_credit/models/res_partner.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright since 2009 Trobz (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + credit_amount = fields.Float( + string="Available Credit", + digits=0, + readonly=True, + ) diff --git a/pos_payment_credit/readme/CONTRIBUTORS.rst b/pos_payment_credit/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..d554928aa4 --- /dev/null +++ b/pos_payment_credit/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Trobz diff --git a/pos_payment_credit/readme/DESCRIPTION.rst b/pos_payment_credit/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..541558ca69 --- /dev/null +++ b/pos_payment_credit/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module extends the functionality of `Point of Sale`. + +Allow using the credit amount from the return pos order. \ No newline at end of file diff --git a/pos_payment_credit/static/src/js/pos.js b/pos_payment_credit/static/src/js/pos.js new file mode 100644 index 0000000000..ace14f69d9 --- /dev/null +++ b/pos_payment_credit/static/src/js/pos.js @@ -0,0 +1,31 @@ +/* +License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +*/ + +odoo.define('pos_payment_credit.coop_point_of_sale', function (require) { + "use strict"; + + var models = require('point_of_sale.models'); + + /* ******************************************************** + Overload models.PosModel + ******************************************************** */ + var _super_posmodel = models.PosModel.prototype; + models.load_fields("account.journal", [ + 'is_credit' + ]); + + models.PosModel = models.PosModel.extend({ + initialize: function (session, attributes) { + var partner_model = _.find(this.models, function(model){ return model.model === 'res.partner'; }); + partner_model.fields.push('credit_amount'); + return _super_posmodel.initialize.apply(this, arguments); + }, + }); + + models.Paymentline = models.Paymentline.extend({ + get_credit_payment: function () { + return this.cashregister.journal.is_credit; + }, + }); +}); \ No newline at end of file diff --git a/pos_payment_credit/static/src/js/screen.js b/pos_payment_credit/static/src/js/screen.js new file mode 100644 index 0000000000..bf5cca8f49 --- /dev/null +++ b/pos_payment_credit/static/src/js/screen.js @@ -0,0 +1,109 @@ +/* License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + odoo.define('pos_payment_credit.screens', function (require) { + "use strict"; + + var screens = require('point_of_sale.screens'); + var core = require('web.core'); + var _t = core._t; + var PaymentScreenWidget = screens.PaymentScreenWidget; + + PaymentScreenWidget.include({ + customer_changed: function () { + this._super.apply(this, arguments); + var client = this.pos.get_client(); + // Clear the credit payment + if (client && client.credit_amount){ + this.$('.js_customer_credit').text( _t("Available Credit:") + " " + this.format_currency(client.credit_amount)); + } + else { + this.$('.js_customer_credit').text(""); + } + }, + click_paymentmethods: function(id) { + this._super.apply(this, arguments); + // Update the amount based on the credit amount + this.apply_credit_amount(); + }, + apply_credit_amount: function() { + var self = this; + var order = this.pos.get_order(); + var line = order.selected_paymentline; + if (line && line.get_credit_payment()) { + var client = this.pos.get_client(); + var amount = order.get_due(line); + amount = Math.max(0, Math.min(amount, client.credit_amount)); + var amountFormatted = self.format_currency_no_symbol(amount); + line.set_amount(amount); + self.order_changes(); + self.render_paymentlines(); + self.$('.paymentline.selected .edit').text(amountFormatted); + self.gui.show_popup('confirm', { + 'title': _t('Confirming'), + 'body': _t("Pay using the member's available credit?"), + confirm: function () {}, + cancel: function () { + var selectedPaymentLineEle = $('.paymentline.selected'); + if (selectedPaymentLineEle) { + var paymentLineId = $(selectedPaymentLineEle[0]).find('.delete-button').data('cid'); + if(paymentLineId){ + self.click_delete_paymentline(paymentLineId); + } + } + }, + }); + } + }, + payment_input: function(input) { + this._super.apply(this, arguments); + + // popup block inputs to prevent sneak editing. + if (this.gui.has_popup()) { + return; + } + var self = this; + var order = this.pos.get_order(); + var line = order.selected_paymentline; + if (line && line.get_credit_payment()) { + var client = this.pos.get_client(); + var due_amount = order.get_due(line); + var line_amount = line.get_amount(); + var amount = Math.min(due_amount, line_amount); + var inamount = Math.max(0, Math.min(amount, client.credit_amount)); + if (line_amount != inamount){ + // Update the buffer + self.inputbuffer = inamount.toString(); + + var amountFormatted = self.format_currency_no_symbol(inamount); + line.set_amount(inamount); + self.order_changes(); + self.render_paymentlines(); + self.$('.paymentline.selected .edit').text(amountFormatted); + self.gui.show_popup('alert', { + title: _t('Error'), + body: _t('The credit amount is invalid!'), + }); + } + } + }, + }); + screens.ClientListScreenWidget.include({ + // When changing a customer, we want to destroy the credit + // payment lines + // because they could be linked to another customer. + // Just in case we destroy all + has_client_changed: function () { + var changed = this._super(); + if (changed){ + var order = this.pos.get('selectedOrder'); + var paymentlines = order.paymentlines; + for (var i = 0; i < paymentlines.models.length; i++) { + var payment_line = paymentlines.models[i]; + if (payment_line.get_credit_payment()){ + payment_line.destroy(); + } + } + } + return changed + }, + }); +}); diff --git a/pos_payment_credit/static/src/xml/pos.xml b/pos_payment_credit/static/src/xml/pos.xml new file mode 100644 index 0000000000..f5c061115d --- /dev/null +++ b/pos_payment_credit/static/src/xml/pos.xml @@ -0,0 +1,26 @@ + + + + + +
+ + + + Available Credit: + + +
+
+
+ + +
+ Credit + + + +
+
+
+
diff --git a/pos_payment_credit/views/account_journal_view.xml b/pos_payment_credit/views/account_journal_view.xml new file mode 100644 index 0000000000..ccd734418f --- /dev/null +++ b/pos_payment_credit/views/account_journal_view.xml @@ -0,0 +1,20 @@ + + + + + account.journal + + + + + + + {'required': [('is_credit', '=', True)]} + + + {'required': [('is_credit', '=', True)]} + + + + + diff --git a/pos_payment_credit/views/assets.xml b/pos_payment_credit/views/assets.xml new file mode 100644 index 0000000000..842822d3f8 --- /dev/null +++ b/pos_payment_credit/views/assets.xml @@ -0,0 +1,10 @@ + + + +