helper = $helper; } public function processLaporanHarian(Collection $allSalesNames, int $page = 1, bool $limitPagination = true) { $perPage = self::DAILY_PER_PAGE; if ($limitPagination) { $endDate = Carbon::today()->subDays(($page - 1) * $perPage); $startDate = $endDate->copy()->subDays($perPage - 1); $totalHariUntukPaginasi = self::PAGINATION_DAYS_LIMIT; } else { $endDate = Carbon::today(); $startDate = $endDate->copy()->subYear()->addDay(); $totalHariUntukPaginasi = $endDate->diffInDays($startDate) + 1; } $transaksis = Transaksi::with(['itemTransaksi.item.produk']) ->whereBetween('created_at', [$startDate->startOfDay(), $endDate->endOfDay()]) ->orderBy('created_at', 'desc') ->get(); $transaksisByDay = $transaksis->groupBy(function ($transaksi) { return Carbon::parse($transaksi->created_at)->format('Y-m-d'); }); $period = CarbonPeriod::create($startDate, $endDate); $laporan = []; foreach ($period as $date) { $dateString = $date->format('Y-m-d'); $tanggalFormatted = $date->isoFormat('dddd, D MMMM Y'); if (isset($transaksisByDay[$dateString])) { $transaksisPerTanggal = $transaksisByDay[$dateString]; $salesDataTransaksi = $transaksisPerTanggal->groupBy('nama_sales') ->map(fn($transaksisPerSales) => $this->helper->hitungDataSales($transaksisPerSales)); $fullSalesData = $allSalesNames->map(function ($namaSales) use ($salesDataTransaksi) { return $salesDataTransaksi->get($namaSales) ?? $this->helper->defaultSalesData($namaSales); }); $totalItem = $fullSalesData->sum('item_terjual'); $totalBerat = $fullSalesData->sum('berat_terjual_raw'); $totalPendapatan = $fullSalesData->sum('pendapatan_raw'); $laporan[$dateString] = [ 'tanggal' => $tanggalFormatted, 'total_item_terjual' => $totalItem > 0 ? $totalItem : LaporanHelper::DEFAULT_DISPLAY, 'total_berat' => $totalBerat > 0 ? $this->helper->formatWeight($totalBerat) : LaporanHelper::DEFAULT_DISPLAY, 'total_pendapatan' => $totalPendapatan > 0 ? $this->helper->formatCurrency($totalPendapatan) : LaporanHelper::DEFAULT_DISPLAY, 'sales' => $this->helper->formatSalesDataValues($fullSalesData)->values(), ]; } else { $laporan[$dateString] = [ 'tanggal' => $tanggalFormatted, 'total_item_terjual' => LaporanHelper::DEFAULT_DISPLAY, 'total_berat' => LaporanHelper::DEFAULT_DISPLAY, 'total_pendapatan' => LaporanHelper::DEFAULT_DISPLAY, 'sales' => [], ]; } } if ($limitPagination) { return new LengthAwarePaginator( array_reverse(array_values($laporan)), $totalHariUntukPaginasi, $perPage, $page, ['path' => request()->url(), 'query' => request()->query()] ); } return collect(array_reverse(array_values($laporan))); } public function processLaporanBulanan(Collection $allSalesNames, int $page = 1, bool $limitPagination = true) { $perPage = self::MONTHLY_PER_PAGE; $transaksis = Transaksi::with(['itemTransaksi.item.produk']) ->orderBy('created_at', 'desc') ->get(); $laporan = $transaksis->groupBy(function ($transaksi) { return Carbon::parse($transaksi->created_at)->format('F Y'); })->map(function ($transaksisPerTanggal, $tanggal) use ($allSalesNames) { $salesDataTransaksi = $transaksisPerTanggal ->groupBy('nama_sales') ->map(fn($transaksisPerSales) => $this->helper->hitungDataSales($transaksisPerSales)); $fullSalesData = $allSalesNames->map(function ($namaSales) use ($salesDataTransaksi) { return $salesDataTransaksi->get($namaSales) ?? $this->helper->defaultSalesData($namaSales); }); $totalItem = $fullSalesData->sum('item_terjual'); $totalBerat = $fullSalesData->sum('berat_terjual_raw'); $totalPendapatan = $fullSalesData->sum('pendapatan_raw'); return [ 'tanggal' => $tanggal, 'total_item_terjual' => $totalItem > 0 ? $totalItem : LaporanHelper::DEFAULT_DISPLAY, 'total_berat' => $totalBerat > 0 ? $this->helper->formatWeight($totalBerat) : LaporanHelper::DEFAULT_DISPLAY, 'total_pendapatan' => $totalPendapatan > 0 ? $this->helper->formatCurrency($totalPendapatan) : LaporanHelper::DEFAULT_DISPLAY, 'sales' => $this->helper->formatSalesDataValues($fullSalesData)->values(), ]; }); if ($limitPagination) { return new LengthAwarePaginator( $laporan->forPage($page, $perPage)->values(), $laporan->count(), $perPage, $page, ['path' => request()->url(), 'query' => request()->query()] ); } return $laporan->values(); } }