This commit is contained in:
454
api/app/Services/Imunizacao/AplicacaoCampanhaService.php
Normal file
454
api/app/Services/Imunizacao/AplicacaoCampanhaService.php
Normal file
@@ -0,0 +1,454 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user