This commit is contained in:
507
api/app/Services/Cadastro/OciService.php
Normal file
507
api/app/Services/Cadastro/OciService.php
Normal file
@@ -0,0 +1,507 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Cadastro;
|
||||
|
||||
use App\Enums\Sigtap\ProcedimentoCompatibilidade;
|
||||
use App\Models\Cadastro\Oci;
|
||||
use App\Services\Service;
|
||||
use App\Utils\MaskUtil;
|
||||
use Carbon\Carbon;
|
||||
use DateTimeImmutable;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class OciService extends Service
|
||||
{
|
||||
public static function datatable()
|
||||
{
|
||||
return DB::table('cadastro_oci AS oci')
|
||||
->join('sigtap.procedimento AS procedimento', fn ($j) => $j
|
||||
->on('procedimento.codigo', 'oci.procedimento_codigo')
|
||||
->where('competencia_id', DB::table('sigtap.competencia')->max('id'))
|
||||
)
|
||||
->select(
|
||||
'oci.id',
|
||||
'oci.codigo',
|
||||
'oci.nome',
|
||||
'procedimento.codigo AS procedimento_codigo',
|
||||
'procedimento.nome AS procedimento_nome',
|
||||
'oci.linha_cuidado',
|
||||
DB::raw("0 AS has_vinculos")
|
||||
);
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
switch (request()->listar) {
|
||||
|
||||
case 'procedimentos-compativeis': {
|
||||
|
||||
return [
|
||||
'procedimentos_primarios' => self::getProcedimentosPrimarios(request()->procedimento_codigo),
|
||||
'procedimentos_secundarios' => self::getProcedimentosSecundarios(request()->procedimento_codigo),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function create()
|
||||
{
|
||||
return [
|
||||
'additionals' => self::getAdditionalsData(),
|
||||
'form' => self::getFormData(),
|
||||
'model' => [
|
||||
'codigo' => self::getNovoCodigo(),
|
||||
'nome' => null,
|
||||
'procedimento_codigo' => null,
|
||||
'linha_cuidado' => null,
|
||||
'descricao_geral' => null,
|
||||
'objetivo_assistencial' => null,
|
||||
'ativo' => true,
|
||||
'motivo_inativacao' => null,
|
||||
'etapas_clinicas' => [],
|
||||
'portarias' => [],
|
||||
'procedimentos_primarios' => [],
|
||||
'procedimentos_secundarios' => [],
|
||||
'unidades_executoras' => [],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public static function getNovoCodigo()
|
||||
{
|
||||
return (int) (new DateTimeImmutable())->format('Uu');
|
||||
}
|
||||
|
||||
public static function store()
|
||||
{
|
||||
self::validate();
|
||||
|
||||
$oci = new Oci();
|
||||
|
||||
DB::transaction(function () use ($oci) {
|
||||
|
||||
$oci->fill(self::getOciParams());
|
||||
$oci->save();
|
||||
|
||||
$oci->portarias()->createMany(request()->portarias);
|
||||
$oci->etapasClinicas()->sync(request()->etapas_clinicas);
|
||||
$oci->procedimentosPrimarios()->createMany(request()->procedimentos_primarios);
|
||||
$oci->procedimentosSecundarios()->createMany(request()->procedimentos_secundarios);
|
||||
$oci->unidadesExecutoras()->createMany(request()->unidades_executoras);
|
||||
});
|
||||
|
||||
return $oci->fresh();
|
||||
}
|
||||
|
||||
public static function edit($id)
|
||||
{
|
||||
$oci = Oci::findOrFail($id);
|
||||
|
||||
return [
|
||||
'additionals' => self::getAdditionalsData($oci),
|
||||
'form' => self::getFormData($oci),
|
||||
'model' => [
|
||||
'codigo' => $oci->codigo,
|
||||
'nome' => $oci->nome,
|
||||
'procedimento_codigo' => $oci->procedimento_codigo,
|
||||
'linha_cuidado' => $oci->linha_cuidado,
|
||||
'descricao_geral' => $oci->descricao_geral,
|
||||
'objetivo_assistencial' => $oci->objetivo_assistencial,
|
||||
'ativo' => $oci->ativo,
|
||||
'motivo_inativacao' => $oci->motivo_inativacao,
|
||||
'portarias' => $oci->portarias->map(fn ($portaria) => [
|
||||
'id' => $portaria->id,
|
||||
'descricao' => $portaria->descricao
|
||||
]),
|
||||
'etapas_clinicas' => $oci->etapasClinicas->map(fn ($etapaClinica) => [
|
||||
'etapa_clinica_id' => $etapaClinica->id,
|
||||
'etapa_clinica_nome' => $etapaClinica->nome
|
||||
]),
|
||||
'procedimentos_primarios' => $oci->procedimentosPrimarios->map(fn ($procedimento) => [
|
||||
'procedimento_codigo' => $procedimento->procedimento->codigo,
|
||||
'procedimento_descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo)
|
||||
. " - {$procedimento->procedimento->nome}",
|
||||
'has_vinculos' => false, // TODO:
|
||||
]),
|
||||
'procedimentos_secundarios' => $oci->procedimentosSecundarios->map(fn ($procedimento) => [
|
||||
'procedimento_codigo' => $procedimento->procedimento->codigo,
|
||||
'procedimento_descricao' => MaskUtil::getProcedimentoMasked($procedimento->procedimento->codigo)
|
||||
. " - {$procedimento->procedimento->nome}",
|
||||
'has_vinculos' => false, // TODO:
|
||||
]),
|
||||
'unidades_executoras' => $oci->unidadesExecutoras->map(fn ($unidade) => [
|
||||
'unidade_id' => $unidade->unidade_id,
|
||||
'unidade_nome_fantasia' => $unidade->unidade->nome_fantasia
|
||||
]),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
private static function getAdditionalsData($oci = null)
|
||||
{
|
||||
return [
|
||||
'has_atendimentos_em_andamento' => false, // TODO:
|
||||
];
|
||||
}
|
||||
|
||||
private static function getFormData($oci = null)
|
||||
{
|
||||
return [
|
||||
'procedimentos_principais' => self::getProcedimentosPrincipais(),
|
||||
'etapas_clinicas' => self::getEtapasClinicas(),
|
||||
'procedimentos_primarios' => self::getProcedimentosPrimarios($oci->procedimento_codigo ?? null),
|
||||
'procedimentos_secundarios' => self::getProcedimentosSecundarios($oci->procedimento_codigo ?? null),
|
||||
'unidades' => self::getUnidades(),
|
||||
];
|
||||
}
|
||||
|
||||
private static function getProcedimentosPrincipais()
|
||||
{
|
||||
$procedimentos = DB::table('sigtap.procedimento')
|
||||
->where('competencia_id', DB::table('sigtap.competencia')->max('id'))
|
||||
->where('codigo', 'like', '09%')
|
||||
->select(
|
||||
'codigo',
|
||||
'nome',
|
||||
)
|
||||
->orderByRaw("CONCAT(codigo, ' - ', nome)")
|
||||
->get();
|
||||
|
||||
$procedimentos->each(function ($procedimento) {
|
||||
|
||||
$procedimento->descricao = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
|
||||
|
||||
unset($procedimento->nome);
|
||||
});
|
||||
|
||||
return $procedimentos;
|
||||
}
|
||||
|
||||
private static function getEtapasClinicas()
|
||||
{
|
||||
return DB::table('cadastro_etapa_clinica')
|
||||
->select('id', 'nome')
|
||||
->orderBy('nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getProcedimentosPrimarios($procedimentoOciCodigo = null)
|
||||
{
|
||||
if (is_null($procedimentoOciCodigo)) {
|
||||
|
||||
return collect();
|
||||
}
|
||||
|
||||
$procedimentos = DB::table('sigtap.procedimento AS procedimento')
|
||||
->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id'))
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('sigtap.procedimento_registro AS procedimento_registro')
|
||||
->join(
|
||||
'sigtap.procedimento_compativel AS procedimento_compativel',
|
||||
'procedimento_compativel.procedimento_registro_compativel_id',
|
||||
'procedimento_registro.id'
|
||||
)
|
||||
->join(
|
||||
'sigtap.procedimento_registro AS oci_procedimento_registro',
|
||||
'oci_procedimento_registro.id',
|
||||
'procedimento_compativel.procedimento_registro_principal_id'
|
||||
)
|
||||
->join(
|
||||
'sigtap.procedimento AS oci_procedimento',
|
||||
'oci_procedimento.id',
|
||||
'oci_procedimento_registro.procedimento_id'
|
||||
)
|
||||
->whereColumn('procedimento_registro.procedimento_id', 'procedimento.id')
|
||||
->where('procedimento_compativel.compatibilidade', ProcedimentoCompatibilidade::OBRIGATORIO)
|
||||
->where('oci_procedimento.codigo', $procedimentoOciCodigo)
|
||||
)
|
||||
->select(
|
||||
'procedimento.codigo',
|
||||
'procedimento.nome',
|
||||
)
|
||||
->orderByRaw("CONCAT(procedimento.codigo, ' - ', procedimento.nome)")
|
||||
->get();
|
||||
|
||||
$procedimentos->each(function ($procedimento) {
|
||||
|
||||
$procedimento->descricao = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
|
||||
|
||||
unset($procedimento->nome);
|
||||
});
|
||||
|
||||
return $procedimentos;
|
||||
}
|
||||
|
||||
private static function getProcedimentosSecundarios($procedimentoOciCodigo = null)
|
||||
{
|
||||
if (is_null($procedimentoOciCodigo)) {
|
||||
|
||||
return collect();
|
||||
}
|
||||
|
||||
$procedimentos = DB::table('sigtap.procedimento AS procedimento')
|
||||
->where('procedimento.competencia_id', DB::table('sigtap.competencia')->max('id'))
|
||||
->whereExists(fn ($q) => $q
|
||||
->selectRaw(1)
|
||||
->from('sigtap.procedimento_registro AS procedimento_registro')
|
||||
->join(
|
||||
'sigtap.procedimento_compativel AS procedimento_compativel',
|
||||
'procedimento_compativel.procedimento_registro_compativel_id',
|
||||
'procedimento_registro.id'
|
||||
)
|
||||
->join(
|
||||
'sigtap.procedimento_registro AS oci_procedimento_registro',
|
||||
'oci_procedimento_registro.id',
|
||||
'procedimento_compativel.procedimento_registro_principal_id'
|
||||
)
|
||||
->join(
|
||||
'sigtap.procedimento AS oci_procedimento',
|
||||
'oci_procedimento.id',
|
||||
'oci_procedimento_registro.procedimento_id'
|
||||
)
|
||||
->whereColumn('procedimento_registro.procedimento_id', 'procedimento.id')
|
||||
->where('procedimento_compativel.compatibilidade', ProcedimentoCompatibilidade::COMPATIVEL)
|
||||
->where('oci_procedimento.codigo', $procedimentoOciCodigo)
|
||||
)
|
||||
->select(
|
||||
'procedimento.codigo',
|
||||
'procedimento.nome',
|
||||
)
|
||||
->orderByRaw("CONCAT(procedimento.codigo, ' - ', procedimento.nome)")
|
||||
->get();
|
||||
|
||||
$procedimentos->each(function ($procedimento) {
|
||||
|
||||
$procedimento->descricao = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
|
||||
|
||||
unset($procedimento->nome);
|
||||
});
|
||||
|
||||
return $procedimentos;
|
||||
}
|
||||
|
||||
private static function getUnidades()
|
||||
{
|
||||
return DB::table('cadastro_unidade')
|
||||
->whereNull('deleted_at')
|
||||
->select('id', 'nome_fantasia')
|
||||
->orderBy('nome_fantasia')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function update($id)
|
||||
{
|
||||
$oci = Oci::findOrFail($id);
|
||||
|
||||
self::validate();
|
||||
|
||||
DB::transaction(function () use ($oci) {
|
||||
|
||||
$oci->update(self::getOciParams($oci));
|
||||
$oci->refresh();
|
||||
|
||||
$oci->etapasClinicas()->sync(request()->etapas_clinicas);
|
||||
|
||||
self::savePortarias($oci);
|
||||
self::saveProcedimentosPrimarios($oci);
|
||||
self::saveProcedimentosSecundarios($oci);
|
||||
self::saveUnidadesExecutoras($oci);
|
||||
});
|
||||
|
||||
return $oci->fresh();
|
||||
}
|
||||
|
||||
private static function validate()
|
||||
{
|
||||
return request()->validate([
|
||||
'codigo' => [
|
||||
'required',
|
||||
'digits:16',
|
||||
Rule::unique(Oci::class, 'codigo')->ignore(request()->route('oci')),
|
||||
],
|
||||
'nome' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:80',
|
||||
Rule::unique(Oci::class, 'nome')->ignore(request()->route('oci')),
|
||||
],
|
||||
'procedimento_codigo' => [
|
||||
'required',
|
||||
'string',
|
||||
'digits:10',
|
||||
],
|
||||
'linha_cuidado' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'max:100',
|
||||
],
|
||||
'descricao_geral' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'max:1000',
|
||||
],
|
||||
'objetivo_assistencial' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'max:1000',
|
||||
],
|
||||
'ativo' => [
|
||||
'required',
|
||||
'boolean'
|
||||
],
|
||||
'motivo_inativacao' => [
|
||||
'nullable',
|
||||
'required_if:ativo,false',
|
||||
'string',
|
||||
'max:500',
|
||||
],
|
||||
'etapas_clinicas' => [
|
||||
'required',
|
||||
'array'
|
||||
],
|
||||
'etapas_clinicas.*' => [
|
||||
'required',
|
||||
'integer',
|
||||
'distinct',
|
||||
],
|
||||
'portarias' => [
|
||||
'present',
|
||||
'array',
|
||||
],
|
||||
'portarias.*.descricao' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:100',
|
||||
'distinct',
|
||||
],
|
||||
'procedimentos_primarios' => [
|
||||
'present',
|
||||
'array'
|
||||
],
|
||||
'procedimentos_primarios.*.procedimento_codigo' => [
|
||||
'required',
|
||||
'string',
|
||||
'digits:10'
|
||||
],
|
||||
'procedimentos_secundarios' => [
|
||||
'present',
|
||||
'array'
|
||||
],
|
||||
'procedimentos_secundarios.*.procedimento_codigo' => [
|
||||
'required',
|
||||
'string',
|
||||
'digits:10'
|
||||
],
|
||||
'unidades_executoras' => [
|
||||
'required',
|
||||
'array'
|
||||
],
|
||||
'unidades_executoras.*.unidade_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'distinct',
|
||||
],
|
||||
], [
|
||||
'codigo.unique' => 'O código da OCI já foi inserido anteriormente.',
|
||||
'nome.unique' => 'O nome da OCI já foi inserido anteriormente.',
|
||||
]);
|
||||
}
|
||||
|
||||
private static function getOciParams($oci = null)
|
||||
{
|
||||
$params = [
|
||||
'nome' => request()->nome,
|
||||
'linha_cuidado' => request()->linha_cuidado,
|
||||
'descricao_geral' => request()->descricao_geral,
|
||||
'objetivo_assistencial' => request()->objetivo_assistencial,
|
||||
'ativo' => request()->ativo,
|
||||
];
|
||||
|
||||
if (request()->ativo) {
|
||||
|
||||
$params['motivo_inativacao'] = null;
|
||||
$params['inativado_em'] = null;
|
||||
$params['inativacao_lotacao_id'] = null;
|
||||
}
|
||||
else {
|
||||
|
||||
$params['motivo_inativacao'] = request()->motivo_inativacao;
|
||||
$params['inativado_em'] = Carbon::now();
|
||||
$params['inativacao_lotacao_id'] = self::getCurrentLotacao()->id;
|
||||
}
|
||||
|
||||
if (is_null($oci)) {
|
||||
|
||||
$params['codigo'] = request()->codigo;
|
||||
$params['procedimento_codigo'] = request()->procedimento_codigo;
|
||||
}
|
||||
else if (!self::ociHasVinculos($oci)) {
|
||||
|
||||
$params['procedimento_codigo'] = request()->procedimento_codigo;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
private static function ociHasVinculos($oci)
|
||||
{
|
||||
// TODO:
|
||||
return false;
|
||||
}
|
||||
|
||||
private static function savePortarias($oci)
|
||||
{
|
||||
$oci->portarias()->whereNotIn('id', collect(request()->portarias)->pluck('id')->filter())->delete();
|
||||
|
||||
collect(request()->portarias)->each(function ($portaria) use ($oci) {
|
||||
|
||||
$oci->portarias()->updateOrCreate(
|
||||
['id' => $portaria['id']],
|
||||
$portaria
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
private static function saveProcedimentosPrimarios($oci)
|
||||
{
|
||||
$oci->procedimentosPrimarios()
|
||||
->whereNotIn('procedimento_codigo', collect(request()->procedimentos_primarios)->pluck('procedimento_codigo'))
|
||||
->delete();
|
||||
|
||||
collect(request()->procedimentos_primarios)->each(function ($procedimento) use ($oci) {
|
||||
|
||||
$oci->procedimentosPrimarios()->updateOrCreate(['procedimento_codigo' => $procedimento['procedimento_codigo']]);
|
||||
});
|
||||
}
|
||||
|
||||
private static function saveProcedimentosSecundarios($oci)
|
||||
{
|
||||
$oci->procedimentosSecundarios()
|
||||
->whereNotIn('procedimento_codigo', collect(request()->procedimentos_secundarios)->pluck('procedimento_codigo'))
|
||||
->delete();
|
||||
|
||||
collect(request()->procedimentos_secundarios)->each(function ($procedimento) use ($oci) {
|
||||
|
||||
$oci->procedimentosSecundarios()->updateOrCreate(['procedimento_codigo' => $procedimento['procedimento_codigo']]);
|
||||
});
|
||||
}
|
||||
|
||||
private static function saveUnidadesExecutoras($oci)
|
||||
{
|
||||
$oci->unidadesExecutoras()
|
||||
->whereNotIn('unidade_id', collect(request()->unidades_executoras)->pluck('unidade_id'))
|
||||
->delete();
|
||||
|
||||
collect(request()->unidades_executoras)->each(function ($unidadeExecutora) use ($oci) {
|
||||
|
||||
$oci->unidadesExecutoras()->updateOrCreate(['unidade_id' => $unidadeExecutora['unidade_id']]);
|
||||
});
|
||||
}
|
||||
|
||||
public static function destroy($id)
|
||||
{
|
||||
Oci::findOrFail($id)->delete();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user