143 lines
5.8 KiB
PHP
143 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Models\Transaksi;
|
|
use App\Helpers\LaporanHelper;
|
|
use Carbon\Carbon;
|
|
use Carbon\CarbonPeriod;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
|
|
class TransaksiRepository
|
|
{
|
|
private const DAILY_PER_PAGE = 7;
|
|
private const MONTHLY_PER_PAGE = 12;
|
|
private const PAGINATION_DAYS_LIMIT = 365;
|
|
|
|
private LaporanHelper $helper;
|
|
|
|
public function __construct(LaporanHelper $helper)
|
|
{
|
|
$this->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();
|
|
}
|
|
} |