tambah function semakan billplz

This commit is contained in:
BTMS2
2025-05-06 10:12:20 +08:00
parent d95767c5f9
commit 791ca8dd84
8 changed files with 580 additions and 1 deletions
+169 -1
View File
@@ -24,19 +24,26 @@ use App\Models\Invoice;
use App\Models\ScanJual;
use App\Services\ResitPhotoService;
use Symfony\Component\Console\Descriptor\Descriptor;
use Illuminate\Support\Facades\DB;
use App\Services\BillplzService;
use App\Http\Controllers\ApiController;
class PembidaController extends Controller
{
private $resitPhotoService;
protected $billplzService;
protected $ResitSemakanService;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(ResitPhotoService $resitPhotoService)
public function __construct(ResitPhotoService $resitPhotoService,BillplzService $billplzService)
{
$this->middleware('auth');
$this->resitPhotoService = $resitPhotoService;
$this->billplzService = $billplzService;
}
/**
@@ -1371,5 +1378,166 @@ class PembidaController extends Controller
//return view('pembida.statusserahanbypembida',compact('listwinner','lelong','arrayinfo','cawanganbidder'));
return view('pembida.statusserahanbypembida',compact('arraysms','arraysls','listwinner','lelong','cawanganbidder'));
}
public function semakanBillplz(Request $request, BillplzService $billplzService)
{
$date = $request->input('date') ?? now()->toDateString();
try {
$dateObj = Carbon::createFromFormat('Y-m-d', $date);
} catch (\Exception $e) {
return back()->with('error', 'Tarikh tidak sah. Guna format YYYY-MM-DD.');
}
$date = $dateObj->toDateString();
$allPendingResits = DB::table('resit as r')
->join('payment as p', 'p.resit_id', '=', 'r.id')
->join(DB::raw('(
SELECT user_id, total_payment, MIN(id) AS min_id
FROM payment
GROUP BY user_id, total_payment
) as unique_payment'), 'p.id', '=', 'unique_payment.min_id')
->join('users as u', 'p.user_id', '=', 'u.id')
->join('cawangan as c', 'p.kodcaw', '=', 'c.caw_code') // JOIN ikut kodcaw
// Elakkan resit yang ada CDM payment pada hari yang sama
->whereNotExists(function ($query) use ($date) {
$query->select(DB::raw(1))
->from('resit as r2')
->join('payment as p2', 'p2.resit_id', '=', 'r2.id')
->whereRaw('p2.user_id = p.user_id')
->whereRaw('p2.total_payment = p.total_payment')
->whereDate('r2.created_at', $date)
->where('r2.billplz_id', 'LIKE', '%CDM%');
})
->whereNull('r.status')
->where('p.status', 0)
->whereNotNull('r.billplz_id')
->where('r.billplz_id', 'NOT LIKE', '%CDM%')
->whereDate('r.created_at', $date)
->select(
'r.*',
'p.id as payment_id',
'p.total_payment',
'p.user_id',
'u.name as payer_name',
'c.caw_name as cawangan_nama' // Tambah nama cawangan
)
->distinct()
->get();
// Kumpul mengikut billplz_id dan user_id
$groupedResitsUnpaid = $allPendingResits
->groupBy('billplz_id') // Group mengikut billplz_id
->map(function ($items) {
return (object) [
'billplz_id' => $items->first()->billplz_id,
'jumlah_bayaran' => $items->sum('total_payment'),
'payer_name' => $items->first()->payer_name,
'cawangan_nama' => $items->first()->cawangan_nama,
'resit_id' => $items->first()->id,
'created_at' => $items->first()->created_at,
'user_id' => $items->first()->user_id,
];
})
->values(); // Reset index
$billplzWithCdmResits = DB::table('resit as r')
->join('payment as p', 'p.resit_id', '=', 'r.id')
->join(DB::raw('(
SELECT user_id, total_payment, MIN(id) AS min_id
FROM payment
GROUP BY user_id, total_payment
) as unique_payment'), 'p.id', '=', 'unique_payment.min_id')
->join('users as u', 'p.user_id', '=', 'u.id')
->join('cawangan as c', 'p.kodcaw', '=', 'c.caw_code')
->whereNull('r.status')
->where('p.status', 0)
->whereNotNull('r.billplz_id')
->where('r.billplz_id', 'NOT LIKE', '%CDM%')
->whereDate('r.created_at', $date)
->whereExists(function ($query) use ($date) {
$query->select(DB::raw(1))
->from('resit as r2')
->join('payment as p2', 'p2.resit_id', '=', 'r2.id')
->join('users as u2', 'p2.user_id', '=', 'u2.id')
->whereRaw('u2.name = u.name') // banding nama
->whereRaw('p2.total_payment = p.total_payment') // dan jumlah
->whereDate('r2.created_at', $date)
->where('r2.billplz_id', 'LIKE', '%CDM%');
})
->select('r.*', 'p.id as payment_id', 'p.total_payment', 'u.name as payer_name', 'c.caw_name as cawangan_nama')
->distinct()
->get();
$groupedResits = $billplzWithCdmResits
->groupBy('billplz_id')
->map(function ($items) {
return (object) [
'billplz_id' => $items->first()->billplz_id,
'jumlah_bayaran' => $items->sum('total_payment'),
'payer_name' => $items->first()->payer_name,
'cawangan_nama' => $items->first()->cawangan_nama,
'resit_id' => $items->first()->id,
'created_at' => $items->first()->created_at,
'user_id' => $items->first()->user_id,
];
})->values();
// Semak status Billplz untuk setiap resit
$paidResits = collect();
$unpaidResits = collect();
$processingResits = collect();
foreach ($allPendingResits as $resit) {
$billData = $billplzService->testGetBill($resit->billplz_id);
$isPaid = isset($billData['paid']) && $billData['paid'] === true;
$isProcessing = isset($billData['state']) && in_array($billData['state'], ['pending', 'processing']) && isset($billData['paid_at']);
if ($isPaid) {
$resit->paid_at = $billData['paid_at'] ?? now();
$paidResits->push($resit);
} elseif ($isProcessing) {
$resit->paid_at = $billData['paid_at'];
$resit->state = $billData['state'];
$processingResits->push($resit);
} else {
$unpaidResits->push($resit);
}
}
return view('pembida.semakanbillplz', compact(
'paidResits',
'unpaidResits',
'billplzWithCdmResits',
'processingResits',
'groupedResits',
'groupedResitsUnpaid',
'date'
));
}
public function prosesBillplz(Request $request)
{
$data = [
'billplz' => [
'id' => $request->billplz_id,
'paid' => 'true',
'paid_at' => $request->paid_at ?? now()->toDateTimeString(),
]
];
$apiController = app(ApiController::class);
$apiController->processPaidResit($data);
return redirect()->back()->with('success', 'Resit telah diproses.');
}
}