Akaunting/app/Reports/DiscountSummary.php

126 lines
3.6 KiB
PHP

<?php
namespace App\Reports;
use App\Abstracts\Report;
use App\Models\Document\Document;
use App\Utilities\Recurring;
use App\Utilities\Date;
use App\Traits\Currencies;
use App\Events\Report\TotalCalculating;
use App\Events\Report\TotalCalculated;
class DiscountSummary extends Report
{
use Currencies;
public $default_name = 'reports.discount_summary';
public $icon = 'sell';
public $type = 'summary';
public $chart = [
'income' => [
'bar' => [
'colors' => [
'#8bb475',
],
],
'donut' => [
//
],
],
'expense' => [
'bar' => [
'colors' => [
'#fb7185',
],
],
'donut' => [
//
],
],
];
public function setTables()
{
$this->tables = [
'income' => trans_choice('general.incomes', 1),
'expense' => trans_choice('general.expenses', 2),
];
}
public function setData()
{
$invoices = $this->applyFilters(Document::invoice()->with('totals')->accrued(), ['date_field' => 'issued_at'])->get();
Recurring::reflect($invoices, 'issued_at');
$this->setTotals($invoices, 'issued_at', false, 'income');
// Bills
$bills = $this->applyFilters(Document::bill()->with('totals')->accrued(), ['date_field' => 'issued_at'])->get();
Recurring::reflect($bills, 'issued_at');
$this->setTotals($bills, 'issued_at', false, 'expense');
}
public function setTotals($items, $date_field, $check_type = false, $table = 'default', $with_tax = true)
{
event(new TotalCalculating($this, $items, $date_field, $check_type, $table, $with_tax));
$group_field = $this->getSetting('group') . '_id';
foreach ($items as $item) {
// Make groups extensible
$item = $this->applyGroups($item);
$date = $this->getFormattedDate(Date::parse($item->$date_field));
if (!isset($item->$group_field)) {
continue;
}
$group = $item->$group_field;
$totals = $item->totals;
foreach ($totals as $total) {
if (! in_array($total->code, ['item_discount', 'discount'])) {
continue;
}
if (
!isset($this->row_values[$table][$group])
|| !isset($this->row_values[$table][$group][$date])
|| !isset($this->footer_totals[$table][$date])
) {
continue;
}
$amount = $this->convertToDefault($total->amount, $item->currency_code, $item->currency_rate);
$type = ($item->type === Document::INVOICE_TYPE || $item->type === 'income') ? 'income' : 'expense';
if (($check_type == false) || ($type == 'income')) {
$this->row_values[$table][$group][$date] += $amount;
$this->footer_totals[$table][$date] += $amount;
} else {
$this->row_values[$table][$group][$date] -= $amount;
$this->footer_totals[$table][$date] -= $amount;
}
}
}
event(new TotalCalculated($this, $items, $date_field, $check_type, $table, $with_tax));
}
public function getFields()
{
return [
$this->getGroupField(),
$this->getPeriodField(),
];
}
}