Files
CKB/app/Http/Controllers/ReportController.php

906 lines
38 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Exports\TransactionDealerExport;
use App\Exports\TransactionExport;
use App\Exports\TransactionSaExport;
use App\Models\Dealer;
use App\Models\Menu;
use App\Models\Transaction;
use App\Models\User;
use App\Models\Work;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Yajra\DataTables\Facades\DataTables;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\Role;
class ReportController extends Controller
{
public function transaction_sa_old2(Request $request)
{
$menu = Menu::where('link', 'report.transaction_sa')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
if(!isset($request->month)) {
$request['month'] = date('m');
}
if(!isset($request->dealer)) {
$request['dealer'] = 'all';
}
if(!isset($request->sa)) {
$request['sa'] = 'all';
}
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($role) {
$allowedDealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$works = Work::select('id', 'name')->whereHas('transactions', function($q) use($request, $allowedDealers) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$q = $q->whereIn('dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$q = $q->where('dealer_id', '=', $request->dealer);
}
} else {
$q = $q->where('dealer_id', '=', $request->dealer);
}
}
if(isset($request->sa) && $request->sa != 'all') {
$q = $q->where('user_sa_id', '=', $request->sa);
}
return $q;
})->orderBy('id', 'ASC')->get();
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$dealer_datas = Dealer::orderBy('id', 'ASC')->get();
} else if($role) {
$dealer_datas = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$dealer_datas = collect();
}
// Get SA users based on dealer access
if($dealer_datas->count() > 0) {
$dealerIds = $dealer_datas->pluck('id')->toArray();
$sa_datas = User::select('id', 'name')->where('role_id', 4)->whereIn('dealer_id', $dealerIds)->get();
} else {
$sa_datas = User::select('id', 'name')->where('role_id', 4)->get();
}
$sa = $request->sa;
$dealer = $request->dealer;
$month = $request->month;
return view('back.report.transaction_sa', compact('dealer_datas', 'sa_datas', 'month', 'works', 'sa', 'dealer'));
}
public function transaction_sa(Request $request)
{
$menu = Menu::where('link', 'report.transaction_sa')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
if(!isset($request->month)) {
$request['month'] = date('m');
}
if(!isset($request->year)) {
$request['year'] = date('Y');
}
if(!isset($request->dealer)) {
$request['dealer'] = '20';
}
if(!isset($request->sa)) {
$request['sa'] = 'all';
}
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$dealer_datas = Dealer::orderBy('id', 'ASC')->get();
} else if($role) {
$dealer_datas = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$dealer_datas = collect();
}
// Get SA users based on dealer access
if($dealer_datas->count() > 0) {
$dealerIds = $dealer_datas->pluck('id')->toArray();
$sa_datas = User::select('id', 'name')->where('role_id', 4)->whereIn('dealer_id', $dealerIds)->get();
} else {
$sa_datas = User::select('id', 'name')->where('role_id', 4)->get();
}
$sa = $request->sa;
$dealer = $request->dealer;
$month = $request->month;
$year = $request->year;
$ajax_url = route('report.transaction_sa_data').'?month='.$month.'&year='.$year.'&dealer='.$dealer.'&sa='.$sa;
return view('back.report.transaction_sa', compact('dealer_datas', 'sa_datas', 'month', 'year', 'sa', 'dealer', 'ajax_url'));
}
public function transaction_sa_data(Request $request) {
abort_if(Gate::denies('view', Menu::where('link', 'dashboard')->first()), 403, 'Unauthorized User');
if(!isset($request->month)) {
$request['month'] = date('m');
}
if(!isset($request->year)) {
$request['year'] = date('Y');
}
if(isset($request->{'amp;dealer'})) {
$request['dealer'] = $request->{'amp;dealer'};
}
if(isset($request->{'amp;sa'})) {
$request['sa'] = $request->{'amp;sa'};
}
if(isset($request->{'amp;year'})) {
$request['year'] = $request->{'amp;year'};
}
if(!isset($request->dealer)) {
$request['dealer'] = 'all';
}
$month = $request->month;
$dealer = $request->dealer;
$sa = $request->sa;
$year = $request->year;
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($role) {
$allowedDealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$dealer_work_trx = DB::statement("SET @sql = NULL");
$sql = "SELECT IF(work_id IS NOT NULL, GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(work_id = \"', work_id,'\", qty,\"\")) AS \"',CONCAT(w.name, '|',w.id),'\"')), 's.work_id') INTO @sql FROM transactions t JOIN works w ON w.id = t.work_id WHERE month(t.date) = '". $month ."' and year(t.date) = '". $year ."' and t.deleted_at is null";
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$dealerIdsStr = implode(',', $dealerIds);
$sql .= " and t.dealer_id IN (". $dealerIdsStr .")";
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$sql .= " and t.dealer_id = '". $dealer ."'";
}
} else {
$sql .= " and t.dealer_id = '". $dealer ."'";
}
}
if(isset($request->sa) && $request->sa != 'all') {
$sql .= " and t.user_sa_id = '". $sa ."'";
}
$sa_work_trx = DB::statement($sql);
// Validate dealer access before building the main query
$dealerFilter = "";
if(isset($request->dealer) && $request->dealer != 'all') {
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$dealerFilter = " and s.dealer_id = '". $dealer ."'";
}
} else {
$dealerFilter = " and s.dealer_id = '". $dealer ."'";
}
} else if($allowedDealers->count() > 0) {
// If no specific dealer requested, filter by allowed dealers
$dealerIds = $allowedDealers->pluck('id')->toArray();
$dealerIdsStr = implode(',', $dealerIds);
$dealerFilter = " and s.dealer_id IN (". $dealerIdsStr .")";
}
if(isset($request->dealer) && $request->dealer != 'all') {
if(isset($request->sa) && $request->sa != 'all') {
$sa_work_trx = DB::statement("SET @sql = IF(@sql != 's.work_id' ,CONCAT(\"SELECT sa.name as SA, sa.id as sa_id, \", @sql, \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." and s.user_sa_id = '". $sa ."' GROUP BY s.user_sa_id ORDER BY s.user_sa_id ASC\"), CONCAT(\"SELECT sa.name as SA, sa.id as sa_id \", \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." and s.user_sa_id = '". $sa ."' GROUP BY s.`user_sa_id` ORDER BY s.`user_sa_id` ASC\"))");
}else{
$sa_work_trx = DB::statement("SET @sql = IF(@sql != 's.work_id' ,CONCAT(\"SELECT sa.name as SA, sa.id as sa_id, \", @sql, \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." GROUP BY s.user_sa_id ORDER BY s.user_sa_id ASC\"), CONCAT(\"SELECT sa.name as SA, sa.id as sa_id \", \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." GROUP BY s.`user_sa_id` ORDER BY s.`user_sa_id` ASC\"))");
}
}else{
if(isset($request->sa) && $request->sa != 'all') {
$sa_work_trx = DB::statement("SET @sql = IF(@sql != 's.work_id' ,CONCAT(\"SELECT sa.name as SA, sa.id as sa_id, \", @sql, \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." and s.user_sa_id = '". $sa ."' GROUP BY s.user_sa_id ORDER BY s.user_sa_id ASC\"), CONCAT(\"SELECT sa.name as SA, sa.id as user_sa_id \", \"FROM transactions s JOIN dealers d ON d.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." and s.user_sa_id = '". $sa ."' GROUP BY s.`user_sa_id` ORDER BY s.`user_sa_id` ASC\"))");
}else{
$sa_work_trx = DB::statement("SET @sql = IF(@sql != 's.work_id' ,CONCAT(\"SELECT sa.name as SA, sa.id as sa_id, \", @sql, \"FROM transactions s JOIN users sa ON sa.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." GROUP BY s.user_sa_id ORDER BY s.user_sa_id ASC\"), CONCAT(\"SELECT sa.name as SA, sa.id as user_sa_id \", \"FROM transactions s JOIN dealers d ON d.id = s.user_sa_id WHERE month(s.date) = '". $month ."' and year(s.date) = '". $year ."' and s.deleted_at is null". $dealerFilter ." GROUP BY s.`user_sa_id` ORDER BY s.`user_sa_id` ASC\"))");
}
}
$sa_work_trx = DB::statement("PREPARE stmt FROM @sql");
$sa_work_trx = DB::select(DB::raw("EXECUTE stmt"));
DB::statement('DEALLOCATE PREPARE stmt');
$theads = ['SA'];
$sa_names = [];
$sa_trx = [];
$work_trx = [];
$work_ids = [];
foreach($sa_work_trx as $index => $sa_work) {
$sa_work_2 = (array) $sa_work;
unset($sa_work_2['sa_id']);
$work_trx[$sa_work->sa_id] = array_values($sa_work_2);
unset($sa_work_2['SA']);
$work_names = array_keys($sa_work_2);
if($index == 0) {
foreach($work_names as $work) {
$arr_work = explode('|', $work);
$theads[] = $arr_work[0];
$work_ids[] = $arr_work[1];
$sa_trx[$work] = [
'work_name' => $arr_work[0],
'qty' => []
];
if($sa_work->{$work} > 0) {
$sa_trx[$work]['qty'][] = $sa_work->{$work};
}else{
$sa_trx[$work]['qty'][] = "N/A";
}
}
}else{
foreach($work_names as $work) {
if($sa_work->{$work} > 0) {
$sa_trx[$work]['qty'][] = $sa_work->{$work};
}else{
$sa_trx[$work]['qty'][] = "N/A";
}
}
}
$sa_names[] = $sa_work->SA;
}
$sa_trx = array_values($sa_trx);
$dealer = $request->dealer;
$month = $request->month;
$sa = $request->sa;
$year = $request->year;
$sa_names = json_encode($sa_names);
$sa_trx = json_encode($sa_trx);
return view('back.report.transaction_sa_data', compact('theads', 'work_trx', 'month', 'sa_names', 'sa_trx', 'dealer', 'sa', 'year'));
}
public function transaction_sa_old(Request $request)
{
$menu = Menu::where('link', 'report.transaction_sa')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
if(!isset($request->month)) {
$request['month'] = date('m');
}
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($role) {
$allowedDealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$works = Work::select('id', 'name')->whereHas('transactions', function($q) use($request, $allowedDealers) {
if(isset($request->month)) {
$q->whereMonth('date', '=', $request->month);
}
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$q->whereIn('dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$q->where('dealer_id', '=', $request->dealer);
}
} else {
$q->where('dealer_id', '=', $request->dealer);
}
}
if(isset($request->sa) && $request->sa != 'all') {
$q->where('user_sa_id', '=', $request->sa);
}
})->get();
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$dealer_datas = Dealer::all();
} else if($role) {
$dealer_datas = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$dealer_datas = collect();
}
// Get SA users based on dealer access
if($dealer_datas->count() > 0) {
$dealerIds = $dealer_datas->pluck('id')->toArray();
$sas = User::select('id', 'name')->where('role_id', 4)->whereIn('dealer_id', $dealerIds)->get();
} else {
$sas = User::select('id', 'name')->where('role_id', 4)->get();
}
$trxs = [];
foreach($sas as $key => $sa) {
$sa_works = [];
foreach ($works as $key2 => $work) {
$d = Transaction::where('user_sa_id', $sa->id)->where('work_id', $work->id);
if(isset($request->month)) {
$d = $d->whereMonth('date', '=', $request->month);
}
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$d = $d->whereIn('dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$d = $d->where('dealer_id', '=', $request->dealer);
}
} else {
$d = $d->where('dealer_id', '=', $request->dealer);
}
}
if(isset($request->sa) && $request->sa != 'all') {
$d = $d->where('user_sa_id', '=', $request->sa);
}
$d = $d->sum('qty');
if($d) {
$sa_works[] = [
'work_id' => $work->id,
'work_name' => $work->name,
'user_sa_id' => $sa->id,
'qty' => $d,
];
}else{
$sa_works[] = [
'work_id' => $work->id,
'work_name' => $work->name,
'user_sa_id' => $sa->id,
'qty' => 0,
];
}
}
$trxs[] = [
'user_sa_id' => $sa->id,
'sa_name' => $sa->name,
'works' => $sa_works
];
}
$sa_names = [];
$trx_data = [];
foreach($trxs as $trx) {
$sa_names[] = $trx['sa_name'];
$work_data2 = [];
foreach($trx['works'] as $work_data) {
if(array_key_exists($work_data['work_name'], $trx_data)) {
$trx_data[$work_data['work_name']]['qty'][] = $work_data['qty'];
}else{
$trx_data[$work_data['work_name']] = [
'work_name' => $work_data['work_name'],
'qty' => [$work_data['qty']]
];
}
}
}
$sa_names = json_encode($sa_names);
$trx_data = json_encode(array_values($trx_data));
// dd($trx_data);
$work_count = count($works);
$month = $request->month;
$dealer_id = $request->dealer;
$sa_id = $request->sa;
return view('back.report.transaction_sa', compact('sas', 'dealer_datas', 'dealer_id', 'sa_id', 'month', 'trxs', 'works', 'work_count', 'sa_names', 'trx_data'));
}
public function sa_work_trx(Request $request) {
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($role) {
$allowedDealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$sa_work_trx = Work::select(DB::raw('works.name AS work_name'), DB::raw("IFNULL(SUM(t.qty), 0) AS qty"), 'works.id AS work_id')->whereHas('transactions', function($q) use($request, $allowedDealers) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$q->whereIn('dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$q->where('dealer_id', '=', $request->dealer);
}
} else {
$q->where('dealer_id', '=', $request->dealer);
}
}
if(isset($request->sa_filter) && $request->sa_filter != 'all') {
$q->where('user_sa_id', '=', $request->sa_filter);
}
return $q;
})->leftJoin('transactions AS t', function($q) use($request, $allowedDealers) {
$q->on('t.work_id', '=', 'works.id');
$q->on(DB::raw('MONTH(t.date)'), '=', DB::raw($request->month));
$q->on(DB::raw('YEAR(t.date)'), '=', DB::raw(date('Y')));
$q->on('t.user_sa_id', '=', DB::raw($request->sa));
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$q->whereIn('t.dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$q->on('t.dealer_id', '=', DB::raw($request->dealer));
}
} else {
$q->on('t.dealer_id', '=', DB::raw($request->dealer));
}
}
if(isset($request->sa_filter) && $request->sa_filter != 'all') {
$q->on('t.user_sa_id', '=', DB::raw($request->sa_filter));
}
})->groupBy('works.id')->orderBy('works.id', 'ASC')->get();
return response()->json($sa_work_trx);
}
public function get_sa_has_transactions(Request $request) {
if(!isset($request->month)) {
$request['month'] = date('m');
}
if(!isset($request->dealer)) {
$request['dealer'] = 'all';
}
if(!isset($request->sa)) {
$request['sa'] = 'all';
}
// Get dealers based on user role
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($role) {
$allowedDealers = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$sas = User::where('role_id', 4)->whereHas('sa_transactions', function($q) use($request, $allowedDealers) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$q->whereIn('dealer_id', $dealerIds);
}
if(isset($request->dealer) && $request->dealer != 'all') {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$q->where('dealer_id', '=', $request->dealer);
}
} else {
$q->where('dealer_id', '=', $request->dealer);
}
}
});
if(isset($request->sa) && $request->sa != 'all') {
$sas = $sas->where('id', $request->sa);
}
$sas = $sas->orderBy('id', 'ASC')->get();
return response()->json($sas);
}
public function transaction_dealer(Request $request)
{
$menu = Menu::where('link', 'report.transaction_dealer')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
if(!isset($request->month)) {
$request['month'] = date('m');
}
if(!isset($request->year)) {
$request['year'] = date('Y');
}
$user = Auth::user();
$role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($user->role_id);
if($role && $this->isAdminRole($role) && $role->dealers->count() == 0) {
$dealer_datas = Dealer::all();
} else if($role) {
$dealer_datas = $role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$dealer_datas = collect();
}
$year = $request->year;
$month = $request->month;
$dealer = $request->dealer;
$ajax_url = route('dashboard_data').'?month='.$month.'&year='.$year.'&dealer='.$dealer;
return view('dashboard', compact('month', 'ajax_url', 'dealer', 'dealer_datas', 'year'));
}
public function transaction(Request $request)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
$current_user = Auth::user();
$current_role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($current_user->role_id);
// Get dealers based on user role
if($current_role && $this->isAdminRole($current_role) && $current_role->dealers->count() == 0) {
$dealers = Dealer::all();
} else if($current_role) {
$dealers = $current_role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$dealers = collect();
}
// Get SA users based on dealer access
if($dealers->count() > 0) {
$dealerIds = $dealers->pluck('id')->toArray();
$sas = User::where('role_id', 4)->whereIn('dealer_id', $dealerIds)->get();
$mechanics = User::where('role_id', 3)->whereIn('dealer_id', $dealerIds)->get();
} else {
$sas = User::where('role_id', 4)->get();
$mechanics = User::where('role_id', 3)->get();
}
$works = Work::all();
return view('back.report.transaction', compact('sas', 'mechanics', 'dealers', 'works'));
}
public function transaction_data(Request $request)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('view', $menu), 403, 'Unauthorized User');
if ($request->ajax()) {
// Get dealers based on user role
$current_user = Auth::user();
$current_role = Role::with(['dealers' => function($query) {
$query->whereNull('dealers.deleted_at'); // Only active dealers
}])->find($current_user->role_id);
if($current_role && $this->isAdminRole($current_role) && $current_role->dealers->count() == 0) {
$allowedDealers = Dealer::all();
} else if($current_role) {
$allowedDealers = $current_role->dealers()->whereNull('dealers.deleted_at')->orderBy('name')->get();
} else {
$allowedDealers = collect();
}
$data = Transaction::leftJoin('users', 'users.id', '=', 'transactions.user_id')
->leftJoin('users as sa', 'sa.id', '=', 'transactions.user_sa_id')
->leftJoin('works as w', 'w.id', '=', 'transactions.work_id')
->leftJoin('categories as cat', 'cat.id', '=', 'w.category_id')
->leftJoin('dealers as d', 'd.id', '=', 'transactions.dealer_id')
->select('transactions.id', 'transactions.status', 'transactions.user_id as user_id', 'transactions.user_sa_id as user_sa_id', 'users.name as username', 'sa.name as sa_name', 'cat.name as category_name', 'w.name as workname', 'transactions.qty as qty', 'transactions.date as date', 'transactions.police_number as police_number', 'transactions.warranty as warranty', 'transactions.spk as spk', 'transactions.dealer_id', 'd.name as dealer_name');
// Filter by allowed dealers based on user role
if($allowedDealers->count() > 0) {
$dealerIds = $allowedDealers->pluck('id')->toArray();
$data->whereIn('transactions.dealer_id', $dealerIds);
}
if(isset($request->date_start)) {
$data->where('transactions.date', '>=', $request->date_start);
}
if(isset($request->date_end)) {
$data->where('transactions.date', '<=', $request->date_end);
}
if(isset($request->sa)) {
$data->where('transactions.user_sa_id', $request->sa);
}
if(isset($request->mechanic)) {
$data->where('transactions.user_id', $request->mechanic);
}
if(isset($request->dealer)) {
// Validate that the requested dealer is allowed for this user
if($allowedDealers->count() > 0) {
$allowedDealerIds = $allowedDealers->pluck('id')->toArray();
if(in_array($request->dealer, $allowedDealerIds)) {
$data->where('transactions.dealer_id', $request->dealer);
}
} else {
$data->where('transactions.dealer_id', $request->dealer);
}
}
$data->orderBy('date', 'DESC');
return DataTables::of($data)->addIndexColumn()
->addColumn('action', function($row) use ($menu) {
$btn = '<div class="d-flex justify-content-center">';
if($row->status == 1) {
if(Gate::allows('delete', $menu)) {
$btn .= ' <button class="btn btn-danger btn-sm btn-bold mr-2" data-action="'. route('report.transaction.destroy', $row->id) .'" id="destroyTransaction'. $row->id .'" onclick="destroyTransaction('. $row->id .')"> Hapus </button>';
}
$btn .= '<span class="badge badge-success">Closed</span>';
}else{
if(Gate::allows('delete', $menu)) {
$btn .= '<button class="btn btn-danger btn-sm btn-bold mr-2" data-action="'. route('report.transaction.destroy', $row->id) .'" id="destroyTransaction'. $row->id .'" onclick="destroyTransaction('. $row->id .')"> Hapus </button>';
}
if(Gate::allows('update', $menu)) {
$btn .= '<button class="btn btn-info btn-sm btn-bold mr-2" data-url="'. route('report.transaction.edit', $row->id) .'" data-action="'. route('report.transaction.update', $row->id) .'" onclick="editTransaction('. $row->id .')" id="editTransaction'. $row->id .'"> Edit </button>
<button class="btn btn-warning btn-sm btn-bold" id="closeTransaction'. $row->id .'" data-url="'. route('report.transaction.close', $row->id) .'" onclick="closeTransaction('. $row->id .')"> Close </button>';
}
}
$btn .= '</div>';
return $btn;
})
->rawColumns(['action'])
->make(true);
}
}
public function export(Request $request)
{
return Excel::download(new TransactionExport($request), date('dmY_').'pekerjaan.xlsx');
}
public function dealer_export(Request $request)
{
return Excel::download(new TransactionDealerExport($request), date('dmY_').'dealer.xlsx');
}
public function sa_export(Request $request)
{
return Excel::download(new TransactionSaExport($request), date('dmY_').'sa.xlsx');
}
public function edit($id)
{
$transaction = Transaction::find($id);
$response = [
'data' => $transaction,
'status' => 200,
'message' => 'get data successfully'
];
return response()->json($response);
}
public function update(Request $request, $id)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('update', $menu), 403, 'Unauthorized User');
Transaction::find($id)->update([
"spk" => $request->spk,
"date" => $request->date,
"police_number" => $request->police_number,
"work_id" => $request->work_id,
"dealer_id" => $request->dealer_id,
"qty" => $request->qty,
"warranty" => $request->warranty,
"user_sa_id" => $request->sa_id,
]);
$response = [
"status" => 200,
"message" => "Data updated successfully"
];
return response()->json($response);
}
public function close_transaction($id)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('update', $menu), 403, 'Unauthorized User');
Transaction::find($id)->update([
'status' => 1
]);
$response = [
'message' => 'Data updated successfully',
'status' => 200
];
return response()->json($response);
}
public function bulk_close_transaction(Request $request)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('update', $menu), 403, 'Unauthorized User');
Transaction::whereIn('id', $request->selected)->update([
'status' => 1
]);
$response = [
'message' => 'Data updated successfully',
'status' => 200
];
return response()->json($response);
}
public function destroy_transaction($id)
{
$menu = Menu::where('link', 'report.transaction')->first();
abort_if(Gate::denies('delete', $menu), 403, 'Unauthorized User');
Transaction::destroy($id);
$response = [
'message' => 'Data deleted successfully',
'status' => 200
];
return response()->json($response);
}
/**
* Check if role is admin type
*/
private function isAdminRole($role)
{
if (!$role) {
return false;
}
// Define admin role names that should have access to all dealers
$adminRoleNames = [
'admin'
];
// Check if role name contains admin keywords (but not "area")
$roleName = strtolower(trim($role->name));
foreach ($adminRoleNames as $adminName) {
if (strpos($roleName, $adminName) !== false && strpos($roleName, 'area') === false) {
return true;
}
}
// Role with "area" in name should use pivot dealers, not all dealers
if (strpos($roleName, 'area') !== false) {
return false;
}
return false;
}
}