fill(array_fill_keys($receita->getFillable(), null)); $item = new DispensacaoItem(); $item->fill(array_fill_keys($item->getFillable(), null)); $item->id = null; $item->entregue = null; $item->continuo = false; $item->estoque = 0; $item->escolheu_entrada_item_manualmente = false; $item->entrada_itens = []; $item->possui_entrada_com_lote = false; $item->supervisor_id = null; $paciente = self::getPaciente($pacienteId); $currentLotacao = self::getCurrentLotacao(); $cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail(); return [ 'form' => [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'centro_custo_id' => self::getCurrentCentroCusto()->id, 'paciente' => $paciente, 'historico' => self::getHistorico($pacienteId), 'cliente' => [ 'sistema' => [ 'ramo_atividade' => [ 'nome' => $cliente->sistema->ramoAtividade->nome ?? null, ], 'nome' => $cliente->sistema->nome ?? null, 'versao' => $cliente->sistema->versao ?? null, ], 'municipio' => [ 'estado' => [ 'uf' => $cliente->municipio->estado->uf ?? null, ], 'nome' => $cliente->municipio->nome ?? null, ], 'nome' => $cliente->nome ?? null, 'email' => $cliente->email ?? null, 'site' => $cliente->site ?? null, 'logotipo' => $cliente->logotipo ?? null, ], 'usuario' => $currentLotacao->usuario->cidadao->nome, 'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia, 'telefone' => MaskUtil::getPhoneMasked($currentLotacao->infraestrutura->telefone) ], 'model' => [ 'medico_solicitante' => null, 'item' => $item->toArray(), 'items' => [], 'paciente' => [ 'id' => $paciente->id, 'observacao' => $paciente->observacao, 'save' => null, ], ] ]; } public static function getHistorico($id) { $dispensacoes = Dispensacao::where('paciente_id', $id) ->select( '*', DB::raw('almoxarifado_dispensacao.id AS id') ) ->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_dispensacao.created_lotacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->when(!request()->complete, fn($q) => $q->whereHas('itens', fn($q) => $q->where('dispensado_em', '>=', Carbon::now()->subMonth(6)->startOfDay()))) ->orderByDesc('data_dispensacao') ->get(); return $dispensacoes->map(function($dispensacao) { return [ 'id' => $dispensacao->id, 'data_dispensacao' => Carbon::parse($dispensacao->data_dispensacao)->format('d/m/Y'), 'nome_fantasia' => $dispensacao->nome_fantasia, 'infraestrutura' => $dispensacao->nome, 'medico_solicitante' => $dispensacao->usuario->nome, 'observacao' => $dispensacao->observacao, 'items' => self::getHistoricoItems($dispensacao->id), ]; })->values()->all(); } private static function getHistoricoItems($id) { return DispensacaoItem::where('dispensacao_id', $id)->get()->map(function($item) { return [ 'id' => $item->id, 'material' => [ 'descricao' => $item->material->descricao ], 'dispensado_em' => Carbon::parse($item->dispensado_em)->format('d/m/Y'), 'usuario_nome' => $item->dispensacao->usuario->nome, 'estornado' => $item->estornado, 'estorno_salvo' => $item->estornado ]; })->values()->all(); } private static function getPaciente($id) { return Paciente::with('unidade')->findOrFail($id); } public static function store() { self::validate(); $dispensacao = null; DB::transaction(function() use(&$dispensacao) { $params = request()->all(); if(count($params['items']) > 0) { $params['items'] = collect($params['items']); $dispensacao = Dispensacao::create($params)->fresh(); $dispensacaoItems = collect(); $params['items']->each(function($item) use($dispensacao, &$dispensacaoItems) { $item['dispensacao_id'] = $dispensacao->id; $now = Carbon::now(); $dispensadoEm = new Carbon($item['dispensado_em']); $dispensadoEm->setTime($now->hour, $now->minute, $now->second); $item['dispensado_em'] = $dispensadoEm; $dispensacaoItem = DispensacaoItem::create($item)->fresh(); $dispensacaoItems[] = [ 'dispensacao_item_id' => $dispensacaoItem->id, 'material_id' => $dispensacaoItem->material_id, 'quantidade' => $dispensacaoItem->quantidade, 'escolheu_entrada_item_manualmente' => false, ]; }); $saidaItens = AlmoxarifadoService::saveSaidaDeDispensacaoDoAlmoxarifado($dispensacaoItems); $saidaItens->each(function($data) { DispensacaoItem::findOrFail($data['dispensacao_item_id']) ->update(['saida_item_id' => $data['saida_item_id']]); }); } if(count($params['estornados']) > 0) { self::estornar($params['estornados']); } }); return $dispensacao; } private static function estornar($estornados) { foreach($estornados as $id) { $item = DispensacaoItem::findOrFail($id); AlmoxarifadoService::estornarSaidaItens(collect([['id' => $item->saida_item_id]])); $item->update(['estornado' => true]); } } public static function print($id) { $dispensacao = Dispensacao::find($id); return [ 'nome_medico_solicitante' => $dispensacao->usuario->nome, 'itens' => $dispensacao->itens->map(function($item) { return [ 'material' => [ 'descricao_completa' => $item->material->descricao ], 'quantidade' => $item->quantidade ]; }), 'dispensado_em' => $dispensacao->data_dispensacao ]; } private static function validate() { $params = request()->all(); $rules = [ 'usuario_id' => [ 'nullable', 'integer', Rule::requiredIf(fn() => count($params['items'])) ], 'data_dispensacao' => [ 'nullable', 'date_format:Y-m-d', 'before_or_equal:now', Rule::requiredIf(fn() => count($params['items'])) ], 'observacao' => [ 'nullable', 'string', 'between:3,300' ], 'items' => [ 'nullable', 'array' ], 'items.*.dispensacao_id' => [ 'nullable', 'integer', ], 'items.*.material_id' => [ 'required', 'integer' ], 'dispensado_em' => [ 'nullable', 'date_format:Y-m-d H:i', 'before_or_equal:now', ], 'items.*.quantidade' => [ 'nullable', 'numeric', 'min:0.01', ], 'items.*.observacao' => [ 'nullable', 'string', 'between:3,300' ], ]; $messages = []; request()->validate($rules, $messages); } }