feat(webstatement): tambahkan fitur ekspor data kartu ATM ke CSV
- Menambahkan `BiayaKartuController` untuk mengelola data kartu ATM. - Menyediakan endpoint baru `biaya-kartu.index` untuk mengunduh data kartu ATM dalam format CSV. - Implementasi fungsi untuk: - Mengambil data kartu ATM yang memenuhi syarat dari database. - Menentukan biaya kartu berdasarkan tipe kartu. - Membuat file CSV dengan format khusus dan membersihkan konten dari tanda kutip ganda. - Memodifikasi logika pembaruan data di `BiayaKartu.php` untuk memperbaiki penempatan pemanggilan fungsi `updateOrCreate`. Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
199
app/Http/Controllers/BiayaKartuController.php
Normal file
199
app/Http/Controllers/BiayaKartuController.php
Normal file
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Webstatement\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Webstatement\Models\Atmcard;
|
||||
use RuntimeException;
|
||||
|
||||
class BiayaKartuController extends Controller
|
||||
{
|
||||
private const DEFAULT_FEES = [
|
||||
'CLASSIC' => 3000,
|
||||
'CLAS' => 3000,
|
||||
'SILVER' => 5000,
|
||||
'SILV' => 5000,
|
||||
'GOLD' => 10000
|
||||
];
|
||||
private const CSV_FILENAME = 'atmcards.csv';
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$filename = $this->generateAtmCardCsv();
|
||||
return response()->download($filename)->deleteFileAfterSend(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate CSV file with ATM card data
|
||||
*
|
||||
* @return string Filename of generated CSV
|
||||
*/
|
||||
private function generateAtmCardCsv()
|
||||
: string
|
||||
{
|
||||
$cards = $this->getEligibleAtmCards();
|
||||
$filename = self::CSV_FILENAME;
|
||||
|
||||
$handle = fopen($filename, 'w+');
|
||||
if (!$handle) {
|
||||
throw new RuntimeException("Tidak dapat membuat file CSV: $filename");
|
||||
}
|
||||
|
||||
try {
|
||||
foreach ($cards as $card) {
|
||||
$fee = $this->determineCardFee($card);
|
||||
$csvRow = $this->createCsvRow($card, $fee);
|
||||
fputcsv($handle, $csvRow, '|');
|
||||
}
|
||||
} finally {
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
$this->cleanupCsvFile($filename);
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get eligible ATM cards from database
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
private function getEligibleAtmCards()
|
||||
{
|
||||
return Atmcard::where('crsts', 1)
|
||||
->whereNotNull('accflag')
|
||||
->whereNotNull('branch')
|
||||
->whereNotNull('currency')
|
||||
->whereIn('ctdesc', array_keys(self::DEFAULT_FEES))
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine fee for a card based on its type
|
||||
*
|
||||
* @param Atmcard $card
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private function determineCardFee(Atmcard $card)
|
||||
: int
|
||||
{
|
||||
if ($card->fee) {
|
||||
return $card->fee;
|
||||
}
|
||||
|
||||
return self::DEFAULT_FEES[$card->ctdesc] ?? 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create CSV row data for a card
|
||||
*
|
||||
* @param Atmcard $card
|
||||
* @param int $fee
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function createCsvRow(Atmcard $card, int $fee)
|
||||
: array
|
||||
{
|
||||
$today = date('Ymd');
|
||||
|
||||
return [
|
||||
'',
|
||||
$card->accflag,
|
||||
$card->currency ?? 'IDR',
|
||||
$fee,
|
||||
'PL65129',
|
||||
'',
|
||||
'',
|
||||
$card->branch,
|
||||
$today,
|
||||
$today,
|
||||
'',
|
||||
'',
|
||||
'ADMIN FEE ATM::' . $card->crdno . '::' . $today,
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'AC'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove double quotes from CSV file
|
||||
*
|
||||
* @param string $filename
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function cleanupCsvFile(string $filename)
|
||||
: void
|
||||
{
|
||||
$fileContent = file_get_contents($filename);
|
||||
if ($fileContent === false) {
|
||||
throw new RuntimeException("Tidak dapat membaca file CSV: $filename");
|
||||
}
|
||||
|
||||
$fileContent = str_replace('"', '', $fileContent);
|
||||
|
||||
if (file_put_contents($filename, $fileContent) === false) {
|
||||
throw new RuntimeException("Tidak dapat menulis ke file CSV: $filename");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('webstatement::create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
return view('webstatement::show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
return view('webstatement::edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user