Files
rkm-conectasus-ci-sandbox/api/app/Services/Imunizacao/RequisicaoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

918 lines
42 KiB
PHP

<?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";
}
}}