<?php
namespace App\Http\Controllers;
use App\Http\Resources\PosProductCollection;
use App\Mail\InvoiceEmailManager;
use App\Models\NfcVoucher;
use App\Models\Order;
use App\Models\OrderDetail;
use App\Models\Product;
use App\Models\ProductStock;
use App\Models\User;
use App\Utility\FontUtility;
use App\Utility\PosUtility;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Mpdf\Mpdf;
use Session;
class PosController extends Controller {
public function __construct() {
// Staff Permission Check
$this->middleware(['permission:pos_manager'])->only('admin_index');
$this->middleware(['permission:pos_configuration'])->only('pos_activation');
}
public function index() {
$customers = User::where('user_type', 'customer')->where('email_verified_at', '!=', null)->orderBy('created_at', 'desc')->get();
return view('backend.pos.index', compact('customers'));
}
public function search(Request $request) {
$products = PosUtility::product_search($request->only('category', 'brand', 'keyword'));
$stocks = new PosProductCollection($products);
$stocks->appends(['keyword' => $request->keyword, 'category' => $request->category, 'brand' => $request->brand]);
return $stocks;
}
public function addToCart(Request $request) {
$stock = ProductStock::find($request->stock_id);
$product = $stock->product;
$data = array();
$data['stock_id'] = $request->stock_id;
$data['id'] = $product->id;
$data['variant'] = $stock->variant;
$data['quantity'] = $product->min_qty;
if ($stock->qty < $product->min_qty && $product->digital == 0) {
return array('success' => 0, 'message' => translate("This product doesn't have enough stock for minimum purchase quantity ") . $product->min_qty, 'view' => view('backend.pos.cart')->render());
}
$tax = 0;
$price = $stock->price;
// discount calculation
$discount_applicable = false;
if ($product->discount_start_date == null) {
$discount_applicable = true;
} elseif (
strtotime(date('d-m-Y H:i:s')) >= $product->discount_start_date &&
strtotime(date('d-m-Y H:i:s')) <= $product->discount_end_date
) {
$discount_applicable = true;
}
if ($discount_applicable) {
if ($product->discount_type == 'percent') {
$price -= ($price * $product->discount) / 100;
} elseif ($product->discount_type == 'amount') {
$price -= $product->discount;
}
}
//tax calculation
foreach ($product->taxes as $product_tax) {
if ($product_tax->tax_type == 'percent') {
$tax += ($price * $product_tax->tax) / 100;
} elseif ($product_tax->tax_type == 'amount') {
$tax += $product_tax->tax;
}
}
$data['price'] = $price;
$data['tax'] = $tax;
if ($request->session()->has('pos.cart')) {
$foundInCart = false;
$cart = collect();
foreach ($request->session()->get('pos.cart') as $key => $cartItem) {
if ($cartItem['id'] == $product->id && $cartItem['stock_id'] == $stock->id) {
$foundInCart = true;
if ($product->digital == 0) {
$loop_product = Product::find($cartItem['id']);
$product_stock = $loop_product->stocks->where('variant', $cartItem['variant'])->first();
if ($product->digital == 1 || $product_stock->qty >= ($cartItem['quantity'] + 1)) {
$cartItem['quantity'] += 1;
} else {
return array('success' => 0, 'message' => translate("This product doesn't have more stock."), 'view' => view('backend.pos.cart')->render());
}
} else {
return array('success' => 0, 'message' => translate("This product is alreday in the cart"), 'view' => view('backend.pos.cart')->render());
}
}
$cart->push($cartItem);
}
if (!$foundInCart) {
$cart->push($data);
}
$request->session()->put('pos.cart', $cart);
} else {
$cart = collect([$data]);
$request->session()->put('pos.cart', $cart);
}
$request->session()->put('pos.cart', $cart);
return array('success' => 1, 'message' => '', 'view' => view('backend.pos.cart')->render());
}
//updated the quantity for a cart item
public function updateQuantity(Request $request) {
$cart = $request->session()->get('pos.cart', collect([]));
$cart = $cart->map(function ($object, $key) use ($request) {
if ($key == $request->key) {
$product = Product::find($object['id']);
$product_stock = $product->stocks->where('id', $object['stock_id'])->first();
if ($product_stock->qty >= $request->quantity) {
$object['quantity'] = $request->quantity;
} else {
return array('success' => 0, 'message' => translate("This product doesn't have more stock."), 'view' => view('backend.pos.cart')->render());
}
}
return $object;
});
$request->session()->put('pos.cart', $cart);
return array('success' => 1, 'message' => '', 'view' => view('backend.pos.cart')->render());
}
//removes from Cart
public function removeFromCart(Request $request) {
if (Session::has('pos.cart')) {
$cart = Session::get('pos.cart', collect([]));
$cart->forget($request->key);
Session::put('pos.cart', $cart);
$request->session()->put('pos.cart', $cart);
}
return view('backend.pos.cart');
}
//Shipping Address for admin
public function getShippingAddress(Request $request) {
$user_id = $request->id;
if ($user_id == '') {
return view('backend.pos.guest_shipping_address');
} else {
return view('backend.pos.shipping_address', compact('user_id'));
}
}
public function set_shipping_address(Request $request) {
$data = PosUtility::get_shipping_address($request);
$shipping_info = $data;
$request->session()->put('pos.shipping_info', $shipping_info);
}
//set Discount
public function setDiscount(Request $request) {
if ($request->discount >= 0) {
Session::put('pos.discount', $request->discount);
}
return view('backend.pos.cart');
}
//set Shipping Cost
public function setShipping(Request $request) {
if ($request->shipping != null) {
Session::put('pos.shipping', $request->shipping);
}
return view('backend.pos.cart');
}
//order summary
public function get_order_summary(Request $request) {
return view('backend.pos.order_summary');
}
//order place
public function order_store(Request $request) {
if (Session::has('pos.cart') && count(Session::get('pos.cart')) > 0) {
$order = new Order;
if ($request->user_id == null) {
return array('error' => 0, 'message' => 'Debes seleccionar un cliente');
} else {
$order->user_id = $request->user_id;
}
$order->payment_type = $request->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 = 'paid';
$order->payment_details = $request->payment_type;
$order->order_from = 'pos';
if ($request->payment_type == 'manual_payment_1') {
if ($request->offline_trx_id == null) {
return array('success' => 0, 'message' => translate("Transaction ID can not be null."));
}
$data['name'] = 'Transferencia Bancaria';
$data['bank'] = $request->offline_bank;
$data['amount'] = $request->offline_payment_amount;
$data['trx_id'] = $request->offline_trx_id;
$data['photo'] = $request->offline_payment_proof;
$order->manual_payment_data = json_encode($data);
$order->manual_payment = 1;
}
if ($order->save()) {
$subtotal = 0;
$tax = 0;
foreach (Session::get('pos.cart') as $key => $cartItem) {
$product_stock = ProductStock::find($cartItem['stock_id']);
$product = $product_stock->product;
$product_variation = $product_stock->variant;
$subtotal += $cartItem['price'] * $cartItem['quantity'];
Log::debug($subtotal);
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 = $request->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;
if (Session::get('pos.shipping', 0) >= 0) {
$order_detail->shipping_cost = Session::get('pos.shipping', 0) / count(Session::get('pos.cart'));
} else {
$order_detail->shipping_cost = 0;
}
$order_detail->save();
$product->num_of_sale++;
$product->save();
}
$discount = $subtotal * (Session::get('pos.discount') / 100);
Log::debug($discount);
$subtotal = $subtotal - $discount;
Log::debug($subtotal);
$tax = $subtotal * (config('app.itbis') / 100);
Log::debug($tax);
$order->grand_total = $subtotal + $tax;
Log::debug($order->grand_total);
$order->coupon_discount = $discount;
Log::debug($order->coupon_discount);
$order->seller_id = $product->user_id;
$order->save();
$array['view'] = 'emails.pos-invoice';
$array['subject'] = 'Your order has been placed - ' . $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;
}
}
foreach ($seller_products as $key => $seller_product) {
try {
Mail::to(User::find($key)->email)->send(new InvoiceEmailManager($array));
} catch (\Exception $e) {
Log::debug('No se envio el mail');
Log::warning($e);
}
}
//sends email to customer with the invoice pdf attached
if (env('MAIL_USERNAME') != null) {
try {
Mail::to(User::find($request->user_id)->email)->send(new InvoiceEmailManager($array));
} catch (\Exception $e) {
Log::debug('No se envio el mail');
Log::warning($e);
}
}
if ($request->user_id != NULL && $order->payment_status == 'paid') {
calculateCommissionAffilationClubPoint($order);
}
Session::forget('pos.shipping_info');
Session::forget('pos.shipping');
Session::forget('pos.discount');
Session::forget('pos.cart');
return array('success' => 1, 'message' => translate('Order Completed Successfully.'));
} else {
return array('success' => 0, 'message' => translate('Please input customer information.'));
}
}
return array('success' => 0, 'message' => translate("Please select a product."));
}
public function configuration() {
$nfc_vouchers = $nfc_vouchers = NfcVoucher::latest()->get();
return view('backend.pos.pos_activation', compact('nfc_vouchers'));
//return view('seller.pos.pos_activation', compact('nfc_vouchers'));
}
public function invoice($id) {
$order = Order::findOrFail($id);
$print_width = get_setting('print_width');
if ($print_width == null) {
flash(translate('Thermal printer size is not given in POS configuration'))->warning();
return back();
}
$pdf_style_data = FontUtility::get_font_family();
$html = view('backend.pos.thermal_invoice', compact('order', 'pdf_style_data'));
$mpdf = new Mpdf(['mode' => 'utf-8', 'format' => [$print_width, 1000]]);
$mpdf->WriteHTML($html);
// $mpdf->WriteHTML('<h1>Hello world!</h1>');
$mpdf->page = 0;
$mpdf->state = 0;
unset($mpdf->pages[0]);
// The $p needs to be passed by reference
$p = 'P';
// dd($mpdf->y);
$mpdf->_setPageSize(array($print_width, $mpdf->y), $p);
$mpdf->addPage();
$mpdf->WriteHTML($html);
$mpdf->Output('order-' . $order->code . '.pdf', 'I');
}
}
|