Merge pull request #3290 from CihanSenturk/add-discount-summary-report
Add discount summary report
This commit is contained in:
commit
10a2198141
|
|
@ -158,11 +158,42 @@ abstract class Report
|
|||
];
|
||||
}
|
||||
|
||||
public function getDiscount()
|
||||
{
|
||||
return [
|
||||
'item' => trans('settings.localisation.discount_location.item'),
|
||||
'total' => trans('settings.localisation.discount_location.total'),
|
||||
'both' => trans('settings.localisation.discount_location.both'),
|
||||
];
|
||||
}
|
||||
|
||||
public function applyDateFilter($event)
|
||||
{
|
||||
$event->model->dateFilter($event->args['date_field']);
|
||||
}
|
||||
|
||||
public function applyDiscountFilter($event)
|
||||
{
|
||||
$input = request('search', '');
|
||||
$discount = $this->getSearchStringValue('discount', 'both', $input);
|
||||
|
||||
switch ($discount) {
|
||||
case 'item':
|
||||
$discount_types = ['item_discount'];
|
||||
break;
|
||||
case 'total':
|
||||
$discount_types = ['discount'];
|
||||
break;
|
||||
default:
|
||||
$discount_types = ['item_discount', 'discount'];
|
||||
break;
|
||||
}
|
||||
|
||||
$event->model->whereHas('totals', function ($query) use ($discount_types) {
|
||||
$query->whereIn('code', $discount_types);
|
||||
});
|
||||
}
|
||||
|
||||
public function applySearchStringFilter($event)
|
||||
{
|
||||
$input = request('search', '');
|
||||
|
|
|
|||
|
|
@ -588,7 +588,6 @@ abstract class Report
|
|||
$url .= $parameters;
|
||||
}
|
||||
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
|
|
@ -607,6 +606,11 @@ abstract class Report
|
|||
return $this->getSearchStringValue('period', $this->getSetting('period'));
|
||||
}
|
||||
|
||||
public function getDiscount()
|
||||
{
|
||||
return $this->getSearchStringValue('discount');
|
||||
}
|
||||
|
||||
public function getFields()
|
||||
{
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class AddCustomers extends Listener
|
|||
protected $classes = [
|
||||
'App\Reports\IncomeSummary',
|
||||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ class AddDate extends Listener
|
|||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\ProfitLoss',
|
||||
'App\Reports\TaxSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
|
||||
namespace App\Listeners\Report;
|
||||
|
||||
use App\Abstracts\Listeners\Report as Listener;
|
||||
use App\Events\Report\FilterApplying;
|
||||
use App\Events\Report\FilterShowing;
|
||||
|
||||
class AddDiscount extends Listener
|
||||
{
|
||||
protected $classes = [
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
* Handle filter showing event.
|
||||
*
|
||||
* @param $event
|
||||
* @return void
|
||||
*/
|
||||
public function handleFilterShowing(FilterShowing $event)
|
||||
{
|
||||
if ($this->skipThisClass($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$event->class->filters['discounts'] = $this->getDiscount();
|
||||
$event->class->filters['keys']['discounts'] = 'discount';
|
||||
$event->class->filters['defaults']['discounts'] = 'both';
|
||||
$event->class->filters['operators']['discounts'] = [
|
||||
'equal' => true,
|
||||
'not_equal' => false,
|
||||
'range' => false,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle filter applying event.
|
||||
*
|
||||
* @param $event
|
||||
* @return void
|
||||
*/
|
||||
public function handleFilterApplying(FilterApplying $event)
|
||||
{
|
||||
if ($this->skipThisClass($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Apply discount filter
|
||||
$this->applyDiscountFilter($event);
|
||||
}
|
||||
}
|
||||
|
|
@ -20,6 +20,7 @@ class AddIncomeExpenseCategories extends Listener
|
|||
{
|
||||
$classes = [
|
||||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
if (empty($event->class) || !in_array(get_class($event->class), $classes)) {
|
||||
|
|
@ -42,6 +43,7 @@ class AddIncomeExpenseCategories extends Listener
|
|||
$classes = [
|
||||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\ProfitLoss',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
if (empty($event->class) || !in_array(get_class($event->class), $classes)) {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class AddPeriod extends Listener
|
|||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\ProfitLoss',
|
||||
'App\Reports\TaxSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class AddSearchString extends Listener
|
|||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\ProfitLoss',
|
||||
'App\Reports\TaxSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class AddVendors extends Listener
|
|||
protected $classes = [
|
||||
'App\Reports\ExpenseSummary',
|
||||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
|
||||
namespace App\Listeners\Update\V31;
|
||||
|
||||
use App\Abstracts\Listeners\Update as Listener;
|
||||
use App\Events\Install\UpdateFinished as Event;
|
||||
use App\Traits\Permissions;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class Version3119 extends Listener
|
||||
{
|
||||
use Permissions;
|
||||
|
||||
const ALIAS = 'core';
|
||||
|
||||
const VERSION = '3.1.19';
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle(Event $event)
|
||||
{
|
||||
if ($this->skipThisUpdate($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log::channel('stdout')->info('Updating to 3.1.19 version...');
|
||||
|
||||
$this->updatePermissions();
|
||||
|
||||
Log::channel('stdout')->info('Done!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update permissions.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updatePermissions()
|
||||
{
|
||||
$rows = [
|
||||
'admin' => [
|
||||
'reports-discount-summary' => 'r'
|
||||
],
|
||||
'manager' => [
|
||||
'reports-discount-summary' => 'r'
|
||||
],
|
||||
'accountant' => [
|
||||
'reports-discount-summary' => 'r'
|
||||
],
|
||||
];
|
||||
|
||||
$this->attachPermissionsByRoleNames($rows);
|
||||
}
|
||||
}
|
||||
|
|
@ -32,6 +32,7 @@ class Event extends Provider
|
|||
'App\Listeners\Update\V31\Version318',
|
||||
'App\Listeners\Update\V31\Version3112',
|
||||
'App\Listeners\Update\V31\Version3115',
|
||||
'App\Listeners\Update\V31\Version3119',
|
||||
],
|
||||
'Illuminate\Routing\Events\PreparingResponse' => [
|
||||
'App\Listeners\Common\PreparingResponse',
|
||||
|
|
@ -149,5 +150,6 @@ class Event extends Provider
|
|||
'App\Listeners\Report\AddBasis',
|
||||
'App\Listeners\Report\AddPeriod',
|
||||
'App\Listeners\Report\AddDate',
|
||||
'App\Listeners\Report\AddDiscount',
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,125 @@
|
|||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -22,6 +22,7 @@ class Reports
|
|||
'App\Reports\IncomeExpenseSummary',
|
||||
'App\Reports\TaxSummary',
|
||||
'App\Reports\ProfitLoss',
|
||||
'App\Reports\DiscountSummary',
|
||||
];
|
||||
|
||||
Module::enabled()->each(function ($module) use (&$list) {
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ class Permissions extends Seeder
|
|||
'reports-income-expense-summary' => 'r',
|
||||
'reports-profit-loss' => 'r',
|
||||
'reports-tax-summary' => 'r',
|
||||
'reports-discount-summary' => 'r',
|
||||
'settings-categories' => 'c,r,u,d',
|
||||
'settings-company' => 'r,u',
|
||||
'settings-currencies' => 'c,r,u,d',
|
||||
|
|
@ -105,6 +106,7 @@ class Permissions extends Seeder
|
|||
'reports-income-expense-summary' => 'r',
|
||||
'reports-profit-loss' => 'r',
|
||||
'reports-tax-summary' => 'r',
|
||||
'reports-discount-summary' => 'r',
|
||||
'settings-categories' => 'c,r,u,d',
|
||||
'settings-company' => 'r,u',
|
||||
'settings-currencies' => 'c,r,u,d',
|
||||
|
|
@ -151,6 +153,7 @@ class Permissions extends Seeder
|
|||
'reports-income-expense-summary' => 'r',
|
||||
'reports-profit-loss' => 'r',
|
||||
'reports-tax-summary' => 'r',
|
||||
'reports-discount-summary' => 'r',
|
||||
'modules-home' => 'r',
|
||||
'modules-item' => 'r',
|
||||
'modules-my' => 'r',
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ return [
|
|||
'contact_persons' => 'Contact Person|Contact Persons',
|
||||
'bank_feeds' => 'Bank Feed|Bank Feeds',
|
||||
'receipts' => 'Receipt|Receipts',
|
||||
'discounts' => 'Discount|Discounts',
|
||||
'ofx' => 'OFX',
|
||||
'mt940' => 'MT940',
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ return [
|
|||
'expense_summary' => 'Expense Summary',
|
||||
'income_expense_summary' => 'Income vs Expense',
|
||||
'tax_summary' => 'Tax Summary',
|
||||
'discount_summary' => 'Discount Summary',
|
||||
'gross_profit' => 'Gross Profit',
|
||||
'net_profit' => 'Net Profit',
|
||||
'total_expenses' => 'Total Expenses',
|
||||
|
|
|
|||
Loading…
Reference in New Issue