Current File : //home/tradevaly/www/app/Http/Controllers/User/ProductController.php
<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use App\Models\AdvertiserOrder;
use App\Models\Award;
use App\Models\BuyOffer;
use App\Models\Category;
use App\Models\Certificate;
use App\Models\Company;
use App\Models\Country;
use App\Models\FeaturedProduct;
use App\Models\FeaturedRequest;
use App\Models\Income;
use App\Models\Message;
use App\Models\Messsage;
use App\Models\Method;
use App\Models\Package;
use App\Models\AdminNotification;
use App\Models\Pdf;
use App\Models\Product;
use App\Models\QuoteMessage;
use App\Models\Subscriber;
use App\Models\Tag;
use App\Models\Thread;
use App\Models\Thumb;
use App\Models\ProductPrice;
use App\Models\User;
use Brian2694\Toastr\Facades\Toastr;
use Carbon\Carbon;
use DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use App\Http\Controllers\User\UserController;
use shurjopayv2\ShurjopayLaravelPackage8\Http\Controllers\ShurjopayController;


class ProductController extends Controller
{
    

    public function products()
    {


        $data['products'] = Product::where('supplier_id', Auth::user()->id)->where('status', 1)->paginate(50);
        return view('user.pages.product.index')->with($data);
    }
    public function pending_product()
    {


        $data['products'] = Product::where('supplier_id', Auth::user()->id)->where('status', 0)->latest()->paginate(50);

        return view('user.pages.product.index')->with($data);
    }

    public function rej_product()
    {
        $data['products'] = Product::where('supplier_id', Auth::user()->id)->where('status', 5)->paginate(50);

        return view('user.pages.product.index')->with($data);
    }

    public function trashed_product()
    {
        $data['products'] = Product::onlyTrashed()->where('supplier_id', Auth::user()->id)->paginate(50);

        return view('user.pages.product.index')->with($data);
    }

    public function delproduct($id)
    {
        $user  =  new UserController();
        $product = Product::findOrFail($id);
        $user->feature_delete_by_product($product->id);
        $user->buy_offer_delete_by_product($product->id);
        $product->delete();

        Toastr::success('Success!', 'Product deleted!');
        return redirect()->back();
    }

    public function trashed_product_destroy($id)
    {
        $user  =  new UserController();
        
        $product = Product::onlyTrashed()->where('id', $id)->where('supplier_id', Auth::id())->firstOrFail();
        $user->delete_trash_product($product);
        Toastr::success('Success!', 'Product Permanent Deleted!');
        return redirect()->back();
    }

    public function trash_product_rerurn($id)
    {
        $user  =  new UserController();
        
        $product = Product::onlyTrashed()->where('id', $id)->where('supplier_id', Auth::id())->firstOrFail();
        if (!Category::find($product->child_id)) {
            Toastr::error('Error!', "Product Category Has Been Deleted You can't Restore The Product ");
            return back();
        }
        $user->restore_trash_product($product);
        Toastr::success('Success!', 'Product Restore Successfully!');
        return back();
    }

    // Trashed Product Restore Methods

    public function restore_trash_product($product)
    {
        $product->restore();
        return true;

    }

    // Trashed Product Permanent Methods
    public function delete_trash_product($product)
    {
        $user  =  new UserController();
        
        $user->feature_delete_by_product($product->id);
        $user->buy_offer_delete_by_product($product->id);
        if ($product->image !== 'image.jpg') {
            if (Storage::disk('public')->exists('images/admin/product/' . $product->image)) {
                Storage::disk('public')->delete('images/admin/product/' . $product->image);
            }
        }
        if (Storage::disk('public')->exists('images/admin/product/' . $product->gallary1)) {
            Storage::disk('public')->delete('images/admin/product/' . $product->gallary1);
        }
        if (Storage::disk('public')->exists('images/admin/product/' . $product->gallary2)) {
            Storage::disk('public')->delete('images/admin/product/' . $product->gallary2);
        }
        if (Storage::disk('public')->exists('images/admin/product/' . $product->gallary3)) {
            Storage::disk('public')->delete('images/admin/product/' . $product->gallary3);
        }
        if (Storage::disk('public')->exists('images/admin/product/' . $product->gallary4)) {
            Storage::disk('public')->delete('images/admin/product/' . $product->gallary4);
        }
        $product->forceDelete();
        return true;
    }

    public function editproduct(Request $request, $id)
    {
        $data['currencies'] =Country::whereNotNull('currency')->groupBy('currency')->orderBy('currency', 'asc')->pluck('currency');
                        
        $product = Product::find($id);
        if ($request->isMethod("post")) {
            
            
        $request->validate([
                'category_id' => ['required'],
                'sub_id' => ['required'],
                'child_id' => ['required'],
                'title' => ['required'],
                'origin' => ['required'],
                'des' => ['required'],
                'currency' => ['required'],
                'qty' => ['nullable']
            ]);

            if ($request->hasFile('image')) {

                $image = $request->file('image');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->image)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->image);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->image = $imageName;
            }


            if ($request->hasFile('gallary1')) {

                $image = $request->file('gallary1');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary1)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary1);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary1 = $imageName;
            }


            if ($request->hasFile('gallary2')) {

                $image = $request->file('gallary2');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary2)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary2);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary2 = $imageName;
            }


            if ($request->hasFile('gallary3')) {

                $image = $request->file('gallary3');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary3)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary3);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary3 = $imageName;
            }


            if ($request->hasFile('gallary4')) {

                $image = $request->file('gallary4');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary4)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary4);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary4 = $imageName;
            }


            $product->ip = visitorip();
            $product->title = $request->title;
            $product->date = date('Y-m-d');
            $product->slug = Str::slug($request->title);
            $product->details = $request->des;
            $product->country_id = Auth::user()->country_id;
            if ($request->filled('child_id')) {
                $product->category_id = $request->category_id;
                $product->sub_id = $request->sub_id;
                $product->child_id = $request->child_id;
            } else {
                $product->category_id = $request->category_id;
                $product->sub_id = $request->sub_id;
            }
            $product->status = 0;
            $product->video = $request->video;
            $product->tags = json_encode($request->tags);
            $product->processing_time = $request->processing_time;
            $product->port = $request->port;
            $product->unit = $request->unit;
            $product->supply_ability = $request->supply_ability;
            $product->payment_method = $request->payment_method;
            $product->origin = $request->origin;
            $product->location = $request->location;
            $product->currency = $request->currency;
            $product->stock = $request->stock;
            $product->location = $request->location;
            $product->price = $request->single_price;
            $product->discount_price = $request->discount_price;
            $product->product_type = $request->product_type;
            $product->supplier_id = Auth::user()->id;

            if ($product->save()) {
                Toastr::success('Success!', 'Setting Updated!');
                return redirect()->back();
            }
        }
        $data['product'] = $product;
        $data['gallaries'] = Thumb::where('product_id', $product->id)->get();
        $data['tags'] = Tag::all();
        $data['caegories'] = Category::all();
        $data['method'] = Method::all();
        return view('user.pages.product.edit')->with($data);
    }

    public function addproduct(Request $request)
    {

        if ($request->isMethod("post")) {
            // dd($request->all());
            
            $request->validate([
                'category_id' => ['required'],
                'sub_id' => ['required'],
                'child_id' => ['required'],
                'title' => ['required'],
                'image' => ['required'],
                'origin' => ['required'],
                'currency' => ['required'],
                'price_type' => ['required'],
                'des' => ['required'],
                'qty' => ['nullable'],
                'product_type' => ['required']
            ]);
            if($request->price_type == 'negotiable'){
                $request->validate([
                    'ng_min' => 'nullable',
                    'ng_max' => 'nullable',
                    'ng_unit'=>'nullable',
                ]);
            }
                if($request->price_type == 'qbp'){
                    $request->validate([
                        'qty_min' => 'required|integer',
                        'qty_max' => 'required|integer',
                        'qty_total' => 'required|integer',
                        'qty_unit' => 'required',
                        'single_price'=>'required|integer',
                    ]);
                }
                if($request->price_type == 'pbq'){
                    $request->validate([
                    'price_min' => 'required|integer',
                    'price_max' => 'required|integer',
                    'price_total' => 'required|integer',
                    'price_unit' => 'required',
                    'single_price'=>'required|integer',
                    ]);
                }
            $product = new Product();


            if ($request->hasFile('brochure')) {

                $image = $request->file('brochure');
                $thefile = \File::get($image);
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product')) {
                    Storage::disk('public')->makeDirectory('images/admin/product');
                }
                Storage::disk('public')->put('images/admin/product/' . $imageName, $thefile);
                $product->brochure = $imageName;
            }


            if ($request->hasFile('image')) {

                $image = $request->file('image');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->image)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->image);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->image = $imageName;
            } else {
                $imageName = "product.jpg";
            }


            if ($request->hasFile('gallary1')) {

                $image = $request->file('gallary1');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary1)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary1);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary1 = $imageName;
            } else {
                $imageName = "product.jpg";
            }


            if ($request->hasFile('gallary2')) {

                $image = $request->file('gallary2');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary2)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary2);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary2 = $imageName;
            } else {
                $imageName = "product.jpg";
            }


            if ($request->hasFile('gallary3')) {

                $image = $request->file('gallary3');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary3)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary3);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary3 = $imageName;
            } else {
                $imageName = "product.jpg";
            }


            if ($request->hasFile('gallary4')) {

                $image = $request->file('gallary4');
                $currentDate = Carbon::now()->toDateString();
                $imageName = $currentDate . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
                if (!Storage::disk('public')->exists('images/admin/product/' . $product->gallary4)) {
                    Storage::disk('public')->makeDirectory('images/admin/product/' . $product->gallary4);
                }
                $bannerImage = Image::make($image)->resize(500, 500)->stream();
                Storage::disk('public')->put('images/admin/product/' . $imageName, $bannerImage);
                $product->gallary4 = $imageName;
            } else {
                $imageName = "product.jpg";
            }
            if ($request->filled('child_id')) {
                $product->category_id = $request->category_id;
                $product->sub_id = $request->sub_id;
                $product->child_id = $request->child_id;
            } else {
                $product->category_id = $request->sub_id;
                $product->sub_id = $request->category_id;
            }

            $product->ip = visitorip();
            $product->title = $request->title;
            $product->date = date('Y-m-d');
            $product->slug = Str::slug($request->title);
            $product->tags = json_encode($request->tags);
            $product->model_number = $request->model_number;
            $product->brand = $request->brand;
            $product->material = $request->material;
            $product->origin = $request->origin;
            $product->price_type = $request->price_type;
            $product->product_type = $request->product_type;


            if (isset($request['outer-group'][0]['inner-group']) && is_array($request['outer-group'][0]['inner-group'])) {
                $product->attr = json_encode($request['outer-group'][0]['inner-group']);
            }

            // if ($request->price_type == 'fob') {
            //     $product->currency = $request->currency;
            //     $product->min = $request->min;
            //     $product->max = $request->max;
            //     $product->unit = $request->unit;
            //     $product->min_qty = $request->min_qty;
            // } else {

            // }
            if ($request->filled('other_payment_methods')) {
                $arr = array($request->other_payment_methods);
                $product->payment_method = json_encode(array_push($arr, $request->payment_ids));

            } else {
                $product->payment_method = json_encode($request->payment_ids);
            }
            $product->supply_type = $request->supply_type;
            $product->port = $request->port;
            $product->processing_time = $request->processing_time;
            $product->qty = $request->qty;
            $product->details = $request->des;
            $product->country_id = Auth::user()->country_id;
            $product->currency = $request->currency;

            $product->unit = $request->units;
            $product->shipping_time = $request->shipping_time;
            $product->details = $request->des;
            $product->supplier_id = Auth::user()->id;
            $product->meta_description = $request->meta_description;
            $product->meta_keyword = $request->meta_keyword;
            $product->price_type == $request->price_type;
            $product->price = $request->single_price;
            $product->discount_price = $request->discount_price;
            $product->save();
            
            Toastr::success('Success!', "Product Created Successfully!");
            
            $prod = Product::latest()->first();
            $notification = New AdminNotification();
            $notification->user_id=auth()->id();
            $notification->type="new product";
            $notification->message="Added a New Product";
            $notification->admin_reciver="yes";
            $notification->reciver=auth()->id();
            $notification->data=$prod->id;
            $notification->save();
                
            if (!($request->price_type == "negotiable")) {
                $product = Product::latest()->first();
                
                 $productPrice = new ProductPrice();
                if($request->price_type == 'qbp'){
                    $productPrice->min = $request->qty_min;
                    $productPrice->max = $request->qty_max;
                    $productPrice->total = $request->qty_total;
                    $productPrice->unit = $request->qty_unit;
                }
                if($request->price_type == 'pbq'){
                    $productPrice->min = $request->price_min;
                    $productPrice->max = $request->price_max;
                    $productPrice->total = $request->price_total;
                    $productPrice->unit = $request->price_unit;
                }
               
                $productPrice->product_id = $product->id;
                $productPrice->type = $request->price_type;
                $productPrice->save();
                
               
        

                // Toastr::error('Error!', "You cant delete last price");
                if (Auth::user()->verified == 1) {
                    return redirect()->back();
                    //   return redirect()->route('user.featured.submit', $product->id);
                }
                // Toastr::success('Success!', "Product Created Successfully!");
                return redirect()->back();
            }
        }
   $data['currencies'] =Country::whereNotNull('currency')->groupBy('currency')->orderBy('currency', 'asc')->pluck('currency');
        $data['tags'] = Tag::all();
        $data['caegories'] = Category::where('parent_id', 0)->get();
        $data['method'] = Method::all();
        return view('user.pages.product.create')->with($data);
    }
    public function addPrice($id)
    {
        
        $product = Product::where('id',$id)->first();
        $ProductPrices = ProductPrice::where('product_id',$id)->get();
        return view('user.pages.product.price',compact('product','ProductPrices'));
    }
    public function savePrice(Request $request,$id)
    {
        $productPrice = new ProductPrice();
        
        if($request->price_type == 'negotiable'){
            $product = Product::where('id',$id)->first();
            if($product->price_type ="pbq" || $product->price_type ="qbp")
            {
                $productPrices = ProductPrice::where('product_id',$product->id)->get();
                foreach($productPrices as $productPrice)
                {
                    $productPrice->delete();
                }
            }
            $product->price_type = "negotiable";
            $product->price = 0;
            $product->save();
            
        }
        if($request->price_type == 'qbp'){
            $request->validate([
                'qty_min'=>'required|integer' ,
                'qty_max'=>'required|integer'  ,
                'qty_total'=>'required|integer' , 
                'qty_unit'=>'required' , 
                'single_price'=>'required|integer' , 
            ]);
            $productPrice->min = $request->qty_min;
            $productPrice->max = $request->qty_max;
            $productPrice->total = $request->qty_total;
            $productPrice->unit = $request->qty_unit;
            $productPrice->product_id = $id;
            $productPrice->type = $request->price_type;
            
            $product = Product::where('id',$id)->first();
            $product->price_type = "qbp";
            $product->price = $request->single_price;
            $product->discount_price = $request->discount_price;
            $product->save();
            $productPrice->save();
        }
        if($request->price_type == 'pbq'){
            $request->validate([
                'price_min'=>'required|integer'  ,
                'price_max'=>'required|integer'  ,
                'price_total'=>'required|integer', 
                'price_unit'=>'required',
                'single_price'=>'required|integer' ,
            ]);
            $productPrice->min = $request->price_min;
            $productPrice->max = $request->price_max;
            $productPrice->total = $request->price_total;
            $productPrice->unit = $request->price_unit;
            $productPrice->product_id = $id;
            $productPrice->type = $request->price_type;
            $product = Product::where('id',$id)->first();
            $product->price_type = "pbq";
            $product->price = $request->single_price;
            $product->discount_price = $request->discount_price;
            $product->save();
            $productPrice->save();
        }
        
        
        
        return redirect()->back();
    }
    
    public function deletePrice($id)
    {
        $productPrice = ProductPrice::find($id);
        $productId = ProductPrice::where('product_id',$productPrice->product_id)->count();
        if($productId>1){
            $productPrice->delete();
            return redirect()->back();
        }
        else{
            return redirect()->back();
            Toastr::error('Error!', "You cant delete last price");
        }
        
    }
}