---
# System prepended metadata

title: Idő intervallumok - jegyeladáskor

---


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