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,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();
}
}

View File

@@ -0,0 +1,658 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\EntradaTipo;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Cadastro\Vacina;
use App\Models\Imunizacao\Entrada;
use App\Models\Imunizacao\Saida;
use App\Models\Imunizacao\SaidaVacina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class BaixaService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
$saidaVacinaId = null;
if ($request['tipo_movimentacao'] === 'baixa') {
DB::transaction(function() use ($request, &$saidaVacinaId) {
$saida = Saida::create([
'sala_vacinacao_id' => $request['sala_vacinacao_id'],
'tipo_id' => $request['tipo_id'],
'motivo_id' => $request['motivo_id'],
'motivo_indisponibilidade' => $request['motivo_indisponibilidade'],
'observacao' => $request['observacao'],
'data_saida' => Carbon::createFromFormat('d/m/Y', $request['data_saida']),
]);
$quantidade = $request['quantidade'];
while ((int) $quantidade > 0) {
$entradaVacina = self::getEntradaVacina($request['sala_vacinacao_id'], $request['vacina_id'], $request['lote'], $request['data_validade_lote']);
if ($entradaVacina->quantidade >= $quantidade) {
$saidaVacina = $saida->vacinas()->create([
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $quantidade,
]);
$saidaVacinaId = $saidaVacina->id;
$quantidade = 0;
} else {
$saidaVacina = $saida->vacinas()->create([
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $entradaVacina->quantidade,
]);
$saidaVacinaId = $saidaVacina->id;
$quantidade = $quantidade - $entradaVacina->quantidade;
}
}
});
}
else if ($request['tipo_movimentacao'] === 'estorno') {
DB::transaction(function() use ($request, &$saidaVacinaId) {
foreach ($request['saidas'] as $saidaId) {
$saidaVacina = SaidaVacina::findOrFail($saidaId);
$saidaVacinaId = $saidaVacina->id;
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::ESTORNO,
'sala_vacinacao_id' => $saidaVacina->entradaVacinaOrigem->entrada->sala_vacinacao_id,
'data_entrada' => $saidaVacina->entradaVacinaOrigem->entrada->data_entrada,
'origem' => $saidaVacina->entradaVacinaOrigem->entrada->origem,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->entradaVacinaOrigem->vacina_id,
'produtor_id' => $saidaVacina->entradaVacinaOrigem->produtor_id,
'apresentacao_id' => $saidaVacina->entradaVacinaOrigem->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $saidaVacina->entradaVacinaOrigem->lote,
'data_validade_lote' => $saidaVacina->entradaVacinaOrigem->data_validade_lote,
]);
}
});
}
else if ($request['tipo_movimentacao'] === 'indisponibilidade') {
DB::transaction(function() use ($request, &$saidaVacinaId) {
foreach ($request['saidas'] as $saida) {
$saidaVacina = SaidaVacina::findOrFail($saida);
$saidaVacinaId = $saidaVacina->id;
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::ESTORNO,
'sala_vacinacao_id' => $saidaVacina->entradaVacinaOrigem->entrada->sala_vacinacao_id,
'data_entrada' => $saidaVacina->entradaVacinaOrigem->entrada->data_entrada,
'origem' => $saidaVacina->entradaVacinaOrigem->entrada->origem,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->entradaVacinaOrigem->vacina_id,
'produtor_id' => $saidaVacina->entradaVacinaOrigem->produtor_id,
'apresentacao_id' => $saidaVacina->entradaVacinaOrigem->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $saidaVacina->entradaVacinaOrigem->lote,
'data_validade_lote' => $saidaVacina->entradaVacinaOrigem->data_validade_lote,
]);
}
});
}
return $saidaVacinaId;
}
public static function datatable()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$sub = DB::table('imunizacao_entrada_vacina')
->select([
'cadastro_unidade.id AS unidade_id',
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("
CASE WHEN cadastro_infraestrutura.principal THEN
cadastro_unidade.nome_fantasia
ELSE
cadastro_infraestrutura.nome
END AS infraestrutura_nome
"),
'cadastro_vacina.id AS vacina_id',
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'imunizacao_entrada_vacina.lote',
DB::raw('
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)) AS estoque
')
])
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->when($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false, function ($query) use ($salaVacinacaoLogada) {
$query->where('imunizacao_sala_vacinacao.id', $salaVacinacaoLogada->id);
})
->groupBy([
'cadastro_unidade.id',
'imunizacao_sala_vacinacao.id',
'cadastro_vacina.id',
'imunizacao_entrada_vacina.lote'
])
->havingRaw('estoque > 0');
return DB::query()
->fromSub($sub, 'estoque_por_lote')
->select([
'unidade_id',
'sala_vacinacao_id',
'unidade_nome_fantasia',
'infraestrutura_nome',
'vacina_id',
'vacina_nome',
'vacina_abreviacao',
'vacina_sigla',
DB::raw("CONCAT(vacina_sigla, ' - ', vacina_nome) AS vacina_sigla_nome"),
DB::raw("CONCAT(vacina_sigla, ' - ', vacina_abreviacao) AS vacina_sigla_abreviacao"),
DB::raw("CONCAT(vacina_abreviacao, ' - ', vacina_nome) AS vacina_abreviacao_nome"),
DB::raw("CONCAT(vacina_sigla, ' - ', vacina_abreviacao, ' - ', vacina_nome) AS vacina_sigla_abreviacao_nome"),
DB::raw('SUM(estoque) AS estoque')
])
->groupBy([
'unidade_id',
'sala_vacinacao_id',
'vacina_id'
]);
}
public static function list()
{
switch (request()->get('listar')) {
case 'estoque':
return self::getEstoque(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote'));
break;
default:
return [];
break;
}
}
public static function historico() {
if (empty(request()->get('sala_vacinacao_id'))) {
return SaidaVacina::where('vacina_id', request()->get('vacina_id'))
->latest()
->get()
->map(fn($vacina) => [
'id' => $vacina->id,
'data_saida' => $vacina->saida->data_saida,
'motivo' => self::getMotivos()->firstWhere('id', $vacina->saida->motivo_id) ? self::getMotivos()->firstWhere('id', $vacina->saida->motivo_id)->nome : '',
'quantidade' => $vacina->quantidade,
'usuario' => $vacina->lotacao->usuario->nome ?? 'NÃO INFORMADO',
'observacao' => $vacina->saida->observacao,
]);
} else {
return self::getSaidasVacina(request()->get('sala_vacinacao_id'), request()->get('vacina_id'))
->map(fn($vacina) => [
'id' => $vacina->id,
'data_saida' => $vacina->data_saida,
'motivo' => $vacina->saida_vacina_motivo,
'quantidade' => $vacina->quantidade,
'usuario' => SaidaVacina::where('id', $vacina->id)
->get()
->pluck('lotacao.usuario.nome')
->filter()
->first() ?? 'NÃO INFORMADO',
'observacao' => $vacina->observacao,
]);
}
}
private static function validate($request)
{
$rules = [];
switch ($request['tipo_movimentacao']) {
case 'baixa':
$rules = [
'tipo_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SaidaTipo,id',
],
'motivo_id' => [
'nullable',
'integer',
'exists:\App\Models\Imunizacao\SaidaMotivo,id',
],
'motivo_indisponibilidade' => [
'nullable',
'string',
'between:3,100',
],
'observacao' => [
'nullable',
'string',
'between:3,300',
],
'lote' => [
'required',
'string',
],
'data_validade_lote' => [
'required',
'date',
],
'quantidade' => [
'required',
'integer',
'between:1,99999999',
'max:' . self::getEstoque(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote')),
],
];
break;
case 'estorno':
$rules = [
'saidas' => [
'required',
'array',
],
];
break;
case 'indisponibilidade':
$rules = [
'saidas' => [
'required',
'array',
],
];
break;
}
return $request->validate($rules);
}
private static function getAdditionalsData()
{
return [
'parametrizacao' => self::getParametrizacao(),
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
];
}
private static function getFormData()
{
$response = [];
switch (request()->get('tipo_movimentacao')) {
case 'baixa':
$response = [
'unidades' => self::getUnidades(request()->get('sala_vacinacao_id')),
'salas_vacinacao' => self::getSalasVacinacao(request()->get('sala_vacinacao_id')),
'tipos' => self::getTipos(),
'motivos' => self::getMotivos(),
'lotes' => self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id')),
];
break;
case 'estorno':
$response = [
'unidades' => self::getUnidades(request()->get('sala_vacinacao_id')),
'salas_vacinacao' => self::getSalasVacinacao(request()->get('sala_vacinacao_id')),
];
break;
case 'indisponibilidade':
$response = [
'unidades' => self::getUnidades(request()->get('sala_vacinacao_id')),
'salas_vacinacao' => self::getSalasVacinacao(request()->get('sala_vacinacao_id')),
];
break;
}
return $response;
}
private static function getModelData()
{
$response = [];
$vacina = Vacina::findOrFail(request()->get('vacina_id'));
$salaVacinacao = self::getSalaVacinacao(request()->get('sala_vacinacao_id'));
switch (request()->get('tipo_movimentacao')) {
case 'baixa':
$response = [
'unidade_id' => $salaVacinacao->unidade_id ?? null,
'sala_vacinacao_id' => request()->get('sala_vacinacao_id'),
'vacina_id' => request()->get('vacina_id'),
'vacina_nome' => $vacina->nome,
'vacina_abreviacao' => $vacina->abreviacao,
'vacina_sigla' => $vacina->sigla,
'vacina_sigla_nome' => $vacina->sigla . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao' => $vacina->sigla . ' - ' . $vacina->abreviacao,
'vacina_abreviacao_nome' => $vacina->abreviacao . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao_nome' => $vacina->sigla . ' - ' . $vacina->abreviacao . ' - ' . $vacina->nome,
'tipo_id' => null,
'motivo_id' => null,
'motivo_indisponibilidade' => null,
'observacao' => null,
'data_saida' => Carbon::now()->format('Y-m-d'),
'estoque' => null,
'quantidade' => null,
'lote' => null,
];
break;
case 'estorno':
$response = [
'unidade_id' => $salaVacinacao->unidade_id ?? null,
'sala_vacinacao_id' => request()->get('sala_vacinacao_id'),
'vacina_id' => request()->get('vacina_id'),
'vacina_nome' => $vacina->nome,
'vacina_abreviacao' => $vacina->abreviacao,
'vacina_sigla' => $vacina->sigla,
'vacina_sigla_nome' => $vacina->sigla . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao' => $vacina->sigla . ' - ' . $vacina->abreviacao,
'vacina_abreviacao_nome' => $vacina->abreviacao . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao_nome' => $vacina->sigla . ' - ' . $vacina->abreviacao . ' - ' . $vacina->nome,
'saidas' => self::getSaidasVacina(request()->get('sala_vacinacao_id'), request()->get('vacina_id'))->map(function($query) {
return [
'id' => $query->id,
'selecionada' => false,
'quantidade' => $query->quantidade,
'lote' => $query->lote,
'data_validade_lote' => $query->data_validade_lote,
'saida_vacina_motivo' => $query->saida_vacina_motivo,
];
}),
];
break;
case 'indisponibilidade':
$response = [
'unidade_id' => $salaVacinacao->unidade_id ?? null,
'sala_vacinacao_id' => request()->get('sala_vacinacao_id'),
'vacina_id' => request()->get('vacina_id'),
'vacina_nome' => $vacina->nome,
'vacina_abreviacao' => $vacina->abreviacao,
'vacina_sigla' => $vacina->sigla,
'vacina_sigla_nome' => $vacina->sigla . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao' => $vacina->sigla . ' - ' . $vacina->abreviacao,
'vacina_abreviacao_nome' => $vacina->abreviacao . ' - ' . $vacina->nome,
'vacina_sigla_abreviacao_nome' => $vacina->sigla . ' - ' . $vacina->abreviacao . ' - ' . $vacina->nome,
'saidas' => self::getEstoquesIndisponiveis(request()->get('sala_vacinacao_id'), request()->get('vacina_id'))->map(function($query) {
return [
'id' => $query->id,
'selecionado' => false,
'quantidade' => $query->quantidade,
'lote' => $query->lote,
'data_validade_lote' => $query->data_validade_lote,
'motivo_indisponibilidade' => $query->motivo_indisponibilidade,
];
}),
];
break;
}
return $response;
}
private static function getSalaVacinacaoLogada()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->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',
])
->first();
}
private static function getSalaVacinacao($salaVacinacaoId)
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->where('imunizacao_sala_vacinacao.id', $salaVacinacaoId)
->first();
}
private static function getUnidades($salaVacinacaoId)
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->whereExists(function ($query) use ($salaVacinacaoId) {
$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.id', $salaVacinacaoId);
})
->orderBy('nome_fantasia')
->get();
}
private static function getSalasVacinacao($salaVacinacaoId)
{
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"),
])
->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.id', $salaVacinacaoId)
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
->get();
}
private static function getTipos()
{
return DB::table('imunizacao_saida_tipo')
->select([
'id',
'nome',
])
->whereIn('id', [SaidaTipo::BAIXA, SaidaTipo::INDISPONIBILIDADE])
->orderBy('nome')
->get();
}
private static function getMotivos()
{
return DB::table('imunizacao_saida_motivo')
->select([
'id',
'nome',
])
->orderBy('nome')
->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
')
->orderBy('imunizacao_entrada_vacina.data_validade_lote')
->get();
}
private static function getEstoque($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return DB::table('imunizacao_entrada_vacina')
->select([
DB::raw('
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)) AS estoque
')
])
->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)
->pluck('estoque')
->first();
}
private static function getEntradaVacina($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'imunizacao_entrada_vacina.vacina_id',
DB::raw('
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) AS quantidade
'),
])
->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)
->whereRaw('
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)
')
->orderBy('imunizacao_entrada_vacina.id')
->first();
}
private static function getSaidasVacina($salaVacinacaoId, $vacinaId)
{
return DB::table('imunizacao_saida_vacina')
->select([
'imunizacao_saida_vacina.id',
'imunizacao_saida_vacina.quantidade',
'imunizacao_entrada_vacina.lote',
'imunizacao_saida.data_saida',
'imunizacao_saida.observacao',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
'imunizacao_saida_motivo.nome AS saida_vacina_motivo',
])
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->join('imunizacao_saida_motivo', 'imunizacao_saida_motivo.id', 'imunizacao_saida.motivo_id')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->whereColumn('imunizacao_entrada_vacina.saida_vacina_id', 'imunizacao_saida_vacina.id');
})
->where('imunizacao_saida.tipo_id', SaidaTipo::BAIXA)
->where('imunizacao_saida.sala_vacinacao_id', $salaVacinacaoId)
->where('imunizacao_saida_vacina.vacina_id', $vacinaId)
->get();
}
private static function getEstoquesIndisponiveis($salaVacinacaoId, $vacinaId)
{
return DB::table('imunizacao_saida_vacina')
->select([
'imunizacao_saida_vacina.id',
'imunizacao_saida_vacina.quantidade',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
'imunizacao_saida.motivo_indisponibilidade',
])
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->whereColumn('imunizacao_entrada_vacina.saida_vacina_id', 'imunizacao_saida_vacina.id');
})
->where('imunizacao_saida.tipo_id', SaidaTipo::INDISPONIBILIDADE)
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
->get();
}
}

View File

@@ -0,0 +1,300 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Geral\MedidaTempo;
use App\Models\Imunizacao\Campanha;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class CadastroCampanhaService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$campanha = Campanha::create([
'vacina_id' => $request['vacina_id'],
'nome' => $request['nome'],
'periodo_de' => Carbon::createFromFormat('d/m/Y', $request['periodo_de']),
'periodo_ate' => Carbon::createFromFormat('d/m/Y', $request['periodo_ate']),
'meta' => $request['meta'],
]);
$populacoes = [];
foreach ($request['populacoes'] as $populacao) {
$populacoes[] = [
'idade_inicial_medida_tempo_id' => $populacao['idade_inicial_medida_tempo_id'],
'idade_final_medida_tempo_id' => $populacao['idade_final_medida_tempo_id'],
'sexo_id' => $populacao['sexo_id'],
'idade_inicial' => $populacao['idade_inicial'],
'idade_final' => $populacao['idade_final'],
];
}
$campanha->populacoes()->createMany($populacoes);
});
}
public static function show($id)
{
return Campanha::find($id);
}
public static function edit($id)
{
$campanha = self::show($id);
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(count($campanha->aplicacoes) > 0 ? null : $campanha),
];
}
public static function update($request, $id)
{
self::validate($request);
DB::transaction(function() use ($request, $id) {
$campanha = tap(self::show($id))->update([
'vacina_id' => $request['vacina_id'],
'nome' => $request['nome'],
'periodo_de' => Carbon::createFromFormat('d/m/Y', $request['periodo_de']),
'periodo_ate' => Carbon::createFromFormat('d/m/Y', $request['periodo_ate']),
'meta' => $request['meta'],
]);
foreach ($request['populacoes'] as $populacao) {
$populacoes[] = [
'idade_inicial_medida_tempo_id' => $populacao['idade_inicial_medida_tempo_id'],
'idade_final_medida_tempo_id' => $populacao['idade_final_medida_tempo_id'],
'sexo_id' => $populacao['sexo_id'],
'idade_inicial' => $populacao['idade_inicial'],
'idade_final' => $populacao['idade_final'],
];
}
$campanha->populacoes()->delete();
$campanha->populacoes()->createMany($populacoes);
});
}
public static function destroy($id)
{
$campanha = self::show($id);
DB::transaction(function() use (&$campanha) {
$campanha->populacoes()->delete();
$campanha->delete();
});
return $campanha;
}
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"),
'imunizacao_campanha.vacina_id',
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'imunizacao_campanha.meta',
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"
),
DB::raw("
COALESCE((
SELECT TRUE
FROM imunizacao_registro_aplicacao
WHERE campanha_id = imunizacao_campanha.id
LIMIT 1
), FALSE) AS desativado
"),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_campanha.vacina_id');
}
private static function validate($request)
{
$rules = [];
foreach ($request['populacoes'] as $key => $value) {
$rules["populacoes.$key.idade_inicial"] = [
'required',
'integer',
'min:0',
'max:366',
];
$rules["populacoes.$key.idade_inicial_medida_tempo_id"] = [
'required',
'integer',
'exists:\App\Models\Geral\MedidaTempo,id',
];
$rules["populacoes.$key.idade_final"] = [
'required',
'integer',
'min:' . $value['idade_inicial'],
'max:366',
];
$rules["populacoes.$key.idade_final_medida_tempo_id"] = [
'required',
'integer',
'exists:\App\Models\Geral\MedidaTempo,id',
function ($_, $value, $fail) use ($request, $key) {
if ($request['populacoes'][$key] === MedidaTempo::MESES) {
if ($value === MedidaTempo::DIAS) {
$fail('Se a idade inicial for em Mês(es) a idade final também deverá ser em Mês(es) ou Ano(s).');
}
}
else if ($request['populacoes'][$key] === MedidaTempo::ANOS) {
if ($value !== MedidaTempo::ANOS) {
$fail('Se a idade inicial for em Anos(s) a idade inicial também deverá ser em Anos(s).');
}
}
},
];
$rules["populacoes.$key.sexo_id"] = [
'nullable',
'integer',
'exists:\App\Models\Cadastro\SujeitoAtencao\Sexo,id',
];
}
return $request->validate(array_merge([
'nome' => [
'required',
'string',
'between:3,300',
],
'periodo_de' => [
'required',
'date_format:d/m/Y',
],
'periodo_ate' => [
'required',
'date_format:d/m/Y',
'after_or_equal:periodo_de',
],
'vacina_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
],
'meta' => [
'required',
'integer',
'min:1',
'max:100',
],
], $rules));
}
private static function getAdditionalsData()
{
return [
'parametrizacao' => self::getParametrizacao(),
];
}
private static function getFormData()
{
return [
'sexos' => self::getSexos(),
'medidas_tempo' => self::getMedidasTempo(),
];
}
private static function getModelData($campanha = null)
{
return [
'id' => $campanha->id ?? null,
'nome' => $campanha->nome ?? null,
'periodo' => [
'start' => $campanha->periodo_de ?? null,
'end' => $campanha->periodo_ate ?? null,
],
'vacina' => [
'id' => $campanha->vacina_id ?? null,
'nome' => $campanha->vacina->nome ?? null,
'abreviacao' => $campanha->vacina->abreviacao ?? null,
'sigla' => $campanha->vacina->sigla ?? null,
],
'meta' => $campanha->meta ?? null,
'populacoes' => $campanha ? $campanha->populacoes->map(function($populacao) {
return [
'id' => $populacao->id,
'idade_inicial' => $populacao->idade_inicial,
'idade_inicial_medida_tempo_id' => $populacao->idade_inicial_medida_tempo_id,
'idade_inicial_medida_tempo_nome' => $populacao->idadeInicialMedidaTempo->nome,
'idade_final' => $populacao->idade_final,
'idade_final_medida_tempo_id' => $populacao->idade_final_medida_tempo_id,
'idade_final_medida_tempo_nome' => $populacao->idadeFinalMedidaTempo->nome,
'sexo_id' => $populacao->sexo_id ?? null,
'sexo_descricao' => $populacao->sexo->descricao ?? 'AMBOS',
];
}) : [],
];
}
private static function getParametrizacao()
{
return DB::table('imunizacao_parametrizacao')
->select([
'parametrizacao_descricao_vacina_id',
])
->first();
}
private static function getSexos()
{
return DB::table('cadastro_sexo')
->select([
'id',
'descricao',
])
->orderBy('descricao')
->get();
}
private static function getMedidasTempo()
{
return DB::table('geral_medida_tempo')
->select([
'id',
'nome',
])
->whereIn('id', [MedidaTempo::DIAS, MedidaTempo::MESES, MedidaTempo::ANOS])
->orderBy('nome')
->get();
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace App\Services\Imunizacao;
use App\Events\PainelSenha\ChamadaEvent;
use App\Models\Cadastro\Estabelecimento\Sala;
use App\Models\PainelSenha\Chamada;
use App\Models\PainelSenha\Fila;
use App\Models\PainelSenha\ParametrizacaoInfraestrutura;
use App\Models\PainelSenha\Tela;
use App\Services\Service;
use Exception;
use Illuminate\Validation\Rule;
class ChamadaService extends Service
{
public static function index($params)
{
return Chamada::where('tela_id', $params['tela_id'])
->when($params['modulo_ids'] ?? null, fn ($q, $moduloIds) => $q
->whereHas('fila', fn ($q) => $q
->whereHas('opcaoEntrada', fn ($q) => $q
->whereIn('modulo_id', $moduloIds)
)
)
)
->orderByDesc('created_at')
->take(4)
->get()
->map(fn ($chamada) => [
'id' => $chamada->id,
'paciente' => [
'cidadao' => [
'preferencia_nome_id' => $chamada->paciente->cidadao->preferencia_nome_id ?? null,
'nome' => $chamada->paciente->cidadao->nome ?? null,
'nome_social' => $chamada->paciente->cidadao->nome_social ?? null,
],
],
'sala' => [
'nome' => $chamada->sala->nome ?? null,
],
'senha' => $chamada->fila->senha ?? null,
]);
}
public static function store()
{
self::validate();
$fila = Fila::findOrFail(request()->fila_id);
$chamada = Chamada::create([
'fila_id' => $fila->id,
'status_id' => $fila->status_id,
'tela_id' => request()->tela_id,
'sala_id' => request()->sala_id,
'paciente_id' => $fila->paciente_id ?? null,
]);
FilaAtendimentoService::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
$parametrizacaoInfraestrutura = ParametrizacaoInfraestrutura::where(
'infraestrutura_id',
$fila->centroCusto->infraestrutura_id
)->first();
$moduloIds = is_null($parametrizacaoInfraestrutura)
? collect()
: $parametrizacaoInfraestrutura->modulos->pluck('id');
try {
$paramsChamada = [
'tela_id' => $chamada->tela_id,
'modulo_ids' => null,
];
$moduloIds->each(function ($moduloId) use ($paramsChamada) {
$paramsChamada['modulo_ids'] = [$moduloId];
ChamadaEvent::dispatch(
$paramsChamada['tela_id'],
$moduloId,
self::index($paramsChamada)
);
});
} catch (Exception $error) {
// TODO: Gravar exception em um arquivo.
}
return $chamada;
}
private static function validate()
{
request()->validate([
'fila_id' => [
'required',
'integer',
Rule::exists(Fila::class, 'id'),
],
'tela_id' => [
'required',
'integer',
Rule::exists(Tela::class, 'id'),
],
'sala_id' => [
'nullable',
'integer',
Rule::exists(Sala::class, 'id'),
],
]);
}
}

View File

@@ -0,0 +1,200 @@
<?php
namespace App\Services\Imunizacao;
use App\Models\Cadastro\Vacina;
use App\Models\Imunizacao\EntradaVacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Models\Imunizacao\SaidaVacina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class ConsultaEstoqueService extends Service
{
public static function index()
{
return [
'model' => [
'vacina_id' => null,
'unidade_id' => null
],
'form' => [
'vacinas' => self::getVacinas(),
'unidades' => self::getUnidades()
],
'additionals' => [
'parametrizacao' => self::getParametrizacao()
]
];
}
private static function getParametrizacao()
{
$parametrizacao = Parametrizacao::first();
return [
'parametrizacaoDescricaoVacinaId' => $parametrizacao->parametrizacao_descricao_vacina_id
];
}
public static function list()
{
return $entradas = DB::table('imunizacao_entrada_vacina as imunizacao_entrada_vacina')
->select([
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
'cadastro_vacina.sigla AS vacina_sigla',
'cadastro_vacina.id AS vacina_id',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.nome AS vacinaNome',
'imunizacao_apresentacao.nome AS apresentacao_nome',
'imunizacao_entrada_vacina.lote AS entrada_vacina_lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS entrada_vacina_data_validade_lote"),
DB::raw("
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
SELECT SUM(isv.quantidade)
FROM imunizacao_saida_vacina isv
WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id
), 0)) AS estoque
")
])
->join('cadastro_vacina', 'cadastro_vacina.id', '=', 'imunizacao_entrada_vacina.vacina_id')
->join('imunizacao_produtor', 'imunizacao_produtor.id', '=', 'imunizacao_entrada_vacina.produtor_id')
->join('imunizacao_apresentacao', 'imunizacao_apresentacao.id', '=', 'imunizacao_entrada_vacina.apresentacao_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', '=', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', '=', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', '=', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', '=', 'cadastro_infraestrutura.unidade_id')
->when(request()->unidade_id, fn($q) => $q->where('cadastro_unidade.id', request()->unidade_id))
->when(request()->vacina_id, fn($q) => $q->where('imunizacao_entrada_vacina.vacina_id', request()->vacina_id))
->groupBy([
'cadastro_vacina.id',
'imunizacao_entrada_vacina.lote',
])
->havingRaw('estoque > 0')
->orderBy('imunizacao_entrada_vacina.lote')
->get()->groupBy('vacina_id')
->map(function ($itensVacina) {
$primeiroItem = $itensVacina->first();
$estoqueTotal = $itensVacina->sum('estoque');
$lotes = $itensVacina->pluck('entrada_vacina_lote')->unique()->implode(', ');
$validades = $itensVacina->pluck('entrada_vacina_data_validade_lote')->unique()->implode(', ');
return [
'vacina_id' => $primeiroItem->vacina_id,
'vacina_nome' => $primeiroItem->vacinaNome,
'vacina_abreviacao' => $primeiroItem->vacina_abreviacao,
'vacina_sigla' => $primeiroItem->vacina_sigla,
'unidade_nome_fantasia' => $primeiroItem->unidade_nome_fantasia,
'infraestrutura_nome' => $primeiroItem->infraestrutura_nome,
'apresentacao_nome' => $itensVacina->pluck('apresentacao_nome')->unique()->implode(', '),
'entrada_vacina_lote' => $lotes,
'entrada_vacina_data_validade_lote' => $validades,
'vacina_sigla_nome' => "$primeiroItem->vacina_sigla - $primeiroItem->vacinaNome",
'vacina_sigla_abreviacao' => "$primeiroItem->vacina_sigla - $primeiroItem->vacina_abreviacao",
'vacina_abreviacao_nome' => "$primeiroItem->vacina_abreviacao - $primeiroItem->vacinaNome",
'vacina_sigla_abreviacao_nome' => "$primeiroItem->vacina_sigla - $primeiroItem->vacina_abreviacao - $primeiroItem->vacinaNome",
'estoque' => (int) $estoqueTotal,
];
})
->values();
}
public static function getEstoque()
{
$entradas = DB::table('imunizacao_entrada_vacina as imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') as validade"),
DB::raw("SUM(imunizacao_entrada_vacina.quantidade - COALESCE(
(SELECT SUM(isv.quantidade)
FROM imunizacao_saida_vacina isv
WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id
), 0)) as estoque"),
'cu.id as unidade_id',
'cu.nome_fantasia as unidade'
])
->join('imunizacao_entrada as ie', 'ie.id', '=', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao as isv', 'isv.id', '=', 'ie.sala_vacinacao_id')
->join('cadastro_infraestrutura as ci', 'ci.id', '=', 'isv.infraestrutura_id')
->join('cadastro_unidade as cu', 'cu.id', '=', 'ci.unidade_id')
->where('imunizacao_entrada_vacina.vacina_id', request()->vacina_id)
->when(request()->unidade_id, function($query) {
$query->where('cu.id', request()->unidade_id);
})
->groupBy([
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y')"),
'cu.id',
'cu.nome_fantasia'
])
->havingRaw('estoque > 0')
->orderBy('imunizacao_entrada_vacina.lote')
->get()
->map(function($item) {
$item->estoque = (int)$item->estoque;
return $item;
});
$vacina = Vacina::find(request()->vacina_id);
$vacina_nome = $vacina->nome;
$vacina_sigla = $vacina->sigla;
$vacina_abreviacao = $vacina->abreviacao;
return [
'entradas' => $entradas,
'vacina_nome' => $vacina_nome,
'vacina_abreviacao' => $vacina_abreviacao,
'vacina_sigla' => $vacina_sigla,
'vacina_sigla_nome' => "$vacina_sigla - $vacina_nome",
'vacina_sigla_abreviacao' => "$vacina_sigla - $vacina_abreviacao",
'vacina_abreviacao_nome' => "$vacina_abreviacao - $vacina_nome",
'vacina_sigla_abreviacao_nome' => "$vacina_sigla - $vacina_abreviacao - $vacina_nome",
'total' => $entradas->sum('estoque')
];
}
private static function getVacinas()
{
return EntradaVacina::with('vacina')
->groupBy('vacina_id')
->get()
->map(function($entrada_vacina) {
$vacina_nome = $entrada_vacina->vacina->nome;
$vacina_sigla = $entrada_vacina->vacina->sigla;
$vacina_abreviacao = $entrada_vacina->vacina->abreviacao;
return [
'vacina_id' => $entrada_vacina->vacina_id,
'vacina_nome' => $vacina_nome,
'vacina_abreviacao' => $vacina_abreviacao,
'vacina_sigla' => $vacina_sigla,
'vacina_sigla_nome' => "$vacina_sigla - $vacina_nome",
'vacina_sigla_abreviacao' => "$vacina_sigla - $vacina_abreviacao",
'vacina_abreviacao_nome' => "$vacina_abreviacao - $vacina_nome",
'vacina_sigla_abreviacao_nome' => "$vacina_sigla - $vacina_abreviacao - $vacina_nome",
];
});
}
public static function getUnidades()
{
return EntradaVacina::with('entrada.salaVacinacao.infraestrutura.unidade')
->when(request()->vacina_id, function($query) {
$query->where('vacina_id', request()->vacina_id);
})
->get()
->groupBy('entrada.salaVacinacao.infraestrutura.unidade_id')
->map(function($entrada_vacina) {
return [
'id' => $entrada_vacina[0]->entrada->salaVacinacao->infraestrutura->unidade_id ?? null,
'nome_fantasia' => $entrada_vacina[0]->entrada->salaVacinacao->infraestrutura->unidade->nome_fantasia ?? null
];
});
}
}

View File

@@ -0,0 +1,619 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Enums\Imunizacao\EntradaTipo;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Imunizacao\Entrada;
use App\Models\Imunizacao\EntradaVacina;
use App\Models\Imunizacao\Saida;
use App\Models\Imunizacao\SaidaVacina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class DistribuicaoService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
$entrada = null;
if (request()->get('tipo_movimentacao') === 'estorno') {
$entrada = Entrada::findOrFail(request()->get('entrada_id'));
}
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData($entrada),
'model' => self::getModelData($entrada),
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$saida = Saida::create([
'tipo_id' => SaidaTipo::DISTRIBUICAO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_de'],
'data_saida' => Carbon::createFromFormat('d/m/Y', $request['data']),
]);
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::DISTRIBUICAO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_para'],
'data_entrada' => Carbon::createFromFormat('d/m/Y', $request['data']),
]);
foreach ($request['vacinas'] as $vacina) {
$quantidade = $vacina['quantidade'];
while ((int) $quantidade > 0) {
$entradaVacina = self::getEntradaVacina($request['sala_vacinacao_id_de'], $vacina['vacina_id'], $vacina['lote'], $vacina['data_validade_lote']);
if ($entradaVacina->quantidade >= $quantidade) {
$saidaVacina = SaidaVacina::create([
'saida_id' => $saida->id,
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $quantidade,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $entradaVacina->produtor_id,
'apresentacao_id' => $entradaVacina->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $entradaVacina->lote,
'data_validade_lote' => $entradaVacina->data_validade_lote,
]);
$quantidade = 0;
} else {
$saidaVacina = SaidaVacina::create([
'saida_id' => $saida->id,
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $entradaVacina->quantidade,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $entradaVacina->produtor_id,
'apresentacao_id' => $entradaVacina->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $entradaVacina->lote,
'data_validade_lote' => $entradaVacina->data_validade_lote,
]);
$quantidade = $quantidade - $entradaVacina->quantidade;
}
}
}
});
}
public static function destroy($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$saida = Saida::create([
'tipo_id' => SaidaTipo::ESTORNO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_para'],
'data_saida' => Carbon::now()->format('Y-m-d'),
]);
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::ESTORNO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_de'],
'data_entrada' => Carbon::now()->format('Y-m-d'),
]);
foreach ($request['vacinas'] as $value) {
$entradaVacina = EntradaVacina::findOrFail($value);
$saidaVacina = SaidaVacina::create([
'saida_id' => $saida->id,
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $entradaVacina->quantidade,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $entradaVacina->produtor_id,
'apresentacao_id' => $entradaVacina->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $entradaVacina->lote,
'data_validade_lote' => $entradaVacina->data_validade_lote,
]);
}
});
}
public static function datatable()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$datatable = DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada.id AS entrada_id',
'imunizacao_saida.id AS saida_id',
'cadastro_unidade_de.nome_fantasia AS unidade_nome_de',
DB::raw("CASE WHEN cadastro_infraestrutura_de.principal THEN cadastro_unidade_de.nome_fantasia ELSE cadastro_infraestrutura_de.nome END AS infraestrutura_nome_de"),
'cadastro_unidade_para.nome_fantasia AS unidade_nome_para',
DB::raw("CASE WHEN cadastro_infraestrutura_para.principal THEN cadastro_unidade_para.nome_fantasia ELSE cadastro_infraestrutura_para.nome END AS infraestrutura_nome_para"),
DB::raw("DATE_FORMAT(imunizacao_saida.data_saida, '%d/%m/%Y') AS data"),
])
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao AS imunizacao_sala_vacinacao_para', 'imunizacao_sala_vacinacao_para.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_para', 'cadastro_infraestrutura_para.id', 'imunizacao_sala_vacinacao_para.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_para', 'cadastro_unidade_para.id', 'cadastro_infraestrutura_para.unidade_id')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_entrada_vacina.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_sala_vacinacao AS imunizacao_sala_vacinacao_de', 'imunizacao_sala_vacinacao_de.id', 'imunizacao_saida.sala_vacinacao_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_de', 'cadastro_infraestrutura_de.id', 'imunizacao_sala_vacinacao_de.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_de', 'cadastro_unidade_de.id', 'cadastro_infraestrutura_de.unidade_id')
->where('imunizacao_saida.tipo_id', SaidaTipo::DISTRIBUICAO);
if ($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false) {
$datatable->where('imunizacao_sala_vacinacao_de.id', $salaVacinacaoLogada->id);
}
return $datatable->groupBy([
'imunizacao_entrada.id',
'cadastro_unidade_de.nome_fantasia',
DB::raw("CASE WHEN cadastro_infraestrutura_de.principal THEN cadastro_unidade_de.nome_fantasia ELSE cadastro_infraestrutura_de.nome END"),
'cadastro_unidade_para.nome_fantasia',
DB::raw("CASE WHEN cadastro_infraestrutura_para.principal THEN cadastro_unidade_para.nome_fantasia ELSE cadastro_infraestrutura_para.nome END"),
DB::raw("DATE_FORMAT(imunizacao_saida.data_saida, '%d/%m/%Y')"),
]);
}
public static function list()
{
switch (request()->get('listar')) {
case 'salas_vacinacao_de':
return self::getSalasVacinacaoDe(request()->get('unidade_id_de'));
break;
case 'salas_vacinacao_para':
return self::getSalasVacinacaoPara(request()->get('unidade_id_para'));
break;
case 'lotes':
return self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id'));
break;
case 'estoque':
return self::getEstoque(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)
{
$rules = [];
switch (request()->get('tipo_movimentacao')) {
case 'estorno':
$rules = [
'sala_vacinacao_id_de' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'sala_vacinacao_id_para' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'vacinas' => [
function ($_, $value, $fail) {
foreach ($value as $value) {
$movimentacao = EntradaVacina::where('id', $value)->has('saidasVacina')->exists();
if ($movimentacao === true) {
$fail('Um ou mais itens selecionados possui movimentação e não pode ser estornado.');
}
}
},
],
];
break;
default:
foreach ($request['vacinas'] as $key => $value) {
$rules["vacinas.$key.vacina_id"] = [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
];
$rules["vacinas.$key.lote"] = [
'required',
'string',
];
$rules["vacinas.$key.data_validade_lote"] = [
'required',
'date',
];
$rules["vacinas.$key.quantidade"] = [
'required',
'integer',
'between:1,99999999',
'max:' . self::getEstoque(request()->get('sala_vacinacao_id_de'), $value['vacina_id'], $value['lote'], $value['data_validade_lote']),
];
}
$rules = array_merge([
'sala_vacinacao_id_de' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'sala_vacinacao_id_para' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'data' => [
'required',
'date_format:d/m/Y',
'before_or_equal:today',
],
], $rules);
break;
}
return $request->validate($rules);
}
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($entrada = null)
{
$response = [];
switch (request()->get('tipo_movimentacao')) {
case 'estorno':
$response = [
'unidades_de' => self::getUnidadesDe(),
'salas_vacinacao_de' => self::getSalasVacinacaoDe($entrada->vacinas()->first()->saidaVacina->saida->salaVacinacao->infraestrutura->unidade_id),
'unidades_para' => self::getUnidadesPara(),
'salas_vacinacao_para' => self::getSalasVacinacaoPara($entrada->salaVacinacao->infraestrutura->unidade_id),
];
break;
default:
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$response = [
'unidades_de' => self::getUnidadesDe(),
'salas_vacinacao_de' => self::getSalasVacinacaoDe($salaVacinacaoLogada->unidade_id ?? null),
'unidades_para' => self::getUnidadesPara(),
'salas_vacinacao_para' => [],
'lotes' => [],
];
break;
}
return $response;
}
private static function getModelData($entrada)
{
$response = [];
switch (request()->get('tipo_movimentacao')) {
case 'estorno':
$response = [
'unidade_id_de' => $entrada->vacinas()->first()->saidaVacina->saida->salaVacinacao->infraestrutura->unidade_id,
'sala_vacinacao_id_de' => $entrada->vacinas()->first()->saidaVacina->saida->sala_vacinacao_id,
'unidade_id_para' => $entrada->salaVacinacao->infraestrutura->unidade_id,
'sala_vacinacao_id_para' => $entrada->sala_vacinacao_id,
'data' => $entrada->data_entrada,
'vacinas' => self::getEntradasVacina($entrada->id)->map(function($query) {
return [
'id' => $query->id,
'disabled' => (bool) $query->existe_saida,
'checked' => false,
'vacina_nome' => $query->vacina_nome,
'vacina_abreviacao' => $query->vacina_abreviacao,
'vacina_sigla' => $query->vacina_sigla,
'vacina_sigla_nome' => $query->vacina_sigla . ' - ' . $query->vacina_nome,
'vacina_sigla_abreviacao' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao,
'vacina_abreviacao_nome' => $query->vacina_abreviacao . ' - ' . $query->vacina_nome,
'vacina_sigla_abreviacao_nome' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao . ' - ' . $query->vacina_nome,
'quantidade' => $query->quantidade,
'lote' => $query->lote . ' - Val: ' . $query->data_validade_lote,
];
}),
];
break;
default:
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$response = [
'unidade_id_de' => $salaVacinacaoLogada->unidade_id ?? null,
'sala_vacinacao_id_de' => $salaVacinacaoLogada->id ?? null,
'unidade_id_para' => null,
'sala_vacinacao_id_para' => null,
'data' => Carbon::now()->format('Y-m-d'),
'vacinas' => [],
];
break;
}
return $response;
}
private static function getSalaVacinacaoLogada()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->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',
])
->first();
}
private static function getUnidadesDe()
{
$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);
});
return $unidades->orderBy('nome_fantasia')->get();
}
private static function getUnidadesPara()
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->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);
})
->orderBy('nome_fantasia')
->get();
}
private static function getSalasVacinacaoDe($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"),
])
->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('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 getSalasVacinacaoPara($unidadeIdPara)
{
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"),
])
->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('cadastro_infraestrutura.unidade_id', $unidadeIdPara)
->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
')
->orderBy('imunizacao_entrada_vacina.data_validade_lote')
->get();
}
private static function getEstoque($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return (int) DB::table('imunizacao_entrada_vacina')
->select([
DB::raw('
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)) AS estoque
')
])
->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)
->pluck('estoque')
->first() ?? 0;
}
private static function getEntradaVacina($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'imunizacao_entrada_vacina.vacina_id',
'imunizacao_entrada_vacina.produtor_id',
'imunizacao_entrada_vacina.apresentacao_id',
DB::raw('
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) AS quantidade
'),
'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)
->where('imunizacao_entrada_vacina.lote', $lote)
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
->whereRaw('
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)
')
->orderBy('imunizacao_entrada_vacina.id')
->first();
}
private static function getEntradasVacina($entradaId)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'imunizacao_entrada_vacina.quantidade',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
DB::raw('
(
SELECT TRUE
FROM imunizacao_saida_vacina
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
LIMIT 1
) AS existe_saida
'),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->where('entrada_id', $entradaId)
->get();
}
public static function getPrintData($id)
{
$saida = Saida::find($id);
$parametrizacao = Parametrizacao::first()->parametrizacao_descricao_vacina_id;
return [
'entrada' => [
'unidade_distribuidora' => $saida->salaVacinacao->infraestrutura->unidade->nome_fantasia,
'local_distribuidor' => $saida->salaVacinacao->infraestrutura->nome,
'unidade_recebedora' => $saida->vacinas[0]->entradaVacinaDestino->entrada->salaVacinacao->infraestrutura->unidade->nome_fantasia,
'local_recebedor' => $saida->vacinas[0]->entradaVacinaDestino->entrada->salaVacinacao->infraestrutura->nome,
'data' => Carbon::parse($saida->data_saida)->format('d/m/Y')
],
'vacinas' => $saida->vacinas->map(function($saida_vacina) use($parametrizacao) {
return [
'nome' => self::getNomeParametrizado($parametrizacao, $saida_vacina->vacina),
'quantidade' => $saida_vacina->quantidade,
'lote' => $saida_vacina->entradaVacinaDestino->lote,
'validade' => Carbon::parse($saida_vacina->entradaVacinaDestino->data_validade_lote)->format('d/m/Y'),
];
})
];
}
private static function getNomeParametrizado($parametrizacao, $vacina)
{
switch ($parametrizacao) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
return $vacina->nome;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
return $vacina->abreviacao;
case ParametrizacaoDescricaoVacina::SIGLA:
return $vacina->sigla;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
return "$vacina->sigla - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
return "$vacina->sigla - $vacina->abreviacao";
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->abreviacao - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->sigla - $vacina->abreviacao - $vacina->nome";
}
}
}

View File

@@ -0,0 +1,432 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\EntradaTipo;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Imunizacao\Entrada;
use App\Models\Imunizacao\EntradaVacina;
use App\Models\Imunizacao\Saida;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class EntradaService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
$entrada = null;
if (request()->get('tipo_movimentacao') === 'estorno') {
$entrada = Entrada::find(request()->get('entrada_id'));
}
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData($entrada),
'model' => self::getModelData($entrada),
];
}
public static function store($request)
{
self::validate($request);
if ($request['tipo_movimentacao'] === 'entrada') {
DB::transaction(function() use ($request) {
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::MANUAL,
'sala_vacinacao_id' => $request['sala_vacinacao_id'],
'data_entrada' => Carbon::createFromFormat('d/m/Y', $request['data_entrada']),
'origem' => $request['origem'],
]);
$vacinas = [];
foreach ($request->get('vacinas') as $vacina) {
$vacinas[] = [
'vacina_id' => $vacina['vacina_id'],
'produtor_id' => $vacina['produtor_id'],
'apresentacao_id' => $vacina['apresentacao_id'],
'quantidade' => $vacina['quantidade'],
'lote' => $vacina['lote'],
'data_validade_lote' => Carbon::createFromFormat('d/m/Y', $vacina['data_validade_lote']),
];
}
$entrada->vacinas()->createMany($vacinas);
});
}
else if ($request['tipo_movimentacao'] === 'estorno') {
DB::transaction(function() use ($request) {
$saida = Saida::create([
'sala_vacinacao_id' => $request->sala_vacinacao_id,
'tipo_id' => SaidaTipo::ESTORNO,
'data_saida' => Carbon::now()->format('Y-m-d'),
]);
foreach ($request['vacinas'] as $entradaVacinaId) {
$entradaVacina = EntradaVacina::findOrFail($entradaVacinaId);
$saida->vacinas()->create([
'entrada_vacina_id' => $entradaVacina->id,
'vacina_id' => $entradaVacina->vacina_id,
'quantidade' => $entradaVacina->quantidade,
]);
}
});
}
}
public static function datatable()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$datatable = DB::table('imunizacao_entrada')
->select([
'imunizacao_entrada.id',
'cadastro_unidade.nome_fantasia AS unidade_nome',
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS infraestrutura_nome"),
DB::raw("DATE_FORMAT(imunizacao_entrada.data_entrada, '%d/%m/%Y') AS data_entrada"),
'imunizacao_entrada.origem',
])
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('imunizacao_entrada.tipo_id', EntradaTipo::MANUAL)
->where('imunizacao_sala_vacinacao.ativo', true)
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->whereColumn('imunizacao_entrada_vacina.entrada_id', 'imunizacao_entrada.id')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_saida_vacina')
->whereColumn('imunizacao_saida_vacina.entrada_vacina_id', 'imunizacao_entrada_vacina.id');
});
});
if ($salaVacinacaoLogada && !$salaVacinacaoLogada->responsavel) {
$datatable->where('imunizacao_sala_vacinacao.id', $salaVacinacaoLogada->id);
}
return $datatable;
}
public static function list()
{
switch (request()->get('listar')) {
case 'salas_vacinacao':
return self::getSalasVacinacao(request()->get('unidade_id'));
break;
case 'produtores':
return self::getProdutores(request()->get('vacina_id'));
break;
case 'apresentacoes':
return self::getApresentacoes(request()->get('vacina_id'), request()->get('produtor_id'));
break;
case 'produtores_e_apresentacoes':
return self::getProdutoresEApresentacoes();
break;
}
}
private static function validate($request)
{
$rules = [];
switch (request()->get('tipo_movimentacao')) {
case 'entrada':
$rules = [
'sala_vacinacao_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'data_entrada' => [
'required',
'date_format:d/m/Y',
'before_or_equal:now',
],
'origem' => [
'required',
'string',
'between:3,100',
],
'vacinas.*.vacina_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
],
'vacinas.*.produtor_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\Produtor,id',
],
'vacinas.*.apresentacao_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\Apresentacao,id',
],
'vacinas.*.quantidade' => [
'required',
'integer',
'between:1,99999999',
],
'vacinas.*.lote' => [
'required',
'string',
'between:1,30',
],
'vacinas.*.data_validade_lote' => [
'required',
'date_format:d/m/Y',
'after_or_equal:data_entrada',
],
];
break;
case 'estorno':
$rules = [
'sala_vacinacao_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'vacinas' => [
'required',
'array',
],
];
break;
}
return $request->validate($rules);
}
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($entrada = null)
{
$response = [];
switch (request()->get('tipo_movimentacao')) {
case 'entrada':
$response = [
'unidades' => self::getUnidades(),
'salas_vacinacao' => self::getSalasVacinacao(auth()->payload()->get('unidade_id')),
'produtores' => [],
'apresentacoes' => [],
];
break;
case 'estorno':
$response = [
'unidades' => self::getUnidades(),
'salas_vacinacao' => self::getSalasVacinacao($entrada->salaVacinacao->infraestrutura->unidade_id),
];
break;
}
return $response;
}
private static function getModelData($entrada = null)
{
$response = [];
switch (request()->get('tipo_movimentacao')) {
case 'entrada':
$response = [
'id' => null,
'unidade_id' => auth()->payload()->get('unidade_id'),
'sala_vacinacao_id' => self::getSalaVacinacaoLogada()->id ?? null,
'data_entrada' => null,
'origem' => null,
'vacinas' => [],
];
break;
case 'estorno':
$response = [
'unidade_id' => $entrada->salaVacinacao->infraestrutura->unidade_id,
'sala_vacinacao_id' => $entrada->sala_vacinacao_id,
'vacinas' => self::getEntradasVacina($entrada->id)->map(function($query) {
return [
'id' => $query->id,
'selecionada' => false,
'vacina_nome' => $query->vacina_nome,
'vacina_abreviacao' => $query->vacina_abreviacao,
'vacina_sigla' => $query->vacina_sigla,
'vacina_sigla_nome' => $query->vacina_sigla . ' - ' . $query->vacina_nome,
'vacina_sigla_abreviacao' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao,
'vacina_abreviacao_nome' => $query->vacina_abreviacao . ' - ' . $query->vacina_nome,
'vacina_sigla_abreviacao_nome' => $query->vacina_sigla . ' - ' . $query->vacina_abreviacao . ' - ' . $query->vacina_nome,
'quantidade' => $query->quantidade,
'lote' => $query->lote,
'data_validade_lote' => $query->data_validade_lote,
];
}),
];
break;
}
return $response;
}
private static function getSalaVacinacaoLogada()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->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 getUnidades()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$unidades = DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->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);
});
if ($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel === false) {
$unidades->where('id', auth()->payload()->get('unidade_id'));
}
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"),
])
->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('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 getParametrizacao()
{
return DB::table('imunizacao_parametrizacao')
->select([
'parametrizacao_descricao_vacina_id',
])
->first();
}
private static function getProdutores($vacinaId)
{
return DB::table('imunizacao_produtor')
->select([
'id',
'nome'
])
->whereExists(function ($query) use ($vacinaId) {
$query->select(DB::raw(1))
->from('imunizacao_vacina_produtor_apresentacao')
->whereColumn('imunizacao_vacina_produtor_apresentacao.produtor_id', 'imunizacao_produtor.id')
->where('imunizacao_vacina_produtor_apresentacao.vacina_id', $vacinaId);
})
->orderBy('nome')
->get();
}
private static function getApresentacoes($vacinaId, $produtorId)
{
return DB::table('imunizacao_apresentacao')
->select([
'id',
'nome'
])
->whereExists(function ($query) use ($vacinaId, $produtorId) {
$query->select(DB::raw(1))
->from('imunizacao_vacina_produtor_apresentacao')
->whereColumn('imunizacao_vacina_produtor_apresentacao.apresentacao_id', 'imunizacao_apresentacao.id')
->where('imunizacao_vacina_produtor_apresentacao.vacina_id', $vacinaId)
->where('imunizacao_vacina_produtor_apresentacao.produtor_id', $produtorId);
})
->orderBy('id')
->get();
}
private static function getProdutoresEApresentacoes()
{
return [
'produtores' => DB::table('imunizacao_produtor')
->select([
'id',
'nome'
])
->orderBy('nome')
->get(),
'apresentacoes' => DB::table('imunizacao_apresentacao')
->select([
'id',
'nome'
])
->orderBy('id')
->get(),
];
}
private static function getEntradasVacina($entradaId)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'imunizacao_entrada_vacina.quantidade',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('imunizacao_saida_vacina')
->whereColumn('imunizacao_saida_vacina.entrada_vacina_id', 'imunizacao_entrada_vacina.id');
})
->where('entrada_id', $entradaId)
->get();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,693 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Administracao\Modulo;
use App\Enums\PainelSenha\Status;
use App\Events\PainelSenha\FilaEvent;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\PainelSenha\CentroCustoCompartilhado;
use App\Models\PainelSenha\Fila;
use App\Models\PainelSenha\OpcaoEntrada;
use App\Models\PainelSenha\Prioridade;
use App\Services\Administracao\ModuloService;
use App\Services\Farmacia\FilaAtendimentoService AS FarmaciaFilaAtendimentoService;
use App\Services\Geral\AgeService;
use App\Services\PainelSenha\FilaAtendimentoService AS PainelSenhaFilaAtendimentoService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class FilaAtendimentoService extends Service
{
public static function index($centroCusto = null)
{
$centroCusto = $centroCusto ?? self::getCurrentCentroCusto();
return DB::table('painel_senha_fila')
->select([
'painel_senha_fila.id',
'painel_senha_opcao_entrada.id AS opcao_entrada_id',
'painel_senha_opcao_entrada.nome AS opcao_entrada_nome',
'painel_senha_opcao_entrada_destino.id AS opcao_entrada_destino_id',
'painel_senha_status.id AS status_id',
'painel_senha_status.nome AS status_nome',
'painel_senha_prioridade.id AS prioridade_id',
'painel_senha_prioridade.nome AS prioridade_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_cidadao.nome AS paciente_nome',
DB::raw("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"),
DB::raw("LPAD(cadastro_paciente.prontuario, 6, '0') AS paciente_prontuario"),
DB::raw("CONCAT(painel_senha_opcao_entrada.sigla, painel_senha_fila.senha) AS senha"),
DB::raw("DATE_FORMAT(painel_senha_fila.created_at, '%H:%i') AS horario_chegada"),
'painel_senha_fila.emitido_em',
])
->addSelect([
'chamadas' => function ($query) {
$query->select(DB::raw("COALESCE(COUNT(painel_senha_chamada.id), 0)"))
->from('painel_senha_chamada')
->whereColumn('painel_senha_chamada.fila_id', 'painel_senha_fila.id')
->whereColumn('painel_senha_chamada.status_id', 'painel_senha_fila.status_id');
},
])
->join('painel_senha_opcao_entrada', 'painel_senha_opcao_entrada.id', 'painel_senha_fila.opcao_entrada_id')
->join('painel_senha_status', 'painel_senha_status.id', 'painel_senha_fila.status_id')
->leftJoin('painel_senha_prioridade', 'painel_senha_prioridade.id', 'painel_senha_fila.prioridade_id')
->leftJoin('cadastro_paciente', 'cadastro_paciente.id', 'painel_senha_fila.paciente_id')
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin('painel_senha_opcao_entrada AS painel_senha_opcao_entrada_destino', 'painel_senha_opcao_entrada_destino.id', 'painel_senha_fila.opcao_entrada_destino_id')
->whereNull('painel_senha_fila.deleted_at')
->where('painel_senha_fila.evadido', false)
->where('painel_senha_fila.finalizado', false)
->where(fn ($q) => $q
->where(fn ($q) => $q
->whereNull('painel_senha_fila.opcao_entrada_destino_id')
->where('painel_senha_opcao_entrada.modulo_id', ModuloService::getId(Modulo::IMUNIZACAO))
->where(fn ($q) => $q
->where('painel_senha_opcao_entrada.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada.id')
)
)
)
->orWhere(fn ($q) => $q
->whereNotNull('painel_senha_fila.opcao_entrada_destino_id')
->where('painel_senha_opcao_entrada_destino.modulo_id', ModuloService::getId(Modulo::IMUNIZACAO))
->where(fn ($q) => $q
->where('painel_senha_opcao_entrada_destino.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada_destino.id')
)
)
)
)
->orderByDesc('painel_senha_prioridade.grau')
->orderBy('painel_senha_fila.atualizado_em')
->get()
->map(function($query) {
$query->tempo_espera = self::getTempoEspera($query->id);
$query->paciente_idade = isset($query->paciente_data_nascimento) ? AgeService::getFormattedAge(Carbon::createFromFormat('d/m/Y', $query->paciente_data_nascimento)) : null;
return $query;
});
}
public static function create()
{
return [
'form' => [
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
],
'model' => [
'paciente_id' => null,
'opcao_entrada_id' => null,
'prioridade_id' => null,
],
];
}
public static function createEncaminhamento($filaId)
{
$fila = Fila::findOrFail($filaId);
return [
'form' => [
'modulos_encaminhamento' => self::getModulosEncaminhamento($fila),
'centros_custo_encaminhamento' => [],
'opcoes_entrada_encaminhamento' => [],
'prioridades' => Prioridade::orderBy('nome')->get(['id', 'nome']),
],
'model' => [
'modulo_encaminhamento_id' => null,
'centro_custo_encaminhamento_id' => null,
'opcao_entrada_encaminhamento_id' => null,
'prioridade_id' => $fila->prioridade_id ?? null,
],
];
}
public static function listEncaminhamento()
{
$params = (object) request()->all();
switch (request()->listar) {
case 'centros-custo-encaminhamento': {
return [
'centros_custo_encaminhamento' => self::getCentrosCustoEncaminhamento($params),
'opcoes_entrada_encaminhamento' => [],
];
}
case 'opcoes-entrada-encaminhamento': {
return [
'opcoes_entrada_encaminhamento' => self::getOpcoesEntradaEncaminhamento($params),
];
}
}
}
private static function getModulosEncaminhamento($fila)
{
return DB::table('administracao_modulo AS modulo')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->whereColumn('opcao_entrada.modulo_id', 'modulo.id')
->where('opcao_entrada_destino.opcao_entrada_origem_id', $fila->opcaoEntradaAtual->id)
)
->select(
'modulo.id',
'modulo.nome'
)
->orderBy('modulo.nome')
->get();
}
private static function getCentrosCustoEncaminhamento($params)
{
return DB::table('cadastro_centro_custo AS centro_custo')
->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->whereColumn('opcao_entrada.centro_custo_id', 'centro_custo.id')
->where('opcao_entrada_destino.opcao_entrada_origem_id', $params->opcao_entrada_origem_id)
->where('opcao_entrada.modulo_id', $params->modulo_id)
)
->select(
'centro_custo.id',
'setor.nome AS setor_nome'
)
->orderBy('setor.nome')
->get();
}
private static function getOpcoesEntradaEncaminhamento($params)
{
return DB::table('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->where('opcao_entrada_destino.opcao_entrada_origem_id', $params->opcao_entrada_origem_id)
->where('opcao_entrada.modulo_id', $params->modulo_id)
->where('opcao_entrada.centro_custo_id', $params->centro_custo_id)
->select(
'opcao_entrada.id',
'opcao_entrada.nome',
'opcao_entrada.prioridade_obrigatoria'
)
->orderBy('opcao_entrada.nome')
->get();
}
public static function store()
{
self::validateStore();
$centroCusto = self::getCurrentCentroCusto();
$senha = (
Fila::where('opcao_entrada_id', request()->opcao_entrada_id)
->whereRaw('emitido_em = CURRENT_DATE')
->max('senha') ?? 0
) + 1;
$fila = Fila::create([
'paciente_id' => request()->paciente_id,
'centro_custo_id' => $centroCusto->id,
'opcao_entrada_id' => request()->opcao_entrada_id,
'prioridade_id' => request()->prioridade_id,
'status_id' => Status::EM_ESPERA,
'senha' => $senha,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
return $fila;
}
public static function edit($id)
{
$fila = Fila::findOrFail($id);
return [
'form' => [
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
],
'model' => [
'id' => $fila->id,
'paciente' => $fila->paciente ? [
'id' => $fila->paciente->id,
'nome' => $fila->paciente->cidadao->nome,
'cns' => $fila->paciente->cidadao->cns,
] : null,
'opcao_entrada_id' => $fila->opcao_entrada_id,
'prioridade_id' => $fila->prioridade_id,
],
];
}
public static function update($id)
{
self::validateUpdate();
$fila = Fila::findOrFail($id);
$fila->update([
'paciente_id' => request()->paciente_id,
'prioridade_id' => request()->prioridade_id,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
return $fila->fresh();
}
public static function list()
{
return [
'additionals' => [
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
],
'form' => [
'tempos_espera' => self::getTemposEspera(),
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
'status' => self::getStatus(),
'salas' => self::getSalas(),
'telas' => self::getTelas(),
],
'model' => [
'tempo_espera_id' => null,
'opcao_entrada_id' => null,
'prioridade_id' => null,
'status_id' => Status::EM_ESPERA,
'fila' => self::index(),
],
];
}
public static function autocompletePaciente()
{
return DB::table('cadastro_paciente')
->select([
'cadastro_paciente.id',
'cadastro_cidadao.nome',
'cadastro_cidadao.cns',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id');
}
public static function evade($id)
{
$fila = Fila::findOrFail($id);
self::validateEvade();
$fila->update([
'evadido' => true,
'motivo_evasao' => request()->motivo,
'motivo_cancelamento_evasao' => null,
'finalizado' => true,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function answer($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['status_id' => Status::EM_ATENDIMENTO]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function sendBack($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['status_id' => Status::EM_ESPERA]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function forward($id)
{
$fila = Fila::findOrFail($id);
self::validateForward();
$opcaoEntradaFrom = $fila->opcaoEntradaAtual;
$centroCustoFrom = CentroCusto::findOrFail($fila->centro_custo_id);
$opcaoEntradaTo = OpcaoEntrada::findOrFail(request()->opcao_entrada_encaminhamento_id);
$centroCustoTo = $opcaoEntradaTo->centroCusto;
$fila->update([
'centro_custo_id' => $centroCustoTo->id,
'opcao_entrada_destino_id' => $opcaoEntradaTo->id,
'prioridade_id' => request()->prioridade_id,
'status_id' => Status::EM_ESPERA,
]);
self::dispatch($opcaoEntradaFrom->id, $centroCustoFrom->id);
if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::PAINEL_SENHA)) {
PainelSenhaFilaAtendimentoService::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
else if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::FARMACIA)) {
FarmaciaFilaAtendimentoService::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
else if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::IMUNIZACAO)) {
self::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
}
public static function finalize($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['finalizado' => true]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function dispatch($opcaoEntradaId, $centroCustoId)
{
$centroCusto = CentroCusto::findOrFail($centroCustoId);
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::IMUNIZACAO,
self::index($centroCusto)
);
CentroCustoCompartilhado::where('opcao_entrada_id', $opcaoEntradaId)
->get()
->each(function ($item) {
$centroCusto = CentroCusto::findOrFail($item->centro_custo_id);
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::IMUNIZACAO,
self::index($centroCusto)
);
});
CentroCustoCompartilhado::query()
->join(
'painel_senha_opcao_entrada',
'painel_senha_opcao_entrada.id',
'painel_senha_centro_custo_compartilhado.opcao_entrada_id'
)
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCustoId)
->whereNull('painel_senha_opcao_entrada.deleted_at')
->get()
->each(function ($item) {
$centroCusto = OpcaoEntrada::findOrFail($item->opcao_entrada_id)->centroCusto;
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::IMUNIZACAO,
self::index($centroCusto)
);
});
}
private static function validateStore()
{
request()->validate([
'paciente_id' => [
'required',
'integer',
Rule::exists(Paciente::class, 'id'),
],
'opcao_entrada_id' => [
'required',
'integer',
Rule::exists(OpcaoEntrada::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateUpdate()
{
request()->validate([
'paciente_id' => [
'required',
'integer',
Rule::exists(Paciente::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateForward()
{
request()->validate([
'opcao_entrada_encaminhamento_id' => [
'required',
'integer',
Rule::exists(OpcaoEntrada::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_encaminhamento_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateEvade()
{
request()->validate([
'motivo' => [
'nullable',
'string',
'max:500',
],
]);
}
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',
'imunizacao_sala_vacinacao.cria_ficha_ab'
])
->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 getTempoEspera($filaId)
{
$tempoEsperaTotal = DB::table('painel_senha_fila_historico')
->select([
'painel_senha_fila_historico.created_at',
'painel_senha_fila_historico.status_id',
])
->where('painel_senha_fila_historico.fila_id', $filaId)
->distinct()
->get()
->reduce(function ($count, $query) use ($filaId) {
if ($query->status_id === Status::EM_ESPERA) {
$proximo = DB::table('painel_senha_fila_historico')
->where('fila_id', $filaId)
->where('created_at', '>', $query->created_at)
->select('created_at')
->first();
return $count + Carbon::create($query->created_at)->diffInMinutes($proximo->created_at ?? Carbon::now());
}
return $count;
}, 1);
$centroCustoLogado = self::getCurrentCentroCusto();
$tempoEspera = DB::table('painel_senha_tempo_espera')
->select(
'id',
'cor'
)
->whereNull('deleted_at')
->where('tempo', '<=', $tempoEsperaTotal)
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
->orderByDesc('tempo')
->first();
if (is_null($tempoEspera)) {
$tempoEspera = DB::table('painel_senha_tempo_espera')
->select(
'id',
'cor'
)
->whereNull('deleted_at')
->where('tempo', '>=', $tempoEsperaTotal)
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
->orderBy('tempo')
->first();
}
$tempoEsperaTotal = Carbon::now()->subMinutes($tempoEsperaTotal)->diff(Carbon::now());
return [
'id' => $tempoEspera->id ?? null,
'cor' => $tempoEspera->cor ?? null,
'total' => [
'dias' => (int) $tempoEsperaTotal->format('%d') > 0 ? (int) $tempoEsperaTotal->format('%d') : null,
'horas' => (int) $tempoEsperaTotal->format('%h') ?? null,
'minutos' => (int) $tempoEsperaTotal->format('%i') ?? null,
],
];
}
private static function getTemposEspera()
{
return DB::table('painel_senha_tempo_espera')
->select([
'painel_senha_tempo_espera.id',
DB::raw("CONCAT(painel_senha_tempo_espera.tempo, ' MINUTO(S)') AS minutos"),
])
->whereNull('painel_senha_tempo_espera.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('cadastro_infraestrutura')
->whereNull('cadastro_infraestrutura.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('cadastro_centro_custo')
->whereNull('cadastro_centro_custo.deleted_at')
->where('cadastro_centro_custo.id', self::getCurrentCentroCusto()->id)
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
)
->whereColumn('cadastro_infraestrutura.id', 'painel_senha_tempo_espera.infraestrutura_id')
)
->orderBy('painel_senha_tempo_espera.tempo')
->get();
}
private static function getOpcoesEntrada()
{
$centroCusto = self::getCurrentCentroCusto();
return DB::table('painel_senha_opcao_entrada')
->select([
'painel_senha_opcao_entrada.id',
'painel_senha_opcao_entrada.nome',
'painel_senha_opcao_entrada.prioridade_obrigatoria',
])
->whereNull('painel_senha_opcao_entrada.deleted_at')
->where('painel_senha_opcao_entrada.modulo_id', ModuloService::getId(Modulo::IMUNIZACAO))
->where(fn ($q) => $q->where('painel_senha_opcao_entrada.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada.id')
)
)
->orderBy('painel_senha_opcao_entrada.nome')
->get();
}
private static function getPrioridades()
{
return DB::table('painel_senha_prioridade')
->select([
'painel_senha_prioridade.id',
'painel_senha_prioridade.nome',
])
->orderBy('painel_senha_prioridade.nome')
->get();
}
private static function getStatus()
{
return DB::table('painel_senha_status')
->select([
'id',
'nome',
])
->orderBy('painel_senha_status.nome')
->get();
}
private static function getSalas()
{
return DB::table('cadastro_sala')
->select([
'cadastro_sala.id',
'cadastro_sala.nome',
])
->whereNull('cadastro_sala.deleted_at')
->where('centro_custo_id', self::getCurrentCentroCusto()->id)
->orderBy('cadastro_sala.nome')
->get();
}
private static function getTelas()
{
return DB::table('painel_senha_tela')
->select([
'painel_senha_tela.id',
'painel_senha_tela.nome',
])
->whereNull('painel_senha_tela.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_opcao_chamada')
->whereNull('painel_senha_opcao_chamada.deleted_at')
->where('painel_senha_opcao_chamada.centro_custo_id', self::getCurrentCentroCusto()->id)
->whereColumn('painel_senha_opcao_chamada.tela_id', 'painel_senha_tela.id')
)
->orderBy('painel_senha_tela.nome')
->get();
}
}

View File

@@ -0,0 +1,226 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Models\Imunizacao\ParametrizacaoOcupacao;
use App\Models\Imunizacao\ParametrizacaoSupervisor;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class ParametrizacaoService extends Service
{
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
$parametrizacao = null;
DB::transaction(function() use ($request, &$parametrizacao) {
$parametrizacao = Parametrizacao::first();
if (is_null($parametrizacao)) {
$parametrizacao = Parametrizacao::create($request->all())->fresh();
} else {
$parametrizacao = $parametrizacao->update($request->all());
}
ParametrizacaoOcupacao::truncate();
foreach($request['ocupacoes'] as $ocupacao) {
ParametrizacaoOcupacao::create(['ocupacao_id' => $ocupacao['ocupacao_id']]);
}
ParametrizacaoSupervisor::truncate();
foreach($request['supervisores'] as $supervisor) {
ParametrizacaoSupervisor::create([
'usuario_id' => $supervisor['usuario_id'],
'sala_vacinacao_id' => $supervisor['sala_vacinacao_id'],
]);
}
});
return $parametrizacao;
}
public static function list()
{
switch (request()->get('listar')) {
case 'salas_vacinacao':
return self::getSalasVacinacao(request()->get('unidade_id'));
break;
default:
return [];
break;
}
}
private static function validate($request)
{
return $request->validate([
'parametrizacao_descricao_vacina_id' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\ParametrizacaoDescricaoVacina,id',
],
'perfil_campanha' => [
'required',
'boolean',
],
'usa_ultimo_frasco' => [
'required',
'boolean',
],
'cns_cpf_obrigatorio' => [
'required',
'boolean',
],
'aprazamento_dias_antes' => [
'required_if:aprazamento_ativo,true',
'nullable',
'integer',
$request['aprazamento_dias_depois'] == 0 ? 'min:1' : 'min:0',
'max:365',
],
'aprazamento_dias_depois' => [
'required_if:aprazamento_ativo,true',
'nullable',
'integer',
$request['aprazamento_dias_antes'] == 0 ? 'min:1' : 'min:0',
'max:365',
],
'aprazamento_ativo' => [
'required',
'boolean',
],
'ocupacoes' => [
'nullable',
'array',
],
'ocupacoes.*.ocupacao_id' => [
'required',
'integer',
'exists:\App\Models\Sigtap\Ocupacao,id',
],
]);
}
private static function getParametrizacaoDescricoesVacina()
{
return DB::table('imunizacao_parametrizacao_descricao_vacina')
->select([
'id',
'nome',
])
->orderBy('nome')
->get();
}
private static function getUnidades()
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->whereExists(function($query) {
$query->select(DB::raw(1))
->from('cadastro_infraestrutura')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->where('imunizacao_sala_vacinacao.ativo', true);
})
->orderBy('cadastro_unidade.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"),
])
->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('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 getOcupacoes()
{
return DB::table('imunizacao_parametrizacao_ocupacao')
->select([
'ocupacao.id',
'ocupacao.codigo',
'ocupacao.nome',
])
->join('sigtap.ocupacao', 'ocupacao.id', 'imunizacao_parametrizacao_ocupacao.ocupacao_id')
->get();
}
private static function getSupervisores()
{
return DB::table('imunizacao_parametrizacao_supervisor')
->select([
'cadastro_usuario.id AS usuario_id',
'cadastro_cidadao.nome AS usuario_nome',
'cadastro_unidade.id AS unidade_id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS sala_vacinacao_nome"),
])
->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_parametrizacao_supervisor.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_parametrizacao_supervisor.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->get();
}
private static function getFormData()
{
return [
'parametrizacao_descricoes_vacina' => self::getParametrizacaoDescricoesVacina(),
'unidades' => self::getUnidades(),
'salas_vacinacao' => [],
];
}
private static function getModelData()
{
$parametrizacao = Parametrizacao::first();
$ocupacoes = self::getOcupacoes();
$supervisores = self::getSupervisores();
return [
'parametrizacao_descricao_vacina_id' => $parametrizacao->parametrizacao_descricao_vacina_id ?? ParametrizacaoDescricaoVacina::DESCRICAO,
'perfil_campanha' => $parametrizacao->perfil_campanha ?? false,
'usa_ultimo_frasco' => $parametrizacao->usa_ultimo_frasco ?? false,
'cns_cpf_obrigatorio' => $parametrizacao->cns_cpf_obrigatorio ?? false,
'aprazamento_dias_antes' => $parametrizacao->aprazamento_dias_antes ?? null,
'aprazamento_dias_depois' => $parametrizacao->aprazamento_dias_depois ?? null,
'aprazamento_ativo' => $parametrizacao->aprazamento_ativo ?? false,
'aplicacao_data_retroativa' => $parametrizacao->aplicacao_data_retroativa ?? false,
'cadastro_outro_municipio' => $parametrizacao->cadastro_outro_municipio ?? false,
'cadastro_provisorio' => $parametrizacao->cadastro_provisorio ?? false,
'cadastro_bloqueado' => $parametrizacao->cadastro_bloqueado ?? false,
'cadastro_desatualizado' => $parametrizacao->cadastro_desatualizado ?? false,
'ocupacoes' => $ocupacoes ?? [],
'supervisores' => $supervisores ?? [],
];
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,169 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Cadastro\Vacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Models\Imunizacao\RegistroAplicacao;
use App\Models\Imunizacao\RegistroAtualizacao;
use App\Models\Imunizacao\SalaVacinacao;
use App\Services\Service;
use Carbon\Carbon;
class RelatorioConsolidadoAplicacaoService extends Service
{
public static function index()
{
return [
'model' => [
'periodo' => [
'start' => null,
'end' => null
],
'sala_vacinacao_id' => null,
'vacina_id' => null,
'dados_campanha' => 1
],
'form' => [
'salas_vacinacao' => [],
'vacinas' => [],
'dados_campanha' => [
[
'id' => 1,
'descricao' => 'Sim',
],
[
'id' => 2,
'descricao' => 'Não',
]
],
]
];
}
public static function getSalasVacinacao()
{
return RegistroAplicacao::with('saidaVacina.saida.salaVacinacao.infraestrutura.unidade')
->where('data_aplicacao', '>=', request()->data_inicial)
->where('data_aplicacao', '<=', request()->data_final)
->has('saidaVacina.saida')
->get()
->unique('saidaVacina.saida.sala_vacinacao_id')
->map(function($query) {
return [
'id' => $query->saidaVacina->saida->sala_vacinacao_id,
'nome_fantasia' => $query->saidaVacina->saida->salaVacinacao->infraestrutura->unidade->nome_fantasia
];
})
->sortBy('nome_fantasia')
->values()
->all();
}
public static function getVacinas()
{
return RegistroAplicacao::with('saidaVacina.vacina')
->where('data_aplicacao', '>=', request()->data_inicial)
->where('data_aplicacao', '<=', request()->data_final)
->when(request()->sala_vacinacao_id, fn($q) => $q->whereHas('saidaVacina.saida', fn($q) => $q->where('sala_vacinacao_id', request()->sala_vacinacao_id)))
->has('saidaVacina')
->get()
->unique('saidaVacina.vacina_id')
->map(function($query) {
return [
'id' => $query->saidaVacina->vacina_id,
'nome' => self::getParametrizacaoDescricaoVacina($query->saidaVacina->vacina)
];
})
->sortBy('nome')
->values()
->all();
}
public static function list()
{
$registros = [];
$totais = [];
$total = 0;
RegistroAplicacao::with([
'saidaVacina.saida.salaVacinacao.infraestrutura.unidade',
'saidaVacina.vacina',
])
->where('data_aplicacao', '>=', request()->data_inicial)
->where('data_aplicacao', '<=', request()->data_final)
->when(request()->sala_vacinacao_id, fn($q) => $q->whereHas('saidaVacina.saida', fn($q) => $q->where('sala_vacinacao_id', request()->sala_vacinacao_id)))
->when(request()->vacina_id, fn($q) => $q->whereHas('saidaVacina.vacina', fn($q) => $q->where('vacina_id', request()->vacina_id)))
->when(request()->dados_campanha == 2, fn($q) => $q->whereNull('campanha_id'))
->has('saidaVacina')
->get()
->groupBy('saidaVacina.saida.sala_vacinacao_id')
->each(function($query) use(&$registros, &$totais, &$total) {
$query->groupBy('saidaVacina.vacina_id')->each(function($query) use(&$registros) {
$registros[] = [
'sala_vacinacao' => $query[0]->saidaVacina->saida->salaVacinacao->infraestrutura->unidade->nome_fantasia,
'vacina' => self::getParametrizacaoDescricaoVacina($query[0]->saidaVacina->vacina),
'doses' => $query->sum('saidaVacina.quantidade')
];
});
$sum = $query->sum('saidaVacina.quantidade');
$totais[] = [
'sala_vacinacao' => $query[0]->saidaVacina->saida->salaVacinacao->infraestrutura->unidade->nome_fantasia,
'doses' => $sum
];
$total += $sum;
});
return [
'registros' => $registros,
'totais' => $totais,
'total' => $total
];
}
public static function getPrintData()
{
$sala_vacinacao = SalaVacinacao::find(request()->sala_vacinacao_id);
$registros = self::list();
return [
'data_inicial' => Carbon::parse(request()->data_inicial)->format('d/m/Y'),
'data_final' => Carbon::parse(request()->data_final)->format('d/m/Y'),
'sala_vacinacao' => $sala_vacinacao ? $sala_vacinacao->infraestrutura->unidade->nome_fantasia : 'TODAS',
'vacina' => Vacina::find(request()->vacina_id)->nome ?? 'TODAS',
'dados_campanha' => request()->dados_campanha == 1 ? 'SIM' : 'NÃO',
'rows' => $registros['registros'],
'totais' => $registros['totais'],
'total' => $registros['total']
];
}
private static function getParametrizacaoDescricaoVacina($vacina)
{
$parametrizacao = Parametrizacao::first();
if($parametrizacao && $parametrizacao->parametrizacao_descricao_vacina_id) {
switch($parametrizacao->parametrizacao_descricao_vacina_id) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
return $vacina->nome;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
return $vacina->abreviacao;
case ParametrizacaoDescricaoVacina::SIGLA:
return $vacina->sigla;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
return "$vacina->sigla - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
return "$vacina->sigla - $vacina->abreviacao";
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->abreviacao - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->sigla - $vacina->abreviacao - $vacina->nome";
default:
return $vacina->nome;
}
}
return $vacina->nome;
}
}

View File

@@ -0,0 +1,816 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Enums\Imunizacao\PreferenciaCampanha;
use App\Enums\Imunizacao\TipoRegistro;
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
use App\Models\Imunizacao\RegistroAplicacao;
use App\Models\Imunizacao\RegistroAtualizacao;
use App\Models\Imunizacao\SalaVacinacao;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class RelatorioDeAplicacaoService extends Service
{
public static function index() {
$salaVacinacao = DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->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();
$dataAtual = Carbon::today()->format('d/m/Y');
return [
"sala_vacinacao" => $salaVacinacao,
"data_atual" => $dataAtual
];
}
public static function search() {
$params = request()->all();
$existeFaixaEtariaInicial = false;
$existeFaixaEtariaFinal = false;
$preferenciaCampanha = $params['campanha'];
$tipoRegistro = $params['tipo_registro'];
$totalizadores = [
"aplicacao" => 0,
"atualizacao" => 0,
];
$registrosAplicacao = [];
$registrosAtualizacao = [];
$registrosCampanha = [];
$registros = [];
$parametrizacaoVacina = DB::table('imunizacao_parametrizacao')
->select('parametrizacao_descricao_vacina_id')
->first();
$rowVacina = self::formataDescricaoVacina($parametrizacaoVacina->parametrizacao_descricao_vacina_id, 'cadastro_vacina', 'vacina');
$queryAplicacao = self::getQuerySearchAplicacao($rowVacina, $params);
$queryCampanha = self::getQuerySearchCampanha($rowVacina, $params);
$queryAtualizacao = self::getQuerySearchAtualizacao($rowVacina, $params);
if($preferenciaCampanha != PreferenciaCampanha::NAO_INCLUIR) {
$registrosCampanha = $queryCampanha->get();
}
if($preferenciaCampanha != PreferenciaCampanha::MOSTRAR_EXCLUSIVAMENTE){
if($tipoRegistro != TipoRegistro::ATUALIZACAO) {
$registrosAplicacao = $queryAplicacao->get();
}
if($tipoRegistro != TipoRegistro::APLICACAO) {
$registrosAtualizacao = $queryAtualizacao->get();
}
}
$registros = [...$registrosCampanha, ...$registrosAplicacao, ...$registrosAtualizacao];
if($registros instanceof Collection && $registros->isEmpty()){
return [];
}
foreach ($params['faixa_etaria'] as $key => $faixas) {
foreach ($faixas as $_ => $faixa) {
if(isset($faixa)){
if($key == 'inicial'){
$existeFaixaEtariaInicial = true;
}
if($key == 'final'){
$existeFaixaEtariaFinal = true;
}
}
}
}
foreach ($registros as $key => $registro) {
$data = Carbon::createFromFormat('d/m/Y', $registro->data);
$idade = Carbon::createFromFormat('d/m/Y', $registro->idade);
$idadeEpoca = $data->diff($idade);
$registro->idade = "{$idadeEpoca->y}a {$idadeEpoca->m}m {$idadeEpoca->d}d";
if($existeFaixaEtariaInicial) {
$excluirFaixaInicial = self::vefificaFaixaInicial($params, $idadeEpoca);
if($excluirFaixaInicial){
unset($registros[$key]);
continue;
}
}
if($existeFaixaEtariaFinal) {
$excluirFaixaFinal = self::verificaFaixaFinal($params, $idadeEpoca);
if($excluirFaixaFinal){
unset($registros[$key]);
continue;
}
}
}
foreach ($registros as $registro) {
if($registro->registro === "Aplicação"){
$totalizadores['aplicacao']++;
}
if($registro->registro === "Atualização"){
$totalizadores['atualizacao']++;
}
$totalizadores['paciente'][$registro->paciente_id] = $registro->paciente_id;
$totalizadores['unidade'][$registro->unidade_id] = $registro->unidade_id;
$totalizadores['sala'][$registro->sala_id] = $registro->sala_id;
$totalizadores['vacina'][$registro->vacina] = $registro->vacina;
}
$totalizadores['paciente'] = isset($totalizadores['paciente']) ? count($totalizadores['paciente']) : 0;
$totalizadores['unidade'] = isset($totalizadores['unidade']) ? count($totalizadores['unidade']) : 0;
$totalizadores['sala'] = isset($totalizadores['sala']) ? count($totalizadores['sala']) : 0;
$totalizadores['vacina'] = isset($totalizadores['vacina']) ? count($totalizadores['vacina']) : 0;
return([
"registros" =>[...$registros],
"totalizadores" => $totalizadores
]);
}
private static function getQuerySearchCampanha($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_aplicacao')
->whereNotNull('imunizacao_registro_aplicacao.saida_vacina_id')
->whereNotNull('imunizacao_registro_aplicacao.campanha_id')
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_aplicacao.id as registro_aplicacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_entrada_vacina.lote as lote',
'imunizacao_dose.nome as dose',
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
DB::raw('DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, "%d/%m/%Y") AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, "%d/%m/%Y") AS data'),
DB::raw('"Aplicação" AS registro'),
'imunizacao_estrategia.nome as estrategia',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
'imunizacao_campanha.nome as campanha',
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->join('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->join('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->join('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_id')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_saida.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->leftJoin('cadastro_unidade as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_saida_vacina.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aplicacao.dose_id')
->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_aplicacao.estrategia_id')
->join('imunizacao_campanha', 'imunizacao_campanha.id', 'imunizacao_registro_aplicacao.campanha_id');
}
private static function getQuerySearchAplicacao($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_aplicacao')
->whereNotNull('imunizacao_registro_aplicacao.entrada_vacina_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_aplicacao.id as registro_aplicacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_entrada_vacina.lote as lote',
'imunizacao_dose.nome as dose',
DB::raw('DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, "%d/%m/%Y") AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, "%d/%m/%Y") AS data'),
DB::raw('"Aplicação" AS registro'),
'imunizacao_estrategia.nome as estrategia',
DB::raw('"-" AS campanha'),
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aplicacao.dose_id')
->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_aplicacao.estrategia_id')
->leftJoin('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_aplicacao.aplicador_id')
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->leftJoin('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->groupBy('imunizacao_registro_aplicacao.id');
}
private static function getQuerySearchAtualizacao($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_atualizacao')
->whereBetween('data_atualizacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_atualizacao.id as registro_atualizacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_registro_atualizacao.lote as lote',
'imunizacao_dose.nome as dose',
DB::raw('"-" AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, "%d/%m/%Y") AS data'),
DB::raw('"Atualização" AS registro'),
DB::raw('"-" AS campanha'),
'imunizacao_estrategia.nome as estrategia',
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->leftJoin('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_atualizacao.aplicador_id')
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->leftJoin('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_atualizacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_atualizacao.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_atualizacao.dose_id')
->leftJoin('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_atualizacao.estrategia_id')
->groupBy('imunizacao_registro_atualizacao.id');
}
private static function vefificaFaixaInicial($params, $idadeEpoca) {
$anosIniciais = $params['faixa_etaria']['inicial']['anos'];
$mesesIniciais = $params['faixa_etaria']['inicial']['meses'];
$diasIniciais = $params['faixa_etaria']['inicial']['dias'];
// Verifica anos
if (isset($anosIniciais) && $idadeEpoca->y < $anosIniciais) {
return true;
}
// Verifica meses quando os anos não estão definidos
if (!isset($anosIniciais) && isset($mesesIniciais) && (($idadeEpoca->y * 12 + $idadeEpoca->m) < $mesesIniciais)) {
return true;
}
// Verifica meses quando anos e meses estão definidos
if ((isset($anosIniciais) && isset($mesesIniciais)) && ($idadeEpoca->y == $anosIniciais && $idadeEpoca->m < $mesesIniciais)) {
return true;
}
// Verifica dias quando anos, meses e dias estão definidos
if ((isset($anosIniciais) && isset($mesesIniciais) && isset($diasIniciais)) &&
($idadeEpoca->y == $anosIniciais && $idadeEpoca->m == $mesesIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando apenas anos estão definidos
if (isset($anosIniciais) && !isset($mesesIniciais) && isset($diasIniciais) &&
($idadeEpoca->y == $anosIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando apenas meses estão definidos
if (!isset($anosIniciais) && isset($mesesIniciais) && isset($diasIniciais) &&
($idadeEpoca->m == $mesesIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando nem anos nem meses estão definidos
if (!isset($anosIniciais) && !isset($mesesIniciais) && isset($diasIniciais) &&
$idadeEpoca->d < $diasIniciais) {
return true;
}
return false;
}
private static function verificaFaixaFinal($params, $idadeEpoca){
$anosFinais = $params['faixa_etaria']['final']['anos'];
$mesesFinais = $params['faixa_etaria']['final']['meses'];
$diasFinais = $params['faixa_etaria']['final']['dias'];
if(!isset($anosFinais) && $idadeEpoca->y > 0){
return true;
}
if((!isset($anosFinais) && $idadeEpoca->y > 0) && (!isset($mesesFinais) && $idadeEpoca->m > 0)){
return true;
}
if (isset($anosFinais) && $idadeEpoca->y > $anosFinais) {
return true;
}
// Verifica meses finais quando os anos não estão definidos
if (!isset($anosFinais) && isset($mesesFinais) && (($idadeEpoca->y * 12 + $idadeEpoca->m) > $mesesFinais)) {
return true;
}
// Verifica meses finais quando anos e meses estão definidos
if ((isset($anosFinais) && isset($mesesFinais)) && ($idadeEpoca->y == $anosFinais && $idadeEpoca->m > $mesesFinais)) {
return true;
}
// Verifica dias finais quando anos, meses e dias estão definidos
if ((isset($anosFinais) && isset($mesesFinais) && isset($diasFinais)) &&
($idadeEpoca->y == $anosFinais && $idadeEpoca->m == $mesesFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando apenas anos estão definidos
if (isset($anosFinais) && !isset($mesesFinais) && isset($diasFinais) &&
($idadeEpoca->y == $anosFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando apenas meses estão definidos
if (!isset($anosFinais) && isset($mesesFinais) && isset($diasFinais) &&
($idadeEpoca->m == $mesesFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando nem anos nem meses estão definidos
if (!isset($anosFinais) && !isset($mesesFinais) && isset($diasFinais) &&
$idadeEpoca->d > $diasFinais) {
return true;
}
return false;
}
public static function list() {
$params = request()->all();
$tipoListagem = $params['listar'];
switch ($tipoListagem) {
case 'salaVacinacao':
return self::getSalasVacinacao($params);
case 'vacina':
return self::getVacinas($params);
case 'dose':
return self::getDoses($params);
case 'unidade':
return self::getUnidades($params);
case 'classificacao':
return self::getClassificacoes();
case 'equipe':
return self::getEquipes($params);
default:
return response()->json(["error" => "Informe o tipo de listagem através do listar"], Response::HTTP_NOT_ACCEPTABLE);
}
}
private static function getSalasVacinacao($params) {
$ids = self::getIdsPorQueries('sala', $params);
return SalaVacinacao::whereIn('id', $ids)
->with('infraestrutura')
->get()
->map(fn($item) => [
'id' => $item->id,
'nome' => $item->infraestrutura->nome
]);
}
private static function getVacinas($params) {
$ids = self::getIdsPorQueries('vacina', $params);
$parametrizacaoVacina = DB::table('imunizacao_parametrizacao')
->select('parametrizacao_descricao_vacina_id')
->first();
return DB::table('cadastro_vacina')
->whereIn('id', $ids)
->select(
'id',
self::formataDescricaoVacina($parametrizacaoVacina->parametrizacao_descricao_vacina_id, 'cadastro_vacina', 'nome'),
)
->get();
}
private static function formataDescricaoVacina($descricaoVacina, $tabela, $apelidoCampo) {
$formato = '';
switch ($descricaoVacina) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
$formato = "{$tabela}.nome as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
$formato = "{$tabela}.abreviacao as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA:
$formato = "{$tabela}.sigla as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.abreviacao) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
$formato = "CONCAT({$tabela}.abreviacao, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.abreviacao, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
}
return DB::raw($formato);
}
private static function getDoses($params) {
$ids = self::getIdsPorQueries('dose', $params);
return DB::table('imunizacao_dose')
->whereIn('id', $ids)
->select('id', 'nome')
->get();
}
private static function getUnidades($params) {
$ids = self::getIdsPorQueries('unidade', $params);
return DB::table('cadastro_unidade')
->whereIn('id', $ids)
->select('id', 'nome_fantasia as nome')
->get();
}
private static function getClassificacoes() {
return DB::table('cadastro_paciente_classificacao')
->select('id', 'descricao as nome')
->get();
}
private static function getEquipes($params) {
$ids = self::getIdsPorQueries('equipe', $params);
$equipesIds = DB::table('atencao_basica_parametrizacao_equipe_usuario')
->select('equipe_id')
->whereIn('usuario_id', $ids)
->get()
->pluck('equipe_id', 'equipe_id')
->filter();
return Equipe::whereIn('id', $equipesIds)
->with(['area', 'microarea', 'unidade'])
->get()
->map(fn ($item) => [
'area' => [
"nome" => $item->area->descricao . ' - ' . $item->unidade->nome_fantasia,
"valor" => $item->area->descricao
],
'microarea' => $item->microarea ? $item->microarea->descricao : null,
])
->filter(fn ($item) => isset($item['microarea']));
}
private static function getQueryAplicacao($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAplicacao::whereNotNull('entrada_vacina_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query->with(['entradaVacina.entrada']);
break;
case 'vacina':
$query->with(['entradaVacina', 'entradaVacina.entrada'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->with(['entradaVacina', 'entradaVacina.entrada'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['entradaVacina', 'entradaVacina.entrada', 'paciente', 'paciente.cidadao'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'));
break;
case 'equipe':
$query->with(['entradaVacina', 'entradaVacina.entrada', 'paciente', 'paciente.cidadao'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'))
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getQueryCampanha($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAplicacao::whereNotNull('saida_vacina_id')
->whereNotNull('campanha_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query->with(['saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'vacina':
$query->with(['saidaVacina', 'saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->with(['saidaVacina', 'saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['saidaVacina', 'saidaVacina.saida', 'paciente', 'paciente.cidadao'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'));
break;
case 'equipe':
$query->with(['saidaVacina', 'saidaVacina.saida', 'paciente', 'paciente.cidadao'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'))
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getQueryAtualizacao($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAtualizacao::whereBetween('data_atualizacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query;
break;
case 'vacina':
$query->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['paciente', 'paciente.cidadao'])
->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q);
break;
case 'equipe':
$query->with(['paciente.cidadao'])
->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset ($vacina) ? $q->where('vacina_id', $vacina) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getIdsPorQueries($tipoConsulta, $params) {
$preferenciaCampanha = $params['campanha'];
$tipoRegistro = $params['tipo_registro'];
$idsAplicacao = [];
$idsAtualizacao = [];
$idsCampanha = [];
$queryAplicacao = self::getQueryAplicacao($tipoConsulta, $params);
$queryCampanha = self::getQueryCampanha($tipoConsulta, $params);
$queryAtualizacao = self::getQueryAtualizacao($tipoConsulta, $params);
$campoCampanha = '';
$campoAplicacao = '';
$campoAtualizacao = '';
switch ($tipoConsulta) {
case 'sala':
$campoCampanha = 'saidaVacina.saida.sala_vacinacao_id';
$campoAplicacao = 'entradaVacina.entrada.sala_vacinacao_id';
$campoAtualizacao = 'sala_vacinacao_id';
break;
case 'vacina':
$campoCampanha = 'saidaVacina.vacina_id';
$campoAplicacao = 'entradaVacina.vacina_id';
$campoAtualizacao = 'vacina_id';
break;
case 'dose':
$campoCampanha = 'dose_id';
$campoAplicacao = 'dose_id';
$campoAtualizacao = 'dose_id';
break;
case 'unidade':
$campoCampanha = 'paciente.unidade_id';
$campoAplicacao = 'paciente.unidade_id';
$campoAtualizacao = 'paciente.unidade_id';
break;
case 'equipe':
$campoCampanha = 'aplicador_id';
$campoAplicacao = 'aplicador_id';
$campoAtualizacao = 'aplicador_id';
break;
}
if($preferenciaCampanha != PreferenciaCampanha::NAO_INCLUIR) {
$idsCampanha = $queryCampanha->get()->pluck($campoCampanha, $campoCampanha)->filter();
}
if($preferenciaCampanha != PreferenciaCampanha::MOSTRAR_EXCLUSIVAMENTE){
if($tipoRegistro != TipoRegistro::ATUALIZACAO) {
$idsAplicacao = $queryAplicacao->get()->pluck($campoAplicacao, $campoAplicacao)->filter();
}
if($tipoRegistro != TipoRegistro::APLICACAO) {
$idsAtualizacao = $queryAtualizacao->get()->pluck($campoAtualizacao, $campoAtualizacao)->filter();
}
}
return [...$idsCampanha, ...$idsAplicacao, ...$idsAtualizacao];
}
}

View File

@@ -0,0 +1,307 @@
<?php
namespace App\Services\Imunizacao;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Vacina;
use App\Services\Cadastro\VacinaService;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioFaltosoAprazamentoService extends Service
{
public static function index()
{
$params = self::getParams();
$aprazamentosBuilder = DB::table('imunizacao_registro_aprazamento AS aprazamento')
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
->join('cadastro_vacina AS vacina', 'vacina.id', 'aprazamento.vacina_id')
->whereNull('aprazamento.registro_aplicacao_id')
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(isset($params->idade['de']), fn ($q) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}")
)
->when(isset($params->idade['ate']), fn ($q) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}")
)
->when($params->vacina_id, fn ($q, $id) => $q->where('aprazamento.vacina_id', $id))
->select(
'unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS infraestrutura_nome"),
'cidadao.nome AS paciente_nome',
'cidadao.data_nascimento AS paciente_data_nascimento',
DB::raw("LPAD(paciente.prontuario, 7, '0') AS paciente_prontuario"),
DB::raw(VacinaService::getDescricaoRaw() . ' AS vacina_descricao'),
'aprazamento.data_aprazamento'
);
self::setOrderBy($aprazamentosBuilder);
$aprazamentos = $aprazamentosBuilder->get();
return compact('aprazamentos');
}
private static function setOrderBy($builder)
{
if (is_null(request()->sortBy)) {
$builder->orderBy('aprazamento.id');
return;
}
$columns = [
'unidade_nome_fantasia' => 'unidade.nome_fantasia',
'infraestrutura_nome' => "COALESCE(infraestrutura.nome, unidade.nome_fantasia)",
'paciente_nome' => 'cidadao.nome',
'paciente_data_nascimento' => 'cidadao.data_nascimento',
'paciente_prontuario' => "LPAD(paciente.prontuario, 7, '0')",
'vacina_descricao' => DB::raw(VacinaService::getDescricaoRaw()),
'data_aprazamento' => 'aprazamento.data_aprazamento',
];
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
$builder->orderByRaw("{$column} {$direction}, aprazamento.id");
}
public static function list()
{
$data = (object) [
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'periodo' => function () use ($data, $params) {
$data->model['periodo'] = ['start' => null, 'end' => null];
$params->periodo = $data->model['periodo'];
},
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $unidadesData['model'];
$params->unidade_id = $data->model['unidade_id'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
$params->infraestrutura_id = $data->model['infraestrutura_id'];
},
'idade' => function () use ($data, $params) {
$data->model['idade'] = ['de' => null, 'ate' => null];
$params->idade = $data->model['idade'];
},
'vacina' => function () use ($data) {
$data->model['vacina'] = null;
}
];
$firstLoad = $load = is_null(request()->load_from);
foreach ($sets as $field => $set) {
if ($load) {
if (!$firstLoad && collect(['idade'])->contains($field)) {
continue;
}
$set();
}
else if ($field === request()->load_from) {
$load = true;
}
}
foreach ($data as $property => $itens) {
if (empty($itens)) {
unset($data->{$property});
}
}
return $data;
}
private static function getParams()
{
$params = (object) request()->only([
'periodo',
'unidade_id',
'infraestrutura_id',
'idade',
'vacina_id',
]);
if (isset($params->periodo)
&& !is_null($params->periodo['start'])
&& !is_null($params->periodo['end'])
) {
$start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0);
$end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59);
$params->periodo['start'] = $start;
$params->periodo['end'] = $end;
}
else {
$params->periodo = null;
}
return $params;
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->periodo)) {
$unidades = DB::table('cadastro_unidade AS unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('cadastro_infraestrutura AS infraestrutura')
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
->whereNull('infraestrutura.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('imunizacao_registro_aprazamento AS aprazamento')
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id')
->whereNull('aprazamento.registro_aplicacao_id')
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
)
)
->select('unidade.id', 'unidade.nome_fantasia')
->orderBy('unidade.nome_fantasia')
->get();
}
return ['form' => $unidades, 'model' => $id];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $params->unidade_id)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('imunizacao_registro_aprazamento AS aprazamento')
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id')
->whereNull('aprazamento.registro_aplicacao_id')
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
)
->select(
'infraestrutura.id',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome")
)
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
return ['form' => $infraestruturas, 'model' => $id];
}
public static function autocompleteVacina()
{
$params = self::getParams();
return DB::table('cadastro_vacina AS vacina')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('imunizacao_registro_aprazamento AS aprazamento')
->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id')
->whereColumn('aprazamento.vacina_id', 'vacina.id')
->whereNull('aprazamento.registro_aplicacao_id')
->whereBetween('aprazamento.data_aprazamento', $params->periodo)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(isset($params->idade['de']), fn ($q) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}")
)
->when(isset($params->idade['ate']), fn ($q) => $q
->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}")
)
)
->select(
'vacina.id',
DB::raw(VacinaService::getDescricaoRaw() . ' AS descricao')
);
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['aprazamentos'];
$itens->each(function ($item) {
if ($item->paciente_data_nascimento) {
$item->paciente_data_nascimento = (new Carbon($item->paciente_data_nascimento))->format('d/m/Y');
}
$item->data_aprazamento = (new Carbon($item->data_aprazamento))->format('d/m/Y');
});
$unidade = request()->unidade_id ? Unidade::find(request()->unidade_id) : null;
$infraestrutura = request()->infraestrutura_id ? Infraestrutura::find(request()->infraestrutura_id) : null;
$vacina = request()->vacina_id ? Vacina::find(request()->vacina_id) : null;
return [
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'idadeDe' => request()->idade['de'],
'idadeAte' => request()->idade['ate'],
'vacina' => $vacina ? VacinaService::getDescricao($vacina) : 'Todas',
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
];
}
}

View File

@@ -0,0 +1,184 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Imunizacao\Parametrizacao;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class RelatorioPosicaoEstoqueService extends Service
{
public static function index()
{
$params = self::getParams();
$parametrizacao = Parametrizacao::first();
return DB::table('imunizacao_entrada_vacina')
->select([
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
'cadastro_vacina.sigla AS vacina_sigla',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.nome AS vacina_nome',
'imunizacao_produtor.nome AS produtor_nome',
'imunizacao_apresentacao.nome AS apresentacao_nome',
'imunizacao_entrada_vacina.lote AS entrada_vacina_lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS entrada_vacina_data_validade_lote"),
DB::raw('
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)) AS estoque
')
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id')
->join('imunizacao_apresentacao', 'imunizacao_apresentacao.id', 'imunizacao_entrada_vacina.apresentacao_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_unidade.id', $unidadeId))
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId))
->groupBy([
'cadastro_unidade.nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)"),
'cadastro_vacina.sigla',
'cadastro_vacina.abreviacao',
'cadastro_vacina.nome',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y')"),
])
->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()
->map(function($query) use ($parametrizacao) {
switch($parametrizacao->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
$query->vacina = $query->vacina_nome;
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
$query->vacina = $query->vacina_abreviacao;
break;
case ParametrizacaoDescricaoVacina::SIGLA:
$query->vacina = $query->vacina_sigla;
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
$query->vacina = "$query->vacina_sigla - $query->vacina_nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
$query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->vacina_abreviacao - $query->vacina_nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao - $query->vacina_nome";
break;
default:
$query->vacina = $query->vacina_nome;
break;
}
return $query;
});
}
public static function create()
{
return [
'form' => [
'unidades' => self::getUnidades(),
'infraestruturas' => [],
],
'model' => [
'unidade_id' => null,
'infraestrutura_id' => null,
],
];
}
public static function list()
{
$params = self::getParams();
switch (request()->listar) {
case 'unidades': {
return ['unidades' => self::getUnidades($params)];
}
case 'infraestruturas': {
return ['infraestruturas' => self::getInfraestruturas($params)];
}
}
}
public static function getPrintData()
{
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
return [
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
'itens' => self::index(),
'colunas' => collect(request()->selected_cols),
];
}
private static function getParams()
{
return (object) [
'unidade_id' => request()->get('unidade_id'),
'infraestrutura_id' => request()->get('infraestrutura_id'),
];
}
private static function getUnidades()
{
return DB::table('cadastro_unidade')
->select([
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
)
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getInfraestruturas($params)
{
return DB::table('cadastro_infraestrutura')
->select([
'cadastro_infraestrutura.id',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"),
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id')
)
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
->get();
}
}

View File

@@ -0,0 +1,917 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Enums\Imunizacao\EntradaTipo;
use App\Enums\Imunizacao\RequisicaoStatus;
use App\Enums\Imunizacao\RequisicaoVacinaMotivo;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Imunizacao\Entrada;
use App\Models\Imunizacao\Requisicao;
use App\Models\Imunizacao\RequisicaoVacina;
use App\Models\Imunizacao\Saida;
use App\Models\Imunizacao\SaidaVacina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RequisicaoService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
$requisicao = null;
if (request()->get('tipo_movimentacao') === 'estorno') {
$requisicao = Requisicao::findOrFail(request()->get('requisicao_id'));
}
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData($requisicao),
'model' => self::getModelData($requisicao),
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$requisicao = Requisicao::create([
'status_id' => RequisicaoStatus::PENDENTE,
'sala_vacinacao_id_de' => $request['sala_vacinacao_id_de'],
'sala_vacinacao_id_para' => $request['sala_vacinacao_id_para'],
'usuario_id' => $request['usuario_id'],
'data_requisicao' => Carbon::createFromFormat('d/m/Y', $request['data_requisicao']),
'codigo' => $request['codigo'],
]);
foreach ($request['vacinas'] as $vacina) {
$requisicao->vacinas()->create([
'vacina_id' => $vacina['vacina_id'],
'quantidade' => $vacina['quantidade'],
'observacao' => $vacina['observacao'],
]);
}
});
}
public static function show($id)
{
return Requisicao::find($id);
}
public static function edit($id)
{
$requisicao = self::show($id);
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData($requisicao),
'model' => self::getModelData($requisicao),
];
}
public static function update($request, $id)
{
self::validate($request);
DB::transaction(function() use ($request, $id) {
$requisicao = self::show($id);
if ($requisicao->status_id === RequisicaoStatus::PENDENTE) {
$saidasVacina = [];
foreach ($request['vacinas'] as $vacina) {
$requisicaoVacina = RequisicaoVacina::findOrFail($vacina['id']);
foreach ($vacina['lotes'] as $lote) {
if ($lote['quantidade_enviada'] > 0) {
$saidasVacina[] = [
'entrada_vacina_id' => $lote['id'],
'requisicao_vacina_id' => $requisicaoVacina->id,
'vacina_id' => $requisicaoVacina->vacina_id,
'quantidade' => $lote['quantidade_enviada'],
];
}
}
$requisicaoVacina->update(['motivo_id' => $vacina['motivo_id']]);
}
if (count($saidasVacina) > 0) {
$saida = Saida::create([
'sala_vacinacao_id' => $requisicao->sala_vacinacao_id_para,
'tipo_id' => SaidaTipo::REQUISICAO,
'data_saida' => Carbon::now()->format('Y-m-d'),
]);
$saida->vacinas()->createMany($saidasVacina);
}
$requisicao->status_id = RequisicaoStatus::RESPONDIDA;
}
else if ($requisicao->status_id = RequisicaoStatus::RESPONDIDA) {
$entradasVacinaOrigem = [];
$entradasVacinaDestino = [];
foreach ($request['vacinas'] as $vacina) {
foreach ($vacina['lotes'] as $lote) {
$saidaVacina = self::getSaidaVacina($lote['id']);
if (!is_null($saidaVacina)) {
$entradasVacinaDestino[] = [
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $saidaVacina->produtor_id,
'apresentacao_id' => $saidaVacina->apresentacao_id,
'quantidade' => $lote['quantidade_recebida'],
'lote' => $saidaVacina->lote,
'data_validade_lote' => $saidaVacina->data_validade_lote,
];
if ($saidaVacina->quantidade > $lote['quantidade_recebida']) {
$entradasVacinaOrigem[] = [
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $saidaVacina->produtor_id,
'apresentacao_id' => $saidaVacina->apresentacao_id,
'quantidade' => $saidaVacina->quantidade - $lote['quantidade_recebida'],
'lote' => $saidaVacina->lote,
'data_validade_lote' => $saidaVacina->data_validade_lote,
];
}
}
}
}
if (count($entradasVacinaDestino) > 0) {
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::REQUISICAO,
'sala_vacinacao_id' => $requisicao->sala_vacinacao_id_de,
'data_entrada' => Carbon::now()->format('Y-m-d'),
]);
$entrada->vacinas()->createMany($entradasVacinaDestino);
}
if (count($entradasVacinaOrigem) > 0) {
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::ESTORNO,
'sala_vacinacao_id' => $requisicao->sala_vacinacao_id_para,
'data_entrada' => Carbon::now()->format('Y-m-d'),
]);
$entrada->vacinas()->createMany($entradasVacinaOrigem);
}
$requisicao->status_id = RequisicaoStatus::FINALIZADA;
}
$requisicao->save();
});
}
public static function destroy($request)
{
if ($request['status_id'] === RequisicaoStatus::PENDENTE) {
DB::transaction(function() use ($request) {
$requisicao = self::show($request['id']);
$requisicao->vacinas()->delete();
$requisicao->delete();
});
}
else if ($request['status_id'] === RequisicaoStatus::FINALIZADA) {
self::validate($request);
DB::transaction(function() use ($request) {
$saida = Saida::create([
'tipo_id' => SaidaTipo::ESTORNO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_de'],
'data_saida' => Carbon::now()->format('Y-m-d'),
]);
$entrada = Entrada::create([
'tipo_id' => EntradaTipo::ESTORNO,
'sala_vacinacao_id' => $request['sala_vacinacao_id_para'],
'data_entrada' => Carbon::now()->format('Y-m-d'),
]);
foreach ($request['vacinas'] as $requisicaoVacinaId) {
RequisicaoVacina::findOrFail($requisicaoVacinaId)->saidasVacina->map(function($query) use ($saida, $entrada) {
$saidaVacina = SaidaVacina::create([
'saida_id' => $saida->id,
'entrada_vacina_id' => $query->entradaVacinaDestino->id,
'vacina_id' => $query->entradaVacinaDestino->vacina_id,
'quantidade' => $query->entradaVacinaDestino->quantidade,
]);
$entrada->vacinas()->create([
'saida_vacina_id' => $saidaVacina->id,
'vacina_id' => $saidaVacina->vacina_id,
'produtor_id' => $query->entradaVacinaDestino->produtor_id,
'apresentacao_id' => $query->entradaVacinaDestino->apresentacao_id,
'quantidade' => $saidaVacina->quantidade,
'lote' => $query->entradaVacinaDestino->lote,
'data_validade_lote' => $query->entradaVacinaDestino->data_validade_lote,
]);
});
}
});
}
}
public static function datatable()
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$datatable = DB::table('imunizacao_requisicao')
->select([
'imunizacao_requisicao.id',
'imunizacao_requisicao.status_id',
'imunizacao_requisicao_status.nome AS status_nome',
'imunizacao_requisicao.sala_vacinacao_id_de',
'imunizacao_requisicao.sala_vacinacao_id_para',
'cadastro_unidade_de.nome_fantasia AS unidade_nome_de',
DB::raw("CASE WHEN cadastro_infraestrutura_de.principal THEN cadastro_unidade_de.nome_fantasia ELSE cadastro_infraestrutura_de.nome END AS infraestrutura_nome_de"),
'cadastro_unidade_para.nome_fantasia AS unidade_nome_para',
DB::raw("CASE WHEN cadastro_infraestrutura_para.principal THEN cadastro_unidade_para.nome_fantasia ELSE cadastro_infraestrutura_para.nome END AS infraestrutura_nome_para"),
DB::raw("DATE_FORMAT(imunizacao_requisicao.data_requisicao, '%d/%m/%Y') AS data_requisicao"),
'imunizacao_requisicao.codigo',
])
->join('imunizacao_requisicao_status', 'imunizacao_requisicao_status.id', 'imunizacao_requisicao.status_id')
->join('imunizacao_sala_vacinacao AS imunizacao_sala_vacinacao_de', 'imunizacao_sala_vacinacao_de.id', 'imunizacao_requisicao.sala_vacinacao_id_de')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_de', 'cadastro_infraestrutura_de.id', 'imunizacao_sala_vacinacao_de.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_de', 'cadastro_unidade_de.id', 'cadastro_infraestrutura_de.unidade_id')
->join('imunizacao_sala_vacinacao AS imunizacao_sala_vacinacao_para', 'imunizacao_sala_vacinacao_para.id', 'imunizacao_requisicao.sala_vacinacao_id_para')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_para', 'cadastro_infraestrutura_para.id', 'imunizacao_sala_vacinacao_para.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_para', 'cadastro_unidade_para.id', 'cadastro_infraestrutura_para.unidade_id')
->whereIn('imunizacao_requisicao.status_id', request()->get('status_id'));
if ($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false) {
$datatable
->where('imunizacao_sala_vacinacao_de.id', $salaVacinacaoLogada->id)
->orWhere('imunizacao_sala_vacinacao_para.id', $salaVacinacaoLogada->id);
}
return $datatable;
}
public static function list()
{
switch (request()->get('listar')) {
case 'salas_vacinacao_de':
return self::getSalasVacinacaoDe(request()->get('unidade_id_de'));
break;
case 'salas_vacinacao_para':
return self::getSalasVacinacaoPara(request()->get('unidade_id_para'));
break;
default:
return [];
break;
}
}
private static function validate($request)
{
$rules = [];
if ($request['tipo_movimentacao'] === 'estorno') {
$rules = [
'sala_vacinacao_id_de' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'sala_vacinacao_id_para' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'vacinas' => [
function ($_, $value, $fail) {
foreach ($value as $value) {
$movimentacao = RequisicaoVacina::where('id', $value)->has('saidasVacina.entradaVacinaDestino.saidasVacina')->exists();
if ($movimentacao === true) {
$fail('Um ou mais itens selecionados possui movimentação e não pode ser estornado.');
}
}
},
],
];
} else {
switch ($request['status_id']) {
case RequisicaoStatus::PENDENTE:
foreach ($request['vacinas'] as $i => $vacina) {
$rules["vacinas.$i.motivo_id"] = [
'nullable',
'integer',
'exists:\App\Models\Imunizacao\RequisicaoVacinaMotivo,id',
];
foreach ($vacina['lotes'] as $j => $lote) {
$rules["vacinas.$i.lotes.$j.quantidade_enviada"] = [
'required',
'integer',
'max:' . self::getEntradaVacina($lote['id'])->quantidade,
];
}
}
break;
case RequisicaoStatus::RESPONDIDA:
foreach ($request['vacinas'] as $i => $vacina) {
foreach ($vacina['lotes'] as $j => $lote) {
$rules["vacinas.$i.lotes.$j.quantidade_recebida"] = [
'required',
'integer',
'max:' . self::getSaidaVacina($lote['id'])->quantidade,
];
}
}
break;
default:
$rules = [
'sala_vacinacao_id_de' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'sala_vacinacao_id_para' => [
'required',
'integer',
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
],
'usuario_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id',
],
'data_requisicao' => [
'required',
'date_format:d/m/Y',
'date_equals:today',
],
'vacinas.*.vacina_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
],
'vacinas.*.quantidade' => [
'required',
'integer',
'between:1,99999999',
],
'vacinas.*.observacao' => [
'nullable',
'string',
'between:1,5000',
],
];
break;
}
}
return $request->validate($rules);
}
private static function getAdditionalsData()
{
return [
'data_atual' => Carbon::now()->format('d/m/Y'),
'parametrizacao' => self::getParametrizacao(),
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
];
}
private static function getFormData($requisicao = null)
{
return [
'unidades_de' => self::getUnidadesDe($requisicao),
'salas_vacinacao_de' => self::getSalasVacinacaoDe($requisicao->salaVacinacaoDe->infraestrutura->unidade->id ?? self::getSalaVacinacaoLogada()->unidade_id ?? null),
'unidades_para' => self::getUnidadesPara(),
'salas_vacinacao_para' => self::getSalasVacinacaoPara($requisicao->salaVacinacaoPara->infraestrutura->unidade->id ?? null),
'motivos' => self::getMotivos(),
];
}
private static function getModelData($requisicao = null)
{
if (request()->get('tipo_movimentacao') === 'estorno') {
return [
'id' => $requisicao->id,
'status_id' => $requisicao->status_id,
'unidade_id_de' => $requisicao->salaVacinacaoDe->infraestrutura->unidade->id,
'sala_vacinacao_id_de' => $requisicao->sala_vacinacao_id_de,
'unidade_id_para' => $requisicao->salaVacinacaoPara->infraestrutura->unidade->id,
'sala_vacinacao_id_para' => $requisicao->sala_vacinacao_id_para,
'usuario_id' => $requisicao->usuario->id,
'usuario_nome' => $requisicao->usuario->cidadao->nome,
'data_requisicao' => $requisicao->data_requisicao,
'codigo' => $requisicao->codigo,
'vacinas' => $requisicao->vacinas->filter(fn($query) => $query->where('id', $query->id)->has('saidasVacina.entradaVacinaDestino.saidasVacina')->doesntExist())
->filter(fn($query) => count($query->saidasVacina) > 0)
->map(function($query) {
$lotesAgrupados = $query->saidasVacina->map(function($saida) {
return [
'lote' => $saida->entradaVacinaDestino->lote,
'data_validade_lote' => $saida->entradaVacinaDestino->data_validade_lote->format('d/m/Y'),
'quantidade_enviada' => $saida->quantidade,
'quantidade_recebida' => $saida->entradaVacinaDestino->quantidade,
];
})->groupBy('lote');
$lotesProcessados = $lotesAgrupados->map(function($loteGroup) {
return [
'lote' => $loteGroup[0]['lote'],
'data_validade_lote' => $loteGroup[0]['data_validade_lote'],
'quantidade_enviada' => $loteGroup->sum('quantidade_enviada'),
'quantidade_recebida' => $loteGroup->sum('quantidade_recebida'),
];
});
return [
'id' => $query->id,
'vacina_id' => $query->vacina_id,
'motivo_id' => $query->motivo_id,
'vacina_nome' => $query->vacina->nome,
'vacina_abreviacao' => $query->vacina->abreviacao,
'vacina_sigla' => $query->vacina->sigla,
'vacina_sigla_nome' => $query->vacina->sigla . ' - ' . $query->vacina->nome,
'vacina_sigla_abreviacao' => $query->vacina->sigla . ' - ' . $query->vacina->abreviacao,
'vacina_abreviacao_nome' => $query->vacina->abreviacao . ' - ' . $query->vacina->nome,
'vacina_sigla_abreviacao_nome' => $query->vacina->sigla . ' - ' . $query->vacina->abreviacao . ' - ' . $query->vacina->nome,
'quantidade' => $query->quantidade,
'observacao' => $query->observacao,
'lotes' => $lotesProcessados->values(),
];
})
->values(),
];
} else {
if (is_null($requisicao)) {
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$currentLotacao = self::getCurrentLotacao();
return [
'status_id' => null,
'unidade_id_de' => $salaVacinacaoLogada->unidade_id ?? null,
'sala_vacinacao_id_de' => $salaVacinacaoLogada->id ?? null,
'unidade_id_para' => null,
'sala_vacinacao_id_para' => null,
'usuario_id' => $currentLotacao->usuario->id ?? null,
'usuario_nome' => $currentLotacao->usuario->cidadao->nome ?? null,
'data_requisicao' => Carbon::now()->format('Y-m-d'),
'codigo' => Carbon::now()->format('YmdHis'),
'vacinas' => [],
];
} else {
return [
'status_id' => $requisicao->status_id,
'unidade_id_de' => $requisicao->salaVacinacaoDe->infraestrutura->unidade->id,
'sala_vacinacao_id_de' => $requisicao->sala_vacinacao_id_de,
'unidade_id_para' => $requisicao->salaVacinacaoPara->infraestrutura->unidade->id,
'sala_vacinacao_id_para' => $requisicao->sala_vacinacao_id_para,
'usuario_id' => $requisicao->usuario->id ?? null,
'usuario_nome' => $requisicao->usuario->cidadao->nome ?? null,
'data_requisicao' => $requisicao->data_requisicao,
'codigo' => $requisicao->codigo,
'vacinas' => $requisicao->vacinas->map(function($query) {
$respose = [
'id' => $query->id,
'vacina_id' => $query->vacina_id,
'motivo_id' => $query->motivo_id,
'vacina_nome' => $query->vacina->nome,
'vacina_abreviacao' => $query->vacina->abreviacao,
'vacina_sigla' => $query->vacina->sigla,
'vacina_sigla_nome' => $query->vacina->sigla . ' - ' . $query->vacina->nome,
'vacina_sigla_abreviacao' => $query->vacina->sigla . ' - ' . $query->vacina->abreviacao,
'vacina_abreviacao_nome' => $query->vacina->abreviacao . ' - ' . $query->vacina->nome,
'vacina_sigla_abreviacao_nome' => $query->vacina->sigla . ' - ' . $query->vacina->abreviacao . ' - ' . $query->vacina->nome,
'quantidade' => $query->quantidade,
'observacao' => $query->observacao,
];
if ($query->requisicao->status_id === RequisicaoStatus::PENDENTE) {
$respose['estoque_sala_vacinacao_de'] = (int) self::getEstoque($query->requisicao->sala_vacinacao_id_de, $query->vacina_id);
$respose['estoque_sala_vacinacao_para'] = (int) self::getEstoque($query->requisicao->sala_vacinacao_id_para, $query->vacina_id);
$quantidade = $query->quantidade;
$respose['lotes'] = self::getEntradasVacina($query->requisicao->sala_vacinacao_id_para, $query->vacina_id)
->map(function($query) use (&$quantidade) {
$quantidadeEnviada = 0;
if ($quantidade <= $query->quantidade) {
$quantidadeEnviada = $quantidade;
$quantidade = 0;
} else {
$quantidadeEnviada = $query->quantidade;
$quantidade = $quantidade - $query->quantidade;
}
return [
'id' => $query->id,
'quantidade_estoque' => $query->quantidade,
'lote' => $query->lote,
'data_validade_lote' => $query->data_validade_lote,
'quantidade_enviada' => $quantidadeEnviada,
];
});
if ($query->quantidade === $quantidade) {
$respose['motivo_id'] = RequisicaoVacinaMotivo::SEM_ESTOQUE;
} else if ($quantidade > 0) {
$respose['motivo_id'] = RequisicaoVacinaMotivo::PEDIU_MUITO;
} else {
$respose['motivo_id'] = null;
}
} else if ($query->requisicao->status_id === RequisicaoStatus::RESPONDIDA) {
$respose['lotes'] = $query->saidasVacina->map(function($saida) {
return [
'id' => $saida->id,
'quantidade_enviada' => $saida->quantidade,
'lote' => $saida->entradaVacinaOrigem->lote,
'data_validade_lote' => $saida->entradaVacinaOrigem->data_validade_lote->format('d/m/Y'),
'quantidade_recebida' => $saida->quantidade,
];
});
} else if ($query->requisicao->status_id === RequisicaoStatus::FINALIZADA) {
$lotesAgrupados = $query->saidasVacina->map(function($saida) {
return [
'lote' => $saida->entradaVacinaDestino->lote,
'data_validade_lote' => $saida->entradaVacinaDestino->data_validade_lote->format('d/m/Y'),
'quantidade_enviada' => $saida->quantidade,
'quantidade_recebida' => $saida->entradaVacinaDestino->quantidade,
];
})->groupBy('lote');
$lotesProcessados = $lotesAgrupados->map(function($loteGroup) {
return [
'lote' => $loteGroup[0]['lote'],
'data_validade_lote' => $loteGroup[0]['data_validade_lote'],
'quantidade_enviada' => $loteGroup->sum('quantidade_enviada'),
'quantidade_recebida' => $loteGroup->sum('quantidade_recebida'),
];
});
$respose['lotes'] = $lotesProcessados->values();
}
return $respose;
}),
];
}
}
}
private static function getSalaVacinacaoLogada()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->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',
])
->first();
}
private static function getUnidadesDe($requisicao)
{
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
$unidadeLogada = $requisicao && $requisicao->unidade_id == $salaVacinacaoLogada->unidade_id &&
$salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false || !$requisicao &&
$salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false;
$unidades = DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->when($unidadeLogada, 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);
});
return $unidades->orderBy('nome_fantasia')->get();
}
private static function getUnidadesPara()
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->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.permite_requisicao', true)
->where('imunizacao_sala_vacinacao.ativo', true);
})
->orderBy('nome_fantasia')
->get();
}
private static function getSalasVacinacaoDe($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"),
])
->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('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 getSalasVacinacaoPara($unidadeIdPara)
{
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"),
])
->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('cadastro_infraestrutura.unidade_id', $unidadeIdPara)
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
->get();
}
private static function getMotivos()
{
return DB::table('imunizacao_requisicao_vacina_motivo')
->select([
'id',
'nome',
])
->orderBy('nome')
->get();
}
private static function getEstoque($salaVacinacaoId, $vacinaId)
{
return DB::table('imunizacao_entrada_vacina')
->select([
DB::raw('
COALESCE(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) AS estoque
')
])
->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)
->pluck('estoque')
->first();
}
private static function getEntradasVacina($salaVacinacaoId, $vacinaId)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
DB::raw('
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) AS quantidade
'),
])
->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)
->whereRaw('
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)
')
->orderBy('imunizacao_entrada_vacina.data_validade_lote')
->orderBy('imunizacao_entrada_vacina.id')
->get();
}
private static function getEntradaVacina($id)
{
return DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id',
'imunizacao_entrada_vacina.vacina_id',
DB::raw('
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) AS quantidade
'),
])
->where('imunizacao_entrada_vacina.id', $id)
->first();
}
private static function getSaidaVacina($id)
{
return DB::table('imunizacao_saida_vacina')
->select([
'imunizacao_saida_vacina.id',
'imunizacao_saida_vacina.vacina_id',
'imunizacao_entrada_vacina.produtor_id',
'imunizacao_entrada_vacina.apresentacao_id',
'imunizacao_saida_vacina.quantidade',
'imunizacao_entrada_vacina.lote',
'imunizacao_entrada_vacina.data_validade_lote',
])
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->where('imunizacao_saida_vacina.id', $id)
->first();
}
public static function getPrintData($id)
{
$requisicao = Requisicao::find($id);
$parametrizacao = Parametrizacao::first()->parametrizacao_descricao_vacina_id;
if($requisicao->status_id == RequisicaoStatus::PENDENTE) {
$colunas = [
[
'key' => 'vacina',
'label' => 'Vacina'
],
[
'key' => 'quantidade',
'label' => 'Quantidade'
],
[
'key' => 'observacao',
'label' => 'Observação'
],
];
}
if($requisicao->status_id == RequisicaoStatus::FINALIZADA || $requisicao->status_id == RequisicaoStatus::RESPONDIDA) {
$colunas = [
[
'key' => 'vacina',
'label' => 'Vacina'
],
[
'key' => 'lote',
'label' => 'Lote'
],
[
'key' => 'validade',
'label' => 'Validade'
],
[
'key' => 'requisitado',
'label' => 'Quantidade requisitada'
],
[
'key' => 'enviado',
'label' => 'Quantidade enviada'
],
[
'key' => 'motivo',
'label' => 'Motivo'
],
];
}
return [
'requisicao' => [
'status' => $requisicao->status->nome,
'unidade_requisitante' => $requisicao->salaVacinacaoPara->infraestrutura->unidade->nome_fantasia,
'local_requisitante' => $requisicao->salaVacinacaoPara->infraestrutura->nome,
'unidade_requisitada' => $requisicao->salaVacinacaoDe->infraestrutura->unidade->nome_fantasia,
'local_requisitado' => $requisicao->salaVacinacaoDe->infraestrutura->nome,
'data' => Carbon::parse($requisicao->data_requisicao)->format('d/m/Y'),
'codigo' => $requisicao->codigo
],
'colunas' => $colunas,
'vacinas' => self::getVacinas($parametrizacao, $requisicao)
];
}
private static function getVacinas($parametrizacao, $requisicao)
{
if ($requisicao->status_id == RequisicaoStatus::PENDENTE) {
return $requisicao->vacinas->map(function ($requisicao_vacina) use ($parametrizacao) {
return [
'vacina' => self::getNomeParametrizado($parametrizacao, $requisicao_vacina->vacina),
'quantidade' => $requisicao_vacina->quantidade,
'observacao' => $requisicao_vacina->observacao
];
});
}
if ($requisicao->status_id == RequisicaoStatus::FINALIZADA || $requisicao->status_id == RequisicaoStatus::RESPONDIDA) {
$vacinas = [];
$requisicao->vacinas->each(function ($requisicao_vacina) use ($parametrizacao, &$vacinas) {
$motivo = $requisicao_vacina->motivo->nome ?? null;
if ($requisicao_vacina->saidasVacina->count() > 0) {
$requisicao_vacina->saidasVacina->each(function ($query) use ($parametrizacao, &$vacinas, $motivo, $requisicao_vacina) {
$nomeVacina = self::getNomeParametrizado($parametrizacao, $query->vacina);
$lote = $query->entradaVacinaOrigem->lote;
$validade = $query->entradaVacinaOrigem->data_validade_lote->format('d/m/Y');
$quantidadeEnviada = $query->quantidade;
$chave = $nomeVacina . '|' . $lote;
if (!isset($vacinas[$chave])) {
$vacinas[$chave] = [
'vacina' => $nomeVacina,
'lote' => $lote,
'validade' => $validade,
'requisitado' => $requisicao_vacina->quantidade,
'enviado' => $quantidadeEnviada,
'motivo' => $motivo
];
} else {
$vacinas[$chave]['enviado'] += $quantidadeEnviada;
}
});
} else {
$vacina = [
'vacina' => self::getNomeParametrizado($parametrizacao, $requisicao_vacina->vacina),
'lote' => null,
'validade' => null,
'requisitado' => $requisicao_vacina->quantidade,
'enviado' => 0,
'motivo' => $motivo
];
$vacinas[$vacina['vacina']] = $vacina;
}
});
return array_values($vacinas);
}
}
private static function getNomeParametrizado($parametrizacao, $vacina)
{
switch ($parametrizacao) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
return $vacina->nome;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
return $vacina->abreviacao;
case ParametrizacaoDescricaoVacina::SIGLA:
return $vacina->sigla;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
return "$vacina->sigla - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
return "$vacina->sigla - $vacina->abreviacao";
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->abreviacao - $vacina->nome";
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
return "$vacina->sigla - $vacina->abreviacao - $vacina->nome";
}
}}

View File

@@ -0,0 +1,158 @@
<?php
namespace App\Services\Imunizacao;
use App\Models\Imunizacao\SalaVacinacao;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class SalaVacinacaoService extends Service
{
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
return SalaVacinacao::create($request->all())->fresh();
}
public static function show($id)
{
return SalaVacinacao::find($id);
}
public static function edit($id)
{
$salaVacinacao = self::show($id);
return [
'form' => self::getFormData($salaVacinacao),
'model' => self::getModelData($salaVacinacao),
];
}
public static function update($request, $id)
{
self::validate($request);
return self::show($id)->update($request->all());
}
public static function destroy($id)
{
$salaVacinacao = self::show($id);
return $salaVacinacao->update(['ativo' => !$salaVacinacao->ativo]);
}
public static function datatable()
{
return DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_unidade.nome_fantasia AS unidade_nome',
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS infraestrutura_nome"),
DB::raw("CASE WHEN imunizacao_sala_vacinacao.responsavel THEN 'Sim' ELSE 'Não' END AS responsavel"),
DB::raw("CASE WHEN imunizacao_sala_vacinacao.permite_aplicacao THEN 'Sim' ELSE 'Não' END AS permite_aplicacao"),
DB::raw("CASE WHEN imunizacao_sala_vacinacao.permite_requisicao THEN 'Sim' ELSE 'Não' END AS permite_requisicao"),
DB::raw("CASE WHEN imunizacao_sala_vacinacao.cria_ficha_ab THEN 'Sim' ELSE 'Não' END AS cria_ficha_ab"),
'imunizacao_sala_vacinacao.ativo',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id');
}
public static function list()
{
switch (request()->get('listar')) {
case 'infraestruturas':
return self::getInfraestruturas(request()->get('unidade_id'));
break;
default:
return [];
break;
}
}
private static function validate($request)
{
return $request->validate([
'infraestrutura_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Estabelecimento\Infraestrutura,id',
Rule::unique('imunizacao_sala_vacinacao')->ignore($request->sala_vacinacao),
],
'responsavel' => [
'required',
'boolean',
],
'permite_aplicacao' => [
'required',
'boolean',
],
'permite_requisicao' => [
'required',
'boolean',
],
'cria_ficha_ab' => [
'required',
'boolean',
],
]);
}
private static function getUnidades()
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->orderBy('nome_fantasia')
->get();
}
private static function getInfraestruturas($unidadeId)
{
return DB::table('cadastro_infraestrutura')
->select([
'cadastro_infraestrutura.id',
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"),
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->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 getFormData($salaVacinacao = null)
{
return [
'unidades' => self::getUnidades(),
'infraestruturas' => self::getInfraestruturas($salaVacinacao->infraestrutura->unidade_id ?? null),
];
}
private static function getModelData($salaVacinacao = null)
{
return [
'id' => $salaVacinacao->id ?? null,
'unidade_id' => $salaVacinacao->infraestrutura->unidade_id ?? null,
'infraestrutura_id' => $salaVacinacao->infraestrutura_id ?? null,
'responsavel' => $salaVacinacao->responsavel ?? false,
'permite_aplicacao' => $salaVacinacao->permite_aplicacao ?? false,
'permite_requisicao' => $salaVacinacao->permite_requisicao ?? false,
'cria_ficha_ab' => $salaVacinacao->cria_ficha_ab ?? false,
];
}
}