Files
CKB/app/Http/Controllers/ReportController.php
2025-05-27 19:09:17 +07:00

566 lines
23 KiB
PHP

<?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;
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';
}
$works = Work::select('id', 'name')->whereHas('transactions', function($q) use($request) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
if(isset($request->dealer) && $request->dealer != 'all') {
$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();
$dealer_datas = Dealer::orderBy('id', 'ASC')->get();
$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';
}
$dealer_datas = Dealer::orderBy('id', 'ASC')->get();
$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;
$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";
if(isset($request->dealer) && $request->dealer != 'all') {
$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);
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 and s.dealer_id = '". $dealer ."' 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 and s.dealer_id = '". $dealer ."' 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 and s.dealer_id = '". $dealer ."' 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 and s.dealer_id = '". $dealer ."' 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 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 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 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 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');
}
$works = Work::select('id', 'name')->whereHas('transactions', function($q) use($request) {
if(isset($request->month)) {
$q->whereMonth('date', '=', $request->month);
}
if(isset($request->dealer) && $request->dealer != 'all') {
$q->where('dealer_id', '=', $request->dealer);
}
if(isset($request->sa) && $request->sa != 'all') {
$q->where('user_sa_id', '=', $request->sa);
}
})->get();
$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);
}
if(isset($request->dealer) && $request->dealer != 'all') {
$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;
$dealers = Dealer::all();
$sas = User::where('role_id', 4)->get();
return view('back.report.transaction_sa', compact('sas', 'dealers', 'dealer_id', 'sa_id', 'month', 'trxs', 'works', 'work_count', 'sa_names', 'trx_data'));
}
public function sa_work_trx(Request $request) {
$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) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
if(isset($request->dealer) && $request->dealer != 'all') {
$q = $q->where('dealer_id', '=', $request->dealer);
}
if(isset($request->sa_filter) && $request->sa_filter != 'all') {
$q = $q->where('user_sa_id', '=', $request->sa_filter);
}
return $q;
})->leftJoin('transactions AS t', function($q) use($request) {
$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));
if(isset($request->dealer) && $request->dealer != 'all') {
$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';
}
$sas = User::where('role_id', 4)->whereHas('sa_transactions', function($q) use($request) {
if(isset($request->month)) {
$q = $q->whereMonth('date', '=', $request->month)->whereYear('date', date('Y'));
}
if(isset($request->dealer) && $request->dealer != 'all') {
$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');
}
$year = $request->year;
$month = $request->month;
$dealer = $request->dealer;
$dealer_datas = Dealer::all();
$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');
$sas = User::where('role_id', 4)->get();
$mechanics = User::where('role_id', 3)->get();
$dealers = Dealer::all();
$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()) {
$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');
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)) {
$data->where('transactions.dealer_id', $request->dealer);
}
$data->orderBy('date', 'DESC');
return DataTables::of($data)->addIndexColumn()
->addColumn('action', function($row) use ($menu) {
$btn = '';
if($row->status == 1) {
if(Auth::user()->can('delete', $menu)) {
$btn .= ' <button class="btn btn-danger btn-sm btn-bold" 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(Auth::user()->can('delete', $menu)) {
$btn .= '<button class="btn btn-danger btn-sm btn-bold" data-action="'. route('report.transaction.destroy', $row->id) .'" id="destroyTransaction'. $row->id .'" onclick="destroyTransaction('. $row->id .')"> Hapus </button>';
}
if(Auth::user()->can('update', $menu)) {
$btn .= '<button class="btn btn-info btn-sm btn-bold" 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>';
}
}
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);
}
}