I haven't used any sort of pattern. I'm thinking to use traits. Sorry for this lump of code but I have nested data. I'm inserting multiple data and in the way of inserting into my tables. I'm not getting the exception error. It gives me success but I have no data on my tables. Sometime it rollbacks but doesn't gives me an error. How can I optimize the code below. Please help me. How to structure this code so database transaction works properly.
public function paymentGetaway(Request $request){
DB::beginTransaction();
try{
$user = User::find(auth()->id())->first();
//Check email if it already exists then update
$existing_client = Client::where('email', $request->email)->where('is_deleted', 0)->first();
if($existing_client){
$existing_client->fname = $request->fname;
$existing_client->lname = $request->lname;
$existing_client->useru_id = auth()->id();
$existing_client->updated_at = date('Y-m-d H:i:s');
$result = $existing_client->save();
/*Address section*/
if($result){
$state = true;
$old_addr = Address::where('table', "client")->where('table_id', $existing_client->id)->get();
foreach ($old_addr as $key => $value) {
//Data exits
if($value->addr1 == $request->addr1
&& $value->zip == $request->zip
&& $value->state == $request->state
&& $value->country == $request->country
&& $value->city == $request->city )
{
$state = false;
$addr_id = $value->id;
}
}
if($state){
$address = new Address();
$address_data = $request->only([
'addr1','zip', 'city','state', 'country', 'addr2'
]);
$address_data['addr_type'] = "Temporary";
$address_data['table'] = "client";
$address_data['table_id'] = $existing_client->id;
$new_c_address = $address->create($address_data);
$addr_id = $new_c_address->id;
}
}
$order = $this->storeOrder($existing_client->id, $addr_id);
$carts = $this->getCartItems();
foreach ($carts as $key => $cart) {
$discount= $this->getDiscount($cart->product_id);
$order_items = new OrderItem();
$order_items->order_id = $order->id;
$order_items->inventory_id = $cart->inventory_id;
if($discount !== null){
$order_items->product_discount_id = $discount->id;
}
$order_items->quantity = $cart->quantity;
$order_items->userc_id = auth()->id();
$order_items->created_at = date('Y-m-d H:i:s');
$order_items->save();
}
/*Set the cart data to is_deleted = 0 which means inactive cart*/
foreach($carts as $cart){
$cart->is_deleted = 1;
$cart->save();
}
DB::commit();
}else{
$client = new Client();
$client_data = $request->only([
'fname', 'lname', 'email'
]);
$client_data['userc_id'] = auth()->id();
$new_client = $client->create($client_data);
//Inserting to HR Customer
$this->addCustomer($request);
if($new_client){
//Store address
$address = new Address();
$address_data = $request->only([
'addr1','zip', 'city','state', 'country', 'addr2'
]);
$address_data['addr_type'] = "Temporary";
$address_data['table'] = "client";
$address_data['table_id'] = $new_client->id;
$new_c_address = $address->create($address_data);
$addr_id = $new_c_address->id;
}
$order = $this->storeOrder($new_client->id, $addr_id);
$carts = $this->getCartItems();
$purchaseWithoutDis = 0;
$purchaseWithDis = 0;
$productCount = 0;
$discountAmount = 0;
// $discount_percent = 0;
foreach ($carts as $key => $cart) {
$discount= $this->getDiscount($cart->product_id);
$order_items = new OrderItem();
$order_items->order_id = $order->id;
$order_items->inventory_id = $cart->inventory_id;
if($discount !== null){
$order_items->product_discount_id = $discount->id;
}
$order_items->quantity = $cart->quantity;
$order_items->userc_id = auth()->id();
$order_items->created_at = date('Y-m-d H:i:s');
$order_items->save();
$productCount +=$cart->quantity;
//Collect Discount
if(!is_null($discount)){
if($discount->type == "flat"){
//Get the total sales
$inventory = Inventory::find($order_items->inventory_id);
$purchaseWithoutDis +=$inventory->price * $cart->quantity;
$discountAmount += $discount->amount * $cart->quantity;
$priceAfterDiscount = $inventory->price - $discount->amount;
$purchaseWithDis += $priceAfterDiscount * $cart->quantity;
}else{
//Get the total sales
$inventory = Inventory::find($order_items->inventory_id);
$purchaseWithoutDis +=$inventory->price * $cart->quantity;
$disAmount = ($discount->amount/100) * $inventory->price;
$purchaseWithDis += $disAmount * $cart->quantity;
$discountAmount += $disAmount * $cart->quantity;
}
dd("here");
}else{
$inventory = Inventory::find($order_items->inventory_id);
$purchaseWithoutDis +=$inventory->price * $cart->quantity;
$purchaseWithDis += $inventory->price * $cart->quantity;
}
}
if($discountAmount == 0){
$discountAmount = null;
}
//Create Invoice and Journal
$invoice = $this->storeInvoice($request,$purchaseWithoutDis,$order->id, $new_client->id, $discountAmount);
$productDesc = $request->fname.' '.$request->lname.' Ordered '.$productCount.' items. Order No: '.$invoice->invoice_no;
$journal = $this->storeJournal($purchaseWithoutDis,$purchaseWithDis, $productDesc, $discountAmount);
/*Set the cart data to is_deleted = 0 which means inactive cart*/
foreach($carts as $cart){
$cart->is_deleted = 1;
$cart->save();
}
DB::commit();
return response()->json(["Payment Successful"], 200);
}
}catch(\Exception $e){
DB::rollback();
return response(["message"=>$e->getMessage()], 500);
}
via Chebli Mohamed
Aucun commentaire:
Enregistrer un commentaire