reservationRepository->fetchAll($order)); } catch (Implement\Exception\EmptyResult) { return []; } } public function getByProject(int $project_id): array { try { return array_map([$this, 'process'], $this->reservationRepository->fetchByProject($project_id)); } catch (Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Read(__CLASS__, $exception); } } public function get(int $id): Model\Venta\Reservation { try { return $this->process($this->reservationRepository->fetchById($id)); } catch (Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Read(__CLASS__, $exception); } } /** * @param int $project_id * @return array * @throws ServiceAction\Read */ public function getActive(int $project_id): array { try { return array_map([$this, 'process'], $this->reservationRepository->fetchActive($project_id)); } catch (Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Read(__CLASS__, $exception); } } /** * @param int $project_id * @return array * @throws ServiceAction\Read */ public function getPending(int $project_id): array { try { return array_map([$this, 'process'], $this->reservationRepository->fetchPending($project_id)); } catch (Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Read(__CLASS__, $exception); } } /** * @param int $project_id * @return array * @throws ServiceAction\Read */ public function getRejected(int $project_id): array { try { return array_map([$this, 'process'], $this->reservationRepository->fetchRejected($project_id)); } catch (Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Read(__CLASS__, $exception); } } public function add(array $data): Model\Venta\Reservation { try { $date = new DateTimeImmutable(); try { $date = new DateTimeImmutable($data['date']); } catch (DateMalformedStringException) {} return $this->process($this->reservationRepository->fetchByBuyerAndDate($data['buyer_rut'], $date)); } catch (Implement\Exception\EmptyResult) {} try { $reservationData = $this->reservationRepository->filterData($data); $reservation = $this->reservationRepository->create($reservationData); $this->reservationRepository->save($reservation); return $this->process($reservation); } catch (PDOException $exception) { throw new ServiceAction\Create(__CLASS__, $exception); } } public function edit(Define\Model $model, array $new_data): Model\Venta\Reservation { try { return $this->process($this->reservationRepository->edit($model, $new_data)); } catch (PDOException | Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Update(__CLASS__, $exception); } } public function delete(int $id): Model\Venta\Reservation { try { $reservation = $this->reservationRepository->fetchById($id); $this->reservationRepository->remove($reservation); return $reservation; } catch (PDOException | Implement\Exception\EmptyResult $exception) { throw new ServiceAction\Delete(__CLASS__, $exception); } } protected function process(Define\Model $model): Model\Venta\Reservation { $model->addFactory('states', new Implement\Repository\Factory() ->setArgs(['reservation_id' => $model->id]) ->setCallable(function(int $reservation_id) { return $this->stateRepository->fetchByReservation($reservation_id); }) ); return $model; } }