true, 'saldo_atual' => 500000.00, 'valor_solicitado' => $valor, 'saldo_apos_compromisso' => 500000.00 - $valor, ]; } /** * Cabimenta (compromete) orçamento no SGF */ public function cabimentar(OrdemCompra $oc): array { $verificacao = $this->verificarSaldo( $oc->centroCusto->sgf_centro_custo_id, $oc->categoria, $oc->valor_comprometido ); if (!$verificacao['disponivel']) { throw new \Exception('Saldo orçamental insuficiente'); } // Em produção, isto chamaria uma API do SGF para criar o compromisso // Simulamos o sucesso $compromissoId = 'COMP-' . strtoupper(substr(md5($oc->oc_id), 0, 8)); DB::transaction(function () use ($oc, $compromissoId) { $oc->update([ 'cabimentado' => true, 'sgf_compromisso_id' => $compromissoId, ]); }); Log::info('Cabimentação realizada', [ 'oc_id' => $oc->oc_id, 'compromisso_id' => $compromissoId, 'valor' => $oc->valor_comprometido, ]); return [ 'sucesso' => true, 'compromisso_id' => $compromissoId, 'saldo_apos_compromisso' => $verificacao['saldo_apos_compromisso'], ]; } /** * Cancela cabimentação (quando OC é cancelada) */ public function cancelarCabimentacao(OrdemCompra $oc): bool { if (!$oc->cabimentado) { return true; } // Em produção, chamaria API do SGF para cancelar o compromisso DB::transaction(function () use ($oc) { $oc->update([ 'cabimentado' => false, 'sgf_compromisso_id' => null, ]); }); Log::info('Cabimentação cancelada', [ 'oc_id' => $oc->oc_id, 'compromisso_id' => $oc->sgf_compromisso_id, ]); return true; } }