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.'); } } }