Files
rkm-conectasus-ci-sandbox/api/app/Services/Imunizacao/AplicacaoCampanhaService.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

455 lines
18 KiB
PHP

<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\GrupoAtendimento;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Imunizacao\Campanha;
use App\Models\Imunizacao\RegistroAplicacao;
use App\Models\Imunizacao\Saida;
use App\Models\Imunizacao\SaidaVacina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class AplicacaoCampanhaService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
$campanha = CadastroCampanhaService::show(request()->get('campanha_id'));
$form = self::getFormData($campanha);
return [
'additionals' => self::getAdditionalsData(),
'form' => $form,
'model' => self::getModelData($campanha, $form),
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$entradaVacina = self::getEntradaVacina($request['sala_vacinacao_id'], $request['vacina_id'], $request['lote'], $request['data_validade_lote']);
$saida = Saida::create([
'tipo_id' => SaidaTipo::APLICACAO,
'sala_vacinacao_id' => $request['sala_vacinacao_id'],
'data_saida' => Carbon::now()->format('Y-m-d'),
]);
$saidaVacina = SaidaVacina::create([
'saida_id' => $saida->id,
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $request['vacina_id'],
'quantidade' => 1,
]);
RegistroAplicacao::create([
'paciente_id' => $request['paciente_id'],
'saida_vacina_id' => $saidaVacina->id,
'aplicador_id' => $request['aplicador_id'],
'grupo_atendimento_id' => $request['grupo_atendimento_id'],
'dose_id' => $request['dose_id'],
'estrategia_id' => $request['estrategia_id'],
'cid_id' => $request['cid_id'],
'campanha_id' => $request['campanha_id'],
'data_aplicacao' => Carbon::createFromFormat('d/m/Y', $request['data_aplicacao']),
'comunicante_hanseniase' => $request['comunicante_hanseniase'],
'gestante' => $request['gestante'],
'puerpera' => $request['puerpera'],
'imunizacao_advertida' => $request['imunizacao_advertida'],
'viajante' => $request['viajante'],
'ultimo_frasco' => $request['ultimo_frasco'],
'observacao' => $request['observacao'],
]);
});
}
public static function show($id)
{
return Campanha::find($id);
}
public static function datatable()
{
return DB::table('imunizacao_campanha')
->select([
'imunizacao_campanha.id',
'imunizacao_campanha.nome',
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_de, '%d/%m/%Y') AS periodo_de"),
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_ate, '%d/%m/%Y') AS periodo_ate"),
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
DB::raw("CONCAT(
cadastro_vacina.sigla, ' - ',
cadastro_vacina.abreviacao, ' - ',
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_campanha.vacina_id')
->whereRaw('imunizacao_campanha.periodo_de <= CURRENT_DATE')
->whereRaw('imunizacao_campanha.periodo_ate >= CURRENT_DATE');
}
public static function list()
{
switch (request()->get('listar')) {
case 'unidades':
return self::getUnidades();
break;
case 'salas_vacinacao':
return self::getSalasVacinacao(request()->get('unidade_id'));
break;
case 'lotes':
return self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id'));
break;
case 'produtores':
return self::getProdutores(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote'));
break;
default:
return [];
break;
}
}
private static function validate($request)
{
return $request->validate([
'campanha_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\Campanha,id',
],
'paciente_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\SujeitoAtencao\Paciente,id',
],
'sala_vacinacao_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'aplicador_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id',
],
'vacina_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
],
'grupo_atendimento_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\GrupoAtendimento,id',
],
'dose_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\Dose,id',
],
'estrategia_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\Estrategia,id',
],
'cid_id' => [
'nullable',
'integer',
],
'data_aplicacao' => [
'required',
'date_format:d/m/Y',
'before_or_equal:now',
],
'lote' => [
'required',
'string',
],
'data_validade_lote' => [
'required',
'date',
],
'comunicante_hanseniase' => [
'required',
'boolean',
],
'gestante' => [
'required',
'boolean',
],
'puerpera' => [
'required',
'boolean',
],
'imunizacao_advertida' => [
'required',
'boolean',
],
'viajante' => [
'required',
'boolean',
],
'observacao' => [
'nullable',
'string',
'between:1,5000',
],
]);
}
private static function getAdditionalsData()
{
return [
'data_atual' => Carbon::now()->format('Y-m-d'),
'parametrizacao' => self::getParametrizacao(),
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
];
}
private static function getFormData($campanha)
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$unidades = self::getUnidades();
$salasVacinacao = self::getSalasVacinacao($salaVacinacaoLogada->unidade_id ?? null);
return [
'unidades' => $unidades,
'salas_vacinacao' => $salasVacinacao,
'lotes' => self::getLotes($salaVacinacaoLogada->id ?? null, $campanha->vacina_id) ?? [],
'doses' => [],
'produtores' => [],
'grupos_atendimento' => self::getGruposAtendimento(),
'estrategias' => [],
];
}
private static function getModelData($campanha, $form)
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
return [
'paciente' => null,
'unidade_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->unidade_id : null,
'sala_vacinacao_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->id : null,
'aplicador' => null,
'data_aplicacao' => Carbon::now()->format('Y-m-d'),
'vacina' => [
'id' => $campanha->vacina_id,
'nome' => $campanha->vacina->nome,
'abreviacao' => $campanha->vacina->abreviacao,
'sigla' => $campanha->vacina->sigla,
'sigla_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->nome,
'sigla_abreviacao' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao,
'abreviacao_nome' => $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome,
'sigla_abreviacao_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome,
],
'lote' => null,
'produtor_id' => null,
'grupo_atendimento_id' => GrupoAtendimento::POPULACAO_GERAL,
'dose_id' => null,
'estrategia_id' => null,
'cid_id' => null,
'comunicante_hanseniase' => false,
'gestante' => false,
'puerpera' => false,
'imunizacao_advertida' => false,
'viajante' => false,
'observacao' => null,
];
}
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'),
];
}
private static function getSalaVacinacaoLogada()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
'imunizacao_sala_vacinacao.permite_aplicacao',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->where('imunizacao_sala_vacinacao.ativo', true)
->where('cadastro_infraestrutura.id', auth()->payload()->get('infraestrutura_id'))
->first();
}
private static function getParametrizacao()
{
return DB::table('imunizacao_parametrizacao')
->select([
'parametrizacao_descricao_vacina_id',
'perfil_campanha',
'usa_ultimo_frasco',
'aprazamento_dias_antes',
'aprazamento_dias_depois',
'aprazamento_ativo',
])
->first();
}
private static function getUnidades()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$unidades = DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->when($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false, function ($query) use ($salaVacinacaoLogada) {
$query->where('id', $salaVacinacaoLogada->unidade_id);
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_sala_vacinacao')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->where('imunizacao_sala_vacinacao.ativo', true)
->where('imunizacao_sala_vacinacao.permite_aplicacao', true);
});
return $unidades->orderBy('nome_fantasia')->get();
}
private static function getSalasVacinacao($unidadeId)
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"),
'imunizacao_sala_vacinacao.cria_ficha_ab',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('imunizacao_sala_vacinacao.ativo', true)
->where('imunizacao_sala_vacinacao.permite_aplicacao', true)
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
->get();
}
private static function getLotes($salaVacinacaoId, $vacinaId)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.lote',
'imunizacao_entrada_vacina.data_validade_lote',
])
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
->groupBy([
'imunizacao_entrada_vacina.lote',
'imunizacao_entrada_vacina.data_validade_lote',
])
->havingRaw('
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)) > 0
')
->get();
}
private static function getProdutores($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return DB::table('imunizacao_produtor')
->select([
'id',
'nome',
])
->whereExists(function ($query) use ($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote) {
$query->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->whereColumn('imunizacao_entrada_vacina.produtor_id', 'imunizacao_produtor.id')
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
->where('imunizacao_entrada_vacina.lote', $lote)
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
->havingRaw('
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)) > 0
');
})
->orderBy('nome')
->get();
}
public static function getGruposAtendimento()
{
return DB::table('imunizacao_grupo_atendimento')
->select([
'id',
'nome',
])
->orderBy('nome')
->get();
}
private static function getEntradaVacina($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
])
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
->where('imunizacao_entrada_vacina.lote', $lote)
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
->havingRaw('
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)) > 0
')
->orderBy('imunizacao_entrada_vacina.id')
->first();
}
}