906 lines
38 KiB
PHP
Executable File
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;
|
|
}
|
|
}
|