[Refactor] Ubah format laporan

This commit is contained in:
Baghaztra 2025-09-19 10:27:47 +07:00
parent 88207ea1fc
commit 97192bb05a
7 changed files with 45 additions and 16 deletions

View File

@ -57,15 +57,15 @@ class LaporanHelper
$dataTerjual = $salesData->get($item->id);
return [
'nama_produk' => $item->nama,
'jumlah_item_terjual' => (int) $dataTerjual->jumlah_item_terjual,
'jumlah_item_terjual' => (int) $dataTerjual->jumlah_item_terjual, // Selalu int
'berat_terjual' => $this->formatWeight($dataTerjual->berat_terjual),
'pendapatan' => $this->formatCurrency($dataTerjual->pendapatan),
];
}
return [
return [ // Untuk kosong, return dengan 0 (akan difilter nanti)
'nama_produk' => $item->nama,
'jumlah_item_terjual' => self::DEFAULT_DISPLAY,
'jumlah_item_terjual' => 0,
'berat_terjual' => self::DEFAULT_DISPLAY,
'pendapatan' => self::DEFAULT_DISPLAY,
];

View File

@ -211,7 +211,7 @@ class ProdukController extends Controller
$foto->delete();
}
// Hapus produk (soft delete)
$produk->items()->delete();
$produk->delete();
DB::commit();

View File

@ -24,7 +24,7 @@ class Item extends Model
parent::boot();
static::creating(function ($item) {
$prefix = 'ITM';
$prefix = 'TMJC';
$date = now()->format('Ymd');
// Cari item terakhir yg dibuat hari ini

View File

@ -116,15 +116,25 @@ class LaporanService
'berat_terjual' => $item->berat_terjual ? $this->helper->formatWeight($item->berat_terjual) : '-',
'pendapatan' => $item->pendapatan ? $this->helper->formatCurrency($item->pendapatan) : '-',
];
})->filter(function ($item) {
return $item['jumlah_item_terjual'] > 0;
});
$paginatedFiltered = new \Illuminate\Pagination\LengthAwarePaginator(
$detailItem->forPage($page, $perPage),
$detailItem->count(),
$perPage,
$page,
['path' => request()->url(), 'query' => request()->query()]
);
// --- Step 5: Assemble final response ---
$filterInfo = $this->helper->buildProdukFilterInfo($tanggal, $params);
return [
'filter' => $filterInfo,
'rekap_harian' => $rekapHarian,
'produk' => $detailItem,
// 'produk' => $detailItem,
'produk' => $paginatedFiltered->getCollection(),
'pagination' => $this->helper->buildPaginationInfo($semuaProdukPaginated),
];
}
@ -151,14 +161,27 @@ class LaporanService
$totals = $this->helper->calculateTotals($nampanTerjual);
$semuaNampanPaginated = $this->helper->getAllNampanWithPagination($page, $perPage);
$detailItem = $this->helper->mapNampanWithSalesData($semuaNampanPaginated, $nampanTerjual);
// $detailItem = $this->helper->mapNampanWithSalesData($semuaNampanPaginated, $nampanTerjual);
$filterInfo = $this->helper->buildNampanFilterInfo($tanggal, $params);
$detailItem = $this->helper->mapNampanWithSalesData($semuaNampanPaginated, $nampanTerjual)
->filter(function ($item) { // TAMBAH: Filter out kosong
return $item['jumlah_item_terjual'] !== $this->helper::DEFAULT_DISPLAY && $item['jumlah_item_terjual'] > 0;
});
// Rebuild paginator serupa seperti di atas
$paginatedFiltered = new \Illuminate\Pagination\LengthAwarePaginator(
$detailItem->forPage($page, $perPage),
$detailItem->count(),
$perPage,
$page,
['path' => request()->url(), 'query' => request()->query()]
);
return [
'filter' => $filterInfo,
'rekap_harian' => $totals,
'nampan' => $detailItem->values(),
'pagination' => $this->helper->buildPaginationInfo($semuaNampanPaginated),
'nampan' => $paginatedFiltered->getCollection(),
'pagination' => $this->helper->buildPaginationInfo($paginatedFiltered),
];
}
@ -280,6 +303,8 @@ class LaporanService
'berat_terjual' => LaporanHelper::DEFAULT_DISPLAY,
'pendapatan' => LaporanHelper::DEFAULT_DISPLAY,
];
})->filter(function ($item) {
return $item['jumlah_item_terjual'] > 0;
});
$filterInfo = $this->helper->buildProdukFilterInfo($tanggal, $params);
@ -335,6 +360,8 @@ class LaporanService
'berat_terjual' => LaporanHelper::DEFAULT_DISPLAY,
'pendapatan' => LaporanHelper::DEFAULT_DISPLAY,
];
})->filter(function ($item) {
return $item['jumlah_item_terjual'] > 0;
});
$filterInfo = $this->helper->buildNampanFilterInfo($tanggal, $params);

View File

@ -33,11 +33,10 @@ class DatabaseSeeder extends Seeder
User::factory(2)->create();
Sales::factory(5)->create();
$kodeNampan = ['A', 'B'];
foreach ($kodeNampan as $kode) {
for ($i=0; $i < 4; $i++) {
for ($i=0; $i <= 30; $i++) {
if ($i != 13) {
Nampan::factory()->create([
'nama' => $kode . ($i + 1) // A1, A2, ... B4
'nama' => 'A' . ($i + 1)
]);
}
}

View File

@ -113,7 +113,7 @@
</div>
</td>
</tr>
<tr v-else-if="!sortedNampan.length">
<tr v-else-if="sortedNampan.length == 0">
<td colspan="4" class="p-4 text-center">Tidak ada data untuk ditampilkan.</td>
</tr>
<template v-else v-for="item in sortedNampan" :key="item.nama_nampan">
@ -151,6 +151,7 @@
</div>
</div>
</div>
<button @click="njir">njir</button>
</template>
<script setup>
@ -159,6 +160,10 @@ import InputSelect from './InputSelect.vue';
import InputField from './InputField.vue';
import axios from 'axios';
const njir = ()=>{
console.log(sortedNampan.value);
}
// --- State ---
const isExportOpen = ref(false);
const exportDropdownRef = ref(null);

View File

@ -279,10 +279,8 @@ async function deleteProduk() {
products.value = products.value.filter((p) => p.id !== detail.value.id);
deleting.value = false;
showOverlay.value = false;
alert("Produk berhasil dihapus!");
} catch (err) {
console.error("Gagal hapus produk:", err);
alert("Gagal menghapus produk!");
}
}
</script>