mirror of
https://gitlab.com/omair-personal/exchange.git
synced 2026-08-19 12:34:13 +00:00
105b61eab3
updated chinabankslip error message to be more clear fixed supplier booking report loading button updated upload invoice frontend to show user po image
665 lines
22 KiB
PHP
665 lines
22 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 ."/7)";
|
|
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;
|
|
case 7:
|
|
$status_desc = "Order Completed";
|
|
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 ."/7)";
|
|
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 = "Upload China Bankslip";
|
|
break;
|
|
case 6:
|
|
$status_desc = "Customer has uploaded the invoice, please upload purchase order";
|
|
break;
|
|
case 7:
|
|
$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)
|
|
{
|
|
$term = $request->input('term');
|
|
$amount = $request->input("amount"); // in RMB
|
|
$rates = Rate::orderby('updated_at','desc')->first();
|
|
$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);
|
|
}
|
|
//upload
|
|
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);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'file' => 'max:3072'
|
|
]);
|
|
|
|
if($validator->fails())
|
|
{
|
|
return response()->json(['message'=>'Image too large, upload files up to 3 MB'], 400);
|
|
}
|
|
|
|
if($bankslip_file = $request->file('file'))
|
|
{
|
|
/* End Validation */
|
|
$filename = $bankslip_file->getClientOriginalName();
|
|
$ext = $bankslip_file->getClientOriginalExtension();
|
|
|
|
|
|
$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);
|
|
}
|
|
else {
|
|
return response()->json(['message' => 'No file detected'], 400);
|
|
}
|
|
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'file' => 'max:3072'
|
|
]);
|
|
|
|
if($validator->fails())
|
|
{
|
|
return response()->json(['message'=>'Image too large, upload files up to 3 MB'], 400);
|
|
}
|
|
|
|
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->booking_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();
|
|
|
|
$purchase_order = $booking->purchaseOrder()->first();
|
|
|
|
if(!$purchase_order){
|
|
return response()->json(["message"=> "Please upload your purchase order"],400);
|
|
}
|
|
|
|
$booking->status = 6;
|
|
$booking->save();
|
|
return response()->json(['message'=>'Success'],200);
|
|
}
|
|
|
|
public function showPurchaseOrder($id){
|
|
$booking = Booking::where('id',$id)->first();
|
|
$user_po = $booking->purchaseOrder()->first();
|
|
|
|
if($user_po){
|
|
return response()->json(['user_po_path'=> $user_po->image_path ],200);
|
|
}
|
|
|
|
return response()->json(['message'=> 'waiting customer to upload their po'],400);
|
|
}
|
|
|
|
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);
|
|
}
|
|
//upload
|
|
public function uploadInvoice(Request $request, $id)
|
|
{
|
|
$booking = Booking::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);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'invoice_path' => 'max:3072'
|
|
]);
|
|
|
|
if($validator->fails())
|
|
{
|
|
return response()->json(['message'=>'Image too large, upload files up to 3 MB'], 400);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
public function confirmSupplier(Request $request, $id)
|
|
{
|
|
$booking = Booking::where('id', $id)->firstOrFail();
|
|
$booking->status = 4; // processing transfer
|
|
$booking->admin_status = 5; // upload china bankslip
|
|
|
|
if($booking->save()){
|
|
return response()->json(['message'=>"Success"],200);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|