180 lines
6.8 KiB
PHP
180 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace Modules\Accounting\Http\Controllers;
|
|
|
|
use App\Charts\CommonChart;
|
|
use App\Utils\ModuleUtil;
|
|
use DB;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Routing\Controller;
|
|
use Modules\Accounting\Entities\AccountingAccount;
|
|
use Modules\Accounting\Entities\AccountingAccountType;
|
|
use Modules\Accounting\Services\AccountingHealthService;
|
|
use Modules\Accounting\Utils\AccountingUtil;
|
|
|
|
class AccountingController extends Controller
|
|
{
|
|
protected $accountingUtil;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(AccountingUtil $accountingUtil, ModuleUtil $moduleUtil)
|
|
{
|
|
$this->accountingUtil = $accountingUtil;
|
|
$this->moduleUtil = $moduleUtil;
|
|
}
|
|
|
|
/**
|
|
* Display dashboard for accounting module.
|
|
*
|
|
* @return Response
|
|
*/
|
|
public function dashboard(AccountingHealthService $healthService)
|
|
{
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
if (! (auth()->user()->can('superadmin') ||
|
|
$this->moduleUtil->hasThePermissionInSubscription($business_id, 'accounting_module'))) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
$start_date = request()->get('start_date', session()->get('financial_year.start'));
|
|
$end_date = request()->get('end_date', session()->get('financial_year.end'));
|
|
$balance_formula = $this->accountingUtil->balanceFormula();
|
|
|
|
$coa_overview = AccountingAccount::leftjoin('accounting_accounts_transactions as AAT',
|
|
'AAT.accounting_account_id', '=', 'accounting_accounts.id')
|
|
->where('business_id', $business_id)
|
|
->whereDate('AAT.operation_date', '>=', $start_date)
|
|
->whereDate('AAT.operation_date', '<=', $end_date)
|
|
->select(
|
|
DB::raw($balance_formula),
|
|
'accounting_accounts.account_primary_type'
|
|
)
|
|
->groupBy('accounting_accounts.account_primary_type')
|
|
->get();
|
|
|
|
$account_types = AccountingAccountType::accounting_primary_type();
|
|
|
|
$labels = [];
|
|
$values = [];
|
|
|
|
foreach ($account_types as $k => $v) {
|
|
$value = 0;
|
|
|
|
foreach ($coa_overview as $overview) {
|
|
if ($overview->account_primary_type == $k && ! empty($overview->balance)) {
|
|
$value = (float) $overview->balance;
|
|
}
|
|
}
|
|
$values[] = abs($value);
|
|
|
|
//Suffix CR/DR as per value
|
|
$tmp = $v['label'];
|
|
if ($value < 0) {
|
|
$tmp .= (in_array($v['label'], ['Asset', 'Expenses']) ? ' (CR)' : ' (DR)');
|
|
}
|
|
$labels[] = $tmp;
|
|
}
|
|
|
|
$colors = ['#E75E82', '#37A2EC', '#FACD56', '#5CA85C', '#605CA8',
|
|
'#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce',
|
|
'#492970', '#f28f43', '#77a1e5', '#c42525', '#a6c96a', ];
|
|
$coa_overview_chart = new CommonChart;
|
|
$coa_overview_chart->labels($labels)
|
|
->options($this->__chartOptions())
|
|
->dataset(__('accounting::lang.current_balance'), 'pie', $values)
|
|
->color($colors);
|
|
|
|
$all_charts = [];
|
|
foreach ($account_types as $k => $v) {
|
|
$sub_types = AccountingAccountType::where('account_primary_type', $k)
|
|
->where(function ($q) use ($business_id) {
|
|
$q->whereNull('business_id')
|
|
->orWhere('business_id', $business_id);
|
|
})
|
|
->get();
|
|
|
|
$balances = AccountingAccount::leftjoin('accounting_accounts_transactions as AAT',
|
|
'AAT.accounting_account_id', '=', 'accounting_accounts.id')
|
|
->where('business_id', $business_id)
|
|
->whereDate('AAT.operation_date', '>=', $start_date)
|
|
->whereDate('AAT.operation_date', '<=', $end_date)
|
|
->select(
|
|
DB::raw($balance_formula),
|
|
'accounting_accounts.account_sub_type_id'
|
|
)
|
|
->groupBy('accounting_accounts.account_sub_type_id')
|
|
->get();
|
|
|
|
$labels = [];
|
|
$values = [];
|
|
|
|
foreach ($sub_types as $st) {
|
|
$labels[] = $st->account_type_name;
|
|
$value = 0;
|
|
|
|
foreach ($balances as $bal) {
|
|
if ($bal->account_sub_type_id == $st->id && ! empty($bal->balance)) {
|
|
$value = (float) $bal->balance;
|
|
}
|
|
}
|
|
$values[] = $value;
|
|
}
|
|
$chart = new CommonChart;
|
|
$chart->labels($labels)
|
|
->options($this->__chartOptions())
|
|
->dataset(__('accounting::lang.current_balance'), 'pie', $values)
|
|
->color($colors);
|
|
|
|
$all_charts[$k] = $chart;
|
|
}
|
|
|
|
$health = $healthService->assess($business_id);
|
|
|
|
return view('accounting::accounting.dashboard')->with(compact('coa_overview_chart',
|
|
'all_charts', 'coa_overview', 'account_types', 'end_date', 'start_date', 'health'));
|
|
}
|
|
|
|
private function __chartOptions()
|
|
{
|
|
return [
|
|
'plotOptions' => [
|
|
'pie' => [
|
|
'allowPointSelect' => true,
|
|
'cursor' => 'pointer',
|
|
'dataLabels' => [
|
|
'enabled' => false,
|
|
],
|
|
'showInLegend' => true,
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
public function AccountsDropdown()
|
|
{
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
$q = request()->input('q', '');
|
|
$accounts = AccountingAccount::forDropdown($business_id, true, $q);
|
|
|
|
$accounts_array = [];
|
|
foreach ($accounts as $account) {
|
|
$accounts_array[] = [
|
|
'id' => $account->id,
|
|
'text' => $account->name.' - <small class="text-muted">'.$account->account_primary_type.' - '.
|
|
$account->sub_type.'</small>',
|
|
'html' => $account->name.' - <small class="text-muted">'.$account->account_primary_type.' - '.
|
|
$account->sub_type.'</small>',
|
|
];
|
|
}
|
|
|
|
return $accounts_array;
|
|
}
|
|
}
|
|
}
|