# 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
```