KUJUNTI.ID MINISH3LL
Path : /var/www/html/jewelry-pos/app/Http/Controllers/
(S)h3ll Cr3at0r :
F!le Upl0ad :

B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H

Current File : /var/www/html/jewelry-pos/app/Http/Controllers/ProductController.php


<?php

namespace App\Http\Controllers;

use App\Exports\ProductExport;
use App\Exports\MemberExport;
use App\Exports\SampleProductExport;
use App\Imports\ProductImport;
use App\Models\BuildStockDate;
use App\Models\BuildStockProduct;
use App\Models\BuildStockProductAttribute;
use App\Models\Product;
use App\Models\ProductCategory;
use App\Models\ProductReady;
use App\Models\QtyHistory;
use App\Models\Setting;
use App\Models\Supplier;
use App\Models\User;
use Carbon\Carbon;
use Faker\Core\File;
use http\Exception;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Models\ProductAttribute;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Auth;
//use Maatwebsite\Excel\Excel;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Client\Response;
use function Symfony\Component\Translation\t;


class ProductController extends Controller
{

    function __construct()
    {
        set_time_limit(500000);
        $this->middleware('permission:product-list', ['only' => ['index', 'show']]);
        $this->middleware('permission:product-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:product-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:product-delete', ['only' => ['destroy']]);
    }

    public function build_stock($id=null)
    {
        Artisan::call('build:stock', ['id' => $id]);

        return redirect()->back()->with('success' , __('message.stock build successfully'));
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     */
    public function exportProduct(Request $request)
    {
        return Excel::download(new ProductExport($request->get('q'), $request->get('for_sale'), $request->get('category'), $request->get('paginate')), 'Product.xlsx');
    }
    public function sample()
    {
        return Excel::download(new SampleProductExport(), 'Product Sample.xlsx');
    }
    public function import(Request $request)
    {

        $request->validate([
            'browFile' => 'required|file|mimes:xlsx,xls|max:2048',
        ]);

        if (empty($request->file('browFile')->getRealPath())) {
            return back()->with('success', 'No file selected');
        } else {
            $import = new ProductImport();
            $array = Excel::toCollection($import, $request->file('browFile'));
            foreach ($array as $i => $row) {
                foreach ($row as $s => $val) {
                    if ($s > 0) {
                        $for_sale = 1;
                        $productCategory = ProductCategory::where('name', $val[1]??'')->first();
                        $gold=ProductCategory::whereIn('name',['មាស','Gold','ทอง'])->first();

                        if($productCategory->name == 'ផ្លាកទីន' || $productCategory->name == 'Platinum' || $productCategory->name == 'แพลตตินัม') {

                            if (!$val[9]) {
                                $product_category = ProductCategory::whereIn('name', ['ផ្លាកទីនអ៊ីតាលី', 'អ៊ីតាលី', 'Platinum Italy', 'Italy', 'แพลตตินั่มอิตาลี', 'อิตาลี'])->first();
                            } else {
                                $product_category = ProductCategory::where('name', 'like', 'ផ្លាកទីន%')->where('purity_level', $val[9])->first();
                            }
                            if(!$product_category && $val[32]){
                                $product_category = ProductCategory::where('name' , 'like' , 'ផ្លាកទីន%')->where('purity_level', $val[32])->first();
                            }
                        }
                        $purity_level = $val[9]??'';

                        if($productCategory->name === $gold->name){
                            if($val[7] == 'មាសថៃ'){
                                $product_category = ProductCategory::whereIn('name' , ['មាសថៃ' , 'Thai Gold' , 'ทองไทย' ,])->first();
                            }elseif($val[7] == 'មាសដុំ'){
                                $product_category = ProductCategory::whereIn('name' , ['មាសដុំ'])->first();
                                $for_sale = 0;
                            }else{
                                $product_category = $productCategory;
                            }
                        }

                        if($val[12]){
                            $original_wages = ($val[12] * $val[16]) / 1000;
                            $original_wages_in_weight = $val[12]??0;
                        }else{
                            $original_wages = $val[13]??0;
                            // $original_wages_in_weight = ($val[13]*$val[16])/1000;
                            $val16 = $val[16]??0;
                            $val13 = $val[13]??0;

                            $original_wages_in_weight = $val13 / ($val16 * 1000);
                        }

                        if($productCategory->fixed_price == false){
                            $wages_in_weight = $val[24]??0;
                            $selling_wages = ($val[24] * $val[16]) / 1000;
                        }else{
                            $selling_wages = $val[24]??0;
                            $wages_in_weight = $val[24]/($val[16]*1000);
                        }
                        $product_category_id = $product_category->id??$productCategory->id;
                        try {
                            $price = $val[25]??0;
                            $cost = $val[22]??0;
                        }catch (Exception $e){
                            echo 'Caught exception: ',  $e->getMessage(), "\n";
                        }

                        $weight_description = '';
                        if($productCategory->fixed_price){
                            $weight_description = $val[9]??'';
                        }
                        if($val[4]){
                            $supplier = Supplier::where('name' , $val[4])->first();
                            if(!$supplier){
                                $supplier = Supplier::create([
                                    'name' => $val[4]??'',
                                    'phone' => '',
                                    'note' => '',
                                ]);
                            }
                        }
                        $supplier_id = $supplier->id??0;
                        $fixed_price = false;
                        $selling_price = 0;
                        $sellPrice = $val[28]??0;
                        if($sellPrice){
                            $selling_price = $val[28]??0;
                            $fixed_price = true;
                        }
                        if($fixed_price == true){
                            $cost_invoice = $val[23] - $cost - $original_wages;
                        }else{
                            $cost_invoice = $val[23] - $cost;
                        }

                        $qty = $val[5]??1;

                        $products = Product::create([
                            'fixed_price' => $fixed_price,
                            'supplier_id' => $supplier_id,
                            'supplier_rate' => $val[16]??'',
                            'gia_number' => $val[18],
                            'part_number' => $val[6],
                            'name' => $val[7]??'',
                            'weight' => $val[8]??0,
                            'original_wages' => $original_wages??0,
                            'wages' => $selling_wages,
                            'diamond_size' => $val[17]??'',
                            'weight_description' => $weight_description,
                            'cost' => $cost_invoice??0,
                            'price' => $selling_price??0,
                            'product_category_id' => $product_category_id,
                            'description' => $val[29]??'',
                            'qty' => $qty,
                            'user_id' => Auth::user()->id,
                            'for_sale' => $for_sale,
                            'purity_level' => $purity_level??'',
                            'original_wages_in_weight' => $original_wages_in_weight??0,
                            'wages_in_weight' => $wages_in_weight??0,
                            'purity_upgrade_to' => $val[30]??0,
                            'selling_purity' => $val[31]??0,
                            'old_code' => $val[33]??'',
                            'original_invoice' => $val[34]??'',
                        ]);
                        if($price != 0 && $price != ''){
                            ProductAttribute::create([
                                'name' => $val[20]??'',
                                'cost' => $cost??0,
                                'price' => $price??0,
                                'qty' => $val[21]??'',
                                'product_id' => $products->id,
                            ]);
                        }

                        QtyHistory::create([
                            'qty' => $products->qty,
                            'qty_after_transaction' => $products->qty,
                            'qty_before_transaction' => 0,
                            'product_id' => $products->id,
                            'product_category_id' => $products->product_category_id,
                            'user_id' => Auth::user()->id,
                            'note' => '',
                            'grn' => $val[30]??'',
                        ]);

                    }
                }
            }
        }
        return redirect()->route('products.index')->with('__("message.sussfully")');
    }
    public function index(Request $request)
    {
        $product_category_id = $request->get('product_category_id');
        $productCategories = ProductCategory::get();
        $paginate = $request->get('paginate') ?? 25;
        $for_sale = $request->get('for_sale') ?? 1;
        $q = $request->get('q');
        $products = Product::query();
        if ($for_sale >= 0 && $for_sale != null) {
            $products = $products->where('for_sale', $for_sale);
        }
        if ($q) {
            $products = $products->where(function ($query) use ($q) {
                $query->where('part_number', 'like', '%' . $q . '%');
            });
        }
        if ($product_category_id) {
            $productCategory = ProductCategory::findOrFail($product_category_id);
            $products = $products->whereIn('product_category_id' , $productCategory->IdvsAllSubCategories());
        }

        $productCategories1 = clone $productCategories;
        $main_categories = $productCategories1->where('parent_id' , null);
        $productCategories2 = clone $productCategories;
        $child_categories = $productCategories2->where('parent_id' , '<>' , '');

        $products = $products->orderBy('id', 'desc')->paginate($paginate);
        return view('products.index', compact('products', 'q', 'paginate', 'for_sale', 'productCategories' , 'main_categories' , 'child_categories', 'product_category_id'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $productCategories = ProductCategory::whereNotIn('name',['Platinum','ផ្លាកទីន','แพลตตินัม'])->get();
        $suppliers = Supplier::all();
        return view('products.create', compact('productCategories','suppliers'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate(
            [
                'name' => 'required',
                'cost' => 'required',
                'weight' => 'required',
                'part_number' => 'required',
            ]
        );
        // dd($request->all());
        $save_url = '';
        if ($request->hasFile('image')) {
            $image = $request->file('image');
            $name_gen = hexdec(uniqid()) . '.' . $image->getClientOriginalExtension(); //hexdec generate image
            Image::make($image)->resize(800, 800, function ($constraint) {
                $constraint->aspectRatio();
            })->save('images/' . $name_gen);
            $save_url = 'images/' . $name_gen;
        }
        do {
            $part_number = $request->get('part_number');
            $invoice = random_int(000000000, 999999999);
        } while (DB::table('products')->where('part_number', $part_number)->exists());
        // dd($request->all()); price

        $fixed_price = $request->fixed_price === 'true'?true:false;
        $product = Product::create([
            'image' => $save_url??'',
            'part_number' => $part_number??'',
            'invoice' => $invoice??'',
            'name' => $request->name??'',
            'cost' => $request->cost??0,
            'price' => $request->price ?? 0,
            'weight' => $request->weight??0,
            'description' => $request->description??'',
            'diamond_size' => $request->diamond_size ?? '',
            'user_id' => Auth::user()->id,
            'product_category_id' => $request->product_category_id,

            'is_active' => $request->is_active ?? true,
            'wages' => $request->wages??0,
            'original_wages' => $request->original_wages??0,
            'wages_in_weight' => $request->wages_in_weight??0,
            'original_wages_in_weight' => $request->original_wages_in_weight??0,
            'qty' => 1,
            // 'grn' => $request->grn,
            'for_sale' => $request->for_sale,
            'supplier_id'=>$request->supplier_id,
            'supplier_rate' => $request->supplier_rate??0,
            'gia_number' => $request->gia_number??'',
            'fixed_price' => $fixed_price??false,
            'purity_upgrade_to' => $request->purity_upgrade_to??0,
            'selling_purity' => $request->selling_purity??0,
            'purity_level' => $request->purity_level??0,
            'original_invoice' => $request->original_invoice??'',
        ]);
        foreach ($request->qty_ as $index => $qty) {
             if (isset($request->name_[$index])&&isset($request->price_[$index])&&isset($request->cost_[$index])&&isset($request->qty_[$index]) && $request->name_[$index]!='' &&$request->price_[$index]!=''&& $request->cost_[$index]!='' && $request->qty_[$index]!='') {
                ProductAttribute::create([
                    'product_id' => $product->id ?? 0,
                    'name' => $request->name_[$index]??'',
                    'price' => $request->price_[$index]??0,
                    'cost' => $request->cost_[$index]??0,
                    'qty' => $request->qty_[$index]??0,
                ]);
            }
        }
        return redirect()->route('products.index')->with('success', __('message.products') . " " . __('message.create successfully'));
    }
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function list(Request $request)
    {
        $cashie = Auth::user()->name;
        $cate = $request->get('category');
        $ProductCategories = ProductCategory::get();
        $paginate = $request->get('paginate') ?? 25;
        $for_sale = $request->get('for_sale')??1;
        $q = $request->get('q');
        $products = Product::query();
        if ($q) {
            $products = $products->where(function ($query) use ($q) {
                $query->where('part_number', 'like', '%' . $q . '%');
            });
        }
        if ($for_sale >= 0 && $for_sale != null) {
            $products = $products->where('for_sale', $for_sale);
        }
        if ($cate) {
            $products = $products->where('product_category_id', $cate);
        }
        $products = $products->orderBy('id', 'desc')->get();
        return view('products.list', compact('products', 'q', 'paginate', 'for_sale', 'ProductCategories', 'cate', 'cashie'));
    }

    public function show(Request $request, $id)
    {
        $cate = $request->get('category');
        $for_sale = $request->get('for_sale')??1;
        $paginate = $request->get('paginate') ?? 25;
        $q = $request->get('q');
        $product = Product::find($id);
        return view('products.barcode', compact('product', 'q', 'for_sale', 'paginate', 'cate', 'for_sale'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id, Request $request)
    {
        $for_sale = $request->get('for_sale')??1;
        $product = Product::find($id);
        $productCategories = ProductCategory::whereNotIn('name',['Platinum','ផ្លាកទីន','แพลตตินัม'])->get();
         $suppliers = Supplier::all();
        return view('products.edit', compact('product', 'productCategories', 'for_sale','suppliers'));
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $request->validate(
            [
                'name' => 'required',
                'cost' => 'required',
                'price' => 'required',

                'weight' => 'required',
                'part_number' => 'required',
            ]
        );
        $product = Product::find($id);
        $save_url = $product->image;
        if ($request->hasFile('image')) {
            $image = $request->file('image');
            $name_gen = hexdec(uniqid()) . '.' . $image->getClientOriginalExtension(); //hexdec generate image
            Image::make($image)->resize(800, 800, function ($constraint) {
                $constraint->aspectRatio();
            })->save('images/' . $name_gen);
            $save_url = 'images/' . $name_gen;
        }
        //        $product['image'] = $save_url;
        $part_number = $request->part_number;
        $invoice = $product->invoice;
        $fixed_price = $request->fixed_price === 'true'?true:false;
        $product->update([
            'for_sale' => $request->for_sale,
            'image' => $save_url??'',
            'part_number' => $part_number,
            'name' => $request->name??'',
            'cost' => $request->cost??0,
            'price' => $request->price??0,
            'weight' => $request->weight??0,
            'description' => $request->description??'',
            'user_id' => Auth::user()->id,
            'product_category_id' => $request->product_category_id,
            'is_active' => $request->is_active ?? true,
            'invoice' => $invoice??'',
            'wages' => $request->wages??0,
            'original_wages' => $request->original_wages??0,
            // 'qty' => $request->qty??1,
            'diamond_size' => $request->diamond_size ?? '',
            'supplier_id' => $request->supplier_id,
            'supplier_rate' => $request->supplier_rate??0,
            'gia_number' => $request->gia_number??'',
            'fixed_price' => $fixed_price,
            'wages_in_weight' => $request->wages_in_weight??0,
            'original_wages_in_weight' => $request->original_wages_in_weight??0,
            'purity_upgrade_to' => $request->purity_upgrade_to??0,
            'selling_purity' => $request->selling_purity??0,
            'purity_level' => $request->purity_level??0,
            'original_invoice' => $request->original_invoice??'',
        ]);

        // update ProductAttribute
        // if (!empty($product->id)) {
        //     foreach ($request->qty_ as $index => $pro_attr_Id_) {
        //         // dd($request->pro_attr_Id);
        //         if ($request->pro_attr_Id_) {
        //             ProductAttribute::where('id', $pro_attr_Id_)->update([
        //                 // 'product_id' => $product->id ?? 0,
        //                 'name' => $request->name_[$index],
        //                 'price' => $request->price_[$index],
        //                 'cost' => $request->cost_[$index],
        //                 'qty' => $request->qty_[$index],
        //             ]);
        //         } else {
        //             ProductAttribute::create([
        //                 'product_id' => $product->id ?? 0,
        //                 'name' => $request->name_[$index],
        //                 'price' => $request->price_[$index],
        //                 'cost' => $request->cost_[$index],
        //                 'qty' => $request->qty_[$index],
        //             ]);
        //         }
        //     }
        // }
        // update ProductAttribute
        if (!empty($product->id)) {
            foreach ($request->qty_ as $index => $qty) {
                // dd($request->pro_attr_Id);
                if (isset($request->pro_attr_Id[$index])) {
                    ProductAttribute::where('id', $request->pro_attr_Id[$index])->update([
                        'name' => $request->name_[$index],
                        'price' => $request->price_[$index],
                        'cost' => $request->cost_[$index],
                        'qty' => $request->qty_[$index],
                    ]);
                } else {
                    if (!empty($request->name_[$index])) {
                        ProductAttribute::create([
                            'product_id' => $product->id ?? 0,
                            'name' => $request->name_[$index],
                            'price' => $request->price_[$index],
                            'cost' => $request->cost_[$index],
                            'qty' => $request->qty_[$index],
                        ]);
                    }
                }
            }
        }
        return redirect()->route('products.index')
            ->with('success', __('message.product') . " " . __('message.updated successfully'));
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $sales = \App\Models\Sale::get();
        $product = Product::find($id);
        $product_id = $product->id;
        foreach ($sales as $sale){
            if($sale->part_number == $product->part_number){
                return redirect()->route('products.index')->with('fail', __('message.product') . ' ' . __('message.already sale cannot delete'));
            }
        }
        $product->delete();
        $qty_history = QtyHistory::where('product_id' , $product_id)->delete();
        return redirect()->route('products.index')
            ->with('success', __('message.product') . " " . __('message.deleted successfully'));
    }

    // ProductInactive
    public function inactive($id)
    {
        Product::findOrFail($id)->update(['is_active' => 0]);
        return redirect()->route('products.index')
            ->with('success', __('message.product') . " " . __('message.is deactivated'));
    }

    // ProductActive
    public function active($id)
    {
        Product::findOrFail($id)->update(['is_active' => 1]);
        return redirect()->route('products.index')
            ->with('success', __('message.product') . " " . __('message.is activated'));
    }

    public function print_barcode(Request $request)
    {
        $cate = $request->get('category');
        $paginate = $request->get('paginate') ?? 25;
        $for_sale = $request->get('for_sale')??1;
        $q = $request->get('q');
        $products = Product::query();
        if ($q) {
            $products = $products->where(function ($query) use ($q) {
                $query->where('part_number', 'like', '%' . $q . '%');
            });
        }
        if ($for_sale >= 0 && $for_sale != null) {
            $products = $products->where('for_sale', $for_sale);
        }
        if ($cate) {
            $products = $products->where('product_category_id', $cate);
        }
        $products = $products->orderBy('id', 'desc')->get();
        return view('products.print_barcode', compact('products', 'q', 'paginate', 'for_sale', 'cate'));
    }

    public function product_attribute_destroy($id, Request $request)
    {
        $productAttribute = ProductAttribute::find($id);
        if ($productAttribute) {
            $productAttribute->delete();
        }
        return redirect()->route('products.index')->with('success', __('message.product attribute') . ' ' . __('message.deleted successfully'));
    }
    // delete in edit
    public function product_attribute_delete($id)
    {
        $productAttribute = ProductAttribute::findOrFail($id);
        // dd($productAttribute);
        if ($productAttribute) {
            $productAttribute->delete();
        }
        return redirect()->back()->with('success', __('message.product attribute') . ' ' . __('message.deleted successfully'));
    }
    public function adjustment()
    {
        $products = Product::all();
        foreach($products as $product){
            $product->cost = $product->cost - $product->costAttributes();
            $product->save();
        }
    }

    public function response(Request $request)
    {
        $product_category_id = $request->get('product_category_id');
        $productCategories = ProductCategory::query();
        $productCategory1 = clone $productCategories;
        $productCategory = $productCategory1->where('id' , $product_category_id)->first();
        $gold1 = clone $productCategories;
        $gold = $gold1->whereIn('name',['មាស','Gold','ทอง'])->first();
        $platinum1 = clone $productCategories;
        return response()->json([$productCategory , 'gold' => $gold]);
    }

    public function createProductAccessory(){
        $productCategories = ProductCategory::get();
        foreach($productCategories as $index => $productCategory){
            $products = Product::get();
            $name = $productCategory->name . ' គីឡូ';
            if($products->contains('name' , $name)){

            }else{
                if($productCategory->name != 'ផ្លាកទីន'){
                    $products = Product::create([
                        'image' => '',
                        'part_number' => '',
                        'invoice' => '',
                        'name' => $productCategory->name . ' គីឡូ',
                        'cost' => 0,
                        'price' => 0,
                        'weight' => 0,
                        'description' => '',
                        'diamond_size' => '',
                        'user_id' => Auth::user()->id,
                        'product_category_id' => $productCategory->id,
                        'is_active' => true,
                        'wages' => 0,
                        'original_wages' => 0,
                        'wages_in_weight' => 0,
                        'original_wages_in_weight' => 0,
                        'qty' => 1,
                        'for_sale' => 0,
                        'supplier_id'=> 0,
                        'supplier_rate' => 0,
                        'gia_number' => '',
                        'fixed_price' => false,
                        'purity_upgrade_to' => 0,
                        'selling_purity' => 0,
                        'purity_level' => $productCategory->purity_level??0,
                        'original_invoice' =>'',
                    ]);
                }
            }
        }
        return redirect()->route('products.index')->with('success' , 'create accessory success');
    }
}

© KUJUNTI.ID