sum('pendapatan'); $totalItemTerjual = $data->sum('jumlah_item_terjual'); $totalBeratTerjual = $data->sum('berat_terjual'); return [ 'total_item_terjual' => $totalItemTerjual, 'total_berat_terjual' => $this->formatWeight($totalBeratTerjual), 'total_pendapatan' => $this->formatCurrency($totalPendapatan), ]; } public function getAllNampanWithPagination(int $page, int $perPage): LengthAwarePaginator { $semuaNampan = Nampan::select('id', 'nama')->orderBy('nama')->get(); $brankasEntry = (object) ['id' => 0, 'nama' => 'Brankas']; $semuaNampanCollection = $semuaNampan->prepend($brankasEntry); $offset = ($page - 1) * $perPage; $itemsForCurrentPage = $semuaNampanCollection->slice($offset, $perPage); return new LengthAwarePaginator( $itemsForCurrentPage, $semuaNampanCollection->count(), $perPage, $page, ['path' => request()->url(), 'query' => request()->query()] ); } public function mapProductsWithSalesData($paginatedData, Collection $salesData): Collection { return $paginatedData->getCollection()->map(function ($item) use ($salesData) { if ($salesData->has($item->id)) { $dataTerjual = $salesData->get($item->id); return [ 'nama_produk' => $item->nama, 'jumlah_item_terjual' => (int) $dataTerjual->jumlah_item_terjual, 'berat_terjual' => $this->formatWeight($dataTerjual->berat_terjual), 'pendapatan' => $this->formatCurrency($dataTerjual->pendapatan), ]; } return [ 'nama_produk' => $item->nama, 'jumlah_item_terjual' => self::DEFAULT_DISPLAY, 'berat_terjual' => self::DEFAULT_DISPLAY, 'pendapatan' => self::DEFAULT_DISPLAY, ]; }); } public function mapNampanWithSalesData($paginatedData, Collection $salesData): Collection { return $paginatedData->getCollection()->map(function ($item) use ($salesData) { if ($salesData->has($item->id)) { $dataTerjual = $salesData->get($item->id); return [ 'nama_nampan' => $item->nama, 'jumlah_item_terjual' => (int) $dataTerjual->jumlah_item_terjual, 'berat_terjual' => $this->formatWeight($dataTerjual->berat_terjual), 'pendapatan' => $this->formatCurrency($dataTerjual->pendapatan), ]; } return [ 'nama_nampan' => $item->nama, 'jumlah_item_terjual' => self::DEFAULT_DISPLAY, 'berat_terjual' => self::DEFAULT_DISPLAY, 'pendapatan' => self::DEFAULT_DISPLAY, ]; }); } public function buildProdukFilterInfo(Carbon $carbonDate, array $params): array { $filterInfo = [ 'tanggal' => $carbonDate->isoFormat('dddd, D MMMM Y'), 'nama_sales' => null, 'nampan' => null, 'nama_pembeli' => $params['nama_pembeli'] ?? null, ]; if (!empty($params['sales_id'])) { $sales = Sales::find($params['sales_id']); $filterInfo['nama_sales'] = $sales?->nama; } if (isset($params['nampan_id'])) { if ($params['nampan_id'] == 0) { $filterInfo['nampan'] = 'Brankas'; } else { $nampan = Nampan::find($params['nampan_id']); $filterInfo['nampan'] = $nampan?->nama; } } return $filterInfo; } public function buildNampanFilterInfo(Carbon $carbonDate, array $params): array { $filterInfo = [ 'tanggal' => $carbonDate->isoFormat('dddd, D MMMM Y'), 'nama_sales' => null, 'produk' => null, 'nama_pembeli' => $params['nama_pembeli'] ?? null, ]; if (!empty($params['sales_id'])) { $sales = Sales::find($params['sales_id']); $filterInfo['nama_sales'] = $sales?->nama; } if (!empty($params['produk_id'])) { $produk = Produk::find($params['produk_id']); $filterInfo['produk'] = $produk?->nama; } return $filterInfo; } public function buildPaginationInfo($paginatedData): array { return [ 'current_page' => $paginatedData->currentPage(), 'last_page' => $paginatedData->lastPage(), 'per_page' => $paginatedData->perPage(), 'total' => $paginatedData->total(), 'from' => $paginatedData->firstItem(), 'to' => $paginatedData->lastItem(), ]; } public function hitungDataSales(Collection $transaksisPerSales): array { $itemTerjual = $transaksisPerSales->sum(fn($t) => $t->itemTransaksi->count()); $beratTerjual = $transaksisPerSales->sum( fn($t) => $t->itemTransaksi->sum(fn($it) => $it->item?->produk?->berat ?? 0) ); $pendapatan = $transaksisPerSales->sum('total_harga'); return [ 'nama' => $transaksisPerSales->first()->nama_sales, 'item_terjual' => $itemTerjual, 'berat_terjual_raw' => $beratTerjual, 'pendapatan_raw' => $pendapatan, ]; } public function defaultSalesData(string $namaSales): array { return [ 'nama' => $namaSales, 'item_terjual' => 0, 'berat_terjual_raw' => 0, 'pendapatan_raw' => 0, ]; } public function formatSalesDataValues(Collection $salesData): Collection { return $salesData->map(function ($sale) { $sale['item_terjual'] = $sale['item_terjual'] > 0 ? $sale['item_terjual'] : self::DEFAULT_DISPLAY; $sale['berat_terjual'] = $sale['berat_terjual_raw'] > 0 ? $this->formatWeight($sale['berat_terjual_raw']) : self::DEFAULT_DISPLAY; $sale['pendapatan'] = $sale['pendapatan_raw'] > 0 ? $this->formatCurrency($sale['pendapatan_raw']) : self::DEFAULT_DISPLAY; unset($sale['berat_terjual_raw'], $sale['pendapatan_raw']); return $sale; }); } public function formatCurrency(float $amount): string { return self::CURRENCY_SYMBOL . number_format($amount, 2, ',', '.'); } public function formatWeight(float $weight): string { return number_format($weight, 2, ',', '.') . self::WEIGHT_UNIT; } }