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