File: /var/www/api_matriculas/app/Services/PeriodService.php
<?php
namespace App\Services;
use App\Http\Resources\PeriodResource;
use App\Repositories\PeriodRepository;
use Exception;
class PeriodService
{
protected $periodRepository;
public function __construct(PeriodRepository $periodRepository)
{
$this->periodRepository = $periodRepository;
}
public function list($allData = true)
{
$registers = $this->periodRepository->getAll();
if ($registers->count() < 1) {
return [];
}
return $registers->map(fn($row) => new PeriodResource($row, $allData));
}
public function store($request)
{
$validateField = $this->periodRepository->getByYear($request->period_year);
if ($validateField) {
throw new Exception("Ya existe un periodo para ese año", 409);
}
$register = $this->periodRepository->create((object)$request);
if (!$register) {
throw new Exception("Ocurrió un problema al registrar el periodo", 500);
}
return $this->show($register->id, false);
}
public function update($request, $id)
{
$register = $this->show($id, true);
if ($request->has('period_year')) {
$validateField = $this->periodRepository->getByYear($request->period_year, $id);
if ($validateField) {
throw new Exception("Ya existe un periodo para ese año", 409);
}
}
$updated = $this->periodRepository->update($register, $request);
if (!$updated) {
throw new Exception("Ocurrió un problema al actualizar el periodo", 500);
}
return $updated;
}
public function show($id, $allData = false)
{
$register = $this->periodRepository->getById($id);
if (!$register) {
throw new Exception("Periodo no existe o fue eliminado", 400);
}
return $allData ? $register : (object)(new PeriodResource($register))->resolve();
}
public function delete($id)
{
$register = $this->show($id, true);
$register->deleted = 1;
$register->deleted_at = now();
$register->user_deleted = auth()->id();
if (!$register->save()) {
throw new Exception("Ocurrió un problema al eliminar el periodo", 500);
}
return true;
}
public function activate($id)
{
$period = $this->periodRepository->activate($id);
return (object)[
'message' => "Periodo {$period->period} activado correctamente.",
'period' => $period
];
}
public function deactivate($id)
{
$period = $this->periodRepository->deactivate($id);
return (object)[
'message' => "Periodo {$period->period} desactivado correctamente.",
'period' => $period
];
}
public function getPeriodActivate()
{
$data = $this->periodRepository->getActive();
return $this->formatPeriodData($data);
}
public function getPeriodDataById($id)
{
$data = $this->periodRepository->getById($id);
return $this->formatPeriodData($data);
}
private function formatPeriodData($data)
{
if (empty($data)) {
return null;
}
return [
'id' => $data->id,
'period_year' => $data->period_year,
'period' => $data->period,
'start_date' => $data->start_date,
'end_date' => $data->end_date,
'status' => $data->status,
'finished' => $data->finished,
'segments' => $data->enrollmentPeriods->map(fn($seg) => [
'id' => $seg->id,
'description' => $seg->description,
'start_date' => $seg->start_date,
'end_date' => $seg->end_date,
'status' => $seg->status,
])
];
}
public function getPeriodsForParent()
{
$parentId = auth()->user()->parent->id ?? 0;
$periods = $this->periodRepository->getPeriodsForParent($parentId);
if ($periods->count() < 1) {
return [];
}
return $periods->map(fn($row) => new PeriodResource($row));
}
}