mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange.git
synced 2026-08-19 12:24:09 +00:00
137 lines
3.6 KiB
PHP
137 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\ResponseFactory;
|
|
use Illuminate\Support\MessageBag;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use App\Booking;
|
|
|
|
class InvoiceController extends Controller
|
|
{
|
|
public function show($id)
|
|
{
|
|
|
|
}
|
|
|
|
public function create(Request $request, $id)
|
|
{
|
|
$user = $request->user();
|
|
|
|
// validate $id
|
|
|
|
$validatedData = $request->validate([
|
|
'address' => 'required',
|
|
'buyer_company' => 'required',
|
|
'contact_no' => 'required',
|
|
'marking' => 'required',
|
|
'lines.*.order' => 'required|numeric',
|
|
'lines.*.stock_code' => 'required',
|
|
'lines.*.description' => 'required',
|
|
'lines.*.quantity' => 'required|numeric',
|
|
'lines.*.unit_price_rm' => 'required|numeric',
|
|
'lines.*.unit_price_rmb' => '',
|
|
'lines.*.total' => 'required|numeric',
|
|
]);
|
|
|
|
// booking_id belongs to user
|
|
$booking = Booking::where('id', $id)->first();
|
|
if (!$booking) {
|
|
return response()->json(['message' => 'Unable to find booking'], 403);
|
|
}
|
|
|
|
// user_id in booking does not match
|
|
if ($booking->user_id !== $user->id) {
|
|
return response()->json([
|
|
'message' => 'Booking does not belongs to you'
|
|
], 403);
|
|
}
|
|
|
|
// Amount match with total
|
|
$subtotalArray = array_map(
|
|
function ($line) { return $line['total']; },
|
|
$validatedData['lines']
|
|
);
|
|
$total = array_reduce($subtotalArray, function ($v1, $v2) {
|
|
return $v1 + $v2;
|
|
});
|
|
|
|
if ($total !== $booking->amount) {
|
|
return response()->json([
|
|
'message' => 'Booking amount expected is '.$booking->amount.'. Your Invoice amount is $total.'
|
|
], 400);
|
|
}
|
|
|
|
// Change Status to submitted
|
|
|
|
// Write to database if does not exist
|
|
$exist = DB::table('invoices')->where('booking_id', '=', $id)->first();
|
|
if ($exist) {
|
|
return response()
|
|
->json(['message' => 'Invoice exist. Cannot create duplicate invoice. Try edit.'], 400);
|
|
}
|
|
|
|
// Generate PO Number - po20200810-001(PO Format)
|
|
$dt = Carbon::now();
|
|
$po_number = 'po'.$dt->year.$dt->month.$dt->day.'-'.$id;
|
|
|
|
// Insert Invoice into database
|
|
$invoice = DB::table('invoices')->insertGetId([
|
|
'amount' => $total,
|
|
'booking_id' => $id,
|
|
'buyer_company' => $validatedData['buyer_company'],
|
|
'address' => $validatedData['address'],
|
|
'contact_no' => $validatedData['contact_no'],
|
|
'po_number' => $po_number
|
|
]);
|
|
|
|
if (!$invoice) {
|
|
return response()
|
|
->json(['message' => 'Unable to Save Data'], 500)
|
|
}
|
|
|
|
// Insert invoice_id into lines
|
|
foreach( $validatedData['lines'] as $key => $line) {
|
|
$validatedData['lines'][$key]['invoice_id'] = $invoice;
|
|
}
|
|
unset($line);
|
|
|
|
$lines = DB::table('invoice_details')->insert($validatedData['lines']);
|
|
|
|
if($lines) {
|
|
return response(201);
|
|
} else {
|
|
return response(500);
|
|
}
|
|
}
|
|
|
|
public function edit(Request $request, $id)
|
|
{
|
|
|
|
}
|
|
|
|
public function updateStatus(Request $request, $id)
|
|
{
|
|
|
|
}
|
|
|
|
public function getPO($id)
|
|
{
|
|
|
|
}
|
|
|
|
public function getDO($id)
|
|
{
|
|
|
|
}
|
|
|
|
public function getSupplierDO($id)
|
|
{
|
|
|
|
}
|
|
}
|