diff --git a/app/Http/Controllers/V1/Admin/Report/ExpensesReportController.php b/app/Http/Controllers/V1/Admin/Report/ExpensesReportController.php index b7b6d678..3998404b 100644 --- a/app/Http/Controllers/V1/Admin/Report/ExpensesReportController.php +++ b/app/Http/Controllers/V1/Admin/Report/ExpensesReportController.php @@ -7,11 +7,12 @@ use App\Models\Company; use App\Models\CompanySetting; use App\Models\Currency; use App\Models\Expense; +use Barryvdh\DomPDF\Facade\Pdf; use Carbon\Carbon; -use Illuminate\Http\JsonResponse; +use Illuminate\Contracts\View\View; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\App; -use PDF; class ExpensesReportController extends Controller { @@ -19,7 +20,7 @@ class ExpensesReportController extends Controller * Handle the incoming request. * * @param string $hash - * @return JsonResponse + * @return View|Response */ public function __invoke(Request $request, $hash) { @@ -31,14 +32,26 @@ class ExpensesReportController extends Controller App::setLocale($locale); - $expenseCategories = Expense::with('category') + // Fetch individual expenses (filtered and ordered by date), then group by category + $expenses = Expense::with('category') ->whereCompanyId($company->id) - ->applyFilters($request->only(['from_date', 'to_date'])) - ->expensesAttributes() + ->applyFilters($request->only(['from_date', 'to_date', 'expense_category_id'])) + ->orderBy('expense_date', 'asc') ->get(); - $totalAmount = 0; - foreach ($expenseCategories as $category) { - $totalAmount += $category->total_amount; + + $totalAmount = $expenses->sum('base_amount'); + + $grouped = $expenses->groupBy(function ($item) { + return $item->category ? $item->category->name : trans('expenses.uncategorized'); + }); + + $expenseGroups = collect(); + foreach ($grouped as $categoryName => $group) { + $expenseGroups->push([ + 'name' => $categoryName, + 'expenses' => $group, + 'total' => $group->sum('base_amount'), + ]); } $dateFormat = CompanySetting::getSetting('carbon_date_format', $company->id); @@ -62,7 +75,7 @@ class ExpensesReportController extends Controller ->get(); view()->share([ - 'expenseCategories' => $expenseCategories, + 'expenseGroups' => $expenseGroups, 'colorSettings' => $colorSettings, 'totalExpense' => $totalAmount, 'company' => $company, @@ -70,7 +83,7 @@ class ExpensesReportController extends Controller 'to_date' => $to_date, 'currency' => $currency, ]); - $pdf = PDF::loadView('app.pdf.reports.expenses'); + $pdf = Pdf::loadView('app.pdf.reports.expenses'); if ($request->has('preview')) { return view('app.pdf.reports.expenses'); diff --git a/lang/en.json b/lang/en.json index 66edc9d7..81e852c1 100644 --- a/lang/en.json +++ b/lang/en.json @@ -652,6 +652,7 @@ "currency": "Currency", "contact": "Contact", "category": "Category", + "uncategorized": "Uncategorized", "from_date": "From Date", "to_date": "To Date", "expense_date": "Date", @@ -1649,6 +1650,7 @@ "pdf_total_tax_label": "TOTAL TAX", "pdf_tax_types_label": "Tax Types", "pdf_expenses_label": "Expenses", + "pdf_expense_group_total_label": "Group total:", "pdf_bill_to": "Bill to,", "pdf_ship_to": "Ship to,", "pdf_received_from": "Received from:", diff --git a/resources/views/app/pdf/reports/expenses.blade.php b/resources/views/app/pdf/reports/expenses.blade.php index a38c2be7..b862d326 100644 --- a/resources/views/app/pdf/reports/expenses.blade.php +++ b/resources/views/app/pdf/reports/expenses.blade.php @@ -33,7 +33,7 @@ .heading-date-range { font-weight: normal; font-size: 15px; - color: #A5ACC1; + color: #606060; width: 100%; text-align: right; padding: 0px; @@ -41,7 +41,7 @@ } .sub-heading-text { - font-weight: normal; + font-weight: bold; font-size: 16px; color: #595959; padding: 0px; @@ -50,8 +50,7 @@ } .expenses-title { - margin-top: 60px; - padding-left: 3px; + margin-top: 30px; font-size: 16px; line-height: 21px; color: #040405; @@ -133,6 +132,84 @@ line-height: 21px; color: #5851D8; } + + /* -- Items Table -- */ + + .items-table { + margin-top: 35px; + padding: 0px 30px 10px 30px; + page-break-before: avoid; + page-break-after: auto; + } + + .items-table hr { + height: 0.1px; + } + + .item-table-heading-left { + font-size: 13.5; + text-align: left; + color: rgba(0, 0, 0, 0.85); + padding: 5px; + padding-bottom: 10px; + } + + .item-table-heading-right { + font-size: 13.5; + text-align: right; + color: rgba(0, 0, 0, 0.85); + padding: 5px; + padding-bottom: 10px; + } + + tr.item-table-heading-row th { + border-bottom: 0.620315px solid #E8E8E8; + font-size: 12px; + line-height: 18px; + } + + .item-table-heading-row { + margin-bottom: 10px; + } + + tr.item-row td { + font-size: 12px; + line-height: 18px; + } + + .item-cell-left { + font-size: 13; + color: #040405; + text-align: left; + padding: 5px; + padding-top: 10px; + border-color: #d9d9d9; + } + + .item-cell-right { + font-size: 13; + color: #040405; + text-align: right; + padding: 5px; + padding-top: 10px; + border-color: #d9d9d9; + } + + .item-description { + color: #595959; + font-size: 9px; + line-height: 12px; + } + + .item-table-group-total { + font-size: 14px; + font-weight: bold; + text-align: right; + color: rgba(0, 0, 0, 0.85); + padding: 5px; + padding-bottom: 10px; + } + @if (App::isLocale('th')) @@ -158,33 +235,28 @@

@lang('pdf_expenses_label')

-
- - @foreach ($expenseCategories as $expenseCategory) - - - + @foreach ($expenseGroups as $group) +

{{ $group['name'] }}

+
-

- {{ $expenseCategory->category->name }} -

-
-

- {!! format_money_pdf($expenseCategory->total_amount, $currency) !!} -

-
+ + + + + + @foreach ($group['expenses'] as $expense) + + + + @endforeach -
@lang('Date')@lang('Note')@lang('Amount')
{{ $expense->formatted_expense_date }}{{ $expense->notes ? $expense->notes : '-' }}{!! format_money_pdf($expense->base_amount, $currency) !!}
-
- - - - - -
-

{!! format_money_pdf($totalExpense, $currency) !!}

-
+ +
+

@lang('pdf_expense_group_total_label')   {!! format_money_pdf($group['total'], $currency) !!}

+
+ @endforeach +