[Fix] page
This commit is contained in:
parent
7ef8f79b6c
commit
88d14def41
@ -54,9 +54,9 @@ class LaporanService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get paginated sales detail aggregated by product.
|
* Get sales detail aggregated by product (NO PAGINATION - all data).
|
||||||
*
|
*
|
||||||
* @param array $params Filter parameters (tanggal, sales_id, nampan_id, nama_pembeli, page, per_page)
|
* @param array $params Filter parameters (tanggal, sales_id, nampan_id, nama_pembeli)
|
||||||
* @return array Report data structure
|
* @return array Report data structure
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
@ -65,16 +65,17 @@ class LaporanService
|
|||||||
$startDate = Carbon::parse($params['start_date'])->startOfDay();
|
$startDate = Carbon::parse($params['start_date'])->startOfDay();
|
||||||
$endDate = Carbon::parse($params['end_date'])->endOfDay();
|
$endDate = Carbon::parse($params['end_date'])->endOfDay();
|
||||||
|
|
||||||
// TAMBAH: Validasi range max 30 hari (backup request)
|
// TAMBAH: Validasi range max 30 hari
|
||||||
if ($startDate->diffInDays($endDate) > 30) {
|
if ($startDate->diffInDays($endDate) > 30) {
|
||||||
throw new \InvalidArgumentException('Interval tanggal maksimal 30 hari.');
|
throw new \InvalidArgumentException('Interval tanggal maksimal 30 hari.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXED: Skip pagination params untuk data utama
|
||||||
$page = $params['page'] ?? 1;
|
$page = $params['page'] ?? 1;
|
||||||
$perPage = $params['per_page'] ?? self::DEFAULT_PER_PAGE;
|
$perPage = $params['per_page'] ?? self::DEFAULT_PER_PAGE;
|
||||||
|
|
||||||
// --- Step 1: Totals ---
|
// --- Step 1: Totals ---
|
||||||
$totalsQuery = $this->buildBaseItemQueryForRange($startDate, $endDate); // FIXED: Call benar
|
$totalsQuery = $this->buildBaseItemQueryForRange($startDate, $endDate);
|
||||||
$this->applyFilters($totalsQuery, $params);
|
$this->applyFilters($totalsQuery, $params);
|
||||||
|
|
||||||
$totalsResult = $totalsQuery->select(
|
$totalsResult = $totalsQuery->select(
|
||||||
@ -89,7 +90,7 @@ class LaporanService
|
|||||||
'total_pendapatan' => $this->helper->formatCurrency($totalsResult->total_pendapatan),
|
'total_pendapatan' => $this->helper->formatCurrency($totalsResult->total_pendapatan),
|
||||||
];
|
];
|
||||||
|
|
||||||
// --- Step 2: Subquery ---
|
// --- Step 2: Subquery for all products ---
|
||||||
$salesSubQuery = $this->buildBaseItemQueryForRange($startDate, $endDate)
|
$salesSubQuery = $this->buildBaseItemQueryForRange($startDate, $endDate)
|
||||||
->select(
|
->select(
|
||||||
'produks.id as id_produk',
|
'produks.id as id_produk',
|
||||||
@ -101,8 +102,8 @@ class LaporanService
|
|||||||
|
|
||||||
$this->applyFilters($salesSubQuery, $params);
|
$this->applyFilters($salesSubQuery, $params);
|
||||||
|
|
||||||
// --- Step 3: Paginated products ---
|
// --- Step 3: All products (NO PAGINATION) ---
|
||||||
$semuaProdukPaginated = Produk::select(
|
$semuaProduk = Produk::select(
|
||||||
'produks.id',
|
'produks.id',
|
||||||
'produks.nama as nama_produk',
|
'produks.nama as nama_produk',
|
||||||
'sales_data.jumlah_item_terjual',
|
'sales_data.jumlah_item_terjual',
|
||||||
@ -113,10 +114,10 @@ class LaporanService
|
|||||||
$join->on('produks.id', '=', 'sales_data.id_produk');
|
$join->on('produks.id', '=', 'sales_data.id_produk');
|
||||||
})
|
})
|
||||||
->orderBy('produks.nama')
|
->orderBy('produks.nama')
|
||||||
->paginate($perPage, ['*'], 'page', $page);
|
->get(); // FIXED: get() instead of paginate()
|
||||||
|
|
||||||
// --- Step 4: Map & filter ---
|
// --- Step 4: Map & filter ---
|
||||||
$detailItem = $semuaProdukPaginated->map(function ($item) {
|
$detailItem = $semuaProduk->map(function ($item) {
|
||||||
return [
|
return [
|
||||||
'nama_produk' => $item->nama_produk,
|
'nama_produk' => $item->nama_produk,
|
||||||
'jumlah_item_terjual' => $item->jumlah_item_terjual ? (int) $item->jumlah_item_terjual : 0,
|
'jumlah_item_terjual' => $item->jumlah_item_terjual ? (int) $item->jumlah_item_terjual : 0,
|
||||||
@ -127,13 +128,8 @@ class LaporanService
|
|||||||
return $item['jumlah_item_terjual'] > 0;
|
return $item['jumlah_item_terjual'] > 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
$paginatedFiltered = new \Illuminate\Pagination\LengthAwarePaginator(
|
// FIXED: Simple collection without pagination
|
||||||
$detailItem->forPage($page, $perPage),
|
$filteredCollection = $detailItem->values();
|
||||||
$detailItem->count(), // FIXED: Total dari filtered
|
|
||||||
$perPage,
|
|
||||||
$page,
|
|
||||||
['path' => request()->url(), 'query' => request()->query()]
|
|
||||||
);
|
|
||||||
|
|
||||||
// --- Step 5: Response ---
|
// --- Step 5: Response ---
|
||||||
$filterInfo = $this->helper->buildProdukFilterInfo($startDate, $endDate, $params);
|
$filterInfo = $this->helper->buildProdukFilterInfo($startDate, $endDate, $params);
|
||||||
@ -141,8 +137,16 @@ class LaporanService
|
|||||||
return [
|
return [
|
||||||
'filter' => $filterInfo,
|
'filter' => $filterInfo,
|
||||||
'rekap_interval' => $rekapInterval,
|
'rekap_interval' => $rekapInterval,
|
||||||
'produk' => $paginatedFiltered->getCollection(),
|
'produk' => $filteredCollection,
|
||||||
'pagination' => $this->helper->buildPaginationInfo($paginatedFiltered), // FIXED: Dari filtered
|
'pagination' => [
|
||||||
|
'current_page' => 1,
|
||||||
|
'from' => 1,
|
||||||
|
'last_page' => 1,
|
||||||
|
'per_page' => $filteredCollection->count(),
|
||||||
|
'to' => $filteredCollection->count(),
|
||||||
|
'total' => $filteredCollection->count(),
|
||||||
|
'has_more_pages' => false,
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,6 +158,13 @@ class LaporanService
|
|||||||
->whereBetween('transaksis.created_at', [$startDate, $endDate]);
|
->whereBetween('transaksis.created_at', [$startDate, $endDate]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get sales detail aggregated by nampan (NO PAGINATION - all data).
|
||||||
|
*
|
||||||
|
* @param array $params Filter parameters (tanggal, sales_id, produk_id, nama_pembeli)
|
||||||
|
* @return array Report data structure
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
public function getDetailPerNampan(array $params)
|
public function getDetailPerNampan(array $params)
|
||||||
{
|
{
|
||||||
$startDate = Carbon::parse($params['start_date'])->startOfDay();
|
$startDate = Carbon::parse($params['start_date'])->startOfDay();
|
||||||
@ -166,7 +177,7 @@ class LaporanService
|
|||||||
$page = $params['page'] ?? 1;
|
$page = $params['page'] ?? 1;
|
||||||
$perPage = $params['per_page'] ?? self::DEFAULT_PER_PAGE;
|
$perPage = $params['per_page'] ?? self::DEFAULT_PER_PAGE;
|
||||||
|
|
||||||
$nampanTerjualQuery = $this->buildBaseItemQueryForRange($startDate, $endDate); // FIXED: Range
|
$nampanTerjualQuery = $this->buildBaseItemQueryForRange($startDate, $endDate);
|
||||||
$this->applyNampanFilters($nampanTerjualQuery, $params);
|
$this->applyNampanFilters($nampanTerjualQuery, $params);
|
||||||
|
|
||||||
$nampanTerjual = $nampanTerjualQuery
|
$nampanTerjual = $nampanTerjualQuery
|
||||||
@ -190,27 +201,31 @@ class LaporanService
|
|||||||
});
|
});
|
||||||
$totals = $this->helper->calculateTotals($nampanTerjualRaw);
|
$totals = $this->helper->calculateTotals($nampanTerjualRaw);
|
||||||
|
|
||||||
$semuaNampanPaginated = $this->helper->getAllNampanWithPagination($page, $perPage);
|
// FIXED: Get all nampan without pagination
|
||||||
$detailItem = $this->helper->mapNampanWithSalesData($semuaNampanPaginated, $nampanTerjual)
|
$semuaNampan = $this->helper->getAllNampanWithPagination(1, PHP_INT_MAX); // Skip pagination
|
||||||
|
$detailItem = $this->helper->mapNampanWithSalesData($semuaNampan, $nampanTerjual)
|
||||||
->filter(function ($item) {
|
->filter(function ($item) {
|
||||||
return $item['jumlah_item_terjual'] > 0; // FIXED: Int compare, no DEFAULT_DISPLAY check
|
return $item['jumlah_item_terjual'] > 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
$paginatedFiltered = new \Illuminate\Pagination\LengthAwarePaginator(
|
// FIXED: Simple collection without pagination
|
||||||
$detailItem->forPage($page, $perPage),
|
$filteredCollection = $detailItem->values();
|
||||||
$detailItem->count(),
|
|
||||||
$perPage,
|
|
||||||
$page,
|
|
||||||
['path' => request()->url(), 'query' => request()->query()]
|
|
||||||
);
|
|
||||||
|
|
||||||
$filterInfo = $this->helper->buildNampanFilterInfo($startDate, $endDate, $params); // FIXED: Range helper
|
$filterInfo = $this->helper->buildNampanFilterInfo($startDate, $endDate, $params);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'filter' => $filterInfo,
|
'filter' => $filterInfo,
|
||||||
'rekap_interval' => $totals, // FIXED: Rename
|
'rekap_interval' => $totals,
|
||||||
'nampan' => $paginatedFiltered->getCollection(),
|
'nampan' => $filteredCollection,
|
||||||
'pagination' => $this->helper->buildPaginationInfo($paginatedFiltered),
|
'pagination' => [
|
||||||
|
'current_page' => 1,
|
||||||
|
'from' => 1,
|
||||||
|
'last_page' => 1,
|
||||||
|
'per_page' => $filteredCollection->count(),
|
||||||
|
'to' => $filteredCollection->count(),
|
||||||
|
'total' => $filteredCollection->count(),
|
||||||
|
'has_more_pages' => false,
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,14 +269,14 @@ class LaporanService
|
|||||||
|
|
||||||
$startDate = Carbon::parse($params['start_date'])->format('Ymd');
|
$startDate = Carbon::parse($params['start_date'])->format('Ymd');
|
||||||
$endDate = Carbon::parse($params['end_date'])->format('Ymd');
|
$endDate = Carbon::parse($params['end_date'])->format('Ymd');
|
||||||
$fileName = "laporan_per_produk_{$startDate}_to_{$endDate}.{$format}"; // FIXED: Range filename
|
$fileName = "laporan_per_produk_{$startDate}_to_{$endDate}.{$format}";
|
||||||
|
|
||||||
if ($format === 'pdf') {
|
if ($format === 'pdf') {
|
||||||
$pdf = PDF::loadView('exports.perproduk_pdf', [
|
$pdf = PDF::loadView('exports.perproduk_pdf', [
|
||||||
'data' => $data,
|
'data' => $data,
|
||||||
'title' => 'Laporan Detail Per Produk'
|
'title' => 'Laporan Detail Per Produk'
|
||||||
]);
|
]);
|
||||||
$pdf->setPaper('a4', 'portrait'); // FIXED: Typo 'potrait'
|
$pdf->setPaper('a4', 'portrait');
|
||||||
return $pdf->download($fileName);
|
return $pdf->download($fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,7 +293,7 @@ class LaporanService
|
|||||||
|
|
||||||
$startDate = Carbon::parse($params['start_date'])->format('Ymd');
|
$startDate = Carbon::parse($params['start_date'])->format('Ymd');
|
||||||
$endDate = Carbon::parse($params['end_date'])->format('Ymd');
|
$endDate = Carbon::parse($params['end_date'])->format('Ymd');
|
||||||
$fileName = "laporan_per_nampan_{$startDate}_to_{$endDate}.{$format}"; // FIXED: Range
|
$fileName = "laporan_per_nampan_{$startDate}_to_{$endDate}.{$format}";
|
||||||
|
|
||||||
if ($format === 'pdf') {
|
if ($format === 'pdf') {
|
||||||
$pdf = PDF::loadView('exports.pernampan_pdf', [
|
$pdf = PDF::loadView('exports.pernampan_pdf', [
|
||||||
@ -334,14 +349,14 @@ class LaporanService
|
|||||||
'pendapatan' => $this->helper->formatCurrency($dataTerjual->pendapatan),
|
'pendapatan' => $this->helper->formatCurrency($dataTerjual->pendapatan),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
return null; // Akan difilter
|
return null;
|
||||||
})->filter(); // FIXED: Filter null/kosong
|
})->filter();
|
||||||
|
|
||||||
$filterInfo = $this->helper->buildProdukFilterInfo($startDate, $endDate, $params);
|
$filterInfo = $this->helper->buildProdukFilterInfo($startDate, $endDate, $params);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'filter' => $filterInfo,
|
'filter' => $filterInfo,
|
||||||
'rekap_interval' => $totals, // FIXED: Rename
|
'rekap_interval' => $totals,
|
||||||
'produk' => $detailItem->values(),
|
'produk' => $detailItem->values(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -376,7 +391,7 @@ class LaporanService
|
|||||||
$totals = $this->helper->calculateTotals($nampanTerjualRaw);
|
$totals = $this->helper->calculateTotals($nampanTerjualRaw);
|
||||||
|
|
||||||
$semuaPosisi = DB::table('item_transaksis')
|
$semuaPosisi = DB::table('item_transaksis')
|
||||||
->whereBetween('created_at', [$startDate, $endDate]) // FIXED: Filter posisi di range
|
->whereBetween('created_at', [$startDate, $endDate])
|
||||||
->select('posisi_asal')
|
->select('posisi_asal')
|
||||||
->distinct()
|
->distinct()
|
||||||
->pluck('posisi_asal')
|
->pluck('posisi_asal')
|
||||||
@ -393,10 +408,10 @@ class LaporanService
|
|||||||
'pendapatan' => $this->helper->formatCurrency($dataTerjual->pendapatan),
|
'pendapatan' => $this->helper->formatCurrency($dataTerjual->pendapatan),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
return null; // Filter out
|
return null;
|
||||||
})->filter();
|
})->filter();
|
||||||
|
|
||||||
$filterInfo = $this->helper->buildNampanFilterInfo($startDate, $endDate, $params); // FIXED: Range
|
$filterInfo = $this->helper->buildNampanFilterInfo($startDate, $endDate, $params);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'filter' => $filterInfo,
|
'filter' => $filterInfo,
|
||||||
@ -405,7 +420,6 @@ class LaporanService
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private function getAllSalesNames(): Collection
|
private function getAllSalesNames(): Collection
|
||||||
{
|
{
|
||||||
return Cache::remember('all_sales_names', self::CACHE_TTL, function () {
|
return Cache::remember('all_sales_names', self::CACHE_TTL, function () {
|
||||||
@ -434,7 +448,7 @@ class LaporanService
|
|||||||
$nampanId = (int) $params['nampan_id'];
|
$nampanId = (int) $params['nampan_id'];
|
||||||
if ($nampanId === -1) {
|
if ($nampanId === -1) {
|
||||||
$query->where('item_transaksis.posisi_asal', 'Brankas');
|
$query->where('item_transaksis.posisi_asal', 'Brankas');
|
||||||
} elseif ($nampanId > 0) { // FIXED: >0 join, 0 skip (all)
|
} elseif ($nampanId > 0) {
|
||||||
$query->join('nampans', function ($join) use ($nampanId) {
|
$query->join('nampans', function ($join) use ($nampanId) {
|
||||||
$join->on('item_transaksis.posisi_asal', '=', 'nampans.nama')
|
$join->on('item_transaksis.posisi_asal', '=', 'nampans.nama')
|
||||||
->where('nampans.id', $nampanId);
|
->where('nampans.id', $nampanId);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user