91 lines
2.5 KiB
PHP
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;
|
|
}
|
|
}
|