From cfe965f4aa5244b92cefa451aa79e7909f97173a Mon Sep 17 00:00:00 2001 From: Cedric Collins Date: Fri, 11 Aug 2023 17:26:04 -0500 Subject: [PATCH] [REM] sale_payment_deposit: moved to professional --- sale_payment_deposit/__init__.py | 1 - sale_payment_deposit/__manifest__.py | 25 ------ sale_payment_deposit/models/__init__.py | 4 - sale_payment_deposit/models/account.py | 32 ------- sale_payment_deposit/models/payment.py | 33 -------- sale_payment_deposit/models/sale.py | 49 ----------- sale_payment_deposit/models/sale_patch.py | 84 ------------------- sale_payment_deposit/views/account_views.xml | 14 ---- .../views/sale_portal_templates.xml | 24 ------ 9 files changed, 266 deletions(-) delete mode 100755 sale_payment_deposit/__init__.py delete mode 100755 sale_payment_deposit/__manifest__.py delete mode 100644 sale_payment_deposit/models/__init__.py delete mode 100644 sale_payment_deposit/models/account.py delete mode 100644 sale_payment_deposit/models/payment.py delete mode 100644 sale_payment_deposit/models/sale.py delete mode 100644 sale_payment_deposit/models/sale_patch.py delete mode 100644 sale_payment_deposit/views/account_views.xml delete mode 100644 sale_payment_deposit/views/sale_portal_templates.xml diff --git a/sale_payment_deposit/__init__.py b/sale_payment_deposit/__init__.py deleted file mode 100755 index 0650744f..00000000 --- a/sale_payment_deposit/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import models diff --git a/sale_payment_deposit/__manifest__.py b/sale_payment_deposit/__manifest__.py deleted file mode 100755 index c435a5a3..00000000 --- a/sale_payment_deposit/__manifest__.py +++ /dev/null @@ -1,25 +0,0 @@ -{ - 'name': 'Sale Payment Deposit', - 'author': 'Hibou Corp. ', - 'category': 'Sales', - 'license': 'AGPL-3', - 'version': '16.0.1.0.0', - 'description': - """ -Sale Deposits -============= - -Automates the creation of 'Deposit' invoices and payments. For example, someone confirming -a sale with "50% Deposit, 50% on Delivery" payment terms, will pay the -50% deposit payment up front instead of the entire order. - """, - 'depends': [ - 'sale', - 'payment', - ], - 'auto_install': False, - 'data': [ - 'views/account_views.xml', - 'views/sale_portal_templates.xml', - ], -} diff --git a/sale_payment_deposit/models/__init__.py b/sale_payment_deposit/models/__init__.py deleted file mode 100644 index c3152eb5..00000000 --- a/sale_payment_deposit/models/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from . import account -from . import payment -from . import sale -from . import sale_patch diff --git a/sale_payment_deposit/models/account.py b/sale_payment_deposit/models/account.py deleted file mode 100644 index 04b31246..00000000 --- a/sale_payment_deposit/models/account.py +++ /dev/null @@ -1,32 +0,0 @@ -from odoo import api, fields, models - - -class AccountPaymentTerm(models.Model): - _inherit = 'account.payment.term' - - deposit_percentage = fields.Float(string='Deposit Percentage', - help='Require Percentage deposit when paying on the front end.') - deposit_flat = fields.Float(string='Deposit Flat', - help='Require Flat deposit when paying on the front end.') - - -class PaymentTransaction(models.Model): - _inherit = 'payment.transaction' - - def _post_process_after_done(self): - now = fields.Datetime.now() - res = super(PaymentTransaction, self)._post_process_after_done() - - # Post Process Payments made on the front of the website, reconciling to Deposit. - for transaction in self.filtered(lambda t: t.payment_id - and t.sale_order_ids - and sum(t.sale_order_ids.mapped('amount_total_deposit')) - and not t.invoice_ids and (now - t.date).seconds < 1200): - if not transaction.sale_order_ids.mapped('invoice_ids'): - # don't process ones that we might still be able to process later... - transaction.write({'is_processed': False}) - else: - # we have a payment and could attempt to reconcile to an invoice - # Leave the payment in 'is_processed': True - transaction.sale_order_ids._auto_deposit_payment_match() - return res diff --git a/sale_payment_deposit/models/payment.py b/sale_payment_deposit/models/payment.py deleted file mode 100644 index f19bf7f1..00000000 --- a/sale_payment_deposit/models/payment.py +++ /dev/null @@ -1,33 +0,0 @@ -from odoo import models, _ - -import logging -_logger = logging.getLogger(__name__) - - -class PaymentTransaction(models.Model): - _inherit = 'payment.transaction' - - # Override to confirm payments totaling the amount_total_deposit - def _check_amount_and_confirm_order(self): - self.ensure_one() - for order in self.sale_order_ids.filtered(lambda so: so.state in ('draft', 'sent')): - # default amount as originally calculated - amount = order.amount_total - if order.amount_total_deposit: - amount = order.amount_total_deposit - if order.currency_id.compare_amounts(self.amount, amount) == 0: - order.with_context(send_email=True).action_confirm() - else: - _logger.warning( - '<%s> transaction AMOUNT MISMATCH for order %s (ID %s): expected %r, got %r', - self.acquirer_id.provider,order.name, order.id, - amount, self.amount, - ) - order.message_post( - subject=_("Amount Mismatch (%s)") % self.acquirer_id.provider, - body=_("The order was not confirmed despite response from the acquirer (%s): order total is %r but acquirer replied with %r.") % ( - self.acquirer_id.provider, - amount, - self.amount, - ) - ) diff --git a/sale_payment_deposit/models/sale.py b/sale_payment_deposit/models/sale.py deleted file mode 100644 index effa9af4..00000000 --- a/sale_payment_deposit/models/sale.py +++ /dev/null @@ -1,49 +0,0 @@ -from odoo import api, fields, models -from json import loads as json_loads - - -class SaleOrder(models.Model): - _inherit = 'sale.order' - - amount_total_deposit = fields.Monetary(string='Deposit', compute='_amount_total_deposit') - - @api.depends('amount_total', 'payment_term_id.deposit_percentage', 'payment_term_id.deposit_flat') - def _amount_total_deposit(self): - for order in self: - percent_deposit = order.amount_total * float(order.payment_term_id.deposit_percentage) / 100.0 - flat_deposite = float(order.payment_term_id.deposit_flat) - order.amount_total_deposit = percent_deposit + flat_deposite - - def action_confirm(self): - res = super(SaleOrder, self).action_confirm() - self._auto_deposit_invoice() - return res - - def _auto_deposit_invoice(self): - wizard_model = self.env['sale.advance.payment.inv'].sudo() - for sale in self.sudo().filtered(lambda o: not o.invoice_ids and o.amount_total_deposit): - # Create Deposit Invoices - wizard = wizard_model.create({ - 'advance_payment_method': 'fixed', - 'fixed_amount': sale.amount_total_deposit, - }) - wizard.with_context(active_ids=sale.ids).create_invoices() - # Validate Invoices - sale.invoice_ids.filtered(lambda i: i.state == 'draft').post() - # Attempt to reconcile - sale._auto_deposit_payment_match() - - def _auto_deposit_payment_match(self): - # Attempt to find payments that could be used on this new invoice and reconcile them. - # Note that this probably doesn't work for a payment made on the front, see .account.PaymentTransaction - aml_model = self.env['account.move.line'].sudo() - for sale in self.sudo(): - for invoice in sale.invoice_ids.filtered(lambda i: i.state == 'posted'): - outstanding = json_loads(invoice.invoice_outstanding_credits_debits_widget) - if isinstance(outstanding, dict) and outstanding.get('content'): - for line in outstanding.get('content'): - if abs(line.get('amount', 0.0) - invoice.amount_residual) < 0.01 and line.get('id'): - aml = aml_model.browse(line.get('id')) - aml += invoice.line_ids.filtered(lambda l: l.account_id == aml.account_id) - if aml.reconcile(): - break diff --git a/sale_payment_deposit/models/sale_patch.py b/sale_payment_deposit/models/sale_patch.py deleted file mode 100644 index ac6b533b..00000000 --- a/sale_payment_deposit/models/sale_patch.py +++ /dev/null @@ -1,84 +0,0 @@ -from odoo.exceptions import ValidationError -from odoo.addons.sale.models.sale_order import SaleOrder - - -def _create_payment_transaction(self, vals): - # This is a copy job from odoo.addons.sale.models.sale due to the closed nature of the vals.update(dict) call - # Ultimately, only the 'vals.update' with the new amount is really used. - '''Similar to self.env['payment.transaction'].create(vals) but the values are filled with the - current sales orders fields (e.g. the partner or the currency). - :param vals: The values to create a new payment.transaction. - :return: The newly created payment.transaction record. - ''' - # Ensure the currencies are the same. - - # extract variable for use later. - sale = self[0] - - currency = sale.pricelist_id.currency_id - if any([so.pricelist_id.currency_id != currency for so in self]): - raise ValidationError(_('A transaction can\'t be linked to sales orders having different currencies.')) - - # Ensure the partner are the same. - partner = sale.partner_id - if any([so.partner_id != partner for so in self]): - raise ValidationError(_('A transaction can\'t be linked to sales orders having different partners.')) - - # Try to retrieve the acquirer. However, fallback to the token's acquirer. - acquirer_id = vals.get('acquirer_id') - acquirer = False - payment_token_id = vals.get('payment_token_id') - - if payment_token_id: - payment_token = self.env['payment.token'].sudo().browse(payment_token_id) - - # Check payment_token/acquirer matching or take the acquirer from token - if acquirer_id: - acquirer = self.env['payment.acquirer'].browse(acquirer_id) - if payment_token and payment_token.acquirer_id != acquirer: - raise ValidationError(_('Invalid token found! Token acquirer %s != %s') % ( - payment_token.acquirer_id.name, acquirer.name)) - if payment_token and payment_token.partner_id != partner: - raise ValidationError(_('Invalid token found! Token partner %s != %s') % ( - payment_token.partner.name, partner.name)) - else: - acquirer = payment_token.acquirer_id - - # Check an acquirer is there. - if not acquirer_id and not acquirer: - raise ValidationError(_('A payment acquirer is required to create a transaction.')) - - if not acquirer: - acquirer = self.env['payment.acquirer'].browse(acquirer_id) - - # Check a journal is set on acquirer. - if not acquirer.journal_id: - raise ValidationError(_('A journal must be specified of the acquirer %s.' % acquirer.name)) - - if not acquirer_id and acquirer: - vals['acquirer_id'] = acquirer.id - - # Override for Deposit - amount = sum(self.mapped('amount_total')) - # This is a patch, all databases will run this code even if this field doesn't exist. - if hasattr(sale, 'amount_total_deposit') and sum(self.mapped('amount_total_deposit')): - amount = sum(self.mapped('amount_total_deposit')) - - vals.update({ - 'amount': amount, - 'currency_id': currency.id, - 'partner_id': partner.id, - 'sale_order_ids': [(6, 0, self.ids)], - }) - - transaction = self.env['payment.transaction'].create(vals) - - # Process directly if payment_token - if transaction.payment_token_id: - transaction.s2s_do_transaction() - - return transaction - - -# Patch core implementation. -SaleOrder._create_payment_transaction = _create_payment_transaction diff --git a/sale_payment_deposit/views/account_views.xml b/sale_payment_deposit/views/account_views.xml deleted file mode 100644 index d46a6a2c..00000000 --- a/sale_payment_deposit/views/account_views.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - account.payment.term.form.inherit - account.payment.term - - - - - - - - - \ No newline at end of file diff --git a/sale_payment_deposit/views/sale_portal_templates.xml b/sale_payment_deposit/views/sale_portal_templates.xml deleted file mode 100644 index 75987c19..00000000 --- a/sale_payment_deposit/views/sale_portal_templates.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - \ No newline at end of file