<?php
namespace App\Utility;
use App\Models\ProductStock;
use App\Models\Address;
use App\Models\Cart;
use App\Models\Country;
use App\Models\State;
use App\Models\City;
use App\Models\Order;
use App\Models\OrderDetail;
use App\Models\Product;
use App\Services\CommissionService;
use Illuminate\Support\Facades\Log;
use Session;
use Mail;
use App\Mail\InvoiceEmailManager;
use App\Models\User;
class PosUtility {
public static function product_search($request_data): object {
$product_query = ProductStock::query()->join('products', 'product_stocks.product_id', '=', 'products.id');
if (auth()->user()->user_type == 'seller') {
$product_query->where('products.user_id', auth()->user()->id);
} else {
$product_query->where('products.added_by', 'admin');
}
$products = $product_query->where('products.auction_product', 0)
->where('products.wholesale_product', 0)
->where('products.published', 1)
->where('products.approved', 1)
->select('products.*', 'product_stocks.id as stock_id', 'product_stocks.variant', 'product_stocks.price as stock_price', 'product_stocks.qty as stock_qty', 'product_stocks.image as stock_image')
->orderBy('products.created_at', 'desc');
if ($request_data['category'] != null) {
$arr = explode('-', $request_data['category']);
if ($arr[0] == 'category') {
$category_ids = CategoryUtility::children_ids($arr[1]);
$category_ids[] = $arr[1];
$products = $products->whereIn('products.category_id', $category_ids);
}
}
if ($request_data['brand'] != null) {
$products = $products->where('products.brand_id', $request_data['brand']);
}
if ($request_data['keyword'] != null) {
$products = $products->where('products.name', 'like', '%' . $request_data['keyword'] . '%')->orWhere('products.barcode', $request_data['keyword']);
}
return $products->paginate(16);
}
public static function get_shipping_address($request): array {
if ($request->address_id != null) {
$address = Address::findOrFail($request->address_id);
$data['name'] = $address->user->name;
$data['email'] = $address->user->email;
$data['address'] = $address->address;
$data['country'] = $address->country->name;
$data['state'] = $address->state->name;
$data['city'] = $address->city->name;
$data['postal_code'] = $address->postal_code;
$data['phone'] = $address->phone;
} else {
$data['name'] = $request->name;
$data['email'] = $request->email;
$data['address'] = $request->address;
$data['country'] = Country::find($request->country_id)->name;
$data['state'] = State::find($request->state_id)->name;
$data['city'] = City::find($request->city_id)->name;
$data['postal_code'] = $request->postal_code;
$data['phone'] = $request->phone;
}
return $data;
}
public static function addToCart($stockId, $userID, $temUserId) {
$productStock = ProductStock::find($stockId);
$product = $productStock->product;
$quantity = $product->min_qty;
if ($productStock->qty < $product->min_qty && $product->digital == 0) {
return array(
'success' => 0,
'message' => translate("El Producto esta Agotado")
);
}
$cart = Cart::firstOrNew([
'variation' => $productStock->variant,
'user_id' => $userID,
'temp_user_id' => $temUserId,
'product_id' => $product->id
]);
if ($cart->exists) {
if ($product->digital == 1) {
return array(
'success' => 0,
'message' => translate("Este Producto ya se Encuentra en el Carrito")
);
} else {
$quantity = $cart->quantity + 1;
if ($productStock->qty < $quantity) {
return array(
'success' => 0,
'message' => translate("El Producto esta Agotado")
);
}
}
}
$price = CartUtility::get_price($product, $productStock, $quantity);
$tax = CartUtility::tax_calculation($product, $price);
CartUtility::save_cart_data($cart, $product, $price, $tax, $quantity);
return array('success' => 1, 'message' => 'Agregado al Carrito');
}
public static function updateCartItemQuantity($cart, $data) {
$product = Product::find($cart->product_id);
$product_stock = $product->stocks->first();
if ($product_stock->qty < $data['quantity']) {
$response['success'] = 0;
$response['message'] = translate("El Producto esta Agotado.");
} else {
$cart->quantity = $data['quantity'];
$cart->save();
$response['success'] = 1;
$response['message'] = translate("Actualizado Exitosamente.");
}
return $response;
}
public static function updateCartOnUserChange($data) {
$userID = $data['userId'];
$sessionUserId = Session::has('pos.user_id') ? Session::get('pos.user_id') : null;
$sessionTemUserId = Session::has('pos.temp_user_id') ? Session::get('pos.temp_user_id') : null;
$carts = get_pos_user_cart();
// If user is selected but user not in session or Session user is not this user, set it to session
if ($userID) {
if ($carts) {
self::updatePosUserCartData($carts, $userID, null);
}
if (!$sessionUserId || ($sessionUserId != $userID)) {
Session::put('pos.user_id', $userID);
}
Session::forget('pos.temp_user_id');
}
// If user is not selected, and if session has not Temp user ID, get it or set it
if (!$userID) {
if (!$sessionTemUserId) {
$sessionTemUserId = bin2hex(random_bytes(10));
Session::put('pos.temp_user_id', $sessionTemUserId);
}
if ($carts) {
self::updatePosUserCartData($carts, null, $sessionTemUserId);
}
Session::forget('pos.user_id');
}
}
public static function updatePosUserCartData($carts, $userID, $tempUsderID) {
foreach ($carts as $cartItem) {
$userCartItem = Cart::where('user_id', $userID)->where('temp_user_id', $tempUsderID)->where('product_id', $cartItem->product_id)->where('variation', $cartItem->variation)->first();
if ($userCartItem) {
$quantity = $userCartItem->quantity + $cartItem->quantity;
$product_qty = $cartItem->product->stocks()->where('variant', $cartItem->$cartItem)->first();
$quantity = $product_qty > $quantity ? $product_qty : $quantity;
$userCartItem->update(['quantity' => $quantity]);
$cartItem->delete();
} else {
$cartItem->update(['user_id' => $userID, 'temp_user_id' => $tempUsderID]);
}
}
}
public static function orderStore($data) {
$carts = Cart::where('user_id', $data['user_id'])->get();
if (count($carts) > 0) {
$order = new Order();
$userId = $data['user_id'];
if ($userId == null) {
$order->guest_id = $carts[0]->temp_user_id;
} else {
$order->user_id = $userId;
}
$order->payment_type = $data['payment_type'];
$order->delivery_viewed = '0';
$order->payment_status_viewed = '0';
$order->code = date('Ymd-His') . rand(10, 99);
$order->date = strtotime('now');
$order->payment_status = $data['payment_type'] != 'cash_on_delivery' ? 'paid' : 'unpaid';
$order->payment_details = $data['payment_type'];
$order->order_from = 'pos';
$order->delivery_status = 'delivered';
if ($data['payment_type'] == 'offline_payment') {
if ($data['offline_trx_id'] == null) {
return array('success' => 0, 'message' => translate("El ID de Transaccion es Obligatorio."));
}
$data['name'] = $data['offline_payment_method'];
$data['amount'] = (float)str_replace('RD$', '', $data['offline_payment_amount']);
$data['trx_id'] = $data['offline_trx_id'];
$data['photo'] = $data['offline_payment_proof'];
$order->manual_payment_data = json_encode($data);
$order->manual_payment = 1;
}
if ($order->save()) {
$subtotal = 0;
$tax = 0;
foreach ($carts as $key => $cartItem) {
$product_stock = $cartItem->product->stocks->where('variant', $cartItem['variation'])->first();
$product = $product_stock->product;
$product_variation = $product_stock->variant;
$subtotal += $cartItem['price'] * $cartItem['quantity'];
if ($product->digital == 0) {
if ($cartItem['quantity'] > $product_stock->qty) {
$order->delete();
return array('success' => 0, 'message' => $product->name . ' (' . $product_variation . ') ' . translate(" just stock outs."));
} else {
$product_stock->qty -= $cartItem['quantity'];
$product_stock->save();
}
}
$order_detail = new OrderDetail;
$order_detail->order_id = $order->id;
$order_detail->seller_id = $product->user_id;
$order_detail->product_id = $product->id;
$order_detail->payment_status = $data['payment_type'] != 'cash_on_delivery' ? 'paid' : 'unpaid';
$order_detail->variation = $product_variation;
$order_detail->price = $cartItem['price'] * $cartItem['quantity'];
$order_detail->tax = $cartItem['tax'] * $cartItem['quantity'];
$order_detail->quantity = $cartItem['quantity'];
$order_detail->shipping_type = null;
$order_detail->delivery_status = 'delivered';
if ($data['shippingCost'] >= 0) {
$order_detail->shipping_cost = $data['shippingCost'] / count($carts);
} else {
$order_detail->shipping_cost = 0;
}
$order_detail->save();
$product->num_of_sale++;
$product->save();
}
if ($data['discount']) {
$discountAmount = ($data['discount'] / 100) * $subtotal;
$order->coupon_discount = $discountAmount;
$subtotal = $subtotal - $discountAmount;
}
CommissionService::create($order, $subtotal);
$tax = $subtotal * (config('app.itbis') / 100);
$order->grand_total = $subtotal + $tax + $data['shippingCost'];
$order->seller_id = $product->user_id;
$order->save();
$array['view'] = 'emails.pos-invoice';
$array['subject'] = 'Tu orden ah sido creada - ' . $order->code;
$array['from'] = env('MAIL_USERNAME');
$array['order'] = $order;
$admin_products = array();
$seller_products = array();
foreach ($order->orderDetails as $key => $orderDetail) {
if ($orderDetail->product->added_by == 'admin') {
array_push($admin_products, $orderDetail->product->id);
} else {
$product_ids = array();
if (array_key_exists($orderDetail->product->user_id, $seller_products)) {
$product_ids = $seller_products[$orderDetail->product->user_id];
}
array_push($product_ids, $orderDetail->product->id);
$seller_products[$orderDetail->product->user_id] = $product_ids;
}
}
//sends email to customer with the invoice pdf attached
try {
Mail::to(User::find($userId)->email)->bcc(auth()->user()->email)->send(new InvoiceEmailManager($array));
} catch (\Exception $e) {
Log::debug($e);
}
Cart::where('user_id', $order->user_id)->orWhere('temp_user_id', $order->guest_id)->delete();
return array('success' => 1, 'message' => translate('Orden Creada Exitosamente.'));
} else {
return array('success' => 0, 'message' => translate('Por Favor Ingresa la Información del Vendedor.'));
}
}
return array('success' => 0, 'message' => translate("Debes Seleccionar Algún Producto."));
}
}
|