diff --git a/app/Http/Controllers/API/Contact/ContactApiController.php b/app/Http/Controllers/API/Contact/ContactApiController.php index 0d35cce..75e63ee 100644 --- a/app/Http/Controllers/API/Contact/ContactApiController.php +++ b/app/Http/Controllers/API/Contact/ContactApiController.php @@ -17,8 +17,6 @@ class ContactApiController extends Controller { public function getListContact(Request $request) { - // $token = JWTAuth::getToken(); - // $user = JWTAuth::user($token); $data = DB::table('contacts') ->join('users', 'contacts.relasi_kontak', '=', 'users.email') diff --git a/app/Http/Controllers/API/Notification/NotificationApiController.php b/app/Http/Controllers/API/Notification/NotificationApiController.php new file mode 100644 index 0000000..62fda62 --- /dev/null +++ b/app/Http/Controllers/API/Notification/NotificationApiController.php @@ -0,0 +1,44 @@ +<?php + +namespace App\Http\Controllers\API\Notification; + +use App\Http\Controllers\Controller; +use App\Models\Notification; +use App\Models\NotificationReceiver; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; + +class NotificationApiController extends Controller +{ + public function listNotification(Request $request){ + + } + + public function getDetailNotification(Request $request){ + $notification = Notification::where('id', $request->input('id'))->get(); + + return response()->json([ + 'data' => $notification + ]); + } + + public function markAllAsRead(){ + $result = NotificationReceiver::where('receiver', auth()->user()->email)->update([ + 'status' => 'read' + ]); + + if($result){ + return response()->json([ + 'status' => true, + 'message' => 'Berhasil' + ]); + }else{ + return response()->json([ + 'status' => false, + 'message' => 'Gagal' + ]); + + Log::error($result); + } + } +} diff --git a/app/Http/Controllers/Admin/Dashboard/AdminDashboardController.php b/app/Http/Controllers/Admin/Dashboard/AdminDashboardController.php index d8cd92a..5631210 100644 --- a/app/Http/Controllers/Admin/Dashboard/AdminDashboardController.php +++ b/app/Http/Controllers/Admin/Dashboard/AdminDashboardController.php @@ -8,76 +8,369 @@ use Carbon\Carbon; use App\Models\Transaction; use App\Models\Refund; use App\Models\User; +use DateInterval; +use DateTime; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; class AdminDashboardController extends Controller { public function index() { - $currentMonth = Carbon::now()->month; - $currentYear = Carbon::now()->year; + $today = new DateTime(); + $todayDate = $today->format('Y-m-d'); + $pickDate = new DateTime(); + $interval = new DateInterval('P29D'); + $start = $pickDate->sub($interval); + $startDate = $start->format('Y-m-d'); - $countSuccess = Transaction::where('status_pembayaran', 'settlement') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) + $intervalBefore = new DateInterval('P1D'); + $intervalBeforeStart = new DateInterval('P29D'); + $endBefore = $pickDate->sub($intervalBefore); + $endBeforeDate = $endBefore->format('Y-m-d'); + $startBefore = $pickDate->sub($intervalBeforeStart); + $startBeforeDate = $startBefore->format('Y-m-d'); + + $countSuccess = Transaction::whereIn('status_transaksi', ['done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // selesai + + $countProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent', 'success', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // diproses + + $countCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); //gagal + + $countIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // terindikasi + + $countWaiting = Transaction::where('status_transaksi', 'created_at') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // terindikasi + + $totalTransaction = Transaction::whereNotIn('status_transaksi', ['refund']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // transaksi + + $totalTransactionSebelum = Transaction::whereNotIn('status_transaksi', ['refund', 'created']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); // transaksi sebelum + + $rateTransaction = floatval((floatval($totalTransaction)-floatval($totalTransactionSebelum))*100)/ ($totalTransactionSebelum == 0 ? 1 : floatval($totalTransactionSebelum)); + + $countPending = Refund::where('status', 'pending') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); //ajuan + + $countApprove = Refund::where('status', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // disetujui + + $countDeny = Refund::where('status', 'deny') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // ditolak + + $totalRefund = Refund::whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->count(); // refund + + $totalRefundSebelum = Refund::whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); // refund sebelum + + $rateRefund = floatval((floatval($totalRefund)-floatval($totalRefundSebelum))*100)/ ($totalRefundSebelum == 0 ? 1 : floatval($totalRefundSebelum)); + + $totalUser = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) ->count(); - $countPending = Transaction::where('status_pembayaran', 'pending') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->count(); + $totalUserSebelum = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); - $countCancelled = Transaction::where('status_pembayaran', 'cancel') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->count(); + $rateUser = floatval((floatval($totalUser)-floatval($totalUserSebelum))*100)/ ($totalUserSebelum == 0 ? 1 : floatval($totalUserSebelum)); - $countRefund = Transaction::where('status_pembayaran', 'refund') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->count(); + $totalProfit = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->sum('total_keuntungan'); - $totalTransaction = Transaction::whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->count(); + $totalProfitSebelum = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->sum('total_keuntungan'); + + $rateProfit = floatval((floatval($totalProfit)-floatval($totalProfitSebelum))*100)/ ($totalProfitSebelum == 0 ? 1 : floatval($totalProfitSebelum)); $dataChartTransaction = []; $dataChartRefund = []; + $dataChartUser = []; + $dataLabel = []; - $totalRefund = Transaction::where('status_pembayaran', 'refund')->count(); - $dataChartTotalRefund = []; + $startDate = $start; + $intervalDate = new DateInterval('P1D'); + $todayDate = $today; + $endDate = $todayDate->add($intervalDate); - $totalUser = User::where('status', 'Finished')->count(); - $dataChartTotalUser = []; + for ($date = clone $startDate; $date <= $endDate; $date->modify('+1 day')) { + $transaction = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_keuntungan'); - for ($bulan = 1; $bulan <= 12; $bulan++) { - $transaction = Transaction::whereMonth('updated_at', $bulan) - ->whereYear('updated_at', $currentYear) - ->where('status_pembayaran', 'settlement') - ->sum('total_bayar')/100; + $refund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_keuntungan'); - $refund = Transaction::whereMonth('updated_at', $bulan) - ->whereYear('updated_at', $currentYear) - ->where('status_pembayaran', 'refund') - ->sum('total_harga')/100; + $user = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', $date->format('Y-m-d')) + ->count(); - $dataChartTransaction[] = intval($transaction); - $dataChartRefund[] = intval($refund); + $dataChartTransaction[] = floatval($transaction) / 1000; + $dataChartRefund[] = floatval($refund) / 1000; + $dataChartUser[] = intval($user); + $dataLabel[] = $date->format('d/m/Y'); } - $transactions = Transaction::latest() - ->get(); + $dataTopUsers = Transaction::selectRaw( + " + CONCAT(users.nama_depan,' ',users.nama_belakang) AS nama_lengkap, + COUNT(CASE WHEN transactions.status_transaksi = 'done' OR refunds.status = 'refund' THEN 1 ELSE NULL END) AS jumlah_transaksi, + COUNT(CASE WHEN transactions.status_transaksi = 'done' THEN 1 ELSE NULL END) AS jumlah_transaksi_berhasil, + COUNT(CASE WHEN refunds.status = 'refund' THEN 1 ELSE NULL END) AS jumlah_refund_berhasil, + SUM(CASE WHEN refunds.status = 'refund' THEN refunds.total ELSE 0 END) AS total_refund_berhasil, + SUM(CASE WHEN transactions.status_transaksi = 'done' THEN transactions.total_harga ELSE 0 END) AS total_transaksi_berhasil, + users.foto_profile + ", + ) + ->leftJoin('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->leftJoin('users', 'users.email', '=', 'transactions.pembeli') + ->groupBy('nama_lengkap', 'users.foto_profile') + ->orderBy('total_transaksi_berhasil', 'DESC') + ->orderBy('total_refund_berhasil', 'ASC') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->limit(5) + ->get(); - return view('admin.index', compact('transactions', 'countSuccess', 'countPending', 'countCancelled', 'countRefund', 'totalRefund', 'totalUser', 'totalTransaction', 'dataChartTransaction', 'dataChartRefund', 'dataChartTotalUser', 'dataChartTotalRefund', 'transactions')); + return view('admin.index', compact( + 'countSuccess', + 'countProcessed', + 'countCancelled', + 'countIndicated', + 'countWaiting', + 'totalTransaction', + 'rateTransaction', + 'countPending', + 'countApprove', + 'countDeny', + 'totalRefund', + 'rateRefund', + 'totalUser', + 'rateUser', + 'rateProfit', + 'dataChartTransaction', + 'dataChartRefund', + 'dataChartUser', + 'dataLabel', + 'dataTopUsers' + )); } - public function getSelectedChart() + public function getDataBySearch(Request $request) { - $dataChartLaporan = []; - $tahun = Carbon::now()->year; - } + $startDate = $request->startDate; // 0 + $endDate = $request->endDate; // 29 + $pickDate = new DateTime($request->startDate); + $startDateTime = new DateTime($request->startDate); + $endDateTime = new DateTime($request->endDate); + $interval = $startDateTime->diff($endDateTime); - public function getCharByYear() - { + $intervalBefore = new DateInterval('P1D'); + $intervalBeforeStart = new DateInterval('P'.$interval->format('%a').'D'); + $endBefore = $pickDate->sub($intervalBefore); + $endBeforeDate = $endBefore->format('Y-m-d'); // -1 + $startBefore = $pickDate->sub($intervalBeforeStart); + $startBeforeDate = $startBefore->format('Y-m-d'); // -29 + + $countSuccess = Transaction::whereIn('status_transaksi', ['done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // selesai + + $countProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent', 'success', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // diproses + + $countCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); //gagal + + $countIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // terindikasi + + $countWaiting = Transaction::where('status_transaksi', 'created') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // terindikasi + + $totalTransaction = Transaction::whereNotIn('status_transaksi', ['refund']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // transaksi + + $totalTransactionSebelum = Transaction::whereNotIn('status_transaksi', ['refund']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); // transaksi + + $rateTransaction = floatval((floatval($totalTransaction)-floatval($totalTransactionSebelum))*100)/ ($totalTransactionSebelum == 0 ? 1 : floatval($totalTransactionSebelum)); + + $countPending = Refund::where('status', 'pending') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); //ajuan + + $countApprove = Refund::where('status', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // disetujui + + $countDeny = Refund::where('status', 'deny') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // ditolak + + $totalRefund = Refund::whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); // refund + + $totalRefundSebelum = Refund::whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); + + $rateRefund = floatval((floatval($totalRefund)-floatval($totalRefundSebelum))*100)/ ($totalRefundSebelum == 0 ? 1 : floatval($totalRefundSebelum)); + + $totalUser = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->count(); + + $totalUserSebelum = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->count(); + + $rateUser = floatval((floatval($totalUser)-floatval($totalUserSebelum))*100)/ ($totalUserSebelum == 0 ? 1 : floatval($totalUserSebelum)); + + $totalProfit = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->sum('total_keuntungan'); + + $totalProfitSebelum = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->sum('total_keuntungan'); + + $rateProfit = floatval((floatval($totalProfit)-floatval($totalProfitSebelum))*100)/ ($totalProfitSebelum == 0 ? 1 : floatval($totalProfitSebelum)); + + $dataChartTransaction = []; + $dataChartRefund = []; + $dataChartUser = []; + $dataLabel = []; + + $first = $startDateTime; + $intervalDate = new DateInterval('P1D'); + $endPlus1 = $endDateTime; + $last = $endPlus1->add($intervalDate); + + for ($date = clone $first; $date <= $last; $date->modify('+1 day')) { + $transaction = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_keuntungan'); + + $refund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_keuntungan'); + + $user = User::where('role', 'User') + ->where('status', 'Finished') + ->whereDate('created_at', $date->format('Y-m-d')) + ->count(); + + $dataChartTransaction[] = floatval($transaction); + $dataChartRefund[] = floatval($refund); + $dataChartUser[] = intval($user); + $dataLabel[] = $date->format('d/m/Y'); + } + + $dataTopUsers = Transaction::selectRaw( + " + CONCAT(users.nama_depan,' ',users.nama_belakang) AS nama_lengkap, + COUNT(CASE WHEN transactions.status_transaksi = 'done' OR refunds.status = 'refund' THEN 1 ELSE NULL END) AS jumlah_transaksi, + COUNT(CASE WHEN transactions.status_transaksi = 'done' THEN 1 ELSE NULL END) AS jumlah_transaksi_berhasil, + COUNT(CASE WHEN refunds.status = 'refund' THEN 1 ELSE NULL END) AS jumlah_refund_berhasil, + SUM(CASE WHEN refunds.status = 'refund' THEN refunds.total ELSE 0 END) AS total_refund_berhasil, + SUM(CASE WHEN transactions.status_transaksi = 'done' THEN transactions.total_harga ELSE 0 END) AS total_transaksi_berhasil, + users.foto_profile + ", + ) + ->leftJoin('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->leftJoin('users', 'users.email', 'transactions.pembeli') + ->groupBy('nama_lengkap', 'users.foto_profile') + ->orderBy('total_transaksi_berhasil', 'DESC') + ->orderBy('total_refund_berhasil', 'ASC') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $endDate) + ->limit(5) + ->get(); + + return response()->json([ + 'countSuccess' => $countSuccess, + 'countProcessed' => $countProcessed, + 'countCancelled' => $countCancelled, + 'countIndicated' => $countIndicated, + 'countWaiting' => $countWaiting, + 'totalTransaction' => $totalTransaction, + 'rateTransaction' => $rateTransaction, + 'countPending' => $countPending, + 'countApprove' => $countApprove, + 'countDeny' => $countDeny, + 'totalRefund' => $totalRefund, + 'rateRefund' => $rateRefund, + 'totalUser' => $totalUser, + 'rateUser' => $rateUser, + 'rateProfit' => $rateProfit, + 'dataChartTransaction' => $dataChartTransaction, + 'dataChartRefund' => $dataChartRefund, + 'dataChartUser' => $dataChartUser, + 'dataLabel' => $dataLabel, + 'dataTopUser' => $dataTopUsers, + 'endDate' => $request->endDate, + ]); } } diff --git a/app/Http/Controllers/Admin/Notification/AdminNotification.php b/app/Http/Controllers/Admin/Notification/AdminNotification.php index c5a8983..3bf6ad6 100644 --- a/app/Http/Controllers/Admin/Notification/AdminNotification.php +++ b/app/Http/Controllers/Admin/Notification/AdminNotification.php @@ -46,7 +46,7 @@ class AdminNotification extends Controller public function listNotification(Request $request) { try { - $subQuery = Notification::latest()->select('notifications.id', 'notifications.title', 'notifications.teaser', 'notifications.created_at'); + $subQuery = Notification::latest('notifications.updated_at')->select('notifications.id', 'notifications.title', 'notifications.teaser', 'notifications.created_at'); if ($request->has('search') && !empty($request->search['value'])) { $searchNotif = $request->search['value']; @@ -266,6 +266,7 @@ class AdminNotification extends Controller $email = NotificationReceiver::where('notification_id', $request->id) ->pluck('receiver') ->toArray(); + return view('admin.notification.edit', compact('notification', 'email')); } diff --git a/app/Http/Controllers/Admin/Refund/AdminRefundController.php b/app/Http/Controllers/Admin/Refund/AdminRefundController.php index 16e669d..17cb517 100644 --- a/app/Http/Controllers/Admin/Refund/AdminRefundController.php +++ b/app/Http/Controllers/Admin/Refund/AdminRefundController.php @@ -11,6 +11,8 @@ use App\Models\RefundDescription; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use App\Http\Controllers\Controller; +use App\Models\Notification; +use App\Models\NotificationReceiver; use App\Models\TransactionDescription; use Carbon\Carbon; use Illuminate\Support\Facades\Http; @@ -44,6 +46,7 @@ class AdminRefundController extends Controller public function approveRefund(Request $request) { $refund = Refund::where('id', $request->id)->first(); + $transactionDetail = Transaction::where('id', $refund->transaction_id)->first(); $params = [ 'refund_key' => $request->id . '-ref1', @@ -60,7 +63,7 @@ class AdminRefundController extends Controller 'Content-Type' => 'application/json', 'Authorization' => "Basic $auth", ]) - ->post('https://api.sandbox.midtrans.com/v2/'.$request->id.'/refund', $params); + ->post('https://api.sandbox.midtrans.com/v2/'.$refund->transaction_id.'/refund', $params); $result = json_decode($response->body(), true); $code = $result['status_code']; @@ -85,11 +88,31 @@ class AdminRefundController extends Controller 'deskripsi' => 'Admin telah menyetujui refund.', ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Refund Diterima', + 'content' => 'Refund telah diterima dan uang akan dikembalikan ke pembeli. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => 'Refund telah diterima...', + ]); + + NotificationReceiver::create([ + 'receiver' => [ + $transactionDetail->pembeli, + $transactionDetail->penjual + ], + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Refund berhasil dilakukan. Uang akan dikembalikan ke pembeli.', + 'receivers' => [ + $transactionDetail->pembeli, + $transactionDetail->penjual + ] ]); } catch (Throwable $e) { DB::rollBack(); @@ -98,7 +121,7 @@ class AdminRefundController extends Controller return response()->json([ 'status' => false, - 'message' => 'Refund gagal dilakukan', + 'message' => 'Refund gagal dilakukan' ]); } }else{ @@ -116,6 +139,7 @@ class AdminRefundController extends Controller public function denyRefund(Request $request) { $refund = Refund::where('id', $request->id)->first(); + $transactionDetail = Transaction::where('id', $refund->transaction_id)->first(); try { Transaction::where('id', $refund->transaction_id)->update([ @@ -136,11 +160,31 @@ class AdminRefundController extends Controller 'deskripsi' => 'Admin telah menolak refund. Transaksi akan diteruskan ke penjual. Alasan: '.$request->complaint, ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Refund Diterima', + 'content' => 'Refund ditolak dan transaksi akan diteruskan ke penjual. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => 'Refund ditolak...', + ]); + + NotificationReceiver::create([ + 'receiver' => [ + $transactionDetail->pembeli, + $transactionDetail->penjual + ], + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Refund berhasil ditolak. Transaksi diselesaikan dan uang disampaikan ke penjual.', + 'receivers' => [ + $transactionDetail->pembeli, + $transactionDetail->penjual + ] ]); } catch (Throwable $e) { DB::rollBack(); @@ -160,7 +204,7 @@ class AdminRefundController extends Controller $subQuery = Refund::join('transactions', 'refunds.transaction_id', '=', 'transactions.id') ->join('users as b', 'transactions.pembeli', '=', 'b.email') ->join('users as s', 'transactions.penjual', '=', 's.email') - ->latest() + ->latest('refunds.updated_at') ->select('refunds.id as id', DB::raw("CONCAT(b.nama_depan,' ', b.nama_belakang) as pembeli"), DB::raw("CONCAT(s.nama_depan,' ', s.nama_belakang) as penjual"), 'transactions.nama_barang as nama_barang', 'refunds.total as total', 'refunds.created_at', 'refunds.due_date', 'refunds.status'); if ($request->has('search') && !empty($request->search['value'])) { diff --git a/app/Http/Controllers/Admin/Setting/AdminSettingController.php b/app/Http/Controllers/Admin/Setting/AdminSettingController.php index d182fdc..74050b3 100644 --- a/app/Http/Controllers/Admin/Setting/AdminSettingController.php +++ b/app/Http/Controllers/Admin/Setting/AdminSettingController.php @@ -86,7 +86,7 @@ class AdminSettingController extends Controller public function listSetting(Request $request){ try{ - $subQuery = Setting::latest()->select('id','bulan','tahun','persentase','status'); + $subQuery = Setting::select('id','bulan','tahun','persentase','status')->orderBy('tahun', 'DESC')->orderBy('bulan', 'DESC'); if($request->has('search') && !empty($request->search['value'])){ $searchSetting = $request->search['value']; diff --git a/app/Http/Controllers/Admin/Transaction/AdminTransactionController.php b/app/Http/Controllers/Admin/Transaction/AdminTransactionController.php index ddbb842..29d6904 100644 --- a/app/Http/Controllers/Admin/Transaction/AdminTransactionController.php +++ b/app/Http/Controllers/Admin/Transaction/AdminTransactionController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\Admin\Transaction; use App\Models\Transaction; use App\Http\Controllers\Controller; +use App\Models\Notification; +use App\Models\NotificationReceiver; use App\Models\TransactionDescription; use App\Models\TransactionUser; use Illuminate\Http\Request; @@ -52,6 +54,8 @@ class AdminTransactionController extends Controller $result = json_decode($response->body(), true); $code = $result['status_code']; + $transactionDetail = Transaction::where('id', $request->id)->first(); + if($code == '200'){ try { DB::beginTransaction(); @@ -71,11 +75,33 @@ class AdminTransactionController extends Controller 'deskripsi' => 'Admin telah menerima pembayaran transaksi dan dilanjutkan ke penjual.', ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Transaksi Diterima', + 'content' => 'Transaksi telah diterima dan akan dilanjutkan. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => 'Transaksi telah diterima...', + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->penjual, + 'notification_id' => $notif->id + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->pembeli, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, - 'message' => 'Transaksi telah diterima.' + 'message' => 'Transaksi telah diterima.', + 'receivers' => [ + $transactionDetail->penjual, + $transactionDetail->pembeli + ] ]); } catch (Throwable $e) { DB::rollBack(); @@ -111,6 +137,8 @@ class AdminTransactionController extends Controller $result = json_decode($response->body(), true); $code = $result['status_code']; + $transactionDetail = Transaction::where('id', $request->id)->first(); + if($code == '200'){ try { DB::beginTransaction(); @@ -130,11 +158,26 @@ class AdminTransactionController extends Controller 'deskripsi' => 'Admin telah menolak pembayaran. Alasan: '.$request->compaint, ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + + $notif = Notification::create([ + 'title' => 'Transaksi Ditolak', + 'content' => 'Transaksi anda ditolak oleh Admin. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => 'Transaksi anda ditolak...', + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->pembeli, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, - 'message' => 'Transaksi telah ditolak.' + 'message' => 'Transaksi telah ditolak.', + 'receivers' => $transactionDetail->pembeli ]); } catch (Throwable $e) { DB::rollBack(); @@ -159,7 +202,7 @@ class AdminTransactionController extends Controller try { $subQuery = Transaction::join('users as b', 'transactions.pembeli', '=', 'b.email') ->join('users as s', 'transactions.penjual', '=', 's.email') - ->latest() + ->latest('transactions.updated_at') ->select('transactions.id', 'transactions.nama_barang', DB::raw("CONCAT(b.nama_depan,' ',b.nama_belakang) as nama_pembeli"), DB::raw("CONCAT(s.nama_depan,' ',s.nama_belakang) as nama_penjual"), 'transactions.total_harga', 'transactions.created_at', 'transactions.status_transaksi'); if ($request->has('search') && !empty($request->search['value'])) { diff --git a/app/Http/Controllers/Admin/User/AdminUserController.php b/app/Http/Controllers/Admin/User/AdminUserController.php index bf4974e..d76cbb4 100644 --- a/app/Http/Controllers/Admin/User/AdminUserController.php +++ b/app/Http/Controllers/Admin/User/AdminUserController.php @@ -4,9 +4,12 @@ namespace App\Http\Controllers\Admin\User; use App\Models\User; use App\Http\Controllers\Controller; +use App\Mail\approveUser; +use App\Mail\denyUser; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Mail; use Yajra\DataTables\DataTables; use Throwable; @@ -59,6 +62,13 @@ class AdminUserController extends Controller public function approveUser(Request $request) { + $user = User::where('id', $request->id)->first(); + $email = $user->email; + + $content = [ + 'email' => $email, + ]; + try { DB::beginTransaction(); @@ -66,6 +76,8 @@ class AdminUserController extends Controller 'status' => 'Finished', ]); + Mail::to($email)->send(new approveUser($content)); + DB::commit(); return response()->json([ @@ -81,6 +93,15 @@ class AdminUserController extends Controller public function denyUser(Request $request) { + $user = User::where('id', $request->id)->first(); + $email = $user->email; + $keterangan = $request->keterangan; + + $content = [ + 'keterangan' => $keterangan, + 'email' => $email, + ]; + try { DB::beginTransaction(); @@ -89,6 +110,8 @@ class AdminUserController extends Controller 'keterangan' => $request->keterangan, ]); + Mail::to($email)->send(new denyUser($content)); + DB::commit(); return response()->json([ @@ -107,7 +130,7 @@ class AdminUserController extends Controller try { $subQuery = User::where('role', 'User') ->orderByRaw("CASE WHEN status = 'Progress' THEN 1 WHEN status = 'Finished' THEN 2 WHEN status = 'Rejected' THEN 3 ELSE 4 END ASC") - ->latest() + ->latest('transactions.updated_at') ->select('users.id', DB::raw("CONCAT(users.nama_depan, ' ', users.nama_belakang) as nama_lengkap"), 'users.email', 'users.foto_profile', 'users.status', 'users.created_at as tanggal_daftar'); if ($request->has('search') && !empty($request->search['value'])) { @@ -146,6 +169,17 @@ class AdminUserController extends Controller $url . '">Detail</a> </li> + '; + if($row->status == 'Rejected'){ + $html_code .= ' + <li><a class="dropdown-item" + id="deleteUser" + href="javascript: void(0);" + data-id="'.$row->id.'">Hapus</a> + </li> + '; + } + $html_code .= ' </ul> </div>'; return $html_code; diff --git a/app/Http/Controllers/Login/LoginController.php b/app/Http/Controllers/Login/LoginController.php index c4f2fdf..651e0a0 100644 --- a/app/Http/Controllers/Login/LoginController.php +++ b/app/Http/Controllers/Login/LoginController.php @@ -23,6 +23,7 @@ use Laravolt\Indonesia\Models\City; use Laravolt\Indonesia\Models\District; use Laravolt\Indonesia\Models\Province; use Laravolt\Indonesia\Models\Village; +use Pusher\Pusher; use Ramsey\Uuid\Uuid; class LoginController extends Controller @@ -263,6 +264,19 @@ class LoginController extends Controller DB::commit(); + $options = [ + 'cluster' => 'ap1', + 'useTLS' => true, + ]; + + $pusher = new Pusher('3e5bdc20dddd7fbc655e', 'f2274c37c616d29ff590', '1659859', $options); + + $payload = [ + 'service' => 'User' + ]; + + $pusher->trigger('chanel-update-notifikasi-untuk-admin', 'event-update-notifikasi-untuk-admin', $payload); + return response()->json([ 'status' => true, 'message' => 'Akun anda sudah terdaftar dan butuh verifikasi hingga maksimal 1 hari kerja', diff --git a/app/Http/Controllers/User/Contact/UserContactController.php b/app/Http/Controllers/User/Contact/UserContactController.php index 1311a97..f6c3fba 100644 --- a/app/Http/Controllers/User/Contact/UserContactController.php +++ b/app/Http/Controllers/User/Contact/UserContactController.php @@ -26,15 +26,15 @@ class UserContactController extends Controller { if($request->input == '' || $request->input == null){ $data = DB::table('contacts') - ->join('users', 'contacts.relasi_kontak', '=', 'users.email') ->select('contacts.relasi_kontak', 'users.nama_depan', 'users.nama_belakang') - ->where('contacts.pemilik_kontak', '=', Auth::user()->email) + ->join('users', 'contacts.relasi_kontak', '=', 'users.email') + ->where('contacts.pemilik_kontak', '=', auth()->user()->email) ->paginate(10); }else{ $data = DB::table('contacts') ->join('users', 'contacts.relasi_kontak', '=', 'users.email') ->select('contacts.relasi_kontak', 'users.nama_depan', 'users.nama_belakang') - ->where('contacts.pemilik_kontak', '=', Auth::user()->email) + ->where('contacts.pemilik_kontak', '=', auth()->user()->email) ->whereRaw(DB::raw("LOWER(CONCAT(users.nama_depan,' ',users.nama_belakang)) LIKE ?",['%'.strtolower($request->input).'%'])) ->paginate(10); } @@ -143,7 +143,8 @@ class UserContactController extends Controller ->select( 'contacts.id', DB::raw("CONCAT(users.nama_depan, ' ', users.nama_belakang) as nama_lengkap"), - ); + ) + ->orderBy('nama_lengkap'); if($request->has('search') && !empty($request->search['value'])){ $searchContact = $request->search['value']; diff --git a/app/Http/Controllers/User/Dashboard/UserDashboardController.php b/app/Http/Controllers/User/Dashboard/UserDashboardController.php index 7e377c0..9422db1 100644 --- a/app/Http/Controllers/User/Dashboard/UserDashboardController.php +++ b/app/Http/Controllers/User/Dashboard/UserDashboardController.php @@ -5,74 +5,646 @@ namespace App\Http\Controllers\User\Dashboard; use App\Http\Controllers\Controller; use App\Models\Refund; use Illuminate\Http\Request; -use App\Models\RefundUser; use App\Models\Transaction; use Carbon\Carbon; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Log; -use Throwable; +use DateInterval; +use DateTime; class UserDashboardController extends Controller { public function index() { - $currentMonth = Carbon::now()->month; - $currentYear = Carbon::now()->year; - $currentRole = 'Pembeli'; + $today = new DateTime(); + $todayDate = $today->format('Y-m-d'); + $pickDate = new DateTime(); + $interval = new DateInterval('P29D'); + $start = $pickDate->sub($interval); + $startDate = $start->format('Y-m-d'); - $countCreated = Transaction::where('status_transaksi', 'created') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->where('pembeli', auth()->user()->email) - ->count(); + $intervalBefore = new DateInterval('P1D'); + $intervalBeforeStart = new DateInterval('P29D'); + $endBefore = $pickDate->sub($intervalBefore); + $endBeforeDate = $endBefore->format('Y-m-d'); + $startBefore = $pickDate->sub($intervalBeforeStart); + $startBeforeDate = $startBefore->format('Y-m-d'); - $countPending = Transaction::where('status_pembayaran', 'pending') - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->where('pembeli', auth()->user()->email) - ->count(); + // Semua + $countAllFinished = Transaction::whereIn('status_transaksi', ['finished', 'done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $countFailure = Transaction::whereIn('status_pembayaran', ['cancel', 'expire', 'failure']) - ->whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->where('pembeli', auth()->user()->email) - ->count(); + $countAllPending = Transaction::where('status_transaksi', 'created') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $sumRefund = Transaction::join('refunds', 'transactions.id', '=', 'refunds.transaction_id') - ->where('transactions.status_pembayaran', 'refund') - ->whereMonth('transactions.updated_at', $currentMonth) - ->whereYear('transactions.updated_at', $currentYear) - ->where('transactions.pembeli', auth()->user()->email) - ->sum('refunds.total'); + $countAllProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $sumTransaksi = Transaction::whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->where('pembeli', auth()->user()->email) - ->sum('total_bayar'); + $countAllCanceled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $totalTransaction = Transaction::whereMonth('updated_at', $currentMonth) - ->whereYear('updated_at', $currentYear) - ->count(); + $countAllRefund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $totalIncome = Transaction::where('status_transaksi', 'success')->sum('total_bayar'); + $countAllIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); - $totalExpense = Transaction::where('status_transaksi', 'updated_at') - ->orWhere('status_transaksi', 'refund') - ->sum('total_bayar'); + // Pembeli + $countBuyerFinished = Transaction::whereIn('status_transaksi', ['finished', 'done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); - return view('user.index', compact('currentRole', 'countCreated', 'countPending', 'countFailure', 'sumRefund', 'sumTransaksi', 'totalTransaction', 'totalIncome', 'totalExpense')); + $countBuyerPaid = Transaction::where('status_transaksi', 'success') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerPending = Transaction::where('status_transaksi', 'created') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundPending = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'pending') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundApproved = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'refund') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundDenied = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'deny') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + // Penjual + $countSellerPending = Transaction::where('status_transaksi', 'success') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerFinished = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerProcessed = Transaction::where('status_transaksi', 'process') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerSending = Transaction::where('status_transaksi', 'sending') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerSent = Transaction::where('status_transaksi', 'sent') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerRefund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $totalTransaction = Transaction::whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $totalTransactionSebelum = Transaction::whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $rateTransaction = floatval((floatval($totalTransaction) - floatval($totalTransactionSebelum)) * 100) / ($totalTransactionSebelum == 0 ? 1 : floatval($totalTransactionSebelum)); + + $totalPemasukan = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->sum('total_harga'); + + $totalPemasukanSebelum = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where('penjual', auth()->user()->email) + ->sum('total_harga'); + + $ratePemasukan = floatval((floatval($totalPemasukan) - floatval($totalPemasukanSebelum)) * 100) / ($totalPemasukanSebelum == 0 ? 1 : floatval($totalPemasukanSebelum)); + + $totalPengeluaran = Transaction::whereIn('status_transaksi', ['finished','done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->sum('total_harga'); + + $totalPengeluaranSebelum = Transaction::whereIn('status_transaksi', ['finished','done']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where('pembeli', auth()->user()->email) + ->sum('total_harga'); + + $ratePengeluaran = floatval(((floatval($totalPengeluaran) - floatval($totalPengeluaranSebelum)) * 100) / ($totalPengeluaranSebelum == 0 ? 1 : floatval($totalPengeluaranSebelum))); + + $totalProfit = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_harga'); + + $totalProfitSebelum = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_harga'); + + $rateProfit = floatval(((floatval($totalProfit) - floatval($totalProfitSebelum))*100)/($totalProfitSebelum == 0 ? 1 : floatval($totalProfitSebelum))); + + $dataLabel = []; + $dataChartTransaction = []; + $dataChartRefund = []; + $dataChartPemasukan = []; + $dataChartPengeluaran = []; + + $startDate = $start; + $intervalDate = new DateInterval('P1D'); + $todayDate = $today; + $endDate = $todayDate->add($intervalDate); + + for ($date = clone $startDate; $date <= $endDate; $date->modify('+1 day')) { + $transaction = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', $date->format('Y-m-d')) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_keuntungan'); + + $refund = Transaction::join('refunds','refunds.transaction_id','=','transactions.id') + ->where('status_transaksi', 'refund') + ->where('status','refund') + ->whereDate('transactions.created_at', $date->format('Y-m-d')) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_keuntungan'); + + $pemasukan = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->where('penjual', auth()->user()->email) + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_harga'); + + $pengeluaran = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->where('pembeli', auth()->user()->email) + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_harga'); + + $dataChartTransaction[] = floatval($transaction); + $dataChartRefund[] = floatval($refund); + $dataChartPemasukan[] = floatval($pemasukan); + $dataChartPengeluaran[] = floatval($pengeluaran); + $dataLabel[] = $date->format('d/m/Y'); + } + + return view('user.index', compact( + 'countAllFinished', + 'countAllPending', + 'countAllProcessed', + 'countAllCanceled', + 'countAllRefund', + 'countAllIndicated', + 'countBuyerFinished', + 'countBuyerPaid', + 'countBuyerPending', + 'countBuyerProcessed', + 'countBuyerCancelled', + 'countBuyerRefundPending', + 'countBuyerRefundApproved', + 'countBuyerRefundDenied', + 'countBuyerIndicated', + 'countSellerPending', + 'countSellerFinished', + 'countSellerProcessed', + 'countSellerSending', + 'countSellerSent', + 'countSellerCancelled', + 'countSellerRefund', + 'countSellerIndicated', + 'totalTransaction', + 'rateTransaction', + 'totalPemasukan', + 'ratePemasukan', + 'totalPengeluaran', + 'ratePengeluaran', + 'rateProfit', + 'dataLabel', + 'dataChartTransaction', + 'dataChartRefund', + 'dataChartPemasukan', + 'dataChartPengeluaran' + )); } - public function getSelectedChart(){ - $currentMonth = Carbon::now()->month; - $currentYear = Carbon::now()->year; - $currentRole = 'Pembeli'; + public function getDataBySearch(Request $request) + { + $startDate = $request->startDate; + $todayDate = $request->endDate; + $pickDate = new DateTime($startDate); + $start = new DateTime($startDate); + $today = new DateTime($todayDate); + $interval = $start->diff($today); - if($currentRole == 'Pembeli'){ + $intervalBefore = new DateInterval('P1D'); + $intervalBeforeStart = new DateInterval('P'.$interval->format('%a').'D'); + $endBefore = $pickDate->sub($intervalBefore); + $endBeforeDate = $endBefore->format('Y-m-d'); + $startBefore = $pickDate->sub($intervalBeforeStart); + $startBeforeDate = $startBefore->format('Y-m-d'); - }else{ + // Semua + $countAllFinished = Transaction::where('status_transaksi', 'Finished') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + $countAllPending = Transaction::where('status_transaksi', 'created') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $countAllProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $countAllCanceled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $countAllRefund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $countAllIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + // Pembeli + $countBuyerFinished = Transaction::where('status_transaksi', 'finished') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerPaid = Transaction::where('status_transaksi', 'success') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerPending = Transaction::where('status_transaksi', 'created') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerProcessed = Transaction::whereIn('status_transaksi', ['process', 'sending', 'sent']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundPending = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'pending') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundApproved = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'refund') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerRefundDenied = Transaction::join('refunds', 'refunds.transaction_id', '=', 'transactions.id') + ->where('refunds.status', 'deny') + ->whereDate('transactions.created_at', '>=', $startDate) + ->whereDate('transactions.created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + $countBuyerIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->count(); + + // Penjual + $countSellerPending = Transaction::where('status_transaksi', 'success') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerFinished = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerProcessed = Transaction::where('status_transaksi', 'process') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerSending = Transaction::where('status_transaksi', 'sending') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerSent = Transaction::where('status_transaksi', 'sent') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerCancelled = Transaction::where('status_transaksi', 'failure') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerRefund = Transaction::where('status_transaksi', 'refund') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $countSellerIndicated = Transaction::where('status_transaksi', 'challenge') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->count(); + + $totalTransaction = Transaction::whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $totalTransactionSebelum = Transaction::whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->count(); + + $rateTransaction = floatval((floatval($totalTransaction) - floatval($totalTransactionSebelum)) * 100) / ($totalTransactionSebelum == 0 ? 1 : floatval($totalTransactionSebelum)); + + $totalPemasukan = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('penjual', auth()->user()->email) + ->sum('total_harga'); + + $totalPemasukanSebelum = Transaction::where('status_transaksi', 'done') + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where('penjual', auth()->user()->email) + ->sum('total_harga'); + + $ratePemasukan = floatval((floatval($totalPemasukan) - floatval($totalPemasukanSebelum)) * 100) / ($totalPemasukanSebelum == 0 ? 1 : floatval($totalPemasukanSebelum)); + + $totalPengeluaran = Transaction::whereIn('status_transaksi', ['finished','done']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where('pembeli', auth()->user()->email) + ->sum('total_harga'); + + $totalPengeluaranSebelum = Transaction::whereIn('status_transaksi', ['finished','done']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where('pembeli', auth()->user()->email) + ->sum('total_harga'); + + $ratePengeluaran = floatval(((floatval($totalPengeluaran) - floatval($totalPengeluaranSebelum)) * 100) / ($totalPengeluaranSebelum == 0 ? 1 : floatval($totalPengeluaranSebelum))); + + $totalProfit = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $todayDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_harga'); + + $totalProfitSebelum = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', '>=', $startBeforeDate) + ->whereDate('created_at', '<=', $endBeforeDate) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_harga'); + + $rateProfit = floatval(((floatval($totalProfit) - floatval($totalProfitSebelum))*100)/($totalProfitSebelum == 0 ? 1 : floatval($totalProfitSebelum))); + + $dataLabel = []; + $dataChartTransaction = []; + $dataChartRefund = []; + $dataChartPemasukan = []; + $dataChartPengeluaran = []; + + $first = $start; + $intervalDate = new DateInterval('P1D'); + $lastDate = $today; + $last = $lastDate->add($intervalDate); + + for ($date = clone $first; $date <= $last; $date->modify('+1 day')) { + $transaction = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->whereDate('created_at', $date->format('Y-m-d')) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_keuntungan'); + + $refund = Transaction::join('refunds','refunds.transaction_id','=','transactions.id') + ->where('status_transaksi', 'refund') + ->where('status','refund') + ->whereDate('transactions.created_at', $date->format('Y-m-d')) + ->where(function ($a) { + $a->where('pembeli', auth()->user()->email)->orWhere('penjual', auth()->user()->email); + }) + ->sum('total_keuntungan'); + + $pemasukan = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->where('penjual', auth()->user()->email) + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_harga'); + + $pengeluaran = Transaction::whereIn('status_transaksi', ['done', 'finished']) + ->where('pembeli', auth()->user()->email) + ->whereDate('created_at', $date->format('Y-m-d')) + ->sum('total_harga'); + + $dataChartTransaction[] = floatval($transaction); + $dataChartRefund[] = floatval($refund); + $dataChartPemasukan[] = floatval($pemasukan); + $dataChartPengeluaran[] = floatval($pengeluaran); + $dataLabel[] = $date->format('d/m/Y'); } + + return response()->json([ + 'countAllFinished' => $countAllFinished, + 'countAllPending' => $countAllPending, + 'countAllProcessed' => $countAllProcessed, + 'countAllCanceled' => $countAllCanceled, + 'countAllRefund' => $countAllRefund, + 'countAllIndicated' => $countAllIndicated, + 'countBuyerFinished' => $countBuyerFinished, + 'countBuyerPaid' => $countBuyerPaid, + 'countBuyerPending' => $countBuyerPending, + 'countBuyerProcessed' => $countBuyerProcessed, + 'countBuyerCancelled' => $countBuyerCancelled, + 'countBuyerRefundPending' => $countBuyerRefundPending, + 'countBuyerRefundApproved' => $countBuyerRefundApproved, + 'countBuyerRefundDenied' => $countBuyerRefundDenied, + 'countBuyerIndicated' => $countBuyerIndicated, + 'countSellerPending' => $countSellerPending, + 'countSellerFinished' => $countSellerFinished, + 'countSellerProcessed' => $countSellerProcessed, + 'countSellerSending' => $countSellerSending, + 'countSellerSent' => $countSellerSent, + 'countSellerCancelled' => $countSellerCancelled, + 'countSellerRefund' => $countSellerRefund, + 'countSellerIndicated' => $countSellerIndicated, + 'totalTransaction' => $totalTransaction, + 'rateTransaction' => $rateTransaction, + 'totalPemasukan' => $totalPemasukan, + 'ratePemasukan' => $ratePemasukan, + 'totalPengeluaran' => $totalPengeluaran, + 'ratePengeluaran' => $ratePengeluaran, + 'rateProfit' => $rateProfit, + 'dataLabel' => $dataLabel, + 'dataChartTransaction' => $dataChartTransaction, + 'dataChartRefund' => $dataChartRefund, + 'dataChartPemasukan' => $dataChartPemasukan, + 'dataChartPengeluaran' => $dataChartPengeluaran + ]); } } diff --git a/app/Http/Controllers/User/Notification/UserNotification.php b/app/Http/Controllers/User/Notification/UserNotification.php index 5d9688b..5bf1eb1 100644 --- a/app/Http/Controllers/User/Notification/UserNotification.php +++ b/app/Http/Controllers/User/Notification/UserNotification.php @@ -8,6 +8,7 @@ use App\Models\NotificationReceiver; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use Pusher\Pusher; use Throwable; use Yajra\DataTables\Facades\DataTables; @@ -23,7 +24,7 @@ class UserNotification extends Controller try { $subQuery = Notification::join('notification_receivers','notifications.id','=','notification_receivers.notification_id') ->where('notification_receivers.receiver','=',auth()->user()->email) - ->latest() + ->latest('notification_receivers.updated_at') ->select('notifications.id', 'notifications.title', 'notifications.teaser', 'notification_receivers.created_at', 'notification_receivers.status'); if ($request->has('search') && !empty($request->search['value'])) { @@ -114,13 +115,53 @@ class UserNotification extends Controller public function markAllAsRead() { - NotificationReceiver::where('receiver', auth()->user()->email)->update([ + $result = NotificationReceiver::where('receiver', auth()->user()->email)->update([ 'status' => 'read', ]); - return response()->json([ - 'status' => true, - 'message' => 'Berhasil', - ]); + if($result){ + return response()->json([ + 'status' => true, + 'message' => 'Berhasil', + ]); + }else{ + return response()->json([ + 'status' => false, + 'message' => 'Gagal', + ]); + Log::error($result); + } + } + + public function updateNewNotification(Request $request) + { + $options = [ + 'cluster' => 'ap1', + 'useTLS' => true, + ]; + + $pusher = new Pusher('3e5bdc20dddd7fbc655e', 'f2274c37c616d29ff590', '1659859', $options); + + $payload = [ + 'receivers' => $request->receiver, + ]; + + $pusher->trigger('chanel-update-notifikasi', 'event-update-notifikasi', $payload); + } + + public function updateNotificationToAdmin(Request $request) + { + $options = [ + 'cluster' => 'ap1', + 'useTLS' => true, + ]; + + $pusher = new Pusher('3e5bdc20dddd7fbc655e', 'f2274c37c616d29ff590', '1659859', $options); + + $payload = [ + 'service' => $request->service + ]; + + $pusher->trigger('chanel-update-notifikasi-untuk-admin', 'event-update-notifikasi-untuk-admin', $payload); } } diff --git a/app/Http/Controllers/User/Pembeli/PembeliController.php b/app/Http/Controllers/User/Pembeli/PembeliController.php index d65ec84..e2b548f 100644 --- a/app/Http/Controllers/User/Pembeli/PembeliController.php +++ b/app/Http/Controllers/User/Pembeli/PembeliController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\User\Pembeli; use App\Http\Controllers\Controller; use App\Models\Contact; +use App\Models\Notification; +use App\Models\NotificationReceiver; use App\Models\Refund; use App\Models\Setting; use App\Models\Transaction; @@ -15,6 +17,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; +use Pusher\Pusher; use Throwable; use Yajra\DataTables\DataTables; @@ -50,6 +53,30 @@ class PembeliController extends Controller public function store(Request $request) { + $request->validate( + [ + 'nama_barang' => ['required'], + 'harga_barang' => ['required'], + 'satuan_barang' => ['required'], + 'jumlah_barang' => ['required'], + 'email_penjual' => ['required'], + 'persentase_keuntungan' => ['required'], + 'total_keuntungan' => ['required'], + 'total_bayar' => ['required'], + 'total_harga' => ['required'] + ],[ + 'nama_barang.required' => 'Isi nama barang', + 'harga_barang.required' => 'Isi harga barang', + 'satuan_barang.required' => 'Isi satuan barang', + 'jumlah_barang.required' => 'Isi jumlah barang', + 'email_penjual.required' => 'Isi email penjual. Bisa dari kontak atau masukan email', + 'persentase_keuntungan.required' => 'Terjadi kesalahan di server', + 'total_keuntungan.required' => 'Terjadi kesalahan di server', + 'total_bayar.required' => 'Terjadi kesalahan di server', + 'total_harga.required' => 'Terjadi kesalahan di server' + ] + ); + $pembeli = auth()->user()->email; $penjual = $request->email_penjual; $nama_barang = $request->nama_barang; @@ -84,7 +111,6 @@ class PembeliController extends Controller $batas_pembayaran = $now->addDays(1)->toTimeString(); $batas_konfirmasi_transaksi = $now->addDays(2)->toDateTimeString(); - $batas_pengiriman_barang_awal = $now->addDays(3)->toDateTimeString(); $batas_pengiriman_barang_akhir = $now->addDays(4)->toDateTimeString(); $status = 'created'; @@ -109,7 +135,6 @@ class PembeliController extends Controller 'status_transaksi' => $status, 'batas_pembayaran' => $batas_pembayaran, 'batas_konfirmasi_transaksi' => $batas_konfirmasi_transaksi, - 'batas_pengiriman_barang_awal' => $batas_pengiriman_barang_awal, 'batas_pengiriman_barang_akhir' => $batas_pengiriman_barang_akhir, ]); @@ -214,6 +239,8 @@ class PembeliController extends Controller public function finishTransaction(Request $request) { + $transactionDetail = Transaction::where('id', $request->id)->first(); + try { DB::beginTransaction(); @@ -231,11 +258,23 @@ class PembeliController extends Controller 'deskripsi' => 'Pesanan telah diselesaikan oleh ' . auth()->user()->nama_depan . '. Uang akan dikirim ke penjual.', ]); + $notif = Notification::create([ + 'title' => 'Transaksi Selesai', + 'content' => auth()->user()->nama_depan.' telah menyelesaikan transaksi. Silahkan terima uang anda.', + 'teaser' => auth()->user()->nama_depan.' telah...' + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->penjual, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Pesanan anda selesai dan uang akan dikirim ke penjual. Terima kasih telah menggunakan Rekber.', + 'receiver' => $transactionDetail->penjual ]); } catch (Throwable $e) { DB::rollBack(); @@ -253,6 +292,8 @@ class PembeliController extends Controller { $auth = base64_encode(env('MIDTRANS_SERVER_KEY')); + $transactionDetail = Transaction::where('id', $request->id)->first(); + $response = Http::withOptions([ 'verify' => false, ]) @@ -307,11 +348,25 @@ class PembeliController extends Controller 'user' => auth()->user()->email, ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Pembayaran Sukses', + 'content' => auth()->user()->nama_depan.' telah membayar transaksi. Silahkan proses transaksi ini jika memang dituju kepada anda. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => auth()->user()->nama_depan.' telah...' + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->penjual, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Pembayaran sukses', + 'receiver' => $transactionDetail->penjual ]); } elseif ($transaction == 'challenge') { TransactionDescription::create([ @@ -324,6 +379,19 @@ class PembeliController extends Controller 'keterangan' => $result['status_message'], ]); + $options = [ + 'cluster' => 'ap1', + 'useTLS' => true, + ]; + + $pusher = new Pusher('3e5bdc20dddd7fbc655e', 'f2274c37c616d29ff590', '1659859', $options); + + $payload = [ + 'service' => 'Transaksi' + ]; + + $pusher->trigger('chanel-update-notifikasi-untuk-admin', 'event-update-notifikasi-untuk-admin', $payload); + DB::commit(); return response()->json([ @@ -471,11 +539,25 @@ class PembeliController extends Controller 'deskripsi' => 'Transaksi dibatalkan oleh ' . auth()->user()->nama_depan . '. Alasan : ' . $request->complaint, ]); + $url = route('user-transaction.show', ['id' => $transaction->id]); + + $notif = Notification::create([ + 'title' => 'Transaksi Dibatalkan', + 'content' => auth()->user()->nama_depan.' telah membatalkan transaksi. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => auth()->user()->nama_depan.' telah...' + ]); + + NotificationReceiver::create([ + 'receiver' => $transaction->penjual, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Transaksi telah dibatalkan.', + 'receiver' => $transaction->penjual ]); } catch (Throwable $e) { DB::rollBack(); @@ -740,7 +822,8 @@ class PembeliController extends Controller 'transactions.created_at', 'transactions.status_transaksi', 'transactions.token' - ); + ) + ->latest('transactions.updated_at'); if($request->has('search') && !empty($request->search['value'])){ $searchPembeli = $request->search['value']; diff --git a/app/Http/Controllers/User/Penjual/PenjualController.php b/app/Http/Controllers/User/Penjual/PenjualController.php index ade1002..4fffa99 100644 --- a/app/Http/Controllers/User/Penjual/PenjualController.php +++ b/app/Http/Controllers/User/Penjual/PenjualController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\User\Penjual; use App\Http\Controllers\Controller; +use App\Models\Notification; +use App\Models\NotificationReceiver; use App\Models\Refund; use App\Models\Transaction; use App\Models\TransactionDescription; @@ -26,7 +28,8 @@ class PenjualController extends Controller try { $subQuery = Transaction::join('users', 'transactions.pembeli', '=', 'users.email') ->where('transactions.penjual', auth()->user()->email) - ->select('transactions.id', DB::raw("CONCAT(users.nama_depan,' ',users.nama_belakang) as nama_pembeli"), 'transactions.nama_barang', 'transactions.total_harga', 'transactions.created_at', 'transactions.status_transaksi'); + ->select('transactions.id', DB::raw("CONCAT(users.nama_depan,' ',users.nama_belakang) as nama_pembeli"), 'transactions.nama_barang', 'transactions.total_harga', 'transactions.created_at', 'transactions.status_transaksi') + ->latest('transactions.updated_at'); if ($request->has('search') && !empty($request->search['value'])) { $searchPenjual = $request->search['value']; @@ -103,7 +106,7 @@ class PenjualController extends Controller '; } - if ($row->status_transaksi == 'progress') { + if ($row->status_transaksi == 'process') { $html_code .= ' <li><a class="dropdown-item" id="sendOrder" @@ -156,6 +159,8 @@ class PenjualController extends Controller public function acceptTransaction(Request $request) { + $transactionDetail = Transaction::where('id', $request->id)->first(); + try { DB::beginTransaction(); @@ -172,11 +177,25 @@ class PenjualController extends Controller 'deskripsi' => 'Transaksi telah diterima oleh ' . auth()->user()->nama_depan, ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Transaksi Diproses', + 'content' => auth()->user()->nama_depan.' telah menerima dan memproses transaksi. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => auth()->user()->nama_depan.' telah...' + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->pembeli, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Transaksi telah diterima. Siapkan pesanan untuk dikirim ke penjual.', + 'receiver' => $transactionDetail->pembeli ]); } catch (Throwable $e) { DB::rollBack(); @@ -241,11 +260,25 @@ class PenjualController extends Controller 'deskripsi' => 'Transaksi ditolak ' . auth()->user()->nama_depan . ', uang akan dikembalikan ke pembeli. Alasan : ' . $request->complaint, ]); + $url = route('user-transaction.show', ['id' => $transaction->id]); + + $notif = Notification::create([ + 'title' => 'Transaksi Diproses', + 'content' => auth()->user()->nama_depan.' telah menolak transaksi.<a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => auth()->user()->nama_depan.' telah...' + ]); + + NotificationReceiver::create([ + 'receiver' => $transaction->pembeli, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Transaksi telah ditolak. Uang akan dikirimkan ke pembeli.', + 'receiver' => $transaction->pembeli ]); } catch (Throwable $e) { DB::rollBack(); @@ -305,6 +338,8 @@ class PenjualController extends Controller public function sentOrder(Request $request) { + $transactionDetail = Transaction::where('id', $request->transaction_id)->first(); + try { DB::beginTransaction(); @@ -332,11 +367,25 @@ class PenjualController extends Controller 'bukti_foto' => $bukti_foto, ]); + $url = route('user-transaction.show', ['id' => $transactionDetail->id]); + + $notif = Notification::create([ + 'title' => 'Transaksi Sudah Tiba', + 'content' => 'Transaksi sudah tiba dan silahkan periksa terlebih dahulu sebelum menyelesaikan transaksi atau mengajukan refund. <a href="'.$url.'">Klik disini</a> untuk langsung ke detail transaksi.', + 'teaser' => 'Transaksi sudah tiba dan silahkan per...', + ]); + + NotificationReceiver::create([ + 'receiver' => $transactionDetail->pembeli, + 'notification_id' => $notif->id + ]); + DB::commit(); return response()->json([ 'status' => true, 'message' => 'Pesanan telah sampai di tempat pembeli.', + 'receiver' => $transactionDetail->pembeli ]); } catch (Throwable $e) { DB::rollBack(); diff --git a/app/Http/Controllers/User/Refund/UserRefundController.php b/app/Http/Controllers/User/Refund/UserRefundController.php index 317e4c4..a94b207 100644 --- a/app/Http/Controllers/User/Refund/UserRefundController.php +++ b/app/Http/Controllers/User/Refund/UserRefundController.php @@ -83,6 +83,7 @@ class UserRefundController extends Controller return response()->json([ 'status' => true, 'message' => 'Permintaan refund anda telah dikirim ke admin untuk direview. Mohon tunggu maksimal 2 hari.', + 'service' => 'Refund' ]); }catch(Throwable $e){ DB::rollback(); @@ -115,7 +116,8 @@ class UserRefundController extends Controller 'refunds.status', 'transactions.nama_barang', DB::raw("CONCAT(s.nama_depan,' ',s.nama_belakang) as nama_penjual"), - ); + ) + ->latest('refunds.updated_at'); if($request->has('search') && !empty($request->search['value'])){ $searchRefund = $request->search['value']; diff --git a/app/Mail/approveUser.php b/app/Mail/approveUser.php new file mode 100644 index 0000000..4fe6325 --- /dev/null +++ b/app/Mail/approveUser.php @@ -0,0 +1,59 @@ +<?php + +namespace App\Mail; + +use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Mail\Mailable; +use Illuminate\Mail\Mailables\Content; +use Illuminate\Mail\Mailables\Envelope; +use Illuminate\Queue\SerializesModels; + +class approveUser extends Mailable +{ + use Queueable, SerializesModels; + + public $content; + + /** + * Create a new message instance. + */ + public function __construct($content) + { + $this->content = $content; + } + + /** + * Get the message envelope. + */ + // public function envelope(): Envelope + // { + // return new Envelope( + // subject: 'Approve User', + // ); + // } + + /** + * Get the message content definition. + */ + // public function content(): Content + // { + // return new Content( + // view: 'view.name', + // ); + // } + + /** + * Get the attachments for the message. + * + * @return array<int, \Illuminate\Mail\Mailables\Attachment> + */ + // public function attachments(): array + // { + // return []; + // } + + public function build(){ + return $this->subject('Pendaftaran Akun Sukses')->view('email.approve-user-email'); + } +} diff --git a/app/Mail/denyUser.php b/app/Mail/denyUser.php new file mode 100644 index 0000000..1c8ec4a --- /dev/null +++ b/app/Mail/denyUser.php @@ -0,0 +1,59 @@ +<?php + +namespace App\Mail; + +use Illuminate\Bus\Queueable; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Mail\Mailable; +use Illuminate\Mail\Mailables\Content; +use Illuminate\Mail\Mailables\Envelope; +use Illuminate\Queue\SerializesModels; + +class denyUser extends Mailable +{ + use Queueable, SerializesModels; + + public $content; + + /** + * Create a new message instance. + */ + public function __construct($content) + { + $this->content = $content; + } + + /** + * Get the message envelope. + */ + // public function envelope(): Envelope + // { + // return new Envelope( + // subject: 'Deny User', + // ); + // } + + /** + * Get the message content definition. + */ + // public function content(): Content + // { + // return new Content( + // view: 'view.name', + // ); + // } + + /** + * Get the attachments for the message. + * + * @return array<int, \Illuminate\Mail\Mailables\Attachment> + */ + // public function attachments(): array + // { + // return []; + // } + + public function build(){ + return $this->subject('Pendaftaran Akun Gagal')->view('email.deny-user-email'); + } +} diff --git a/app/Models/transaction.php b/app/Models/transaction.php index 2472671..ff02bb3 100644 --- a/app/Models/transaction.php +++ b/app/Models/transaction.php @@ -30,7 +30,6 @@ class Transaction extends Model 'status_transaksi', 'status_pembayaran', 'batas_pembayaran', - 'batas_pengiriman_barang_awal', 'batas_pengiriman_barang_akhir', 'nama_bank_penjual', 'no_rek_penjual' diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index a324d5b..a915de8 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -34,7 +34,8 @@ class UserFactory extends Factory 'status'=> $this->faker->randomElement(['Progress', 'Finished', 'Rejected']), 'gender' => $this->faker->randomElement(['Laki-laki', 'Perempuan']), 'kode_kelurahan' => '1101012002', - 'keterangan' => $this->faker->sentence + 'keterangan' => $this->faker->sentence, + 'foto_profile' => 'face'.random_int(1,10).'.jpg' ]; } diff --git a/database/migrations/2023_08_01_073859_create_transactions_table.php b/database/migrations/2023_08_01_073859_create_transactions_table.php index e1c9da9..2502525 100644 --- a/database/migrations/2023_08_01_073859_create_transactions_table.php +++ b/database/migrations/2023_08_01_073859_create_transactions_table.php @@ -32,8 +32,8 @@ return new class extends Migration $table->enum('status_transaksi',['success','challenge','failure','process','sending','sent','finished','created', 'refund', 'done'])->default('created'); // transaction_status $table->enum('status_pembayaran',['settlement','capture','pending','expire','failure','cancel','refund'])->nullable(); // status transaksi dari midtrans $table->timestamp('batas_pembayaran')->nullable(); + $table->timestamp('batas_pembatalan_transaksi')->nullable(); $table->timestamp('batas_konfirmasi_transaksi')->nullable(); - $table->timestamp('batas_pengiriman_barang_awal'); $table->timestamp('batas_pengiriman_barang_akhir'); $table->timestamp('tanggal_transaksi')->nullable(); $table->string('nama_bank_penjual'); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index be654e3..62f7879 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -50,6 +50,7 @@ class DatabaseSeeder extends Seeder 'persentase_kemiripan' => 100, 'gender' => $faker->randomElement(['Laki-laki', 'Perempuan']), 'kode_kelurahan' => '1101012002', + 'foto_profile' => 'face1.jpg' ]); $user1 = User::factory()->create([ @@ -71,7 +72,8 @@ class DatabaseSeeder extends Seeder 'kode_kelurahan' => '1101012002', 'nama_bank' => 'mandiri', 'no_rek' => '019809210873', - 'keterangan' => $faker->sentence() + 'keterangan' => $faker->sentence(), + 'foto_profile' => 'face2.jpg' ]); $user2 = User::factory()->create([ @@ -93,7 +95,8 @@ class DatabaseSeeder extends Seeder 'kode_kelurahan' => '1101012002', 'nama_bank' => 'bca', 'no_rek' => '01980921', - 'keterangan' => $faker->sentence() + 'keterangan' => $faker->sentence(), + 'foto_profile' => 'face3.jpg' ]); User::factory(100)->create(); @@ -125,7 +128,6 @@ class DatabaseSeeder extends Seeder 'token' => 'asda', 'status_transaksi' => 'created', 'batas_pembayaran' => now(), - 'batas_pengiriman_barang_awal' => now(), 'batas_pengiriman_barang_akhir' => now(), 'nama_bank_penjual' => $user2->nama_bank, 'no_rek_penjual' => $user2->no_rek, @@ -140,6 +142,36 @@ class DatabaseSeeder extends Seeder 'deskripsi' => $user1->nama_depan . ' telah membuat transaksi baru dengan ' . $user2->nama_depan, ]); + $transaction = Transaction::create([ + 'id' => Str::uuid(), + 'pembeli' => $user2->email, + 'penjual' => $user1->email, + 'nama_barang' => 'hah', + 'deskripsi_transaksi' => null, + 'satuan_barang' => 'barang', + 'harga_barang' => 2000, + 'jumlah_barang' => 2, + 'persentase_keuntungan' => 2, + 'total_keuntungan' => 2, + 'total_harga' => 2, + 'total_bayar' => 2, + 'token' => 'asda', + 'status_transaksi' => 'created', + 'batas_pembayaran' => now(), + 'batas_pengiriman_barang_akhir' => now(), + 'nama_bank_penjual' => $user1->nama_bank, + 'no_rek_penjual' => $user1->no_rek, + ]); + + TransactionDescription::create([ + 'transaction_id' => $transaction->id, + 'status' => 'pending', + 'user' => $user2->email, + 'judul' => 'fa fa-plus', + 'background' => 'bg-buyer', + 'deskripsi' => $user2->nama_depan . ' telah membuat transaksi baru dengan ' . $user1->nama_depan, + ]); + $transactionRefund = Transaction::create([ 'id' => Str::uuid(), 'pembeli' => $user1->email, @@ -157,7 +189,6 @@ class DatabaseSeeder extends Seeder 'status_transaksi' => 'success', 'status_pembayaran' => 'refund', 'batas_pembayaran' => now(), - 'batas_pengiriman_barang_awal' => now(), 'batas_pengiriman_barang_akhir' => now(), 'nama_bank_penjual' => $user2->nama_bank, 'no_rek_penjual' => $user2->no_rek, diff --git a/public/assets/css/style.css b/public/assets/css/style.css index daad49a..37ab2c8 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -1271,9 +1271,9 @@ select.form-control:not([size]):not([multiple]) { margin-bottom: -15px; } -.card.card-statistic-2 .card-chart canvas { +/* .card.card-statistic-2 .card-chart canvas { height: 90px !important; -} +} */ .card .card-stats { width: 100%; diff --git a/public/assets/img/modal-end/approve.png b/public/assets/img/modal-end/approve.png new file mode 100644 index 0000000..6759a8c Binary files /dev/null and b/public/assets/img/modal-end/approve.png differ diff --git a/public/assets/img/modal-end/refund.png b/public/assets/img/modal-end/refund.png new file mode 100644 index 0000000..7afff2e Binary files /dev/null and b/public/assets/img/modal-end/refund.png differ diff --git a/resources/views/Admin/index.blade.php b/resources/views/Admin/index.blade.php index a33e1b2..4ae5cdd 100644 --- a/resources/views/Admin/index.blade.php +++ b/resources/views/Admin/index.blade.php @@ -4,109 +4,123 @@ <div class="main-content"> <section class="section"> <div class="row"> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> <div class="card-stats"> - <div class="card-stats-title">List Transaction - - <div class="dropdown d-inline"> - <a class="font-weight-600 dropdown-toggle" data-toggle="dropdown" href="#" - id="orders-month">August</a> - <ul class="dropdown-menu dropdown-menu-sm"> - <li class="dropdown-title">Select Month</li> - <li><a href="#" class="dropdown-item">January</a></li> - <li><a href="#" class="dropdown-item">February</a></li> - <li><a href="#" class="dropdown-item">March</a></li> - <li><a href="#" class="dropdown-item">April</a></li> - <li><a href="#" class="dropdown-item">May</a></li> - <li><a href="#" class="dropdown-item">June</a></li> - <li><a href="#" class="dropdown-item">July</a></li> - <li><a href="#" class="dropdown-item active">August</a></li> - <li><a href="#" class="dropdown-item">September</a></li> - <li><a href="#" class="dropdown-item">October</a></li> - <li><a href="#" class="dropdown-item">November</a></li> - <li><a href="#" class="dropdown-item">December</a></li> - </ul> + <div class="card-stats-title"> + <h4>Transaksi</h4> + </div> + <div class="card-stats-items mt-2"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSuccess">{{ $countSuccess }}</div> + <div class="card-stats-item-label">Selesai</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countCancelled">{{ $countCancelled }}</div> + <div class="card-stats-item-label">Gagal</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countProcessed">{{ $countProcessed }}</div> + <div class="card-stats-item-label">Diproses</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countIndicated">{{ $countIndicated }}</div> + <div class="card-stats-item-label">Diterindikasi</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countWaiting">{{ $countWaiting }}</div> + <div class="card-stats-item-label">Menunggu</div> </div> </div> - <div class="card-stats-items"> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countSuccess }}</div> - <div class="card-stats-item-label">Success</div> - </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countPending }}</div> - <div class="card-stats-item-label">Pending</div> - </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countCancelled }}</div> - <div class="card-stats-item-label">Canceled</div> - </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countRefund }}</div> - <div class="card-stats-item-label">Refund</div> - </div> - </div> - </div> - <div class="card-icon shadow-primary bg-primary"> - <i class="fas fa-exchange-alt"></i> </div> <div class="card-wrap"> <div class="card-header"> - <h4>Total Transaction</h4> + <h4>Total Transaksi</h4> </div> - <div class="card-body"> - {{ $totalTransaction }} + <div class="card-icon shadow-primary bg-primary"> + <i class="fas fa-exchange-alt"></i> + </div> + <div class="card-body" id="totalTransaction"> + {{ $totalTransaction }} Transaksi </div> </div> - <p class="mb-0 text-muted"> - <span class="text-success me-2"><span class="mdi mdi-arrow-up-bold"></span> - 1.08%</span> - <span class="text-nowrap">Since last week</span> + <p class="mb-0 text-muted" id="rateTransaction"> + <span + class="text-{{ $rateTransaction == 0 ? 'secondary text-black-50' : ($rateTransaction > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $rateTransaction == 0 ? 'mdi-equal' : ($rateTransaction > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($rateTransaction) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> </p> </div> </div> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> - <div class="card-chart"> - <canvas id="balance-chart" height="80"></canvas> - </div> - <div class="card-icon shadow-primary bg-primary"> - <i class="fas fa-money-check"></i> + <div class="card-stats"> + <div class="card-stats-title"> + <h4>Refund</h4> + </div> + <div class="card-stats-items mt-2"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countPending">{{ $countPending }}</div> + <div class="card-stats-item-label">Menunggu</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countApprove">{{ $countApprove }}</div> + <div class="card-stats-item-label">Disetujui</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countDeny">{{ $countDeny }}</div> + <div class="card-stats-item-label">Ditolak</div> + </div> + </div> </div> <div class="card-wrap"> <div class="card-header"> <h4>Total Refund</h4> </div> - <div class="card-body"> - {{ $totalRefund }} + <div class="card-icon shadow-primary bg-primary"> + <i class="fas fa-exchange-alt"></i> + </div> + <div class="card-body" id="totalRefund"> + {{ $totalRefund }} Pengajuan </div> </div> - <p class="mb-0 text-muted"> - <span class="text-success me-2"><span class="mdi mdi-arrow-up-bold"></span> - 5.27%</span> - <span class="text-nowrap">Since last month</span> + <p class="mb-0 text-muted" id="rateRefund"> + <span + class="text-{{ $rateRefund == 0 ? 'secondary text-black-50' : ($rateRefund > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $rateRefund == 0 ? 'mdi-equal' : ($rateRefund > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($rateRefund) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> </p> </div> </div> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> - <div class="card-chart"> - <canvas id="sales-chart" height="80"></canvas> + <div class="card-stats"> + <div class="card-stats-title"> + <h4>Pengguna</h4> + </div> </div> - <div class="card-icon shadow-primary bg-primary"> - <i class="fas fa-user"></i> + <div class="card-chart"> + <canvas id="users-chart" height="80"></canvas> </div> <div class="card-wrap"> <div class="card-header"> - <h4>Total user</h4> + <h4>Total Pengguna</h4> + </div> + <div class="card-icon shadow-primary bg-primary"> + <i class="fas fa-user"></i> + </div> + <div class="card-body" id="totalUser"> + {{ $totalUser }} Pengguna </div> - <div class="card-body"> - {{ $totalUser }}</div> </div> - <p class="mb-0 text-muted"> - <span class="text-danger me-2"><span class="mdi mdi-arrow-down-bold"></span> - 1.08%</span> - <span class="text-nowrap">Since previous week</span> + <p class="mb-0 text-muted" id="rateUser"> + <span + class="text-{{ $rateUser == 0 ? 'secondary text-black-50' : ($rateUser > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $rateUser == 0 ? 'mdi-equal' : ($rateUser > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($rateUser) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> </p> </div> </div> @@ -115,18 +129,17 @@ <div class="row"> <div class="col-lg-8"> <div class="card"> - <div class="alert alert-primary alert-dismissible fade show mb-3" role="alert"> - Pendapatan Hari Ini meningkat <span class="mdi mdi-arrow-up-bold"></span> - 5.27%</span> + <div id="rateProfit"> + <div class="alert alert-{{ $rateProfit == 0 ? 'secondary text-black-50' : ($rateProfit > 0 ? 'success' : 'error') }} alert-dismissible fade show mb-3" + role="alert"> + Pendapatan {{ $rateProfit == 0 ? 'sama' : ($rateProfit > 0 ? 'meningkat' : 'menurun') }} + <span + class="mdi {{ $rateProfit == 0 ? 'mdi-equal' : ($rateProfit > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ $rateProfit }}% + </div> </div> <div class="card-header"> - <h4>Statistics</h4> - <div class="card-header-action"> - <div class="btn-group"> - <a href="#" class="btn btn-primary">Week</a> - <a href="#" class="btn">Month</a> - </div> - </div> + <h4>Pendapatan</h4> </div> <div class="card-body"> <canvas id="myChart1"></canvas> @@ -136,137 +149,60 @@ <div class="col-lg-4"> <div class="input-group mt-4"> <input type="text" name="from-to" class="form-control" id="date-range"> - <label class="input-group-text bg-primary text-white align-items-center" for="date-range"> + <span class="input-group-text bg-primary text-white align-items-center"> <i class="mdi mdi-calendar-range font-13"></i> - </label> + </span> </div> <div class="card gradient-bottom"> <div class="card-header"> <h4>Top 5 Users</h4> - <div class="card-header-action dropdown"> - <a href="#" data-toggle="dropdown" - class="btn btn-primary dropdown-toggle">Month</a> - <ul class="dropdown-menu dropdown-menu-sm dropdown-menu-right"> - <li class="dropdown-title">Select Period</li> - <li><a href="#" class="dropdown-item">Today</a></li> - <li><a href="#" class="dropdown-item">Week</a></li> - <li><a href="#" class="dropdown-item active">Month</a></li> - <li><a href="#" class="dropdown-item">This Year</a></li> - </ul> - </div> </div> <div class="card-body" id="top-5-scroll"> - <ul class="list-unstyled list-unstyled-border"> - <li class="media"> - <img class="mr-3 rounded" width="55" - src="{{ asset('assets/img/avatar/avatar-6.png') }}" alt="product"> - <div class="media-body"> - <div class="float-right"> - <div class="font-weight-600 text-muted text-small">86 Sales</div> - </div> - <div class="media-title">Jilhan Haura</div> - <div class="mt-1"> - <div class="budget-price"> - <div class="budget-price-square bg-primary" data-width="64%"></div> - <div class="budget-price-label">$68,714</div> + <ul class="list-unstyled list-unstyled-border" id="listTopUser"> + @forelse ($dataTopUsers as $user) + <li class="media"> + <img class="mr-3 rounded" width="55" + src="{{ $user->foto_profile == null ? asset('storage/foto-profile/face1.jpg') : asset('storage/foto-profile/' . $user->foto_profile) }}" + alt="product"> + <div class="media-body"> + <div class="float-right"> + <div class="font-weight-600 text-muted text-small"> + {{ $user->jumlah_transaksi }} transaksi + </div> </div> - <div class="budget-price"> - <div class="budget-price-square bg-danger" data-width="43%"></div> - <div class="budget-price-label">$38,700</div> + <div class="media-title">{{ $user->nama_lengkap }}</div> + <div class="mt-1"> + <div class="budget-price"> + <div class="budget-price-square bg-primary" + data-width="{{ (floatval($user->total_transaksi_berhasil) * 100) / (floatval($user->total_transaksi_berhasil) + floatval($user->total_refund_berhasil)) / 1.5 }}%"> + </div> + <div class="budget-price-label">Rp + {{ number_format($user->total_transaksi_berhasil, 2, ',', '.') }} + </div> + </div> + <div class="budget-price"> + <div class="budget-price-square bg-danger" + data-width="{{ (floatval($user->total_refund_berhasil) * 100) / (floatval($user->total_transaksi_berhasil) + floatval($user->total_refund_berhasil)) / 1.5 }}%"> + </div> + <div class="budget-price-label">Rp + {{ number_format($user->total_refund_berhasil, 2, ',', '.') }} + </div> + </div> </div> </div> - </div> - </li> - <li class="media"> - <img class="mr-3 rounded" width="55" - src="{{ asset('assets/img/avatar/avatar-1.png') }}" alt="product"> - <div class="media-body"> - <div class="float-right"> - <div class="font-weight-600 text-muted text-small">67 Sales</div> - </div> - <div class="media-title">Nurul Prima</div> - <div class="mt-1"> - <div class="budget-price"> - <div class="budget-price-square bg-primary" data-width="84%"></div> - <div class="budget-price-label">$107,133</div> - </div> - <div class="budget-price"> - <div class="budget-price-square bg-danger" data-width="60%"></div> - <div class="budget-price-label">$91,455</div> - </div> - </div> - </div> - </li> - <li class="media"> - <img class="mr-3 rounded" width="55" - src="{{ asset('assets/img/avatar/avatar-2.png') }}" alt="product"> - <div class="media-body"> - <div class="float-right"> - <div class="font-weight-600 text-muted text-small">63 Sales</div> - </div> - <div class="media-title">Muhammad Raihan</div> - <div class="mt-1"> - <div class="budget-price"> - <div class="budget-price-square bg-primary" data-width="34%"></div> - <div class="budget-price-label">$3,717</div> - </div> - <div class="budget-price"> - <div class="budget-price-square bg-danger" data-width="28%"></div> - <div class="budget-price-label">$2,835</div> - </div> - </div> - </div> - </li> - <li class="media"> - <img class="mr-3 rounded" width="55" - src="{{ asset('assets/img/avatar/avatar-3.png') }}" alt="product"> - <div class="media-body"> - <div class="float-right"> - <div class="font-weight-600 text-muted text-small">28 Sales</div> - </div> - <div class="media-title">Hantu</div> - <div class="mt-1"> - <div class="budget-price"> - <div class="budget-price-square bg-primary" data-width="45%"></div> - <div class="budget-price-label">$13,972</div> - </div> - <div class="budget-price"> - <div class="budget-price-square bg-danger" data-width="30%"></div> - <div class="budget-price-label">$9,660</div> - </div> - </div> - </div> - </li> - <li class="media"> - <img class="mr-3 rounded" width="55" - src="{{ asset('assets/img/avatar/avatar-4.png') }}" alt="product"> - <div class="media-body"> - <div class="float-right"> - <div class="font-weight-600 text-muted text-small">19 Sales</div> - </div> - <div class="media-title">Testing</div> - <div class="mt-1"> - <div class="budget-price"> - <div class="budget-price-square bg-primary" data-width="35%"></div> - <div class="budget-price-label">$7,391</div> - </div> - <div class="budget-price"> - <div class="budget-price-square bg-danger" data-width="28%"></div> - <div class="budget-price-label">$5,472</div> - </div> - </div> - </div> - </li> + </li> + @empty + @endforelse </ul> </div> - <div class="card-footer pt-3 d-flex justify-content-center"> + <div class="pt-3 d-flex justify-content-center"> <div class="budget-price justify-content-center"> <div class="budget-price-square bg-primary" data-width="20"></div> - <div class="budget-price-label">Sukses</div> + <div class="budget-price-label">Transaksi Selesai</div> </div> <div class="budget-price justify-content-center"> <div class="budget-price-square bg-danger" data-width="20"></div> - <div class="budget-price-label">Refund</div> + <div class="budget-price-label">Refund Selesai</div> </div> </div> </div> @@ -275,61 +211,15 @@ </section> </div> @include('admin.transaction.modal-tracking') +@endsection +@section('tambahan-js') <script> let dataChartTransaction = {{ json_encode($dataChartTransaction) }}; let dataChartRefund = {{ json_encode($dataChartRefund) }}; - let labels = ''; - let dataChartTotalRefund = {{ json_encode($dataChartTotalRefund) }}; - let dataChartTotalUser = {{ json_encode($dataChartTotalUser) }}; + let dataChartUser = {{ json_encode($dataChartUser) }}; + let dataLabel = {!! json_encode($dataLabel) !!}; </script> <script> - // Date picker range - $(document).ready(function() { - let searchParams = new URLSearchParams(window.location.search); - let dateInterval = searchParams.get('from-to'); - let start = moment().subtract(29, 'days'); - let end = moment(); - - if (dateInterval) { - dateInterval = dateInterval.split(' - '); - start = moment(dateInterval[0]); - end = moment(dateInterval[1]); - } - - $('#date-range').daterangepicker({ - "showDropdowns": true, - "showWeekNumbers": true, - "alwaysShowCalendars": true, - startDate: start, - endDate: end, - locale: { - format: 'YYYY-MM-DD', - firstDay: 1, - }, - ranges: { - 'Today': [moment(), moment()], - 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], - 'Last 7 Days': [moment().subtract(6, 'days'), moment()], - 'Last 30 Days': [moment().subtract(29, 'days'), moment()], - 'This Month': [moment().startOf('month'), moment().endOf('month')], - 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, - 'month').endOf( - 'month')], - 'This Year': [moment().startOf('year'), moment().endOf('year')], - 'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year') - .endOf( - 'year') - ], - 'All time': [moment().subtract(30, 'year').startOf('month'), moment().endOf('month')], - } - }, function(start, end, label) { - // Menangkap rentang tanggal yang dipilih dan menampilkan di console - console.log('New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format( - 'YYYY-MM-DD')); - }); - }); - - // Set new default font family and font color to mimic Bootstrap's default styling Chart.defaults.global.defaultFontFamily = 'Nunito', '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; Chart.defaults.global.defaultFontColor = '#858796'; @@ -338,12 +228,10 @@ var myChart = new Chart(ctx, { type: 'line', data: { - labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Agu", "Sep", - "Okt", "Nov", "Des" - ], + labels: dataLabel, datasets: [{ label: 'Transaction', - data: {{ json_encode($dataChartTransaction) }}, + data: dataChartTransaction, borderWidth: 2, backgroundColor: 'rgba(63,82,227,.8)', borderWidth: 0, @@ -355,7 +243,7 @@ }, { label: 'Refund', - data: [2207, 3403, 220000, 5025, 2302, 4208, 3880, 4880, 5000], + data: dataChartRefund, borderWidth: 2, backgroundColor: 'rgba(254,86,83,.7)', borderWidth: 0, @@ -381,26 +269,22 @@ scales: { yAxes: [{ gridLines: { - // display: false, drawBorder: false, color: '#f2f2f2', }, ticks: { beginAtZero: true, - stepSize: 15000, - callback: function(value, index, values) { - // return 'Rp.' + value; - return new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - }).format(value); - }, + // stepSize: 1000, + // callback: function(value, index, values) { + // return value; + // }, fontSize: 14, + maxTicksLimit: 6, }, scaleLabel: { display: true, - labelString: 'Dalam Ratusan Juta', // Label khusus untuk sumbu Y - fontSize: 16 // Ukuran font untuk label sumbu Y + labelString: 'Dalam Rupiah (Rp)', + fontSize: 16, }, }], xAxes: [{ @@ -409,91 +293,28 @@ tickMarkLength: 15, }, ticks: { - fontSize: 16, - } + display: false, + maxTicksLimit: 8, + }, + offset: true, }] }, } }); - var balance_chart = document.getElementById("balance-chart").getContext('2d'); + var users_chart = document.getElementById("users-chart").getContext('2d'); - var balance_chart_bg_color = balance_chart.createLinearGradient(0, 0, 0, 70); - balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); - balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); + var users_chart_bg_color = users_chart.createLinearGradient(0, 0, 0, 80); - var myChart = new Chart(balance_chart, { + var myChartUser = new Chart(users_chart, { type: 'line', data: { - labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', - '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', - '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018' - ], - datasets: [{ - label: 'Balance', - data: [50, 61, 80, 50, 72, 52, 60, 41, 30, 45, 70, 40, 93, 63, 50, 62], - backgroundColor: balance_chart_bg_color, - borderWidth: 3, - borderColor: 'rgba(63,82,227,1)', - pointBorderWidth: 0, - pointBorderColor: 'transparent', - pointRadius: 3, - pointBackgroundColor: 'transparent', - pointHoverBackgroundColor: 'rgba(63,82,227,1)', - }] - }, - options: { - layout: { - padding: { - bottom: -1, - left: -1 - } - }, - legend: { - display: false - }, - scales: { - yAxes: [{ - gridLines: { - display: false, - drawBorder: false, - }, - ticks: { - beginAtZero: true, - display: false - } - }], - xAxes: [{ - gridLines: { - drawBorder: false, - display: false, - }, - ticks: { - display: false - } - }] - }, - } - }); - - var sales_chart = document.getElementById("sales-chart").getContext('2d'); - - var sales_chart_bg_color = sales_chart.createLinearGradient(0, 0, 0, 80); - balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); - balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); - - var myChart = new Chart(sales_chart, { - type: 'line', - data: { - labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', - '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', - '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018' - ], + labels: dataLabel, datasets: [{ label: 'Sales', - data: [70, 62, 44, 40, 21, 63, 82, 52, 50, 31, 70, 50, 91, 63, 51, 60], + data: dataChartUser, borderWidth: 2, - backgroundColor: balance_chart_bg_color, + backgroundColor: users_chart_bg_color, borderWidth: 3, borderColor: 'rgba(63,82,227,1)', pointBorderWidth: 0, @@ -506,8 +327,8 @@ options: { layout: { padding: { - bottom: -1, - left: -1 + bottom: 0, + left: 0 } }, legend: { @@ -518,23 +339,264 @@ gridLines: { display: false, drawBorder: false, + color: '#f2f2f2', }, ticks: { beginAtZero: true, - display: false + display: false, + maxTicksLimit: 6, } }], xAxes: [{ gridLines: { drawBorder: false, - display: false, + display: true, }, ticks: { - display: false - } + display: false, + maxTicksLimit: 8, + }, + offset: true, }] }, } }); </script> + <script> + $(document).ready(function() { + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + let searchParams = new URLSearchParams(window.location.search); + let dateInterval = searchParams.get('from-to'); + let start = moment().subtract(29, 'days'); + let end = moment(); + + if (dateInterval) { + dateInterval = dateInterval.split(' - '); + start = moment(dateInterval[0]); + end = moment(dateInterval[1]); + } + + $('#date-range').daterangepicker({ + "showDropdowns": true, + "showWeekNumbers": true, + "alwaysShowCalendars": true, + startDate: start, + endDate: end, + locale: { + format: 'YYYY-MM-DD', + firstDay: 1, + }, + minDate: "2023-01-01", + maxDate: "2025-12-31", + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, + 'month').endOf( + 'month')], + 'This Year': [moment().startOf('year'), moment().endOf('year')], + 'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year') + .endOf( + 'year') + ] + } + }).on('apply.daterangepicker', function(ev, picker) { + var startDate = picker.startDate.format('YYYY-MM-DD'); + var endDate = picker.endDate.format('YYYY-MM-DD'); + console.log('Rentang tanggal dipilih:', startDate, 'sampai', + endDate); + + Swal.fire({ + html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>', + allowEscapeKey: false, + allowOutsideClick: false, + didOpen: () => { + Swal.showLoading(); + } + }); + + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': csrfToken + } + }); + + $.ajax({ + url: "{{ route('admin.get-data-dashboard') }}", + type: 'GET', + data: { + startDate: startDate, + endDate: endDate + }, + success: function(response) { + Swal.close(); + myChart.data.datasets[0].data = response.dataChartTransaction; + myChart.data.datasets[1].data = response.dataChartRefund; + myChart.data.labels = response.dataLabel; + myChart.update(); + + myChartUser.data.datasets[0].data = response.dataChartUser; + myChartUser.data.labels = response.dataLabel; + myChartUser.update(); + + $('#countSuccess').html(response.countSuccess); + $('#countCancelled').html(response.countCancelled); + $('#countProcessed').html(response.countProcessed); + $('#countIndicated').html(response.countIndicated); + $('#countWaiting').html(response.countWaiting); + $('#totalTransaction').html(response.totalTransaction); + + var activitiesRateTransaction = ''; + var rateTransactionClass = response.rateTransaction == 0 ? + "secondary text-black-50" : (response.rateTransaction > 0 ? + "success" : "danger"); + var rateTransactionClassIcon = response.rateTransaction == 0 ? + "mdi-equal" : (response.rateTransaction > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesRateTransaction = ` + <span class="text-${rateTransactionClass} me-2"><span + class="mdi ${rateTransactionClassIcon}"></span> + ${Math.abs(response.rateTransaction)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#rateTransaction').html(activitiesRateTransaction); + + $('#countPending').html(response.countPending); + $('#countApprove').html(response.countApprove); + $('#countDeny').html(response.countDeny); + $('#totalRefund').html(response.totalRefund); + + var activitiesRateRefund = ''; + var rateRefundClass = response.rateRefund == 0 ? + "secondary text-black-50" : (response.rateRefund > 0 ? + "success" : "danger"); + var rateRefundClassIcon = response.rateRefund == 0 ? + "mdi-equal" : (response.rateRefund > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesRateRefund = ` + <span class="text-${rateRefundClass} me-2"><span + class="mdi ${rateRefundClassIcon}"></span> + ${Math.abs(response.rateRefund)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#rateRefund').html(activitiesRateRefund); + + $('#totalUser').html(response.totalUser); + + var activitiesRateUser = ''; + var rateUserClass = response.rateUser == 0 ? + "secondary text-black-50" : (response.rateUser > 0 ? + "success" : "danger"); + var rateUserClassIcon = response.rateUser == 0 ? + "mdi-equal" : (response.rateUser > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesRateUser = ` + <span class="text-${rateUserClass} me-2"><span + class="mdi ${rateUserClassIcon}"></span> + ${Math.abs(response.rateUser)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#rateUser').html(activitiesRateUser); + + var activitiesRateProfit = ''; + var rateProfitClass = response.rateProfit == 0 ? + "secondary text-black-50" : (response.rateProfit > 0 ? + "success" : "danger"); + var rateProfitMention = response.rateProfit == 0 ? "sama" : (response + .rateProfit > 0 ? "meningkat" : "menurun"); + var rateProfitClassIcon = response.rateProfit == 0 ? + "sama" : (response.rateProfit > 0 ? + "meningkat" : "menurun"); + + activitiesRateProfit = ` + <div class="alert alert-${rateProfitClass} alert-dismissible fade show mb-3" + role="alert"> + Pendapatan ${rateProfitMention} + <span + class="mdi ${rateProfitClassIcon}"></span> + ${Math.abs(response.rateProfit)}% + </div> + `; + + $('#rateProfit').html(activitiesRateProfit); + + // ListTopUser + var activitiesHtml = ''; + + response.dataTopUser.forEach(user => { + let fotoProfile = user.foto_profile == null ? + "{{ asset('storage/foto-profile/face1.jpg') }}" : + "{{ asset('storage/foto-profile') }}/" + user + .foto_profile; + let totalTransaction = new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR' + }).format(user.total_transaksi_berhasil); + let totalRefund = new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR' + }).format(user.total_refund_berhasil); + let transactionWidth = ((parseFloat(user + .total_transaksi_berhasil) * + 100) / (parseFloat(user + .total_transaksi_berhasil) + + parseFloat(user.total_refund_berhasil))) / 1.5; + let refundWidth = ((parseFloat(user.total_refund_berhasil) * + 100) / ( + parseFloat(user.total_transaksi_berhasil) + + parseFloat(user.total_refund_berhasil))) / 1.5; + activitiesHtml += ` + <li class="media"> + <img class="mr-3 rounded" width="55" + src="${fotoProfile}" + alt="product"> + <div class="media-body"> + <div class="float-right"> + <div class="font-weight-600 text-muted text-small"> + ${user.jumlah_transaksi} transaksi + </div> + </div> + <div class="media-title">${user.nama_lengkap}</div> + <div class="mt-1"> + <div class="budget-price"> + <div class="budget-price-square bg-primary" + data-width="${transactionWidth}%" style="width:${transactionWidth}%"> + </div> + <div class="budget-price-label"> + ${totalTransaction} + </div> + </div> + <div class="budget-price"> + <div class="budget-price-square bg-danger" + data-width="${refundWidth}%" style="width:${refundWidth}%"> + </div> + <div class="budget-price-label"> + ${totalRefund} + </div> + </div> + </div> + </div> + </li> + `; + }); + + $('#listTopUser').html(activitiesHtml); + }, + error: function(error) { + Swal.close(); + console.log(error); + } + }); + }); + }); + </script> @endsection diff --git a/resources/views/Admin/notification/create.blade.php b/resources/views/Admin/notification/create.blade.php index aae1c32..7286fb8 100644 --- a/resources/views/Admin/notification/create.blade.php +++ b/resources/views/Admin/notification/create.blade.php @@ -1,5 +1,5 @@ @extends('layouts.main') -@section('content') +@section('tambahan-js') <script> $(document).ready(function() { let selected = []; @@ -126,6 +126,13 @@ icon: result.status ? 'success' : 'error' }).then(function() { if (result.status) { + $.ajax({ + url: "{{ route('admin-notification.update-new-notification') }}", + data: formData, + type: 'POST', + processData: false, + contentType: false, + }); location.href = "{{ route('admin-notification.index') }}"; } @@ -150,6 +157,8 @@ }); }); </script> +@endsection +@section('content') <div class="main-content"> <section class="section"> <div class="section-header"> diff --git a/resources/views/Admin/notification/edit.blade.php b/resources/views/Admin/notification/edit.blade.php index 4332cc5..1999faa 100644 --- a/resources/views/Admin/notification/edit.blade.php +++ b/resources/views/Admin/notification/edit.blade.php @@ -1,5 +1,5 @@ @extends('layouts.main') -@section('content') +@section('tambahan-js') <script> $(document).ready(function() { let selected = {!! json_encode($email) !!}; @@ -145,8 +145,8 @@ processData: false, contentType: false, }); - // location.href = - // "{{ route('admin-notification.index') }}"; + location.href = + "{{ route('admin-notification.index') }}"; } }); }, @@ -170,6 +170,8 @@ }); </script> +@endsection +@section('content') <div class="main-content"> <section class="section"> <div class="section-header"> diff --git a/resources/views/Admin/notification/index.blade.php b/resources/views/Admin/notification/index.blade.php index bc6d090..f9e114c 100644 --- a/resources/views/Admin/notification/index.blade.php +++ b/resources/views/Admin/notification/index.blade.php @@ -1,5 +1,5 @@ @extends('layouts.main') -@section('content') +@section('tambahan-js') <script> $(document).ready(function() { let listNotifikasi = $('#table-notifikasi').DataTable({ @@ -67,6 +67,8 @@ }); }); </script> +@endsection +@section('content') <div class="main-content"> <section class="section"> <div class="section-header"> diff --git a/resources/views/Admin/notification/show.blade.php b/resources/views/Admin/notification/show.blade.php index 49b264e..4137738 100644 --- a/resources/views/Admin/notification/show.blade.php +++ b/resources/views/Admin/notification/show.blade.php @@ -1,5 +1,5 @@ @extends('layouts.main') -@section('content') +@section('tambahan-js') <script> $(document).ready(function() { let listUser = $('#table-user').DataTable({ @@ -65,6 +65,8 @@ }); }); </script> +@endsection +@section('content') <div class="main-content"> <section class="section"> <div class="section-header"> @@ -83,7 +85,7 @@ </div> <div class="d-flex justify-content-start mb-3"> - {{ $notification->content }} + {!! $notification->content !!} </div> <div class="d-flex justify-content-center mt-5 mb-3"> diff --git a/resources/views/Admin/refund/detail-refund.blade.php b/resources/views/Admin/refund/detail-refund.blade.php index 2cc5813..39aa432 100644 --- a/resources/views/Admin/refund/detail-refund.blade.php +++ b/resources/views/Admin/refund/detail-refund.blade.php @@ -99,6 +99,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script> $(document).ready(function() { $('#accept').on('click', function() { @@ -143,6 +145,14 @@ icon: response.status ? 'success' : 'error' }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('admin-notification.update-new-notification') }}", + data: { + receivers: response + .receivers, + }, + type: 'GET', + }); location.reload(); } }); @@ -181,11 +191,11 @@ if (result.isConfirmed) { Swal.fire({ title: 'Tolak Refund?', - text: 'Berikan alasan menolak refund ini' + text: 'Berikan alasan menolak refund ini', input: 'text', inputPlaceholder: 'Cth. Bukti foto tidak sesuai', confirmButtonText: 'Kirim', - showCancelButton: true + showCancelButton: true, cancelButtonText: 'Batal' }).then((a) => { if (a.isConfirmed) { @@ -213,6 +223,14 @@ 'success' : 'error' }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('admin-notification.update-new-notification') }}", + data: { + receivers: response + .receivers, + }, + type: 'GET', + }); location.reload(); } }); diff --git a/resources/views/Admin/refund/index.blade.php b/resources/views/Admin/refund/index.blade.php index 3ee294d..cccd8a5 100644 --- a/resources/views/Admin/refund/index.blade.php +++ b/resources/views/Admin/refund/index.blade.php @@ -40,6 +40,9 @@ </section> </div> @include('admin.refund.modal-keterangan-status') + @include('admin.transaction.modal-keterangan-status') +@endsection +@section('tambahan-js') <script> $(function() { let listRefund = $('#table-refund').DataTable({ @@ -147,5 +150,4 @@ }); }); </script> - @extends('admin.transaction.modal-keterangan-status') @endsection diff --git a/resources/views/Admin/transaction/detail-transaction.blade.php b/resources/views/Admin/transaction/detail-transaction.blade.php index 3341e79..0848923 100644 --- a/resources/views/Admin/transaction/detail-transaction.blade.php +++ b/resources/views/Admin/transaction/detail-transaction.blade.php @@ -97,6 +97,14 @@ </address> </div> </div> + <div class="row"> + <div class="col-md-12"> + <address> + <strong>Deskripsi:</strong><br> + {!! $transaction->deskripsi_transaksi !!}<br> + </address> + </div> + </div> {{-- batas pembayaran dan pengiriman --}} <div class="row"> <div class="col-md-6"> @@ -107,20 +115,8 @@ </div> <div class="col-md-6 text-md-right"> <address> - <strong>Estimasi Pengiriman:</strong><br> - {{ date('Y', strtotime($transaction->batas_pengiriman_barang_awal)) == - date('Y', strtotime($transaction->batas_pengiriman_barang_akhir)) - ? (date('F', strtotime($transaction->batas_pengiriman_barang_awal)) == - date('F', strtotime($transaction->batas_pengiriman_barang_akhir)) - ? date('d', strtotime($transaction->batas_pengiriman_barang_awal)) . - '-' . - date('d F Y', strtotime($transaction->batas_pengiriman_barang_akhir)) - : date('F', strtotime($transaction->batas_pengiriman_barang_awal)) . - '-' . - date('d F Y', strtotime($transaction->batas_pengiriman_barang_akhir))) - : date('d F', strtotime($transaction->batas_pengiriman_barang_awal)) . - '-' . - date('d F Y', strtotime($transaction->batas_pengiriman_barang_akhir)) }}<br> + <strong>Batas Pengiriman:</strong><br> + {{ date('d F Y', strtotime($transaction->batas_pengiriman_barang_akhir)) }}<br> </address> </div> </div> @@ -139,13 +135,12 @@ </address> </div> </div> - {{-- Keterangan --}} <div class="row"> <div class="col-md-6"> <address> <strong>Status Indikasi Penipuan:</strong><br> - {{ $transaction->fraud_status == null ? 'Tidak ada' : 'Ada' }} + {{ $transaction->fraud_status == null ? 'Tidak ada' : ucwords($transaction->fraud_status) }} </address> </div> <div class="col-md-6 text-md-right"> @@ -245,6 +240,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script> $(document).ready(function() { $('#acceptTransaction').on('click', function() { @@ -289,6 +286,14 @@ icon: response.status ? 'success' : 'error' }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('admin-notification.update-new-notification') }}", + data: { + receivers: response + .receivers + }, + type: 'GET', + }); location.reload(); } }); @@ -368,6 +373,14 @@ 'success' : 'error' }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('admin-notification.update-new-notification') }}", + data: { + receivers: response + .receivers + }, + type: 'GET', + }); location.reload(); } }); diff --git a/resources/views/Admin/transaction/index.blade.php b/resources/views/Admin/transaction/index.blade.php index 6c58364..d4bf61b 100644 --- a/resources/views/Admin/transaction/index.blade.php +++ b/resources/views/Admin/transaction/index.blade.php @@ -40,6 +40,8 @@ </div> @include('admin.transaction.modal-tracking') @include('admin.transaction.modal-keterangan-status') +@endsection +@section('tambahan-js') <script> $(document).ready(function() { let listTransaction = $('#table-transaction').DataTable({ @@ -104,30 +106,30 @@ render: function(data, type, row) { if (row.status_transaksi == 'created') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (row.status_transaksi == 'success') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['process', 'sending', 'sent'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['cancel', 'failure', 'refund'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['finished', 'done'].includes(row.status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } }, className: 'text-center' @@ -169,34 +171,34 @@ // Iterasi melalui data transaksi dan tambahkan ke activitiesHtml $.each(transactionDatas, function(index, transactionDescription) { activitiesHtml += ` - <div class="activity"> - <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> - <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> - </div> - <p>${transactionDescription.deskripsi}</p> - </div> + <div class="activity"> + <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> + <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> </div> - `; + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> + </div> + <p>${transactionDescription.deskripsi}</p> + </div> + </div> + `; }); } else { // Tidak ada data transaksi, tambahkan pesan kosong activitiesHtml += ` - <div class="activity"> - <div class="activity-icon bg-primary text-white shadow-primary"> - <i class="fas fa-ban" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">--, --:--:-- --</span> - </div> - <p>Kosong</p> - </div> + <div class="activity"> + <div class="activity-icon bg-primary text-white shadow-primary"> + <i class="fas fa-ban" style="font-size: 36px;"></i> </div> - `; + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">--, --:--:-- --</span> + </div> + <p>Kosong</p> + </div> + </div> + `; } // Menampilkan data dalam modal diff --git a/resources/views/Admin/users/detail-user.blade.php b/resources/views/Admin/users/detail-user.blade.php index 26cbdfc..4f3505d 100644 --- a/resources/views/Admin/users/detail-user.blade.php +++ b/resources/views/Admin/users/detail-user.blade.php @@ -153,6 +153,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script> $(document).ready(function() { $('#tampilKTP').on('click', function() { @@ -218,18 +220,18 @@ icon: response.status ? 'success' : 'error', confirmButtonText: 'OK' }).then(function() { - location.reload(); + if (response.status) { + location.reload(); + } }); }, error: function(error) { Swal.fire({ title: 'Gagal!', - text: 'Tidak ada data yang dihapus, karena ' + - error, + text: 'Terjadi Kesalahan di server', icon: 'error' - }).then(function() { - location.reload(); }); + console.log(error); } }); } else { @@ -298,16 +300,18 @@ 'success' : 'error', confirmButtonText: 'OK' }).then(function() { - location.reload(); + if (response.status) { + location.reload(); + } }); }, error: function(error) { Swal.fire({ title: 'Gagal!', - text: 'Gagal mengubah status akun, karena ' + - error, + text: 'Terjadi Kesalahan di server', icon: 'info' }); + console.log(error); } }); } else { diff --git a/resources/views/Admin/users/index.blade.php b/resources/views/Admin/users/index.blade.php index df10532..47ac038 100644 --- a/resources/views/Admin/users/index.blade.php +++ b/resources/views/Admin/users/index.blade.php @@ -35,6 +35,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script> $(function() { let listUser = $('#table-user').DataTable({ @@ -53,9 +55,9 @@ render: function(data, type, row) { var foto = data; return `<figure class="avatar mr-2 avatar-xl"> - <img src="${foto !== null ? "{{ asset('storage/foto-profile/') }}/" + foto : '{{ asset('assets/img/avatar/avatar-6.png') }}'}" - alt="..."> - </figure>`; + <img src="${foto !== null ? "{{ asset('storage/foto-profile/') }}/" + foto : '{{ asset('assets/img/avatar/avatar-6.png') }}'}" + alt="..."> + </figure>`; }, orderable: false, searchable: false, @@ -108,6 +110,54 @@ className: 'text-center' }], }); + + $('#table-user').on('click', '#deleteUser', function() { + const id = $(this).data('id'); + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + + Swal.fire({ + html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>', + allowEscapeKey: false, + allowOutsideClick: false, + didOpen: () => { + Swal.showLoading(); + } + }); + + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': csrfToken + } + }); + + $.ajax({ + url: "{{ route('admin-user.destroy') }}", + type: "DELETE", + data: { + id: id, + }, + success: function(response) { + Swal.fire({ + title: response.status ? 'Berhasil hapus akun' : + 'Gagal hapus akun', + text: response.message, + icon: response.status ? 'success' : 'error' + }).then(function() { + if (response.status) { + listUser.ajax.reload(); + } + }); + }, + error: function(error) { + Swal.fire({ + title: 'Error', + text: 'Terjadi kesalahan di server', + icon: 'error' + }); + console.log(error); + } + }); + }) }); </script> @endsection diff --git a/resources/views/User/contact/index.blade.php b/resources/views/User/contact/index.blade.php index 7f930de..8232a39 100644 --- a/resources/views/User/contact/index.blade.php +++ b/resources/views/User/contact/index.blade.php @@ -44,6 +44,8 @@ </div> @include('user.contact.modal-detail-contact') @include('user.contact.modal-add-contact') +@endsection +@section('tambahan-js') <script> $(document).ready(function() { let check = false; diff --git a/resources/views/User/index.blade.php b/resources/views/User/index.blade.php index 36b335c..b92e4bd 100644 --- a/resources/views/User/index.blade.php +++ b/resources/views/User/index.blade.php @@ -1,79 +1,196 @@ @extends('layouts.main') +@section('css-tambahan') + <style> + .select2-container .select2-selection--single { + border: none; + background: none; + outline: none; + box-shadow: none; + padding: 0; + } + + .select2-container .select2-selection--single:focus { + border: none; + } + + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #900c3e; + line-height: 28px; + } + + .select2-container .select2-selection--single .select2-selection__arrow { + border: none; + background: none; + } + + .select2-container--default.select2-container--open .select2-selection--single { + border: none; + } + + .select2-results { + border-bottom: 1px solid #aaa; + } + + .select2-results__option { + padding: 10px; + color: #333; + background-color: white; + } + + .select2-container--default .select2-results>.select2-results__options .select2-results__option--highlighted { + background-color: #900c3e !important; + color: #fff !important; + } + </style> +@endsection @section('content') <!-- Main Content --> <div class="main-content"> <section class="section"> <div class="row"> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> <div class="card-stats"> - <div class="card-stats-title">List Transaction - - <div class="dropdown d-inline"> - <a class="font-weight-600 dropdown-toggle" data-toggle="dropdown" href="#" - id="orders-month">August</a> - <ul class="dropdown-menu dropdown-menu-sm" aria-labelledby="orders-month" - id="dropdownMenu1"> - <li class="dropdown-title">Pilih Bulan</li> - <li><a href="#" class="dropdown-item">Januari</a></li> - <li><a href="#" class="dropdown-item">Februari</a></li> - <li><a href="#" class="dropdown-item">Maret</a></li> - <li><a href="#" class="dropdown-item">April</a></li> - <li><a href="#" class="dropdown-item">May</a></li> - <li><a href="#" class="dropdown-item">Juni</a></li> - <li><a href="#" class="dropdown-item">Juli</a></li> - <li><a href="#" class="dropdown-item">Agustus</a></li> - <li><a href="#" class="dropdown-item">September</a></li> - <li><a href="#" class="dropdown-item">Oktober</a></li> - <li><a href="#" class="dropdown-item">November</a></li> - <li><a href="#" class="dropdown-item">Desember</a></li> - </ul> + <div class="card-stats-title"> + <h4> + Transaksi - <select class="input" style="width: 40%;" name="filterRole" id="filterRole"> + <option value="1" selected>Semua</option> + <option value="2">Pembeli</option> + <option value="3">Penjual</option> + </select> + </h4> + </div> + <div id="semua"> + <div class="card-stats-items"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllFinished">{{ $countAllFinished }} + </div> + <div class="card-stats-item-label">Selesai</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllPending">{{ $countAllPending }}</div> + <div class="card-stats-item-label">Menunggu</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllProcessed">{{ $countAllProcessed }} + </div> + <div class="card-stats-item-label">Diproses</div> + </div> </div> - <div class="dropdown d-inline"> - <a class="font-weight-600 dropdown-toggle" data-toggle="dropdown" href="#" - id="orders-year">2023</a> - <ul class="dropdown-menu dropdown-menu-sm" aria-labelledby="orders-year" - id="dropdownMenu2"> - <li class="dropdown-title">Pilih Tahun</li> - <li><a href="#" class="dropdown-item">2019</a></li> - <li><a href="#" class="dropdown-item">2020</a></li> - <li><a href="#" class="dropdown-item">2021</a></li> - <li><a href="#" class="dropdown-item">2022</a></li> - <li><a href="#" class="dropdown-item">2023</a></li> - </ul> - </div> - Sebagai - - <div class="dropdown d-inline"> - <a class="font-weight-600 dropdown-toggle" data-toggle="dropdown" href="#" - id="orders-role">Semua</a> - <ul class="dropdown-menu dropdown-menu-sm" aria-labelledby="orders-role" - id="dropdownMenu3"> - <li class="dropdown-title">Pilih Peran</li> - <li><a href="#" class="dropdown-item">Semua</a></li> - <li><a href="#" class="dropdown-item">Pembeli</a></li> - <li><a href="#" class="dropdown-item">Penjual</a></li> - </ul> + <div class="card-stats-items"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllCanceled">{{ $countAllCanceled }} + </div> + <div class="card-stats-item-label">Gagal</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllRefund">{{ $countAllRefund }}</div> + <div class="card-stats-item-label">Refund</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countAllIndicated">{{ $countAllIndicated }} + </div> + <div class="card-stats-item-label">Tertunda</div> + </div> </div> </div> - <div class="card-stats-items"> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countCreated }}</div> - <div class="card-stats-item-label">Dibuat</div> + <div id="pembeli" hidden> + <div class="card-stats-items mt-3"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerFinished">{{ $countBuyerFinished }} + </div> + <div class="card-stats-item-label">Selesai</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerPaid">{{ $countBuyerPaid }} + </div> + <div class="card-stats-item-label">Dibayar</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerProcessed"> + {{ $countBuyerProcessed }} + </div> + <div class="card-stats-item-label">Diproses</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerPending">{{ $countBuyerPending }} + </div> + <div class="card-stats-item-label">Menunggu</div> + </div> </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countPending }}</div> - <div class="card-stats-item-label">Pending</div> + <div class="card-stats-items"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerCancelled"> + {{ $countBuyerCancelled }}</div> + <div class="card-stats-item-label">Gagal</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerIndicated"> + {{ $countBuyerIndicated }} + </div> + <div class="card-stats-item-label">Tertunda</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerRefundPending"> + {{ $countBuyerRefundPending }}</div> + <div class="card-stats-item-label">Pengajuan Refund</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerRefundApproved"> + {{ $countBuyerRefundApproved }}</div> + <div class="card-stats-item-label">Disetujui</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countBuyerRefundDenied"> + {{ $countBuyerRefundDenied }}</div> + <div class="card-stats-item-label">Ditolak</div> + </div> </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $countFailure }}</div> - <div class="card-stats-item-label">Gagal</div> + </div> + <div id="penjual" hidden> + <div class="card-stats-items mt-3"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerFinished"> + {{ $countSellerFinished }}</div> + <div class="card-stats-item-label">selesai</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerProcessed"> + {{ $countSellerProcessed }}</div> + <div class="card-stats-item-label">Diproses</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerSending"> + {{ $countSellerSending }}</div> + <div class="card-stats-item-label">Dikirim</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerSent">{{ $countSellerSent }} + </div> + <div class="card-stats-item-label">Sampai</div> + </div> </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $sumRefund }}</div> - <div class="card-stats-item-label">Refund</div> - </div> - <div class="card-stats-item"> - <div class="card-stats-item-count">{{ $sumTransaksi }}</div> - <div class="card-stats-item-label">Transaksi</div> + <div class="card-stats-items"> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerPending"> + {{ $countSellerPending }}</div> + <div class="card-stats-item-label">Menunggu</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerCancelled"> + {{ $countSellerCancelled }}</div> + <div class="card-stats-item-label">Gagal</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerRefund"> + {{ $countSellerRefund }}</div> + <div class="card-stats-item-label">Refund</div> + </div> + <div class="card-stats-item"> + <div class="card-stats-item-count" id="countSellerIndicated"> + {{ $countSellerIndicated }}</div> + <div class="card-stats-item-label">Tertunda</div> + </div> </div> </div> @@ -85,16 +202,23 @@ <div class="card-header"> <h4>Jumlah Transaction</h4> </div> - <div class="card-body"> - {{ $totalTransaction }} + <div class="card-body" id="totalTransaction"> + {{ $totalTransaction }} Transaksi </div> </div> + <p class="mb-0 text-muted" id="rateTransaction"> + <span + class="text-{{ $rateTransaction == 0 ? 'secondary text-black-50' : ($rateTransaction > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $rateTransaction == 0 ? 'mdi-equal' : ($rateTransaction > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($rateTransaction) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + </p> </div> </div> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> <div class="card-chart"> - <canvas id="balance-chart" height="80"></canvas> + <canvas id="pemasukan-chart" height="100"></canvas> </div> <div class="card-icon shadow-primary bg-primary"> <i class="fas fa-dollar-sign"></i> @@ -103,16 +227,23 @@ <div class="card-header"> <h4>Pemasukan</h4> </div> - <div class="card-body"> - Rp. {{ number_format($totalIncome, 2) }} + <div class="card-body" id="totalPemasukan"> + Rp {{ number_format($totalPemasukan, 2, ',', '.') }} </div> </div> + <p class="mb-0 text-muted" id="ratePemasukan"> + <span + class="text-{{ $ratePemasukan == 0 ? 'secondary text-black-50' : ($ratePemasukan > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $ratePemasukan == 0 ? 'mdi-equal' : ($ratePemasukan > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($ratePemasukan) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + </p> </div> </div> - <div class="col-lg-4 col-md-4 col-sm-12"> + <div class="col-lg-4 col-md-12 col-sm-12"> <div class="card card-statistic-2"> <div class="card-chart"> - <canvas id="sales-chart" height="80"></canvas> + <canvas id="pengeluaran-chart" height="100"></canvas> </div> <div class="card-icon shadow-primary bg-primary"> <i class="fas fa-shopping-bag"></i> @@ -121,35 +252,62 @@ <div class="card-header"> <h4>Pengeluaran</h4> </div> - <div class="card-body">Rp. {{ number_format($totalExpense, 2) }}</div> + <div class="card-body" id="totalPengeluaran">Rp + {{ number_format($totalPengeluaran, 2, ',', '.') }} + </div> </div> + <p class="mb-0 text-muted" id="ratePengeluaran"> + <span + class="text-{{ $ratePengeluaran == 0 ? 'secondary text-black-50' : ($ratePengeluaran > 0 ? 'success' : 'danger') }} me-2"><span + class="mdi {{ $ratePengeluaran == 0 ? 'mdi-equal' : ($ratePengeluaran > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ abs($ratePengeluaran) }}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + </p> + </div> + </div> + </div> + <div class="row"> + <div class="col-12"> + <div class="input-group"> + <input type="text" name="from-to" class="form-control" id="date-range"> + <span class="input-group-text bg-primary text-white align-items-center"> + <i class="mdi mdi-calendar-range font-13"></i> + </span> </div> </div> </div> <div class="row"> <div class="col-md-12"> <div class="card"> - <div class="alert alert-primary alert-dismissible fade show mb-3" role="alert"> - Pendapatan Hari Ini meningkat <span class="mdi mdi-arrow-up-bold"></span> - 5.27%</span> - </div> - <div class="card-header"> - <h4 style="font-size: 36px;">Transaksi</h4> - <div class="card-header-action"> - <div class="btn-group"> - <a href="#" class="btn btn-primary">Week</a> - <a href="#" class="btn">Month</a> - </div> + <div id="rateProfit"> + <div class="alert alert-{{ $rateProfit == 0 ? 'secondary text-black-50' : ($rateProfit > 0 ? 'success' : 'error') }} alert-dismissible fade show mb-3" + role="alert"> + Transaksi {{ $rateProfit == 0 ? 'sama' : ($rateProfit > 0 ? 'meningkat' : 'menurun') }} + <span + class="mdi {{ $rateProfit == 0 ? 'mdi-equal' : ($rateProfit > 0 ? 'mdi-arrow-up-bold' : 'mdi-arrow-down-bold') }}"></span> + {{ $rateProfit }}% </div> </div> + <div class="card-header"> + <h4>Transaksi</h4> + </div> <div class="card-body"> - <canvas id="myChart" height="150"></canvas> + <canvas id="myChart" height="120"></canvas> </div> </div> </div> </div> </section> </div> +@endsection +@section('tambahan-js') + <script> + let dataLabel = {!! json_encode($dataLabel) !!} + let dataChartTransaction = {{ json_encode($dataChartTransaction) }} + let dataChartRefund = {{ json_encode($dataChartRefund) }} + let dataChartPemasukan = {{ json_encode($dataChartPemasukan) }} + let dataChartPengeluaran = {{ json_encode($dataChartPengeluaran) }} + </script> <script> // Set new default font family and font color to mimic Bootstrap's default styling Chart.defaults.global.defaultFontFamily = 'Nunito', @@ -157,15 +315,13 @@ Chart.defaults.global.defaultFontColor = '#858796'; var ctx = document.getElementById("myChart").getContext('2d'); - var myChart = new Chart(ctx, { + var myChartTransaksi = new Chart(ctx, { type: 'line', data: { - labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Agu", "Sep", - "Okt", "Nov", "Des" - ], + labels: dataLabel, datasets: [{ label: 'Transaksi', - data: [3200, 18009, 4305, 3022, 6310, 5120, 5880, 6154, 0], + data: dataChartTransaction, borderWidth: 2, backgroundColor: 'rgba(63,82,227,.8)', borderWidth: 0, @@ -177,7 +333,7 @@ }, { label: 'Refund', - data: [2207, 3403, 2200, 5025, 2302, 4208, 3880, 4880, 5000], + data: dataChartRefund, borderWidth: 2, backgroundColor: 'rgba(254,86,83,.7)', borderWidth: 0, @@ -209,19 +365,12 @@ }, ticks: { beginAtZero: true, - stepSize: 15000, - callback: function(value, index, values) { - // return 'Rp.' + value; - return new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - }).format(value); - }, fontSize: 14, + maxTicksLimit: 6, }, scaleLabel: { display: true, - labelString: 'Dalam Ratusan Juta', // Label khusus untuk sumbu Y + labelString: 'Dalam Rupiah (Rp)', // Label khusus untuk sumbu Y fontSize: 16 // Ukuran font untuk label sumbu Y }, }], @@ -231,91 +380,91 @@ tickMarkLength: 15, }, ticks: { - fontSize: 16, - } + display: false, + maxTicksLimit: 8, + }, + offset: true, }] }, } }); - var balance_chart = document.getElementById("balance-chart").getContext('2d'); + var pemasukan_chart = document.getElementById("pemasukan-chart").getContext('2d'); - var balance_chart_bg_color = balance_chart.createLinearGradient(0, 0, 0, 70); - balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); - balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); + var pemasukan_chart_bg_color = pemasukan_chart.createLinearGradient(0, 0, 0, 70); - var myChart = new Chart(balance_chart, { - type: 'line', - data: { - labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', - '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', - '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018' - ], - datasets: [{ - label: 'Balance', - data: [50, 61, 80, 50, 72, 52, 60, 41, 30, 45, 70, 40, 93, 63, 50, 62], - backgroundColor: balance_chart_bg_color, - borderWidth: 3, - borderColor: 'rgba(63,82,227,1)', - pointBorderWidth: 0, - pointBorderColor: 'transparent', - pointRadius: 3, - pointBackgroundColor: 'transparent', - pointHoverBackgroundColor: 'rgba(63,82,227,1)', - }] - }, - options: { - layout: { - padding: { - bottom: -1, - left: -1 - } - }, - legend: { - display: false - }, - scales: { - yAxes: [{ - gridLines: { - display: false, - drawBorder: false, - }, - ticks: { - beginAtZero: true, - display: false - } - }], - xAxes: [{ - gridLines: { - drawBorder: false, - display: false, - }, - ticks: { - display: false - } + pemasukan_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); + + pemasukan_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); + + var myChartPemasukan = new Chart( + pemasukan_chart, { + type: 'line', + data: { + labels: dataLabel, + datasets: [{ + label: 'Pemasukan', + data: dataChartPemasukan, + backgroundColor: pemasukan_chart_bg_color, + borderWidth: 3, + borderColor: 'rgba(63,82,227,1)', + pointBorderWidth: 0, + pointBorderColor: 'transparent', + pointRadius: 3, + pointBackgroundColor: 'transparent', + pointHoverBackgroundColor: 'rgba(63,82,227,1)', }] }, - } - }); + options: { + layout: { + padding: 10 + }, + legend: { + display: false + }, + scales: { + yAxes: [{ + gridLines: { + display: false, + drawBorder: false, + }, + ticks: { + beginAtZero: true, + display: false, + maxTicksLimit: 4, + } + }], + xAxes: [{ + gridLines: { + drawBorder: false, + display: true, + }, + ticks: { + display: false, + maxTicksLimit: 8, + }, + offset: true, + }] + }, + } + }); - var sales_chart = document.getElementById("sales-chart").getContext('2d'); + var pengeluaran = document.getElementById("pengeluaran-chart"); + var pengeluaran_chart = pengeluaran.getContext('2d'); - var sales_chart_bg_color = sales_chart.createLinearGradient(0, 0, 0, 80); - balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); - balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); + var pengeluaran_chart_bg_color = pengeluaran_chart.createLinearGradient(0, 0, 0, 80); + pengeluaran_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)'); + pengeluaran_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)'); - var myChart = new Chart(sales_chart, { + var myChartPengeluaran = new Chart(pengeluaran_chart, { type: 'line', data: { - labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', - '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', - '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018' - ], + labels: dataLabel, datasets: [{ - label: 'Sales', - data: [70, 62, 44, 40, 21, 63, 82, 52, 50, 31, 70, 50, 91, 63, 51, 60], + label: 'Pengeluaran', + data: dataChartPengeluaran, borderWidth: 2, - backgroundColor: balance_chart_bg_color, + backgroundColor: pengeluaran_chart_bg_color, borderWidth: 3, borderColor: 'rgba(63,82,227,1)', pointBorderWidth: 0, @@ -327,10 +476,7 @@ }, options: { layout: { - padding: { - bottom: -1, - left: -1 - } + padding: 10 }, legend: { display: false @@ -343,20 +489,244 @@ }, ticks: { beginAtZero: true, - display: false + display: false, + maxTicksLimit: 4, } }], xAxes: [{ gridLines: { drawBorder: false, - display: false, + display: true, }, ticks: { - display: false - } + display: false, + maxTicksLimit: 8, + }, + offset: true, }] }, } }); </script> + <script> + $(document).ready(function() { + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + let searchParams = new URLSearchParams(window.location.search); + let dateInterval = searchParams.get('from-to'); + let start = moment().subtract(29, 'days'); + let end = moment(); + + $('#filterRole').select2(); + + $('#filterRole').change(function() { + let id = $(this).val(); + + if (id == "1") { + $('#semua').removeAttr('hidden'); + $('#pembeli').attr('hidden', true); + $('#penjual').attr('hidden', true); + } else if (id == "2") { + $('#semua').attr('hidden', true); + $('#pembeli').removeAttr('hidden'); + $('#penjual').attr('hidden', true); + } else { + $('#semua').attr('hidden', true); + $('#pembeli').attr('hidden', true); + $('#penjual').removeAttr('hidden'); + } + }); + + if (dateInterval) { + dateInterval = dateInterval.split(' - '); + start = moment(dateInterval[0]); + end = moment(dateInterval[1]); + } + + $('#date-range').daterangepicker({ + "showDropdowns": true, + "showWeekNumbers": true, + "alwaysShowCalendars": true, + startDate: start, + endDate: end, + locale: { + format: 'YYYY-MM-DD', + firstDay: 1, + }, + minDate: "2023-01-01", + maxDate: "2025-12-31", + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, + 'month').endOf( + 'month')], + 'This Year': [moment().startOf('year'), moment().endOf('year')], + 'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year') + .endOf( + 'year') + ] + } + }).on('apply.daterangepicker', function(ev, picker) { + var startDate = picker.startDate.format('YYYY-MM-DD'); + var endDate = picker.endDate.format('YYYY-MM-DD'); + + Swal.fire({ + html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>', + allowEscapeKey: false, + allowOutsideClick: false, + didOpen: () => { + Swal.showLoading(); + } + }); + + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': csrfToken + } + }); + + $.ajax({ + url: "{{ route('user.get-data-dashboard') }}", + type: 'GET', + data: { + startDate: startDate, + endDate: endDate + }, + success: function(response) { + Swal.close(); + myChartTransaksi.data.datasets[0].data = response.dataChartTransaction; + myChartTransaksi.data.datasets[1].data = response.dataChartRefund; + myChartTransaksi.data.labels = response.dataLabel; + myChartTransaksi.update(); + + myChartPemasukan.data.datasets[0].data = response.dataChartUser; + myChartPemasukan.data.labels = response.dataLabel; + myChartPemasukan.update(); + + myChartPengeluaran.data.datasets[0].data = response.dataChartUser; + myChartPengeluaran.data.labels = response.dataLabel; + myChartPengeluaran.update(); + + // Semua + $('#countAllFinished').html(response.countAllFinished); + $('#countAllPending').html(response.countAllPending); + $('#countAllProcessed').html(response.countAllProcessed); + $('#countAllCanceled').html(response.countAllCanceled); + $('#countAllRefund').html(response.countAllRefund); + $('#countAllIndicated').html(response.countAllIndicated); + + // Pembeli + $('#countBuyerFinished').html(response.countBuyerFinished); + $('#countBuyerPaid').html(response.countBuyerPaid); + $('#countBuyerPending').html(response.countBuyerPending); + $('#countBuyerProcessed').html(response.countBuyerProcessed); + $('#countBuyerCancelled').html(response.countBuyerCancelled); + $('#countBuyerRefundPending').html(response.countBuyerRefundPending); + $('#countBuyerRefundApproved').html(response.countBuyerRefundApproved); + $('#countBuyerRefundDenied').html(response.countBuyerRefundDenied); + $('#countBuyerIndicated').html(response.countBuyerIndicated); + + // Penjual + $('#countSellerPending').html(response.countSellerPending); + $('#countSellerFinished').html(response.countSellerFinished); + $('#countSellerProcessed').html(response.countSellerProcessed); + $('#countSellerSending').html(response.countSellerSending); + $('#countSellerSent').html(response.countSellerSent); + $('#countSellerCancelled').html(response.countSellerCancelled); + $('#countSellerRefund').html(response.countSellerRefund); + $('#countSellerIndicated').html(response.countSellerIndicated); + + $('#totalTransaction').html(response.totalTransaction); + + var activitiesRateTransaction = ''; + var rateTransactionClass = response.rateTransaction == 0 ? + "secondary text-black-50" : (response.rateTransaction > 0 ? + "success" : "danger"); + var rateTransactionClassIcon = response.rateTransaction == 0 ? + "mdi-equal" : (response.rateTransaction > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesRateTransaction = ` + <span class="text-${rateTransactionClass} me-2"><span + class="mdi ${rateTransactionClassIcon}"></span> + ${Math.abs(response.rateTransaction)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#rateTransaction').html(activitiesRateTransaction); + + // Pemasukan + $('#totalPemasukan').html(response.totalPemasukan); + + var activitiesratePemasukan = ''; + var ratePemasukanClass = response.ratePemasukan == 0 ? + "secondary text-black-50" : (response.ratePemasukan > 0 ? + "success" : "danger"); + var ratePemasukanClassIcon = response.ratePemasukan == 0 ? + "mdi-equal" : (response.ratePemasukan > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesratePemasukan = ` + <span class="text-${ratePemasukanClass} me-2"><span + class="mdi ${ratePemasukanClassIcon}"></span> + ${Math.abs(response.ratePemasukan)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#ratePemasukan').html(activitiesratePemasukan); + + // Pengeluaran + $('#totalPengeluaran').html(response.totalPengeluaran); + + var activitiesRatePengeluaran = ''; + var ratePengeluaranClass = response.ratePengeluaran == 0 ? + "secondary text-black-50" : (response.ratePengeluaran > 0 ? + "success" : "danger"); + var ratePengeluaranClassIcon = response.ratePengeluaran == 0 ? + "mdi-equal" : (response.ratePengeluaran > 0 ? + "mdi-arrow-up-bold" : "mdi-arrow-down-bold"); + + activitiesRatePengeluaran = ` + <span class="text-${ratePengeluaranClass} me-2"><span + class="mdi ${ratePengeluaranClassIcon}"></span> + ${Math.abs(response.ratePengeluaran)}%</span> + <span class="text-nowrap">Dibandingkan sebelumnya</span> + `; + + $('#ratePengeluaran').html(activitiesRatePengeluaran); + + // Profit + var activitiesRateProfit = ''; + var rateProfitClass = response.rateProfit == 0 ? + "secondary text-black-50" : (response.rateProfit > 0 ? + "success" : "danger"); + var rateProfitMention = response.rateProfit == 0 ? "sama" : (response + .rateProfit > 0 ? "meningkat" : "menurun"); + var rateProfitClassIcon = response.rateProfit == 0 ? + "sama" : (response.rateProfit > 0 ? + "meningkat" : "menurun"); + + activitiesRateProfit = ` + <div class="alert alert-${rateProfitClass} alert-dismissible fade show mb-3" + role="alert"> + Pendapatan ${rateProfitMention} + <span + class="mdi ${rateProfitClassIcon}"></span> + ${Math.abs(response.rateProfit)}% + </div> + `; + + $('#rateProfit').html(activitiesRateProfit); + }, + error: function(error) { + Swal.close(); + console.log(error); + } + }); + }); + }); + </script> @endsection diff --git a/resources/views/User/notification/detail-notification.blade.php b/resources/views/User/notification/detail-notification.blade.php index 3425642..cc08592 100644 --- a/resources/views/User/notification/detail-notification.blade.php +++ b/resources/views/User/notification/detail-notification.blade.php @@ -18,7 +18,7 @@ </div> <div class="d-flex justify-content-start mb-3"> - {{ $notification->content }} + {!! $notification->content !!} </div> </div> </div> diff --git a/resources/views/User/notification/index.blade.php b/resources/views/User/notification/index.blade.php index b80f5ed..4dbe768 100644 --- a/resources/views/User/notification/index.blade.php +++ b/resources/views/User/notification/index.blade.php @@ -1,12 +1,5 @@ @extends('layouts.main') -@section('content') - <style> - .unread { - background-color: #a3194e; - font-weight: bold; - color: #ffffff; - } - </style> +@section('tambahan-js') <script> $(document).ready(function() { let listUser = $('#table-notifikasi').DataTable({ @@ -62,6 +55,14 @@ }); }); </script> +@endsection +@section('content') + <style> + .unread { + font-weight: bold; + color: #000000; + } + </style> <div class="main-content"> <section class="section"> <div class="section-header"> diff --git a/resources/views/User/refund/index.blade.php b/resources/views/User/refund/index.blade.php index f632039..a62b9eb 100644 --- a/resources/views/User/refund/index.blade.php +++ b/resources/views/User/refund/index.blade.php @@ -42,6 +42,8 @@ </section> </div> @include('user.refund.modal-keterangan-status') +@endsection +@section('tambahan-js') <script> $(function() { let listRefund = $('#table-refund').DataTable({ diff --git a/resources/views/User/refund/modal-detail-refund.blade.php b/resources/views/User/refund/modal-detail-refund.blade.php deleted file mode 100644 index 740c224..0000000 --- a/resources/views/User/refund/modal-detail-refund.blade.php +++ /dev/null @@ -1,56 +0,0 @@ -<div class="modal fade" id="awaldetailrefund" role="dialog"> - <div class="modal-dialog modal-dialog-centered"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal"> - <span aria-hidden="true">×</span> - <span class="sr-only">Close</span> - </button> - </div> - <div class="d-flex justify-content-center"> - <h4 class="modal-title" id="myModalLabel">Detail Refund</h4> - </div> - <div class="modal-body"> - <p class="statusMsg"></p> - <div class="card-body"> - <div class="form-group"> - <label for="inputOrderId">Order ID</label> - <p class="form-control-static" id="orderid">1452667</p> - </div> - - <div class="form-group"> - <label for="inputCustomer">Customer</label> - <p class="form-control-static" id="customer">Nurul Prima</p> - </div> - - <div class="form-group"> - <label for="inputEmail">Email Customer</label> - <p class="form-control-static" id="inputEmail">npannisa@gmail.com</p> - </div> - - <div class="form-group"> - <label for="inputSeller">Seller Name</label> - <p class="form-control-static" id="sellername">Zakiaa</p> - </div> - - <div class="form-group"> - <label for="inputDueDate">Due Date</label> - <p class="form-control-static" id="duedate">29 Januari 2002</p> - </div> - - <div class="form-group"> - <label for="inputComplaint">Reason Complaint</label> - <p class="form-control-static" id="reasoncomplaint">Pengembalian product dikarenakan tidak - sesuai dengan aslinya</p> - </div> - - <div class="form-group"> - <label for="inputBukti">Bukti</label> - <p class="form-control-static" id="inputbukti"></p> - <img class="mr-3 rounded" width="200" src="assets/img/avatar/rusak.jpeg"> - </div> - </div> - </div> - </div> - </div> -</div> diff --git a/resources/views/User/refund/new-refund.blade.php b/resources/views/User/refund/new-refund.blade.php index b1f5734..2793e62 100644 --- a/resources/views/User/refund/new-refund.blade.php +++ b/resources/views/User/refund/new-refund.blade.php @@ -51,7 +51,8 @@ </div> </section> </div> - +@endsection +@section('tambahan-js') <script> $(document).ready(function() { $('#formPengajuan').on('submit', function(e) { @@ -95,6 +96,14 @@ icon: response.status ? 'success' : 'error', }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-notification-to-admin') }}", + type: 'GET', + data: { + service: response + .service, + } + }); location.href = "{{ route('user-refund.index') }}"; } @@ -130,8 +139,8 @@ if (file.type.startsWith('image/')) { preview.innerHTML = `<div class="col-md-4 m-2"> - <img src="${e.target.result}" alt="${file.name}" style="max-width:250px; max-height:200px;"> - </div>`; + <img src="${e.target.result}" alt="${file.name}" style="max-width:250px; max-height:200px;"> + </div>`; } else if (file.type.startsWith('video/')) { var video = document.createElement('video'); var videoUrl = URL.createObjectURL(file); @@ -149,13 +158,13 @@ console.log('INI COY 1'); } else { preview.innerHTML = ` - <div class="col-md-4"> - <video controls style="max-width:250px; max-height:200px;"> - <source src="${e.target.result}" type="${file.type}" > - Your browser does not support the video tag. - </video> - </div> - `; + <div class="col-md-4"> + <video controls style="max-width:250px; max-height:200px;"> + <source src="${e.target.result}" type="${file.type}" > + Your browser does not support the video tag. + </video> + </div> + `; } } diff --git a/resources/views/User/transaction/Pembeli/detail-transaction.blade.php b/resources/views/User/transaction/Pembeli/detail-transaction.blade.php index fce4496..343f60d 100644 --- a/resources/views/User/transaction/Pembeli/detail-transaction.blade.php +++ b/resources/views/User/transaction/Pembeli/detail-transaction.blade.php @@ -8,6 +8,9 @@ <div class="d-flex justify-content-center"> <h2 class="mb-4"> Informasi Pesanan</h2> </div> + <div class="d-flex justify-content-center"> + <p>#{{ $transaction->id }}</p> + </div> </div> </div> </div> @@ -98,6 +101,58 @@ </address> </div> </div> + <div class="row"> + <div class="col-md-12"> + <address> + <strong>Deskripsi:</strong><br> + {!! $transaction->deskripsi_transaksi !!}<br> + </address> + </div> + </div> + <div class="row"> + <div class="col-md-6"> + <address> + <strong>Batas Pembayaran:</strong><br> + {{ date('d F Y', strtotime($transaction->batas_pembayaran)) }}<br> + </address> + </div> + <div class="col-md-6 text-md-right"> + <address> + <strong>Batas Pengiriman:</strong><br> + {{ date('d F Y', strtotime($transaction->batas_pengiriman_barang_akhir)) }}<br> + </address> + </div> + </div> + <div class="row"> + <div class="col-md-6"> + <address> + <strong>Status Transaksi:</strong><br> + {{ ucwords($transaction->status_transaksi) }} + </address> + </div> + <div class="col-md-6 text-md-right"> + <address> + <strong>Status Pembayaran:</strong><br> + {{ ucwords($transaction->status_pembayaran) }} + </address> + </div> + </div> + @if ($transaction->fraud_status != null) + <div class="row"> + <div class="col-md-6"> + <address> + <strong>Status Indikasi Penipuan:</strong><br> + {{ $transaction->fraud_status == null ? 'Tidak ada' : ucwords($transaction->fraud_status) }} + </address> + </div> + <div class="col-md-6 text-md-right"> + <address> + <strong>Keterangan:</strong><br> + {{ $transaction->keterangan }} + </address> + </div> + </div> + @endif </div> </div> @@ -119,11 +174,11 @@ <td>1</td> <td>{{ $transaction->nama_barang }}</td> <td class="text-center"> - Rp.{{ number_format($transaction->harga_barang, 2, ',', '.') }} + Rp {{ number_format($transaction->harga_barang, 2, ',', '.') }} </td> <td class="text-center">{{ $transaction->jumlah_barang }}</td> <td class="text-right"> - Rp.{{ number_format($transaction->total_harga, 2, ',', '.') }} + Rp {{ number_format($transaction->total_harga, 2, ',', '.') }} </td> </tr> </table> @@ -142,21 +197,22 @@ <div class="col-lg-4 text-right"> <div class="invoice-detail-item"> <div class="invoice-detail-name">Subtotal</div> - <div class="invoice-detail-value">Rp - Rp.{{ number_format($transaction->total_harga, 2, ',', '.') }} + <div class="invoice-detail-value"> + Rp {{ number_format($transaction->total_harga, 2, ',', '.') }} </div> </div> <div class="invoice-detail-item"> <div class="invoice-detail-name">Biaya Admin</div> <div class="invoice-detail-value"> - Rp.{{ number_format($transaction->total_keuntungan, 2, ',', '.') }} + Rp + {{ number_format($transaction->total_keuntungan, 2, ',', '.') }} </div> </div> <hr class="mt-2 mb-2"> <div class="invoice-detail-item"> <div class="invoice-detail-name">Total</div> <div class="invoice-detail-value invoice-detail-value-lg"> - Rp.{{ number_format($transaction->total_bayar, 2, ',', '.') }} + Rp {{ number_format($transaction->total_bayar, 2, ',', '.') }} </div> </div> </div> diff --git a/resources/views/User/transaction/Pembeli/index.blade.php b/resources/views/User/transaction/Pembeli/index.blade.php index 03d3e44..678302d 100644 --- a/resources/views/User/transaction/Pembeli/index.blade.php +++ b/resources/views/User/transaction/Pembeli/index.blade.php @@ -59,7 +59,9 @@ @include('user.transaction.pembeli.modal-end-transaction') @include('user.transaction.pembeli.modal-tracking') @include('user.transaction.pembeli.modal-keterangan-status') +@endsection +@section('tambahan-js') <script type="text/javascript" src="https://app.sandbox.midtrans.com/snap/snap.js" data-client-key="SB-Mid-client-lEMALcmIPviksRRe"></script> <script> @@ -127,30 +129,30 @@ render: function(data, type, row) { if (row.status_transaksi == 'created') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (row.status_transaksi == 'success') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['process', 'sending', 'sent'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['cancel', 'failure', 'refund'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['finished', 'done'].includes(row.status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } }, className: 'text-center' @@ -203,6 +205,14 @@ 'error' }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response + .receiver, + } + }); listPembeli.ajax.reload(); } }); @@ -469,6 +479,14 @@ }).then(function() { Swal.close(); if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response + .receiver + } + }); listPembeli.ajax .reload(); } @@ -532,34 +550,34 @@ // Iterasi melalui data transaksi dan tambahkan ke activitiesHtml $.each(transactionDatas, function(index, transactionDescription) { activitiesHtml += ` - <div class="activity"> - <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> - <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> + <div class="activity"> + <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> + <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> + </div> + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> + </div> + <p>${transactionDescription.deskripsi}</p> + </div> </div> - <p>${transactionDescription.deskripsi}</p> - </div> - </div> - `; + `; }); } else { // Tidak ada data transaksi, tambahkan pesan kosong activitiesHtml += ` - <div class="activity"> - <div class="activity-icon bg-primary text-white shadow-primary"> - <i class="fas fa-ban" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">--, --:--:-- --</span> + <div class="activity"> + <div class="activity-icon bg-primary text-white shadow-primary"> + <i class="fas fa-ban" style="font-size: 36px;"></i> + </div> + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">--, --:--:-- --</span> + </div> + <p>Kosong</p> + </div> </div> - <p>Kosong</p> - </div> - </div> - `; + `; } // Menampilkan data dalam modal @@ -585,9 +603,9 @@ var modal = $(this); activitiesHtml += ` - <a href="#" type="button" class="btn btn-primary" data-id="${id}" id="finishTransaction">Selesaikan Transaksi</a> - <a href="#" type="button" class="btn btn-danger" data-id="${id}" id="complain">Ajukan Komplain</a> - `; + <a href="#" type="button" class="btn btn-primary" data-id="${id}" id="finishTransaction">Selesaikan Transaksi</a> + <a href="#" type="button" class="btn btn-danger" data-id="${id}" id="complain">Ajukan Komplain</a> + `; modal.find('.modal-footer').html(activitiesHtml); }); @@ -624,6 +642,13 @@ icon: response.status ? 'success' : 'error', }).then(function() { if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response.receiver, + } + }); location.reload(); } }); diff --git a/resources/views/User/transaction/Pembeli/modal-end-transaction.blade.php b/resources/views/User/transaction/Pembeli/modal-end-transaction.blade.php index 2f61b79..6255479 100644 --- a/resources/views/User/transaction/Pembeli/modal-end-transaction.blade.php +++ b/resources/views/User/transaction/Pembeli/modal-end-transaction.blade.php @@ -14,20 +14,25 @@ <div class="row"> <div class="col-12"> <div class="activities"> - <p>asdasdasdsad</p> + <p style="text-align: justify;"> + Silahkan konfirmasi barang anda sebelum menyelesaikan + transaksi atau mengajukan + refund. Harap diminta kesadaran penuh anda sebelum memilih selesaikan transaksi atau + ajukan + komplain.</p> </div> </div> </div> - <div class="row"> + <div class="row m-4"> <div class="col-12"> <div class="activities"> <div class="col-6 d-flex justify-content-center"> - <img src="{{ asset('assets/img/avatar/avatar-1.png') }}" - style="max-width:200px; max-height: 150px;" alt=""> + <img src="{{ asset('assets/img/modal-end/approve.png') }}" style="width:100%;" + alt="approve"> </div> <div class="col-6 d-flex justify-content-center"> - <img src="{{ asset('assets/img/avatar/avatar-1.png') }}" - style="max-width:200px; max-height: 150px;" alt=""> + <img src="{{ asset('assets/img/modal-end/refund.png') }}" style="width:100%;" + alt="refund"> </div> </div> </div> diff --git a/resources/views/User/transaction/Pembeli/new-transaction.blade.php b/resources/views/User/transaction/Pembeli/new-transaction.blade.php index 4671564..cfc9ee5 100644 --- a/resources/views/User/transaction/Pembeli/new-transaction.blade.php +++ b/resources/views/User/transaction/Pembeli/new-transaction.blade.php @@ -9,109 +9,121 @@ <div class="card-body"> <div class="card" style="border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); position: relative; background: linear-gradient(45deg, #f3f3f3, #e0e0e0);"> - <div class="card-header d-flex justify-content-center"> - <h2>Form Transaksi</h2> - </div> - <div class="card-body"> - <div class="form-row"> - <div class="form-group col-md-12"> - <label for="inputpembeli"> - <h5>Nama Pembeli</h5> + <form action="javascript:void(0);" method="POST" id="formTambahTransaksi" + enctype="multipart/form-data"> + <div class="card-header d-flex justify-content-center"> + <h2>Form Transaksi</h2> + </div> + <div class="card-body"> + <div class="form-row"> + <div class="form-group col-md-12"> + <label for="inputPembeli"> + <h5>Nama Pembeli</h5> + </label> + <input type="email" class="form-control" id="inputPembeli" name="pembeli" + placeholder="Masukkan nama pembeli" + value="{{ Auth::user()->nama_depan . ' ' . Auth::user()->nama_belakang }}" + disabled> + </div> + </div> + + <div class="form-group"> + <label for="inputpenjual"> + <h5>Penjual</h5> </label> - <input type="email" class="form-control" id="inputpembeli" - placeholder="Masukkan nama pembeli" - value="{{ Auth::user()->nama_depan . ' ' . Auth::user()->nama_belakang }}" - disabled> + <h6>Pilih dari kontak</h6> + <div class="input-group"> + <select class="form-control col-lg-10 col-md-10 col-sm-12" + id="selectContact" name="select_penjual"> + + </select> + <button class="btn btn-danger col-md-2 col-md-2 col-sm-12" type="button" + id="deleteOption">Hapus</button> + </div> + </div> + + <div class="form-group"> + <h6>atau dari email</h6> + <div class="input-group"> + <input type="email" class="form-control" id="inputPenjual" + name="input_penjual" placeholder="Masukkan email penjual"> + <button class="btn btn-danger" type="button" id="checkButton">Cek</button> + </div> + </div> + + <div class="form-group"> + <label for="inputBarang"> + <h5>Nama Barang/Jasa</h5> + </label> + <input type="text" class="form-control" id="inputBarang" + placeholder="Sepeda Motor" name="nama_barang"> + </div> + <div class="form-group"> + <label for="hargaBarang"> + <h5>Harga Satuan</h5> + </label> + <input type="text" class="form-control" name="harga_barang" id="hargaBarang" + placeholder="Rp. 1000.000" + oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 16);"> + </div> + <div class="form-group"> + <label for="hargaBarang"> + <h5>Satuan</h5> + </label> + <input type="text" class="form-control" name="satuan_barang" + id="satuanBarang" placeholder="Buah/Kg/Karung/Jutaan dll."> + </div> + <div class="form-group"> + <label for="jumlahBarang"> + <h5>Jumlah Satuan</h5> + </label> + <input type="text" class="form-control" name="jumlah_barang" + id="jumlahBarang" placeholder="Jumlah satuan" + oninput="this.value = this.value.replace(/[^0-9.]/g, '').substring(0, 10);"> + </div> + + <div class="form-group"> + <label for="inputDeskripsi"> + <h5>Deskripsi</h5> + </label> + <textarea class="form-control resizable" name="deskripsi" id="inputDeskripsi" placeholder="Deskripsikan transaksi anda"></textarea> + </div> + + <div class="dashed-line"></div> + + + <div class="form-group"> + <div class="input-group"> + <label class="col-6" id="jumlah">Nominal</label> + <div class="col-6 text-right" id="totalBiaya"> + Rp 0,00 + </div> + </div> + </div> + <div class="form-group"> + <div class="input-group"> + <label class="col-6" id="biayaAdmin">Biaya Admin + ({{ $persentase_keuntungan }}%)</label> + <div class="col-6 text-right" id="totalBiayaAdmin">Rp 0,00</div> + </div> + </div> + + <div class="form-group"> + <div class="input-group"> + <h6 class="col-6">Total Biaya</h6> + <div class="col-6 text-right"> + <h6 id="totalBayar">Rp 0,00</h6> + </div> + </div> + </div> + + <div class="dashed-line"></div> + + <div class="card-footer d-flex justify-content-center"> + <button type="submit" class="btn btn-primary" id="save">Buat</button> </div> </div> - - <div class="form-group"> - <label for="inputpenjual"> - <h5>Penjual</h5> - </label> - <h6>Pilih dari kontak</h6> - <div class="input-group"> - <select class="form-control" id="selectContact" name="select_penjual" - style="width: 89%"> - - </select> - <button class="btn btn-danger" type="button" id="deleteOption">Hapus</button> - </div> - </div> - - <div class="form-group"> - <h6>atau dari email</h6> - <div class="input-group"> - <input type="email" class="form-control" id="inputPenjual" - name="input_penjual" placeholder="Masukkan email penjual"> - <button class="btn btn-danger" type="button" id="checkButton">Cek</button> - </div> - </div> - - <div class="form-group"> - <label for="inputBarang"> - <h5>Nama Barang/Jasa</h5> - </label> - <input type="text" class="form-control" id="inputBarang" - placeholder="Sepeda Motor" name="nama_barang"> - </div> - <div class="form-group"> - <label for="hargaBarang"> - <h5>Harga Satuan</h5> - </label> - <input type="text" class="form-control" name="harga_barang" id="hargaBarang" - placeholder="Rp. 1000.000" - oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 16);"> - </div> - <div class="form-group"> - <label for="hargaBarang"> - <h5>Satuan</h5> - </label> - <input type="text" class="form-control" name="satuan_barang" id="satuanBarang" - placeholder="Buah/Kg/Karung/Jutaan dll."> - </div> - <div class="form-group"> - <label for="jumlahBarang"> - <h5>Jumlah Satuan</h5> - </label> - <input type="text" class="form-control" name="jumlah_barang" id="jumlahBarang" - placeholder="Jumlah satuan" - oninput="this.value = this.value.replace(/[^0-9.]/g, '').substring(0, 10);"> - </div> - - <div class="form-group"> - <label for="inputDeskripsi"> - <h5>Deskripsi</h5> - </label> - <textarea class="form-control resizable" name="deskripsi" id="inputDeskripsi" placeholder="Deskripsikan transaksi anda"></textarea> - </div> - - <div class="dashed-line"></div> - - <div class="form-row"> - <label style="margin-right: 200px;" id="jumlah">Nominal</label> - <div style="display: inline-block;" id="totalBiaya">Rp 0,00</div> - </div> - - <div class="form-row"> - <label style="margin-right: 200px;" id="biayaAdmin" data-admin="">Biaya Admin - ({{ $persentase_keuntungan }}%)</label> - <div style="display: inline-block;" id="totalBiayaAdmin">Rp 0,00</div> - </div> - - <div class="form-row"> - <h6 style="margin-right: 200px;">Total Biaya</h6> - <div style="display: inline-block;"> - <h6 id="totalBayar">Rp 0,00</h6> - </div> - </div> - - <div class="dashed-line"></div> - - <div class="card-footer d-flex justify-content-center"> - <button type="button" class="btn btn-primary" id="save">Buat</button> - </div> - </div> + </form> </div> </div> </div> @@ -119,6 +131,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> <script> var persentaseKeuntungan = {{ $persentase_keuntungan }}; @@ -260,18 +274,18 @@ }); $.ajax({ - url: "{{ route('user-contact.email', ':email') }}".replace( - ":email", - email - ), + url: "{{ route('user-contact.email') }}", + data: { + email: email + }, type: "GET", success: function(response) { if ( response.status && - (response.message.nama_bank == null || - response.message.nama_bank == "") && - (response.message.no_rek == null || - response.message.no_rek == "") + (response.message.nama_bank != null || + response.message.nama_bank != "") && + (response.message.no_rek != null || + response.message.no_rek != "") ) { Swal.fire({ title: "Berhasil", @@ -285,6 +299,7 @@ icon: "error", }); } + console.log(response.message.nama_bank); }, error: function(error) { Swal.fire({ @@ -304,126 +319,81 @@ } }); - $("#save").on("click", function() { - const csrfToken = $('meta[name="csrf-token"]').attr("content"); + $('#formTambahTransaksi').on('submit', function(e) { + e.preventDefault(); + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + let form = this; + let email_kontak = $('#selectContact').val(); + let email_input = $('#inputPenjual').val(); + let penjual = email_kontak != null ? email_kontak : email_input; - let opsiKontak = document.querySelector( - '[name="select_penjual"]' - ).value; - let inputKontak = document.querySelector( - '[name="input_penjual"]' - ).value; - let namaBarang = document.querySelector('[name="nama_barang"]').value; - let hargaBarang = document.querySelector('[name="harga_barang"]').value; - let satuanBarang = document.querySelector( - '[name="satuan_barang"]' - ).value; - let jumlahBarang = document.querySelector( - '[name="jumlah_barang"]' - ).value; - let deskripsi = document.querySelector( - 'textarea[name="deskripsi"]' - ).value; + const formData = new FormData(this); + formData.append("email_penjual", penjual); + formData.append("persentase_keuntungan", biayaAdmin); + formData.append("total_keuntungan", totalBiayaAdmin); + formData.append("total_harga", totalHarga); + formData.append("total_bayar", totalBayar); - let emptyInput = []; + Swal.fire({ + html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>', + allowEscapeKey: false, + allowOutsideClick: false, + didOpen: () => { + Swal.showLoading(); + } + }); - let penjual = ""; - if (opsiKontak != "" && inputKontak != "") { - penjual = opsiKontak; - } else if (opsiKontak == "" && inputKontak != "") { - penjual = inputKontak; - } else if (inputKontak == "" && opsiKontak != "") { - penjual = opsiKontak; - } else { - emptyInput.push("Kolom penjual tidak boleh kosong"); - } + $.ajaxSetup({ + headers: { + "X-CSRF-TOKEN": csrfToken, + }, + }); - if (penjual == "{{ Auth::user()->email }}") { - emptyInput.push( - "Email penjual tidak boleh sama dengan email pembeli" - ); - } + $.ajax({ + url: "{{ route('user-pembeli.store') }}", + type: "POST", + data: formData, + processData: false, + contentType: false, + success: function(response) { + Swal.fire({ + title: response.status ? "Berhasil" : "Gagal", + text: response.message, + icon: response.status ? "success" : "error", + confirmButtonText: "OK", + }).then(function() { + if (response.status) { + location.href = + "{{ route('user-pembeli.index') }}"; + } + }); + }, + error: function(error) { + if (error.responseJSON && error.responseJSON.errors) { + let errorMessage = "Terdapat beberapa kesalahan:<br>"; - if (namaBarang == "") { - emptyInput.push("Nama barang tidak boleh kosong"); - } + const errors = error.responseJSON.errors; - if (hargaBarang == "") { - emptyInput.push("Harga barang tidak boleh kosong"); - } + for (let key in errors) { + errorMessage += `${errors[key].join(', ')}<br>`; + } - if (satuanBarang == "") { - emptyInput.push("Satuan barang tidak boleh kosong"); - } - - if (jumlahBarang == "") { - emptyInput.push("Jumlah barang tidak boleh kosong"); - } - - if (emptyInput.length > 0) { - const emptyInputError = emptyInput.join(", "); - Swal.fire({ - title: "Gagal", - text: emptyInputError, - icon: "error", - confirmButtonText: "OK", - }); - } else { - Swal.fire({ - html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>', - allowEscapeKey: false, - allowOutsideClick: false, - didOpen: () => { - Swal.showLoading(); - } - }); - - const formData = new FormData(); - formData.append("email_penjual", penjual); - formData.append("nama_barang", namaBarang); - formData.append("satuan_barang", satuanBarang); - formData.append("harga_barang", hargaBarang); - formData.append("jumlah_barang", jumlahBarang); - formData.append("deskripsi", deskripsi); - formData.append("persentase_keuntungan", biayaAdmin); - formData.append("total_keuntungan", totalBiayaAdmin); - formData.append("total_harga", totalHarga); - formData.append("total_bayar", totalBayar); - - $.ajaxSetup({ - headers: { - "X-CSRF-TOKEN": csrfToken, - }, - }); - - $.ajax({ - url: "{{ route('user-pembeli.store') }}", - type: "POST", - data: formData, - processData: false, - contentType: false, - success: function(response) { - Swal.fire({ - title: response.status ? "Berhasil" : "Gagal", - text: response.message, - icon: response.status ? "success" : "error", - confirmButtonText: "OK", - }).then(function() { - if (response.status) { - location.href = - "{{ route('user-pembeli.index') }}"; - } - }); - }, - error: function(error) { Swal.fire({ title: "Gagal", - text: "Gagal mengirimkan data karena " + error, + html: errorMessage, icon: "error", }); - }, - }); - } + } else { + Swal.fire({ + title: "Gagal", + text: "Gagal mengirimkan data karena " + error + .statusText, + icon: "error", + }); + } + console.log(error); + }, + }); }); }); </script> diff --git a/resources/views/User/transaction/penjual/index.blade.php b/resources/views/User/transaction/penjual/index.blade.php index 4b227ba..f8ae588 100644 --- a/resources/views/User/transaction/penjual/index.blade.php +++ b/resources/views/User/transaction/penjual/index.blade.php @@ -53,6 +53,8 @@ @include('user.transaction.penjual.modal-tracking') @include('user.transaction.penjual.modal-pengiriman-selesai') @include('user.transaction.penjual.modal-keterangan-status') +@endsection +@section('tambahan-js') <script> $(document).ready(function() { let listPenjual = $('#table-penjual').DataTable({ @@ -118,30 +120,30 @@ render: function(data, type, row) { if (row.status_transaksi == 'created') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-light"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (row.status_transaksi == 'success') { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-info"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['process', 'sending', 'sent'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-warning"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['cancel', 'failure', 'refund'].includes(row .status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-danger"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else if (['finished', 'done'].includes(row.status_transaksi)) { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-success"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } else { return `<a href="#" data-toggle="modal" data-target="#modalKeteranganStatus" class="badge badge-dark"> - ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} - </a>`; + ${row.status_transaksi.charAt(0).toUpperCase()}${row.status_transaksi.slice(1)} + </a>`; } }, className: 'text-center' @@ -185,34 +187,34 @@ // Iterasi melalui data transaksi dan tambahkan ke activitiesHtml $.each(transactionDatas, function(index, transactionDescription) { activitiesHtml += ` - <div class="activity"> - <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> - <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> + <div class="activity"> + <div class="activity-icon ${transactionDescription.background} text-white shadow-primary"> + <i class="${transactionDescription.judul}" style="font-size: 36px;"></i> + </div> + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">${new Date(transactionDescription.created_at).toLocaleString()}</span> + </div> + <p>${transactionDescription.deskripsi}</p> + </div> </div> - <p>${transactionDescription.deskripsi}</p> - </div> - </div> - `; + `; }); } else { // Tidak ada data transaksi, tambahkan pesan kosong activitiesHtml += ` - <div class="activity"> - <div class="activity-icon bg-primary text-white shadow-primary"> - <i class="fas fa-ban" style="font-size: 36px;"></i> - </div> - <div class="activity-detail"> - <div class="mb-2"> - <span class="text-job text-primary">--, --:--:-- --</span> + <div class="activity"> + <div class="activity-icon bg-primary text-white shadow-primary"> + <i class="fas fa-ban" style="font-size: 36px;"></i> + </div> + <div class="activity-detail"> + <div class="mb-2"> + <span class="text-job text-primary">--, --:--:-- --</span> + </div> + <p>Kosong</p> + </div> </div> - <p>Kosong</p> - </div> - </div> - `; + `; } // Menampilkan data dalam modal @@ -274,6 +276,14 @@ }).then(function() { Swal.close(); if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response + .receiver, + } + }); listPenjual.ajax.reload(); } }); @@ -349,6 +359,14 @@ }).then(function() { Swal.close(); if (response.status) { + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response + .receiver, + } + }); listPenjual.ajax .reload(); } @@ -468,7 +486,7 @@ var modal = $(this); activitiesHtml += ` - <input type="hidden" name="transaction_id" id="transactionId" value="${id}"> + <input type="hidden" name="transaction_id" id="transactionId" value="${id}"> `; modal.find('.form-bukti-id').html(activitiesHtml); }); @@ -516,6 +534,13 @@ if (response.status) { $('#formBukti').trigger('reset'); $('#modalOrderSent').modal('hide'); + $.ajax({ + url: "{{ route('user-notification.update-new-notification') }}", + type: 'GET', + data: { + receiver: response.receiver, + } + }); listPenjual.ajax.reload(); } }); diff --git a/resources/views/email/approve-user-email.blade.php b/resources/views/email/approve-user-email.blade.php new file mode 100644 index 0000000..4779508 --- /dev/null +++ b/resources/views/email/approve-user-email.blade.php @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <style> + * { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + body { + font-family: "Arial", sans-serif; + background-color: #f4f4f4; + } + + .container { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + } + + .card { + background-color: #fff; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + padding: 20px; + max-width: 400px; + width: 100%; + } + + .card-rekber { + text-align: center; + margin-bottom: 20px; + } + + .large-text { + font-size: 3.5em; + font-weight: bold; + color: #b61754; + } + + .small-text { + font-size: 0.8em; + color: #888; + } + + .code-verifikasi, + .code, + .masa-berlaku { + margin-bottom: 15px; + } + + .code-pendaftaran { + background-color: #b61754; + color: #fff; + text-align: center; + padding: 10px; + border-radius: 4px; + font-size: 3.5em; + margin: 10px 0; + font-weight: bold; + } + + @media only screen and (max-width: 600px) { + .card { + max-width: 100%; + } + } + </style> +</head> + +<body> + <div class="container"> + <div class="card"> + <div class="card-rekber"> + <p class="large-text">Rekber</p> + <span class="small-text">Pendaftaran Akun Sukses</span> + </div> + + <div class="code-verifikasi"> + <p>Selamat, anda dengan email</p> + <p><b>{{ $content['email'] }}</b></p> + </div> + + <div class="code"> + <p>dinyatakan</p> + </div> + + <div class="code-pendaftaran"> + <p>Berhasil</p> + </div> + + <div class="masa-berlaku"> + <p>Selamat bergabung di Rekber dan bertransaksi.</p> + </div> + </div> + </div> +</body> + +</html> diff --git a/resources/views/email/deny-user-email.blade.php b/resources/views/email/deny-user-email.blade.php new file mode 100644 index 0000000..10e0b95 --- /dev/null +++ b/resources/views/email/deny-user-email.blade.php @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <style> + * { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + body { + font-family: "Arial", sans-serif; + background-color: #f4f4f4; + } + + .container { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + } + + .card { + background-color: #fff; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + padding: 20px; + max-width: 400px; + width: 100%; + } + + .card-rekber { + text-align: center; + margin-bottom: 20px; + } + + .large-text { + font-size: 3.5em; + font-weight: bold; + color: #b61754; + } + + .small-text { + font-size: 0.8em; + color: #888; + } + + .code-verifikasi, + .code, + .masa-berlaku { + margin-bottom: 15px; + } + + .code-pendaftaran { + background-color: #b61754; + color: #fff; + text-align: center; + padding: 10px; + border-radius: 4px; + font-size: 3.5em; + margin: 10px 0; + font-weight: bold; + } + + @media only screen and (max-width: 600px) { + .card { + max-width: 100%; + } + } + </style> +</head> + +<body> + <div class="container"> + <div class="card"> + <div class="card-rekber"> + <p class="large-text">Rekber</p> + <span class="small-text">Pendaftaran Akun Gagal</span> + </div> + + <div class="code-verifikasi"> + <p>Maaf, Anda dengan email</p> + <p><b>{{ $content['email'] }}</b></p> + </div> + + <div class="code"> + <p>dinyatakan</p> + </div> + + <div class="code-pendaftaran"> + <p>Gagal</p> + </div> + + <div class="masa-berlaku"> + <p>Dengan alasan {{ $content['keterangan'] }}</p> + </div> + </div> + </div> +</body> + +</html> diff --git a/resources/views/email/verification-email.blade.php b/resources/views/email/verification-email.blade.php index fa4aa0e..accf1b7 100644 --- a/resources/views/email/verification-email.blade.php +++ b/resources/views/email/verification-email.blade.php @@ -4,7 +4,6 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>Document</title> <style> * { box-sizing: border-box; diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index a8586e0..570f93a 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -97,7 +97,7 @@ <!-- ======= END SIGN IN FORM ======= --> <!-- ======= SIGN UP FORM ======= --> - <form action="javascript:void(0)" class="sign-up-form" id="msform" enctype="multipart/form-data" + <form action="javascript:void(0);" class="sign-up-form" id="msform" enctype="multipart/form-data" method="POST"> @csrf <h2 class="title">Daftar</h2> @@ -394,6 +394,7 @@ <script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="{{ asset('assets/js/login_register/app.js') }}"></script> <script src="{{ asset('assets/js/login_register/script.js') }}"></script> + @if (Session::has('message')) <script> Swal.fire({ diff --git a/resources/views/invoice/invoice-transaction.blade.php b/resources/views/invoice/invoice-transaction.blade.php index fd9c9d5..fff684f 100644 --- a/resources/views/invoice/invoice-transaction.blade.php +++ b/resources/views/invoice/invoice-transaction.blade.php @@ -33,20 +33,29 @@ </div> </div> <div class="row"> - <div class="col-md-6"> + <div class="col-md-12"> <address> - <strong>Payment Method:</strong><br> - Visa ending **** 4242<br> - npannisa@gmail.com - </address> - </div> - <div class="col-md-6 text-md-right"> - <address> - <strong>Tanggal Transaksi:</strong><br> - {{ $transaction->created_at->format('d M Y, g:i') }}<br><br> + <strong>Deskripsi:</strong><br> + {!! $transaction->deskripsi_transaksi !!}<br> </address> </div> </div> + <div class="row"> + @if (in_array($transaction->status_pembayaran, ['settlement', 'capture'])) + <div class="col-md-6"> + <address> + <strong>Status Pembayaran:</strong><br> + {{ ucwords($transaction->status_pembayaran) }}<br> + </address> + </div> + <div class="col-md-6 text-md-right"> + <address> + <strong>Tanggal Pembayaran:</strong><br> + {{ $transaction->created_at->format('d M Y, g:i') }}<br><br> + </address> + </div> + @endif + </div> </div> </div> @@ -67,10 +76,10 @@ <td>1</td> <td>{{ $transaction->nama_barang }}</td> <td class="text-center"> - Rp.{{ number_format($transaction->harga_barang, 2, ',', '.') }}</td> + Rp {{ number_format($transaction->harga_barang, 2, ',', '.') }}</td> <td class="text-center">{{ $transaction->jumlah_barang }}</td> <td class="text-right"> - Rp.{{ number_format($transaction->total_harga, 2, ',', '.') }} + Rp {{ number_format($transaction->total_harga, 2, ',', '.') }} </td> </tr> </table> @@ -90,20 +99,20 @@ <div class="invoice-detail-item"> <div class="invoice-detail-name">Subtotal</div> <div class="invoice-detail-value"> - Rp.{{ number_format($transaction->total_harga, 2, ',', '.') }} + Rp {{ number_format($transaction->total_harga, 2, ',', '.') }} </div> </div> <div class="invoice-detail-item"> <div class="invoice-detail-name">Biaya Admin</div> <div class="invoice-detail-value"> - Rp.{{ number_format($transaction->total_keuntungan, 2, ',', '.') }} + Rp {{ number_format($transaction->total_keuntungan, 2, ',', '.') }} </div> </div> <hr class="mt-2 mb-2"> <div class="invoice-detail-item"> <div class="invoice-detail-name">Total</div> <div class="invoice-detail-value invoice-detail-value-lg"> - Rp.{{ number_format($transaction->total_bayar, 2, ',', '.') }} + Rp {{ number_format($transaction->total_bayar, 2, ',', '.') }} </div> </div> </div> @@ -120,6 +129,8 @@ </div> </section> </div> +@endsection +@section('tambahan-js') <script> $(document).ready(function() { $('#btnPDF').on('click', function() { diff --git a/resources/views/layouts/header.blade.php b/resources/views/layouts/header.blade.php index 709fbf5..1bef26e 100644 --- a/resources/views/layouts/header.blade.php +++ b/resources/views/layouts/header.blade.php @@ -22,14 +22,14 @@ $new = NotificationReceiver::where('receiver', auth()->user()->email) <div class="dropdown-menu dropdown-list dropdown-menu-right"> <div class="dropdown-header">Notifikasi <div class="float-right"> - <a href="javascript: void(0);" id="markAllAsRead">Mark All As Read</a> + <a href="javascript: void(0);" id="markAllAsRead">Tandai semua telah dibaca</a> </div> </div> <div class="dropdown-list-content dropdown-list-icons" id="notifContent"> </div> <div class="dropdown-footer text-center"> - <a href="{{ route('user-notification.index') }}">View All <i + <a href="{{ route('user-notification.index') }}">Lihat semua<i class="fas fa-chevron-right"></i></a> </div> </div> @@ -55,50 +55,56 @@ $new = NotificationReceiver::where('receiver', auth()->user()->email) </li> </ul> </nav> -<script> - $(document).ready(function() { - var notifBtn = $('#notifBtn'); +@section('js-header') + <script> + $(document).ready(function() { + var notifBtn = $('#notifBtn'); - function updateNotif() { - notifBtn.toggleClass("beep"); - } + function updateNotif() { + notifBtn.addClass("beep"); + } - $('#notifBtn').on('click', function() { - const csrfToken = $('meta[name="csrf-token"]').attr('content'); - var notifContent = $('#notifContent'); - var activitiesHtml = ''; + function removeNotif() { + notifBtn.removeClass("beep"); + } - $.ajaxSetup({ - headers: { - 'X-CSRF-TOKEN': csrfToken - } - }); + $('#notifBtn').on('click', function() { + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + var notifContent = $('#notifContent'); + var activitiesHtml = ''; - $.ajax({ - url: "{{ route('user-notification.latest-notification') }}", - type: 'GET', - success: function(response) { - var notifications = response.notifications; - if (notifications.length > 0) { - notifications.forEach(element => { - var url = - "{{ route('user-notifiaction.detail-notification', ':id') }}" - .replace(':id', element.id); + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': csrfToken + } + }); - var date = new Date(element.updated_at); - var day = date.getDate(); - var month = date.toLocaleString('id-ID', { - month: 'short' - }); - var year = date.getFullYear(); - var hours = date.getHours(); - var minutes = date.getMinutes(); + $.ajax({ + url: "{{ route('user-notification.latest-notification') }}", + type: 'GET', + success: function(response) { + var notifications = response.notifications; + if (notifications.length > 0) { + notifications.forEach(element => { + var url = + "{{ route('user-notifiaction.detail-notification', ':id') }}" + .replace(':id', element.id); - var formattedDate = day + ' ' + month + ' ' + year + - " | " + hours + ":" + +(minutes < 10 ? '0' : '') + - minutes; + var date = new Date(element.updated_at); + var day = date.getDate(); + var month = date.toLocaleString('id-ID', { + month: 'short' + }); + var year = date.getFullYear(); + var hours = date.getHours(); + var minutes = date.getMinutes(); - activitiesHtml += ` + var formattedDate = day + ' ' + month + ' ' + year + + " | " + hours + ":" + +(minutes < 10 ? '0' : + '') + + minutes; + + activitiesHtml += ` <a href="${url}" class="dropdown-item dropdown-item-unread"> <div class="dropdown-item-icon bg-primary text-white"> <i class="fas fa-code"></i> @@ -110,9 +116,9 @@ $new = NotificationReceiver::where('receiver', auth()->user()->email) </div> </a> `; - }); - } else { - activitiesHtml += ` + }); + } else { + activitiesHtml += ` <a class="dropdown-item dropdown-item-unread"> <div class="dropdown-item-icon bg-primary text-white"> <i class="fas fa-code"></i> @@ -123,57 +129,64 @@ $new = NotificationReceiver::where('receiver', auth()->user()->email) </div> </a> `; + } + notifContent.html(activitiesHtml); + }, + error: function(error) { + console.log(error); } - notifContent.html(activitiesHtml); - }, - error: function(error) { - console.log(error); - } - }); - }); + }); - $('#markAllAsRead').on('click', function() { - const csrfToken = $('meta[name="csrf-token"]').attr('content'); - console.log("Berhasil"); - - $.ajaxSetup({ - headers: { - 'X-CSRF-TOKEN': csrfToken - } }); - $.ajax({ - url: "{{ route('user.notification.mark-all-as-read') }}", - type: 'GET', - success: function(response) { - if (response.status) { + $('#markAllAsRead').on('click', function() { + const csrfToken = $('meta[name="csrf-token"]').attr('content'); + + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': csrfToken + } + }); + + $.ajax({ + url: "{{ route('user.notification.mark-all-as-read') }}", + type: 'GET', + success: function(response) { + if (response.status) { + removeNotif(); + } else { + console.log(response); + } + }, + error: function(error) { + console.log(error); + } + }); + }); + + // Pusher.logToConsole = true; + var pusher = new Pusher('3e5bdc20dddd7fbc655e', { + cluster: 'ap1' + }); + + var channel = pusher.subscribe('chanel-update-notifikasi'); + + channel.bind('event-update-notifikasi', function(data) { + let receivers = data.receivers; + let userEmail = "{{ auth()->user()->email }}"; + if (Array.isArray(receivers)) { + receivers.forEach(email => { + if (email == userEmail) { + updateNotif(); + } + }); + } else { + if (receivers == userEmail) { updateNotif(); - console.log(response); - } else { - console.log(response); } - }, - error: function(error) { - console.log(error); } + console.log(data); }); }); - - Pusher.logToConsole = true; - var pusher = new Pusher('3e5bdc20dddd7fbc655e', { - cluster: 'ap1' - }); - - var channel = pusher.subscribe('chanel-update-notifikasi'); - - channel.bind('event-update-notifikasi', function(data) { - let receivers = data.receivers; - let userEmail = "{{ auth()->user()->email }}"; - receivers.forEach(email => { - if (email == userEmail) { - updateNotif(); - } - }); - }); - }); -</script> + </script> +@endsection diff --git a/resources/views/layouts/main.blade.php b/resources/views/layouts/main.blade.php index 8477d7f..b62dec6 100644 --- a/resources/views/layouts/main.blade.php +++ b/resources/views/layouts/main.blade.php @@ -9,6 +9,8 @@ @include('layouts.css') + @yield('css-tambahan') + @include('layouts.js') </head> @@ -29,8 +31,16 @@ @include('layouts.footer') </footer> + @yield('js-khusus') + @include('layouts.js-bawah') + @yield('js-header') + + @yield('js-sidebar') + + @yield('tambahan-js') + </body> </html> diff --git a/resources/views/layouts/sidebar.blade.php b/resources/views/layouts/sidebar.blade.php index 448aed9..389b0ee 100644 --- a/resources/views/layouts/sidebar.blade.php +++ b/resources/views/layouts/sidebar.blade.php @@ -17,14 +17,14 @@ @if (Auth::user()->role == 'Admin') <li><a class="nav-link {{ request()->routeIs('admin-user.index') ? 'active' : '' }}" - href="{{ route('admin-user.index') }}"><i class="far fa-user"></i> - <span>User</span></a></li> + href="{{ route('admin-user.index') }}" id="clickUser"><i class="far fa-user"></i> + <span id="userBeep">User</span></a></li> <li><a class="nav-link {{ request()->routeIs('admin-transaction.index') ? 'active' : '' }}" - href="{{ route('admin-transaction.index') }}"><i - class="fas fa-columns"></i><span>Transaction</span></a></li> + href="{{ route('admin-transaction.index') }}" id="clickTransaction"><i + class="fas fa-columns"></i><span id="transactionBeep">Transaction</span></a></li> <li><a class="nav-link {{ request()->routeIs('admin-refund.index') ? 'active' : '' }}" - href="{{ route('admin-refund.index') }}"><i class="far fa-square"></i> - <span>Refund</span></a> + href="{{ route('admin-refund.index') }}" id="clickRefund"><i class="far fa-square"></i> + <span id="refundBeep">Refund</span></a> </li> <li><a class="nav-link {{ request()->routeIs('admin-setting.index') ? 'active' : '' }}" href="{{ route('admin-setting.index') }}"><i class="fas fa-cog"></i> @@ -73,4 +73,52 @@ </ul> </aside> </div> -<script src="{{ asset('assets/modules/nicescroll/jquery.nicescroll.min.js') }}"></script> +@section('js-khusus') + <script src="{{ asset('assets/modules/nicescroll/jquery.nicescroll.min.js') }}"></script> +@endsection +@section('js-sidebar') + <script> + $(document).ready(function() { + + function updateNotifSideBar(layanan) { + layanan.addClass("beep"); + } + + function removeNotifSideBar(layanan) { + layanan.removeClass("beep"); + } + + $('#clickRefund').on('click', function() { + removeNotifSideBar($('#refundBeep')); + }); + + $('#clickTransaction').on('click', function() { + removeNotifSideBar($('#transactionBeep')); + }); + + $('#clickUser').on('click', function() { + removeNotifSideBar($('#userBeep')); + }); + + var pusher = new Pusher('3e5bdc20dddd7fbc655e', { + cluster: 'ap1' + }); + + var channel = pusher.subscribe('chanel-update-notifikasi-untuk-admin'); + + channel.bind('event-update-notifikasi-untuk-admin', function(data) { + let service = data.service; + let userEmail = "{{ auth()->user()->email }}"; + if ("{{ auth()->user()->role }}" == 'Admin') { + if (service == 'Refund') { + updateNotifSideBar($('#refundBeep')); + } else if (service == 'Transaksi') { + updateNotifSideBar($('#transactionBeep')); + } else if (service == 'User') { + updateNotifSideBar($('#userBeep')); + } + } + }); + }); + </script> +@endsection diff --git a/resources/views/profile/index.blade.php b/resources/views/profile/index.blade.php index 9c8e1b1..9f8a7fd 100644 --- a/resources/views/profile/index.blade.php +++ b/resources/views/profile/index.blade.php @@ -351,8 +351,8 @@ </div> </section> </div> - - {{-- profile --}} +@endsection +@section('tambahan-js') <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> <script> document.addEventListener("DOMContentLoaded", function() { @@ -683,5 +683,4 @@ }); }); </script> - {{-- profile --}} @endsection diff --git a/routes/api.php b/routes/api.php index 2585a3b..b7ce00a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,6 +9,7 @@ use App\Http\Controllers\API\Penjual\PenjualApiController; use App\Http\Controllers\API\Profile\ProfileApiController; use App\Http\Controllers\API\Transaction\TransactionApiController; use App\Http\Controllers\API\Invoice\InvoiceApiController; +use App\Http\Controllers\API\Notification\NotificationApiController; use Illuminate\Support\Facades\Auth; /* @@ -103,6 +104,12 @@ Route::middleware(['auth:api'])->group(function () { Route::get('get-invoice', 'getInvoice')->name('invoice.get-invoice'); // Bisa Route::get('export-invoice', 'exportInvoice')->name('invoice.export-invoice'); // Bisa }); // sudah + + Route::controller(NotificationApiController::class)->group(function(){ + Route::get('list-notification','listNotification')->name('notification.list-notification'); + Route::get('get-detail-notification','getDetailNotification')->name('notification.get-detail-notification'); + Route::get('mark-all-as-read','markAllAsRead')->name('notification.mark-all-as-read'); + }); }); }); }); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 27b034d..cc36c37 100644 --- a/routes/web.php +++ b/routes/web.php @@ -89,6 +89,7 @@ Route::middleware(['auth'])->group(function(){ // Tampilan dashboard admin beserta perhitungan Route::controller(AdminDashboardController::class)->group(function(){ Route::get('/','index')->name('admin.index'); + Route::get('admin-dashboard/get-data-dashboard','getDataBySearch')->name('admin.get-data-dashboard'); }); // Tampilan, aprove atau deny dan hapus user @@ -96,7 +97,7 @@ Route::middleware(['auth'])->group(function(){ Route::get('admin-user','index')->name('admin-user.index'); Route::get('admin-user/list-user','listUser')->name('admin-user.list-user'); Route::get('admin-user/{id}','show')->name('admin-user.show'); - Route::delete('admin-user/hapus-user','delete')->name('admin-user.destroy'); + Route::delete('admin-user/hapus-user','destroy')->name('admin-user.destroy'); Route::put('admin-user/approve-user', 'approveUser')->name('admin-user.approve'); Route::put('admin-user/deny-user', 'denyUser')->name('admin-user.deny'); }); @@ -137,7 +138,7 @@ Route::middleware(['auth'])->group(function(){ Route::get('admin-notification/list-user-for-create-edit','listUserForCreateEdit')->name('admin-notification.list-user-for-create-edit'); Route::get('admin-notification/select-all-user','selectAllUser')->name('admin-notification.select-all-user'); Route::get('admin-notification/edit','edit')->name('admin-notification.edit'); - Route::post('admin-notification/update-new-notification','updateNewNotification')->name('admin-notification.update-new-notification'); + Route::get('admin-notification/update-new-notification','updateNewNotification')->name('admin-notification.update-new-notification'); Route::post('admin-notification/store','store')->name('admin-notification.store'); Route::post('admin-notification/update','update')->name('admin-notification.update'); Route::delete('admin-notification/delete','delete')->name('admin-notification.delete'); @@ -152,6 +153,7 @@ Route::middleware(['auth'])->group(function(){ // Tampilan dashboard user beserta perhitungan Route::controller(UserDashboardController::class)->group(function(){ Route::get('/','index')->name('user.index'); + Route::get('user-dashboard/get-data-dashboard','getDataBySearch')->name('user.get-data-dashboard'); }); // Tampilan, tambah dan hapus kontak @@ -201,7 +203,7 @@ Route::middleware(['auth'])->group(function(){ Route::controller(UserRefundController::class)->group(function(){ Route::get('user-refund','index')->name('user-refund.index'); Route::get('user-refund/list-refund','listRefund')->name('user-refund.list-refund'); - Route::get('user-refund/ajukan-komplain','create')->name('user-refund.create'); + Route::get('user-refund/ajukan-komplain/{id}','create')->name('user-refund.create'); Route::get('user-refund/detail-refund/{id}','show')->name('user-refund.show'); Route::post('user-refund','store')->name('user-refund.store'); }); @@ -212,6 +214,8 @@ Route::middleware(['auth'])->group(function(){ Route::get('user-notification/detail-notification/{id}','show')->name('user-notifiaction.detail-notification'); Route::get('user-notification/latest-notification','latestNotification')->name('user-notification.latest-notification'); Route::get('user-notification/mark-all-as-read','markAllAsRead')->name('user.notification.mark-all-as-read'); + Route::get('user-notification/update-new-notification','updateNewNotification')->name('user-notification.update-new-notification'); + Route::get('user-notification/update-notification-to-admin','updateNotificationToAdmin')->name('user-notification.update-notification-to-admin'); }); }); });