toulouse-maelis: modifier la semaine type d'une activité (#75425) #140

Merged
nroche merged 2 commits from wip/75425-parsifal-update-week-calendar into main 2023-03-30 11:39:00 +02:00
6 changed files with 843 additions and 6 deletions

View File

@ -83,6 +83,42 @@ BOOKING_ACTIVITY_SCHEMA = {
],
}
UPDATE_RECURRENT_WEEK_SCHEMA = {
'type': 'object',
'properties': {
'person_id': {
'type': 'string',
'pattern': '^[0-9]+$',
},
'activity_id': {
'type': 'string',
'pattern': '^[A-Za-z0-9]+$',
},
'start_date': {
'type': 'string',
'pattern': '^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
},
'end_date': {
'type': 'string',
'pattern': '^([0-9]{4}-[0-9]{2}-[0-9]{2}){0,1}$',
},
'recurrent_week': {
'type': 'array',
'items': {
'type': 'string',
'pattern': '^[1-7]-[A-Z]$',
},
},
},
'required': [
'person_id',
'activity_id',
'start_date',
'end_date',
'recurrent_week',
],
}
SUBSCRIPTION_SCHEMA = {
'type': 'object',
'properties': {

View File

@ -2198,6 +2198,124 @@ class ToulouseMaelis(BaseResource, HTTPResource):
'changes': updated,
}
@endpoint(
display_category='Réservation',
description="Obtenir la semaine type d'une activité",
name='get-recurrent-week',
perm='can_access',
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'activity_id': {'description': "Numéro de l'activité"},
'ref_date': {
'description': "Date de référence, utilisée pour interroger l'agenda sur l'année et le mois",
'type': 'date',
},
},
)
def get_recurrent_week(self, request, person_id, activity_id, ref_date, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
self.get_rl_or_child_raw(family_id, person_id)
payload = {
'requestBean': {
'numDossier': family_id,
'numPerson': person_id,
'idAct': activity_id,
lguerin marked this conversation as resolved
Review

Il y a toujours une valeur par défaut dans maelis, même avant le premier set d'une semaine type ?

Il y a toujours une valeur par défaut dans maelis, même avant le premier set d'une semaine type ?
Review

Non.
Via le WS readFamily je vois des activité avec :

'planningHebdomadaire': None,

(Sigec nous a dissuadé a d'utiliser de ce champ qui ne semblait alors pas utilisable pour faire du pré-remplissage avec plusieurs unités)
Ici on ne récupère pas les valeurs actuelles, mais juste le gabarit de la semaine type.
Ce gabarit semble toujours exister dans l'agenda d'une activité sur laquelle on peut définir des réservations (mais la documentation ne le précise pas).

Non. Via le WS readFamily je vois des activité avec : ``` 'planningHebdomadaire': None, ``` (Sigec nous a dissuadé a d'utiliser de ce champ qui ne semblait alors pas utilisable pour faire du pré-remplissage avec plusieurs unités) Ici on ne récupère pas les valeurs actuelles, mais juste le gabarit de la semaine type. Ce gabarit semble toujours exister dans l'agenda d'une activité sur laquelle on peut définir des réservations (mais la documentation ne le précise pas).
Review

ok

ok
'year': ref_date.year,
'month': ref_date.month,
}
}
response = self.call('Activity', 'getPersonScheduleList', **payload)
date_min_prev = None
lguerin marked this conversation as resolved
Review

à quoi sert cette info ?

à quoi sert cette info ?
Review

L'usager ne pourra pas modifier la semaine type avant un délais minimum de prévenance, qui est implémenté par cette date.
Maelis va faire avec les dates envoyées : repousser la date de début après cette date de prévenance et si besoin ramener la date de fin à celle de la fin de la période de l'activité. Je n'ai pas besoin d'ajouter de code métier ici.

Stéphane est partit pour inscrire en dur le délais de prévenance dans la démarche. Je lui remonte quand même l'information du logiciel métier au cas où il devrait faire mieux par la suite.

L'usager ne pourra pas modifier la semaine type avant un délais minimum de prévenance, qui est implémenté par cette date. Maelis va faire avec les dates envoyées : repousser la date de début après cette date de prévenance et si besoin ramener la date de fin à celle de la fin de la période de l'activité. Je n'ai pas besoin d'ajouter de code métier ici. Stéphane est partit pour inscrire en dur le délais de prévenance dans la démarche. Je lui remonte quand même l'information du logiciel métier au cas où il devrait faire mieux par la suite.
Review

ok

ok
recurrent_week = []
day_names = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']
for result_data in response or []:
for schedule in result_data['activityScheduleList']:
if schedule['activity']['idAct'] != activity_id or not schedule.get('weeklyCalendar'):
continue
units = []
for item in schedule['unitScheduleList']:
key = item['unit']['calendarLetter']
value = item['unit']['libelle']
units.append((key, value))
if item.get('datePrevMin'):
if not date_min_prev or item['datePrevMin'] > date_min_prev:
date_min_prev = item['datePrevMin']
for item in schedule['weeklyCalendar'].get('dayWeekInfoList') or []:
if item['isOpen']:
day_num = item['dayNum']
day_str = day_names[day_num - 1]
for key, value in units:
recurrent_week.append(
{
'id': '%s-%s' % (day_num, key),
'day': day_str,
'label': value,
'overlaps': ['%s-%s' % (day_num, k) for k, v in units if k != key],
'text': '%s %s' % (day_str, value),
}
)
if not recurrent_week:
raise APIError(
'No week calendar for activity %s on %s'
% (activity_id, ref_date.strftime(utils.json_date_format))
)
return {
'data': recurrent_week,
'meta': {'date_min_prev': date_min_prev.strftime(utils.json_date_format)},
}
@endpoint(
display_category='Réservation',
description="Modifier la semaine type d'une inscription",
name='update-recurrent-week',
perm='can_access',
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
},
post={
'request_body': {
'schema': {
'application/json': activity_schemas.UPDATE_RECURRENT_WEEK_SCHEMA,
}
}
},
)
def update_recurrent_week(self, request, post_data, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
self.get_rl_or_child_raw(family_id, post_data['person_id'])
recurrent_week = {}
for i in range(1, 8):
day_num = str(i)
recurrent_week[day_num] = {
'dayNum': day_num,
'calendarLetter': None,
'isPresent': False,
}
for item in post_data.get('recurrent_week'):
day_num, key = item.split('-')
recurrent_week[day_num] = {
'dayNum': day_num,
'calendarLetter': key,
'isPresent': True,
}
recurrent_week = sorted(recurrent_week.values(), key=lambda x: (x['dayNum']))
payload = {
'numPerson': post_data['person_id'],
'idActivity': post_data['activity_id'],
'dateStart': post_data['start_date'],
'dateEnd': post_data.get('end_date'),
'dayWeekInfoList': recurrent_week,
}
self.call('Activity', 'updateWeekCalendar', **payload)
return {'data': 'ok'}
@endpoint(
display_category='Facture',
description="Ajouter une autorisation de prélèvement",
@ -2532,7 +2650,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
name='get-person-activity-list',
perm='can_access',
parameters={
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'nature': {
'description': "Nature des activités : EXTRASCO ou LOISIR (toutes par défaut)",
},
@ -2590,7 +2708,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'activity_id': {'description': "Numéro de l'activité"},
'start_date': {'description': 'Début de la période'},
'end_date': {'description': 'Fin de la période'},
@ -2647,7 +2765,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'activity_id': {'description': "Numéro de l'activité"},
'unit_id': {'description': "Numéro de l'unité"},
'start_date': {'description': 'Début de la période'},
@ -2712,7 +2830,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'nature': {
'description': "Nature des activités : EXTRASCO ou LOISIR (toutes par défaut)",
},
@ -2908,7 +3026,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
name='get-person-subscription-info',
perm='can_access',
parameters={
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'activity_id': {'description': "Numéro de l'activité"},
'unit_id': {'description': "Numéro de l'unité"},
'place_id': {'description': "Numéro du lieu"},
@ -3227,7 +3345,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
name='read-activity-agenda',
perm='can_access',
parameters={
'person_id': {'description': "Numéro du responsale légal ou de l'enfant"},
'person_id': {'description': "Numéro du responsable légal ou de l'enfant"},
'activity_id': {'description': "Numéro de l'activité"},
'start_date': {'description': 'Début de la période'},
'end_date': {'description': 'Fin de la période'},

View File

@ -0,0 +1,466 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getPersonScheduleListResponse xmlns:ns2="activity.ws.maelis.sigec.com" xmlns:ns3="bean.persistence.activity.ws.maelis.sigec.com" xmlns:ns4="bean.persistence.school.ws.maelis.sigec.com">
<resultBean>
<personScheduleList>
<person>
<numPerson>261768</numPerson>
<lastname>NICO</lastname>
<firstname>BART</firstname>
</person>
<activityScheduleList>
<activity>
<idAct>A10049327682</idAct>
<libelle>RESTAURATION SCOLAIRE 22/23</libelle>
<activityType>
<code>RESTSCOL</code>
<libelle>Restauration scolaire</libelle>
<natureSpec>
<code>R</code>
<libelle>Restauration Scolaire</libelle>
</natureSpec>
</activityType>
</activity>
<weeklyCalendar>
<yearCalendar>2023</yearCalendar>
<dayWeekInfoList>
<dayNum>1</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>2</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>3</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>4</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>5</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>6</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>7</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
</weeklyCalendar>
<unitScheduleList>
<unit>
<idUnit>A10049355140</idUnit>
<libelle>PAI PANIER 22/23</libelle>
<calendarLetter>B</calendarLetter>
</unit>
<datePrevMin>2023-03-27T00:00:00+02:00</datePrevMin>
<dayInfoList>
lguerin marked this conversation as resolved
Review

détail: tu as besoin d'ajouter toutes ces infos pour tester la semaine type ?

détail: tu as besoin d'ajouter toutes ces infos pour tester la semaine type ?
Review

Oui.
'B' c'est la lettre qui permet de sélectionner l'unité.
'datePrevMin' c'est le délais de prévenance.
Ce qui vient en dessous c'est l'agenda.
Je n'en ai pas besoin pour tester la semaine type, c'est juste que j'ai recopié la trame renvoyée par Maélis à l'identique.

Oui. 'B' c'est la lettre qui permet de sélectionner l'unité. 'datePrevMin' c'est le délais de prévenance. Ce qui vient en dessous c'est l'agenda. Je n'en ai pas besoin pour tester la semaine type, c'est juste que j'ai recopié la trame renvoyée par Maélis à l'identique.
Review

ok

ok
<day>2023-04-01T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-02T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-03T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-04T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-05T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-06T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-08T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-09T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-10T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-11T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-12T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-13T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-14T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-15T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-16T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-17T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-18T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-19T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-20T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-22T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-23T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-24T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-25T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-26T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-27T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-29T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-30T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
</unitScheduleList>
<unitScheduleList>
<unit>
<idUnit>A10049327683</idUnit>
<libelle>RESTAURATION SCOLAIRE 22/23</libelle>
<calendarLetter>X</calendarLetter>
</unit>
<datePrevMin>2023-03-27T00:00:00+02:00</datePrevMin>
<dayInfoList>
<day>2023-04-01T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-02T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-03T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-04T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-05T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-06T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-07T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-08T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-09T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-10T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-11T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-12T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-13T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-14T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-15T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-16T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-17T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-18T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-19T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-20T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-21T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-22T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-23T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-24T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-25T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-26T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-27T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-28T00:00:00+02:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-04-29T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-30T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
</personScheduleList>
</resultBean>
</ns2:getPersonScheduleListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,5 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:updateWeekCalendarResponse xmlns:ns2="activity.ws.maelis.sigec.com" xmlns:ns3="bean.persistence.activity.ws.maelis.sigec.com" xmlns:ns4="bean.persistence.school.ws.maelis.sigec.com"/>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,13 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>E911 : Le calendrier hebdomadaire est incohérent avec la lettre de l'unité</faultstring>
<detail>
<ns1:MaelisActivityException xmlns:ns1="activity.ws.maelis.sigec.com">
<message xmlns:ns4="bean.persistence.school.ws.maelis.sigec.com" xmlns:ns3="bean.persistence.activity.ws.maelis.sigec.com" xmlns:ns2="activity.ws.maelis.sigec.com">E911 : Le calendrier hebdomadaire est incohérent avec la lettre de l'unité</message>
</ns1:MaelisActivityException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>

View File

@ -5189,6 +5189,205 @@ def test_update_child_agenda_date_error(con, app):
assert resp.json['err_desc'] == 'start_date and end_date are in different reference year (2022 != 2023)'
def test_get_recurrent_week(family_service, activity_service, con, app):
def request_check(request):
assert request.year == 2023
assert request.month == 4
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
activity_service.add_soap_response(
'getPersonScheduleList',
get_xml_file('R_get_person_schedule_list_with_recurrent_week.xml'),
request_check=request_check,
)
url = get_endpoint('get-recurrent-week')
params = {
'person_id': '613880',
'activity_id': 'A10049327682',
'ref_date': '2023-04-01',
}
resp = app.get(url + '?family_id=1312', params=params)
assert resp.json['err'] == 0
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == [
{
'id': '1-B',
'day': 'Lundi',
'label': 'PAI PANIER 22/23',
'overlaps': ['1-X'],
'text': 'Lundi PAI PANIER 22/23',
},
{
'id': '1-X',
'day': 'Lundi',
'label': 'RESTAURATION SCOLAIRE 22/23',
'overlaps': ['1-B'],
'text': 'Lundi RESTAURATION SCOLAIRE 22/23',
},
{
'id': '2-B',
'day': 'Mardi',
'label': 'PAI PANIER 22/23',
'overlaps': ['2-X'],
'text': 'Mardi PAI PANIER 22/23',
},
{
'id': '2-X',
'day': 'Mardi',
'label': 'RESTAURATION SCOLAIRE 22/23',
'overlaps': ['2-B'],
'text': 'Mardi RESTAURATION SCOLAIRE 22/23',
},
{
'id': '4-B',
'day': 'Jeudi',
'label': 'PAI PANIER 22/23',
'overlaps': ['4-X'],
'text': 'Jeudi PAI PANIER 22/23',
},
{
'id': '4-X',
'day': 'Jeudi',
'label': 'RESTAURATION SCOLAIRE 22/23',
'overlaps': ['4-B'],
'text': 'Jeudi RESTAURATION SCOLAIRE 22/23',
},
{
'id': '5-B',
'day': 'Vendredi',
'label': 'PAI PANIER 22/23',
'overlaps': ['5-X'],
'text': 'Vendredi PAI PANIER 22/23',
},
{
'id': '5-X',
'day': 'Vendredi',
'label': 'RESTAURATION SCOLAIRE 22/23',
'overlaps': ['5-B'],
'text': 'Vendredi RESTAURATION SCOLAIRE 22/23',
},
]
assert resp.json['meta'] == {'date_min_prev': '2023-03-27'}
params['activity_id'] = 'plop'
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'No week calendar for activity plop on 2023-04-01'
def test_get_recurrent_week_not_linked_error(con, app):
url = get_endpoint('get-recurrent-week')
params = {
'person_id': '613880',
'activity_id': 'A10049327682',
'ref_date': '2023-04-01',
}
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
def test_get_recurrent_week_person_not_found(family_service, con, app):
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
url = get_endpoint('get-recurrent-week')
params = {
'person_id': '000000',
'activity_id': 'A10049327682',
'ref_date': '2023-04-01',
}
resp = app.get(url + '?family_id=1312', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "no '000000' RL or child on '1312' family"
lguerin marked this conversation as resolved
Review

détail: tester le contenu de data comme dans le test en dessous, et passer une ligne avant la création du Link, parce que ça concerne le test suivant ?

détail: tester le contenu de data comme dans le test en dessous, et passer une ligne avant la création du Link, parce que ça concerne le test suivant ?
Review

Oui, je fais ça.

Oui, je fais ça.
def test_update_recurrent_week(family_service, activity_service, con, app):
def request_check(request):
assert serialize_object(request.dayWeekInfoList) == [
{'dayNum': 1, 'isPresent': True, 'isOpen': None, 'calendarLetter': 'X'},
{'dayNum': 2, 'isPresent': True, 'isOpen': None, 'calendarLetter': 'B'},
{'dayNum': 3, 'isPresent': False, 'isOpen': None, 'calendarLetter': None},
{'dayNum': 4, 'isPresent': False, 'isOpen': None, 'calendarLetter': None},
{'dayNum': 5, 'isPresent': False, 'isOpen': None, 'calendarLetter': None},
{'dayNum': 6, 'isPresent': False, 'isOpen': None, 'calendarLetter': None},
{'dayNum': 7, 'isPresent': False, 'isOpen': None, 'calendarLetter': None},
]
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
activity_service.add_soap_response(
'updateWeekCalendar',
get_xml_file('R_update_week_calendar.xml'),
request_check=request_check,
)
url = get_endpoint('update-recurrent-week')
params = {
'person_id': '613880',
'activity_id': 'A10049327682',
'start_date': '2023-04-01',
'end_date': '2023-04-30',
'recurrent_week': ['1-X', '2-B'],
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == 'ok'
Link.objects.create(resource=con, family_id='311323', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == 'ok'
def test_update_recurrent_week_not_linked_error(con, app):
url = get_endpoint('update-recurrent-week')
params = {
'person_id': '613880',
'activity_id': 'A10049327682',
'start_date': '2023-04-01',
'end_date': '',
'recurrent_week': ['1-X', '2-B'],
}
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
def test_update_recurrent_week_person_not_found(family_service, con, app):
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
url = get_endpoint('update-recurrent-week')
params = {
'person_id': '000000',
'activity_id': 'A10049327682',
'start_date': '2023-04-01',
'end_date': '',
'recurrent_week': ['1-X', '2-B'],
}
resp = app.post_json(url + '?family_id=1312', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "no '000000' RL or child on '1312' family"
def test_update_recurrent_week_soap_error(family_service, activity_service, con, app):
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
activity_service.add_soap_response('updateWeekCalendar', get_xml_file('R_update_week_calendar_error.xml'))
url = get_endpoint('update-recurrent-week')
params = {
'person_id': '613880',
'activity_id': 'A10049327682',
'start_date': '2023-04-01',
'end_date': '2023-04-30',
'recurrent_week': ['1-Z'],
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 1
assert (
"E911 : Le calendrier hebdomadaire est incohérent avec la lettre de l'unité" in resp.json['err_desc']
)
def test_read_school_list_address_and_level(site_service, con, app):
site_service.add_soap_response(
'readSchoolForAdressAndLevel', get_xml_file('R_read_school_for_adress_and_level.xml')