init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,336 @@
<?php
namespace App\Services\Cadastro;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\Vacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class VacinaService extends Service
{
public static function getDescricaoRaw($tableAlias = 'vacina')
{
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO: {
return "{$tableAlias}.nome";
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
return "{$tableAlias}.abreviacao";
}
case ParametrizacaoDescricaoVacina::SIGLA: {
return "{$tableAlias}.sigla";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.nome)";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.abreviacao)";
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
return "CONCAT({$tableAlias}.abreviacao, ' - ', {$tableAlias}.nome)";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.abreviacao, ' - ', {$tableAlias}.nome)";
}
default: {
return "{$tableAlias}.nome";
}
}
}
public static function getDescricao($vacinaModel)
{
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO: {
return $vacinaModel->nome;
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
return $vacinaModel->abreviacao;
}
case ParametrizacaoDescricaoVacina::SIGLA: {
return $vacinaModel->sigla;
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
return "{$vacinaModel->sigla} - {$vacinaModel->nome}";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
return "{$vacinaModel->sigla} - {$vacinaModel->abreviacao}";
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
return "{$vacinaModel->abreviacao} - {$vacinaModel->nome}";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
return "{$vacinaModel->sigla} - {$vacinaModel->abreviacao} - {$vacinaModel->nome}";
}
default: {
return $vacinaModel->nome;
}
}
}
public static function create()
{
return [
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
return Vacina::create($request->all())->fresh();
}
public static function show($id)
{
return Vacina::find($id);
}
public static function edit($id)
{
return [
'model' => self::getModelData($id),
];
}
public static function update($request, $id)
{
self::validate($request);
return self::show($id)->update($request->all());
}
public static function destroy($id)
{
return self::show($id)->delete();
}
public static function datatable()
{
return DB::table('cadastro_vacina')
->select([
'id',
'codigo',
'nome',
'abreviacao',
'sigla',
DB::raw("CASE WHEN calendario THEN 'Sim' ELSE 'Não' END AS calendario"),
]);
}
public static function autocomplete()
{
$vacinas = DB::table('cadastro_vacina')
->select([
'id',
'codigo',
'nome',
'abreviacao',
'sigla',
]);
if (request('distribuicao')) {
$vacinas = DB::table('cadastro_vacina')
->select([
'cadastro_vacina.id',
'cadastro_vacina.codigo',
'cadastro_vacina.nome',
'cadastro_vacina.abreviacao',
'cadastro_vacina.sigla',
'imunizacao_entrada_vacina.lote',
'imunizacao_produtor.nome AS produtor_nome',
'imunizacao_apresentacao.nome AS apresentacao'
])
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.vacina_id', 'cadastro_vacina.id')
->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id')
->leftJoin('imunizacao_apresentacao', 'imunizacao_apresentacao.id', 'imunizacao_entrada_vacina.apresentacao_id')
->join('imunizacao_entrada', 'imunizacao_entrada_vacina.entrada_id', 'imunizacao_entrada.id')
->where('imunizacao_entrada.sala_vacinacao_id', request()->get('sala_vacinacao_id'))
->groupBy([
'cadastro_vacina.id',
'cadastro_vacina.codigo',
'cadastro_vacina.nome',
'cadastro_vacina.abreviacao',
'cadastro_vacina.sigla',
'imunizacao_entrada_vacina.lote',
'imunizacao_produtor.nome',
'imunizacao_apresentacao.nome'
])
->havingRaw('
SUM(
imunizacao_entrada_vacina.quantidade -
COALESCE((
SELECT SUM(isv.quantidade)
FROM imunizacao_saida_vacina AS isv
WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id
), 0)
) > 0
');
}
if(request()->has('registro')) {
if (request()->has('usar_esquema_vacinal') && DataUtil::isStringTrue(request()->usar_esquema_vacinal)) {
$dataNascimento = Paciente::findOrFail(request()->paciente_id)->cidadao->data_nascimento;
if (is_null($dataNascimento)) {
$vacinas->whereRaw('1 = 0');
}
$dataRegistro = Carbon::createFromFormat('d/m/Y', request()->data_registro);
$idade = $dataNascimento->diff($dataRegistro);
$vacinas->whereExists(function ($query) use ($idade) {
$query->select(DB::raw(1))
->from('imunizacao_esquema_vacinal_regra as regra')
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
->whereColumn('regra.vacina_id', 'cadastro_vacina.id')
->where(fn ($q) => $q
->where(fn ($q) => $q
->where('faixa_etaria.inicio_ano', '<', $idade->y)
->orWhere(fn ($q) => $q
->where('faixa_etaria.inicio_ano', '=', $idade->y)
->where('faixa_etaria.inicio_mes', '<', $idade->m)
)
->orWhere(fn ($q) => $q
->where('faixa_etaria.inicio_ano', '=', $idade->y)
->where('faixa_etaria.inicio_mes', '=', $idade->m)
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
)
)
->where(fn ($q) => $q
->where('faixa_etaria.fim_ano', '>', $idade->y)
->orWhere(fn ($q) => $q
->where('faixa_etaria.fim_ano', '=', $idade->y)
->where('faixa_etaria.fim_mes', '>', $idade->m)
)
->orWhere(fn ($q) => $q
->where('faixa_etaria.fim_ano', '=', $idade->y)
->where('faixa_etaria.fim_mes', '=', $idade->m)
->where('faixa_etaria.fim_dia', '>=', $idade->d)
)
)
);
});
}
else {
$vacinas->whereExists(function($query) {
$query->select(DB::raw(1))
->from('atencao_basica_vacinacao_regra')
->when((isset(request()->origem) && request()->origem === 'aplicacao'), fn ($q) => $q->where('exibe_aplicacao', true))
->when((isset(request()->origem) && request()->origem === 'atualizacao'), fn ($q) => $q->where('exibe_atualizacao', true))
->when((isset(request()->origem) && request()->origem === 'aprazamento'), fn ($q) => $q->where('exibe_aprazamento', true))
->whereColumn('atencao_basica_vacinacao_regra.codigo', 'cadastro_vacina.codigo');
});
}
}
if(request()->has('cria_ficha_ab')) {
$vacinas->whereNotNull('codigo');
}
/*if (request()->has('sala_vacinacao_id') && request()->has('possui_saldo_estoque')) {
$vacinas->whereRaw('
(
SELECT SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
SELECT SUM(imunizacao_saida_vacina.quantidade)
FROM imunizacao_saida_vacina
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
), 0))
FROM imunizacao_entrada_vacina
INNER JOIN imunizacao_entrada
ON imunizacao_entrada.id = imunizacao_entrada_vacina.entrada_id
WHERE imunizacao_entrada.sala_vacinacao_id = ' . request()->get('sala_vacinacao_id') . '
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
) > 0
');
}*/
return $vacinas;
}
private static function validate($request)
{
return $request->validate([
'nome' => [
'required',
'string',
'between:3,300',
Rule::unique('cadastro_vacina')->ignore($request->vacina),
],
'abreviacao' => [
'required',
'string',
'between:1,100',
],
'sigla' => [
'required',
'string',
'between:1,100',
],
'calendario' => [
'required',
'boolean',
],
]);
}
private static function getModelData($id = null)
{
$vacina = self::show($id);
return [
'id' => $vacina->id ?? null,
'codigo' => $vacina->codigo ?? null,
'nome' => $vacina->nome ?? null,
'abreviacao' => $vacina->abreviacao ?? null,
'sigla' => $vacina->sigla ?? null,
'calendario' => $vacina->calendario ?? false,
];
}
public static function getPaciente($id)
{
$paciente = DB::table('cadastro_paciente')
->select([
'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereNull('cadastro_paciente.deleted_at')
->where('cadastro_paciente.id', $id)
->first();
return [
'cidadao_idade_anos' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y'),
'cidadao_idade_meses' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m'),
'cidadao_idade_dias' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d'),
];
}
}