/home/techb158/dev.balacoffee.com/app/Http/Controllers
Edit: /home/techb158/dev.balacoffee.com/app/Http/Controllers/ProductsController.php (48520B)
authorizeForUser($request->user('api'), 'view', Product::class);
// How many items do you want to display.
$perPage = $request->limit;
$pageStart = \Request::get('page', 1);
// Start displaying items from this number;
$offSet = ($pageStart * $perPage) - $perPage;
$order = $request->SortField;
$dir = $request->SortType;
$helpers = new helpers();
// Filter fields With Params to retrieve
$columns = array(0 => 'name', 1 => 'category_id', 2 => 'brand_id', 3 => 'code');
$param = array(0 => 'like', 1 => '=', 2 => '=', 3 => 'like');
$data = array();
$products = Product::with('unit', 'category', 'brand')
->where('deleted_at', '=', null);
//Multiple Filter
$Filtred = $helpers->filter($products, $columns, $param, $request)
// Search With Multiple Param
->where(function ($query) use ($request) {
return $query->when($request->filled('search'), function ($query) use ($request) {
return $query->where('products.name', 'LIKE', "%{$request->search}%")
->orWhere('products.code', 'LIKE', "%{$request->search}%")
->orWhere(function ($query) use ($request) {
return $query->whereHas('category', function ($q) use ($request) {
$q->where('name', 'LIKE', "%{$request->search}%");
});
})
->orWhere(function ($query) use ($request) {
return $query->whereHas('brand', function ($q) use ($request) {
$q->where('name', 'LIKE', "%{$request->search}%");
});
});
});
});
$totalRows = $Filtred->count();
if($perPage == "-1"){
$perPage = $totalRows;
}
$products = $Filtred->offset($offSet)
->limit($perPage)
->orderBy($order, $dir)
->get();
foreach ($products as $product) {
$item['id'] = $product->id;
$item['code'] = $product->code;
$item['name'] = $product->name;
$item['category'] = $product['category']->name;
$item['brand'] = $product['brand'] ? $product['brand']->name : 'N/D';
$item['unit'] = $product['unit']->ShortName;
$item['price'] = $product->price;
$product_warehouse_data = product_warehouse::where('product_id', $product->id)
->where('deleted_at', '=', null)
->get();
$total_qty = 0;
foreach ($product_warehouse_data as $product_warehouse) {
$total_qty += $product_warehouse->qte;
$item['quantity'] = $total_qty;
}
$firstimage = explode(',', $product->image);
$item['image'] = $firstimage[0];
$data[] = $item;
}
//get warehouses assigned to user
$user_auth = auth()->user();
if($user_auth->is_all_warehouses){
$warehouses = Warehouse::where('deleted_at', '=', null)->get(['id', 'name']);
}else{
$warehouses_id = UserWarehouse::where('user_id', $user_auth->id)->pluck('warehouse_id')->toArray();
$warehouses = Warehouse::where('deleted_at', '=', null)->whereIn('id', $warehouses_id)->get(['id', 'name']);
}
$categories = Category::where('deleted_at', null)->get(['id', 'name']);
$brands = Brand::where('deleted_at', null)->get(['id', 'name']);
return response()->json([
'warehouses' => $warehouses,
'categories' => $categories,
'brands' => $brands,
'products' => $data,
'totalRows' => $totalRows,
]);
}
//-------------- Store new Product ---------------\\
public function store(Request $request)
{
$this->authorizeForUser($request->user('api'), 'create', Product::class);
try {
$this->validate($request, [
'code' => 'required|unique:products',
'code' => Rule::unique('products')->where(function ($query) {
return $query->where('deleted_at', '=', null);
}),
'name' => 'required',
'Type_barcode' => 'required',
'price' => 'required',
'category_id' => 'required',
'cost' => 'required',
'unit_id' => 'required',
], [
'code.unique' => 'This code already used. Generate Now',
'code.required' => 'This field is required',
]);
\DB::transaction(function () use ($request) {
//-- Create New Product
$Product = new Product;
//-- Field Required
$Product->name = $request['name'];
$Product->code = $request['code'];
$Product->Type_barcode = $request['Type_barcode'];
$Product->price = $request['price'];
$Product->category_id = $request['category_id'];
$Product->brand_id = $request['brand_id'];
$Product->TaxNet = $request['TaxNet'] ? $request['TaxNet'] : 0;
$Product->tax_method = $request['tax_method'];
$Product->note = $request['note'];
$Product->cost = $request['cost'];
$Product->unit_id = $request['unit_id'];
$Product->unit_sale_id = $request['unit_sale_id'];
$Product->unit_purchase_id = $request['unit_purchase_id'];
$Product->stock_alert = $request['stock_alert'] ? $request['stock_alert'] : 0;
$Product->is_variant = $request['is_variant'] == 'true' ? 1 : 0;
$Product->is_imei = $request['is_imei'] == 'true' ? 1 : 0;
if ($request['images']) {
$files = $request['images'];
foreach ($files as $file) {
$fileData = ImageResize::createFromString(base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $file['path'])));
$fileData->resize(200, 200);
$name = rand(11111111, 99999999) . $file['name'];
$path = public_path() . '/images/products/';
$success = file_put_contents($path . $name, $fileData);
$images[] = $name;
}
$filename = implode(",", $images);
} else {
$filename = 'no-image.png';
}
$Product->image = $filename;
$Product->save();
// Store Variants Product
if ($request['is_variant'] == 'true') {
foreach ($request['variants'] as $variant) {
$Product_variants_data[] = [
'product_id' => $Product->id,
'name' => $variant,
];
}
ProductVariant::insert($Product_variants_data);
}
//--Store Product Warehouse
$warehouses = Warehouse::where('deleted_at', null)->pluck('id')->toArray();
if ($warehouses) {
$Product_variants = ProductVariant::where('product_id', $Product->id)
->where('deleted_at', null)
->get();
foreach ($warehouses as $warehouse) {
if ($request['is_variant'] == 'true') {
foreach ($Product_variants as $product_variant) {
$product_warehouse[] = [
'product_id' => $Product->id,
'warehouse_id' => $warehouse,
'product_variant_id' => $product_variant->id,
];
}
} else {
$product_warehouse[] = [
'product_id' => $Product->id,
'warehouse_id' => $warehouse,
];
}
}
product_warehouse::insert($product_warehouse);
}
}, 10);
return response()->json(['success' => true]);
} catch (ValidationException $e) {
return response()->json([
'status' => 422,
'msg' => 'error',
'errors' => $e->errors(),
], 422);
}
}
//-------------- Update Product ---------------\\
//-----------------------------------------------\\
public function update(Request $request, $id)
{
$this->authorizeForUser($request->user('api'), 'update', Product::class);
try {
$this->validate($request, [
'code' => 'required|unique:products',
'code' => Rule::unique('products')->ignore($id)->where(function ($query) {
return $query->where('deleted_at', '=', null);
}),
'name' => 'required',
'Type_barcode' => 'required',
'price' => 'required',
'category_id' => 'required',
'cost' => 'required',
'unit_id' => 'required',
], [
'code.unique' => 'This code already used. Generate Now',
'code.required' => 'This field is required',
]);
\DB::transaction(function () use ($request, $id) {
$Product = Product::where('id', $id)
->where('deleted_at', '=', null)
->first();
//-- Update Product
$Product->name = $request['name'];
$Product->code = $request['code'];
$Product->Type_barcode = $request['Type_barcode'];
$Product->price = $request['price'];
$Product->category_id = $request['category_id'];
$Product->brand_id = $request['brand_id'] == 'null' ?Null: $request['brand_id'];
$Product->TaxNet = $request['TaxNet'];
$Product->tax_method = $request['tax_method'];
$Product->note = $request['note'];
$Product->cost = $request['cost'];
$Product->unit_id = $request['unit_id'];
$Product->unit_sale_id = $request['unit_sale_id'] ? $request['unit_sale_id'] : $request['unit_id'];
$Product->unit_purchase_id = $request['unit_purchase_id'] ? $request['unit_purchase_id'] : $request['unit_id'];
$Product->stock_alert = $request['stock_alert'];
$Product->is_variant = $request['is_variant'] == 'true' ? 1 : 0;
$Product->is_imei = $request['is_imei'] == 'true' ? 1 : 0;
// Store Variants Product
$oldVariants = ProductVariant::where('product_id', $id)
->where('deleted_at', null)
->get();
$warehouses = Warehouse::where('deleted_at', null)
->pluck('id')
->toArray();
if ($request['is_variant'] == 'true') {
if ($oldVariants->isNotEmpty()) {
$new_variants_id = [];
$var = 'id';
foreach ($request['variants'] as $new_id) {
if (array_key_exists($var, $new_id)) {
$new_variants_id[] = $new_id['id'];
} else {
$new_variants_id[] = 0;
}
}
foreach ($oldVariants as $key => $value) {
$old_variants_id[] = $value->id;
// Delete Variant
if (!in_array($old_variants_id[$key], $new_variants_id)) {
$ProductVariant = ProductVariant::findOrFail($value->id);
$ProductVariant->deleted_at = Carbon::now();
$ProductVariant->save();
$ProductWarehouse = product_warehouse::where('product_variant_id', $value->id)
->update(['deleted_at' => Carbon::now()]);
}
}
foreach ($request['variants'] as $key => $variant) {
if (array_key_exists($var, $variant)) {
$ProductVariantDT = new ProductVariant;
//-- Field Required
$ProductVariantDT->product_id = $variant['product_id'];
$ProductVariantDT->name = $variant['text'];
$ProductVariantDT->qty = $variant['qty'];
$ProductVariantUP['product_id'] = $variant['product_id'];
$ProductVariantUP['name'] = $variant['text'];
$ProductVariantUP['qty'] = $variant['qty'];
} else {
$ProductVariantDT = new ProductVariant;
//-- Field Required
$ProductVariantDT->product_id = $id;
$ProductVariantDT->name = $variant['text'];
$ProductVariantDT->qty = 0.000;
$ProductVariantUP['product_id'] = $id;
$ProductVariantUP['name'] = $variant['text'];
$ProductVariantUP['qty'] = 0.000;
}
if (!in_array($new_variants_id[$key], $old_variants_id)) {
$ProductVariantDT->save();
//--Store Product warehouse
if ($warehouses) {
$product_warehouse= [];
foreach ($warehouses as $warehouse) {
$product_warehouse[] = [
'product_id' => $id,
'warehouse_id' => $warehouse,
'product_variant_id' => $ProductVariantDT->id,
];
}
product_warehouse::insert($product_warehouse);
}
} else {
ProductVariant::where('id', $variant['id'])->update($ProductVariantUP);
}
}
} else {
$ProducttWarehouse = product_warehouse::where('product_id', $id)
->update([
'deleted_at' => Carbon::now(),
]);
foreach ($request['variants'] as $variant) {
$product_warehouse_DT = [];
$ProductVarDT = new ProductVariant;
//-- Field Required
$ProductVarDT->product_id = $id;
$ProductVarDT->name = $variant['text'];
$ProductVarDT->save();
//-- Store Product warehouse
if ($warehouses) {
foreach ($warehouses as $warehouse) {
$product_warehouse_DT[] = [
'product_id' => $id,
'warehouse_id' => $warehouse,
'product_variant_id' => $ProductVarDT->id,
];
}
product_warehouse::insert($product_warehouse_DT);
}
}
}
} else {
if ($oldVariants->isNotEmpty()) {
foreach ($oldVariants as $old_var) {
$var_old = ProductVariant::where('product_id', $old_var['product_id'])
->where('deleted_at', null)
->first();
$var_old->deleted_at = Carbon::now();
$var_old->save();
$ProducttWarehouse = product_warehouse::where('product_variant_id', $old_var['id'])
->update([
'deleted_at' => Carbon::now(),
]);
}
if ($warehouses) {
foreach ($warehouses as $warehouse) {
$product_warehouse[] = [
'product_id' => $id,
'warehouse_id' => $warehouse,
'product_variant_id' => null,
];
}
product_warehouse::insert($product_warehouse);
}
}
}
if ($request['images'] === null) {
if ($Product->image !== null) {
foreach (explode(',', $Product->image) as $img) {
$pathIMG = public_path() . '/images/products/' . $img;
if (file_exists($pathIMG)) {
if ($img != 'no-image.png') {
@unlink($pathIMG);
}
}
}
}
$filename = 'no-image.png';
} else {
if ($Product->image !== null) {
foreach (explode(',', $Product->image) as $img) {
$pathIMG = public_path() . '/images/products/' . $img;
if (file_exists($pathIMG)) {
if ($img != 'no-image.png') {
@unlink($pathIMG);
}
}
}
}
$files = $request['images'];
foreach ($files as $file) {
$fileData = ImageResize::createFromString(base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $file['path'])));
$fileData->resize(200, 200);
$name = rand(11111111, 99999999) . $file['name'];
$path = public_path() . '/images/products/';
$success = file_put_contents($path . $name, $fileData);
$images[] = $name;
}
$filename = implode(",", $images);
}
$Product->image = $filename;
$Product->save();
}, 10);
return response()->json(['success' => true]);
} catch (ValidationException $e) {
return response()->json([
'status' => 422,
'msg' => 'error',
'errors' => $e->errors(),
], 422);
}
}
//-------------- Remove Product ---------------\\
//-----------------------------------------------\\
public function destroy(Request $request, $id)
{
$this->authorizeForUser($request->user('api'), 'delete', Product::class);
\DB::transaction(function () use ($id) {
$Product = Product::findOrFail($id);
$Product->deleted_at = Carbon::now();
$Product->save();
foreach (explode(',', $Product->image) as $img) {
$pathIMG = public_path() . '/images/products/' . $img;
if (file_exists($pathIMG)) {
if ($img != 'no-image.png') {
@unlink($pathIMG);
}
}
}
product_warehouse::where('product_id', $id)->update([
'deleted_at' => Carbon::now(),
]);
ProductVariant::where('product_id', $id)->update([
'deleted_at' => Carbon::now(),
]);
}, 10);
return response()->json(['success' => true]);
}
//-------------- Delete by selection ---------------\\
public function delete_by_selection(Request $request)
{
$this->authorizeForUser($request->user('api'), 'delete', Product::class);
\DB::transaction(function () use ($request) {
$selectedIds = $request->selectedIds;
foreach ($selectedIds as $product_id) {
$Product = Product::findOrFail($product_id);
$Product->deleted_at = Carbon::now();
$Product->save();
foreach (explode(',', $Product->image) as $img) {
$pathIMG = public_path() . '/images/products/' . $img;
if (file_exists($pathIMG)) {
if ($img != 'no-image.png') {
@unlink($pathIMG);
}
}
}
product_warehouse::where('product_id', $product_id)->update([
'deleted_at' => Carbon::now(),
]);
ProductVariant::where('product_id', $product_id)->update([
'deleted_at' => Carbon::now(),
]);
}
}, 10);
return response()->json(['success' => true]);
}
//-------------- Export All Product to EXCEL ---------------\\
public function export_Excel(Request $request)
{
$this->authorizeForUser($request->user('api'), 'view', Product::class);
return Excel::download(new ProductsExport, 'List_Products.xlsx');
}
//-------------- Show Product Details ---------------\\
public function Get_Products_Details(Request $request, $id)
{
$this->authorizeForUser($request->user('api'), 'view', Product::class);
$Product = Product::where('deleted_at', '=', null)->findOrFail($id);
//get warehouses assigned to user
$user_auth = auth()->user();
if($user_auth->is_all_warehouses){
$warehouses = Warehouse::where('deleted_at', '=', null)->get(['id', 'name']);
}else{
$warehouses_id = UserWarehouse::where('user_id', $user_auth->id)->pluck('warehouse_id')->toArray();
$warehouses = Warehouse::where('deleted_at', '=', null)->whereIn('id', $warehouses_id)->get(['id', 'name']);
}
$item['id'] = $Product->id;
$item['code'] = $Product->code;
$item['Type_barcode'] = $Product->Type_barcode;
$item['name'] = $Product->name;
$item['note'] = $Product->note;
$item['category'] = $Product['category']->name;
$item['brand'] = $Product['brand'] ? $Product['brand']->name : 'N/D';
$item['unit'] = $Product['unit']->ShortName;
$item['price'] = $Product->price;
$item['cost'] = $Product->cost;
$item['stock_alert'] = $Product->stock_alert;
$item['taxe'] = $Product->TaxNet;
$item['tax_method'] = $Product->tax_method == '1' ? 'Exclusive' : 'Inclusive';
if ($Product->is_variant) {
$item['is_variant'] = 'yes';
$productsVariants = ProductVariant::where('product_id', $id)
->where('deleted_at', null)
->get();
foreach ($productsVariants as $variant) {
$item['ProductVariant'][] = $variant->name;
foreach ($warehouses as $warehouse) {
$product_warehouse = DB::table('product_warehouse')
->where('product_id', $id)
->where('deleted_at', '=', null)
->where('warehouse_id', $warehouse->id)
->where('product_variant_id', $variant->id)
->select(DB::raw('SUM(product_warehouse.qte) AS sum'))
->first();
$war_var['mag'] = $warehouse->name;
$war_var['variant'] = $variant->name;
$war_var['qte'] = $product_warehouse->sum;
$item['CountQTY_variants'][] = $war_var;
}
}
} else {
$item['is_variant'] = 'no';
$item['CountQTY_variants'] = [];
}
foreach ($warehouses as $warehouse) {
$product_warehouse_data = DB::table('product_warehouse')
->where('deleted_at', '=', null)
->where('product_id', $id)
->where('warehouse_id', $warehouse->id)
->select(DB::raw('SUM(product_warehouse.qte) AS sum'))
->first();
$war['mag'] = $warehouse->name;
$war['qte'] = $product_warehouse_data->sum;
$item['CountQTY'][] = $war;
}
if ($Product->image != '') {
foreach (explode(',', $Product->image) as $img) {
$item['images'][] = $img;
}
}
$data[] = $item;
return response()->json($data[0]);
}
//------------ Get products By Warehouse -----------------\\
public function Products_by_Warehouse(request $request, $id)
{
$data = [];
$product_warehouse_data = product_warehouse::with('warehouse', 'product', 'productVariant')
->where('warehouse_id', $id)
->where('deleted_at', '=', null)
->where(function ($query) use ($request) {
if ($request->stock == '1') {
return $query->where('qte', '>', 0);
}
})->get();
foreach ($product_warehouse_data as $product_warehouse) {
if ($product_warehouse->product_variant_id) {
$item['product_variant_id'] = $product_warehouse->product_variant_id;
$item['code'] = $product_warehouse['productVariant']->name . '-' . $product_warehouse['product']->code;
$item['Variant'] = $product_warehouse['productVariant']->name;
} else {
$item['product_variant_id'] = null;
$item['Variant'] = null;
$item['code'] = $product_warehouse['product']->code;
}
$item['id'] = $product_warehouse->product_id;
$item['name'] = $product_warehouse['product']->name;
$item['barcode'] = $product_warehouse['product']->code;
$item['Type_barcode'] = $product_warehouse['product']->Type_barcode;
$firstimage = explode(',', $product_warehouse['product']->image);
$item['image'] = $firstimage[0];
if ($product_warehouse['product']['unitSale']->operator == '/') {
$item['qte_sale'] = $product_warehouse->qte * $product_warehouse['product']['unitSale']->operator_value;
$price = $product_warehouse['product']->price / $product_warehouse['product']['unitSale']->operator_value;
} else {
$item['qte_sale'] = $product_warehouse->qte / $product_warehouse['product']['unitSale']->operator_value;
$price = $product_warehouse['product']->price * $product_warehouse['product']['unitSale']->operator_value;
}
if ($product_warehouse['product']['unitPurchase']->operator == '/') {
$item['qte_purchase'] = round($product_warehouse->qte * $product_warehouse['product']['unitPurchase']->operator_value, 5);
} else {
$item['qte_purchase'] = round($product_warehouse->qte / $product_warehouse['product']['unitPurchase']->operator_value, 5);
}
$item['qte'] = $product_warehouse->qte;
$item['unitSale'] = $product_warehouse['product']['unitSale']->ShortName;
$item['unitPurchase'] = $product_warehouse['product']['unitPurchase']->ShortName;
if ($product_warehouse['product']->TaxNet !== 0.0) {
//Exclusive
if ($product_warehouse['product']->tax_method == '1') {
$tax_price = $price * $product_warehouse['product']->TaxNet / 100;
$item['Net_price'] = $price + $tax_price;
// Inxclusive
} else {
$item['Net_price'] = $price;
}
} else {
$item['Net_price'] = $price;
}
$data[] = $item;
}
return response()->json($data);
}
//------------ Get product By ID -----------------\\
public function show($id)
{
$Product_data = Product::with('unit')
->where('id', $id)
->where('deleted_at', '=', null)
->first();
$data = [];
$item['id'] = $Product_data['id'];
$item['name'] = $Product_data['name'];
$item['Type_barcode'] = $Product_data['Type_barcode'];
$item['unit_id'] = $Product_data['unit']->id;
$item['unit'] = $Product_data['unit']->ShortName;
$item['purchase_unit_id'] = $Product_data['unitPurchase']->id;
$item['unitPurchase'] = $Product_data['unitPurchase']->ShortName;
$item['sale_unit_id'] = $Product_data['unitSale']->id;
$item['unitSale'] = $Product_data['unitSale']->ShortName;
$item['tax_method'] = $Product_data['tax_method'];
$item['tax_percent'] = $Product_data['TaxNet'];
$item['is_imei'] = $Product_data['is_imei'];
if ($Product_data['unitSale']->operator == '/') {
$price = $Product_data['price'] / $Product_data['unitSale']->operator_value;
} else {
$price = $Product_data['price'] * $Product_data['unitSale']->operator_value;
}
if ($Product_data['unitPurchase']->operator == '/') {
$cost = $Product_data['cost'] / $Product_data['unitPurchase']->operator_value;
} else {
$cost = $Product_data['cost'] * $Product_data['unitPurchase']->operator_value;
}
$item['Unit_cost'] = $cost;
$item['fix_cost'] = $Product_data['cost'];
$item['Unit_price'] = $price;
$item['fix_price'] = $Product_data['price'];
if ($Product_data->TaxNet !== 0.0) {
//Exclusive
if ($Product_data['tax_method'] == '1') {
$tax_price = $price * $Product_data['TaxNet'] / 100;
$tax_cost = $cost * $Product_data['TaxNet'] / 100;
$item['Total_cost'] = $cost + $tax_cost;
$item['Total_price'] = $price + $tax_price;
$item['Net_cost'] = $cost;
$item['Net_price'] = $price;
$item['tax_price'] = $tax_price;
$item['tax_cost'] = $tax_cost;
// Inxclusive
} else {
$item['Total_cost'] = $cost;
$item['Total_price'] = $price;
$item['Net_cost'] = $cost / (($Product_data['TaxNet'] / 100) + 1);
$item['Net_price'] = $price / (($Product_data['TaxNet'] / 100) + 1);
$item['tax_cost'] = $item['Total_cost'] - $item['Net_cost'];
$item['tax_price'] = $item['Total_price'] - $item['Net_price'];
}
} else {
$item['Total_cost'] = $cost;
$item['Total_price'] = $price;
$item['Net_cost'] = $cost;
$item['Net_price'] = $price;
$item['tax_price'] = 0;
$item['tax_cost'] = 0;
}
$data[] = $item;
return response()->json($data[0]);
}
//-------------- Product Quantity Alerts ---------------\\
public function Products_Alert(request $request)
{
$this->authorizeForUser($request->user('api'), 'Stock_Alerts', Product::class);
$product_warehouse_data = product_warehouse::with('warehouse', 'product', 'productVariant')
->join('products', 'product_warehouse.product_id', '=', 'products.id')
->whereRaw('qte <= stock_alert')
->where(function ($query) use ($request) {
return $query->when($request->filled('warehouse'), function ($query) use ($request) {
return $query->where('warehouse_id', $request->warehouse);
});
})->where('product_warehouse.deleted_at', null)->get();
$data = [];
if ($product_warehouse_data->isNotEmpty()) {
foreach ($product_warehouse_data as $product_warehouse) {
if ($product_warehouse->qte <= $product_warehouse['product']->stock_alert) {
if ($product_warehouse->product_variant_id !== null) {
$item['code'] = $product_warehouse['productVariant']->name . '-' . $product_warehouse['product']->code;
} else {
$item['code'] = $product_warehouse['product']->code;
}
$item['quantity'] = $product_warehouse->qte;
$item['name'] = $product_warehouse['product']->name;
$item['warehouse'] = $product_warehouse['warehouse']->name;
$item['stock_alert'] = $product_warehouse['product']->stock_alert;
$data[] = $item;
}
}
}
$perPage = $request->limit; // How many items do you want to display.
$pageStart = \Request::get('page', 1);
// Start displaying items from this number;
$offSet = ($pageStart * $perPage) - $perPage;
$collection = collect($data);
// Get only the items you need using array_slice
$data_collection = $collection->slice($offSet, $perPage)->values();
$products = new LengthAwarePaginator($data_collection, count($data), $perPage, Paginator::resolveCurrentPage(), array('path' => Paginator::resolveCurrentPath()));
//get warehouses assigned to user
$user_auth = auth()->user();
if($user_auth->is_all_warehouses){
$warehouses = Warehouse::where('deleted_at', '=', null)->get(['id', 'name']);
}else{
$warehouses_id = UserWarehouse::where('user_id', $user_auth->id)->pluck('warehouse_id')->toArray();
$warehouses = Warehouse::where('deleted_at', '=', null)->whereIn('id', $warehouses_id)->get(['id', 'name']);
}
return response()->json([
'products' => $products,
'warehouses' => $warehouses,
]);
}
//---------------- Show Form Create Product ---------------\\
public function create(Request $request)
{
$this->authorizeForUser($request->user('api'), 'create', Product::class);
$categories = Category::where('deleted_at', null)->get(['id', 'name']);
$brands = Brand::where('deleted_at', null)->get(['id', 'name']);
$units = Unit::where('deleted_at', null)->where('base_unit', null)->get();
return response()->json([
'categories' => $categories,
'brands' => $brands,
'units' => $units,
]);
}
//---------------- Show Elements Barcode ---------------\\
public function Get_element_barcode(Request $request)
{
$this->authorizeForUser($request->user('api'), 'barcode', Product::class);
//get warehouses assigned to user
$user_auth = auth()->user();
if($user_auth->is_all_warehouses){
$warehouses = Warehouse::where('deleted_at', '=', null)->get(['id', 'name']);
}else{
$warehouses_id = UserWarehouse::where('user_id', $user_auth->id)->pluck('warehouse_id')->toArray();
$warehouses = Warehouse::where('deleted_at', '=', null)->whereIn('id', $warehouses_id)->get(['id', 'name']);
}
return response()->json(['warehouses' => $warehouses]);
}
//---------------- Show Form Edit Product ---------------\\
public function edit(Request $request, $id)
{
$this->authorizeForUser($request->user('api'), 'update', Product::class);
$Product = Product::where('deleted_at', '=', null)->findOrFail($id);
$item['id'] = $Product->id;
$item['code'] = $Product->code;
$item['Type_barcode'] = $Product->Type_barcode;
$item['name'] = $Product->name;
if ($Product->category_id) {
if (Category::where('id', $Product->category_id)
->where('deleted_at', '=', null)
->first()) {
$item['category_id'] = $Product->category_id;
} else {
$item['category_id'] = '';
}
} else {
$item['category_id'] = '';
}
if ($Product->brand_id) {
if (Brand::where('id', $Product->brand_id)
->where('deleted_at', '=', null)
->first()) {
$item['brand_id'] = $Product->brand_id;
} else {
$item['brand_id'] = '';
}
} else {
$item['brand_id'] = '';
}
if ($Product->unit_id) {
if (Unit::where('id', $Product->unit_id)
->where('deleted_at', '=', null)
->first()) {
$item['unit_id'] = $Product->unit_id;
} else {
$item['unit_id'] = '';
}
if (Unit::where('id', $Product->unit_sale_id)
->where('deleted_at', '=', null)
->first()) {
$item['unit_sale_id'] = $Product->unit_sale_id;
} else {
$item['unit_sale_id'] = '';
}
if (Unit::where('id', $Product->unit_purchase_id)
->where('deleted_at', '=', null)
->first()) {
$item['unit_purchase_id'] = $Product->unit_purchase_id;
} else {
$item['unit_purchase_id'] = '';
}
} else {
$item['unit_id'] = '';
}
$item['tax_method'] = $Product->tax_method;
$item['price'] = $Product->price;
$item['cost'] = $Product->cost;
$item['stock_alert'] = $Product->stock_alert;
$item['TaxNet'] = $Product->TaxNet;
$item['note'] = $Product->note ? $Product->note : '';
$item['images'] = [];
if ($Product->image != '' && $Product->image != 'no-image.png') {
foreach (explode(',', $Product->image) as $img) {
$path = public_path() . '/images/products/' . $img;
if (file_exists($path)) {
$itemImg['name'] = $img;
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$itemImg['path'] = 'data:image/' . $type . ';base64,' . base64_encode($data);
$item['images'][] = $itemImg;
}
}
} else {
$item['images'] = [];
}
if ($Product->is_variant) {
$item['is_variant'] = true;
$productsVariants = ProductVariant::where('product_id', $id)
->where('deleted_at', null)
->get();
foreach ($productsVariants as $variant) {
$variant_item['id'] = $variant->id;
$variant_item['text'] = $variant->name;
$variant_item['qty'] = $variant->qty;
$variant_item['product_id'] = $variant->product_id;
$item['ProductVariant'][] = $variant_item;
}
} else {
$item['is_variant'] = false;
$item['ProductVariant'] = [];
}
$item['is_imei'] = $Product->is_imei?true:false;
$data = $item;
$categories = Category::where('deleted_at', null)->get(['id', 'name']);
$brands = Brand::where('deleted_at', null)->get(['id', 'name']);
$product_units = Unit::where('id', $Product->unit_id)
->orWhere('base_unit', $Product->unit_id)
->where('deleted_at', null)
->get();
$units = Unit::where('deleted_at', null)
->where('base_unit', null)
->get();
return response()->json([
'product' => $data,
'categories' => $categories,
'brands' => $brands,
'units' => $units,
'units_sub' => $product_units,
]);
}
// import Products
public function import_products(Request $request)
{
try {
\DB::transaction(function () use ($request) {
$file_upload = $request->file('products');
$ext = pathinfo($file_upload->getClientOriginalName(), PATHINFO_EXTENSION);
if ($ext != 'csv') {
return response()->json([
'msg' => 'must be in csv format',
'status' => false,
]);
} else {
$data = array();
$rowcount = 0;
if (($handle = fopen($file_upload, "r")) !== false) {
$max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000;
$header = fgetcsv($handle, $max_line_length);
$header_colcount = count($header);
while (($row = fgetcsv($handle, $max_line_length)) !== false) {
$row_colcount = count($row);
if ($row_colcount == $header_colcount) {
$entry = array_combine($header, $row);
$data[] = $entry;
} else {
return null;
}
$rowcount++;
}
fclose($handle);
} else {
return null;
}
$warehouses = Warehouse::where('deleted_at', null)->pluck('id')->toArray();
//-- Create New Product
foreach ($data as $key => $value) {
$category = Category::firstOrCreate(['name' => $value['category']]);
$category_id = $category->id;
$unit = Unit::where(['ShortName' => $value['unit']])
->orWhere(['name' => $value['unit']])->first();
$unit_id = $unit->id;
if ($value['brand'] != 'N/A' && $value['brand'] != '') {
$brand = Brand::firstOrCreate(['name' => $value['brand']]);
$brand_id = $brand->id;
} else {
$brand_id = null;
}
$Product = new Product;
$Product->name = $value['name'] == '' ? null : $value['name'];
$Product->code = $value['code'] == '' ? '11111111' : $value['code'];
$Product->Type_barcode = 'CODE128';
$Product->price = $value['price'];
$Product->cost = $value['cost'];
$Product->category_id = $category_id;
$Product->brand_id = $brand_id;
$Product->TaxNet = 0;
$Product->tax_method = 1;
$Product->note = $value['note'] ? $value['note'] : '';
$Product->unit_id = $unit_id;
$Product->unit_sale_id = $unit_id;
$Product->unit_purchase_id = $unit_id;
$Product->stock_alert = $value['stock_alert'] ? $value['stock_alert'] : 0;
$Product->is_variant = 0;
$Product->image = 'no-image.png';
$Product->save();
if ($warehouses) {
foreach ($warehouses as $warehouse) {
$product_warehouse[] = [
'product_id' => $Product->id,
'warehouse_id' => $warehouse,
];
}
}
}
if ($warehouses) {
product_warehouse::insert($product_warehouse);
}
}
}, 10);
return response()->json([
'status' => true,
], 200);
} catch (ValidationException $e) {
return response()->json([
'status' => false,
'msg' => 'error',
'errors' => $e->errors(),
]);
}
}
// Generate_random_code
public function generate_random_code($value_code)
{
if($value_code == ''){
$gen_code = substr(number_format(time() * mt_rand(), 0, '', ''), 0, 8);
$this->check_code_exist($gen_code);
}else{
$this->check_code_exist($value_code);
}
}
// check_code_exist
public function check_code_exist($code)
{
$check_code = Product::where('code', $code)->first();
if ($check_code) {
$this->generate_random_code($code);
} else {
return $code;
}
}
}