where('user_id',Auth::user()->id) ->get(); // reformat to fit frontend structure foreach ($bookings as $booking) { // set timeout $date1 = new DateTime($booking->created_at); $date2 = new DateTime(); $difference_in_seconds = ($date1->format('U') + 600) - ($date2->format('U')); $booking->timeout = $difference_in_seconds; // TODO : you can make it better if($difference_in_seconds < 0 ){ $booking->timeout = 0; } // TODO : transfer_amount change name to bia $booking->transfer_amount = $booking->bia; $booking->track_status = "(". $booking->status ."/6)"; switch ($booking->status) { case 1: $booking->status_desc = "Order in progress"; case 2: $booking->status_desc = "Waiting for payment"; case 3: $booking->status_desc = "Waiting verification"; case 4: $booking->status_desc = "Processing transfer"; case 5: $booking->status_desc = "Transfer Complete, please upload your PO"; case 6: $booking->status_desc = "Processing invoice"; default: $booking->status_desc = ""; } } return $bookings; } public function show($id) { $booking = Booking::where('user_id',Auth::user()->id)->where('id', $id)->first(); $date1 = new DateTime($booking->created_at); $date2 = new DateTime(); $difference_in_seconds = ($date1->format('U') + 600) - ($date2->format('U')); $booking->timeout = $difference_in_seconds; if (!$booking){ return response()->json(['success'=>false, 'message'=>'not found'], 404); } return $booking; } public function store(Request $request) { $rates = Rate::orderby('updated_at','desc')->first(); $term = $request->input('term'); $amount = $request->input("amount"); $user = Auth::user(); $rate = 1; // default rate to 1 switch ($term) { case "x1_cash": $rate = $rates->x1_cash; break; case "x1_cheque": $rate = $rates->x1_cheque; break; case "x1_ba": $rate = $rates->x1_ba; break; case "x2_cash": $rate = $rates->x2_cash; break; case "x2_cheque": $rate = $rates->x2_cheque; break; case "x2_ba": $rate = $rates->x2_ba; break; default: return response()->json([ 'success' => false, 'message' => 'Invalid input', ], 422); break; } // Service charge (RMB) : if amount higher than 10,000, no service charge. if amount lower than 10,000, 20.00 service charge if ($amount >= 10000 && ($term == 'x2_cash' || $term = 'x2_cheque' || $term = 'x2_ba')) { $svcharge = 0; } else { $svcharge = 20.00; } // initial rmb to myr amount $RMBinMYR = (($amount + $svcharge) / $rate); // TODO : Should be remove this ? // gst 0% $gst = 0 * $RMBinMYR; // Sales tax : 10 % $sales_tax = 0.10 * $RMBinMYR; // Billing fees : 1.5% $billing = 0.015 * $RMBinMYR; // Bank in amount $bia = round($RMBinMYR + $gst + $sales_tax + $billing, 2); $booking = new Booking(); $booking->account_name = $request->input('account_name'); $booking->account_num = $request->input('account_num'); $booking->bank_name = $request->input('bank_name'); $booking->bank_branch = $request->input('bank_branch'); $booking->amount = $request->input('amount'); $booking->term = $term; $booking->rate_id = $rates->id; $booking->rate = $rate; $booking->rmb_book_amount = $request->input('amount'); $booking->status = 2; $booking->bia = $bia; // $booking->user_id = $user->id; $booking->user()->associate($user); // The test failed due to ->save() before filling up the information at below // TODO : handle RMB, MYR and USD (we can use exchange type: USDtoMYR, RMBtoMYR vise versa to switch case) // $booking->rmb_book_pay_method = $request->input('payment_method'); // $booking->rmb_book_account_name = $request->input('rmb_book_account_name'); // $booking->rmb_book_acc_no = $request->input('rmb_book_acc_no'); // $booking->rmb_book_bank_branch = $request->input('rmb_book_bank_branch'); // $booking->company_name = $request->input('company_name'); // $booking->company_address = $request->input('company_address'); // $booking->bank_address = $request->input('bank_address'); // $booking->swift_code = $request->input('swift_code'); // $booking->cnap = $request->input('cnap'); // $booking->term = $request->input('term'); // $booking->usd_book_amount = $request->input('usd_book_amount'); // $booking->usd_book_pay_method = $request->input('usd_book_pay_method'); // $booking->usd_book_company_name = $request->input('usd_book_company_name'); // $booking->usd_book_company_address = $request->input('usd_book_company_address'); // $booking->usd_book_swift_code = $request->input('usd_book_swift_code'); // $booking->usd_book_cnap = $request->input('usd_book_cnap'); // $booking->usd_book_bank_branch = $request->input('usd_book_bank_branch'); // $booking->verification_status = $request->input('verification_status'); $booking->save(); return response()->json($booking, 201); } public function update(Request $request, $book_id) { $book_id = Booking::find($book_id); $book_id->account_name = $request->input('account_name'); $book_id->account_num = $request->input('account_num'); $book_id->bank_name = $request->input('bank_name'); $book_id->bank_branch = $request->input('bank_branch'); $book_id->company_name = $request->input('company_name'); $book_id->company_address = $request->input('company_address'); $book_id->bank_address = $request->input('bank_address'); $book_id->swift_code = $request->input('swift_code'); $book_id->cnap = $request->input('cnap'); $book_id->save(); return response()->json(['book_id'=>$book_id],200); } public function uploadbankslip(Request $request, $id) { $booking = Booking::where('user_id',Auth::user()->id)->where('id',$id)->first(); /* Validation*/ if (!$booking) { return response()->json(['message'=>'Access denied'], 200); } $validator = Validator::make($request->all(), [ 'file' => 'image|mimes:jpg,jpeg,bmp,png' ]); if($validator->fails()) { return response()->json(['message'=>'Incorrect format'],200); } if(!$bankslip_file = $request->file('file')) { return response()->json(['message' => 'No file detected'], 400); } /* End Validation */ $filename = $bankslip_file->getClientOriginalName(); $ext = $bankslip_file->getClientOriginalExtension(); $input['file'] = $filename; $unique_name = 'bank_slip_' . md5($filename. time()); // probably not a good idea $unique_image_url = $unique_name. '.' .$ext; Storage::putFileAs( 'user_bankslip', $bankslip_file, $unique_image_url ); $user_bankslip = new UserBankSlip; $user_bankslip->booking_id = $booking->id; $user_bankslip->bankslip_url = $unique_image_url; $user_bankslip->transfer_amount = $request->input('transfer_amount'); $user_bankslip->save(); return response()->json(['message'=>"Success"],200); } public function updateBankSlipAmount(Request $request, $id){ $booking = Booking::where('user_id',Auth::user()->id)->where('id',$id)->first(); $user_bankslip = $booking->userBankSlip()->first(); if(!$user_bankslip){ return response()->json(["message"=> "not found"],400); } $user_bankslip->transfer_amount = $request->input('transfer_amount'); $user_bankslip->save(); return response()->json(["message"=> "Success"],200); } public function uploadPurchaseOrder(Request $request, $id) { $booking = Booking::where('user_id',Auth::user()->id)->where('id',$id)->first(); /* Validation */ if (!$booking) { return response()->json(['message'=>'Access denied'], 200); } $validator = Validator::make($request->all(), [ 'file' => 'image|mimes:jpg,jpeg,bmp,png' ]); if($validator->fails()) { return response()->json(['message'=>'Incorrect format'],200); } if(!$user_input_file = $request->file('file')) { return response()->json(['message' => 'No file detected'], 400); } /* End Validation */ $filename = $user_input_file->getClientOriginalName(); $ext = $user_input_file->getClientOriginalExtension(); $input['file'] = $filename; $unique_name = 'purchase_order_' . md5($filename. time()); $unique_image_url = $unique_name. '.' .$ext; Storage::putFileAs( 'file',/*folder name*/ $user_input_file, $unique_image_url ); $user_po = new PurchaseOrder; $user_po->image_url = $unique_image_url; $user_po->book_id = $booking->id; $user_po->amount = $request->input('amount'); $user_po->save(); return response()->json(['message'=>'Success'],200); } public function delete(Booking $book_id) { $booking = Booking::where('user_id', Auth::user())->where('id', $book_id)->firstOrFail(); $booking->delete($book_id); return response()->json($book_id, 204); } public function cancel(Request $request, $book_id) { if (!$booking = Booking::where('user_id',Auth::user()->id)->where('id',$book_id)->first()) { return response()->json(['message'=>'Access denied'], 200); } $booking->is_cancel = true; $booking->save(); return response()->json(['message'=>'Success'],200); } public function calculation(Request $request){ $amount = $request->input('amount'); $term = $request->input('term'); $china_beneficiary = $request->input('china_beneficiary'); $rates = Rate::orderby('updated_at','desc')->first(); // TODO : get marking $marking = "123X"; switch ($term) { case "x1_cash": $rate = $rates->x1_cash; $payment_method = "cash"; break; case "x1_cheque": $rate = $rates->x1_cheque; $payment_method = "Cheque"; break; case "x1_ba": $rate = $rates->x1_ba; $payment_method = "BA"; break; case "x2_cash": $rate = $rates->x2_cash; $payment_method = "Cash"; break; case "x2_cheque": $rate = $rates->x2_cheque; $payment_method = "Cheque"; break; case "x2_ba": $rate = $rates->x2_ba; $payment_method = "BA"; break; default: return response()->json([ 'success' => false, 'message' => 'Invalid input', ], 422); break; } if ($amount >= 10000 && ($term == 'x2_cash' || $term = 'x2_cheque' || $term = 'x2_ba')) { $svcharge = 0; } else { $svcharge = 20.00; } $bankin_amount = round(($amount + $svcharge) / $rate + (0 * ($amount + $svcharge)), 2); return response()->json([ 'date' => date('Y-m-d'), 'marking' => $marking, 'amount' => $amount, 'payment_method' => $payment_method, 'service_charge' => $svcharge, 'rate' => $rate, 'bankin_amount' => $bankin_amount, 'china_beneficary' => $china_beneficiary ], 200); } public function approveBankSlip(Request $request, $book_id) { if (!$booking = Booking::where('user_id',Auth::user()->id)->where('id',$book_id)->first()) { return response()->json(['message'=>'Access denied'], 200); } if(!$userBankSlip = UserBankSlip::where('book_id',$booking->id)->first()) { return response()->json(['message'=>'Access denied'], 200); } // Rejected bankslip cannot be approve again if($userBankSlip->is_reject == 1) { return response()->json(['message'=>'Bankslip already rejected'],200); } $userBankSlip->is_approve = 1; $userBankSlip->save(); return response()->json(['message'=>'Success'],200); } public function rejectBankSlip(Request $request, $book_id) { if (!$booking = Booking::where('user_id',Auth::user()->id)->where('id',$book_id)->first()) { return response()->json(['message'=>'Access denied'], 200); } if(!$userBankSlip = UserBankSlip::where('book_id',$booking->id)->first()) { return response()->json(['message'=>'Access denied'], 200); } // approved bankslip cannot be reject again if($userBankSlip->is_approve == 1) { return response()->json(['message'=>'Bankslip already approved'],200); } $userBankSlip->is_reject = 1; $userBankSlip->reject_reason = $request->reject_reason; $userBankSlip->save(); return response()->json(['message'=>'Success'],200); } }