This commit is contained in:
454
api/app/Services/Imunizacao/AplicacaoCampanhaService.php
Normal file
454
api/app/Services/Imunizacao/AplicacaoCampanhaService.php
Normal file
@@ -0,0 +1,454 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Imunizacao;
|
||||
|
||||
use App\Enums\Imunizacao\GrupoAtendimento;
|
||||
use App\Enums\Imunizacao\SaidaTipo;
|
||||
use App\Models\Imunizacao\Campanha;
|
||||
use App\Models\Imunizacao\RegistroAplicacao;
|
||||
use App\Models\Imunizacao\Saida;
|
||||
use App\Models\Imunizacao\SaidaVacina;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AplicacaoCampanhaService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
return [
|
||||
'additionals' => self::getAdditionalsData(),
|
||||
];
|
||||
}
|
||||
|
||||
public static function create()
|
||||
{
|
||||
$campanha = CadastroCampanhaService::show(request()->get('campanha_id'));
|
||||
$form = self::getFormData($campanha);
|
||||
|
||||
return [
|
||||
'additionals' => self::getAdditionalsData(),
|
||||
'form' => $form,
|
||||
'model' => self::getModelData($campanha, $form),
|
||||
];
|
||||
}
|
||||
|
||||
public static function store($request)
|
||||
{
|
||||
self::validate($request);
|
||||
|
||||
DB::transaction(function() use ($request) {
|
||||
$entradaVacina = self::getEntradaVacina($request['sala_vacinacao_id'], $request['vacina_id'], $request['lote'], $request['data_validade_lote']);
|
||||
|
||||
$saida = Saida::create([
|
||||
'tipo_id' => SaidaTipo::APLICACAO,
|
||||
'sala_vacinacao_id' => $request['sala_vacinacao_id'],
|
||||
'data_saida' => Carbon::now()->format('Y-m-d'),
|
||||
]);
|
||||
|
||||
$saidaVacina = SaidaVacina::create([
|
||||
'saida_id' => $saida->id,
|
||||
'entrada_vacina_id' => $entradaVacina->id,
|
||||
'vacina_id' => $request['vacina_id'],
|
||||
'quantidade' => 1,
|
||||
]);
|
||||
|
||||
RegistroAplicacao::create([
|
||||
'paciente_id' => $request['paciente_id'],
|
||||
'saida_vacina_id' => $saidaVacina->id,
|
||||
'aplicador_id' => $request['aplicador_id'],
|
||||
'grupo_atendimento_id' => $request['grupo_atendimento_id'],
|
||||
'dose_id' => $request['dose_id'],
|
||||
'estrategia_id' => $request['estrategia_id'],
|
||||
'cid_id' => $request['cid_id'],
|
||||
'campanha_id' => $request['campanha_id'],
|
||||
'data_aplicacao' => Carbon::createFromFormat('d/m/Y', $request['data_aplicacao']),
|
||||
'comunicante_hanseniase' => $request['comunicante_hanseniase'],
|
||||
'gestante' => $request['gestante'],
|
||||
'puerpera' => $request['puerpera'],
|
||||
'imunizacao_advertida' => $request['imunizacao_advertida'],
|
||||
'viajante' => $request['viajante'],
|
||||
'ultimo_frasco' => $request['ultimo_frasco'],
|
||||
'observacao' => $request['observacao'],
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
public static function show($id)
|
||||
{
|
||||
return Campanha::find($id);
|
||||
}
|
||||
|
||||
public static function datatable()
|
||||
{
|
||||
return DB::table('imunizacao_campanha')
|
||||
->select([
|
||||
'imunizacao_campanha.id',
|
||||
'imunizacao_campanha.nome',
|
||||
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_de, '%d/%m/%Y') AS periodo_de"),
|
||||
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_ate, '%d/%m/%Y') AS periodo_ate"),
|
||||
'cadastro_vacina.nome AS vacina_nome',
|
||||
'cadastro_vacina.abreviacao AS vacina_abreviacao',
|
||||
'cadastro_vacina.sigla AS vacina_sigla',
|
||||
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
|
||||
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
|
||||
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
|
||||
DB::raw("CONCAT(
|
||||
cadastro_vacina.sigla, ' - ',
|
||||
cadastro_vacina.abreviacao, ' - ',
|
||||
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
|
||||
),
|
||||
])
|
||||
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_campanha.vacina_id')
|
||||
->whereRaw('imunizacao_campanha.periodo_de <= CURRENT_DATE')
|
||||
->whereRaw('imunizacao_campanha.periodo_ate >= CURRENT_DATE');
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
switch (request()->get('listar')) {
|
||||
case 'unidades':
|
||||
return self::getUnidades();
|
||||
break;
|
||||
|
||||
case 'salas_vacinacao':
|
||||
return self::getSalasVacinacao(request()->get('unidade_id'));
|
||||
break;
|
||||
|
||||
case 'lotes':
|
||||
return self::getLotes(request()->get('sala_vacinacao_id'), request()->get('vacina_id'));
|
||||
break;
|
||||
|
||||
case 'produtores':
|
||||
return self::getProdutores(request()->get('sala_vacinacao_id'), request()->get('vacina_id'), request()->get('lote'), request()->get('data_validade_lote'));
|
||||
break;
|
||||
|
||||
default:
|
||||
return [];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static function validate($request)
|
||||
{
|
||||
return $request->validate([
|
||||
'campanha_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Imunizacao\Campanha,id',
|
||||
],
|
||||
'paciente_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Cadastro\SujeitoAtencao\Paciente,id',
|
||||
],
|
||||
'sala_vacinacao_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Imunizacao\SalaVacinacao,id',
|
||||
],
|
||||
'aplicador_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Cadastro\SujeitoAtencao\Usuario,id',
|
||||
],
|
||||
'vacina_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Cadastro\Vacina,id',
|
||||
],
|
||||
'grupo_atendimento_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Imunizacao\GrupoAtendimento,id',
|
||||
],
|
||||
'dose_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Imunizacao\Dose,id',
|
||||
],
|
||||
'estrategia_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'exists:\App\Models\Imunizacao\Estrategia,id',
|
||||
],
|
||||
'cid_id' => [
|
||||
'nullable',
|
||||
'integer',
|
||||
],
|
||||
'data_aplicacao' => [
|
||||
'required',
|
||||
'date_format:d/m/Y',
|
||||
'before_or_equal:now',
|
||||
],
|
||||
'lote' => [
|
||||
'required',
|
||||
'string',
|
||||
],
|
||||
'data_validade_lote' => [
|
||||
'required',
|
||||
'date',
|
||||
],
|
||||
'comunicante_hanseniase' => [
|
||||
'required',
|
||||
'boolean',
|
||||
],
|
||||
'gestante' => [
|
||||
'required',
|
||||
'boolean',
|
||||
],
|
||||
'puerpera' => [
|
||||
'required',
|
||||
'boolean',
|
||||
],
|
||||
'imunizacao_advertida' => [
|
||||
'required',
|
||||
'boolean',
|
||||
],
|
||||
'viajante' => [
|
||||
'required',
|
||||
'boolean',
|
||||
],
|
||||
'observacao' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'between:1,5000',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
private static function getAdditionalsData()
|
||||
{
|
||||
return [
|
||||
'data_atual' => Carbon::now()->format('Y-m-d'),
|
||||
'parametrizacao' => self::getParametrizacao(),
|
||||
'sala_vacinacao_logada' => self::getSalaVacinacaoLogada(),
|
||||
];
|
||||
}
|
||||
|
||||
private static function getFormData($campanha)
|
||||
{
|
||||
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
||||
|
||||
$unidades = self::getUnidades();
|
||||
$salasVacinacao = self::getSalasVacinacao($salaVacinacaoLogada->unidade_id ?? null);
|
||||
|
||||
return [
|
||||
'unidades' => $unidades,
|
||||
'salas_vacinacao' => $salasVacinacao,
|
||||
'lotes' => self::getLotes($salaVacinacaoLogada->id ?? null, $campanha->vacina_id) ?? [],
|
||||
'doses' => [],
|
||||
'produtores' => [],
|
||||
'grupos_atendimento' => self::getGruposAtendimento(),
|
||||
'estrategias' => [],
|
||||
];
|
||||
}
|
||||
|
||||
private static function getModelData($campanha, $form)
|
||||
{
|
||||
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
||||
|
||||
return [
|
||||
'paciente' => null,
|
||||
'unidade_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->unidade_id : null,
|
||||
'sala_vacinacao_id' => $salaVacinacaoLogada && $salaVacinacaoLogada->permite_aplicacao ? $salaVacinacaoLogada->id : null,
|
||||
'aplicador' => null,
|
||||
'data_aplicacao' => Carbon::now()->format('Y-m-d'),
|
||||
'vacina' => [
|
||||
'id' => $campanha->vacina_id,
|
||||
'nome' => $campanha->vacina->nome,
|
||||
'abreviacao' => $campanha->vacina->abreviacao,
|
||||
'sigla' => $campanha->vacina->sigla,
|
||||
'sigla_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->nome,
|
||||
'sigla_abreviacao' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao,
|
||||
'abreviacao_nome' => $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome,
|
||||
'sigla_abreviacao_nome' => $campanha->vacina->sigla . ' - ' . $campanha->vacina->abreviacao . ' - ' . $campanha->vacina->nome,
|
||||
],
|
||||
'lote' => null,
|
||||
'produtor_id' => null,
|
||||
'grupo_atendimento_id' => GrupoAtendimento::POPULACAO_GERAL,
|
||||
'dose_id' => null,
|
||||
'estrategia_id' => null,
|
||||
'cid_id' => null,
|
||||
'comunicante_hanseniase' => false,
|
||||
'gestante' => false,
|
||||
'puerpera' => false,
|
||||
'imunizacao_advertida' => false,
|
||||
'viajante' => false,
|
||||
'observacao' => null,
|
||||
];
|
||||
}
|
||||
|
||||
public static function getPaciente($id)
|
||||
{
|
||||
$paciente = DB::table('cadastro_paciente')
|
||||
->select([
|
||||
'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento',
|
||||
])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
||||
->whereNull('cadastro_paciente.deleted_at')
|
||||
->where('cadastro_paciente.id', $id)
|
||||
->first();
|
||||
|
||||
return [
|
||||
'cidadao_idade_anos' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y'),
|
||||
'cidadao_idade_meses' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m'),
|
||||
'cidadao_idade_dias' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d'),
|
||||
];
|
||||
}
|
||||
|
||||
private static function getSalaVacinacaoLogada()
|
||||
{
|
||||
return DB::table('imunizacao_sala_vacinacao')
|
||||
->select([
|
||||
'imunizacao_sala_vacinacao.id',
|
||||
'cadastro_infraestrutura.unidade_id',
|
||||
'imunizacao_sala_vacinacao.responsavel',
|
||||
'imunizacao_sala_vacinacao.permite_aplicacao',
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
||||
->where('imunizacao_sala_vacinacao.ativo', true)
|
||||
->where('cadastro_infraestrutura.id', auth()->payload()->get('infraestrutura_id'))
|
||||
->first();
|
||||
}
|
||||
|
||||
private static function getParametrizacao()
|
||||
{
|
||||
return DB::table('imunizacao_parametrizacao')
|
||||
->select([
|
||||
'parametrizacao_descricao_vacina_id',
|
||||
'perfil_campanha',
|
||||
'usa_ultimo_frasco',
|
||||
'aprazamento_dias_antes',
|
||||
'aprazamento_dias_depois',
|
||||
'aprazamento_ativo',
|
||||
])
|
||||
->first();
|
||||
}
|
||||
|
||||
private static function getUnidades()
|
||||
{
|
||||
$salaVacinacaoLogada = self::getSalaVacinacaoLogada();
|
||||
|
||||
$unidades = DB::table('cadastro_unidade')
|
||||
->select([
|
||||
'id',
|
||||
'nome_fantasia',
|
||||
])
|
||||
->when($salaVacinacaoLogada && $salaVacinacaoLogada->responsavel == false, function ($query) use ($salaVacinacaoLogada) {
|
||||
$query->where('id', $salaVacinacaoLogada->unidade_id);
|
||||
})
|
||||
->whereExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('imunizacao_sala_vacinacao')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
||||
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
|
||||
->where('imunizacao_sala_vacinacao.ativo', true)
|
||||
->where('imunizacao_sala_vacinacao.permite_aplicacao', true);
|
||||
});
|
||||
|
||||
return $unidades->orderBy('nome_fantasia')->get();
|
||||
}
|
||||
|
||||
private static function getSalasVacinacao($unidadeId)
|
||||
{
|
||||
return DB::table('imunizacao_sala_vacinacao')
|
||||
->select([
|
||||
'imunizacao_sala_vacinacao.id',
|
||||
DB::raw("CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END AS nome"),
|
||||
'imunizacao_sala_vacinacao.cria_ficha_ab',
|
||||
])
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->where('imunizacao_sala_vacinacao.ativo', true)
|
||||
->where('imunizacao_sala_vacinacao.permite_aplicacao', true)
|
||||
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
|
||||
->orderByRaw('CASE WHEN cadastro_infraestrutura.principal THEN cadastro_unidade.nome_fantasia ELSE cadastro_infraestrutura.nome END')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getLotes($salaVacinacaoId, $vacinaId)
|
||||
{
|
||||
return DB::table('imunizacao_entrada_vacina')
|
||||
->select([
|
||||
'imunizacao_entrada_vacina.lote',
|
||||
'imunizacao_entrada_vacina.data_validade_lote',
|
||||
])
|
||||
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
||||
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
||||
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
||||
->groupBy([
|
||||
'imunizacao_entrada_vacina.lote',
|
||||
'imunizacao_entrada_vacina.data_validade_lote',
|
||||
])
|
||||
->havingRaw('
|
||||
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
||||
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
||||
FROM imunizacao_saida_vacina
|
||||
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
||||
), 0)) > 0
|
||||
')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getProdutores($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
|
||||
{
|
||||
return DB::table('imunizacao_produtor')
|
||||
->select([
|
||||
'id',
|
||||
'nome',
|
||||
])
|
||||
->whereExists(function ($query) use ($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('imunizacao_entrada_vacina')
|
||||
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
||||
->whereColumn('imunizacao_entrada_vacina.produtor_id', 'imunizacao_produtor.id')
|
||||
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
||||
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
||||
->where('imunizacao_entrada_vacina.lote', $lote)
|
||||
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
|
||||
->havingRaw('
|
||||
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
||||
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
||||
FROM imunizacao_saida_vacina
|
||||
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
||||
), 0)) > 0
|
||||
');
|
||||
})
|
||||
->orderBy('nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
public static function getGruposAtendimento()
|
||||
{
|
||||
return DB::table('imunizacao_grupo_atendimento')
|
||||
->select([
|
||||
'id',
|
||||
'nome',
|
||||
])
|
||||
->orderBy('nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getEntradaVacina($salaVacinacaoId, $vacinaId, $lote, $dataValidadeLote)
|
||||
{
|
||||
return DB::table('imunizacao_entrada_vacina')
|
||||
->select([
|
||||
'imunizacao_entrada_vacina.id',
|
||||
])
|
||||
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
|
||||
->where('imunizacao_entrada.sala_vacinacao_id', $salaVacinacaoId)
|
||||
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
|
||||
->where('imunizacao_entrada_vacina.lote', $lote)
|
||||
->where('imunizacao_entrada_vacina.data_validade_lote', $dataValidadeLote)
|
||||
->havingRaw('
|
||||
SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
||||
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
||||
FROM imunizacao_saida_vacina
|
||||
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
||||
), 0)) > 0
|
||||
')
|
||||
->orderBy('imunizacao_entrada_vacina.id')
|
||||
->first();
|
||||
}
|
||||
}
|
||||
658
api/app/Services/Imunizacao/BaixaService.php
Normal file
658
api/app/Services/Imunizacao/BaixaService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
300
api/app/Services/Imunizacao/CadastroCampanhaService.php
Normal file
300
api/app/Services/Imunizacao/CadastroCampanhaService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
113
api/app/Services/Imunizacao/ChamadaService.php
Normal file
113
api/app/Services/Imunizacao/ChamadaService.php
Normal 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'),
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
200
api/app/Services/Imunizacao/ConsultaEstoqueService.php
Normal file
200
api/app/Services/Imunizacao/ConsultaEstoqueService.php
Normal 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
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
619
api/app/Services/Imunizacao/DistribuicaoService.php
Normal file
619
api/app/Services/Imunizacao/DistribuicaoService.php
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
432
api/app/Services/Imunizacao/EntradaService.php
Normal file
432
api/app/Services/Imunizacao/EntradaService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
1033
api/app/Services/Imunizacao/ExportacaoService.php
Normal file
1033
api/app/Services/Imunizacao/ExportacaoService.php
Normal file
File diff suppressed because it is too large
Load Diff
693
api/app/Services/Imunizacao/FilaAtendimentoService.php
Normal file
693
api/app/Services/Imunizacao/FilaAtendimentoService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
226
api/app/Services/Imunizacao/ParametrizacaoService.php
Normal file
226
api/app/Services/Imunizacao/ParametrizacaoService.php
Normal 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 ?? [],
|
||||
];
|
||||
}
|
||||
}
|
||||
2508
api/app/Services/Imunizacao/RegistroVacinacaoService.php
Normal file
2508
api/app/Services/Imunizacao/RegistroVacinacaoService.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
}
|
||||
816
api/app/Services/Imunizacao/RelatorioDeAplicacaoService.php
Normal file
816
api/app/Services/Imunizacao/RelatorioDeAplicacaoService.php
Normal 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];
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
184
api/app/Services/Imunizacao/RelatorioPosicaoEstoqueService.php
Normal file
184
api/app/Services/Imunizacao/RelatorioPosicaoEstoqueService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
917
api/app/Services/Imunizacao/RequisicaoService.php
Normal file
917
api/app/Services/Imunizacao/RequisicaoService.php
Normal 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";
|
||||
}
|
||||
}}
|
||||
158
api/app/Services/Imunizacao/SalaVacinacaoService.php
Normal file
158
api/app/Services/Imunizacao/SalaVacinacaoService.php
Normal 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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user