# Idő intervallumok - jegyeladáskor ## Eladható jegyek lekérdezése 1. Az időpontok és szabad helyek lekérdezéséhez a service megkapja az offer id-t és egy tól/ig dátumot. 2. Lekérdezi az offer-hez tartozó IntervalRule-okat (is_active=true, deleted=NULL) 3. A rulok alapján intervallumokat generál, mindegyiknél a még szabad helyek számával 4. Ezeknek az intervallumoknak a listáját adjuk vissza pl: ```bash= // request: GET api/offers/toronylatogatas-id/intervals/?start=2020-05-18 00:00:00&end=2020-05-31 23:59:59 // response: [ { start: '2020-05-18 09:00:00', length: 60, quant: 12 }, { start: '2020-05-18 12:00:00', length: 60, quant: 20 }, { start: '2020-05-18 15:00:00', length: 60, quant: 20 }, { start: '2020-05-20 10:00:00', length: 60, quant: 11 }, { start: '2020-05-20 13:00:00', length: 60, quant: 30 }, { start: '2020-05-20 16:00:00', length: 60, quant: 30 }, { start: '2020-05-25 09:00:00', length: 60, quant: 18 }, { start: '2020-05-25 12:00:00', length: 60, quant: 7 }, { start: '2020-05-25 15:00:00', length: 60, quant: 0 }, { start: '2020-05-27 10:00:00', length: 60, quant: 18 }, { start: '2020-05-27 13:00:00', length: 60, quant: 9 }, { start: '2020-05-27 16:00:00', length: 60, quant: 0 }, ] ``` #### A service-ben: ```php= intervalRule1 = { // ez egy hétfői nap startDate = "2020-05-04 10:12:34" endDate = "2020-05-05 16:12:34" isActive = true maxQuant = 20 freq = "heti" offers = ["toronylatogatas-id"] intervalGroupId = 1 intervals = [ {"start_time":"09:00:00", "length":60}, {"start_time":"12:00:00", "length":60}, {"start_time":"15:00:00", "length":60}, ]; } intervalRule2 = { // ez egy szerdai nap startDate = "2020-05-06 10:12:34" endDate = "2020-05-06 16:12:34" isActive = true maxQuant = 30 freq = "heti" offers = ["toronylatogatas-id"] intervalGroupId = 1 intervals = [ {"start_time":"10:00:00", "length":60}, {"start_time":"13:00:00", "length":60}, {"start_time":"16:00:00", "length":60}, ]; } ``` :question: Ha az interval rulok intervals tömbjében csak idpőntot adunk meg, napot nem, akkor az interval rule mindig csak egy napra fog vonatkozni. Nem is kellene neki end_date mező. :question: Az interval rule group-nak pontosan mi a szerepük? A name tulajdonság automatikusan jönne létre vagy megadható lenne a szerkesztéskor? (Én az adminban úgy képzeltem el, hogy megadható, és intervalRule-t sem lehet létrehozni group nélkül. De a doksi azt írja, hogy a group automatikusan is létrejöhet, akkor pedig generálódnia kell.) ```= start = request->get('start') end = request->get('end') intervalRules = getRulesByOffer('toronylatogatás-id') intervalDayTime = [] foreach(intervalRules as rule){ intervalDayTime[] = getDayTimesForRule(rule, start, end) /* pl a rule1 esetén [ { start: '2020-05-18 09:00:00', length: 60, quant: 20, group_id: 1 }, { start: '2020-05-18 12:00:00', length: 60, quant: 20, group_id: 1 }, { start: '2020-05-18 15:00:00', length: 60, quant: 20, group_id: 1 }, { start: '2020-05-25 09:00:00', length: 60, quant: 20, group_id: 1 }, { start: '2020-05-25 12:00:00', length: 60, quant: 20, group_id: 1 }, { start: '2020-05-25 15:00:00', length: 60, quant: 20, group_id: 1 }, ] */ } foreach(intervalDayTime as interval){ getFreeQuantityForInterval(interval); } ////////////////////// function getDayTimesForRule(rule, rangeStart, rangeEnd){ intervalDayTime = []; day = rule->startDate; while(day <= rangeEnd){ if(day > rangeStart && day <= rangeEnd){ currentDayStr = day->format('Y-m-d') foreach(rule->intervals as interval){ intervalDayTime[] = [ 'start' => currentDayStr . ' ' . interval['start_time'], 'length' => interval['length'], 'quant' => rule->maxQuant, 'group_id' => rule->group->id, ]; } } day += rule->freq; } return intervalDayTime; } function getFreeQuantityForInterval($interval){ // ide egy kérdés query = " SELECT * FROM reservations WHERE interval_rule_group_id = interval['group_id'] AND start_date_time > interval['start'] AND end_date_time <= interval['start'] + interval['length'] " foreach(results as result){ maxQuant = interval[maxQuant] interval[maxQuant] = max( maxQuant - (result->sold + result->reserved), 0 ); } } ``` :question: a doksi szerint a reservation és az interval start és end időpontjai elég ha részben fedik át egymást. Ez hogy fordulhat elő? A reservation objektumnak az interval alpján kellene létrejönnie, nem? Ugyanazokkal a start és end időpontokkal. ## Jegy foglalás :question: Miután a widget-ben kiválasztottuk a jegyet és az időpontot, a vásárlónak megjelenítjük a checkout form-ot. Ezt megelőzően kellene létrehozni a foglalást, a reservation táblában a bejegyzést, nem a ticket létrehozásakor. A doksi nem írja, de az adatbázis szerkezetben úgy látszik, hogy a cartItem-hez is kapcsolódhat egy reservation bejegyzéshez. ```= reservation = getOrCreateReservation(interval_group, start, end) reservation->reserved += 1 cartItem->setReservation(reservation->id) ``` ## Jegy létrehozás A vásárlási folyamat végén, sikeres fizetés estén hozzuk létre a jegyet. A jegy létrehozás után, a cartItem-hez kapcsolt reservation objektumot frissíteni kell, és a ticket-hez kapcsolni. :question: Az offer-ben szereplő sold/reserved változókat is frissítjük ilyenkor? Vagy ott csak akkor, ha az offer-nek van megadva max quantity? ```= function onTicketCreated(ticket, cartItem){ reservation = getReservationByCartItem(cartItem) reservation->reserved -= 1 reservation->sold += 1 ticket->setReservation(reservation) } ``` ## Kosára archiválás A sikertelen/félbemaradt vásárlások kosarainak archiválásakor törölni kell a cartItem-hez tartozó foglalást is. ```= reservation = getReservationForCartItem(cartItem) reservation->reserved -= 1 ```