toulouse-maelis: envoyer automatiquement une semaine type si calendarGeneration vaut 'O' (#78028) #268

Merged
nroche merged 2 commits from wip/78028-parsifal-select-required-recurrent-week into main 2023-06-15 10:52:26 +02:00
6 changed files with 427 additions and 33 deletions

View File

@ -3143,6 +3143,42 @@ class ToulouseMaelis(BaseResource, HTTPResource):
levels[level['id']] = indicators
return {'data': data, 'meta': levels}
def get_recurrent_info_from_subscription_info(self, response):
day_names = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']
recurrent_week = []
weekly_calendar = response.get('weeklyCalendarActivity')
calendar_generation = response.get('calendarGeneration') or {}
calendar_generation_value = calendar_generation.get('value') or 'I'
if calendar_generation_value in ('O', 'F') and weekly_calendar:
units = []
for item in response.get('unitScheduleList') or []:
key = item['unit']['calendarLetter']
value = item['unit']['libelle']
units.append((key, value))
if calendar_generation.get('value') == 'O' and len(units) > 1:
raise APIError(
'connector do not manage activity having both calendarGeneration required and several units'
)
for item in weekly_calendar.get('dayWeekInfoList') or []:
if item['isOpen']:
day_num = item['dayNum']
day = day_names[day_num - 1]
for key, value in units:
recurrent_week.append(
{
'id': '%s-%s' % (day_num, key),
'day': day,
'label': value,
'overlaps': ['%s-%s' % (day_num, k) for k, v in units if k != key],
'text': '%s %s' % (day, value),
}
)
return {
'calendar_generation': calendar_generation_value,
'recurrent_week': recurrent_week,
}
@endpoint(
display_category='Inscriptions',
description="Obtenir les informations pour s'inscrire puis réserver sur l'extra-scolaire ou le loisir",
@ -3189,33 +3225,11 @@ class ToulouseMaelis(BaseResource, HTTPResource):
'dateRef': ref_date,
}
response = self.call('Activity', 'getPersonUnitInfo', getPersonUnitInfoRequestBean=params)
day_names = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']
recurrent_week = []
weekly_calendar = response.get('weeklyCalendarActivity')
calendar_generation = response.get('calendarGeneration')
if calendar_generation and calendar_generation.get('value') in ('O', 'F') and weekly_calendar:
units = []
for item in response.get('unitScheduleList') or []:
key = item['unit']['calendarLetter']
value = item['unit']['libelle']
units.append((key, value))
for item in weekly_calendar.get('dayWeekInfoList') or []:
if item['isOpen']:
day_num = item['dayNum']
day = day_names[day_num - 1]
for key, value in units:
recurrent_week.append(
{
'id': '%s-%s' % (day_num, key),
'day': day,
'label': value,
'overlaps': ['%s-%s' % (day_num, k) for k, v in units if k != key],
'text': '%s %s' % (day, value),
}
)
response['recurrent_week'] = recurrent_week
recurrent_info = self.get_recurrent_info_from_subscription_info(response)
if recurrent_info['calendar_generation'] == 'F':
response['recurrent_week'] = recurrent_info['recurrent_week']
else:
response['recurrent_week'] = []
if response.get('conveyance'):
for part_of_day in response['conveyance'].values():
@ -3306,8 +3320,17 @@ class ToulouseMaelis(BaseResource, HTTPResource):
'no "%s" place defined on "%s" conveyance' % (payload_bus_id, info_key)
)
recurrent_info = self.get_recurrent_info_from_subscription_info(subscription_info)
available_items = [x['id'] for x in recurrent_info['recurrent_week']]
if recurrent_info['calendar_generation'] == 'O':
# automaticaly select all recurrent slots
selected_recurrent_week = available_items
else:
selected_recurrent_week = post_data.get('recurrent_week')
recurrent_week = []
for item in post_data.get('recurrent_week') or []:
for item in selected_recurrent_week or []:
if item not in available_items:
raise APIError("recurrent item '%s' is not available no on this activity" % item)
day_num, key = item.split('-')
recurrent_week.append(
{

View File

@ -39,8 +39,8 @@
<lib1>MAOURINE (la) ELEMENTAIRE</lib1>
</place>
<calendarGeneration>
<code>REQUIRED</code>
<value>O</value>
<code>NOT_REQUIRED</code>
<value>F</value>
</calendarGeneration>
<weeklyCalendarActivity>
<dayWeekInfoList>

View File

@ -38,8 +38,8 @@
<lib1>MAOURINE (la) ELEMENTAIRE</lib1>
</place>
<calendarGeneration>
<code>REQUIRED</code>
<value>O</value>
<code>NOT_REQUIRED</code>
<value>F</value>
</calendarGeneration>
<weeklyCalendarActivity>
<dayWeekInfoList>

View File

@ -0,0 +1,90 @@
<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>false</controlOK>
<message>E1023 : L'inscription ne peut pas être réalisée car le mode de facturation n'a pas été trouvé</message>
</controlResult>
<personInfo>
<idMaelis>S10056966965</idMaelis>
<num>217553</num>
<lastname>TEST_NICO</lastname>
<firstname>BART</firstname>
<dateBirth>2014-04-01T00:00:00+02:00</dateBirth>
<sexe>M</sexe>
</personInfo>
<activity>
<idActivity>A10056514645</idActivity>
<libelle1>TEST ECOLE DES SPORTS 22/23 SEMESTRE 2 - MULTIACTIVITES</libelle1>
<activityType>
<code>1-AAQ</code>
<libelle>Activités Aquatiques - Activité Réguliére</libelle>
<natureSpec>
<code>1</code>
<libelle>Activités Régulières</libelle>
</natureSpec>
</activityType>
<typInsPortal>I</typInsPortal>
<paiementPortal>O</paiementPortal>
</activity>
<unit>
<idUnit>A10056514650</idUnit>
<libelle>MERCREDI - 13h45/17h - 8/15Ans</libelle>
<dateStart>2023-02-01T00:00:00+01:00</dateStart>
<dateEnd>2023-06-30T00:00:00+02:00</dateEnd>
</unit>
<place>
<idPlace>A10053179757</idPlace>
<lib1>ARGOULETS</lib1>
</place>
<calendarGeneration>
<code>REQUIRED</code>
<value>O</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>
<unitScheduleList>
<unit>
<idUnit>A10056514650</idUnit>
<libelle>MERCREDI - 13h45/17h - 8/15Ans</libelle>
<calendarLetter>B</calendarLetter>
<dateDeb>2023-02-01T00:00:00+01:00</dateDeb>
<dateFin>2023-06-30T00:00:00+02:00</dateFin>
</unit>
</unitScheduleList>
<billingInformation/>
<action>ADD_SUBSCRIBE</action>
<conveyance/>
</getPersonUnitInfoResponseBean>
</ns2:getPersonUnitInfoResponse>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,97 @@
<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>A10055585858</idActivity>
<libelle1>ADL ELEMENTAIRE Maourine FEVRIER 22/23</libelle1>
<activityType>
<code>EXTVAC</code>
<libelle>Vacances</libelle>
<natureSpec>
<code>X</code>
<libelle>Extrascolaire</libelle>
</natureSpec>
</activityType>
<typInsPortal>I</typInsPortal>
<paiementPortal>I</paiementPortal>
</activity>
<unit>
<idUnit>A10055585860</idUnit>
<libelle>ADL ELEMENTAIRE Maourine FEVRIER 22/23</libelle>
<dateStart>2023-02-13T00:00:00+01:00</dateStart>
<dateEnd>2023-02-24T00:00:00+01: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>
<unitScheduleList>
<unit>
<idUnit>A10055586816</idUnit>
<libelle>Journée</libelle>
<calendarLetter>C</calendarLetter>
<dateDeb>2023-02-13T00:00:00+01:00</dateDeb>
<dateFin>2023-02-24T00:00:00+01:00</dateFin>
</unit>
</unitScheduleList>
<unitScheduleList>
<unit>
<idUnit>A10055586815</idUnit>
<libelle>Demi-journée</libelle>
<calendarLetter>B</calendarLetter>
<dateDeb>2023-02-13T00:00:00+01:00</dateDeb>
<dateFin>2023-02-24T00:00:00+01:00</dateFin>
</unit>
</unitScheduleList>
<billingInformation/>
<action>ADD_SUBSCRIBE</action>
</getPersonUnitInfoResponseBean>
</ns2:getPersonUnitInfoResponse>
</soap:Body>
</soap:Envelope>

View File

@ -7170,7 +7170,7 @@ def test_get_person_subscription_info_with_recurrent_week(activity_service, con,
'endHour': None,
'endHour2': None,
},
'calendarGeneration': {'code': 'REQUIRED', 'value': 'O'},
'calendarGeneration': {'code': 'NOT_REQUIRED', 'value': 'F'},
'weeklyCalendarActivity': {
'dayWeekInfoList': [
{'dayNum': 1, 'isOpen': True},
@ -7282,6 +7282,78 @@ def test_get_person_subscription_info_with_recurrent_week(activity_service, con,
assert resp.json['err'] == 0
def test_get_person_subscription_info_with_recurrent_week_required(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info_with_recurrent_week_required.xml'),
)
url = get_endpoint('get-person-subscription-info')
params = {
'NameID': '',
'family_id': '311323',
'person_id': '246423',
'activity_id': 'A10053187087',
'unit_id': 'A10053187241',
'place_id': 'A10053179604',
'ref_date': '2023-01-22',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 0
assert resp.json['data']['calendarGeneration'] == {'code': 'REQUIRED', 'value': 'O'}
assert any([x['isOpen'] for x in resp.json['data']['weeklyCalendarActivity']['dayWeekInfoList']])
# recurrent_week is not display to user
assert resp.json['data']['recurrent_week'] == []
def test_get_person_subscription_info_with_recurrent_week_required_error(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info_with_recurrent_week_required_error.xml'),
)
url = get_endpoint('get-person-subscription-info')
params = {
'NameID': '',
'family_id': '311323',
'person_id': '246423',
'activity_id': 'A10053187087',
'unit_id': 'A10053187241',
'place_id': 'A10053179604',
'ref_date': '2023-01-22',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 1
assert (
resp.json['err_desc']
== 'connector do not manage activity having both calendarGeneration required and several units'
)
def test_get_person_subscription_info_with_recurrent_week_forbidden(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info.xml'),
)
url = get_endpoint('get-person-subscription-info')
params = {
'NameID': '',
'family_id': '311323',
'person_id': '246423',
'activity_id': 'A10053187087',
'unit_id': 'A10053187241',
'place_id': 'A10053179604',
'ref_date': '2023-01-22',
}
resp = app.get(url, params=params)
assert resp.json['err'] == 0
assert resp.json['data']['calendarGeneration'] == {'code': 'FORBIDDEN', 'value': 'I'}
assert any([x['isOpen'] for x in resp.json['data']['weeklyCalendarActivity']['dayWeekInfoList']])
# recurrent_week is not display to user
assert resp.json['data']['recurrent_week'] == []
def test_get_person_subscription_info_with_conveyance(activity_service, con, app):
activity_service.add_soap_response(
'getPersonUnitInfo',
@ -7858,6 +7930,63 @@ def test_add_person_basket_subscription_with_recurrent_week_empty(family_service
assert resp.json['err'] == 0
def test_add_person_basket_subscription_with_recurrent_week_required(
family_service, activity_service, con, app
):
def request_check(request):
assert serialize_object(request.dayWeekInfoList) == [
{'dayNum': 3, 'isPresent': True, 'isOpen': None, 'calendarLetter': 'B'},
]
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
activity_service.add_soap_response(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info_with_recurrent_week_required.xml'),
)
activity_service.add_soap_response(
'addPersonUnitBasket',
get_xml_file('R_add_person_unit_basket.xml'),
request_check=request_check,
)
url = get_endpoint('add-person-basket-subscription')
params = {
'person_id': '613880',
'activity_id': 'A10051141965',
'unit_id': 'A10051141990',
'place_id': 'A10053179226',
'start_date': '2022-09-01',
'end_date': '2023-08-31',
'recurrent_week': '',
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 0
def test_add_person_basket_subscription_with_recurrent_week_forbidden_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(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info.xml'),
)
url = get_endpoint('add-person-basket-subscription')
params = {
'person_id': '613880',
'activity_id': 'A10051141965',
'unit_id': 'A10051141990',
'place_id': 'A10053179226',
'start_date': '2022-09-01',
'end_date': '2023-08-31',
'recurrent_week': ['1-B', '2-C'],
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "recurrent item '1-B' is not available no on this activity"
def test_basket_subscription_providing_wcs_demand(family_service, activity_service, con, app):
family_service.add_soap_response('readFamily', get_xml_file('R_read_family_for_subscription.xml'))
activity_service.add_soap_response('getPersonUnitInfo', get_xml_file('R_get_person_unit_info.xml'))
@ -8169,6 +8298,61 @@ def test_add_person_subscription_with_recurrent_week_empty(family_service, activ
assert resp.json['err'] == 0
def test_add_person_subscription_with_recurrent_week_required(family_service, activity_service, con, app):
def request_check(request):
assert serialize_object(request.dayWeekInfoList) == [
{'dayNum': 3, 'isPresent': True, 'isOpen': None, 'calendarLetter': 'B'},
]
family_service.add_soap_response('readFamily', get_xml_file('R_read_family.xml'))
activity_service.add_soap_response(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info_with_recurrent_week_required.xml'),
)
activity_service.add_soap_response(
'addPersonUnitSubscribe',
get_xml_file('R_add_person_unit_subscribe.xml'),
request_check=request_check,
)
url = get_endpoint('add-person-subscription')
params = {
'person_id': '613880',
'activity_id': 'A10051141965',
'unit_id': 'A10051141990',
'place_id': 'A10053179226',
'start_date': '2022-09-01',
'end_date': '2023-08-31',
'recurrent_week': '',
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 0
def test_add_person_subscription_with_recurrent_week_forbidden_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(
'getPersonUnitInfo',
get_xml_file('R_get_person_unit_info.xml'),
)
url = get_endpoint('add-person-subscription')
params = {
'person_id': '613880',
'activity_id': 'A10051141965',
'unit_id': 'A10051141990',
'place_id': 'A10053179226',
'start_date': '2022-09-01',
'end_date': '2023-08-31',
'recurrent_week': ['1-B', '2-C'],
}
resp = app.post_json(url + '?family_id=311323', params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == "recurrent item '1-B' is not available no on this activity"
def test_add_person_subscription_with_conveyance(family_service, activity_service, con, app):
def request_check(request):
assert serialize_object(request.conveyanceSubscribe) == {