229 lines
6.2 KiB
PHP
229 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Manutencao;
|
|
|
|
use App\Models\Manutencao\Prioridade;
|
|
use App\Models\Manutencao\PrioridadeTipo;
|
|
use App\Models\Manutencao\Sla;
|
|
use App\Models\Manutencao\Status;
|
|
use App\Models\Manutencao\StatusTipo;
|
|
use App\Services\Service;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
use App\Models\Cadastro\ServicoManutencao;
|
|
use App\Models\Manutencao\SolicitacaoStatusHistorico;
|
|
|
|
class ParametrizacaoService extends Service
|
|
{
|
|
public static function create()
|
|
{
|
|
return [
|
|
'form' => self::getFormData(),
|
|
'model' => self::getModelData(),
|
|
];
|
|
}
|
|
|
|
private static function getFormData()
|
|
{
|
|
|
|
return [
|
|
'status_tipo' => StatusTipo::all(),
|
|
'prioridade_tipo' => PrioridadeTipo::all(),
|
|
'prioridades' => Prioridade::select('id', 'nome')->get(),
|
|
];
|
|
|
|
}
|
|
|
|
private static function getModelData()
|
|
{
|
|
return [
|
|
'status' => Status::all()->map(fn ($status) => [
|
|
'id' => $status->id,
|
|
'tipo_status_id' => $status->tipo_id,
|
|
'tipo_status_nome' => $status->statusTipo->nome,
|
|
'nome_status' => $status->nome,
|
|
'allow_destroy' => SolicitacaoStatusHistorico::where('status_id', $status->id)->exists(),
|
|
]),
|
|
'prioridade' => Prioridade::all()->map(fn ($prioridade) => [
|
|
'id' => $prioridade->id,
|
|
'tipo_prioridade_id' => $prioridade->tipo_id,
|
|
'tipo_prioridade_nome' => $prioridade->prioridadeTipo->nome,
|
|
'nome_prioridade' => $prioridade->nome,
|
|
'allow_destroy' => ServicoManutencao::where('prioridade_id', $prioridade->id)->exists(),
|
|
]),
|
|
'sla' => Sla::all()->map(fn ($sla) => [
|
|
'id' => $sla->id,
|
|
'prioridade_id' => $sla->prioridade_id,
|
|
'prioridade_nome' => $sla->prioridade->nome,
|
|
'tempo_de_atendimento' => $sla->tempo_atendimento,
|
|
'allow_destroy' => TRUE,
|
|
]),
|
|
];
|
|
|
|
}
|
|
|
|
public static function store()
|
|
{
|
|
self::validate();
|
|
|
|
$status = collect(request()->status);
|
|
$prioridade = collect(request()->prioridade);
|
|
$sla = collect(request()->sla);
|
|
|
|
DB::beginTransaction();
|
|
|
|
try {
|
|
|
|
$statusParams = self::saveStatus($status);
|
|
$slaParams = self::saveSla($sla);
|
|
$prioridadeParams = self::savePrioridade($prioridade);
|
|
|
|
DB::commit();
|
|
|
|
return [
|
|
'status' => $statusParams,
|
|
'prioridade' => $prioridadeParams,
|
|
'sla' => $slaParams,
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
private static function saveStatus($status)
|
|
{
|
|
$statusIds = $status->pluck('id');
|
|
|
|
$status->each(function ($status) {
|
|
Status::updateOrCreate(
|
|
[
|
|
'id' => $status['id'],
|
|
],
|
|
[
|
|
'tipo_id' => $status['tipo_status_id'],
|
|
'nome' => $status['nome_status'],
|
|
]
|
|
);
|
|
});
|
|
|
|
Status::whereNotIn('id', $statusIds)->delete();
|
|
|
|
return $status->pluck('id');
|
|
}
|
|
|
|
private static function savePrioridade($prioridade)
|
|
{
|
|
$prioridadeIds = $prioridade->pluck('id');
|
|
|
|
$prioridade->each(function ($prioridade) {
|
|
Prioridade::updateOrCreate(
|
|
[
|
|
'id' => $prioridade['id'],
|
|
],
|
|
[
|
|
'tipo_id' => $prioridade['tipo_prioridade_id'],
|
|
'nome' => $prioridade['nome_prioridade'],
|
|
]
|
|
);
|
|
});
|
|
|
|
Prioridade::whereNotIn('id', $prioridadeIds)->delete();
|
|
|
|
return $prioridade->pluck('id');
|
|
}
|
|
|
|
private static function saveSla($sla)
|
|
{
|
|
$slaIds = $sla->pluck('id');
|
|
|
|
$sla->each(function ($sla) {
|
|
Sla::updateOrCreate(
|
|
[
|
|
'id' => $sla['id'],
|
|
],
|
|
[
|
|
'prioridade_id' => $sla['prioridade_id'],
|
|
'tempo_atendimento' => $sla['tempo_de_atendimento'],
|
|
]
|
|
);
|
|
});
|
|
|
|
Sla::whereNotIn('id', $slaIds)->delete();
|
|
|
|
return $sla->pluck('id');
|
|
}
|
|
|
|
private static function validate()
|
|
{
|
|
|
|
self::getStatusValidations();
|
|
self::getSlaValidations();
|
|
self::getPrioridadeValidations();
|
|
}
|
|
|
|
private static function getStatusValidations()
|
|
{
|
|
|
|
request()->validate([
|
|
'status' => [
|
|
'present',
|
|
'array',
|
|
],
|
|
'status.*.tipo_status_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(StatusTipo::class, 'id'),
|
|
],
|
|
'status.*.nome_status' => [
|
|
'required',
|
|
'string',
|
|
'max:100',
|
|
'min:3',
|
|
],
|
|
]);
|
|
}
|
|
|
|
private static function getSlaValidations()
|
|
{
|
|
request()->validate([
|
|
'sla' => [
|
|
'present',
|
|
'array',
|
|
],
|
|
'sla.*.prioridade_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(Prioridade::class, 'id'),
|
|
],
|
|
'sla.*.tempo_de_atendimento' => [
|
|
'required',
|
|
'string',
|
|
'min:5',
|
|
'max:6',
|
|
],
|
|
]);
|
|
}
|
|
|
|
private static function getPrioridadeValidations()
|
|
{
|
|
request()->validate([
|
|
'prioridade' => [
|
|
'present',
|
|
'array',
|
|
],
|
|
'prioridade.*.tipo_prioridade_id' => [
|
|
'required',
|
|
'integer',
|
|
Rule::exists(PrioridadeTipo::class, 'id'),
|
|
],
|
|
'prioridade.*.nome_prioridade' => [
|
|
'required',
|
|
'string',
|
|
'max:100',
|
|
'min:3',
|
|
],
|
|
]);
|
|
}
|
|
}
|