toulouse_maelis: trigger wcs after paid notification (#87168)
gitea/passerelle/pipeline/head This commit looks good Details

This commit is contained in:
Benjamin Dauvergne 2024-02-20 07:09:46 +01:00
parent 8b55756a20
commit ca1e74129d
2 changed files with 42 additions and 17 deletions

View File

@ -4430,10 +4430,6 @@ class ToulouseMaelis(BaseResource, HTTPResource):
invoice.lingo_notification_date = now()
invoice.save(update_fields=['updated', 'lingo_notification_date', 'lingo_data'])
if invoice.basket_generation_date is not None:
# match paid invoice with subscriptions and trigger w.c.s.
invoice.set_trigger_subscriptions()
self.add_job(
'notify_invoice_paid_job',
regie_id=regie_id,
@ -4657,6 +4653,10 @@ class Invoice(models.Model):
obj.maelis_notification_date = now()
obj.maelis_notification_data = result
obj.save()
if obj.basket_generation_date is not None:
# match paid invoice with subscriptions and trigger w.c.s.
obj.set_trigger_subscriptions()
return True
def match_subscriptions(self):
@ -4734,15 +4734,17 @@ class Subscription(models.Model):
def status(self):
if self.invoice is not None:
if self.invoice.status() in ['paid', 'notified']:
if self.invoice.status() == 'notified':
# related invoice is paid
return 'paid'
if self.invoice.status() == 'cancelled':
# related invoice is cancelled
return 'cancelled'
else:
# there is a related invoice
return 'pending_invoice'
if self.invoice.status() == 'error':
# related invoice cound not be notified
return 'error'
# there is a related invoice
return 'pending_invoice'
else:
if self.basket_removal_date is not None:
# no basket validation (no related invoice generated)
@ -4755,7 +4757,7 @@ class Subscription(models.Model):
if self.wcs_trigger_date is not None:
# wcs demand was triggered
return 'triggered'
if self.status() in ['paid', 'cancelled', 'removed']:
if self.status() in ['paid', 'cancelled', 'removed', 'error']:
# wcs demand can be triggered
return 'triggering'
else:
@ -4775,6 +4777,12 @@ class Subscription(models.Model):
'invoice_id': self.invoice.invoice_id if self.invoice else None,
'invoice_status': self.invoice.status() if self.invoice else None,
'invoice_data': self.invoice.maelis_data if self.invoice else None,
'invoice_maelis_notification_date': self.invoice.maelis_notification_date
if self.invoice
else None,
'invoice_maelis_notification_data': self.invoice.maelis_notification_data
if self.invoice
else None,
'subscription_id': self.pk,
'subscription_status': self.status(),
'subscription_data': self.maelis_data,

View File

@ -11821,7 +11821,7 @@ def test_pay_invoice_cron_maelis_error(invoice_service, con, app, freezer, caplo
con.notify_invoices_paid()
assert 'fails to notify' in caplog.text
assert 'stopping' in caplog.text
assert con.invoice_set.get(regie_id=102, invoice_id=30).status() == 'notified'
assert con.invoice_set.get(regie_id=102, invoice_id=30).status() == 'error'
assert con.invoice_set.get(regie_id=102, invoice_id=8).status() == 'notified'
@ -12114,12 +12114,21 @@ def test_trigger_wcs_on_paid_subscriptions_cron(
subscription = con.subscription_set.get(wcs_form_number='13-12')
assert subscription.invoice == invoice
assert subscription.status() == 'pending_invoice'
assert subscription.trigger_status() == 'pending'
invoice_service.add_soap_response('payInvoices', get_xml_file('R_pay_invoices.xml'))
con.jobs(count=1) # only run the notify job
subscription.refresh_from_db()
assert subscription.invoice == invoice
assert subscription.status() == 'paid'
assert subscription.trigger_status() == 'triggering'
assert subscription.wcs_trigger_payload['data']['subscription_status'] == 'paid'
# send trigger to wcs
con.hourly()
con.hourly() # only run the trigger job
assert (
'https://wcs.example.com/api/forms/exemple-inscription-loisirs-1/12/hooks/update_subscription/'
in wcs_service.calls[-1].request.url
@ -12127,7 +12136,7 @@ def test_trigger_wcs_on_paid_subscriptions_cron(
trigger_body = json.loads(wcs_service.calls[-1].request.body)
assert trigger_body['err'] == 0
assert trigger_body['data']['subscription_status'] == 'paid'
assert trigger_body['data']['invoice_status'] == 'paid'
assert trigger_body['data']['invoice_status'] == 'notified'
assert trigger_body['data']['regie_text'] == 'DSBL'
assert any(['trigger wcs' in x.message for x in caplog.records])
@ -12211,12 +12220,20 @@ def test_trigger_wcs_on_paid_subscriptions_job(
assert job.status == 'registered'
subscription = con.subscription_set.get(wcs_form_number='13-12')
assert subscription.trigger_status() == 'triggering'
assert subscription.trigger_status() == 'pending'
assert not Job.objects.filter(
method_name='trigger_subscription_job', natural_id='13-12/%s' % subscription.pk
).exists()
# notify paid invoice
con.jobs(count=1)
job = Job.objects.get(method_name='trigger_subscription_job', natural_id='13-12/%s' % subscription.pk)
assert job.status == 'registered'
# send trigger to wcs
con.jobs()
con.jobs(count=1)
assert any(
[
'https://wcs.example.com/api/forms/exemple-inscription-loisirs-1/12/hooks/update_subscription/'
@ -12225,9 +12242,9 @@ def test_trigger_wcs_on_paid_subscriptions_job(
]
)
job = Job.objects.get(method_name='trigger_subscription_job', natural_id='13-12/%s' % subscription.pk)
job.refresh_from_db()
assert job.status == 'completed'
subscription = con.subscription_set.get(wcs_form_number='13-12')
subscription.refresh_from_db()
assert subscription.trigger_status() == 'triggered'