diff --git a/app/Booking.php b/app/Booking.php
index 5a1c2e0e..24990028 100644
--- a/app/Booking.php
+++ b/app/Booking.php
@@ -38,7 +38,7 @@ class Booking extends Model
}
public function chinaBankSlip(){
- return $this->hasOne(ChinaBankSlip::class);
+ return $this->hasMany(ChinaBankSlip::class);
}
public function userBankSlip(){
diff --git a/app/Http/Controllers/BookingController.php b/app/Http/Controllers/BookingController.php
index e5f350c3..dd00550d 100644
--- a/app/Http/Controllers/BookingController.php
+++ b/app/Http/Controllers/BookingController.php
@@ -11,6 +11,8 @@ use App\UserBankSlip;
use App\User;
use App\Invoice;
use App\SettingCredit;
+use App\SettingTaxRate;
+use App\SettingBillingCharge;
use Auth;
use Validator;
use DateTime;
@@ -149,7 +151,7 @@ class BookingController extends Controller
$booking = Booking::where('user_id',Auth::user()->id)->where('id', $id)->first();
$user_bankslip = $booking->userBankSlip()->first();
- $china_bankslip = $booking->chinaBankSlip()->first();
+ $china_bankslip = $booking->chinaBankSlip()->get();
$po = $booking->purchaseOrder()->first();
$invoice = $booking->invoice()->first();
@@ -164,7 +166,10 @@ class BookingController extends Controller
}
if($china_bankslip){
- $booking->china_bankslip_path = Storage::url($china_bankslip->china_bank_slip_path);
+ for($index = 0;$index < $booking->chinaBankSlip()->count();$index++){
+ $china_bankslip[$index] = Storage::url($china_bankslip[$index]->china_bank_slip_path);
+ }
+ $booking->china_bankslip_path = $china_bankslip;
}
if($po){
@@ -197,12 +202,11 @@ class BookingController extends Controller
$user_bankslip = $booking->userBankSlip()->first();
- $china_bankslip = $booking->chinaBankSlip()->first();
+ $china_bankslip = $booking->chinaBankSlip()->get();
$po = $booking->purchaseOrder()->first();
$invoice = $booking->invoice()->first();
if($booking){
-
if ($user_bankslip){
$booking->user_bankslip_path = Storage::url($user_bankslip->bankslip_path);
$booking->reject_reason = $user_bankslip->reject_reason;
@@ -210,7 +214,10 @@ class BookingController extends Controller
}
if($china_bankslip){
- $booking->china_bankslip_path = Storage::url($china_bankslip->china_bank_slip_path);
+ for($index = 0;$index < $booking->chinaBankSlip()->count();$index++){
+ $china_bankslip[$index] = Storage::url($china_bankslip[$index]->china_bank_slip_path);
+ }
+ $booking->china_bankslip_path = $china_bankslip;
}
if($po){
@@ -372,16 +379,16 @@ class BookingController extends Controller
/* Validation*/
if (!$booking)
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'], 403);
}
$validator = Validator::make($request->all(), [
- 'file' => 'image|mimes:jpg,jpeg,bmp,png'
+ 'file' => 'mimes:jpg,jpeg,bmp,png,xls,xlsx,doc,docx,pdf'
]);
if($validator->fails())
{
- return response()->json(['message'=>'Incorrect format'],200);
+ return response()->json(['message'=>'Incorrect format'],400);
}
$validator = Validator::make($request->all(), [
@@ -452,16 +459,16 @@ class BookingController extends Controller
/* Validation */
if (!$booking)
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'], 403);
}
$validator = Validator::make($request->all(), [
- 'file' => 'image|mimes:jpg,jpeg,bmp,png'
+ 'file' => 'mimes:jpg,jpeg,bmp,png,xls,xlsx,doc,docx,pdf'
]);
if($validator->fails())
{
- return response()->json(['message'=>'Incorrect format'],200);
+ return response()->json(['message'=>'Incorrect format'],400);
}
$validator = Validator::make($request->all(), [
@@ -470,12 +477,12 @@ class BookingController extends Controller
if($validator->fails())
{
- return response()->json(['message'=>'Image too large, upload files up to 3 MB'], 400);
+ return response()->json(['message'=>'File too large, upload files up to 3 MB'], 400);
}
if(!$user_input_file = $request->file('file'))
{
- return response()->json(['message' => 'No file detected'], 400);
+ return response()->json(['message' => 'No file detected'], 404);
}
/* End Validation */
@@ -495,7 +502,8 @@ class BookingController extends Controller
$user_po->save();
$booking->status = 6;
- $booking->admin_status = 7;
+ // $booking->admin_status = 7;
+ $booking->admin_status = 6;
$booking->save();
return response()->json(['message'=>'Success'],200);
@@ -523,7 +531,7 @@ class BookingController extends Controller
{
if (!$booking = Booking::where('user_id',Auth::user()->id)->where('id',$book_id)->first())
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'],403);
}
$booking->is_cancel = true;
@@ -539,6 +547,8 @@ class BookingController extends Controller
$china_beneficiary = $request->input('china_beneficiary');
$rates = Rate::orderby('updated_at','desc')->first();
$marking = $user = Auth::user()->marking;
+ $taxrate = SettingTaxRate::latest()->first()->tax_rate;
+ $billingChargeRate = SettingBillingCharge::latest()->first()->billing_charge_rate;
$creditLimit = SettingCredit::orderby('updated_at','desc')->first();
@@ -589,18 +599,24 @@ class BookingController extends Controller
} else {
$svcharge = 20.00;
}
-
- $bankin_amount = round(($amount + $svcharge) / $rate + (0 * ($amount + $svcharge)), 2);
+
+ $subtotal = round($amount + $svcharge / $rate,2);
+ $taxAmount = round($subtotal * $taxrate,2);
+ $billingChargeAmount = round(($amount + $svcharge) * $billingChargeRate, 2);
+ $bankin_amount = round($subtotal + $taxAmount + $billingChargeAmount , 2);
return response()->json([
'date' => date('Y-m-d'),
'marking' => $marking,
- 'amount' => $amount,
'payment_method' => $payment_method,
+ 'china_beneficary' => $china_beneficiary,
+ 'amount' => $amount,
'service_charge' => $svcharge,
'rate' => $rate,
+ 'subtotal' => $subtotal,
+ 'taxAmount' => $taxAmount,
+ 'billingChargeAmount' => $billingChargeAmount,
'bankin_amount' => $bankin_amount,
- 'china_beneficary' => $china_beneficiary
], 200);
}
@@ -645,12 +661,12 @@ class BookingController extends Controller
$booking = Booking::where('id',$book_id)->first();
if (!$booking)
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'], 403);
}
if(!$userBankSlip = UserBankSlip::where('booking_id',$booking->id)->first())
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'], 403);
}
// approved bankslip cannot be reject again
@@ -678,16 +694,16 @@ class BookingController extends Controller
/* Validation */
if (!$booking)
{
- return response()->json(['message'=>'Access denied'], 200);
+ return response()->json(['message'=>'Access denied'], 403);
}
$validator = Validator::make($request->all(), [
- 'invoice_path' => 'mimes:jpg,jpeg,bmp,png,pdf,doc,docx'
+ 'invoice_path' => 'mimes:jpg,jpeg,bmp,png,xls,xlsx,doc,docx,pdf'
]);
if($validator->fails())
{
- return response()->json(['message'=>'Incorrect format'],200);
+ return response()->json(['message'=>'Incorrect format'],400);
}
$validator = Validator::make($request->all(), [
@@ -739,6 +755,7 @@ class BookingController extends Controller
$booking = Booking::where('user_id',Auth::user()->id)->where('id',$id)->first();
$purchase_order = $booking->purchaseOrder()->first();
+ return($purchase_order);
if(!$purchase_order){
return response()->json(["message"=> "Please upload your purchase order"],400);
@@ -768,23 +785,23 @@ class BookingController extends Controller
}
}
- public function adminShowCompletedOrders()
- {
- $bookings = Booking::select('id','created_at','user_id','rate','amount', 'bia', 'admin_status')
- ->where('admin_status', 7)
- ->orderBy('id', 'desc')
- ->get();
+ // public function adminShowCompletedOrders()
+ // {
+ // $bookings = Booking::select('id','created_at','user_id','rate','amount', 'bia', 'admin_status')
+ // ->where('admin_status', 7)
+ // ->orderBy('id', 'desc')
+ // ->get();
- foreach ($bookings as $booking) {
- $booking->id;
- $booking->created_at;
- $booking->marking = $booking->user->marking;
- $booking->rate;
- $booking->amount;
- $booking->bia;
- $booking->admin_status = "(". $booking->admin_status ."/7)";;
- }
- return $bookings;
- }
+ // foreach ($bookings as $booking) {
+ // $booking->id;
+ // $booking->created_at;
+ // $booking->marking = $booking->user->marking;
+ // $booking->rate;
+ // $booking->amount;
+ // $booking->bia;
+ // $booking->admin_status = "(". $booking->admin_status ."/7)";;
+ // }
+ // return $bookings;
+ // }
}
diff --git a/app/Http/Controllers/ChinaBankSlipController.php b/app/Http/Controllers/ChinaBankSlipController.php
index f0b8c291..eabfe4a5 100644
--- a/app/Http/Controllers/ChinaBankSlipController.php
+++ b/app/Http/Controllers/ChinaBankSlipController.php
@@ -15,30 +15,29 @@ class ChinaBankSlipController extends Controller
{
$booking = Booking::where('id',$id)->firstOrFail();
+ if (!$booking) {
+ return response()->json(['message'=>'Access denied'], 403);
+ }
+
// TODO : put this after check file exist
// validate file format
$validator = Validator::make($request->all(), [
- 'file' => 'image|mimes:jpg,jpeg,bmp,png'
+ 'file' => 'mimes:jpg,jpeg,bmp,png,xls,xlsx,doc,docx,pdf'
]);
- if($validator->fails())
- {
- return response()->json(['message'=>'Incorrect format'],200);
+ if($validator->fails()){
+ return response()->json(['message'=>'Incorrect format'],400);
}
-
$validator = Validator::make($request->all(), [
'china_bank_slips' => 'max:3072'
]);
- if($validator->fails())
- {
+ if($validator->fails()){
return response()->json(['message'=>'Image too large, upload files up to 3 MB'], 400);
}
-
if($bankslip_file = $request->file('file')){
-
$filename = $bankslip_file->getClientOriginalName();
$ext = $bankslip_file->getClientOriginalExtension();
$unique_name = 'cnbank_slip_' . md5($filename. time()); // probably not a good idea
diff --git a/app/Http/Controllers/SettingBillingChargeController.php b/app/Http/Controllers/SettingBillingChargeController.php
new file mode 100644
index 00000000..85dd119e
--- /dev/null
+++ b/app/Http/Controllers/SettingBillingChargeController.php
@@ -0,0 +1,25 @@
+first();
+ return response()->json($billing_charge_setting, 201);
+ }
+
+ public function update(Request $request)
+ {
+ if($billing_charge_setting = SettingBillingCharge::latest()->first())
+ $billing_charge_setting->update($request->all());
+ else
+ $billing_charge_setting = SettingBillingCharge::create($request->all());
+
+ return response()->json($billing_charge_setting, 200);
+ }
+}
diff --git a/app/Http/Controllers/SettingTaxRateController.php b/app/Http/Controllers/SettingTaxRateController.php
new file mode 100644
index 00000000..354e7689
--- /dev/null
+++ b/app/Http/Controllers/SettingTaxRateController.php
@@ -0,0 +1,25 @@
+first();
+ return response()->json($setting_tax, 201);
+ }
+
+ public function update(Request $request)
+ {
+ if($setting_tax = SettingTaxRate::latest()->first())
+ $setting_tax->update($request->all());
+ else
+ $setting_tax = SettingTaxRate::create($request->all());
+
+ return response()->json($setting_tax, 200);
+ }
+}
diff --git a/app/SettingBillingCharge.php b/app/SettingBillingCharge.php
new file mode 100644
index 00000000..32e5f9ab
--- /dev/null
+++ b/app/SettingBillingCharge.php
@@ -0,0 +1,10 @@
+=5.2.0"
+ "php": "^7"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
- "autoload": {
- "files": [
- "lib/random.php"
- ]
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
@@ -1760,7 +1756,7 @@
"pseudorandom",
"random"
],
- "time": "2018-07-04T16:31:37+00:00"
+ "time": "2018-07-02T15:55:56+00:00"
},
{
"name": "psr/container",
@@ -2030,21 +2026,22 @@
},
{
"name": "ramsey/uuid",
- "version": "3.7.3",
+ "version": "3.8.0",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76"
+ "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
- "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
+ "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
"shasum": ""
},
"require": {
- "paragonie/random_compat": "^1.0|^2.0",
- "php": "^5.4 || ^7.0"
+ "paragonie/random_compat": "^1.0|^2.0|9.99.99",
+ "php": "^5.4 || ^7.0",
+ "symfony/polyfill-ctype": "^1.8"
},
"replace": {
"rhumsaa/uuid": "self.version"
@@ -2052,16 +2049,17 @@
"require-dev": {
"codeception/aspect-mock": "^1.0 | ~2.0.0",
"doctrine/annotations": "~1.2.0",
- "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
+ "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0",
"ircmaxell/random-lib": "^1.1",
"jakub-onderka/php-parallel-lint": "^0.9.0",
"mockery/mockery": "^0.9.9",
"moontoast/math": "^1.1",
"php-mock/php-mock-phpunit": "^0.3|^1.1",
- "phpunit/phpunit": "^4.7|^5.0",
+ "phpunit/phpunit": "^4.7|^5.0|^6.5",
"squizlabs/php_codesniffer": "^2.3"
},
"suggest": {
+ "ext-ctype": "Provides support for PHP Ctype functions",
"ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
"ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
"ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
@@ -2106,7 +2104,7 @@
"identifier",
"uuid"
],
- "time": "2018-01-20T00:28:24+00:00"
+ "time": "2018-07-19T23:38:55+00:00"
},
{
"name": "swiftmailer/swiftmailer",
diff --git a/database/migrations/2018_07_18_174712_update_autoincrement_start_from_2000_in_booking_table.php b/database/migrations/2018_07_18_174712_update_autoincrement_start_from_2000_in_booking_table.php
new file mode 100644
index 00000000..1d310042
--- /dev/null
+++ b/database/migrations/2018_07_18_174712_update_autoincrement_start_from_2000_in_booking_table.php
@@ -0,0 +1,28 @@
+increments('id');
+ $table->double('billing_charge_rate');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('setting_billing_charges');
+ }
+}
diff --git a/database/migrations/2018_07_20_183325_create_setting_tax_rate_table.php b/database/migrations/2018_07_20_183325_create_setting_tax_rate_table.php
new file mode 100644
index 00000000..0743eb7b
--- /dev/null
+++ b/database/migrations/2018_07_20_183325_create_setting_tax_rate_table.php
@@ -0,0 +1,32 @@
+increments('id');
+ $table->double('tax_rate');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('setting_tax_rates');
+ }
+}
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
index 2c2e3c17..ebc04e05 100644
--- a/database/seeds/DatabaseSeeder.php
+++ b/database/seeds/DatabaseSeeder.php
@@ -26,6 +26,8 @@ class DatabaseSeeder extends Seeder
$this->call(SettingMalaysiaBankSeeder::class);
$this->call(SettingBeneficiarySeeder::class);
$this->call(SettingActiveBankSeeder::class);
+ $this->call(SettingTaxRateSeeder::class);
+ $this->call(SettingBillingChargeSeeder::class);
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
}
diff --git a/database/seeds/SettingBillingChargeSeeder.php b/database/seeds/SettingBillingChargeSeeder.php
new file mode 100644
index 00000000..5b53433f
--- /dev/null
+++ b/database/seeds/SettingBillingChargeSeeder.php
@@ -0,0 +1,18 @@
+insert([
+ 'billing_charge_rate' => '1.2',
+ ]);
+ }
+}
diff --git a/database/seeds/SettingTaxRateSeeder.php b/database/seeds/SettingTaxRateSeeder.php
new file mode 100644
index 00000000..9ecff163
--- /dev/null
+++ b/database/seeds/SettingTaxRateSeeder.php
@@ -0,0 +1,18 @@
+insert([
+ 'tax_rate' => '1.1',
+ ]);
+ }
+}
diff --git a/resources/assets/js/components/LocaleDropdown.vue b/resources/assets/js/components/LocaleDropdown.vue
index 3a139a66..b4a2e143 100644
--- a/resources/assets/js/components/LocaleDropdown.vue
+++ b/resources/assets/js/components/LocaleDropdown.vue
@@ -41,20 +41,20 @@
Download Download Download
-
Waiting User Upload Bank Slip
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
| - - | -- - | -
|
Term :
@@ -135,10 +133,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|
| - - | -- - | -
|
Term :
@@ -69,10 +61,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|
| - - | -- - | -
|
Term :
@@ -69,10 +61,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|
| - - | -- - | -
|
Term :
@@ -69,10 +61,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|
| - - | -- - | -
|
Term :
@@ -76,10 +68,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|
| - - | -- - | -
|
Term :
@@ -71,10 +63,18 @@
| |
|
-
+ Beneficiary Account :
|
-
+ {{booking_details.account_name}}
+ |
+
|
+ Beneficiary Account Number :
+ |
+
+ {{booking_details.account_num}}
|