[FIX] payment,sale_payment: extract code to overridable methods

- We extract some code logic to methods to allow to override them.
  This is needed for the subscription module where a payment token need
  to be copied from a transaction to a subscription.
  The subscriptions is created from a sale order and before the
  payment.transaction holding the payment.token id is validated.
  Since the payment.transaction is not validated, the subscription
  module doesn't find the correct transaction.

  By extracting this code logic, we can override exactly when it should
  be.
This commit is contained in:
Toufik Benjaa
2018-09-07 19:26:51 +02:00
parent f63bf09cdd
commit d78f23df84
2 changed files with 12 additions and 5 deletions
+6 -3
View File
@@ -725,6 +725,12 @@ class PaymentTransaction(models.Model):
if any(trans.state not in ('draft', 'authorized') for trans in self):
raise ValidationError(_('Only draft/authorized transaction can be posted.'))
self.write({'state': 'done', 'date': datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)})
self._reconcile_after_transaction_done()
self._log_payment_transaction_received()
@api.multi
def _reconcile_after_transaction_done(self):
# Validate invoices automatically upon the transaction is posted.
invoices = self.mapped('invoice_ids').filtered(lambda inv: inv.state == 'draft')
invoices.action_invoice_open()
@@ -746,9 +752,6 @@ class PaymentTransaction(models.Model):
for company in payments:
payments[company].with_context(force_company=company, company_id=company).post()
self.write({'state': 'done', 'date': datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)})
self._log_payment_transaction_received()
@api.multi
def _set_transaction_cancel(self):
'''Move the transaction's payment to the cancel state(e.g. Paypal).'''
+6 -2
View File
@@ -59,14 +59,19 @@ class PaymentTransaction(models.Model):
so.action_confirm()
@api.multi
def _set_transaction_done(self):
def _reconcile_after_transaction_done(self):
# Override of '_set_transaction_done' in the 'payment' module
# to confirm the quotations automatically and to generate the invoices if needed.
sales_orders = self.mapped('sale_order_ids').filtered(lambda so: so.state == 'draft')
sales_orders.force_quotation_send()
sales_orders = self.mapped('sale_order_ids').filtered(lambda so: so.state == 'sent')
sales_orders.action_confirm()
# invoice the sale orders if needed
self._invoice_sale_orders()
return super(PaymentTransaction, self)._reconcile_after_transaction_done()
@api.multi
def _invoice_sale_orders(self):
if self.env['ir.config_parameter'].sudo().get_param('website_sale.automatic_invoice'):
for trans in self.filtered(lambda t: t.sale_order_ids):
ctx_company = {'company_id': self.acquirer_id.company_id.id,
@@ -75,7 +80,6 @@ class PaymentTransaction(models.Model):
trans.sale_order_ids._force_lines_to_invoice_policy_order()
invoices = trans.sale_order_ids.action_invoice_create()
trans.invoice_ids = [(6, 0, invoices)]
return super(PaymentTransaction, self)._set_transaction_done()
@api.model
def _compute_reference_prefix(self, values):