mirror of
https://gitlab.com/omair-personal/exchange.git
synced 2026-08-19 20:44:13 +00:00
fd03f5b248
updated update status upon userbankslip approved updated update status upon userbankslip rejected updated supplier index to display value and label for input select updated supplierBooking frontend completed booking accept and reject integration
599 lines
20 KiB
PHP
599 lines
20 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\PurchaseOrder;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use App\Booking;
|
|
use App\Rate;
|
|
use App\UserBankSlip;
|
|
use App\User;
|
|
use App\Invoice;
|
|
use App\SettingCredit;
|
|
use Auth;
|
|
use Validator;
|
|
use DateTime;
|
|
|
|
class BookingController extends Controller
|
|
{
|
|
|
|
public function index(){
|
|
$user = Auth::user();
|
|
$bookings = Booking::select('id', 'created_at', 'status', 'rate', 'term', 'amount', 'bia', 'verification_status')
|
|
->where('user_id', $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:
|
|
$status_desc = "Order in progress";
|
|
break;
|
|
case 2:
|
|
$status_desc = "Waiting for payment";
|
|
break;
|
|
case 3:
|
|
$status_desc = "Waiting verification";
|
|
break;
|
|
case 4:
|
|
$status_desc = "Processing transfer";
|
|
break;
|
|
case 5:
|
|
$status_desc = "Transfer Complete, please upload your PO";
|
|
break;
|
|
case 6:
|
|
$status_desc = "Processing invoice";
|
|
break;
|
|
default:
|
|
$status_desc = "";
|
|
}
|
|
$booking->status_desc = $status_desc;
|
|
}
|
|
|
|
return $bookings;
|
|
}
|
|
|
|
public function adminIndex(){
|
|
$user = Auth::user();
|
|
$bookings = Booking::select('id', 'created_at', 'admin_status', 'rate', 'term', 'amount', 'bia', 'verification_status')
|
|
->get();
|
|
|
|
// reformat to fit frontend structure
|
|
foreach ($bookings as $booking) {
|
|
// set timeout
|
|
$date1 = new DateTime($booking->created_at);
|
|
$date2 = new DateTime();
|
|
$time_in_seconds = SettingCredit::orderby('updated_at','desc')->first()->time_limit;
|
|
$difference_in_seconds = ($date1->format('U') + $time_in_seconds) - ($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->admin_status ."/6)";
|
|
switch ($booking->admin_status) {
|
|
case 0:
|
|
$status_desc = "Waiting user to upload bankin slip";
|
|
break;
|
|
case 1:
|
|
$status_desc = "Waiting for verification";
|
|
break;
|
|
case 2:
|
|
$status_desc = "Bookg with supplier";
|
|
break;
|
|
case 3:
|
|
$status_desc = "Supplier booking report. Please confirm with your booking.";
|
|
break;
|
|
case 4:
|
|
$status_desc = "Please update supplier booking status.";
|
|
break;
|
|
case 5:
|
|
$status_desc = "Customer has uploaded the invoice, please upload purchase order";
|
|
break;
|
|
case 6:
|
|
$status_desc = "Booking completed";
|
|
break;
|
|
default:
|
|
$status_desc = "";
|
|
}
|
|
$booking->status_desc = $status_desc;
|
|
}
|
|
|
|
return $bookings;
|
|
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$booking = Booking::where('user_id',Auth::user()->id)->where('id', $id)->first();
|
|
|
|
if($booking){
|
|
$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 adminShow($id)
|
|
{
|
|
$booking = Booking::where('id', $id)->first();
|
|
$user_bankslip_path = $booking->userBankSlip()->first()->bankslip_path;
|
|
$booking->user_bankslip_path = Storage::url($user_bankslip_path);
|
|
|
|
if($booking){
|
|
$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"); // in RMB
|
|
$creditLimit = SettingCredit::orderby('updated_at','desc')->first();
|
|
|
|
if (!$creditLimit){
|
|
return response()->json("Credit limit not set, please contact admin", 405);
|
|
}
|
|
|
|
if($amount > $creditLimit->rmb_credit_limit){
|
|
return response()->json("Exceed credit limit, need approved from admin", 401);
|
|
}
|
|
|
|
$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_path = $unique_name. '.' .$ext;
|
|
|
|
$upload_path = Storage::disk('public')->putFileAs(
|
|
'user_bankslip', $bankslip_file, $unique_image_path
|
|
);
|
|
|
|
$user_bankslip = new UserBankSlip;
|
|
$user_bankslip->booking_id = $booking->id;
|
|
$user_bankslip->bankslip_path = $upload_path;
|
|
$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);
|
|
}
|
|
|
|
// update booking status
|
|
$booking->status = 3;
|
|
$booking->admin_status = 2;
|
|
$booking->save();
|
|
|
|
$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_path = $unique_name. '.' .$ext;
|
|
$upload_path = Storage::disk('public')->putFileAs(
|
|
'purchase_order',/*folder name*/ $user_input_file, $unique_image_path, 'public'
|
|
);
|
|
|
|
$user_po = new PurchaseOrder;
|
|
$user_po->image_path = $upload_path;
|
|
$user_po->book_id = $booking->id;
|
|
$user_po->save();
|
|
|
|
return response()->json(['message'=>'Success'],200);
|
|
}
|
|
|
|
public function confirmPurchaseOrder($id){
|
|
$booking = Booking::where('user_id',Auth::user()->id)->where('id',$id)->first();
|
|
$booking->status = 5;
|
|
$booking->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)
|
|
{
|
|
$booking = Booking::where('id',$book_id)->first();
|
|
|
|
if (!$booking)
|
|
{
|
|
return response()->json(['message'=>'Booking not found'], 400);
|
|
}
|
|
|
|
if(!$userBankSlip = UserBankSlip::where('booking_id',$booking->id)->first())
|
|
{
|
|
return response()->json(['message'=>'User bankslip not found'], 400);
|
|
}
|
|
|
|
// Rejected bankslip cannot be approve again
|
|
if($userBankSlip->is_reject == 1)
|
|
{
|
|
return response()->json(['message'=>'Bankslip already rejected'],200);
|
|
}
|
|
|
|
$userBankSlip->is_approve = 1;
|
|
$userBankSlip->estimated_arrival_time = $request->input('estimated_arrival_time');
|
|
$userBankSlip->save();
|
|
|
|
// update booking status
|
|
$booking->status = 4;
|
|
$booking->admin_status = 3;
|
|
$booking->save();
|
|
|
|
return response()->json(['message'=>'Success'],200);
|
|
}
|
|
|
|
public function rejectBankSlip(Request $request, $book_id)
|
|
{
|
|
$booking = Booking::where('id',$book_id)->first();
|
|
if (!$booking)
|
|
{
|
|
return response()->json(['message'=>'Access denied'], 200);
|
|
}
|
|
|
|
if(!$userBankSlip = UserBankSlip::where('booking_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();
|
|
|
|
// TODO : reject user bankinslip
|
|
// update booking status
|
|
$booking->status = 0;
|
|
$booking->admin_status = 0;
|
|
$booking->save();
|
|
|
|
return response()->json(['message'=>'Success'],200);
|
|
}
|
|
|
|
public function uploadInvoice(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(), [
|
|
'invoice_path' => 'mimes:jpg,jpeg,bmp,png,pdf,doc,docx'
|
|
]);
|
|
|
|
if($validator->fails())
|
|
{
|
|
return response()->json(['message'=>'Incorrect format'],200);
|
|
}
|
|
|
|
if(!$input_file = $request->file('invoice_path'))
|
|
{
|
|
return response()->json(['message'=>'No file detected'], 400);
|
|
}
|
|
/* End Validation */
|
|
|
|
$filename = $input_file->getClientOriginalName();
|
|
$ext = $input_file->getClientOriginalExtension();
|
|
|
|
$input['invoice_path'] = $filename;
|
|
$unique_name = 'invoice' . md5($filename. time());
|
|
$unique_file_url = $unique_name. '.' .$ext;
|
|
$upload_path = Storage::disk('public')->putFileAs(
|
|
'invoice',/*folder name*/ $input_file, $unique_file_url, 'public'
|
|
);
|
|
|
|
$invoice = new Invoice;
|
|
$invoice->invoice_path = $upload_path;
|
|
$invoice->amount = $request->input('amount');
|
|
$invoice->booking_id = $booking->id;
|
|
$invoice->save();
|
|
|
|
return response()->json(['message'=>"Success"],200);
|
|
}
|
|
|
|
}
|