Files
rkm-conectasus-ci-sandbox/api/app/Services/TransportePaciente/Parametrizacao/ParametrizacaoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

258 lines
11 KiB
PHP

<?php
namespace App\Services\TransportePaciente\Parametrizacao;
use App\Enums\Sigtap\Procedimento;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\TransportePaciente\Faturamento\Faturamento as FaturamentoBpa;
use App\Models\TransportePaciente\Parametrizacao\Faturamento;
use App\Models\TransportePaciente\Parametrizacao\Parametrizacao;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class ParametrizacaoService extends Service
{
private static function getFormData()
{
$now = Carbon::now();
return [
'data_atual' => $now->format('d/m/Y'),
'unidades' => Unidade::whereRaw('LENGTH(cnes) = 7')
->orderBy('nome_fantasia')
->get()
->map(fn ($query) => [
'id' => $query->id,
'nome_fantasia' => $query->cnes . ' - ' . $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
]),
];
}
private static function getModelData($parametrizacao = null)
{
$parametrizacao = [
'id' => $parametrizacao->id ?? null,
'faltas' => $parametrizacao->faltas ?? null,
'periodo' => $parametrizacao->periodo ?? null,
'agendar_transporte_jornada' => $parametrizacao->agendar_transporte_jornada ?? null,
'veiculo' => $parametrizacao->veiculo ?? null,
'comprovante_acompanhante' => $parametrizacao->comprovante_acompanhante ?? null,
'dados_acompanhante' => $parametrizacao->dados_acompanhante ?? null,
'campo_livre' => $parametrizacao->campo_livre ?? null,
'exibir_observacao_paciente' => $parametrizacao->exibir_observacao_paciente ?? null,
'exibir_observacao_transporte' => $parametrizacao->exibir_observacao_transporte ?? null,
'horario_saida' => $parametrizacao->horario_saida ?? null,
'mensagem_protocolo' => $parametrizacao->mensagem_protocolo ?? null,
'faturamento' => $parametrizacao->faturamento ?? null,
'auxilio_alimentacao' => $parametrizacao->auxilio_alimentacao ?? null,
'faturamentos' => Faturamento::get()
->map(fn ($query) => [
'id' => $query->id,
'unidade_id' => $query->unidade_id,
'unidade_nome' => $query->unidade->cnes . ' - ' . $query->unidade->nome_fantasia,
'infraestrutura_id' => $query->infraestrutura_id,
'infraestrutura_nome' => $query->infraestrutura->nome,
'usuario_id' => $query->usuario_id,
'usuario_nome' => $query->usuario->cidadao->cns . ' - ' . $query->usuario->nome,
'ocupacao_id' => $query->ocupacao_id,
'ocupacao_codigo_nome' => $query->ocupacao->codigo_nome,
]),
'bpa_faturamento' => FaturamentoBpa::get()
->map(fn ($bpa) =>[
'id' => $bpa->id,
'unidade_id' =>$bpa->lotacao_id,
])
];
return $parametrizacao;
}
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(self::show()),
];
}
public static function show()
{
return Parametrizacao::first();
}
public static function store()
{
DB::transaction(function () {
self::saveGeral();
self::saveFaturamento();
});
return response()->json(null, Response::HTTP_OK);
}
private static function saveGeral()
{
$geral = Parametrizacao::first() ?? new Parametrizacao();
$data = request()->geral;
$data['exibir_observacao_transporte'] = $data['exibir_observacao_transporte'] ?? 0;
$geral->fill($data);
$geral->save();
}
private static function saveFaturamento()
{
$ids = [];
foreach (request()->faturamento as $params) {
$faturamento = Faturamento::where('unidade_id', $params['unidade_id'])
->where('infraestrutura_id', $params['infraestrutura_id'])
->where('usuario_id', $params['usuario_id'])
->first() ?? new Faturamento();
$faturamento->fill($params);
$faturamento->save();
$ids[] = $faturamento->id;
}
Faturamento::destroy(Faturamento::whereNotIn('id', $ids)->pluck('id'));
}
public static function lotacoes()
{
$usuario = Usuario::findOrFail(request()->usuario_id);
$lotacoes = $usuario->lotacoesAtivas()
->where('cadastro_lotacao.infraestrutura_id', request()->query('infraestrutura_id'))
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('sigtap.procedimento_ocupacao')
->join('sigtap.procedimento', 'sigtap.procedimento.id', 'sigtap.procedimento_ocupacao.procedimento_id')
->whereColumn('sigtap.procedimento_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->where('sigtap.procedimento_ocupacao.competencia_id', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderBy('id')
->limit(1);
})
->where(function ($query) {
if (request()->auxilio_alimentar) {
$query->whereIn(
'sigtap.procedimento.codigo',
[
Procedimento::AJUDA_DE_CUSTO_PARA_ALIMENTACAO_DE_PACIENTE_SEM_PERNOITE,
Procedimento::AJUDA_DE_CUSTO_PARA_ALIMENTACAO_DE_PACIENTE_SEM_PERNOITE
]
);
} else {
$query->whereIn(
'sigtap.procedimento.codigo',
[
Procedimento::UNIDADE_DE_REMUNERACAO_PARA_DESLOCAMENTO_DE_PACIENTE_POR_TRANSPORTE_TERRESTRE,
Procedimento::UNIDADE_DE_REMUNERACAO_PARA_DESLOCAMENTO_DE_ACOMPANHANTE_POR_TRANSPORTE_TERRESTRE
]
);
}
});
})
->with(['infraestrutura.unidade'])
->get();
return [
'lotacoes' => $lotacoes->map(fn ($lotacao) => [
'id' => $lotacao->id,
'unidade_id' => $lotacao->infraestrutura->unidade_id,
'unidade_nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
'infraestrutura_id' => $lotacao->infraestrutura_id,
'infraestrutura_nome' => $lotacao->infraestrutura->nome,
'ocupacao' => $lotacao->ocupacao,
]),
];
}
public static function autocomplete()
{
$usuarios = DB::table('cadastro_usuario')
->select([
'cadastro_usuario.id',
DB::raw('CONCAT(cadastro_cidadao.cns, " - " ,cadastro_cidadao.nome) as cidadao_nome'),
'cadastro_cidadao.cns AS cidadao_cns',
'cadastro_cidadao.cpf AS cidadao_cpf',
'cadastro_usuario.registro_numero',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->when(request()->query('infraestrutura_id'), function($query) {
$query->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('cadastro_lotacao')
->where('cadastro_lotacao.infraestrutura_id', request()->query('infraestrutura_id'))
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('sigtap.procedimento_ocupacao')
->join('sigtap.procedimento', 'sigtap.procedimento.id', 'sigtap.procedimento_ocupacao.procedimento_id')
->whereColumn('sigtap.procedimento_ocupacao.ocupacao_id', 'cadastro_lotacao.ocupacao_id')
->where('sigtap.procedimento_ocupacao.competencia_id', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderBy('id')
->limit(1);
})
->where(function ($query) {
if (request()->auxilio_alimentar) {
$query->whereExists(function ($subquery) {
$subquery->select(DB::raw(1))
->from('sigtap.procedimento')
->whereIn('sigtap.procedimento.codigo', [
Procedimento::AJUDA_DE_CUSTO_PARA_ALIMENTACAO_DE_PACIENTE_SEM_PERNOITE,
Procedimento::AJUDA_DE_CUSTO_PARA_ALIMENTACAO_DE_ACOMPANHANTE_SEM_PERNOITE
]);
});
} else {
$query->whereExists(function ($subquery) {
$subquery->select(DB::raw(1))
->from('sigtap.procedimento')
->whereIn('sigtap.procedimento.codigo', [
Procedimento::UNIDADE_DE_REMUNERACAO_PARA_DESLOCAMENTO_DE_PACIENTE_POR_TRANSPORTE_TERRESTRE,
Procedimento::UNIDADE_DE_REMUNERACAO_PARA_DESLOCAMENTO_DE_ACOMPANHANTE_POR_TRANSPORTE_TERRESTRE
]);
});
}
});
})
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id');
});
})
->whereNull('cadastro_usuario.deleted_at')
->where('cadastro_usuario.bloqueado', '=', '0');
if (!DataUtil::isStringTrue(request()->query('with_not_regularized'))) {
$usuarios->whereNotNull('cadastro_cidadao.cns');
}
return $usuarios;
}
}