| Server IP : 103.161.17.216 / Your IP : 216.73.216.1 Web Server : nginx/1.18.0 System : Linux tipsysaigoncharming 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 User : www-data ( 33) PHP Version : 7.4.3-4ubuntu2.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/app.ansachsongkhoe.net/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use App\BusinessLocation;
use App\Charts\CommonChart;
use App\Currency;
use App\Transaction;
use App\Utils\BusinessUtil;
use App\Utils\ModuleUtil;
use App\Utils\TransactionUtil;
use App\VariationLocationDetails;
use Datatables;
use DB;
use Illuminate\Http\Request;
use App\Utils\Util;
use App\Utils\RestaurantUtil;
use App\User;
use Illuminate\Notifications\DatabaseNotification;
use App\Media;
class HomeController extends Controller
{
/**
* All Utils instance.
*
*/
protected $businessUtil;
protected $transactionUtil;
protected $moduleUtil;
protected $commonUtil;
protected $restUtil;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(
BusinessUtil $businessUtil,
TransactionUtil $transactionUtil,
ModuleUtil $moduleUtil,
Util $commonUtil,
RestaurantUtil $restUtil
) {
$this->businessUtil = $businessUtil;
$this->transactionUtil = $transactionUtil;
$this->moduleUtil = $moduleUtil;
$this->commonUtil = $commonUtil;
$this->restUtil = $restUtil;
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$business_id = request()->session()->get('user.business_id');
$is_admin = $this->businessUtil->is_admin(auth()->user());
if (!auth()->user()->can('dashboard.data')) {
return view('home.index');
}
$fy = $this->businessUtil->getCurrentFinancialYear($business_id);
$date_filters['this_fy'] = $fy;
$date_filters['this_month']['start'] = date('Y-m-01');
$date_filters['this_month']['end'] = date('Y-m-t');
$date_filters['this_week']['start'] = date('Y-m-d', strtotime('monday this week'));
$date_filters['this_week']['end'] = date('Y-m-d', strtotime('sunday this week'));
$currency = Currency::where('id', request()->session()->get('business.currency_id'))->first();
//Chart for sells last 30 days
$sells_last_30_days = $this->transactionUtil->getSellsLast30Days($business_id);
$labels = [];
$all_sell_values = [];
$dates = [];
for ($i = 29; $i >= 0; $i--) {
$date = \Carbon::now()->subDays($i)->format('Y-m-d');
$dates[] = $date;
$labels[] = date('j M Y', strtotime($date));
if (!empty($sells_last_30_days[$date])) {
$all_sell_values[] = (float) $sells_last_30_days[$date];
} else {
$all_sell_values[] = 0;
}
}
//Get sell for indivisual locations
$all_locations = BusinessLocation::forDropdown($business_id)->toArray();
$location_sells = [];
$sells_by_location = $this->transactionUtil->getSellsLast30Days($business_id, true);
foreach ($all_locations as $loc_id => $loc_name) {
$values = [];
foreach ($dates as $date) {
$sell = $sells_by_location->first(function ($item) use ($loc_id, $date) {
return $item->date == $date &&
$item->location_id == $loc_id;
});
if (!empty($sell)) {
$values[] = (float) $sell->total_sells;
} else {
$values[] = 0;
}
}
$location_sells[$loc_id]['loc_label'] = $loc_name;
$location_sells[$loc_id]['values'] = $values;
}
$sells_chart_1 = new CommonChart;
$sells_chart_1->labels($labels)
->options($this->__chartOptions(__(
'home.total_sells',
['currency' => $currency->code]
)));
if (!empty($location_sells)) {
foreach ($location_sells as $location_sell) {
$sells_chart_1->dataset($location_sell['loc_label'], 'line', $location_sell['values']);
}
}
if (count($all_locations) > 1) {
$sells_chart_1->dataset(__('report.all_locations'), 'line', $all_sell_values);
}
//Chart for sells this financial year
$sells_this_fy = $this->transactionUtil->getSellsCurrentFy($business_id, $fy['start'], $fy['end']);
$labels = [];
$values = [];
$months = [];
$date = strtotime($fy['start']);
$last = date('m-Y', strtotime($fy['end']));
$fy_months = [];
do {
$month_year = date('m-Y', $date);
$fy_months[] = $month_year;
$month_number = date('m', $date);
$labels[] = \Carbon::createFromFormat('m-Y', $month_year)
->format('M-Y');
$date = strtotime('+1 month', $date);
if (!empty($sells_this_fy[$month_year])) {
$values[] = (float) $sells_this_fy[$month_year];
} else {
$values[] = 0;
}
} while ($month_year != $last);
$fy_sells_by_location = $this->transactionUtil->getSellsCurrentFy($business_id, $fy['start'], $fy['end'], true);
$fy_sells_by_location_data = [];
foreach ($all_locations as $loc_id => $loc_name) {
$values_data = [];
foreach ($fy_months as $month) {
$sell = $fy_sells_by_location->first(function ($item) use ($loc_id, $month) {
return $item->yearmonth == $month &&
$item->location_id == $loc_id;
});
if (!empty($sell)) {
$values_data[] = (float) $sell->total_sells;
} else {
$values_data[] = 0;
}
}
$fy_sells_by_location_data[$loc_id]['loc_label'] = $loc_name;
$fy_sells_by_location_data[$loc_id]['values'] = $values_data;
}
$sells_chart_2 = new CommonChart;
$sells_chart_2->labels($labels)
->options($this->__chartOptions(__(
'home.total_sells',
['currency' => $currency->code]
)));
if (!empty($fy_sells_by_location_data)) {
foreach ($fy_sells_by_location_data as $location_sell) {
$sells_chart_2->dataset($location_sell['loc_label'], 'line', $location_sell['values']);
}
}
if (count($all_locations) > 1) {
$sells_chart_2->dataset(__('report.all_locations'), 'line', $values);
}
//Get Dashboard widgets from module
$module_widgets = $this->moduleUtil->getModuleData('dashboard_widget');
$widgets = [];
foreach ($module_widgets as $widget_array) {
if (!empty($widget_array['position'])) {
$widgets[$widget_array['position']][] = $widget_array['widget'];
}
}
$common_settings = !empty(session('business.common_settings')) ? session('business.common_settings') : [];
return view('home.index', compact('date_filters', 'sells_chart_1', 'sells_chart_2', 'widgets', 'all_locations', 'common_settings', 'is_admin'));
}
/**
* Retrieves purchase and sell details for a given time period.
*
* @return \Illuminate\Http\Response
*/
public function getTotals()
{
if (request()->ajax()) {
$start = request()->start;
$end = request()->end;
$location_id = request()->location_id;
$business_id = request()->session()->get('user.business_id');
$purchase_details = $this->transactionUtil->getPurchaseTotals($business_id, $start, $end, $location_id);
$sell_details = $this->transactionUtil->getSellTotals($business_id, $start, $end, $location_id);
$transaction_types = [
'purchase_return', 'sell_return', 'expense'
];
$transaction_totals = $this->transactionUtil->getTransactionTotals(
$business_id,
$transaction_types,
$start,
$end,
$location_id
);
$total_purchase_inc_tax = !empty($purchase_details['total_purchase_inc_tax']) ? $purchase_details['total_purchase_inc_tax'] : 0;
$total_purchase_return_inc_tax = $transaction_totals['total_purchase_return_inc_tax'];
$total_purchase = $total_purchase_inc_tax - $total_purchase_return_inc_tax;
$output = $purchase_details;
$output['total_purchase'] = $total_purchase;
$total_sell_inc_tax = !empty($sell_details['total_sell_inc_tax']) ? $sell_details['total_sell_inc_tax'] : 0;
$total_sell_return_inc_tax = !empty($transaction_totals['total_sell_return_inc_tax']) ? $transaction_totals['total_sell_return_inc_tax'] : 0;
$output['total_sell'] = $total_sell_inc_tax - $total_sell_return_inc_tax;
$output['invoice_due'] = $sell_details['invoice_due'];
$output['total_expense'] = $transaction_totals['total_expense'];
return $output;
}
}
/**
* Retrieves sell products whose available quntity is less than alert quntity.
*
* @return \Illuminate\Http\Response
*/
public function getProductStockAlert()
{
if (request()->ajax()) {
$business_id = request()->session()->get('user.business_id');
$query = VariationLocationDetails::join(
'product_variations as pv',
'variation_location_details.product_variation_id',
'=',
'pv.id'
)
->join(
'variations as v',
'variation_location_details.variation_id',
'=',
'v.id'
)
->join(
'products as p',
'variation_location_details.product_id',
'=',
'p.id'
)
->leftjoin(
'business_locations as l',
'variation_location_details.location_id',
'=',
'l.id'
)
->leftjoin('units as u', 'p.unit_id', '=', 'u.id')
->where('p.business_id', $business_id)
->where('p.enable_stock', 1)
->where('p.is_inactive', 0)
->whereNull('v.deleted_at')
->whereRaw('variation_location_details.qty_available <= p.alert_quantity');
//Check for permitted locations of a user
$permitted_locations = auth()->user()->permitted_locations();
if ($permitted_locations != 'all') {
$query->whereIn('variation_location_details.location_id', $permitted_locations);
}
$products = $query->select(
'p.name as product',
'p.type',
'p.sku',
'pv.name as product_variation',
'v.name as variation',
'v.sub_sku',
'l.name as location',
'variation_location_details.qty_available as stock',
'u.short_name as unit'
)
->groupBy('variation_location_details.id')
->orderBy('stock', 'asc');
return Datatables::of($products)
->editColumn('product', function ($row) {
if ($row->type == 'single') {
return $row->product . ' (' . $row->sku . ')';
} else {
return $row->product . ' - ' . $row->product_variation . ' - ' . $row->variation . ' (' . $row->sub_sku . ')';
}
})
->editColumn('stock', function ($row) {
$stock = $row->stock ? $row->stock : 0 ;
return '<span data-is_quantity="true" class="display_currency" data-currency_symbol=false>'. (float)$stock . '</span> ' . $row->unit;
})
->removeColumn('sku')
->removeColumn('sub_sku')
->removeColumn('unit')
->removeColumn('type')
->removeColumn('product_variation')
->removeColumn('variation')
->rawColumns([2])
->make(false);
}
}
/**
* Retrieves payment dues for the purchases.
*
* @return \Illuminate\Http\Response
*/
public function getPurchasePaymentDues()
{
if (request()->ajax()) {
$business_id = request()->session()->get('user.business_id');
$today = \Carbon::now()->format("Y-m-d H:i:s");
$query = Transaction::join(
'contacts as c',
'transactions.contact_id',
'=',
'c.id'
)
->leftJoin(
'transaction_payments as tp',
'transactions.id',
'=',
'tp.transaction_id'
)
->where('transactions.business_id', $business_id)
->where('transactions.type', 'purchase')
->where('transactions.payment_status', '!=', 'paid')
->whereRaw("DATEDIFF( DATE_ADD( transaction_date, INTERVAL IF(transactions.pay_term_type = 'days', transactions.pay_term_number, 30 * transactions.pay_term_number) DAY), '$today') <= 7");
//Check for permitted locations of a user
$permitted_locations = auth()->user()->permitted_locations();
if ($permitted_locations != 'all') {
$query->whereIn('transactions.location_id', $permitted_locations);
}
$dues = $query->select(
'transactions.id as id',
'c.name as supplier',
'c.supplier_business_name',
'ref_no',
'final_total',
DB::raw('SUM(tp.amount) as total_paid')
)
->groupBy('transactions.id');
return Datatables::of($dues)
->addColumn('due', function ($row) {
$total_paid = !empty($row->total_paid) ? $row->total_paid : 0;
$due = $row->final_total - $total_paid;
return '<span class="display_currency" data-currency_symbol="true">' .
$due . '</span>';
})
->addColumn('action', '@can("purchase.create") <a href="{{action("TransactionPaymentController@addPayment", [$id])}}" class="btn btn-xs btn-success add_payment_modal"><i class="fas fa-money-bill-alt"></i> @lang("purchase.add_payment")</a> @endcan')
->removeColumn('supplier_business_name')
->editColumn('supplier', '@if(!empty($supplier_business_name)) {{$supplier_business_name}}, <br> @endif {{$supplier}}')
->editColumn('ref_no', function ($row) {
if (auth()->user()->can('purchase.view')) {
return '<a href="#" data-href="' . action('PurchaseController@show', [$row->id]) . '"
class="btn-modal" data-container=".view_modal">' . $row->ref_no . '</a>';
}
return $row->ref_no;
})
->removeColumn('id')
->removeColumn('final_total')
->removeColumn('total_paid')
->rawColumns([0, 1, 2, 3])
->make(false);
}
}
/**
* Retrieves payment dues for the purchases.
*
* @return \Illuminate\Http\Response
*/
public function getSalesPaymentDues()
{
if (request()->ajax()) {
$business_id = request()->session()->get('user.business_id');
$today = \Carbon::now()->format("Y-m-d H:i:s");
$query = Transaction::join(
'contacts as c',
'transactions.contact_id',
'=',
'c.id'
)
->leftJoin(
'transaction_payments as tp',
'transactions.id',
'=',
'tp.transaction_id'
)
->where('transactions.business_id', $business_id)
->where('transactions.type', 'sell')
->where('transactions.payment_status', '!=', 'paid')
->whereNotNull('transactions.pay_term_number')
->whereNotNull('transactions.pay_term_type')
->whereRaw("DATEDIFF( DATE_ADD( transaction_date, INTERVAL IF(transactions.pay_term_type = 'days', transactions.pay_term_number, 30 * transactions.pay_term_number) DAY), '$today') <= 7");
//Check for permitted locations of a user
$permitted_locations = auth()->user()->permitted_locations();
if ($permitted_locations != 'all') {
$query->whereIn('transactions.location_id', $permitted_locations);
}
$dues = $query->select(
'transactions.id as id',
'c.name as customer',
'c.supplier_business_name',
'transactions.invoice_no',
'final_total',
DB::raw('SUM(tp.amount) as total_paid')
)
->groupBy('transactions.id');
return Datatables::of($dues)
->addColumn('due', function ($row) {
$total_paid = !empty($row->total_paid) ? $row->total_paid : 0;
$due = $row->final_total - $total_paid;
return '<span class="display_currency" data-currency_symbol="true">' .
$due . '</span>';
})
->editColumn('invoice_no', function ($row) {
if (auth()->user()->can('sell.view')) {
return '<a href="#" data-href="' . action('SellController@show', [$row->id]) . '"
class="btn-modal" data-container=".view_modal">' . $row->invoice_no . '</a>';
}
return $row->invoice_no;
})
->addColumn('action', '@if(auth()->user()->can("sell.create") || auth()->user()->can("direct_sell.access")) <a href="{{action("TransactionPaymentController@addPayment", [$id])}}" class="btn btn-xs btn-success add_payment_modal"><i class="fas fa-money-bill-alt"></i> @lang("purchase.add_payment")</a> @endif')
->editColumn('customer', '@if(!empty($supplier_business_name)) {{$supplier_business_name}}, <br> @endif {{$customer}}')
->removeColumn('supplier_business_name')
->removeColumn('id')
->removeColumn('final_total')
->removeColumn('total_paid')
->rawColumns([0, 1, 2, 3])
->make(false);
}
}
public function loadMoreNotifications()
{
$notifications = auth()->user()->notifications()->orderBy('created_at', 'DESC')->paginate(10);
if (request()->input('page') == 1) {
auth()->user()->unreadNotifications->markAsRead();
}
$notifications_data = $this->commonUtil->parseNotifications($notifications);
return view('layouts.partials.notification_list', compact('notifications_data'));
}
/**
* Function to count total number of unread notifications
*
* @return json
*/
public function getTotalUnreadNotifications()
{
$unread_notifications = auth()->user()->unreadNotifications;
$total_unread = $unread_notifications->count();
$notification_html = '';
$modal_notifications = [];
foreach ($unread_notifications as $unread_notification) {
if (isset($data['show_popup'])) {
$modal_notifications[] = $unread_notification;
$unread_notification->markAsRead();
}
}
if (!empty($modal_notifications)) {
$notification_html = view('home.notification_modal')->with(['notifications' => $modal_notifications])->render();
}
return [
'total_unread' => $total_unread,
'notification_html' => $notification_html
];
}
private function __chartOptions($title)
{
return [
'yAxis' => [
'title' => [
'text' => $title
]
],
'legend' => [
'align' => 'right',
'verticalAlign' => 'top',
'floating' => true,
'layout' => 'vertical'
],
];
}
public function getCalendar()
{
$business_id = request()->session()->get('user.business_id');
$is_admin = $this->restUtil->is_admin(auth()->user(), $business_id);
$is_superadmin = auth()->user()->can('superadmin');
if (request()->ajax()) {
$data = [
'start_date' => request()->start,
'end_date' => request()->end,
'user_id' => ($is_admin || $is_superadmin) && !empty(request()->user_id) ? request()->user_id : auth()->user()->id,
'location_id' => !empty(request()->location_id) ? request()->location_id : null,
'business_id' => $business_id,
'events' => request()->events ?? [],
'color' => '#007FFF'
];
$events = [];
if (in_array('bookings', $data['events'])) {
$events = $this->restUtil->getBookingsForCalendar($data);
}
$module_events = $this->moduleUtil->getModuleData('calendarEvents', $data);
foreach ($module_events as $module_event) {
$events = array_merge($events, $module_event);
}
return $events;
}
$all_locations = BusinessLocation::forDropdown($business_id)->toArray();
$users = [];
if ($is_admin) {
$users = User::forDropdown($business_id, false);
}
$event_types = [
'bookings' => [
'label' => __('restaurant.bookings'),
'color' => '#007FFF'
]
];
$module_event_types = $this->moduleUtil->getModuleData('eventTypes');
foreach ($module_event_types as $module_event_type) {
$event_types = array_merge($event_types, $module_event_type);
}
return view('home.calendar')->with(compact('all_locations', 'users', 'event_types'));
}
public function showNotification($id)
{
$notification = DatabaseNotification::find($id);
$data = $notification->data;
$notification->markAsRead();
return view('home.notification_modal')->with([
'notifications' => [$notification]
]);
}
public function attachMediasToGivenModel(Request $request)
{
if ($request->ajax()) {
try {
$business_id = request()->session()->get('user.business_id');
$model_id = $request->input('model_id');
$model = $request->input('model_type');
$model_media_type = $request->input('model_media_type');
DB::beginTransaction();
//find model to which medias are to be attached
$model_to_be_attached = $model::where('business_id', $business_id)
->findOrFail($model_id);
Media::uploadMedia($business_id, $model_to_be_attached, $request, 'file', false, $model_media_type);
DB::commit();
$output = [
'success' => true,
'msg' => __('lang_v1.success')
];
} catch (Exception $e) {
DB::rollBack();
\Log::emergency("File:" . $e->getFile(). "Line:" . $e->getLine(). "Message:" . $e->getMessage());
$output = [
'success' => false,
'msg' => __('messages.something_went_wrong')
];
}
return $output;
}
}
}