toulouse-maelis: réservations extra-scolaire (#75144) #136

Merged
nroche merged 4 commits from wip/75144-parsifal-agenda-on-subscription into main 2023-03-24 08:49:55 +01:00
11 changed files with 2787 additions and 3 deletions

View File

@ -46,6 +46,43 @@ BOOKING_SCHEMA = {
],
}
BOOKING_ACTIVITY_SCHEMA = {
'type': 'object',
'properties': {
'person_id': {
'type': 'string',
'minLength': 1,
'maxLength': 8,
},
'activity_id': {
'type': 'string',
'pattern': '^[A-Za-z0-9]+$',
},
'booking_list': {
'type': 'array',
'items': {
'type': 'string',
'pattern': '^[A-Za-z0-9]+:[A-Za-z0-9]+:[A-Za-z0-9]+:[0-9]{4}-[0-9]{2}-[0-9]{2}$',
},
},
'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}$',
},
},
'required': [
'person_id',
'activity_id',
'booking_list',
'start_date',
'end_date',
],
}
SUBSCRIPTION_SCHEMA = {
'type': 'object',
'properties': {

View File

@ -1813,7 +1813,7 @@ class ToulouseMaelis(BaseResource, HTTPResource):
activity = schedule['activity']
if not activity['activityType']['natureSpec']:
continue
if activity['activityType']['natureSpec']['code'] not in ['A', 'R']:
if activity['activityType']['natureSpec']['code'] not in ['A', 'R', 'X']:
continue
activity_id = activity['idAct']
many_units = len(schedule['unitScheduleList']) > 1
@ -1827,7 +1827,10 @@ class ToulouseMaelis(BaseResource, HTTPResource):
% (child_id, activity_id, day['day'].strftime(utils.json_date_format)),
'text': dateformat.format(day['day'], 'l j F Y'),
'prefill': day['scheduledPresence'] > 0 or day['realPresence'] > 1,
'disabled': day['status'] != 'WRITABLE',
'disabled': (
day['status'] != 'WRITABLE'
or activity['activityType']['natureSpec']['code'] in ['X']
),
'details': day,
}
color = 'white'
@ -1836,7 +1839,12 @@ class ToulouseMaelis(BaseResource, HTTPResource):
booking['details']['status_color'] = color
booking['details']['activity_id'] = activity_id
booking['details']['activity_type'] = activity['activityType']['code']
booking['details']['activity_label'] = activity['activityType']['libelle']
if activity['activityType']['natureSpec']['code'] in ['A', 'R']:
booking['details']['activity_label'] = activity['activityType']['libelle']
else:
booking['details']['activity_label'] = (
activity['libelle2'] or activity['libelle']
)
if many_units:
booking['details']['activity_label'] += ' (%s)' % unit['unit']['libelle']
booking['details']['child_id'] = child_id
@ -2759,6 +2767,41 @@ class ToulouseMaelis(BaseResource, HTTPResource):
item['text'] = item['libelle']
indicators[item['id']] = item
response['indicators'] = indicators
bookings = []
many_units = len(response.get('unitScheduleList') or []) > 1
for day in response.get('openDayList') or []:
day_str = day['day'].strftime(utils.json_date_format)
for unit in response.get('unitScheduleList') or []:
if not unit['unit']['dateDeb'] <= day['day'] <= unit['unit']['dateFin']:
continue
booking = {
'id': '%s:%s:%s:%s' % (person_id, activity_id, unit['unit']['idUnit'], day_str),
'text': dateformat.format(day['day'], 'l j F Y'),
'prefill': False,
'disabled': day['hasPlace'] is False,
'details': day,
}
booking['details']['day_str'] = day_str
booking['details']['status_color'] = 'white'
booking['details']['activity_label'] = unit['unit']['libelle'] if many_units else ''
# uncheck other units selected on same day
booking['details']['activity_id'] = unit['unit']['idUnit']
bookings.append(copy.deepcopy(booking))
# sort bookings
bookings = [
(
b['details']['day'],
b['details']['activity_label'],
b,
)
for b in bookings
]
bookings = sorted(bookings, key=itemgetter(0, 1))
bookings = [b for d, l, b in bookings]
response['agenda'] = bookings
return {'data': response}
@endpoint(
@ -2841,6 +2884,205 @@ class ToulouseMaelis(BaseResource, HTTPResource):
raise APIError(response['controlResult']['message'])
return {'data': response}
def get_activity_bookings(self, family_id, person_id, activity_id, start_date, end_date):
bookings = []
for booking_date in rrule.rrule(rrule.MONTHLY, dtstart=start_date.replace(day=1), until=end_date):
payload = {
'requestBean': {
'numDossier': family_id,
'numPerson': person_id,
'year': booking_date.year,
'month': booking_date.month,
'idAct': activity_id,
}
}
response = self.call('Activity', 'getPersonScheduleList', **payload)
Review

est-ce qu'il y aurait moyen de factoriser avec ce qui est fait dans la méthode get_bookings ? Avoir un get_booking_for_activity ?

est-ce qu'il y aurait moyen de factoriser avec ce qui est fait dans la méthode `get_bookings` ? Avoir un `get_booking_for_activity` ?
Review

Non, pas moyen, la configuration de maélis diffère suivant le périmètre péri-scolaie d'un côté ou loisirs/extra-scolaire de l'autre.
Ici on traite une seule activité, alors que pour le périscolaire on en traite plusieurs.
Par exemple ça diffère sur l'affichage dans le widget :
booking['details']['activity_id'] = unit['unit']['idUnit']
et aussi sur les libellés à afficher (dans le péri-sco on affiche la nature).
(là le code va devenir illisible)

Non, pas moyen, la configuration de maélis diffère suivant le périmètre péri-scolaie d'un côté ou loisirs/extra-scolaire de l'autre. Ici on traite une seule activité, alors que pour le périscolaire on en traite plusieurs. Par exemple ça diffère sur l'affichage dans le widget : ` booking['details']['activity_id'] = unit['unit']['idUnit']` et aussi sur les libellés à afficher (dans le péri-sco on affiche la nature). (là le code va devenir illisible)
for result_data in response or []:
for schedule in result_data['activityScheduleList']:
activity = schedule['activity']
if activity['idAct'] != activity_id:
continue
many_units = len(schedule['unitScheduleList'] or []) > 1
for unit in schedule['unitScheduleList'] or []:
for day in unit['dayInfoList'] or []:
if day['status'] in ['NO_READ', 'NO_CUSTODY']:
continue
booking = {
'id': '%s:%s:%s:%s'
% (
person_id,
activity_id,
unit['unit']['idUnit'],
day['day'].strftime(utils.json_date_format),
),
'text': dateformat.format(day['day'], 'l j F Y'),
'prefill': day['scheduledPresence'] > 0,
'disabled': day['status'] != 'WRITABLE',
'details': day,
}
color = 'white'
if booking['prefill']:
color = 'green'
booking['details']['day_str'] = day['day'].strftime(utils.json_date_format)
booking['details']['status_color'] = color
booking['details']['activity_label'] = (
unit['unit']['libelle'] if many_units else ''
)
# uncheck other sub-units selected on same day
booking['details']['activity_id'] = unit['unit']['idUnit']
# use to call maelis for booking
booking['details']['maelis_activity_id'] = activity_id
booking['details']['maelis_unit_id'] = unit['unit']['idUnit']
# use to compare from maelis errors messages
booking['details']['maelis_day_str'] = day['day'].strftime('%d/%m/%Y')
booking['details']['maelis_unit_label'] = unit['unit']['libelle']
bookings.append(copy.deepcopy(booking))
# sort bookings
bookings = [
(
b['details']['day'],
b['details']['activity_label'],
b,
)
for b in bookings
]
bookings = sorted(bookings, key=itemgetter(0, 1))
bookings = [b for d, l, b in bookings]
return bookings
@endpoint(
display_category='Réservation',
description="Obtenir l'agenda d'une activité",
name='read-activity-agenda',
perm='can_access',
parameters={
'person_id': {'description': "Numéro du responsale 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'},
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
},
)
def read_activity_agenda(
self, request, person_id, activity_id, start_date, end_date, NameID=None, family_id=None
):
family_id = family_id or self.get_link(NameID).family_id
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
bookings = self.get_activity_bookings(family_id, person_id, activity_id, start_date, end_date)
return {
'data': bookings,
'extra_data': {
'start_date': start_date,
'end_date': end_date,
'school_year': '%s/%s' % (reference_year, reference_year + 1),
},
}
@endpoint(
display_category='Réservation',
description="Modifier l'agenda d'un enfant",
name='update-activity-agenda',
perm='can_access',
parameters={
'NameID': {'description': 'Publik NameID'},
'family_id': {'description': 'Numéro de DUI'},
},
post={
'request_body': {
'schema': {
'application/json': activity_schemas.BOOKING_ACTIVITY_SCHEMA,
}
}
},
)
def update_activity_agenda(self, request, post_data, NameID=None, family_id=None):
family_id = family_id or self.get_link(NameID).family_id
person_id = post_data['person_id']
activity_id = post_data['activity_id']
start_date, end_date, dummy = self.get_start_and_end_dates(
post_data['start_date'], post_data['end_date']
)
requested_bookings = post_data['booking_list']
# build list of existing booked days
bookings = self.get_activity_bookings(family_id, person_id, activity_id, start_date, end_date)
legacy_bookings = [b['id'] for b in bookings if b['prefill'] is True]
available_bookings = [b['id'] for b in bookings if b['disabled'] is False]
updated = {}
bookings_to_update = []
Review

pareil, possibilité de factoriser avec ce qui est fait dans le endpoint update_child_agenda ?

pareil, possibilité de factoriser avec ce qui est fait dans le endpoint `update_child_agenda` ?
Review

Non, il s'agit de 2 WS maélis différents, et la structure et le nom des champs ne sont pas les même d'un WS à l'autre.
ex: activity['idAct'] vs activity['idActivity']
Surtout, rien ne garanti que les WS ne vont pas évoluer indépendamment (parce que c'est le cas ailleurs).
Après oui, j'aimerais bien aussi factoriser le code, mais je pense qu'il vaut mieux ne pas le faire avant d'avoir passer l'étape de la recette par les agents à Toulouse.

Non, il s'agit de 2 WS maélis différents, et la structure et le nom des champs ne sont pas les même d'un WS à l'autre. ex: activity['idAct'] vs activity['idActivity'] Surtout, rien ne garanti que les WS ne vont pas évoluer indépendamment (parce que c'est le cas ailleurs). Après oui, j'aimerais bien aussi factoriser le code, mais je pense qu'il vaut mieux ne pas le faire avant d'avoir passer l'étape de la recette par les agents à Toulouse.
for booking_info in bookings:
day_id = booking_info['id']
booked = None
action = booking_info['details']['action']
if day_id not in available_bookings:
# disabled or not available: not bookable
booked = None
elif (
day_id not in legacy_bookings
and day_id in requested_bookings
and action in ['ADD_PRES_PREVI']
):
booked = action
elif (
day_id in legacy_bookings
and day_id not in requested_bookings
and action in ['DEL_PRES_PREVI']
):
booked = action
if booked is not None:
# no changes, don't send the day
bookings_to_update.append(
{
'numPerson': person_id,
'idAct': booking_info['details']['maelis_activity_id'],
'idUni': booking_info['details']['maelis_unit_id'],
'date': booking_info['details']['day_str'],
'action': booked,
}
)
updated[day_id] = {
'activity_label': booking_info['details']['activity_label'],
'day': booking_info['details']['day_str'],
'booked': booked in ['ADD_PRES_PREVI'],
}
if not bookings_to_update:
# don't call maelis if no changes
return {'updated': False, 'count': 0, 'changes': [], 'errors': []}
payload = {
'requestBean': {
'numDossier': family_id,
'unitPersonDayInfoList': bookings_to_update,
}
}
response = self.call('Activity', 'updatePersonSchedule', **payload)
# booking errors from maelis
if response.get('result') is False:
for error in response['unitPersonDayInfoErrorList']:
day_id = '%s:%s:%s:%s' % (
error['unitPersonDayInfoBean']['numPerson'],
error['unitPersonDayInfoBean']['idAct'],
error['unitPersonDayInfoBean']['idUni'],
error['unitPersonDayInfoBean']['date'].strftime(utils.json_date_format),
)
if updated.get(day_id):
del updated[day_id]
changes = sorted(updated.values(), key=lambda x: (x['booked'], x['activity_label'], x['day']))
return {
'updated': True,
'count': len(changes),
'changes': changes,
}
@endpoint(
display_category='Inscriptions',
description="Lecture du panier de la famille",

View File

@ -0,0 +1,7 @@
<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/>
</ns2:getPersonScheduleListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,257 @@
<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>A10049354913</idAct>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<activityType>
<code>EXTMERC</code>
<libelle>Mercredi</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</libelle>
</natureSpec>
</activityType>
</activity>
<weeklyCalendar>
<yearCalendar>2023</yearCalendar>
<dayWeekInfoList>
<dayNum>1</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>2</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>3</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>4</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>5</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>6</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>7</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
</weeklyCalendar>
<unitScheduleList>
<unit>
<idUnit>A10049354915</idUnit>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<calendarLetter>X</calendarLetter>
</unit>
<dayInfoList>
<day>2023-05-01T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-02T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-03T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-04T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-05T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-06T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-08T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-09T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-10T00: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-05-11T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-12T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-13T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-14T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-15T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-16T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-18T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-19T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-20T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-22T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-23T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-25T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-26T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-27T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-29T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-30T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-31T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
</personScheduleList>
</resultBean>
</ns2:getPersonScheduleListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,447 @@
<?xml version="1.0" encoding="utf8"?>
<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>261771</numPerson>
<lastname>NICO</lastname>
<firstname>LISA</firstname>
</person>
<activityScheduleList>
<activity>
<idAct>A10055597158</idAct>
<libelle>ADL ELEMENTAIRE Maourine Avril 2023</libelle>
<activityType>
<code>EXTVAC</code>
<libelle>Vacances</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</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>true</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>A10055597162</idUnit>
<libelle>Demi-journée</libelle>
<calendarLetter>B</calendarLetter>
</unit>
<datePrevMin>2023-04-11T00: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>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-04T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</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>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>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-25T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>A10055597164</idUnit>
<libelle>Journée</libelle>
<calendarLetter>C</calendarLetter>
</unit>
<datePrevMin>2023-04-11T00: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>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-04T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</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>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-25T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-04-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</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,508 @@
<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>A10049327689</idAct>
<libelle>CLAE MATIN 22/23</libelle>
<activityType>
<code>ACCMAT</code>
<libelle>Accueil du matin</libelle>
<natureSpec>
<code>A</code>
<libelle>Accueil Périscolaire</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>A10049327690</idUnit>
<libelle>CLAE MATIN 22/23</libelle>
<calendarLetter>X</calendarLetter>
</unit>
<dayInfoList>
<day>2023-05-01T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-02T00: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-05-03T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-05T00: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-05-06T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-08T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-09T00: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-05-10T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-12T00: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-05-13T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-14T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-15T00: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-05-16T00: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-05-17T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-18T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-19T00: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-05-20T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-22T00: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-05-23T00: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-05-24T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-26T00: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-05-27T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-29T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-30T00: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-05-31T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
<activityScheduleList>
<activity>
<idAct>A10049354913</idAct>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<activityType>
<code>EXTMERC</code>
<libelle>Mercredi</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</libelle>
</natureSpec>
</activityType>
</activity>
<weeklyCalendar>
<yearCalendar>2023</yearCalendar>
<dayWeekInfoList>
<dayNum>1</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>2</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>3</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>4</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>5</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>6</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>7</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
</weeklyCalendar>
<unitScheduleList>
<unit>
<idUnit>A10049354915</idUnit>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<calendarLetter>X</calendarLetter>
</unit>
<dayInfoList>
<day>2023-05-01T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-02T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-03T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-04T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-05T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-06T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-07T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-08T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-09T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-10T00: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-05-11T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-12T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-13T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-14T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-15T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-16T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-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-05-18T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-19T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-20T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-21T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-22T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-23T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-24T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>READ_ONLY</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-25T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-26T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-27T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-28T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-29T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-30T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-05-31T00:00:00+02:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
</personScheduleList>
</resultBean>
</ns2:getPersonScheduleListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,154 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getPersonUnitInfoResponse 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">
<getPersonUnitInfoResponseBean>
<controlResult>
<controlOK>true</controlOK>
</controlResult>
<personInfo>
<idMaelis>S10055586371</idMaelis>
<num>261768</num>
<lastname>NICO</lastname>
<firstname>BART</firstname>
<dateBirth>2014-04-01T00:00:00+02:00</dateBirth>
<sexe>M</sexe>
</personInfo>
<activity>
<idActivity>A10049354913</idActivity>
<libelle1>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle1>
<activityType>
<code>EXTMERC</code>
<libelle>Mercredi</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</libelle>
</natureSpec>
</activityType>
<typInsPortal>I</typInsPortal>
<paiementPortal>O</paiementPortal>
</activity>
<unit>
<idUnit>A10049354915</idUnit>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<dateStart>2023-02-01T00:00:00+01:00</dateStart>
<dateEnd>2023-07-07T00:00:00+02:00</dateEnd>
</unit>
<place>
<idPlace>M10053212196</idPlace>
<lib1>MAOURINE (la) ELEMENTAIRE</lib1>
</place>
<calendarGeneration>
<code>NOT_REQUIRED</code>
<value>F</value>
</calendarGeneration>
<weeklyCalendarActivity>
<dayWeekInfoList>
<dayNum>1</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>2</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>3</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>4</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>5</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>6</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>7</dayNum>
<isOpen>false</isOpen>
</dayWeekInfoList>
</weeklyCalendarActivity>
<openDayList>
<day>2023-03-15T00:00:00+01:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-03-22T00:00:00+01:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-03-29T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-05T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-12T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-19T00:00:00+02:00</day>
<hasPlace>false</hasPlace>
</openDayList>
<openDayList>
<day>2023-05-10T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-05-17T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-05-24T00:00:00+02:00</day>
<hasPlace>false</hasPlace>
</openDayList>
<openDayList>
<day>2023-05-31T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-06-07T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-06-14T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-06-21T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-06-28T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-07-05T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<unitScheduleList>
<unit>
<idUnit>A10049354915</idUnit>
<libelle>SEMST2 ADL MERC. ELEM Maourine 22/23</libelle>
<calendarLetter>X</calendarLetter>
<dateDeb>2023-02-01T00:00:00+01:00</dateDeb>
<dateFin>2023-07-07T00:00:00+02:00</dateFin>
</unit>
</unitScheduleList>
<billingInformation/>
<action>ADD_SUBSCRIBE</action>
<indicatorList>
<code>AUT_SEUL</code>
<libelle>Autorisation à partir seul</libelle>
<typeDesc>NONE</typeDesc>
</indicatorList>
<conveyance/>
</getPersonUnitInfoResponseBean>
</ns2:getPersonUnitInfoResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,124 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getPersonUnitInfoResponse 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">
<getPersonUnitInfoResponseBean>
<controlResult>
<controlOK>true</controlOK>
</controlResult>
<personInfo>
<idMaelis>S10055586371</idMaelis>
<num>261768</num>
<lastname>NICO</lastname>
<firstname>BART</firstname>
<dateBirth>2014-04-01T00:00:00+02:00</dateBirth>
<sexe>M</sexe>
</personInfo>
<activity>
<idActivity>A10055597158</idActivity>
<libelle1>ADL ELEMENTAIRE Maourine Avril 2023</libelle1>
<activityType>
<code>EXTVAC</code>
<libelle>Vacances</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</libelle>
</natureSpec>
</activityType>
<typInsPortal>I</typInsPortal>
<paiementPortal>O</paiementPortal>
</activity>
<unit>
<idUnit>A10055597160</idUnit>
<libelle>ADL ELEMENTAIRE Maourine Avril 2023</libelle>
<dateStart>2023-04-11T00:00:00+02:00</dateStart>
<dateEnd>2023-04-21T00:00:00+02:00</dateEnd>
</unit>
<place>
<idPlace>M10053212196</idPlace>
<lib1>MAOURINE (la) ELEMENTAIRE</lib1>
</place>
<calendarGeneration>
<code>REQUIRED</code>
<value>O</value>
</calendarGeneration>
<weeklyCalendarActivity>
<dayWeekInfoList>
<dayNum>1</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>2</dayNum>
<isOpen>true</isOpen>
</dayWeekInfoList>
<dayWeekInfoList>
<dayNum>3</dayNum>
<isOpen>true</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>
</weeklyCalendarActivity>
<openDayList>
<day>2023-04-11T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-12T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-13T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-14T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-19T00:00:00+02:00</day>
<hasPlace>false</hasPlace>
</openDayList>
<openDayList>
<day>2023-04-22T00:00:00+02:00</day>
<hasPlace>true</hasPlace>
</openDayList>
<unitScheduleList>
<unit>
<idUnit>A10055597164</idUnit>
<libelle>Journée</libelle>
<calendarLetter>C</calendarLetter>
<dateDeb>2023-04-11T00:00:00+02:00</dateDeb>
<dateFin>2023-04-21T00:00:00+02:00</dateFin>
</unit>
</unitScheduleList>
<unitScheduleList>
<unit>
<idUnit>A10055597162</idUnit>
<libelle>Demi-journée</libelle>
<calendarLetter>B</calendarLetter>
<dateDeb>2023-04-11T00:00:00+02:00</dateDeb>
<dateFin>2023-04-21T00:00:00+02:00</dateFin>
</unit>
</unitScheduleList>
<billingInformation>
<unitPrice>19.0</unitPrice>
</billingInformation>
<action>ADD_SUBSCRIBE</action>
<conveyance/>
</getPersonUnitInfoResponseBean>
</ns2:getPersonUnitInfoResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,27 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:updatePersonScheduleResponse 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>
<result>false</result>
<unitPersonDayInfoErrorList>
<errorMessage>Aucune place disponible pour l'activité :SEMST2 ADL MERC. ELEM Maourine 22/23, unité :SEMST2 ADL MERC. ELEM Maourine 22/23 pour le 24/05/2023</errorMessage>
<unitPersonDayInfoBean>
<numPerson>261768</numPerson>
<idAct>A10049354913</idAct>
<idUni>A10049354915</idUni>
<date>2023-05-24T00:00:00+02:00</date>
</unitPersonDayInfoBean>
</unitPersonDayInfoErrorList>
<unitPersonDayInfoErrorList>
<errorMessage>Aucune place disponible pour l'activité :SEMST2 ADL MERC. ELEM Maourine 22/23, unité :SEMST2 ADL MERC. ELEM Maourine 22/23 pour le 31/05/2023</errorMessage>
<unitPersonDayInfoBean>
<numPerson>261768</numPerson>
<idAct>A10049354913</idAct>
<idUni>A10049354915</idUni>
<date>2023-05-31T00:00:00+02:00</date>
</unitPersonDayInfoBean>
</unitPersonDayInfoErrorList>
</resultBean>
</ns2:updatePersonScheduleResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,18 @@
{# Display bookings changes by activities #}
{% regroup form_workflow_data_ws_response.changes|dictsort:"activity_label" by activity_label as changements_par_activite %}
{% for changes in changements_par_activite %}
{% if changes.grouper %}<p><strong>{{changes.grouper}} :</strong></p>{% endif %}
{% regroup changes.list|dictsort:"booked" by booked as changements_par_statut %}
{% for status_changes in changements_par_statut %}
{% if status_changes.grouper %}
<p>Réservations : {% for change in status_changes.list %}{{change.day}}{% if not forloop.last %}, {% endif %}{% endfor %}</p>
{% endif %}
{% endfor %}
{% for status_changes in changements_par_statut %}
{% if not status_changes.grouper %}
<p>Annulations : {% for change in status_changes.list %}{{change.day}}{% if not forloop.last %}, {%endif %}{% endfor %}</p>
{% endif %}
{% endfor %}
{% endfor %}

View File

@ -31,6 +31,7 @@ from passerelle.contrib.toulouse_maelis.models import Link, Referential, Toulous
from passerelle.contrib.toulouse_maelis.utils import get_public_criterias, json_date_format
from passerelle.utils.jsonresponse import APIError
from passerelle.utils.soap import SOAPError
from passerelle.utils.templates import render_to_string
from tests.utils import FakedResponse, ResponsesSoap, generic_endpoint_url, setup_access_rights
TEST_BASE_DIR = os.path.join(os.path.dirname(__file__), 'data', 'toulouse_maelis')
@ -4494,6 +4495,79 @@ def test_read_child_agenda_multi_units(activity_service, con, app):
]
def test_read_child_agenda_with_activity(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_with_activity.xml')
)
url = get_endpoint('read-child-agenda')
resp = app.get(url + '?family_id=1312&child_id=322423&start_date=2023-05-01&end_date=2023-05-31')
assert resp.json['err'] == 0
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.get(url + '?NameID=local&child_id=322423&start_date=2023-05-01&end_date=2023-05-31')
assert resp.json['err'] == 0
assert resp.json['extra_data'] == {
'start_date': '2023-05-01',
'end_date': '2023-05-31',
'school_year': '2022/2023',
}
assert len(resp.json['data']) == 18
# extra-sco bookings ('X' nature) are displayed but disabled
extra_sco_bookings = [x for x in resp.json['data'] if x['details']['activity_type'] == 'EXTMERC']
assert len([x for x in extra_sco_bookings if x['details']['status'] == 'WRITABLE']) == 3
assert all([x['disabled'] for x in extra_sco_bookings])
assert resp.json['data'][4:6] == [
{
'id': '322423:A10049354913:2023-05-10',
'text': 'Wednesday 10 May 2023',
'prefill': True,
'disabled': True, # disabled
'details': {
'day': '2023-05-10T00:00:00+02:00',
'scheduledPresence': 1,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'DEL_PRES_PREVI',
'hasPlace': None,
'absence': None,
'status_color': 'green',
'activity_id': 'A10049354913',
'activity_type': 'EXTMERC',
'activity_label': 'SEMST2 ADL MERC. ELEM Maourine 22/23',
'child_id': '322423',
'day_str': '2023-05-10',
'unit_id': 'A10049354915',
},
},
{
'id': '322423:A10049327689:2023-05-11',
'text': 'Thursday 11 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-11T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'status_color': 'white',
'activity_id': 'A10049327689',
'activity_type': 'ACCMAT',
'activity_label': 'Accueil du matin',
'child_id': '322423',
'day_str': '2023-05-11',
'unit_id': 'A10049327690',
},
},
]
def test_read_child_agenda_not_linked_error(con, app):
url = get_endpoint('read-child-agenda')
@ -5794,6 +5868,7 @@ def test_get_person_subscription_info(activity_service, con, app):
'indicators': {},
'recurrent_week': [],
'conveyance': None,
'agenda': [],
}
# no date provided
@ -5926,6 +6001,7 @@ def test_get_person_subscription_info_with_recurrent_week(activity_service, con,
'conveyance': None,
'indicatorList': [],
'indicators': {},
'agenda': [],
'recurrent_week': [
{'id': '1-C', 'day': 'Lundi', 'label': 'Journée', 'overlaps': ['1-B'], 'text': 'Lundi Journée'},
{
@ -6043,6 +6119,246 @@ def test_get_person_subscription_info_with_indicators(activity_service, con, app
assert 'AUT_SEUL' in resp.json['data']['indicators']
def test_get_person_subscription_info_with_agenda(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo', get_xml_file('R_get_person_unit_info_with_open_day_list.xml')
)
url = get_endpoint('get-person-subscription-info')
params = {
'NameID': '',
'family_id': '322423',
'person_id': '261768',
'activity_id': 'A10049354913',
'unit_id': 'A10049354915',
'place_id': 'M10053212196',
'ref_date': '2023-03-11',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 0
assert len(resp.json['data']['agenda']) == 15
assert resp.json['data']['agenda'][6:10] == [
{
'id': '261768:A10049354913:A10049354915:2023-05-10',
'text': 'Wednesday 10 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-10T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-05-10',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-17',
'text': 'Wednesday 17 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-17T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-05-17',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-24',
'text': 'Wednesday 24 May 2023',
'prefill': False,
'disabled': True,
'details': {
'day': '2023-05-24T00:00:00+02:00',
'hasPlace': False,
'day_str': '2023-05-24',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-31',
'text': 'Wednesday 31 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-31T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-05-31',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
},
},
]
def test_get_person_subscription_info_with_agenda_multi_units(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo', get_xml_file('R_get_person_unit_info_with_open_day_list_with_multi_units.xml')
)
url = get_endpoint('get-person-subscription-info')
params = {
'NameID': '',
'family_id': '322423',
'person_id': '261768',
'activity_id': 'A10049354913',
'unit_id': 'A10049354915',
'place_id': 'M10053212196',
'ref_date': '2023-03-11',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 0
assert len(resp.json['data']['agenda']) == 10
assert resp.json['data']['agenda'] == [
{
'id': '261768:A10049354913:A10055597162:2023-04-11',
'text': 'Tuesday 11 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-11T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-11',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
},
},
{
'id': '261768:A10049354913:A10055597164:2023-04-11',
'text': 'Tuesday 11 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-11T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-11',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
},
},
{
'id': '261768:A10049354913:A10055597162:2023-04-12',
'text': 'Wednesday 12 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-12T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-12',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
},
},
{
'id': '261768:A10049354913:A10055597164:2023-04-12',
'text': 'Wednesday 12 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-12T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-12',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
},
},
{
'id': '261768:A10049354913:A10055597162:2023-04-13',
'text': 'Thursday 13 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-13T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-13',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
},
},
{
'id': '261768:A10049354913:A10055597164:2023-04-13',
'text': 'Thursday 13 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-13T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-13',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
},
},
{
'id': '261768:A10049354913:A10055597162:2023-04-14',
'text': 'Friday 14 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-14T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-14',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
},
},
{
'id': '261768:A10049354913:A10055597164:2023-04-14',
'text': 'Friday 14 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-14T00:00:00+02:00',
'hasPlace': True,
'day_str': '2023-04-14',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
},
},
{
'id': '261768:A10049354913:A10055597162:2023-04-19',
'text': 'Wednesday 19 April 2023',
'prefill': False,
'disabled': True,
'details': {
'day': '2023-04-19T00:00:00+02:00',
'hasPlace': False,
'day_str': '2023-04-19',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
},
},
{
'id': '261768:A10049354913:A10055597164:2023-04-19',
'text': 'Wednesday 19 April 2023',
'prefill': False,
'disabled': True,
'details': {
'day': '2023-04-19T00:00:00+02:00',
'hasPlace': False,
'day_str': '2023-04-19',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
},
},
]
def test_get_person_subscription_info_error(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo',
@ -6335,6 +6651,653 @@ def test_add_person_basket_subscription_with_conveyance_not_found(activity_servi
assert resp.json['err_desc'] == 'no "plop" place defined on "afternoonJourney" conveyance'
def test_read_activity_agenda(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_on_activity.xml')
)
url = get_endpoint('read-activity-agenda')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-05-01',
'end_date': '2023-05-31',
}
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['extra_data'] == {
'start_date': '2023-05-01',
'end_date': '2023-05-31',
'school_year': '2022/2023',
}
assert len(resp.json['data']) == 4
assert resp.json['data'] == [
{
'id': '261768:A10049354913:A10049354915:2023-05-10',
'text': 'Wednesday 10 May 2023',
'prefill': True,
'disabled': False,
'details': {
'day': '2023-05-10T00:00:00+02:00',
'scheduledPresence': 1,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'DEL_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-05-10',
'status_color': 'green',
'activity_label': '',
'activity_id': 'A10049354915',
'maelis_activity_id': 'A10049354913',
'maelis_unit_id': 'A10049354915',
'maelis_day_str': '10/05/2023',
'maelis_unit_label': 'SEMST2 ADL MERC. ELEM Maourine 22/23',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-17',
'text': 'Wednesday 17 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-17T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-05-17',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
'maelis_activity_id': 'A10049354913',
'maelis_unit_id': 'A10049354915',
'maelis_day_str': '17/05/2023',
'maelis_unit_label': 'SEMST2 ADL MERC. ELEM Maourine 22/23',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-24',
'text': 'Wednesday 24 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-24T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-05-24',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
'maelis_activity_id': 'A10049354913',
'maelis_unit_id': 'A10049354915',
'maelis_day_str': '24/05/2023',
'maelis_unit_label': 'SEMST2 ADL MERC. ELEM Maourine 22/23',
},
},
{
'id': '261768:A10049354913:A10049354915:2023-05-31',
'text': 'Wednesday 31 May 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-05-31T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-05-31',
'status_color': 'white',
'activity_label': '',
'activity_id': 'A10049354915',
'maelis_activity_id': 'A10049354913',
'maelis_unit_id': 'A10049354915',
'maelis_day_str': '31/05/2023',
'maelis_unit_label': 'SEMST2 ADL MERC. ELEM Maourine 22/23',
},
},
]
def test_read_activity_agenda_multi_units(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_on_activity_with_multi_units.xml')
)
url = get_endpoint('read-activity-agenda')
params = {
'person_id': '261771',
'activity_id': 'A10055597158',
'start_date': '2023-04-01',
'end_date': '2023-04-30',
}
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['extra_data'] == {
'start_date': '2023-04-01',
'end_date': '2023-04-30',
'school_year': '2022/2023',
}
assert len(resp.json['data']) == 10
assert resp.json['data'][:8] == [
{
'id': '261771:A10055597158:A10055597162:2023-04-11',
'text': 'Tuesday 11 April 2023',
'prefill': True,
'disabled': False,
'details': {
'day': '2023-04-11T00:00:00+02:00',
'scheduledPresence': 1,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'DEL_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-11',
'status_color': 'green',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597162',
'maelis_day_str': '11/04/2023',
'maelis_unit_label': 'Demi-journée',
},
},
{
'id': '261771:A10055597158:A10055597164:2023-04-11',
'text': 'Tuesday 11 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-11T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-11',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597164',
'maelis_day_str': '11/04/2023',
'maelis_unit_label': 'Journée',
},
},
{
'id': '261771:A10055597158:A10055597162:2023-04-12',
'text': 'Wednesday 12 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-12T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-12',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597162',
'maelis_day_str': '12/04/2023',
'maelis_unit_label': 'Demi-journée',
},
},
{
'id': '261771:A10055597158:A10055597164:2023-04-12',
'text': 'Wednesday 12 April 2023',
'prefill': True,
'disabled': False,
'details': {
'day': '2023-04-12T00:00:00+02:00',
'scheduledPresence': 1,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'DEL_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-12',
'status_color': 'green',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597164',
'maelis_day_str': '12/04/2023',
'maelis_unit_label': 'Journée',
},
},
{
'id': '261771:A10055597158:A10055597162:2023-04-13',
'text': 'Thursday 13 April 2023',
'prefill': True,
'disabled': False,
'details': {
'day': '2023-04-13T00:00:00+02:00',
'scheduledPresence': 1,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'DEL_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-13',
'status_color': 'green',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597162',
'maelis_day_str': '13/04/2023',
'maelis_unit_label': 'Demi-journée',
},
},
{
'id': '261771:A10055597158:A10055597164:2023-04-13',
'text': 'Thursday 13 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-13T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-13',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597164',
'maelis_day_str': '13/04/2023',
'maelis_unit_label': 'Journée',
},
},
{
'id': '261771:A10055597158:A10055597162:2023-04-14',
'text': 'Friday 14 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-14T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-14',
'status_color': 'white',
'activity_label': 'Demi-journée',
'activity_id': 'A10055597162',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597162',
'maelis_day_str': '14/04/2023',
'maelis_unit_label': 'Demi-journée',
},
},
{
'id': '261771:A10055597158:A10055597164:2023-04-14',
'text': 'Friday 14 April 2023',
'prefill': False,
'disabled': False,
'details': {
'day': '2023-04-14T00:00:00+02:00',
'scheduledPresence': 0,
'realPresence': 0,
'status': 'WRITABLE',
'action': 'ADD_PRES_PREVI',
'hasPlace': None,
'absence': None,
'day_str': '2023-04-14',
'status_color': 'white',
'activity_label': 'Journée',
'activity_id': 'A10055597164',
'maelis_activity_id': 'A10055597158',
'maelis_unit_id': 'A10055597164',
'maelis_day_str': '14/04/2023',
'maelis_unit_label': 'Journée',
},
},
]
def test_read_activity_agenda_not_linked_error(con, app):
url = get_endpoint('read-activity-agenda')
resp = app.get(
url
+ '?NameID=local&person_id=261768&activity_id=A10049354913&start_date=2023-05-01&end_date=2023-05-31'
)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'User not linked to family'
def test_read_activity_agenda_date_error(con, app):
url = get_endpoint('read-activity-agenda')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': 'bad',
'end_date': '2023-08-31',
}
resp = app.get(url + '?family_id=1312', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'bad date format, should be YYYY-MM-DD'
params['start_date'] = '2022-09-01'
params['end_date'] = 'bad'
resp = app.get(url + '?family_id=1312', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'bad date format, should be YYYY-MM-DD'
params['start_date'] = '2023-09-01'
params['end_date'] = '2023-08-31'
resp = app.get(url + '?family_id=1312', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'start_date should be before end_date'
params['start_date'] = '2022-09-01'
params['end_date'] = ('2024-08-31',)
resp = app.get(url + '?family_id=1312', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'start_date and end_date are in different reference year (2022 != 2023)'
def test_read_activity_agenda_empty(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_empty.xml')
)
url = get_endpoint('read-activity-agenda')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-05-01',
'end_date': '2023-05-31',
}
resp = app.get(url + '?family_id=1312', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == []
def test_update_activity_agenda(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_on_activity.xml')
)
url = get_endpoint('update-activity-agenda')
def request_check(request):
assert request.numDossier == 1312
assert len(request.unitPersonDayInfoList) == 4
assert [dict(x) for x in serialize_object(request.unitPersonDayInfoList)] == [
{
'numPerson': 261768,
'idAct': 'A10049354913',
'idUni': 'A10049354915',
'date': datetime.datetime(2023, 5, 10, 0, 0),
'action': 'DEL_PRES_PREVI',
},
{
'numPerson': 261768,
'idAct': 'A10049354913',
'idUni': 'A10049354915',
'date': datetime.datetime(2023, 5, 17, 0, 0),
'action': 'ADD_PRES_PREVI',
},
{
'numPerson': 261768,
'idAct': 'A10049354913',
'idUni': 'A10049354915',
'date': datetime.datetime(2023, 5, 24, 0, 0),
'action': 'ADD_PRES_PREVI',
},
{
'numPerson': 261768,
'idAct': 'A10049354913',
'idUni': 'A10049354915',
'date': datetime.datetime(2023, 5, 31, 0, 0),
'action': 'ADD_PRES_PREVI',
},
]
activity_service.add_soap_response(
'updatePersonSchedule',
get_xml_file('R_update_person_schedule_list_on_activity.xml'),
request_check=request_check,
)
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-05-01',
'end_date': '2023-05-31',
'booking_list': [
#'261768:A10049354913:A10049354915:2023-05-10', # remove this one
'261768:A10049354913:A10049354915:2023-05-17', # add this one
# add 2 others but get errors from maelis
'261768:A10049354913:A10049354915:2023-05-24',
'261768:A10049354913:A10049354915:2023-05-31',
],
}
resp = app.post_json(url + '?family_id=1312', params=params)
assert resp.json['err'] == 0
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json == {
'updated': True,
'count': 2,
'changes': [
{'activity_label': '', 'day': '2023-05-10', 'booked': False},
{'activity_label': '', 'day': '2023-05-17', 'booked': True},
],
'err': 0,
}
with open(os.path.join(TEST_BASE_DIR, "update_activity_agenda_template.html")) as fd:
template = fd.read()
message = render_to_string(template, {'form_workflow_data_ws_response': resp.json})
assert [l.strip() for l in message.split('\n') if l.strip()] == [
'<p>Réservations : 2023-05-17</p>',
'<p>Annulations : 2023-05-10</p>',
]
def test_update_activity_agenda_multi_units(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_on_activity_with_multi_units.xml')
)
url = get_endpoint('update-activity-agenda')
def request_check(request):
assert request.numDossier == 1312
assert len(request.unitPersonDayInfoList) == 4
assert [dict(x) for x in serialize_object(request.unitPersonDayInfoList)] == [
{
'numPerson': 261771,
'idAct': 'A10055597158',
'idUni': 'A10055597162',
'date': datetime.datetime(2023, 4, 11, 0, 0),
'action': 'DEL_PRES_PREVI',
},
{
'numPerson': 261771,
'idAct': 'A10055597158',
'idUni': 'A10055597162',
'date': datetime.datetime(2023, 4, 13, 0, 0),
'action': 'DEL_PRES_PREVI',
},
{
'numPerson': 261771,
'idAct': 'A10055597158',
'idUni': 'A10055597164',
'date': datetime.datetime(2023, 4, 13, 0, 0),
'action': 'ADD_PRES_PREVI',
},
{
'numPerson': 261771,
'idAct': 'A10055597158',
'idUni': 'A10055597164',
'date': datetime.datetime(2023, 4, 14, 0, 0),
'action': 'ADD_PRES_PREVI',
},
]
activity_service.add_soap_response(
'updatePersonSchedule',
get_xml_file('R_update_person_schedule.xml'),
request_check=request_check,
)
params = {
'person_id': '261771',
'activity_id': 'A10055597158',
'start_date': '2023-04-11',
'end_date': '2023-04-21',
'booking_list': [
# '261771:A10055597158:A10055597162:2023-04-11 # remove this one
'261771:A10055597158:A10055597164:2023-04-12', # keep this one
'261771:A10055597158:A10055597164:2023-04-13', # switch unit on this day
'261771:A10055597158:A10055597164:2023-04-14', # add this one
],
}
resp = app.post_json(url + '?family_id=1312', params=params)
assert resp.json['err'] == 0
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json == {
'updated': True,
'count': 4,
'changes': [
{'activity_label': 'Demi-journée', 'day': '2023-04-11', 'booked': False},
{'activity_label': 'Demi-journée', 'day': '2023-04-13', 'booked': False},
{'activity_label': 'Journée', 'day': '2023-04-13', 'booked': True},
{'activity_label': 'Journée', 'day': '2023-04-14', 'booked': True},
],
'err': 0,
}
with open(os.path.join(TEST_BASE_DIR, "update_activity_agenda_template.html")) as fd:
template = fd.read()
message = render_to_string(template, {'form_workflow_data_ws_response': resp.json})
assert [x.strip() for x in message.split('\n') if x.strip()] == [
'<p><strong>Demi-journée :</strong></p>',
'<p>Annulations : 2023-04-11, 2023-04-13</p>',
'<p><strong>Journée :</strong></p>',
'<p>Réservations : 2023-04-13, 2023-04-14</p>',
]
def test_update_activity_agenda_no_changes(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list_on_activity.xml')
)
url = get_endpoint('update-activity-agenda')
Link.objects.create(resource=con, family_id='1312', name_id='local')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-05-01',
'end_date': '2023-05-31',
'booking_list': [
'261768:A10049354913:A10049354915:2023-05-10',
],
}
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json == {'changes': [], 'count': 0, 'err': 0, 'errors': [], 'updated': False}
def test_update_activity_agenda_not_linked_error(con, app):
url = get_endpoint('update-activity-agenda')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-05-01',
'end_date': '2023-05-31',
'booking_list': [
'261768:A10049354913:A10049354915:2023-05-10',
],
}
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_activity_agenda_date_error(con, app):
url = get_endpoint('update-activity-agenda')
Link.objects.create(resource=con, family_id='1312', name_id='local')
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': 'bad',
'end_date': '2023-08-31',
'booking_list': [],
}
resp = app.post_json(url + '?NameID=local', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "start_date: 'bad' does not match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'"
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2022-09-01',
'end_date': 'bad',
'booking_list': [],
}
resp = app.post_json(url + '?NameID=local', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "end_date: 'bad' does not match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'"
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2023-09-01',
'end_date': '2023-08-31',
'booking_list': [],
}
resp = app.post_json(url + '?NameID=local', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'start_date should be before end_date'
params = {
'person_id': '261768',
'activity_id': 'A10049354913',
'start_date': '2022-09-01',
'end_date': '2024-08-31',
'booking_list': [],
}
resp = app.post_json(url + '?NameID=local', params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'start_date and end_date are in different reference year (2022 != 2023)'
@pytest.mark.xfail(run=False)
def test_get_basket(activity_service, con, app):
activity_service.add_soap_response('getFamilyBasket', get_xml_file('R_get_family_basket.xml'))