Files
SGF/app/Services/Sgc/BudgetCommitmentService.php
T
2026-11-11 09:00:17 +02:00

91 lines
2.5 KiB
PHP

<?php
namespace App\Services\Sgc;
use App\Models\Sgc\OrdemCompra;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class BudgetCommitmentService
{
/**
* Verifica disponibilidade orçamental no SGF
*/
public function verificarSaldo(string $centroCustoId, string $rubrica, float $valor): array
{
// Em produção, isto chamaria uma API do SGF
// Por agora, simulamos a resposta
return [
'disponivel' => 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;
}
}