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) { } }