Notifier w.c.s. après maelis (#87168) #471

Merged
bdauvergne merged 3 commits from wip/87168-toulouse-maelis-ne-notifier-w-c into main 2024-02-23 20:20:03 +01:00
3 changed files with 48 additions and 18 deletions

View File

@ -607,7 +607,7 @@ class BaseResource(models.Model):
resource_type = ContentType.objects.get_for_model(self)
return Job.objects.filter(resource_type=resource_type, resource_pk=self.pk)
def jobs(self):
def jobs(self, count=-1):
Review

Ce paramètre permet de s'arrêter dans les tests avant le lancement d'un second job (crée par le job testé).

Ce paramètre permet de s'arrêter dans les tests avant le lancement d'un second job (crée par le job testé).
# "jobs" cron job to run asynchronous tasks
if self.down():
# don't try running jobs if connector is known to be down.
@ -617,6 +617,9 @@ class BaseResource(models.Model):
skip_locked = {}
skipped_jobs = []
while True:
if count == 0:
break
count -= 1
# optimistic skip
if (
not self.jobs_set()

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,
@ -4566,6 +4562,8 @@ class Invoice(models.Model):
self.maelis_data['amountInvoice'] == self.maelis_data['amountPaid']
or self.maelis_notification_date is not None
):
if isinstance(self.maelis_notification_data, dict) and 'error' in self.maelis_notification_data:
return 'error'
# payInvoice was sent to Maelis
return 'notified'
if self.lingo_notification_date is not None:
@ -4655,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):
@ -4732,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)
@ -4753,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:
@ -4773,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'