79 lines
3.0 KiB
PHP
79 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Cawangan;
|
|
use App\Customer;
|
|
use App\Gadai;
|
|
use App\ShorakaTransaction;
|
|
use Illuminate\Validation\ValidationException;
|
|
|
|
class ShorakaGadaiService
|
|
{
|
|
public function gadai(string $kodcaw, string $norujukan): Gadai
|
|
{
|
|
$branch = Cawangan::on('mysql7')->where('kodcaw', $kodcaw)->firstOrFail();
|
|
return app(ShorakaNewGadaiService::class)->find($kodcaw, $norujukan)
|
|
?? abort(404, 'Maklumat gadaian tidak tersedia. Semakan diperlukan.');
|
|
}
|
|
|
|
public function payload(Gadai $gadai): array
|
|
{
|
|
$customer = Customer::on('mysql7')->where(function ($query) use ($gadai) {
|
|
$query->where('kpbaru', $gadai->nokp)->orWhere('kplama', $gadai->nokp);
|
|
})->firstOrFail();
|
|
if (!$customer->nama || $gadai->pinjaman <= 0 || $gadai->hargajualan < $gadai->pinjaman) {
|
|
throw ValidationException::withMessages([
|
|
'norujukan' => 'Nama pelanggan, pembiayaan dan harga jualan mesti lengkap.',
|
|
]);
|
|
}
|
|
|
|
return [
|
|
'norujukan' => $gadai->norujukan,
|
|
'ownership' => $customer->nama,
|
|
'order_amount' => $gadai->pinjaman,
|
|
'murabaha_amount' => $gadai->hargajualan,
|
|
// Both GadaiV1 and GadaiV2 price the contract using upah12.
|
|
// "tempoh" is elapsed charge time, NOT the contractual tenor.
|
|
'tenor_other' => 12,
|
|
];
|
|
}
|
|
|
|
public function transaction(string $kodcaw, string $norujukan)
|
|
{
|
|
$order = ShorakaTransaction::where('norujukan', $norujukan)->first();
|
|
if ($order && (string) $order->kodcaw !== $kodcaw) {
|
|
abort(409, 'Rekod Shoraka tidak dipadankan dengan cawangan ini.');
|
|
}
|
|
return $order;
|
|
}
|
|
|
|
public function sync(ShorakaTransaction $order): void
|
|
{
|
|
if (!$order->kodcaw) {
|
|
return;
|
|
}
|
|
app(ShorakaNewGadaiService::class)->promote($order);
|
|
$gadai = $this->gadai($order->kodcaw, $order->norujukan);
|
|
if (!$gadai->exists) {
|
|
return;
|
|
}
|
|
$sameAmounts = number_format((float) $gadai->pinjaman, 2, '.', '') === $order->order_amount
|
|
&& number_format((float) $gadai->hargajualan, 2, '.', '') === $order->murabaha_amount;
|
|
$gadai->getConnection()->table('gadai')->where('norujukan', $order->norujukan)->update([
|
|
'tagkomuditi' => $order->status === 'Completed' && $sameAmounts ? 1 : 0,
|
|
]);
|
|
}
|
|
|
|
public function assertCompleted(string $kodcaw, string $norujukan): void
|
|
{
|
|
$gadai = $this->gadai($kodcaw, $norujukan);
|
|
$order = $this->transaction($kodcaw, $norujukan);
|
|
if (!$gadai->exists || !$order || $order->status !== 'Completed'
|
|
|| number_format((float) $gadai->pinjaman, 2, '.', '') !== $order->order_amount
|
|
|| number_format((float) $gadai->hargajualan, 2, '.', '') !== $order->murabaha_amount) {
|
|
abort(409, 'Pembiayaan dan SAG ditahan sehingga transaksi Shoraka selesai dan amaun sepadan.');
|
|
}
|
|
}
|
|
}
|