Implement all charge events
issue6960 review36831002
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
* Support all charge events
|
||||
* Support dispute
|
||||
|
||||
Version 4.6.0 - 2017-10-30
|
||||
|
||||
+26
-4
@@ -496,8 +496,14 @@ class Account(ModelSQL, ModelView):
|
||||
type_ = payload['type']
|
||||
if type_ == 'charge.succeeded':
|
||||
return self.webhook_charge_succeeded(data)
|
||||
if type_ == 'charge.captured':
|
||||
return self.webhook_charge_captured(data)
|
||||
elif type_ == 'charge.failed':
|
||||
return self.webhook_charge_failed(data)
|
||||
elif type_ == 'charge.pending':
|
||||
return self.webhook_charge_pending(data)
|
||||
elif type_ == 'charge.refunded':
|
||||
return self.webhook_charge_refunded(data)
|
||||
elif type_ == 'charge.dispute.created':
|
||||
return self.webhook_charge_dispute_created(data)
|
||||
elif type_ == 'charge.dispute.closed':
|
||||
@@ -510,7 +516,7 @@ class Account(ModelSQL, ModelView):
|
||||
return self.webhook_source_canceled(data)
|
||||
return None
|
||||
|
||||
def webhook_charge_succeeded(self, payload):
|
||||
def webhook_charge_succeeded(self, payload, _event='charge.succeeded'):
|
||||
pool = Pool()
|
||||
Payment = pool.get('account.payment')
|
||||
|
||||
@@ -519,16 +525,32 @@ class Account(ModelSQL, ModelView):
|
||||
('stripe_charge_id', '=', charge['id']),
|
||||
])
|
||||
if not payments:
|
||||
logger.error("charge.succeeded: No payment '%s'", charge['id'])
|
||||
logger.error(": No payment '%s'", _event, charge['id'])
|
||||
for payment in payments:
|
||||
# TODO: remove when https://bugs.tryton.org/issue4080
|
||||
with Transaction().set_context(company=payment.company.id):
|
||||
if payment.state == 'succeeded':
|
||||
Payment.fail([payment])
|
||||
payment.stripe_captured = charge['captured']
|
||||
payment.stripe_amount = (
|
||||
charge['amount'] - charge['amount_refunded'])
|
||||
payment.save()
|
||||
if charge['status'] == 'succeeded' and charge['captured']:
|
||||
Payment.succeed([payment])
|
||||
if payment.amount:
|
||||
if charge['status'] == 'succeeded' and charge['captured']:
|
||||
Payment.succeed([payment])
|
||||
else:
|
||||
Payment.fail([payment])
|
||||
return bool(payments)
|
||||
|
||||
def webhook_charge_captured(self, payload):
|
||||
return self.webhook_charge_succeeded(payload, _event='charge.captured')
|
||||
|
||||
def webhook_charge_pending(self, payload):
|
||||
return self.webhook_charge_succeeded(payload, _event='charge.pending')
|
||||
|
||||
def webhook_charge_refunded(self, payload):
|
||||
return self.webhook_charge_succeeded(payload, _event='charge.pending')
|
||||
|
||||
def webhook_charge_failed(self, payload):
|
||||
pool = Pool()
|
||||
Payment = pool.get('account.payment')
|
||||
|
||||
@@ -277,3 +277,47 @@ Capture lower amount::
|
||||
u'succeeded'
|
||||
>>> bool(payment.stripe_captured)
|
||||
True
|
||||
|
||||
Simulate charge.refunded event with partial amount::
|
||||
|
||||
>>> StripeAccount.webhook([stripe_account], {
|
||||
... 'type': 'charge.refunded',
|
||||
... 'data': {
|
||||
... 'object': {
|
||||
... 'id': payment.stripe_charge_id,
|
||||
... 'object': 'charge',
|
||||
... 'amount': 4200,
|
||||
... 'amount_refunded': 4000,
|
||||
... 'captured': True,
|
||||
... 'status': 'succeeded',
|
||||
... },
|
||||
... },
|
||||
... }, {})
|
||||
[True]
|
||||
>>> payment.reload()
|
||||
>>> payment.amount
|
||||
Decimal('2.00')
|
||||
>>> payment.state
|
||||
u'succeeded'
|
||||
|
||||
Simulate charge.refunded event with full amount::
|
||||
|
||||
>>> StripeAccount.webhook([stripe_account], {
|
||||
... 'type': 'charge.refunded',
|
||||
... 'data': {
|
||||
... 'object': {
|
||||
... 'id': payment.stripe_charge_id,
|
||||
... 'object': 'charge',
|
||||
... 'amount': 4200,
|
||||
... 'amount_refunded': 4200,
|
||||
... 'captured': True,
|
||||
... 'status': 'succeeded',
|
||||
... },
|
||||
... },
|
||||
... }, {})
|
||||
[True]
|
||||
>>> payment.reload()
|
||||
>>> payment.amount
|
||||
Decimal('0.00')
|
||||
>>> payment.state
|
||||
u'failed'
|
||||
|
||||
Reference in New Issue
Block a user