119 lines
3.3 KiB
PHP
119 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services\WebService\Almoxarifado\Cliente;
|
|
|
|
use App\Exceptions\WebService\Almoxarifado\Cliente\PeriodoContabil\ConflictException;
|
|
use App\Exceptions\WebService\Almoxarifado\Cliente\PeriodoContabil\InvalidDaysLimitException;
|
|
use App\Exceptions\WebService\Almoxarifado\Cliente\PeriodoContabil\PeriodoContabilNotFoundException;
|
|
use App\Models\WebService\Almoxarifado\Cliente\PeriodoContabil;
|
|
use App\Services\Service;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class PeriodoContabilService extends Service
|
|
{
|
|
public const LIMITE_DIAS_PERIODO = 31;
|
|
|
|
public static function index()
|
|
{
|
|
return DB::table('web_service_almoxarifado_cliente_periodo_contabil AS periodo_contabil')
|
|
->select([
|
|
'periodo_contabil.id',
|
|
'periodo_contabil.inicio',
|
|
'periodo_contabil.fim',
|
|
])
|
|
->orderBy('periodo_contabil.inicio')
|
|
->orderBy('periodo_contabil.fim')
|
|
->get();
|
|
}
|
|
|
|
public static function create()
|
|
{
|
|
return [
|
|
'model' => [
|
|
'periodo_contabil' => ['start' => null, 'end' => null],
|
|
],
|
|
];
|
|
}
|
|
|
|
public static function store($request)
|
|
{
|
|
self::validate($request);
|
|
|
|
return PeriodoContabil::create(self::getPeriodoContabilData($request))->fresh();
|
|
}
|
|
|
|
public static function show($id)
|
|
{
|
|
return self::getPeriodoContabilModel($id);
|
|
}
|
|
|
|
private static function getPeriodoContabilData($request)
|
|
{
|
|
return [
|
|
'inicio' => $request->inicio,
|
|
'fim' => $request->fim,
|
|
];
|
|
}
|
|
|
|
public static function destroy($id)
|
|
{
|
|
self::getPeriodoContabilModel($id)->delete();
|
|
}
|
|
|
|
public static function datatable()
|
|
{
|
|
return DB::table('web_service_almoxarifado_cliente_periodo_contabil AS periodo_contabil')
|
|
->select([
|
|
'periodo_contabil.id',
|
|
DB::raw("DATE_FORMAT(periodo_contabil.inicio, '%d/%m/%Y') AS inicio"),
|
|
DB::raw("DATE_FORMAT(periodo_contabil.fim, '%d/%m/%Y') AS fim"),
|
|
]);
|
|
}
|
|
|
|
private static function validate($request)
|
|
{
|
|
$request->validate([
|
|
'inicio' => [
|
|
'required',
|
|
'date_format:Y-m-d',
|
|
'before_or_equal:fim',
|
|
],
|
|
'fim' => [
|
|
'required',
|
|
'date_format:Y-m-d',
|
|
'after_or_equal:inicio',
|
|
],
|
|
]);
|
|
|
|
$inicio = Carbon::create($request->inicio);
|
|
$fim = Carbon::create($request->fim);
|
|
|
|
if ($inicio->diff($fim)->days > self::LIMITE_DIAS_PERIODO) {
|
|
|
|
throw new InvalidDaysLimitException();
|
|
}
|
|
|
|
$periodoContabilConflitante = PeriodoContabil::whereBetween('inicio', [$request->inicio, $request->fim])
|
|
->orWhereBetween('fim', [$request->inicio, $request->fim])
|
|
->exists();
|
|
|
|
if ($periodoContabilConflitante) {
|
|
|
|
throw new ConflictException();
|
|
}
|
|
}
|
|
|
|
private static function getPeriodoContabilModel($id)
|
|
{
|
|
$periodoContabil = PeriodoContabil::find($id);
|
|
|
|
if (is_null($periodoContabil)) {
|
|
|
|
throw new PeriodoContabilNotFoundException();
|
|
}
|
|
|
|
return $periodoContabil;
|
|
}
|
|
}
|