Файловый менеджер - Редактировать - /home/clickysoft/public_html/jmapi5.clickysoft.net/Http.tar
Назад
Controllers/Controller.php 0000644 00000000453 15021222673 0011710 0 ustar 00 <?php namespace App\Http\Controllers; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { use AuthorizesRequests, ValidatesRequests; } Controllers/HomeController.php 0000644 00000000723 15021222673 0012521 0 ustar 00 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } /** * Show the application dashboard. * * @return \Illuminate\Contracts\Support\Renderable */ public function index() { return view('home'); } } Controllers/Api/.DS_Store 0000644 00000014004 15021222673 0011245 0 ustar 00 Bud1 blob �bpli V 1bwspblob �bplist00�]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{260, 330}, {920, 464}} #/;R_klmno� � V 1vSrnlong @ � @ � @ � @ E DSDB ` � @ � @ � @ Controllers/Api/V1/.DS_Store 0000644 00000014004 15021222673 0011533 0 ustar 00 Bud1 nbwspblob A d m i nbwspblob �bplist00�]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{260, 330}, {920, 464}} #/;R_klmno� � A d m i nvSrnlong @ � @ � @ � @ E DSDB ` � @ � @ � @ Controllers/Api/V1/User/ProductApiController.php 0000644 00000010666 15021222673 0015627 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Resources\User\ProductResource; use App\Http\Resources\User\ProductResourceWithAttributes; use App\Http\Resources\User\ProductResourceWithAttributesTest; use App\Http\Resources\User\VariationResource; use App\Models\Product; use App\Models\Variation; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class ProductApiController extends Controller { public function index(Request $request) { $product_min = Product::where('status', 1)->min("price_from"); $product_max = Product::where('status', 1)->max("price_to"); $products = Product::active() ->published() ->when($category = $request->get('category'), function ($query) use ($category) { $query->where('category_id', $category); }) ->when($search = $request->get('search'), function ($query) use ($search) { $query->where('name', 'LIKE' , '%'.$search.'%'); }) ->when(isset($request->color_engraving), function ($query) use ($request) { $query->where('engraving', 1); $query->where('color_engraving', $request->get('color_engraving')); }) ->when($rating = $request->get('rating'), function ($query) use ($rating) { $query->whereHas('reviews', function ($query) use ($rating) { $query ->selectRaw('AVG(rating) AS avg_rating') ->groupBy('product_id') ->havingRaw('ROUND(AVG(rating)) = ?', [$rating]); }); }) ->when($color = $request->get('color'), function ($query) use ($color) { $query->whereHas('variations', function ($query) use ($color) { $query->where('variation_id', $color); }); }) ->when($dimension = $request->get('dimension'), function ($query) use ($dimension) { $query->whereHas('variations', function ($query) use ($dimension) { $query->where('variation_id', $dimension); }); }); if ((isset($request->min_price) && isset($request->max_price)) && ($request->min_price >= 0 && $request->max_price >= $request->min_price)) { $minPrice = $request->min_price; $maxPrice = $request->max_price; $products = $products->where(function ($query) use ($minPrice, $maxPrice) { /*$query->where('price_from', '>=', $minPrice) ->orWhere('price_to', '<=', $maxPrice);*/ $query->whereBetween('price_from', [$minPrice, $maxPrice]) ->orWhereBetween('price_to', [$minPrice, $maxPrice]); }); } $products = $products->orderBy('name')->paginate(20)->appends(request()->query()); ProductResource::withoutWrapping(); return ProductResource::collection($products)->additional([ 'product_min_price' => $product_min, 'product_max_price' => $product_max, ]); } public function show($product) { $product = Product::where('id', $product)->orWhere('slug', $product)->first(); if (!$product) return response()->json([ 'message' => "Record not found.", 'errors' => ["error" => ["Record not found."]] ], Response::HTTP_NOT_FOUND); return (new ProductResourceWithAttributes($product)); } public function show2($product) { $product = Product::where('id', $product)->orWhere('slug', $product)->first(); if (!$product) return response()->json([ 'message' => "Record not found.", 'errors' => ["error" => ["Record not found."]] ], Response::HTTP_NOT_FOUND); return (new ProductResourceWithAttributesTest($product)); } public function getColorVariations() { $colors = Variation::where('type', 'color')->orderBy('value')->get(); VariationResource::withoutWrapping(); return VariationResource::collection($colors); } public function getDimensionVariations() { $colors = Variation::where('type', 'dimension')->orderBy('value')->get(); VariationResource::withoutWrapping(); return VariationResource::collection($colors); } } Controllers/Api/V1/User/CartApiController.php 0000644 00000015235 15021222673 0015075 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\User\StoreCartRequest; use App\Http\Resources\User\CartResource; use App\Models\Cart; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CartApiController extends Controller { use MediaUploadingTrait; public function index() { $cart_items = Cart::where('user_id', auth()->id()) ->get(); CartResource::withoutWrapping(); return CartResource::collection($cart_items); } public function update_quantity(Request $request, Cart $cart) { abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'quantity' => 'required|integer|min:1', ]); $cart->quantity = $request->quantity; $cart->save(); return (new CartResource($cart)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update_quantity_bulk(Request $request) { $request->validate([ 'items' => 'required|array', 'items.*.id' => 'required|exists:carts,id,user_id,'.auth()->id(), 'items.*.quantity' => 'required|integer|gt:0', ],[ 'items.*.id.required' => 'Id for item #:position is required.', 'items.*.id.exists' => 'Id for item #:position is invalid.', 'items.*.quantity.required' => 'Quantity for item #:position is required.', 'items.*.quantity.integer' => 'Quantity for item #:position must be an integer.', 'items.*.quantity.gt' => 'Quantity for item #:position must be greater than 0.', ]); \DB::beginTransaction(); try { foreach ($request->get('items', []) as $item){ $cart = Cart::find($item['id']); $cart->quantity = $item['quantity']; $cart->save(); } \DB::commit(); return response() ->json(['message' => 'Cart items updated successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Update Error : Cart items bulk'); \Log::channel('db_errors')->info($e->getMessage()); \DB::rollBack(); return response() ->json([ 'message' => "Cart not updated.", 'errors' => ["error" => ["Unable to update cart items."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function store(StoreCartRequest $request) { if ($request->hasFile('attachment')){ $attachment = $this->storePDF($request->file('attachment'), auth()->id(), 'order'); } $cart = Cart::create( array_merge($request->validated(), ['user_id' => auth()->id(), 'attachment' => $attachment ?? null ]) ); return (new CartResource($cart)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Cart $cart) { return new CartResource($cart); } /*public function update(StoreCartRequest $request, Cart $cart) { abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attachment = $cart->attachment; if ($request->hasFile('attachment')){ if ($attachment){ $this->deletePDF($attachment, 'order'); } $attachment = $this->storePDF($request->file('attachment'), auth()->id(), 'order'); } $cart->update( array_merge( $request->validated(), ['attachment' => $attachment] ) ); return (new CartResource($cart)) ->response() ->setStatusCode(Response::HTTP_CREATED); }*/ public function destroy(Cart $cart) { abort_if(Gate::denies('update-record', $cart), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $cart->delete(); return response() ->json(['message' => 'Cart deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Cart -> '.$cart->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete cart."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function clearCart() { try { $items = Cart::where('user_id', auth()->id()); if($items->count() == 0){ return response() ->json([ 'message' => "Empty cart.", 'errors' => ["error" => ["Nothing to delete. Cart already empty."]] ], Response::HTTP_NOT_FOUND); }else{ $items->delete(); return response() ->json(['message' => 'Cart deleted successfully'], Response::HTTP_OK); } }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Cart'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete cart."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function clearBulkCart(Request $request) { $request->validate([ 'ids' => 'required|array', 'ids.*' => 'exists:carts,id,user_id,'.auth()->id(), ], [ 'ids.*.exists' => 'Id #:position is invalid.', ] ); try { Cart::whereIn('id', $request->get('ids'))->delete(); return response() ->json(['message' => 'Cart items deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Cart items'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete cart items."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/User/WishlistApiController.php 0000644 00000010164 15021222673 0016006 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Requests\User\StoreWishlistRequest; use App\Http\Resources\User\WishlistResource; use App\Models\Wishlist; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Gate; class WishlistApiController extends Controller { public function index() { $wishlist = Wishlist::where('user_id', auth()->id())->get(); WishlistResource::withoutWrapping(); return WishlistResource::collection($wishlist); } public function store(StoreWishlistRequest $request) { $wishlist = Wishlist::create(array_merge($request->all(), ['user_id' => auth()->id()])); return (new WishlistResource($wishlist)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Wishlist $wishlist) { abort_if(Gate::denies('update-record', $wishlist), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new WishlistResource($wishlist); } public function update(StoreWishlistRequest $request, Wishlist $wishlist) { abort_if(Gate::denies('update-record', $wishlist), Response::HTTP_FORBIDDEN, '403 Forbidden'); $wishlist->update($request->all()); return (new WishlistResource($wishlist)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Wishlist $wishlist) { abort_if(Gate::denies('update-record', $wishlist), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $wishlist->delete(); return response() ->json(['message' => 'Wishlist item deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Wishlist Item -> '.$wishlist->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete wishlist item."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function clearBulkWishlist(Request $request) { $request->validate([ 'ids' => 'required|array', 'ids.*' => 'exists:wishlists,id,user_id,'.auth()->id(), ],[ 'ids.*.exists' => 'Id #:position is invalid.', ]); try { Wishlist::whereIn('id', $request->get('ids'))->delete(); return response() ->json(['message' => 'Wishlist items deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Wishlist items'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete wishlist items."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function clearWishlist() { try { $items = Wishlist::where('user_id', auth()->id()); if($items->count() == 0){ return response() ->json([ 'message' => "Empty wishlist.", 'errors' => ["error" => ["Nothing to delete. Wishlist already empty."]] ], Response::HTTP_NOT_FOUND); }else{ $items->delete(); return response() ->json(['message' => 'Wishlist deleted successfully'], Response::HTTP_OK); } }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Wishlist'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete wishlist."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/User/HomePageApiController.php 0000644 00000027314 15021222673 0015672 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Resources\User\BestSellingResource; use App\Http\Resources\User\CartResource; use App\Http\Resources\User\CategoryResource; use App\Http\Resources\User\CategoryTreeResource; use App\Http\Resources\User\PartnerResource; use App\Http\Resources\User\WishlistResource; use App\Models\Cart; use App\Models\Category; use App\Models\OrderItems; use App\Models\OurPartner; use App\Models\Product; use App\Models\SiteSetting; use App\Models\Wishlist; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\ProcessFailedException; class HomePageApiController extends Controller { use MediaUploadingTrait; public function index() { $data['user'] = $this->getUser(); $data['site_info'] = $this->getSiteSettings(); $data['categories'] = $this->getCategoryTree(); $data['navbar_categories'] = $this->getNavbarCategories(); $data['partner_slider'] = $this->getPartnerSlider(); $data['wishlist'] = $this->getWishlist(); $data['cart'] = $this->getCart(); $data['best_selling_products'] = $this->getBestSellingProducts(); $data['top_ranking_categories'] = $this->getTopRankingCategories(); return response() ->json(['data' => $data], Response::HTTP_OK); } public function getTopRankingAndBestSelling() { $data['best_selling_products'] = $this->getBestSellingProducts(); $data['top_ranking_categories'] = $this->getTopRankingCategories(); return response() ->json($data, Response::HTTP_OK); } public function getSiteSettings() { $site_email = SiteSetting::where('key', 'Site Email')->first(); $site_setting['site_email'] = $site_email->value ?? ''; $site_phone = SiteSetting::where('key', 'Site Phone')->first(); $site_setting['site_phone'] = $site_phone->value ?? ''; $site_phone_2 = SiteSetting::where('key', 'Site Phone 2')->first(); $site_setting['site_phone_2'] = $site_phone_2->value ?? ''; $site_fax = SiteSetting::where('key', 'Fax')->first(); $site_setting['site_fax'] = $site_fax->value ?? ''; $site_location = SiteSetting::where('key', 'Location')->first(); $site_setting['site_location'] = $site_location->value ?? ''; $site_location_2 = SiteSetting::where('key', 'Location 2')->first(); $site_setting['site_location_2'] = $site_location_2->value ?? ''; $cancellation_charges = SiteSetting::where('key', 'Cancel Order Fee')->first(); $site_setting['cancellation_charges'] = $cancellation_charges->value ?? ''; return $site_setting; } public function getCategoryTree() { $categories = Category::whereNull('parent_id') ->with('categoryTree') ->active() ->orderBy('name') ->get(); CategoryTreeResource::withoutWrapping(); return CategoryTreeResource::collection($categories); } public function getPartnerSlider() { $partners = OurPartner::active()->get(); PartnerResource::withoutWrapping(); return PartnerResource::collection($partners); } public function getNavbarCategories() { $categories = Category::where('show_in_navigation', 1) ->active() ->orderBy('name') ->get(); CategoryTreeResource::withoutWrapping(); return CategoryTreeResource::collection($categories); } public function getWishlist() { if (!auth('sanctum')->check()) return []; $wishlist = Wishlist::where('user_id', auth('sanctum')->id())->get(); WishlistResource::withoutWrapping(); return WishlistResource::collection($wishlist); } public function getCart() { if (!auth('sanctum')->check()) return []; $cart_items = Cart::where('user_id', auth('sanctum')->id())->get(); CartResource::withoutWrapping(); return CartResource::collection($cart_items); } public function getUser() { if (!auth('sanctum')->check()) return []; $user = auth('sanctum')->user(); return [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'server_timezone' => date_default_timezone_get(), 'status' => $user->status, 'profile_image' => $user->profile_image ? [ "url" => $user->profile_image->url, "thumbnail" => $user->profile_image->thumbnail, "preview" => $user->profile_image->preview, ] : null, ]; } public function getBestSellingProducts() { $products = Product::whereIn('id', $this->getIdArray()) ->orderBy('name') ->limit(6) ->get(); BestSellingResource::withoutWrapping(); return BestSellingResource::collection($products); } public function getTopRankingCategories() { $categories = Category::whereIn('id', $this->getIdArray())->orderBy('name') ->withCount('products') ->limit(8) ->get(); CategoryResource::withoutWrapping(); return CategoryResource::collection($categories); } public function getIdArray() { $results = OrderItems::select('products.*', DB::raw('COUNT(order_items.product_id) AS total')) ->join('products', 'order_items.product_id', '=', 'products.id') ->groupBy('product_id') ->orderBy('total', 'desc') ->get(); return $results->pluck('category_id')->toArray(); } public function convertImage(Request $request) { $request->validate([ 'product_id' => 'required|exists:products,id', 'image' => 'required', ]); if ($request->hasFile('image')) { $request->validate([ 'image' => 'mimes:jpg,jpeg,png', ]); $mime_type = $request->file('image')->getClientOriginalExtension(); $image = $request->file('image')->getRealPath(); } else if (preg_match('/^data:image\/(jpeg|png|jpg);base64,/', $request->input('image'), $matches)) { $mime_type = $matches[1]; // the request contains a base64 encoded image $image = $request->input('image'); } else { return \response()->json([ 'message' => 'Invalid image. Image should be jpg, jpeg, png or base64.', 'errors' => ["error" => ["Image should be image/base64 of type jpg, jpeg, png."]] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $product = Product::find($request->get('product_id')); if ($product->engraving == 0){ return response() ->json([ 'message' => "Engraving not supported.", 'errors' => ["error" => ["This product does not support engraving."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $file_name = 'template-'.time().'.'.$mime_type; try { if ($product->color_engraving == 0){ \Image::make($image)->greyscale()->save(public_path('images/converted/'.$file_name)); $stored_image = public_path('images/converted/'.$file_name); switch($mime_type) { case "png": $im = imagecreatefrompng($stored_image); imagefilter($im, IMG_FILTER_NEGATE); imagepng($im, public_path('images/converted/'.$file_name)); break; case "jpg": case "jpeg": $im = imagecreatefromjpeg($stored_image); imagefilter($im, IMG_FILTER_NEGATE); imagejpeg($im, public_path('images/converted/'.$file_name)); break; } }else{ \Image::make($image)->save(public_path('images/converted/'.$file_name)); } return response()->json([ 'data' => asset('images/converted/'.$file_name), ], Response::HTTP_OK); }catch (\Exception $exception){ \Log::info('Image Conversion'); \Log::info($exception->getMessage()); return response() ->json([ 'message' => "Oops! Something went wrong.", 'errors' => ["error" => ["Something went wrong. Can not convert image."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } } public function convertImagePython(Request $request) { $request->validate([ 'product_id' => 'required|exists:products,id', 'image' => 'required|mimes:jpg,jpeg,png|max:5120', ]); $image = $request->file('image')->getRealPath(); $file_name = $request->file('image')->getClientOriginalName(); $product = Product::find($request->get('product_id')); if ($product->engraving == 0){ return response() ->json([ 'message' => "Engraving not supported.", 'errors' => ["error" => ["This product does not support engraving."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } try { if ($product->color_engraving == 0){ //Run python script here $process = new Process(['python3', app_path('scripts/convert_image.py'), request()->image]); $process->run(); if (!$process->isSuccessful()) { \Log::info('Python failed to execute "'.app_path('scripts/convert_image.py').'"'); \Log::info(new ProcessFailedException($process)); return response() ->json([ 'message' => "Oops! Something went wrong.", 'errors' => ["error" => ["Something went wrong. Can not convert image."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } else { $file_name = $process->getOutput(); $image = '/var/www/phase2/web/assets/customization/converted/'.$file_name; } } if (request()->has('file_url') && request()->get('file_url')) { $b64 = '/assets/customization/converted/'.$file_name; } else { $b64 = "data:image/jpeg;base64,".base64_encode(file_get_contents($image)); } return response()->json([ 'data' => $b64, ], Response::HTTP_OK); }catch (\Exception $exception){ \Log::info($exception->getMessage()); return response() ->json([ 'message' => "Oops! Something went wrong.", 'errors' => ["error" => ["Something went wrong. Can not convert image."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } } public function convertPdfToBase64(Request $request) { $request->validate([ 'url' => 'required', ]); $path = explode('variation/', $request->get("url")); $file = \Storage::disk('variation')->get($path[1]); $encoded_svg = "data:image/svg+xml;base64,".base64_encode($file); return response()->json([ 'data' => $encoded_svg, ], Response::HTTP_OK); } } Controllers/Api/V1/User/OrderApiController.php 0000644 00000055060 15021222673 0015257 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\User\AddOrderPaymentRequest; use App\Http\Requests\User\StoreOrderRequest; use App\Http\Resources\User\OrderRepeatResource; use App\Http\Resources\User\OrderResource; use App\Http\Resources\User\OrderUserInfoResource; use App\Mail\InvoicePaidAdminMail; use App\Mail\OrderCancelAdminMail; use App\Models\Coupon; use App\Models\Order; use App\Models\SiteSetting; use App\Models\Status; use App\Notifications\InvoicePaidUserNotification; use App\Notifications\OrderCancelUserNotification; use App\Notifications\OrderPlacedNotification; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Symfony\Component\HttpFoundation\Response; class OrderApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { $orders = Order::when($order_number = $request->get('order_number'), function ($query) use ($order_number) { $query->where('order_number', 'LIKE', '%'.$order_number.'%'); })->when($status_id = $request->get('status_id'), function ($query) use ($status_id){ $query->where('current_status_id', $status_id); })->when($order_type = $request->get('order_type'), function ($query) use ($order_type){ $query->where('order_type', $order_type); })->when($request->filled('payment_status'), function ($query) use ($request){ $query->where('payment_status', $request->payment_status); })->when($request->filled('payment_type'), function ($query) use ($request){ $query->where('payment_type', $request->payment_type); })->when($request->filled('rush_order'), function ($query) use ($request){ $query->where('rush_order', $request->rush_order); }) ->where([ 'user_id' => auth()->id(), 'deleted_by_user' => 0, 'order_type' => 'Order', ])->orderBy('id', 'DESC')->get(); OrderResource::withoutWrapping(); return OrderResource::collection($orders); } public function cancelOrder(Request $request, Order $order) { $request->validate([ 'notes' => 'nullable|string|max:300', ]); if ($order->current_status?->name == 'In Production'){ return response() ->json([ 'message' => "Can not cancel order.", 'errors' => ["error" => ["Can not cancel order once in production."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $status = Status::where('name', 'Order Cancelled')->first(); if ($order->current_status_id == $status->id) { return response() ->json([ 'message' => "Can not cancel order.", 'errors' => ["error" => ["This order has already been cancelled."]] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $order->current_status_id = $status->id; $order->save(); $order->statuses()->attach($status->id, ['notes' => $request->get('notes'), 'user_id' => auth()->id()]); $order->deletePurchaseOrderItem(); // Delete order from pending purchase order list //Send Email to user and admin for order cancellation $data = [ 'customer_name' => auth()->user()->name, 'order_number' => $order->order_number, ]; try { $order->user->notify((new OrderCancelUserNotification($data))->delay(now()->addSeconds(5))); $admin_email = SiteSetting::where('key', 'Notification Email')->first(); Mail::to($admin_email->value)->later(now()->addSeconds(10),new OrderCancelAdminMail($data)); }catch (\Exception $e){ Log::info('Mail Error => Sending Order Status Mail Admin & User :'.$order->order_number); Log::info($e->getMessage()); } return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function orderRepeat(Order $order) { return new OrderRepeatResource($order->load(['items'])); } public function store(StoreOrderRequest $request) { $orderObj = new Order(); $order_totals = $orderObj->getOrderTotals($request); $charge_response = null; $charged_successfully = false; if ($request->get('payment_type') == 'Credit Card') { //Charge via vault_id if we are receiving vault_id if($request->get('vault_id')) { //Charge customer using vault it just created. $charge_response = chargeByVaultId( $request->get('billing_address_id'), $request->get('vault_id'), $order_totals['grand_total'], ); if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charged_successfully = true; } else { //If customers allowed to save card if ($request->get('save_card', false)) { //Check if PayJunction customerId exists. Create if not present. if (!auth()->user()->pj_id) { $customerCreated = createPJCustomer( $request->get('billing_address_id'), auth()->user() ); if (!$customerCreated) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Customer creation failed."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } $card_data = [ "cardNumber" => $request->get('card_number'), "cardExpMonth" => $request->get('expiry_month'), "cardExpYear" => $request->get('expiry_year'), "cvv" => $request->get('ccv') ]; $vaultId = createPJCustomerVault( auth()->user(), $request->get('billing_address_id'), $card_data, ); if (!$vaultId['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Customer vault creation failed. Make sure you enter valid card credentials."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } //Charge customer using vault it just created. $charge_response = chargeByVaultId( $request->get('billing_address_id'), $vaultId['vault_id'], $order_totals['grand_total'], ); } else { //Charge by card information $card_data = [ 'card_number' => $request->get('card_number'), 'expiry_month' => $request->get('expiry_month'), 'expiry_year' => $request->get('expiry_year'), 'ccv' => $request->get('ccv'), ]; $charge_response = chargeByCard( $request->get('billing_address_id'), $order_totals['grand_total'], $card_data, ); } if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charged_successfully = true; } } $shipping_data = []; //Billing Info of Order $billing_address = $orderObj->getOrderAddress($request['billing_address_id'], 'billing'); if ($request['delivery_type'] == 'Shipping') { $customer_id = config('app.web_ship_customer_id'); $base_url = config('app.web_ship_base_url'); $endpoint = "{$base_url}/customers/{$customer_id}/quote"; $request_body = prepareDataForShippingQuote($request); $response = getShippingQuoteServices($request_body, $endpoint); if ($response['data']){ $shipping_data = [ 'carrier_code' => $response['data']['carrierCode'], 'service_code' => $response['data']['serviceCode'], 'package_type_code' => $response['data']['packageTypeCode'], 'shipping_charges' => $response['data']['totalAmount'], ]; } //Shipping Info of Order $shipping_address = $orderObj->getOrderAddress($request['shipping_address_id'], 'shipping'); } DB::beginTransaction(); try { $cancellation_charges = SiteSetting::where('key', 'Cancel Order Fee')->first(); $pending_status = Status::where('name', 'Pending')->first(); $order = Order::create( array_merge( $request->validated(), $billing_address ?? [], $shipping_address ?? [], [ 'admin_approved' => 0, 'user_id' => auth()->id(), 'payment_status' => $charged_successfully ? 'Paid' : 'Unpaid', 'payment_date' => $charged_successfully ? new \DateTime() : null, 'current_status_id' => $pending_status->id, 'created_by_user_id' => auth()->id(), 'cancellation_charges' => $cancellation_charges->value ?? 0, 'items_total' => $order_totals['items_total'], 'state_sales_tax' => $order_totals['sales_tax']['percentage'], 'sales_tax_amount' => $order_totals['sales_tax']['amount'], 'rush_order_fee' => $order_totals['rush_order']['percentage'], 'rush_order_amount' => $order_totals['rush_order']['amount'], ], $shipping_data )); if (isset($order_totals['discount']['order_discount'])) { $order->coupon_id = $order_totals['discount']['coupon_id']; $order->discount_type = $order_totals['discount']['discount_type']; $order->discount_value = $order_totals['discount']['discount_value']; $order->discount_total = $order_totals['discount']['order_discount']; $coupon = Coupon::find($order->coupon_id); $coupon->redemption_count = $coupon->redemption_count + 1; $coupon->save(); } //For Customer Purchase Orders if ($request->payment_type == 'Purchase Order'){ $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), auth()->id(), 'order'); $order->purchase_order_number = $request->purchase_order_number; $order->purchase_order_copy = $purchase_order_copy; } $response = $order->storeOrderProducts($request['products'], auth()->id()); $statuses = []; if (isset($response['artwork_check'])){ $artwork_status = Status::where('name', 'Artwork Received')->first(); $proof_received = Status::where('name', 'Proof sign off received')->first(); $statuses[] = $artwork_status->id; $statuses[] = $proof_received->id; } else { $artwork_no_proof_status = Status::where('name', 'No proof needed')->first(); $statuses[] = $artwork_no_proof_status->id; } $statuses[] = $pending_status->id; $order->order_number = $orderObj->str_random2(); $order->statuses()->attach($statuses); if ($charged_successfully) { $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->payment_id = $charge_response['response']->id; } $order->grand_total = $order_totals['grand_total']; $order->save(); DB::commit(); $data = [ 'order_number' => $order->id, 'orderDetails' => $order->items, 'order' => (new OrderResource($order))->toArray() ]; $order->user->notify((new OrderPlacedNotification($data))->delay(now()->addSeconds(5))); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); }catch (\Exception $e){ DB::rollBack(); Log::info('DB Error : User Order Create'); Log::info($e->getMessage(). ' on line '. $e->getLine()); return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Unable to create order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function addOrderPayment(AddOrderPaymentRequest $request, Order $order) { DB::beginTransaction(); if ($request->get('vault_id')) { //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $request->get('vault_id'), $order->grand_total, ); if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } else { //If customers allowed to save card if ($request->get('save_card', false)) { //Check if PayJunction customerId exists. Create if not present. if (!auth()->user()->pj_id) { $customerCreated = createPJCustomer( $order->billing_address_id, $order->user, ); if (!$customerCreated) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer creation failed."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } $card_data = [ "cardNumber" => $request->get('card_number'), "cardExpMonth" => $request->get('expiry_month'), "cardExpYear" => $request->get('expiry_year'), "cvv" => $request->get('ccv') ]; $vaultId = createPJCustomerVault( $order->user, $order->billing_address_id, $card_data, ); if (!$vaultId['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer vault creation failed. Make sure you enter valid card credentials."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $vaultId['vault_id'], $order->grand_total, ); } else { //Charge by card information $card_data = [ 'card_number' => $request->get('card_number'), 'expiry_month' => $request->get('expiry_month'), 'expiry_year' => $request->get('expiry_year'), 'ccv' => $request->get('ccv'), ]; $charge_response = chargeByCard( $order->billing_address_id, $order->grand_total, $card_data, ); } if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->amount_paid = $charge_response['response']->amount_total; $order->payment_id = $charge_response['response']->id; } $order->payment_type = 'Credit Card'; $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); $order->save(); DB::commit(); $data = [ 'order_number' => $order->order_number, 'amount' => $charge_response['response']->amount_total, 'user_name' => $order->user->name, 'payment_method' => $order->payment_type, ]; //Send email to admin and user $order->user->notify((new InvoicePaidUserNotification($data))->delay(now()->addSeconds(5))); $admin_email = SiteSetting::where('key', 'Notification Email')->first(); Mail::to($admin_email->value)->later(now()->addSeconds(5),new InvoicePaidAdminMail($data)); return (new OrderResource($order)) ->response()->setStatusCode(Response::HTTP_OK); } public function approveOrderArtwork(Request $request, Order $order) { if ($order->user_id != auth()->id()) { return \response() ->json([ 'message' => "Can not approve artwork.", 'errors' => ["error" => ["Invalid order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } if ($order->current_status_id != 6) { return \response() ->json([ 'message' => "Can not approve artwork.", 'errors' => ["error" => ["Invalid order status."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $status = Status::where('name', 'Proof sign off received')->first(); $order->current_status_id = $status->id; $order->statuses()->attach($status->id); $order->save(); return response()->json([ 'message' => "Order artwork approved successfully.", ], Response::HTTP_OK); } public function show(Order $order) { try { // Perform authorization check using Gate Gate::authorize('update-record', $order); } catch (AuthorizationException $exception) { // Handle the authorization exception and send a custom message $errorMessage = 'Access denied: ' . $exception->getMessage(); // Return the custom message as a response or handle it accordingly return response()->json(['error' => $errorMessage], 403); } if(empty($order->deleted_by_user)){ return new OrderUserInfoResource($order->load( [ 'user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address', 'items', ]) ); } return response() ->json([ 'message' => "Record not found.", 'errors' => ["error" => ["Record not found."]] ], Response::HTTP_NOT_FOUND); } public function getPaymentTypes() { return \response() ->json(['data' => [ 'Credit Card' => 'Credit Card', 'Purchase Order' => 'Purchase Order', ] ], Response::HTTP_OK); } public function destroy(Order $order) { abort_if(Gate::denies('update-record', $order), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $order->deleted_by_user = 1; $order->save(); return response() ->json(['message' => 'Order deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ Log::channel('db_errors')->info('Record Deletion Error : Order -> '.$order->id); Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function getMyVaults() { $customer_id = auth()->user()->pj_customer_id; if (!$customer_id) { return \response()->json([ 'message' => 'Customer id not associated', 'errors' => ['error' => 'Customer id not associated with user.'], ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $vaults = getCustomerVaults($customer_id); return \response() ->json(['data' => $vaults]) ->setStatusCode(Response::HTTP_OK); } public function generateInvoice(Order $order) { $invoice = $order->createInvoice(); return response() ->json(['data' => $invoice->invoiceUrl ?? ''], Response::HTTP_OK); } } Controllers/Api/V1/User/CategoryApiController.php 0000644 00000000462 15021222673 0015755 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\User; use App\Http\Controllers\Controller; use App\Models\Category; use Illuminate\Http\Request; class CategoryApiController extends Controller { public function index() { // } public function show(Category $category) { } } Controllers/Api/V1/Admin/ProductApiController.php 0000644 00000042466 15021222673 0015744 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\StoreProductRequest; use App\Http\Requests\Admin\UpdateProductRequest; use App\Http\Resources\Admin\ProductDetailsResource; use App\Http\Resources\Admin\ProductResource; use App\Http\Resources\Admin\ProductResourceWithAttributes; use App\Http\Resources\Admin\ProductSimple; use App\Models\OrderItems; use App\Models\Product; use App\Models\ProductPrice; use App\Models\ProductVariation; use App\Models\ProductVariationCombination; use App\Models\ProductVariationRange; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Symfony\Component\HttpFoundation\Response; class ProductApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('product_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); ProductResource::withoutWrapping(); $products = Product::when($request->filled('category'), function ($query) use ($request){ $query->whereHas('category', function ($query) use ($request) { $query->where('name', 'like', "%{$request->get('category')}%"); $query->orWhere('id', $request->get('category')); }); }) ->when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }) ->when($request->filled('sku'), function ($query) use ($request){ $query->where('sku', 'like', "%{$request->get('sku')}%"); }) ->when($request->filled('is_draft'), function ($query) use ($request){ $query->where('is_draft', $request->get('is_draft')); }) ->when($request->filled('product_type'), function ($query) use ($request){ $query->where('product_type', 'like', "%{$request->get('product_type')}%"); }) ->with([ 'category', 'variations', 'variations.variation', 'prices', 'prices.combinations', 'prices.priceRanges', ])->orderBy('created_at', 'DESC')->paginate(10); return ProductResource::collection($products); } public function getProductsForOrder(Request $request) { $products = Product::when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }) ->when($request->filled('sku'), function ($query) use ($request){ $query->where('sku', 'like', "%{$request->get('sku')}%"); }); $products = $products->orderBy('name')->get(); ProductSimple::withoutWrapping(); return ProductSimple::collection($products); } public function getProductDetails(Product $product) { return new ProductDetailsResource($product); } public function change_status(Product $product) { abort_if(Gate::denies('product_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $product->status = !$product->status; $product->save(); return response() ->json(['message' => 'Product status updated successfully'], Response::HTTP_OK); } public function store(StoreProductRequest $request) { DB::beginTransaction(); try { $product = Product::create([ 'vendor_id' => $request['vendor_id'] ?? null, 'sku' => $request['sku'], 'name' => $request['name'], 'description' => $request['description'], 'engraving' => $request['engraving'], 'color_engraving' => $request['color_engraving'], 'engraving_fee' => $request['engraving_fee'], 'status' => $request['status'], 'is_draft' => $request['is_draft'], 'product_type' => $request['product_type'], 'category_id' => $request['category_id'], 'has_variations' => 1, ]); if ($request->hasFile('featured_image')) { $product->addMediaFromRequest('featured_image') ->toMediaCollection('product_featured_image', 'product')->save(); } foreach ($request->file('gallery_images', []) as $file) { $product->addMedia($file)->toMediaCollection('gallery_image', 'product'); } $product->handleVariations($request); DB::commit(); return (new ProductResource($product)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e){ \Log::channel('db_errors')->info('Product Create Error'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Can not create product.", 'errors' => ["error" => ["Unable to create product."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function show(Product $product) { abort_if(Gate::denies('product_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $product = $product->load([ 'category', 'variations', 'variations.variation', 'prices', 'prices.combinations', 'prices.priceRanges', ]); return new ProductResourceWithAttributes($product); } public function update(UpdateProductRequest $request, Product $product) { DB::beginTransaction(); try { $product->update([ 'category_id' => $request['category_id'], 'vendor_id' => $request['vendor_id'] ?? null, 'sku' => $request['sku'], 'name' => $request['name'], // 'slug' => $request['slug'], 'description' => $request['description'], 'engraving' => $request['engraving'], 'color_engraving' => $request['color_engraving'], 'engraving_fee' => $request['engraving_fee'], 'has_variations' => 1, 'status' => $request['status'], 'is_draft' => $request['is_draft'], 'product_type' => $request['product_type'], ]); if ($request->hasFile('featured_image')) { if (!empty($product->featured_image)) { $product->clearMediaCollection('product_featured_image'); } $product->addMediaFromRequest('featured_image') ->toMediaCollection('product_featured_image', 'product'); $product->save(); } if ($request->hasFile('gallery_images')){ foreach ($request->file('gallery_images', []) as $file) { $product->addMedia($file)->toMediaCollection('gallery_image', 'product'); } } $product->handleVariations($request); $product->save(); DB::commit(); return (new ProductResource($product)) ->response() ->setStatusCode(Response::HTTP_CREATED); }catch (\Exception $e){ \Log::channel('db_errors')->info('Product Update Error'); \Log::channel('db_errors')->info($e->getMessage()); DB::rollBack(); return response() ->json([ 'message' => "Can not update product.", 'errors' => ["error" => ["Unable to update product."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function destroy(Product $product) { abort_if(Gate::denies('product_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $product->prices()->delete(); $product->variations()->delete(); ProductVariationCombination::where('product_id', $product->id)->delete(); ProductVariationRange::where('product_id', $product->id)->delete(); $product->delete(); return response() ->json(['message' => 'Product deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Product -> '.$product->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete product."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function cloneProduct(Product $product) { abort_if(Gate::denies('product_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); DB::beginTransaction(); try { $cloned_product = $product->replicate(); $cloned_product->name = $cloned_product->name.' Clone'; $cloned_product->sku = $cloned_product->sku.'-clone'. time(); $cloned_product->slug = $cloned_product->slug.'-clone'; $cloned_product->is_draft = true; $cloned_product->created_at = now(); $cloned_product->updated_at = now(); $cloned_product->save(); $this->cloneFeaturedImage($product, $cloned_product); $this->duplicateVariations($product, $cloned_product); $prices = $this->duplicateProductPrices($product, $cloned_product); $variation_prices_ids = $this->duplicateProductVariationPriceRanges($product, $cloned_product, $prices); $this->duplicateProductVariationCombinations($product, $cloned_product, $variation_prices_ids); DB::commit(); return (new ProductResource($cloned_product)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e){ \Log::channel('db_errors')->info('Product Clone Error'); \Log::channel('db_errors')->info($e->getMessage(). ' on line : '. $e->getLine()); return response() ->json([ 'message' => "Can not clone product.", 'errors' => ["error" => ["Unable to clone product. (".$e->getMessage().")"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function duplicateVariations($existing_product, $cloned_product) { $product_variations = ProductVariation::where('product_id', $existing_product->id)->get(); foreach ($product_variations as $product_variation) { $clone_product_variation = $product_variation->replicate(); $clone_product_variation->product_id = $cloned_product->id; $clone_product_variation->created_at = now(); $clone_product_variation->updated_at = now(); $clone_product_variation->save(); } } public function duplicateProductPrices($existing_product, $cloned_product) { $product_prices = ProductPrice::where('product_id', $existing_product->id)->get(); $price_ids = []; foreach ($product_prices as $product_price) { $clone_product_price = $product_price->replicate(); $clone_product_price->product_id = $cloned_product->id; $clone_product_price->supplier_prod_number = $product_price->supplier_prod_number."-clone"; $clone_product_price->created_at = now(); $clone_product_price->updated_at = now(); $clone_product_price->save(); if ($product_price->product_sketch != null) { $this->cloneSketch($product_price, $clone_product_price); $product_price->save(); } $price_ids[$product_price->id] = $clone_product_price->id; } return $price_ids; } public function duplicateProductVariationPriceRanges($existing_product, $cloned_product, $prices) { $product_variation_price_ranges = ProductVariationRange::where('product_id', $existing_product->id)->get(); $variation_price_ids = []; foreach ($product_variation_price_ranges as $key => $product_variation_price_range) { $clone_product_variation_price_range = $product_variation_price_range->replicate(); $clone_product_variation_price_range->product_id = $cloned_product->id; $clone_product_variation_price_range->product_price_id = $prices[$product_variation_price_range->product_price_id]; $clone_product_variation_price_range->created_at = now(); $clone_product_variation_price_range->updated_at = now(); $clone_product_variation_price_range->save(); $variation_price_ids[$product_variation_price_range->product_price_id] = $clone_product_variation_price_range->product_price_id; } return $variation_price_ids; } public function duplicateProductVariationCombinations($existing_product, $cloned_product, $variation_price_ids) { $product_variation_combinations = ProductVariationCombination::where('product_id', $existing_product->id)->get(); foreach ($product_variation_combinations as $product_variation_combination) { $clone_product_variation_combination = $product_variation_combination->replicate(); $clone_product_variation_combination->product_id = $cloned_product->id; $clone_product_variation_combination->product_price_id = $variation_price_ids[$product_variation_combination->product_price_id]; $clone_product_variation_combination->created_at = now(); $clone_product_variation_combination->updated_at = now(); $clone_product_variation_combination->save(); } } public function cloneSketch($sourceModel, $destinationModel) { $sourceModelId = $sourceModel->id; // replace with the actual model ID $destinationModelId = $destinationModel->id; // replace with the actual model ID // Get the list of files in the source directory $files = Storage::disk('variation')->files($sourceModelId); // Iterate through the files and copy them to the destination directory foreach ($files as $file) { // Get the filename without the path $filename = pathinfo($file, PATHINFO_BASENAME); // Copy the file to the destination directory with the same filename Storage::disk('variation')->copy( "{$sourceModelId}/{$filename}", "{$destinationModelId}/{$filename}" ); } $s = explode("/", $sourceModel->product_sketch); if(isset($s[1])) { $destinationModel->product_sketch = $destinationModel->id."/".$s[1]; $destinationModel->save(); } } public function cloneFeaturedImage($existing_product, $cloned_product) { $media = $existing_product->media->first(); $cloned_product->addMediaFromDisk($media->getPathRelativeToRoot(), 'product') ->preservingOriginal() ->toMediaCollection('product_featured_image', 'product'); } public function deleteProduct(Product $product) { DB::beginTransaction(); try { $orderItem = OrderItems::where('product_id', $product->id)->first(); if ($orderItem) { return response() ->json([ 'message' => "Can not delete product.", 'errors' => ["error" => ["This product is included in orders."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } ProductVariation::where('product_id', $product->id)->delete(); ProductPrice::where('product_id', $product->id)->delete(); ProductVariationRange::where('product_id', $product->id)->delete(); ProductVariationCombination::where('product_id', $product->id)->delete(); $product->delete(); DB::commit(); return response() ->json(['message' => 'Product deleted successfully.'], Response::HTTP_OK); } catch (\Exception $e){ \Log::channel('db_errors')->info('Product Delete Error'); \Log::channel('db_errors')->info($e->getMessage(). ' on line : '. $e->getLine()); return response() ->json([ 'message' => "Can not delete product.", 'errors' => ["error" => ["Unable to delete product. (".$e->getMessage().")"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function checkCombinationInOrder($priceId) { $orderItem = OrderItems::where('price_id', $priceId)->first(); if ($orderItem) { return response() ->json([ 'message' => "You cannot delete the combination as it is currently in use in certain orders.", 'success' => false, ], Response::HTTP_OK); } else { return response() ->json([ 'message' => "Combination can be removed.", 'success' => true, ], Response::HTTP_OK); } } } Controllers/Api/V1/Admin/PermissionsApiController.php 0000644 00000004105 15021222673 0016623 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StorePermissionRequest; use App\Http\Requests\Admin\UpdatePermissionRequest; use App\Http\Resources\Admin\PermissionResource; use App\Models\Permission; use Gate; use Symfony\Component\HttpFoundation\Response; class PermissionsApiController extends Controller { public function index() { abort_if(Gate::denies('permission_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new PermissionResource(Permission::all()); } public function store(StorePermissionRequest $request) { $permission = Permission::create($request->all()); return (new PermissionResource($permission)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Permission $permission) { abort_if(Gate::denies('permission_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new PermissionResource($permission); } public function update(UpdatePermissionRequest $request, Permission $permission) { $permission->update($request->all()); return (new PermissionResource($permission)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Permission $permission) { abort_if(Gate::denies('permission_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $permission->delete(); return response() ->json(['message' => 'Permission deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Permission -> '.$permission->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete permission."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/VariationApiController.php 0000644 00000006216 15021222673 0016251 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreVariationRequest; use App\Http\Requests\Admin\UpdateVariationRequest; use App\Http\Resources\Admin\VariationResource; use App\Models\Variation; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Gate; class VariationApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('variation_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $variations = Variation::when($request->filled('value'), function ($query) use ($request){ $searchQuery = $request->get('value'); $query->whereRaw("type like '%".addslashes($searchQuery)."%' OR value like '%".addslashes($searchQuery)."%'"); })->orderBy('created_at', 'DESC'); $variations = (int)$request->input("page") > 0 ? $variations->paginate(50) : $variations->get(); return VariationResource::collection($variations); } public function activeVariations(Request $request) { abort_if(Gate::denies('variation_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $variations = Variation::when($request->filled('type'), function ($query) use ($request){ $query->where('type', 'like', "%{$request->get('type')}%"); })->when($request->filled('value'), function ($query) use ($request){ $query->where('value', 'like', "%{$request->get('value')}%"); }) ->where('status', 1) ->orderBy('created_at', 'DESC')->get(); VariationResource::withoutWrapping(); return VariationResource::collection($variations); } public function store(StoreVariationRequest $request) { $variation = Variation::create($request->validated()); return (new VariationResource($variation)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Variation $variation) { abort_if(Gate::denies('variation_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new VariationResource($variation); } public function update(UpdateVariationRequest $request, Variation $variation) { $variation->update($request->validated()); return (new VariationResource($variation)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Variation $variation) { abort_if(Gate::denies('variation_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $variation->delete(); return response(['message' => 'Variation deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Variation -> '.$variation->id); \Log::channel('db_errors')->info($e->getMessage()); return response([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete variation."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/AddressBookApiController.php 0000644 00000010427 15021222673 0016514 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreAddressBookRequest; use App\Http\Requests\Admin\UpdateAddressBookRequest; use App\Http\Resources\Admin\AddressBookResource; use App\Http\Resources\Admin\AddressBookSpecificResource; use App\Http\Resources\Admin\AddressBookUserResource; use App\Models\AddressBook; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class AddressBookApiController extends Controller { public function index(Request $request) { $search = addslashes($request->get('search')); $userId = (int)$request->get('user_id'); abort_if(Gate::denies('address_book_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $address_books = AddressBook::selectRaw("address_books.*, users.id as userId, users.name as user_name, state_sales_taxes.name as state_name") ->leftJoin("users", "address_books.user_id", "users.id") ->leftJoin("state_sales_taxes", "address_books.state_id", "state_sales_taxes.id") ->when($request->filled('search'), function ($query) use ($search) { $query->whereRaw("(users.name like '%".$search."%' OR address_books.company_name like '%".$search."%' OR address_books.address_line_1 like '%".$search."%' OR address_books.address_line_2 like '%".$search."%' OR state_sales_taxes.name like '%".$search."%' OR address_books.city like '%".$search."%')"); })->orderBy('created_at', 'DESC'); $address_books = $userId > 0 ? $address_books->where('user_id', $userId)->get() : $address_books->paginate(50); AddressBookResource::withoutWrapping(); return AddressBookResource::collection($address_books); } public function get_user_address(Request $request, $user_id) { abort_if(Gate::denies('address_book_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'user_id' => 'required,exists:users,id' ]); $address_books = AddressBook::where('user_id', $user_id) ->with(['user'])->orderBy('created_at', 'DESC')->get(); AddressBookResource::withoutWrapping(); return AddressBookResource::collection($address_books); } public function my_addresses() { AddressBookUserResource::withoutWrapping(); return AddressBookUserResource::collection(auth()->user()->userAddressBooks); } public function store(StoreAddressBookRequest $request) { if (auth()->user()->user_type != 1) $request->merge(['user_id' => auth()->id()]); $addressBook = AddressBook::create($request->all()); return (new AddressBookResource($addressBook)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(AddressBook $addressBook) { abort_if(Gate::denies('update-record', $addressBook) && Gate::denies('address_book_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new AddressBookSpecificResource($addressBook->load(['user'])); } public function update(UpdateAddressBookRequest $request, AddressBook $addressBook) { if (auth()->user()->user_type != 1) $request->merge(['user_id' => auth()->id()]); $addressBook->update($request->all()); return (new AddressBookResource($addressBook)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(AddressBook $addressBook) { abort_if(Gate::denies('update-record', $addressBook) && Gate::denies('address_book_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $addressBook->delete(); return response() ->json(['message' => 'Address book deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Address Book -> '.$addressBook->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete address book."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/CouponApiController.php 0000644 00000004770 15021222673 0015563 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\CouponStoreRequest; use App\Http\Requests\Admin\CouponUpdateRequest; use App\Http\Resources\Admin\CouponResource; use App\Models\Coupon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; use Symfony\Component\HttpFoundation\Response; class CouponApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('coupon_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $coupons = Coupon::when($request->filled('search'), function ($query) use ($request) { $query->where('code', 'LIKE', "%{$request->get('search')}%") ->orWhere('discount_type', 'LIKE', "%{$request->get('search')}%") ->orWhere('discount_value', 'LIKE', "%{$request->get('search')}%") ->orWhere('expiry_date', 'LIKE', "%{$request->get('search')}%") ->orWhere('number_of_usage', 'LIKE', "%{$request->get('search')}%") ->orWhere('redemption_count', 'LIKE', "%{$request->get('search')}%"); })->orderBy('id', 'DESC')->paginate(50); return new CouponResource($coupons); } public function store(CouponStoreRequest $request) { $coupon = Coupon::create($request->validated()); return (new CouponResource($coupon)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Coupon $coupon) { abort_if(Gate::denies('coupon_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CouponResource($coupon); } public function update(CouponUpdateRequest $request, Coupon $coupon) { $coupon->update($request->validated()); return (new CouponResource($coupon)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function toggleStatus(Coupon $coupon) { abort_if(Gate::denies('coupon_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $coupon->status = !$coupon->status; $coupon->save(); return response(['message' => 'Coupon status updated successfully.'], Response::HTTP_OK); } public function verifyCoupon($code) { $coupon = validateCouponDetails($code); return response()->json([ 'coupon' => $coupon['coupon'], 'message' => $coupon['message'], 'errors' => $coupon['errors'], ])->setStatusCode($coupon['code']); } } Controllers/Api/V1/Admin/DashboardApiController.php 0000644 00000012661 15021222673 0016205 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Resources\Admin\EmployeeOrderResource; use App\Http\Resources\Admin\OrderDashboardResource; use App\Http\Resources\Admin\OrderResource; use App\Models\ContactQuery; use App\Models\Order; use App\Models\PurchaseOrder; use Carbon\Carbon; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Gate; class DashboardApiController extends Controller { public function index() { abort_if(Gate::denies('dashboard_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $data['new_orders'] = $this->getNewOrders(); $data['new_queries_count'] = $this->getNewContactQueriesCount(); $data['rush_orders']['rush_order_48'] = $this->getRushOrders48(); $data['rush_orders']['rush_order_72'] = $this->getRushOrders72(); $data['today_jobs'] = $this->getTodayJobs(); if (auth()->user()->user_type == 1) { $data['orders_completed_this_month'] = $this->getOrdersCompletedThisMonth(); $data['monthly_sales'] = $this->getMonthlySales(); $data['yearly_sales'] = $this->getYearlySales(); $data['cost_of_goods'] = $this->getCostOfGoods(); } else { $data['orders_completed_this_month'] = []; $data['monthly_sales'] = "$0.00"; $data['yearly_sales'] = "$0.00"; $data['cost_of_goods'] = null; } return $data; } public function getTodayJobs() { $orders = Order::when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); })->whereDate('date_scheduled', '=', now())->get(); OrderDashboardResource::withoutWrapping(); return OrderDashboardResource::collection($orders); } public function getRushOrders48() { $orders = Order::whereNotNull('rush_order') ->where('rush_order', 'Rush Order 48') ->when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); }) ->whereDate('delivery_date', '>=', Carbon::today())->get(); OrderResource::withoutWrapping(); return OrderResource::collection($orders); } public function getRushOrders72() { $orders = Order::whereNotNull('rush_order') ->where('rush_order', 'Rush Order 72') ->when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); }) ->whereDate('delivery_date', '>=', Carbon::today())->get(); OrderResource::withoutWrapping(); return OrderResource::collection($orders); } public function getNewOrders() { return Order::when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); $query->where('current_status_id', 1); }) ->when(auth()->user()->user_type == 1, function ($query) { $query->where('current_status_id', 1); })->count(); } public function getOrdersCompletedThisMonth() { $month_start = Carbon::now()->startOfMonth(); $orders = Order::where('current_status_id', 13) ->whereDate('updated_at', '>=', $month_start) ->get(); return $orders->count() ?? 0; } public function getMonthlySales() { $orders = Order::where(function ($query) { $query->where('current_status_id', 13); $query->orWhere('current_status_id', 2); }) ->whereBetween('created_at', [now()->startOfMonth(), now()->endOfMonth()]) ->sum('grand_total'); return '$' . number_format($orders, 2); } public function getYearlySales() { $orders = Order::where(function ($query) { $query->where('current_status_id', 13); $query->orWhere('current_status_id', 2); }) ->whereBetween('created_at', [now()->startOfYear(), now()->endOfYear()]) ->sum('grand_total'); return '$' . number_format($orders, 2); } public function getOrdersToWork() { $orders = Order::where('assigned_to_id', auth()->id())->get(); EmployeeOrderResource::withoutWrapping(); return EmployeeOrderResource::collection($orders); } public function getCostOfGoods() { //13 means Complete/Customer Notified $orders = Order::where('current_status_id', 13)->where('payment_status', 'Paid')->sum('grand_total'); $purchase_orders = PurchaseOrder::where('status', 'Received')->sum('total_price'); if ($orders > 0) { $data = [ 'orders_total' => "$" . number_format($orders, 2), 'purchase_orders_total' => "$" . number_format($purchase_orders, 2), 'cog_percentage' => number_format((($purchase_orders / $orders) * 100), 2) . "%", ]; } else { $data = [ 'orders_total' => "$" . number_format($orders, 2), 'purchase_orders_total' => "$" . number_format($purchase_orders, 2), 'cog_percentage' => number_format(0) . "%", ]; } return $data; } public function getNewContactQueriesCount() { return ContactQuery::where('is_read', 0)->count(); } } Controllers/Api/V1/Admin/ProductsImportController.php 0000644 00000003566 15021222673 0016666 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\ProductsImportRequest; use App\Http\Resources\Admin\ImportedProductsResource; use App\Jobs\AssociateProductMedia; use App\Jobs\ProcessProductsImport; use App\Models\Category; use App\Models\Product; use App\Models\ProductPrice; use App\Models\ProductsImport; use App\Models\ProductVariation; use App\Models\ProductVariationCombination; use App\Models\ProductVariationRange; use App\Models\TempProductUrl; use App\Models\Variation; use App\Models\Vendor; use Illuminate\Http\Request; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use Symfony\Component\HttpFoundation\Response; class ProductsImportController extends Controller { public function index() { $imports = ProductsImport::orderBy('created_at', 'DESC')->get(); ImportedProductsResource::withoutWrapping(); return ImportedProductsResource::collection($imports); } public function import_products(ProductsImportRequest $request) { $import = ProductsImport::create([ 'imported_by_id' => auth()->id(), 'status' => 'Pending' ]); $import->addMediaFromRequest('file') ->toMediaCollection('file_import', 'imported_files'); \Bus::dispatch((new ProcessProductsImport($import))->delay(now()->addSeconds(5))); return \response()->json([ 'message' => 'Products import will be starting soon. You will get email when it is finished.' ])->setStatusCode(Response::HTTP_OK); } public function dispatchProductMediaJob() { \Bus::dispatch((new AssociateProductMedia())->delay(now()->addSeconds(5))); return \response()->json([ 'message' => 'Dispatch job started.' ])->setStatusCode(Response::HTTP_OK); } } Controllers/Api/V1/Admin/VendorsApiController.php 0000644 00000005312 15021222673 0015731 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreVendorRequest; use App\Http\Requests\Admin\UpdateVendorRequest; use App\Http\Resources\Admin\VendorResource; use App\Models\Vendor; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class VendorsApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('vendor_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $vendors = Vendor::when($request->filled('name'), function ($query) use ($request) { $searchQuery = $request->get('name'); $query->whereRaw("name like '%".addslashes($searchQuery)."%' OR email like '%".addslashes($searchQuery)."%' OR phone like '%".addslashes($searchQuery)."%' OR address like '%".addslashes($searchQuery)."%' OR account_number like '%".addslashes($searchQuery)."%' OR payment_terms like '%".addslashes($searchQuery)."%' OR credit_card_ending like '%".addslashes($searchQuery)."%'"); })->orderBy('created_at', 'DESC')->paginate(50); return new VendorResource($vendors); } public function getVendors() { $vendors = Vendor::orderBy('name')->get(); return new VendorResource($vendors); } public function store(StoreVendorRequest $request) { $vendor = Vendor::create($request->all()); return (new VendorResource($vendor)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Vendor $vendor) { abort_if(Gate::denies('vendor_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new VendorResource($vendor); } public function update(UpdateVendorRequest $request, Vendor $vendor) { $vendor->update($request->all()); return (new VendorResource($vendor)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Vendor $vendor) { abort_if(Gate::denies('vendor_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $vendor->delete(); return response() ->json(['message' => 'Vendor deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Vendor -> '.$vendor->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete vendor."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/OfficeSuppliesApiController.php 0000644 00000013455 15021222673 0017240 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\StoreOfficeSupplyRequest; use App\Http\Requests\Admin\StoreProductRequest; use App\Http\Requests\Admin\UpdateOfficeSupplyRequest; use App\Http\Requests\Admin\UpdateProductRequest; use App\Http\Resources\Admin\OfficeSuppliesInfoResource; use App\Http\Resources\Admin\OfficeSuppliesResource; use App\Http\Resources\Admin\ProductDetailsResource; use App\Http\Resources\Admin\ProductResource; use App\Http\Resources\Admin\ProductResourceWithAttributes; use App\Http\Resources\Admin\ProductSimple; use App\Models\OfficeSupplies; use App\Models\Product; use App\Models\ProductPrice; use App\Models\ProductVariation; use App\Models\ProductVariationCombination; use App\Models\ProductVariationRange; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Symfony\Component\HttpFoundation\Response; class OfficeSuppliesApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('office_supplies_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); OfficeSuppliesResource::withoutWrapping(); $officeSupplies = OfficeSupplies::with([ 'vendor', ])->orderBy('created_at', 'DESC'); if($request->has('search') && !empty($request->search)) { $officeSupplies = $officeSupplies->where('name', 'LIKE', '%'.$request->search.'%')->orWhere('sku', 'LIKE', '%'.$request->search.'%')->orWhere('description', 'LIKE', '%'.$request->search.'%'); } $office_supplies = $officeSupplies->paginate(10); return OfficeSuppliesResource::collection($office_supplies); } public function getActiveOfficeSupplies(Request $request) { abort_if(Gate::denies('office_supplies_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); OfficeSuppliesResource::withoutWrapping(); $office_supplies = OfficeSupplies::active() ->with([ 'vendor', ])->orderBy('name', 'DESC')->get(); return OfficeSuppliesResource::collection($office_supplies); } public function store(StoreOfficeSupplyRequest $request) { DB::beginTransaction(); try { $office_supply = OfficeSupplies::create([ 'vendor_id' => $request['vendor_id'], 'name' => $request['name'], 'sku' => $request['sku'], 'description' => $request['description'], 'price' => $request['price'], 'status' => $request['status'], ]); if ($request->hasFile('featured_image')) { $office_supply->addMediaFromRequest('featured_image') ->toMediaCollection('featured_image', 'office_supplies')->save(); } DB::commit(); return (new OfficeSuppliesResource($office_supply)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e){ \Log::channel('db_errors')->info('Office Supplies Create Error'); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Can not create office supply.", 'errors' => ["error" => ["Unable to create office supply."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function show(OfficeSupplies $office_supply) { abort_if(Gate::denies('office_supplies_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OfficeSuppliesResource($office_supply); } public function update(UpdateOfficeSupplyRequest $request, OfficeSupplies $office_supply) { DB::beginTransaction(); try { $office_supply->update([ 'vendor_id' => $request['vendor_id'], 'name' => $request['name'], 'sku' => $request['sku'], 'description' => $request['description'], 'price' => $request['price'], 'status' => $request['status'], ]); if ($request->hasFile('featured_image')) { if (!empty($office_supply->featured_image)) { $office_supply->clearMediaCollection('featured_image'); } $office_supply->addMediaFromRequest('featured_image') ->toMediaCollection('featured_image', 'office_supplies'); $office_supply->save(); } $office_supply->save(); DB::commit(); return (new OfficeSuppliesResource($office_supply)) ->response() ->setStatusCode(Response::HTTP_CREATED); }catch (\Exception $e){ \Log::channel('db_errors')->info('Office Supplies Update Error'); \Log::channel('db_errors')->info($e->getMessage()); DB::rollBack(); return response() ->json([ 'message' => "Can not update office supply.", 'errors' => ["error" => ["Unable to update office supply."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function toggleStatus(OfficeSupplies $office_supply) { abort_if(Gate::denies('product_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $office_supply->status = !$office_supply->status; $office_supply->save(); return response() ->json(['message' => 'Office supply status updated successfully'], Response::HTTP_OK); } } Controllers/Api/V1/Admin/ReportsApiController.php 0000644 00000113374 15021222673 0015757 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\JobsCompletedComparisonRequest; use App\Http\Requests\Admin\JobsCompletedRequest; use App\Http\Requests\Admin\OutstandingReportRequest; use App\Http\Requests\Admin\PaymentCollectionReportRequest; use App\Http\Requests\Admin\SalesComparisonRequest; use App\Http\Requests\Admin\SalesReportRequest; use App\Http\Requests\Admin\SalesTaxComparisonRequest; use App\Http\Requests\Admin\SalesTaxExemptionReportRequest; use App\Http\Requests\Admin\SalesTaxReportRequest; use App\Http\Requests\Admin\SalesTaxSummarizationReportRequest; use App\Http\Requests\Admin\TopSellingProductsRequest; use App\Http\Requests\Admin\YearOverYearRequest; use App\Http\Resources\Admin\OutstandingOrderResource; use App\Http\Resources\Admin\TopSellingV2Resource; use App\Models\Order; use App\Models\OrderItems; use App\Models\ReportJobsCompleted; use App\Models\ReportPaymentsCollection; use App\Models\ReportSales; use App\Models\ReportSalesTax; use Barryvdh\DomPDF\Facade\Pdf; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Symfony\Component\HttpFoundation\Response; class ReportsApiController extends Controller { public function salesTaxReport(SalesTaxReportRequest $request) { $report_scope = ReportSalesTax::REPORTS_MODE[$request->get('report_type') ?? 'previous_month']; $reports = ReportSalesTax::$report_scope()->where('waive_off_sales_tax', 0)->get()->sum('amount'); return response()->json(['data' => $reports])->setStatusCode(Response::HTTP_OK); } public function salesTaxExemptionReport(SalesTaxExemptionReportRequest $request, $need_pdf = false) { $date_range = reportDateRange($request); $report_scope = ReportSalesTax::REPORTS_MODE[$request->get('report_type') ?? 'previous_month']; $reports = ReportSalesTax::$report_scope()->where('waive_off_sales_tax', 1) ->when($request->has('waive_off_sales_tax_reason'), function ($query) use ($request) { $query->where('waive_off_sales_tax_reason', 'LIKE', '%' . $request->get('waive_off_sales_tax_reason') . '%'); }) ->when($request->has('resale_number'), function ($query) use ($request) { $query->where('resale_number', 'LIKE', '%' . $request->get('resale_number') . '%'); }) ->get(); $data = [ 'reports' => $reports, 'total_tax_exempted' => number_format($reports->sum('amount'), 2), 'year_from' => $date_range['year_from'], 'year_to' => $date_range['year_to'], ]; if ($need_pdf) return $data; return response()->json(['data' => $data])->setStatusCode(Response::HTTP_OK); } public function salesTaxExemptionReportPDF(SalesTaxExemptionReportRequest $request) { $data = $this->salesTaxExemptionReport($request, need_pdf: true); $path = "storage/reports/sales-tax-exemption-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.sales-tax-exemption', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function salesReport(SalesReportRequest $request) { $report_scope = ReportSales::REPORTS_MODE[$request->get('report_type') ?? 'previous_month']; $reports = ReportSales::$report_scope()->get(); $amount = $reports->sum('amount'); $count = $reports->count('amount'); return response()->json(['data' => [ 'total_amount' => $amount, 'total_orders' => $count, ]])->setStatusCode(Response::HTTP_OK); } public function jobsCompleted(JobsCompletedRequest $request) { $report_scope = ReportJobsCompleted::REPORTS_MODE[$request->get('report_type') ?? 'previous_month']; $reports = ReportJobsCompleted::$report_scope()->get()->count(); return response()->json(['data' => $reports])->setStatusCode(Response::HTTP_OK); } public function yearOverYearSales(YearOverYearRequest $request) { $date_range = reportDateRange($request); $startYear = $date_range['year_from']->format('Y'); $endYear = $date_range['year_to']->format('Y'); $years = range($startYear, $endYear); $reports = DB::table('orders')->select( DB::raw("SUM(grand_total) as amount"), DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d') as formatted_date") ) ->groupBy("formatted_date") ->whereBetween('created_at', $date_range) ->where('payment_status', 'Paid') ->get(); $data = []; foreach ($years as $year) { foreach (range(1, 12) as $month) { $month_string = Carbon::createFromDate(null, $month, 1)->format('M'); $data[$year][$month_string] = 0; $r = $reports->filter(function ($report) use ($year, $month) { if ($month < 10) { $search = $year . "-" . str_pad('0', '2', $month); } else { $search = $year . "-" . $month; } return str_contains($report->formatted_date, $search); }); foreach ($r as $rp) { if (isset($data[$year][$month_string])) { $data[$year][$month_string] += $rp->amount; } else { $data[$year][$month_string] = $rp->amount; } } } } $data = array_map(function ($item) { return array_map(function ($amount) { return round($amount, 2); }, $item); }, $data); return response()->json(['data' => $data])->setStatusCode(Response::HTTP_OK); } public function paymentTransactionReport() {} public function salesComparisonReport(SalesComparisonRequest $request, $need_pdf = false) { $date_range = reportDateRange($request); $startYear = $date_range['year_from']->format('Y'); $endYear = $date_range['year_to']->format('Y'); $years = range($startYear, $endYear); $reports = DB::table('orders as o') ->select([ DB::raw('YEAR(created_at) as year'), DB::raw('MONTH(created_at) as month'), DB::raw(' SUM( COALESCE(o.rush_order_amount, 0) + (CASE WHEN o.waive_off_sales_tax = 0 THEN COALESCE(o.sales_tax_amount, 0) ELSE 0 END) + COALESCE(o.shipping_charges, 0) - COALESCE(o.discount_total, 0) + (SELECT SUM(total_price_after_engraving) FROM order_items WHERE order_items.order_id = o.id) ) AS amount ') ]) ->whereIn('o.current_status_id', [2, 13]) ->where('o.order_type', '!=', 'Quote') ->whereBetween('created_at', [$startYear . '-01-01', $endYear . '-12-31']) ->groupBy('year', 'month') ->orderBy('year', 'desc') ->orderBy('month') ->get(); $tableData = []; $yearlyTotals = []; $yearlyHighest = []; $yearlyLowest = []; $yearlyAverage = []; foreach ($years as $year) { $yearlyTotals[$year] = '0.00'; $yearlyHighest[$year] = '0.00'; $yearlyLowest[$year] = PHP_INT_MAX; $yearlyAverage[$year] = '0.00'; } $allYears = []; foreach ($reports as $report) { if (isset($allYears[$report->year])) { $allYears[$report->year]++; } else { $allYears[$report->year] = 1; } } foreach ($reports as $report) { $tableData[$report->year][$report->month] = $report->amount; $yearlyTotals[$report->year] += number_format($report->amount, 2, '.', ''); if ($report->amount > $yearlyHighest[$report->year]) { $yearlyHighest[$report->year] = number_format($report->amount, 2, '.', ''); } if ($report->amount < $yearlyLowest[$report->year]) { if ($allYears[$report->year] < 12) { $yearlyLowest[$report->year] = number_format(0, 2); } else { $yearlyLowest[$report->year] = number_format($report->amount, 2, '.', ''); } } } $monthlyTotals = []; foreach (range(1, 12) as $month) { $monthlyTotal = 0; foreach ($years as $year) { $monthlyTotal += $tableData[$year][$month] ?? '0.00'; } $monthlyTotals[Carbon::createFromDate(null, $month, 1)->format('M')] = number_format($monthlyTotal, 2); } $responseData = []; foreach (range(1, 12) as $month) { $rowData = ['month' => Carbon::createFromDate(null, $month, 1)->format('M')]; foreach ($years as $year) { $rowData[$year] = $tableData[$year][$month] ?? '0.00'; } $responseData[] = $rowData; } foreach ($yearlyTotals as $key => $value) { $devider = 12; if ($key == now()->format('Y')) { $devider = now()->format('m'); } $yearlyAverage[$key] = number_format($value / $devider, 2, '.', ''); } //Remove junk from the lowest array $yearlyLowest = array_map(function ($item) { return $item == PHP_INT_MAX ? '0.00' : $item ?? '0.00'; }, $yearlyLowest); if ($need_pdf) { return [ 'years' => $years, 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ]; } else { return response()->json([ 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ])->setStatusCode(Response::HTTP_OK); } } public function getSaleComparisonPDF(SalesComparisonRequest $request) { $data = $this->salesComparisonReport($request, true); $path = "storage/reports/sale-comparison-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.sale-comparison', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function saleTaxComparison(SalesTaxComparisonRequest $request, $need_pdf = false) { $date_range = reportDateRange($request); $startYear = $date_range['year_from']->format('Y'); $endYear = $date_range['year_to']->format('Y'); $years = range($startYear, $endYear); $reports = DB::table('report_sales_tax') ->select(DB::raw('YEAR(date) as year'), DB::raw('MONTH(date) as month'), DB::raw('SUM(amount) as total')) ->whereBetween('date', [$startYear . '-01-01', $endYear . '-12-31']) ->where('waive_off_sales_tax', 0) ->groupBy('year', 'month') ->orderBy('year', 'desc') ->orderBy('month') ->get(); $tableData = []; $yearlyTotals = []; $yearlyHighest = []; $yearlyLowest = []; $yearlyAverage = []; foreach ($years as $year) { $yearlyTotals[$year] = '0.00'; $yearlyHighest[$year] = '0.00'; $yearlyLowest[$year] = PHP_INT_MAX; $yearlyAverage[$year] = '0.00'; } $allYears = []; foreach ($reports as $report) { if (isset($allYears[$report->year])) { $allYears[$report->year]++; } else { $allYears[$report->year] = 1; } } foreach ($reports as $report) { $tableData[$report->year][$report->month] = $report->total; $yearlyTotals[$report->year] += $report->total; if ($report->total > $yearlyHighest[$report->year]) { $yearlyHighest[$report->year] = $report->total; } if ($report->total < $yearlyLowest[$report->year]) { if ($allYears[$report->year] < 12) { $yearlyLowest[$report->year] = number_format(0, 2); } else { $yearlyLowest[$report->year] = $report->total; } } } $monthlyTotals = []; foreach (range(1, 12) as $month) { $monthlyTotal = 0; foreach ($years as $year) { $monthlyTotal += $tableData[$year][$month] ?? '0.00'; } $monthlyTotals[Carbon::createFromDate(null, $month, 1)->format('M')] = number_format($monthlyTotal, 2); } $responseData = []; foreach (range(1, 12) as $month) { $rowData = ['month' => Carbon::createFromDate(null, $month, 1)->format('M')]; foreach ($years as $year) { $rowData[$year] = $tableData[$year][$month] ?? '0.00'; } $responseData[] = $rowData; } foreach ($yearlyTotals as $key => $value) { $yearlyAverage[$key] = number_format($value / 12, 2); } //Remove junk from the lowest array $yearlyLowest = array_map(function ($item) { return $item == PHP_INT_MAX ? '0.00' : $item ?? '0.00'; }, $yearlyLowest); if ($need_pdf) { return [ 'years' => $years, 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ]; } else { return response()->json([ 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ])->setStatusCode(Response::HTTP_OK); } } public function getSaleTaxComparisonPDF(SalesTaxComparisonRequest $request) { $data = $this->saleTaxComparison($request, true); $path = "storage/reports/sales-tax-comparison-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.sales-tax-comparison', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function getJobCompletedComparison(JobsCompletedComparisonRequest $request, $need_pdf = false) { $date_range = reportDateRange($request); if (in_array($request->get('report_type'), ['daily', 'weekly'])) { $startYear = $date_range['year_from']; $st = $date_range['year_from']->copy(); $endYear = $date_range['year_to']; $reports = DB::table('report_jobs_completed') ->select( DB::raw("DATE_FORMAT(date, '%Y-%m-%d') as formatted_date"), DB::raw('COUNT(id) as total') ) ->whereBetween('date', [$startYear, $endYear]) ->groupBy('formatted_date') ->orderBy('formatted_date') ->get(); $total_jobs = $reports->sum('total'); $filtered_reports = []; for ($i = $startYear; $i->lte($endYear); $i->addDay()) { $formatted_date = $i->format('Y-m-d'); $report = $reports->filter((function ($report) use ($formatted_date) { return str_contains($report->formatted_date, $formatted_date); })); $filtered_reports[$formatted_date] = $report->isNotEmpty() ? (array) $report[0] : ['date' => $formatted_date, 'total' => 0]; } if ($need_pdf) { return [ 'data' => $filtered_reports, 'year_from' => $st, 'year_to' => $endYear, 'total_jobs' => $total_jobs, ]; } else { return response()->json([ 'data' => $filtered_reports, 'year_from' => $st, 'year_to' => $endYear, 'total_jobs' => $total_jobs, ])->setStatusCode(Response::HTTP_OK); } } else { $startYear = $date_range['year_from']->format('Y'); $endYear = $date_range['year_to']->format('Y'); $reports = DB::table('report_jobs_completed') ->select( DB::raw('YEAR(date) as year'), DB::raw('MONTH(date) as month'), DB::raw('COUNT(id) as total') ) ->whereBetween('date', [$startYear . '-01-01', $endYear . '-12-31']) ->groupBy('year', 'month') ->orderBy('year', 'desc') ->orderBy('month') ->get(); $years = range($startYear, $endYear); $tableData = []; $yearlyTotals = []; $yearlyHighest = []; $yearlyLowest = []; $yearlyAverage = []; foreach ($years as $year) { $yearlyTotals[$year] = 0; $yearlyHighest[$year] = 0; $yearlyLowest[$year] = PHP_INT_MAX; $yearlyAverage[$year] = 0; } $allYears = []; foreach ($reports as $report) { if (isset($allYears[$report->year])) { $allYears[$report->year]++; } else { $allYears[$report->year] = 1; } } foreach ($reports as $report) { $tableData[$report->year][$report->month] = $report->total; $yearlyTotals[$report->year] += $report->total; if ($report->total > $yearlyHighest[$report->year]) { $yearlyHighest[$report->year] = $report->total; } if ($report->total < $yearlyLowest[$report->year]) { if ($allYears[$report->year] < 12) { $yearlyLowest[$report->year] = 0; } else { $yearlyLowest[$report->year] = $report->total; } } } $monthlyTotals = []; foreach (range(1, 12) as $month) { $monthlyTotal = 0; foreach ($years as $year) { $monthlyTotal += $tableData[$year][$month] ?? '0.00'; } $monthlyTotals[Carbon::createFromDate(null, $month, 1)->format('M')] = $monthlyTotal; } $responseData = []; foreach (range(1, 12) as $month) { $rowData = ['month' => Carbon::createFromDate(null, $month, 1)->format('M')]; foreach ($years as $year) { $rowData[$year] = $tableData[$year][$month] ?? 0; } $responseData[] = $rowData; } foreach ($yearlyTotals as $key => $value) { $yearlyAverage[$key] = number_format($value / 12); } //Remove junk from the lowest array $yearlyLowest = array_map(function ($item) { return $item == PHP_INT_MAX ? 0 : $item ?? 0; }, $yearlyLowest); if ($need_pdf) { return [ 'years' => $years, 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ]; } else { return response()->json([ 'data' => $responseData, 'yearly_totals' => $yearlyTotals, 'yearly_average' => $yearlyAverage, 'yearly_highest' => $yearlyHighest, 'yearly_lowest' => $yearlyLowest, 'monthly_totals' => $monthlyTotals, ])->setStatusCode(Response::HTTP_OK); } } } public function getJobCompletedComparisonPDF(JobsCompletedComparisonRequest $request) { $data = $this->getJobCompletedComparison($request, true); if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } if ($request->get('report_type') == 'daily') { $path = "storage/reports/jobs-completed-comparison-report-daily.pdf"; Pdf::loadView('layouts.reports.jobs-completed-daily', compact('data')) ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } else if ($request->get('report_type') == 'weekly') { $path = "storage/reports/jobs-completed-comparison-report-weekly.pdf"; Pdf::loadView('layouts.reports.jobs-completed-weekly', compact('data')) ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } else { $path = "storage/reports/jobs-completed-comparison-report.pdf"; Pdf::loadView('layouts.reports.jobs-completed-comparison', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } } public function getPaymentCollectionReport(PaymentCollectionReportRequest $request, $need_pdf = false) { $date_range = reportDateRange($request); $report_scope = ReportPaymentsCollection::REPORTS_MODE[$request->get('report_type') ?? 'previous_month']; if ($request->has('date')) { $reports = ReportPaymentsCollection::$report_scope($request->get('date')) ->when($request->has('payment_type'), function ($query) use ($request) { $query->where('payment_type', $request->get('payment_type')); }) ->where('waive_off_sales_tax', 0) ->orderBy('payment_type') ->orderBy('date') ->get(); } else { $reports = ReportPaymentsCollection::$report_scope() ->when($request->has('payment_type'), function ($query) use ($request) { $query->where('payment_type', $request->get('payment_type')); }) ->where('waive_off_sales_tax', 0) ->orderBy('payment_type') ->orderBy('date') ->get(); } $data = [ 'reports' => $this->getSortedPaymentCollectionReport($reports), 'total_amount' => number_format($reports->sum('amount'), 2), 'year_from' => $date_range['year_from'], 'year_to' => $date_range['year_to'], ]; if ($need_pdf) return $data; return response()->json(['data' => $data])->setStatusCode(Response::HTTP_OK); } public function getPaymentCollectionReportPDF(PaymentCollectionReportRequest $request) { $data = $this->getPaymentCollectionReport($request, true); if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } $path = "storage/reports/payment-transaction-report.pdf"; Pdf::loadView('layouts.reports.payment-collection-report', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function getSortedPaymentCollectionReport($reports) { $sorted_data = []; foreach ($reports as $report) { $data = [ 'order_number' => $report->order_number, 'payment_type' => $report->payment_type, 'date' => Carbon::make($report->date)->format('Y-m-d'), 'amount' => $report->amount, ]; if ($report->payment_type == 'Credit Card') { $data['description'] = $report->payment_type . " | " . $report->last_four; } else if ($report->payment_type == 'Purchase Order') { $data['description'] = $report->payment_type . " | " . $report->purchase_order_number; } else if ($report->payment_type == 'Check') { $data['description'] = $report->payment_type . " | " . $report->cheque_number; } else { $data['description'] = $report->payment_type; } $sorted_data[$report->payment_type][] = $data; if (isset($sorted_data[$report->payment_type]['total_amount'])) { $sorted_data[$report->payment_type]['total_amount'] += $report->amount; } else { $sorted_data[$report->payment_type]['total_amount'] = $report->amount; } } return $sorted_data; } public function getTopSellingProducts(TopSellingProductsRequest $request) { if ($request->date_from != null && $request->date_to != null) { $date_from = Carbon::make($request->date_from); $date_to = Carbon::make($request->date_to); $top_selling_products = DB::table('order_items') ->select('products.name', DB::raw('SUM(quantity) as units')) ->leftJoin('products', 'order_items.product_id', '=', 'products.id') ->leftJoin('orders', 'order_items.order_id', '=', 'orders.id') ->whereBetween('orders.created_at', [$date_from, $date_to]) ->groupBy('order_items.product_id', 'products.name') ->orderBy('units', 'DESC') ->take(10) ->get(); } else { $top_selling_products = DB::table('order_items') ->select('products.name', DB::raw('SUM(quantity) as units')) ->leftJoin('products', 'order_items.product_id', '=', 'products.id') ->groupBy('order_items.product_id', 'products.name') ->orderBy('units', 'DESC') ->take(10) ->get(); } return response()->json([ 'data' => $top_selling_products, ])->setStatusCode(Response::HTTP_OK); } public function outstandingOrderReport(OutstandingReportRequest $request, $need_pdf = false) { if (!isset($request->report_type)) { $request->merge(['report_type' => 'all']); } $report_scope = Order::REPORTS_MODE[$request->get('report_type')]; $date_range = reportDateRange($request); $outstanding_orders = Order::$report_scope() ->where('payment_status', 'Unpaid') ->whereNotIn('current_status_id', [1, 10]) ->when($request->filled('status_id'), function ($query) use ($request) { $query->where('current_status_id', $request->get('status_id')); }) ->when($request->filled('name'), function ($query) use ($request) { $query->whereHas('user', function ($query) use ($request) { $query->where('name', 'like', "%{$request->get('name')}%"); }); }) ->orderBy('id', 'desc')->get(); $amount = $outstanding_orders->sum('grand_total'); OutstandingOrderResource::withoutWrapping(); if ($need_pdf) { return [ 'data' => OutstandingOrderResource::collection($outstanding_orders), 'total_amount' => number_format($amount, 2), 'date_range' => $request->report_type == 'all' ? 'Until today' : $date_range['year_from']->format('m-d-Y') . ' - ' . $date_range['year_to']->format('m-d-Y'), ]; } else { return response()->json(['data' => [ 'data' => OutstandingOrderResource::collection($outstanding_orders), 'total_amount' => number_format($amount, 2), 'date_range' => $request->report_type == 'all' ? 'Until today' : $date_range['year_from']->format('m-d-Y') . ' - ' . $date_range['year_to']->format('m-d-Y'), ]])->setStatusCode(Response::HTTP_OK); } } public function outstandingOrderReportPDF(OutstandingReportRequest $request) { $data = $this->outstandingOrderReport($request, true); $path = "storage/reports/outstanding-orders-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.outstanding-orders', compact('data')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function getTopSellingProductsV2(TopSellingProductsRequest $request, $field, $sort, $need_pdf = false) { $info = [ 'total_quantity' => 'Items Sold', 'total_price' => 'Total Price', 'asc' => 'Ascending', 'desc' => 'Descending', ]; $date_title = "Until today"; if ($request->date_from != null && $request->date_to != null) { $date_title = $request->date_from . " - " . $request->date_to; $date_from = Carbon::make($request->date_from); $date_to = Carbon::make($request->date_to); $top_selling_products = OrderItems::select( 'products.name as product_name', 'products.sku', 'vendors.name as vendor_name', 'order_items.price_id', DB::raw('SUM(order_items.quantity) as total_quantity'), DB::raw('SUM(order_items.total_price_after_engraving) as total_price') ) ->leftJoin('products', 'products.id', '=', 'order_items.product_id') ->leftJoin('vendors', 'vendors.id', '=', 'products.vendor_id') ->leftJoin('orders', 'orders.id', '=', 'order_items.order_id') ->when($request->has('vendor_name'), function ($query) use ($request) { $query->where('vendors.name', 'like', "%{$request->get('vendor_name')}%"); }) ->whereBetween('order_items.created_at', [$date_from, $date_to]) ->where('orders.current_status_id', "<>", 10) //To exclude cancelled order ->groupBy('products.name', 'products.sku', 'vendors.name', 'order_items.product_id') ->orderBy($field, $sort) ->get(); } else { $top_selling_products = OrderItems::select( 'products.name as product_name', 'products.sku', 'vendors.name as vendor_name', 'order_items.price_id', DB::raw('SUM(order_items.quantity) as total_quantity'), DB::raw('SUM(order_items.total_price_after_engraving) as total_price') ) ->leftJoin('products', 'products.id', '=', 'order_items.product_id') ->leftJoin('vendors', 'vendors.id', '=', 'products.vendor_id') ->leftJoin('orders', 'orders.id', '=', 'order_items.order_id') ->when($request->has('vendor_name'), function ($query) use ($request) { $query->where('vendors.name', 'like', "%{$request->get('vendor_name')}%"); }) ->where('orders.current_status_id', "<>", 10) //To exclude cancelled order ->groupBy('products.name', 'products.sku', 'vendors.name', 'order_items.product_id') ->orderBy($field, $sort) ->get(); } TopSellingV2Resource::withoutWrapping(); if ($need_pdf) { return [ 'data' => TopSellingV2Resource::collection($top_selling_products), 'total_quantity' => number_format($top_selling_products->sum('total_quantity')), 'total_price' => "$" . number_format($top_selling_products->sum('total_price'), 2), 'total_products' => number_format($top_selling_products->count()), 'date_title' => $date_title, 'order_by' => $info[$field], 'sort_by' => $info[$sort], ]; } else { return response()->json([ 'data' => TopSellingV2Resource::collection($top_selling_products), 'total_quantity' => number_format($top_selling_products->sum('total_quantity')), 'total_price' => "$" . number_format($top_selling_products->sum('total_price'), 2), 'total_products' => number_format($top_selling_products->count()), 'date_title' => $date_title, 'order_by' => $info[$field], 'sort_by' => $info[$sort], ])->setStatusCode(Response::HTTP_OK); } } public function getTopSellingProductsV2PDF(TopSellingProductsRequest $request, $field, $sort) { $data = $this->getTopSellingProductsV2($request, $field, $sort, true); $path = "storage/reports/top-selling-products-v2.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.top-selling-products-v2', compact('data')) ->setPaper('A4') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function saleTaxSummarization(SalesTaxSummarizationReportRequest $request, $need_pdf = false) { $gross_total = $total_exemptions = 0; $exemption_data = []; $date_title = 'Until Today'; if ($request->has('date_from') && $request->has('date_to')) { $date_title = $request->get('date_from') . " - " . $request->get('date_to'); $date_from = Carbon::make($request->get('date_from')); $date_to = Carbon::make($request->get('date_to')); $orders = Order::selectRaw('waive_off_sales_tax_reason, SUM(grand_total) as grand_total, SUM(sales_tax_amount) as total_sales_tax_amount') ->where('payment_status', 'paid') ->whereBetween('payment_date', [$date_from, $date_to]) ->groupBy('waive_off_sales_tax_reason') ->orderBy('waive_off_sales_tax_reason') ->get(); } else { $orders = Order::selectRaw('waive_off_sales_tax_reason, SUM(grand_total) as grand_total, SUM(sales_tax_amount) as total_sales_tax_amount') ->where('payment_status', 'paid') ->groupBy('waive_off_sales_tax_reason') ->orderBy('waive_off_sales_tax_reason') ->get(); } foreach ($orders as $order) { $gross_total += $order->grand_total; if ($order->waive_off_sales_tax_reason != null && $order->waive_off_sales_tax_reason != '') { $total_exemptions += $order->total_sales_tax_amount; $exemption_data[] = [ 'reason' => $order->waive_off_sales_tax_reason, 'amount' => "$" . number_format($order->total_sales_tax_amount, 2), ]; } } $taxable_transactions = $gross_total - $total_exemptions; $tax_due = $taxable_transactions * 0.0775; $data = [ 'date_title' => $date_title, 'gross_total' => "$" . number_format($gross_total, 2), 'total_exemptions' => "$" . number_format($total_exemptions, 2), 'taxable_transactions' => "$" . number_format($taxable_transactions, 2), 'tax_due' => "$" . number_format($tax_due, 2), 'exemption_data' => $exemption_data, ]; if ($need_pdf) { return $data; } else { return response()->json(['data' => $data])->setStatusCode(Response::HTTP_OK); } } public function getSaleTaxSummarizationPDF(SalesTaxSummarizationReportRequest $request) { $data = $this->saleTaxSummarization($request, true); $path = "storage/reports/sales-tax-summarization-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.sales-tax-summarization-report', compact('data')) ->setPaper('A4') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } } Controllers/Api/V1/Admin/SalesTaxApiController.php 0000644 00000003010 15021222673 0016026 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\UpdateSalesTaxRequest; use App\Http\Resources\Admin\StateResource; use App\Http\Resources\Admin\StateSalesTaxResource; use App\Models\StateSalesTax; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class SalesTaxApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('sales_tax_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $noPaging = $request->get('no_paging') === "true"; $taxes = StateSalesTax::when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }); if($noPaging) { $taxes = $taxes->get(); } else { $taxes = $taxes->paginate(50); } return new StateSalesTaxResource($taxes); } public function states() { StateResource::withoutWrapping(); return StateResource::collection(StateSalesTax::all()); } public function show(StateSalesTax $stateSalesTax) { return new StateSalesTaxResource($stateSalesTax); } public function update(UpdateSalesTaxRequest $request, StateSalesTax $stateSalesTax) { $stateSalesTax->update($request->all()); return (new StateSalesTaxResource($stateSalesTax)) ->response() ->setStatusCode(Response::HTTP_CREATED); } } Controllers/Api/V1/Admin/StockLocationApiController.php 0000644 00000006237 15021222673 0017074 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreStockLocationRequest; use App\Http\Requests\Admin\UpdateStockLocationRequest; use App\Http\Resources\Admin\StockLocationEditResource; use App\Http\Resources\Admin\StockLocationResource; use App\Models\StockLocation; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Gate; class StockLocationApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('stock_location_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $noPaging = $request->get('no_paging') === "true"; $locations = StockLocation::when($request->filled('search'), function ($query) use ($request) { $search = addslashes($request->get('search')); $query->whereRaw("location like '%".$search."%'"); })->orderBy('created_at', 'DESC'); $locations = $noPaging ? $locations->get() : $locations->paginate(50); StockLocationResource::withoutWrapping(); return StockLocationResource::collection($locations); } public function available_locations() { $locations = StockLocation::active()->orderBy('location')->get(); StockLocationResource::withoutWrapping(); return StockLocationResource::collection($locations); } public function store(StoreStockLocationRequest $request) { $stockLocation = StockLocation::create($request->all()); return (new StockLocationResource($stockLocation)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(StockLocation $stockLocation) { abort_if(Gate::denies('stock_location_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new StockLocationEditResource($stockLocation); } public function update(UpdateStockLocationRequest $request, StockLocation $stockLocation) { $stockLocation->update($request->all()); return (new StockLocationResource($stockLocation)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function toggleStatus(StockLocation $stockLocation) { $stockLocation->status = !$stockLocation->status; $stockLocation->save(); return response(['message' => 'Stock location status updated successfully'], Response::HTTP_OK); } public function destroy(StockLocation $stockLocation) { abort_if(Gate::denies('stock_location_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $stockLocation->delete(); return response(['message' => 'Stock location deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Stock Location -> '.$stockLocation->id); \Log::channel('db_errors')->info($e->getMessage()); return response([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete stock location."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/ReviewsApiController.php 0000644 00000006706 15021222673 0015745 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreReviewRequest; use App\Http\Requests\Admin\UpdateReviewRequest; use App\Http\Resources\Admin\ReviewResource; use App\Http\Resources\Admin\ReviewUserResource; use App\Models\Review; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class ReviewsApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('review_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $reviews = Review::when($request->filled('search'), function ($query) use ($request) { $searchQuery = $request->get('search'); $query->whereRaw("comment like '%".addslashes($searchQuery)."%' OR rating like '%".addslashes($searchQuery)."%'"); })->orderBy('created_at', 'DESC')->paginate(50); ReviewResource::withoutWrapping(); return ReviewResource::collection($reviews); } public function myReviews() { $reviews = Review::where('user_id', auth()->id())->orderBy('created_at', 'DESC')->get(); ReviewUserResource::withoutWrapping(); return ReviewUserResource::collection($reviews); } public function editReview(UpdateReviewRequest $request, Review $review) { abort_if(Gate::denies('update-record', $review), Response::HTTP_FORBIDDEN, '403 Forbidden'); $review->update($request->validated()); return (new ReviewUserResource($review)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function deleteReview(Review $review) { abort_if(Gate::denies('update-record', $review), Response::HTTP_FORBIDDEN, '403 Forbidden'); $review->delete(); return response() ->json(['message' => 'Review deleted successfully'], Response::HTTP_OK); } public function store(StoreReviewRequest $request) //User { Review::create(array_merge( $request->all(), [ 'user_id' => auth()->id(), ]) ); return response() ->json(['message' => 'Review submitted successfully.']) ->setStatusCode(Response::HTTP_CREATED); } public function show(Review $review) { abort_if(Gate::denies('review_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new ReviewResource($review); } public function update(UpdateReviewRequest $request, Review $review) { $review->update($request->validated()); return (new ReviewUserResource($review)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Review $review) { abort_if(Gate::denies('review_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $review->delete(); return response() ->json(['message' => 'Review deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Review -> '.$review->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete review."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/SiteSettingApiController.php 0000644 00000005067 15021222673 0016562 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreSiteSettingRequest; use App\Http\Requests\Admin\UpdateSiteSettingRequest; use App\Http\Resources\Admin\SiteSettingResource; use App\Models\SiteSetting; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class SiteSettingApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('site_setting_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $settings = SiteSetting::when($request->filled('key'), function ($query) use ($request){ $query->where('key', 'like', "%{$request->get('key')}%"); })->when($request->filled('value'), function ($query) use ($request){ $query->where('value', 'like', "%{$request->get('value')}%"); })->orderBy('value') ->get(); SiteSettingResource::withoutWrapping(); return SiteSettingResource::collection($settings); } public function store(StoreSiteSettingRequest $request) { $site_setting = SiteSetting::create($request->all()); return (new SiteSettingResource($site_setting)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(SiteSetting $site_setting) { abort_if(Gate::denies('site_setting_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new SiteSettingResource($site_setting); } public function update(UpdateSiteSettingRequest $request, SiteSetting $site_setting) { $site_setting->update($request->validated()); return (new SiteSettingResource($site_setting)) ->response() ->setStatusCode(Response::HTTP_CREATED); } /*public function destroy(SiteSetting $site_setting) { abort_if(Gate::denies('site_setting_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $site_setting->delete(); return response() ->json(['message' => 'Site setting deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Site Setting -> '.$site_setting->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete site setting."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } }*/ } Controllers/Api/V1/Admin/StoreLocationsApiController.php 0000644 00000006365 15021222673 0017272 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreStoreLocationRequest; use App\Http\Requests\Admin\UpdateStoreLocationRequest; use App\Http\Resources\Admin\StoreLocationEditResource; use App\Http\Resources\Admin\StoreLocationResource; use App\Models\StoreLocation; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class StoreLocationsApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('store_location_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $noPaging = $request->get('no_paging') === "true"; $locations = StoreLocation::when($request->filled('search'), function ($query) use ($request) { $search = addslashes($request->get('search')); $query->whereRaw("title like '%".$search."%' OR address like '%".$search."%'"); })->orderBy('created_at', 'DESC'); $locations = $noPaging ? $locations->where("status", 1)->get() : $locations->paginate(50); StoreLocationResource::withoutWrapping(); return StoreLocationResource::collection($locations); } public function available_locations() { $locations = StoreLocation::active()->orderBy('created_at', 'DESC')->get(); StoreLocationResource::withoutWrapping(); return StoreLocationResource::collection($locations); } public function store(StoreStoreLocationRequest $request) { $store_location = StoreLocation::create($request->validated()); return (new StoreLocationResource($store_location)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(StoreLocation $store_location) { abort_if(Gate::denies('store_location_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new StoreLocationEditResource($store_location); } public function update(UpdateStoreLocationRequest $request, StoreLocation $store_location) { $store_location->update($request->validated()); return (new StoreLocationResource($store_location)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function toggleStatus(StoreLocation $store_location) { $store_location->status = !$store_location->status; $store_location->save(); return response(['message' => 'Store location status updated successfully'], Response::HTTP_OK); } public function destroy(StoreLocation $store_location) { abort_if(Gate::denies('store_location_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $store_location->delete(); return response(['message' => 'Store location deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Store Location -> '.$store_location->id); \Log::channel('db_errors')->info($e->getMessage()); return response([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete store location."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/UsersApiController.php 0000644 00000015122 15021222673 0015412 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\StoreUserRequest; use App\Http\Requests\Admin\UpdateUserRequest; use App\Http\Resources\Admin\UserEmployeeResource; use App\Http\Resources\Admin\UserResource; use App\Http\Resources\Admin\UserResourceWithRoles; use App\Models\User; use Carbon\Carbon; use Illuminate\Support\Facades\Gate; use Illuminate\Auth\Events\Registered; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response; class UsersApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $noPaging = $request->get('no_paging') === "true"; $users = User::when($request->filled('search'), function ($query) use ($request){ $search = addslashes($request->get('search')); $query->whereRaw("name like '%".$search."%' OR email like '%".$search."%' OR phone_number like '%".$search."%' OR secondary_email like '%".$search."%' OR secondary_phone like '%".$search."%' OR company like '%".$search."%' OR fax_number like '%".$search."%'"); })->when($request->filled('role'), function ($query) use ($request){ $query->whereHas( 'roles', function($q) use ($request){ $q->where('id', $request->get('role')); }); })->where('id', '<>', 1) ->where('id', '<>', auth()->id()) ->with('roles') ->orderBy('created_at', 'DESC'); $users = $noPaging ? $users->get() : $users->paginate(50); UserResource::withoutWrapping(); return UserResource::collection($users); } public function get_user_types() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return \response() ->json(['data' => User::USER_TYPE_RADIO], Response::HTTP_OK); } public function get_user_durations() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return \response() ->json(['data' => User::REMINDER_DURATION], Response::HTTP_OK); } public function get_employees(Request $request) { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }) ->where('user_type', 2)->get(); UserEmployeeResource::withoutWrapping(); return UserEmployeeResource::collection($users); } public function get_customers() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::where('user_type', 3)->get(); UserEmployeeResource::withoutWrapping(); return UserEmployeeResource::collection($users); } public function change_status($id) { abort_if(Gate::denies('user_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $user = User::findOrFail($id); $user->status = !$user->status; $user->save(); return response() ->json(['message' => 'Status updated successfully!'], Response::HTTP_OK); } public function store(StoreUserRequest $request) { $user = $request->validated(); $user = User::create($user); $user->email_verified_at = now(); $user->save(); $user->roles()->sync($request->input('roles', [])); if ($request->hasFile('profile_image')) { $user->addMediaFromRequest('profile_image') ->toMediaCollection('profile_image', 'user'); } try { event(new Registered($user)); } catch (\Exception $e) { Log::info($e->getMessage()); } return (new UserResource($user)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(User $user) { abort_if(Gate::denies('user_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); UserResourceWithRoles::withoutWrapping(); return new UserResourceWithRoles($user->load(['roles'])); } public function update(UpdateUserRequest $request, User $user) { $user->update([ 'name' => $request->get('name'), 'email' => $request->get('email'), 'phone_number' => $request->get('phone_number'), 'secondary_email' => $request->get('secondary_email'), 'secondary_phone' => $request->get('secondary_phone'), 'secondary_name' => $request->get('secondary_name'), 'company' => $request->get('company'), 'fax_number' => $request->get('fax_number'), 'user_type' => $request->get('user_type'), 'status' => $request->get('status'), 'reminder_duration' => $request->get('reminder_duration'), 'sms_notification' => $request->get('sms_notification'), ]); if ($request->has('password')) { $user->update([ 'password' => $request->get('password') ]); } if ($request->has('birth_date')){ $user->update([ 'birth_date' => Carbon::make($request->get('birth_date')), ]); } $user->roles()->sync($request->input('roles', [])); if ($request->hasFile('profile_image')) { if (!empty($user->profile_image)) { $user->profile_image->delete(); } $user->addMediaFromRequest('profile_image') ->toMediaCollection('profile_image', 'user'); } return (new UserResource($user)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(User $user) { abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $user->delete(); return response(['message' => 'User deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ Log::channel('db_errors')->info('Record Deletion Error : User -> '.$user->id); Log::channel('db_errors')->info($e->getMessage()); return response([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete user."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/OrderApiController.php 0000644 00000212734 15021222673 0015374 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\AddOrderPartialPaymentRequest; use App\Http\Requests\Admin\AddOrderPaymentRequest; use App\Http\Requests\Admin\AddOrderProductRequest; use App\Http\Requests\Admin\StoreOrderRequest; use App\Http\Requests\Admin\UpdateOrderRequest; use App\Http\Requests\User\OrderCustomizationSvgRequest; use App\Http\Requests\User\OrderTotalsRequest; use App\Http\Requests\User\ShippingQuoteRequest; use App\Http\Resources\Admin\OrderInfoEditResource; use App\Http\Resources\Admin\OrderInfoResource; use App\Http\Resources\Admin\OrderNotesResource; use App\Http\Resources\Admin\OrderResource; use App\Http\Resources\Admin\WorkOrder; use App\Models\Coupon; use App\Models\Order; use App\Models\OrderInvoice; use App\Models\OrderItemCustomizationData; use App\Models\OrderItemCustomizationSvg; use App\Models\OrderItems; use App\Models\OrderItemVariation; use App\Models\OrderNotes; use App\Models\OrderPartialPayments; use App\Models\ProductVariationRange; use App\Models\PurchaseOrderToCreate; use App\Models\SiteSetting; use App\Models\Status; use App\Models\User; use App\Notifications\OrderQuoteUserNotification; use App\Rules\ValidateDate; use Illuminate\Support\Facades\Gate; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Storage; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use Symfony\Component\HttpFoundation\Response; class OrderApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->has('pd')) { $orders = $this->getPDOrders($request); } else { //Get NonPDOrders $orders = $this->getNoNPDOrders($request); } $widget_data = $this->getCalendarWidgetData(); OrderResource::withoutWrapping(); return OrderResource::collection($orders)->additional(["calendar_widget_data" => $widget_data[0], 'pd' => $widget_data[1]]); } public function getPDOrders(Request $request) { $old_date = now()->subDays(3)->startOfDay(); $exclude_status_ids = [ 1, //Pending 10, //Cancelled 13, //Completed 14 //Picked / Shipped ]; return Order::where('date_scheduled', '<=', $old_date)->whereNotIn('current_status_id', $exclude_status_ids) ->when($order_number = $request->get('order_number'), function ($query) use ($order_number) { $query->where('order_number', 'LIKE', '%' . $order_number . '%'); })->when($status_id = $request->get('status_id'), function ($query) use ($status_id) { $query->where('current_status_id', $status_id); })->when($delivery_date = $request->get('delivery_date'), function ($query) use ($delivery_date) { $query->whereDate('date_scheduled', $delivery_date); })->when($order_type = $request->get('order_type'), function ($query) use ($order_type) { $query->where('order_type', $order_type); })->when($request->filled('name'), function ($query) use ($request) { $query->whereHas('user', function ($query) use ($request) { $query->where('name', 'like', "%{$request->get('name')}%"); }); })->when($request->filled('email'), function ($query) use ($request) { $query->whereHas('user', function ($query) use ($request) { $query->where('email', 'like', "%{$request->get('email')}%"); }); })->when($request->filled('company'), function ($query) use ($request) { $query->where('billing_company_name', 'like', "%{$request->get('company')}%"); $query->orWhereHas('user', function ($query) use ($request) { $query->where('company', 'like', "%{$request->get('company')}%"); }); })->when($request->filled('payment_status'), function ($query) use ($request) { $query->where('payment_status', $request->payment_status); })->when($request->filled('payment_type'), function ($query) use ($request) { $query->where('payment_type', $request->payment_type); })->when($request->filled('payment_mode'), function ($query) use ($request) { $query->where('payment_mode', $request->payment_mode); })->when($request->filled('rush_order'), function ($query) use ($request) { $query->where('rush_order', $request->rush_order); })->when($request->filled('product_number'), function ($query) use ($request) { $query->whereHas('items.product', function ($query) use ($request) { $query->where('sku', 'LIKE', "%{$request->get('product_number')}%"); }); })->when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); }) ->with([ 'user', 'current_status', 'assigned_to', ]) ->orderBy('id', 'DESC') ->paginate(50) ->appends(request()->query()); } public function getNoNPDOrders(Request $request) { return Order::when($order_number = $request->get('order_number'), function ($query) use ($order_number) { $query->where('order_number', 'LIKE', '%' . $order_number . '%'); })->when($status_id = $request->get('status_id'), function ($query) use ($status_id) { $query->where('current_status_id', $status_id); })->when($delivery_date = $request->get('delivery_date'), function ($query) use ($delivery_date) { $query->whereDate('date_scheduled', $delivery_date); })->when($order_type = $request->get('order_type'), function ($query) use ($order_type) { $query->where('order_type', $order_type); })->when($request->filled('name'), function ($query) use ($request) { $query->whereHas('user', function ($query) use ($request) { $query->where('name', 'like', "%{$request->get('name')}%"); }); })->when($request->filled('email'), function ($query) use ($request) { $query->whereHas('user', function ($query) use ($request) { $query->where('email', 'like', "%{$request->get('email')}%"); }); })->when($request->filled('company'), function ($query) use ($request) { $query->where('billing_company_name', 'like', "%{$request->get('company')}%"); $query->orWhereHas('user', function ($query) use ($request) { $query->where('company', 'like', "%{$request->get('company')}%"); }); })->when($request->filled('payment_status'), function ($query) use ($request) { $query->where('payment_status', $request->payment_status); })->when($request->filled('payment_type'), function ($query) use ($request) { $query->where('payment_type', $request->payment_type); })->when($request->filled('payment_mode'), function ($query) use ($request) { $query->where('payment_mode', $request->payment_mode); })->when($request->filled('rush_order'), function ($query) use ($request) { $query->where('rush_order', $request->rush_order); })->when($request->filled('is_completed'), function ($query) use ($request) { if ($request->is_completed == 1) { $query->where('current_status_id', 13); } else { $query->where('current_status_id', '<>', 13); } })->when($request->filled('product_number'), function ($query) use ($request) { $query->whereHas('items.product', function ($query) use ($request) { $query->where('sku', 'LIKE', "%{$request->get('product_number')}%"); }); })->when(auth()->user()->user_type == 2, function ($query) { $query->where('assigned_to_id', auth()->id()); }) ->with([ 'user', 'current_status', 'assigned_to', ]) ->orderBy('id', 'DESC') ->paginate(50) ->appends(request()->query()); } public function update_order_status(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'status_id' => 'required|exists:statuses,id', 'notes' => 'nullable|string|max:300', ]); //Exclude In Assembly/Cleaning status if ($request->get('status_id') == 12) { return \response() ->json([ 'message' => "Can not update order status.", 'errors' => ['status_id' => ['Invalid status selected.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } if ($order->order_type == 'Quote') { return \response() ->json([ 'message' => "Can not update order status.", 'errors' => ['status_id' => ['Quote order status can not be updated.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $status = Status::find($request->get('status_id')); if ($status->name == 'Order Acknowledgement') { $order->createPurchaseOrderItem(); } else if ($status->name == 'Canceled') { $order->deletePurchaseOrderItem(); } else if ($status->name == 'Complete/Customer Notified') { $request->validate([ 'stock_location_id' => 'required|exists:stock_locations,id', ]); $order->stock_location_id = $request->stock_location_id; } else if ($status->name == 'Products Received/Shelved') { $request->validate([ 'stock_location_id' => 'required|exists:stock_locations,id', ]); $order->stock_location_id = $request->stock_location_id; } else if ($status->name == 'Picked/Shipped') { if ($order->delivery_type == 'Shipping') { $request->validate([ 'tracking_number' => 'required|alpha_num', ]); $order->tracking_number = $request->tracking_number; } else { $request->validate([ 'pickup_by' => 'required|string', ]); $order->pickup_by = $request->pickup_by; } } $order->current_status_id = $request->get('status_id'); $order->statuses()->attach($request->get('status_id'), ['notes' => $request->get('notes'), 'user_id' => auth()->id()]); $order->save(); $order->createInvoice(); //Generate invoice with latest information //Send Order Status Update Email $order->sendOrderStatusUpdatedMail($request->get('notes')); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function add_order_payment(AddOrderPaymentRequest $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); DB::beginTransaction(); $order->payment_type = $request->get('payment_type'); if ($request->get('payment_type') == 'Credit Card') { //Charge via vault_id if we are receiving vault_id if ($request->get('vault_id')) { //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $request->get('vault_id'), $request->get('amount'), ); if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } else { //If customers allowed to save card if ($request->get('save_card', false)) { //Check if PayJunction customerId exists. Create if not present. if (!auth()->user()->pj_id) { $customerCreated = createPJCustomer( $order->billing_address_id, $order->user, ); if (!$customerCreated) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer creation failed."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } $card_data = [ "cardNumber" => $request->get('card_number'), "cardExpMonth" => $request->get('expiry_month'), "cardExpYear" => $request->get('expiry_year'), "cvv" => $request->get('ccv') ]; $vaultId = createPJCustomerVault( $order->user, $order->billing_address_id, $card_data, ); if (!$vaultId['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => ["Customer vault creation failed. Make sure you enter valid card credentials."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } //Charge customer using vault it just created. $charge_response = chargeByVaultId( $order->billing_address_id, $vaultId['vault_id'], $request->get('amount'), ); } else { //Charge by card information $card_data = [ 'card_number' => $request->get('card_number'), 'expiry_month' => $request->get('expiry_month'), 'expiry_year' => $request->get('expiry_year'), 'ccv' => $request->get('ccv'), ]; $charge_response = chargeByCard( $order->billing_address_id, $request->get('amount'), $card_data, ); } if (!$charge_response['success']) { return \response() ->json([ 'message' => "Can not process payment.", 'errors' => ["error" => $charge_response["error"]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->amount_paid = $charge_response['response']->amount_total; $order->payment_id = $charge_response['response']->id; } } else if ($request->get('payment_type') == 'Purchase Order') { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $order->purchase_order_number = $request->get('purchase_order_number'); $order->purchase_order_copy = $purchase_order_copy; $order->amount_paid = $request->get('amount'); } else if ($request->get('payment_type') == 'Check') { $order->cheque_number = $request->get('cheque_number'); $order->amount_paid = $request->get('amount'); } else if ($request->get('payment_type') == 'Cash') { $order->amount_paid = $request->get('amount'); } $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); $order->save(); DB::commit(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update_order_type(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'order_type' => 'required|in:Order', ]); if ($order->order_type == 'Order') { return \response() ->json([ 'message' => "Can not updated order type.", 'errors' => ['order_type' => ['The selected order type is already order.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $order->order_type = $request->get('order_type'); $approved_status = Status::where('name', 'Order Acknowledgement')->first(); $order->statuses()->attach($approved_status->id); $order->current_status_id = $approved_status->id; $order->save(); $order->createPurchaseOrderItem(); $data = [ 'order_number' => $order->order_number, ]; $order->user->notify((new OrderQuoteUserNotification($data))->delay(now()->addSeconds(5))); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update_order_payment(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'payment_status' => 'required|in:' . implode(',', array_keys(Order::PAYMENT_STATUS_RADIO)), ]); $order->payment_status = $request->get('payment_status'); $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update_date_scheduled(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'date_scheduled' => [ 'required', 'date', 'after:today', new ValidateDate, ], ]); $order->date_scheduled = $request->get('date_scheduled'); $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update_date_ship_by(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'date_pick_or_ship_by' => [ 'required', 'date', 'after:today', new ValidateDate, ], ]); $order->date_pick_or_ship_by = $request->get('date_pick_or_ship_by'); $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function waive_off_sales_tax(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'waive_off_sales_tax' => 'required|boolean' ]); $order->waive_off_sales_tax = $request->waive_off_sales_tax; $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function assign_order(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'user_id' => 'required|exists:users,id', ]); $order->assigned_to_id = $request->user_id; $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function copyOrder(Order $order) { abort_if(Gate::denies('order_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $date = now(); if ($date->isWeekend()) { $day = $date->format('D'); $date = $day == 'Sat' ? $date->addDays(2) : $date->addDay(); } $date = $date->format('m/d/Y'); $current_status = Status::where('name', 'Pending')->first(); $order_request = [ 'user_id' => $order->user_id, 'order_type' => $order->order_type, 'rush_order' => $order->rush_order, 'event_date' => $date, 'date_scheduled' => $date, 'date_pick_or_ship_by' => $date, 'current_status_id' => $current_status->id, 'description' => $order->description, 'billing_address_id' => $order->billing_address_id, 'delivery_type' => $order->delivery_type, 'payment_status' => 'Unpaid', 'payment_mode' => 'Full', 'payment_type' => 'None', ]; if ($order->coupon_code != null) { $order_request['coupon_code'] = $order->coupon_code; } //Collection Delivery Information if ($order->delivery_type == 'Shipping') { $order_request['shipping_address_id'] = $order->shipping_address_id; if ($order->career_code == '3ps') { $order_request['third_party_shipping'] = true; $order_request['shipping_total_amount'] = $order->shipping_charges; } $order_request['career_code'] = $order->career_code; $order_request['service_code'] = $order->service_code; $order_request['package_type_code'] = $order->package_type_code; $order_request['is_residential'] = $order->is_residential; } else { $order_request['pickup_location_id'] = $order->pickup_location_id; } //Collect Sells Tax Information if ($order->waive_off_sales_tax == 1) { $order_request['waive_off_sales_tax'] = 1; $order_request['waive_off_sales_tax_reason'] = $order->waive_off_sales_tax_reason; $order_request['resale_number'] = $order->resale_number; } $order_request['products'] = $this->getOrderProducts($order); $request = new StoreOrderRequest(); $request->merge($order_request); $response = $this->callPostRoute('/api/v1/admin/add-order?order_id=' . $order->id, $order_request); $status = $response['status']; unset($response['status']); return response()->json($response)->setStatusCode($status); } /** * @throws GuzzleException */ private function callPostRoute($url, $data) { $url = url($url); $client = new Client(); $headers = [ 'Authorization' => 'Bearer ' . request()->bearerToken(), 'accept' => 'application/json', 'Content-Type' => 'application/json', ]; $request = new \GuzzleHttp\Psr7\Request('POST', $url, $headers, json_encode($data)); $response = $client->sendAsync($request)->wait(); $statusCode = $response->getStatusCode(); if ($statusCode == 201) { $response = json_decode($response->getBody(), true); $order_id = $response['data']['id']; return [ 'success' => true, 'data' => $order_id, 'status' => 200, ]; } else { return [ 'success' => false, 'data' => null, 'status' => 422, ]; } } private function getOrderProducts(Order $order) { $products = []; foreach ($order->items as $item) { $price_range = ProductVariationRange::where('product_price_id', $item->price_id) ->where('qty_from', '<=', $item->quantity) ->where('qty_to', '>=', $item->quantity) ->first(); if ($price_range) { $product = [ 'product_id' => $item->product_id, 'price_id' => $item->price_id, 'quantity' => $item->quantity, 'notes' => $item->notes, ]; //Do not copy old artwork files (CR) /*if ($item->customization != null) { $product['customization'] = $item->customization == '[]' ? [] : $item->customization; }*/ //Commenting due to data not available on local /*if ($item->template != null) { $exists = Storage::disk('order')->exists($order->template); if ($exists) { $path = Storage::disk('order')->path($order->template); $file = new File($path); $product['template'] = $file; } }*/ $products[] = $product; } } return $products; } public function orderNotes(Request $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'note' => 'required|string|max:500', 'note_document' => 'sometimes|mimes:pdf,doc,docx,xls,xlsx,jpg,jpeg,png,bmp,gif|max:20480' ], [ 'note_document.max' => 'The note document may not be greater than 20MB', ]); $note = OrderNotes::create([ 'order_id' => $order->id, 'note' => $request->note, 'user_id' => auth()->id(), ]); if ($request->hasFile('note_document')) { $note->addMediaFromRequest('note_document') ->toMediaCollection('note_attachments', 'order')->save(); } return \response() ->json(['message' => 'Note created successfully']) ->setStatusCode(Response::HTTP_CREATED); } public function getOrderNotes(Order $order) { abort_if(Gate::denies('order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); OrderNotesResource::withoutWrapping(); return OrderNotesResource::collection($order->notes); } public function store(StoreOrderRequest $request) { $orderObj = new Order(); $order_totals = $orderObj->getOrderTotals($request); $charge_response = null; $charged_successfully = false; $is_partial = $request->get('payment_mode') == 'Partial'; //Check if partial amount is greater than order total if ($is_partial && $request->get('payment_amount') > $order_totals['grand_total']) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => "Partial amount is greater than order total ($" . $order_totals['grand_total'] . ")."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } if ($request->get('payment_type') == 'Credit Card') { if ($is_partial && $request->get('payment_amount') > 0) { $charge_response = handleOrderCharge($request, ['grand_total' => $request->get('payment_amount')]); $charged_successfully = $charge_response['charged_successfully']; if (!$charged_successfully) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => $charge_response["errors"] ], $charge_response["error_code"]); } } else if ($request->get('payment_status') == "Paid") { $charge_response = handleOrderCharge($request, $order_totals); $charged_successfully = $charge_response['charged_successfully']; if (!$charged_successfully) { return \response() ->json([ 'message' => "Can not create order.", 'errors' => $charge_response["errors"] ], $charge_response["error_code"]); } } } $shipping_data = []; //Billing Info of Order $billing_address = $orderObj->getOrderAddress($request['billing_address_id'], 'billing'); if ($request['delivery_type'] == 'Shipping') { $shipping_address = $orderObj->getOrderAddress($request['shipping_address_id'], 'shipping'); $shipping_data = getOrderShippingResponse($request); $shipping_data['is_residential'] = $request->get('is_residential', false); } DB::beginTransaction(); try { $cancellation_charges = SiteSetting::where('key', 'Cancel Order Fee')->first(); if ($is_partial) { $payment_info['payment_type'] = 'None'; $payment_info['payment_status'] = 'Unpaid'; $payment_info['payment_date'] = null; } else { $payment_info = [ 'payment_type' => $request->payment_type, 'payment_status' => $charged_successfully ? 'Paid' : $request->get('payment_status', 'Unpaid'), 'payment_date' => $charged_successfully || $request->get('payment_status') == 'Paid' ? new \DateTime() : null, ]; } $order = Order::create( array_merge( $billing_address ?? [], $shipping_address ?? [], $shipping_data, $payment_info, [ 'user_id' => $request->get('user_id'), 'current_status_id' => $request->get('current_status_id'), 'billing_address_id' => $request->get('billing_address_id'), 'shipping_address_id' => $request->get('delivery_type') == 'Shipping' ? $request->get('shipping_address_id') : null, 'pickup_location_id' => $request->get('delivery_type') == 'Pickup' ? $request->get('pickup_location_id') : null, 'date_scheduled' => $request->get('date_scheduled'), 'date_pick_or_ship_by' => $request->get('date_pick_or_ship_by'), 'event_date' => $request->get('event_date'), 'delivery_type' => $request->get('delivery_type'), 'order_type' => $request->get('order_type'), 'waive_off_sales_tax' => $request->get('waive_off_sales_tax'), 'waive_off_sales_tax_reason' => $request->get('waive_off_sales_tax_reason'), 'resale_number' => $request->get('resale_number'), 'rush_order' => $request->get('rush_order'), 'description' => $request->get('description'), 'admin_approved' => 1, 'created_by_user_id' => auth()->id(), 'payment_mode' => $request->get('payment_mode'), 'cancellation_charges' => $cancellation_charges->value ?? 0, 'items_total' => $order_totals['items_total'], 'state_sales_tax' => $order_totals['sales_tax']['percentage'], 'sales_tax_amount' => $order_totals['sales_tax']['amount'], 'rush_order_fee' => $order_totals['rush_order']['percentage'], 'rush_order_amount' => $order_totals['rush_order']['amount'], ], ) ); if (isset($order_totals['discount']['order_discount'])) { $order->coupon_id = $order_totals['discount']['coupon_id']; $order->discount_type = $order_totals['discount']['discount_type']; $order->discount_value = $order_totals['discount']['discount_value']; $order->discount_total = $order_totals['discount']['order_discount']; $coupon = Coupon::find($order->coupon_id); $coupon->redemption_count = $coupon->redemption_count + 1; $coupon->save(); } $order->storeOrderProducts($request['products'], $request['user_id']); $order->createPurchaseOrderItem(); $statuses[] = $request->current_status_id; //Commenting prepopulating statuses on Client CR /*if (!$is_duplicate) { if (isset($response['artwork_check'])){ $artwork_status = Status::where('name', 'Artwork Received')->first(); $proof_received = Status::where('name', 'Proof sign off received')->first(); $statuses[] = $artwork_status->id; $statuses[] = $proof_received->id; } else { $artwork_no_proof_status = Status::where('name', 'No proof needed')->first(); $statuses[] = $artwork_no_proof_status->id; } }*/ $order->order_number = $order->str_random2(); $order->statuses()->attach($statuses); $order->grand_total = $order_totals['grand_total']; //Handling payment info if order is partial if ($is_partial) { if ($request->get('payment_amount') > 0) { //Creating partial record here $partial_record = [ 'order_id' => $order->id, 'charged_by_id' => auth()->id(), 'payment_type' => $request->get('payment_type'), 'amount' => $request->get('payment_amount'), ]; if ($request->payment_type == 'Purchase Order') { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $partial_record['purchase_order_number'] = $request->purchase_order_number; $partial_record['purchase_order_copy'] = $purchase_order_copy; } else if ($request->payment_type == 'Check') { $partial_record['cheque_number'] = $request->get('cheque_number'); } $partial = OrderPartialPayments::create($partial_record); if ($charged_successfully) { $charge_response['response']->order_id = $partial->id; $charge_response['response']->save(); $partial->payment_id = $charge_response['response']->id; $partial->save(); } } $order->paid_order_amount = $request->get('payment_amount', 0); $order->remaining_order_amount = $order_totals['grand_total'] - $request->get('payment_amount', 0); //Check if order is fully paid via partial if ($order->remaining_order_amount == 0) { $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); } } else { if ($request->payment_type == 'Purchase Order') { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $order->purchase_order_number = $request->purchase_order_number; $order->purchase_order_copy = $purchase_order_copy; } else if ($request->payment_type == 'Check') { $order->cheque_number = $request->get('cheque_number'); } if ($charged_successfully) { $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->payment_id = $charge_response['response']->id; } if ($order->payment_status == 'Paid') { $order->paid_order_amount = $order_totals['grand_total']; $order->remaining_order_amount = 0; } else { $order->remaining_order_amount = $order_totals['grand_total']; } } $order->save(); $order->createInvoice(); //Generate invoice with latest information if ($request->has('order_id')) { $order->copyOrderNotes($request->get('order_id')); } //Send Order Status Update Email $order->sendOrderStatusUpdatedMail($request->get('notes')); DB::commit(); if ($charged_successfully) { updatePJTransaction($charge_response['response']->transaction_id, $order->order_number); } return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); if ($charged_successfully) { $void_response = voidPJTransaction($charge_response['response']->transaction_id); if ($void_response['success']) { $charge_response['response']->delete(); } else { Log::info('Transaction id : ' . $charge_response['response']->transaction_id . " was not voided."); } } Log::info('DB Error : Admin Order Store'); Log::info($e->getMessage()); return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Unable to create order."]] ]) ->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR); } } public function show(Order $order) { abort_if(Gate::denies('order_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OrderInfoResource($order->load(['user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address', 'items'])); } public function showOrderInfo(Order $order) { abort_if(Gate::denies('order_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OrderInfoEditResource($order->load(['user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address', 'items'])); } public function update(UpdateOrderRequest $request, Order $order) { $is_partial = $request->get('payment_mode') == 'Partial'; if ($order->payment_mode == 'Partial' && (!$is_partial)) { return \response() ->json([ 'message' => "Can not edit order.", 'errors' => ["error" => "Payment mode 'Partial' can not be converted 'Full'."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $shipping_data = [ 'carrier_code' => null, 'service_code' => null, 'package_type_code' => null, 'shipping_charges' => null, ]; //Billing Info of Order $billing_address = $order->getOrderAddress($request['billing_address_id'], 'billing'); if ($request['delivery_type'] == 'Shipping') { //Shipping Info of Order $shipping_address = $order->getOrderAddress($request['shipping_address_id'], 'shipping'); $shipping_data = getOrderShippingResponse($request); $shipping_data['is_residential'] = $request->get('is_residential', false); } DB::beginTransaction(); $order_totals = $order->getOrderTotals($request, $order); $amount_to_check = round($order_totals['grand_total'] - $order->paid_order_amount, 2); $payment_amount = (float)$request->get('payment_amount'); if ($is_partial && $payment_amount > 0 && $payment_amount > $amount_to_check) { return \response() ->json([ 'message' => "Can not edit order.", 'errors' => ["error" => "Partial payment amount can not be greater than remaining amount ($" . $amount_to_check . ")."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } $charge_response = null; $charged_successfully = false; if ($request->get('payment_status') == "Paid" && $order->payment_status != "Paid") { if ($request->get('payment_type') == 'Credit Card') { $charge_response = handleOrderCharge($request, $order_totals); $charged_successfully = $charge_response['charged_successfully']; if (!$charged_successfully) { return \response() ->json([ 'message' => "Can not update order.", 'errors' => $charge_response["errors"] ], $charge_response["error_code"]); } } } else if ($is_partial && $request->get('payment_type') == 'Credit Card' && $request->get('payment_amount') > 0) { $charge_response = handleOrderCharge($request, ['grand_total' => $order->remaining_order_amount]); $charged_successfully = $charge_response['charged_successfully']; if (!$charged_successfully) { return \response() ->json([ 'message' => "Can not update order.", 'errors' => $charge_response["errors"] ], $charge_response["error_code"]); } } try { $orderAmounts = [ 'items_total' => $order_totals['items_total'], 'state_sales_tax' => $order_totals['sales_tax']['percentage'], 'sales_tax_amount' => $order_totals['sales_tax']['amount'], 'rush_order_fee' => $order_totals['rush_order']['percentage'], 'rush_order_amount' => $order_totals['rush_order']['amount'], ]; if ($is_partial) { $payment_info['payment_type'] = 'None'; $payment_info['payment_status'] = 'Unpaid'; $payment_info['payment_date'] = null; } else { $payment_info = [ 'payment_type' => $request->payment_type, 'payment_status' => $charged_successfully ? 'Paid' : $request->get('payment_status', 'Unpaid'), 'payment_date' => $charged_successfully || $request->get('payment_status') == 'Paid' ? new \DateTime() : null, ]; } $order->update( array_merge( [ 'user_id' => $request->get('user_id'), 'current_status_id' => $request->get('current_status_id'), 'billing_address_id' => $request->get('billing_address_id'), 'shipping_address_id' => $request->get('delivery_type') == 'Shipping' ? $request->get('shipping_address_id') : null, 'pickup_location_id' => $request->get('delivery_type') == 'Pickup' ? $request->get('pickup_location_id') : null, 'date_scheduled' => $request->get('date_scheduled'), 'date_pick_or_ship_by' => $request->get('date_pick_or_ship_by'), 'event_date' => $request->get('event_date'), 'delivery_type' => $request->get('delivery_type'), 'order_type' => $request->get('order_type'), 'waive_off_sales_tax' => $request->get('waive_off_sales_tax'), 'waive_off_sales_tax_reason' => $request->get('waive_off_sales_tax_reason'), 'resale_number' => $request->get('resale_number'), 'rush_order' => $request->get('rush_order'), 'description' => $request->get('description'), 'payment_mode' => $request->get('payment_mode'), ], $payment_info, $billing_address ?? [], $shipping_address ?? [], $orderAmounts, $shipping_data, ) ); if (isset($order_totals['discount']['order_discount'])) { $order->coupon_id = $order_totals['discount']['coupon_id']; $order->discount_type = $order_totals['discount']['discount_type']; $order->discount_value = $order_totals['discount']['discount_value']; $order->discount_total = $order_totals['discount']['order_discount']; $coupon = Coupon::find($order->coupon_id); $coupon->redemption_count = $coupon->redemption_count + 1; $coupon->save(); } else if ($order->coupon_id != null) { $order->coupon_id = null; $order->discount_type = null; $order->discount_value = null; $order->discount_total = null; } if ($request->current_status_id != $order->current_status_id) { $order->statuses()->attach($request->current_status_id); } $order->storeOrderProducts($request['products'], $request['user_id']); $order->createPurchaseOrderItem(); $order->grand_total = $order_totals['grand_total']; $order->remaining_order_amount = $order_totals['grand_total'] - $order->paid_order_amount; //To ensure we don't lose any amount if the grand total changes. //Handling payment info if order is partial if ($is_partial) { if ($request->get('payment_amount') > 0) { //Creating partial record here $partial_record = [ 'order_id' => $order->id, 'charged_by_id' => auth()->id(), 'payment_type' => $request->get('payment_type'), 'amount' => $request->get('payment_amount'), ]; if ($request->payment_type == 'Purchase Order') { $partial_record['purchase_order_number'] = $request->purchase_order_number; if ($request->hasFile('purchase_order_copy')) { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $partial_record['purchase_order_copy'] = $purchase_order_copy; } } else if ($request->payment_type == 'Check') { $partial_record['cheque_number'] = $request->get('cheque_number'); } $partial = OrderPartialPayments::create($partial_record); if ($charged_successfully) { $charge_response['response']->order_id = $partial->id; $charge_response['response']->save(); $partial->payment_id = $charge_response['response']->id; $partial->save(); } $order->increment('paid_order_amount', $request->get('payment_amount')); $order->decrement('remaining_order_amount', $request->get('payment_amount')); } $order->save(); } else { if ($request->payment_type == 'Purchase Order') { $order->purchase_order_number = $request->purchase_order_number; if ($request->hasFile('purchase_order_copy')) { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $order->purchase_order_copy = $purchase_order_copy; } } else if ($request->payment_type == 'Check') { $order->cheque_number = $request->get('cheque_number'); } if ($charged_successfully) { $charge_response['response']->order_id = $order->id; $charge_response['response']->save(); $order->payment_id = $charge_response['response']->id; } if ($order->payment_status == 'Paid') { $order->paid_order_amount = $order_totals['grand_total']; $order->remaining_order_amount = 0; } } $order->save(); if ($order->remaining_order_amount <= 0) { $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); } $order->save(); $order->createInvoice(); //Generate invoice with latest information DB::commit(); if ($charged_successfully) { updatePJTransaction($charge_response['response']->transaction_id, $order->order_number); } return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); Log::info($e->getMessage() . " on line " . $e->getLine()); if ($charged_successfully) { $void_response = voidPJTransaction($charge_response['response']->transaction_id); if ($void_response['success']) { $charge_response['response']->delete(); } else { Log::info('Transaction id : ' . $charge_response['response']->transaction_id . " was not voided."); } } return \response() ->json([ 'message' => "Can not update order.", 'errors' => ["error" => ["Unable to update order."]] ]) ->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR); } } public function addProductsToOrder(AddOrderProductRequest $request) { abort_if(Gate::denies('order_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); DB::beginTransaction(); try { $order = Order::find($request->get('order_id')); $order->storeOrderProducts($request['products'], $order['user_id'], true); $order->updateOrderCalculation(); $order->createPurchaseOrderItem(); DB::commit(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); Log::info('DB Error : Admin Order Add Product'); Log::info($e->getMessage()); return \response() ->json([ 'message' => "Can not create order.", 'errors' => ["error" => ["Unable to create order."]] ]) ->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR); } } public function getPaymentTypes() { return \response() ->json(['data' => Order::PAYMENT_TYPE_RADIO], Response::HTTP_OK); } public function getPaymentModes() { return \response() ->json(['data' => Order::PAYMENT_MODE_RADIO], Response::HTTP_OK); } public function getWaiveOffReasons() { return \response() ->json(['data' => Order::WAIVE_OFF_OPTIONS], Response::HTTP_OK); } public function getPaymentStatuses() { return \response() ->json(['data' => Order::PAYMENT_STATUS_RADIO], Response::HTTP_OK); } public function getCalendarWidgetData() { $start_week = now()->startOfWeek(); $end_week = now()->startOfWeek()->addDays(13); $orders = Order::whereBetween('date_scheduled', [$start_week, $end_week]) ->select('date_scheduled', DB::raw('count(*) as total')) ->groupBy('date_scheduled') ->get(); $old_date = now()->subDays(3)->startOfDay(); $exclude_status_ids = [ 1, //Pending 10, //Cancelled 13, //Completed 14 //Picked / Shipped ]; for ($i = $start_week; $i <= $end_week; $i->addDay()) { $order = $orders->where('date_scheduled', $i)->first(); $total = $order->total ?? 0; $color = match (true) { in_array($total, range(1, 5)) => '#008000', in_array($total, range(6, 11)) => '#1890ff', in_array($total, range(12, 18)) => '#FFA500', $total > 18 => '#FF0000', default => '', }; $data[] = [ 'date' => $i->format('Y-m-d'), 'day' => substr($i->format('D'), 0, 1), 'total' => $order->total ?? 0, 'color' => $color, ]; } $pd_orders = Order::where('date_scheduled', '<=', $old_date)->whereNotIn('current_status_id', $exclude_status_ids)->count(); return [$data ?? [], $pd_orders]; } public function generateInvoice(Order $order) { abort_if(Gate::denies('invoice_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $invoice = $order->createInvoice(); return response() ->json(['data' => $invoice->invoiceUrl ?? ''], Response::HTTP_OK); } public function viewInvoice(Order $order) { abort_if(Gate::denies('invoice_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return response() ->json(['data' => $order->invoice->invoiceUrl ?? ''], Response::HTTP_OK); } public function getServices() { $api_key = config('app.web_ship_api_key'); $customer_id = config('app.web_ship_customer_id'); $base_url = config('app.web_ship_base_url'); $endpoint = "{$base_url}/customers/{$customer_id}/services"; $client = new Client(); $headers = [ 'Authorization' => $api_key, ]; try { $request = new \GuzzleHttp\Psr7\Request('GET', $endpoint, $headers); $res = $client->sendAsync($request)->wait(); $statusCode = $res->getStatusCode(); if ($statusCode == 200) { $services = json_decode($res->getBody(), true); return response() ->json(['data' => $services], Response::HTTP_OK); } else { return response() ->json([ 'errors' => 'Something went wrong', 'error' => ['Something went wrong'] ], 422); } } catch (GuzzleException $exception) { return response() ->json([ 'errors' => 'Something went wrong', 'error' => [$exception->getMessage()] ], 422); } } public function getShippingQuote(ShippingQuoteRequest $request) { $customer_id = config('app.web_ship_customer_id'); $base_url = config('app.web_ship_base_url'); $endpoint = "{$base_url}/customers/{$customer_id}/quote"; $request_body = prepareDataForShippingQuote($request); $response = getShippingQuoteServices($request_body, $endpoint); if ($response['success']) { return response() ->json(['data' => $response['data']], Response::HTTP_OK); } else { return response() ->json([ 'errors' => 'Something went wrong', 'error' => ['Something went wrong'] ], 422); } } public function updateBookingNumber(Request $request, Order $order) { $request->validate(['book_number' => 'required|string']); $order->book_number = $request->book_number; $order->save(); return (new OrderResource($order)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function checkProductQuantity(Request $request) { $request->validate([ 'price_id' => 'required|exists:product_prices,id', 'quantity' => 'required|int|min:1', ]); $price_range = ProductVariationRange::where('product_price_id', $request->get('price_id')) ->where('qty_from', '<=', $request->get('quantity')) ->where('qty_to', '>=', $request->get('quantity'))->first(); if ($price_range) { return \response()->json(['success' => true, 'message' => 'Quantity available.'])->setStatusCode(Response::HTTP_OK); } else { return \response() ->json([ 'message' => "Quantity not available.", 'errors' => ['price_id' => ['Product quantity not available.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } } public function getOrderShippingLabel(Order $order) { if ($order->book_number == null) { return response() ->json([ 'errors' => 'Book number not found', 'error' => ['Order is not associated with any book number.'] ], 422); } $customer_id = config('app.web_ship_customer_id'); $base_url = config('app.web_ship_base_url'); $endpoint = "{$base_url}/customers/{$customer_id}/shipments/28809441/label/PDF"; $api_key = config('app.web_ship_api_key'); $client = new Client(); $headers = [ 'Authorization' => $api_key, 'accept' => 'application/json', 'Content-Type' => 'application/json', ]; try { $request = new \GuzzleHttp\Psr7\Request('GET', $endpoint, $headers); $res = $client->send($request); $statusCode = $res->getStatusCode(); if ($statusCode == 200 && $res->getHeaderLine('Content-Type') == "application/pdf") { $label = 'shipping-label.pdf'; Storage::disk('public')->put($label, $res->getBody()->getContents()); return \response()->json(['data' => asset("storage/{$label}")]) ->setStatusCode(Response::HTTP_OK); } else { return \response() ->json([ 'message' => "Something went wrong!", 'errors' => ['shipping_label' => ['Unable to fetch shipping label.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } } catch (GuzzleException $exception) { // Log::info('getOrderShippingLabel error'); // Log::info($exception->getMessage()); return \response() ->json([ 'message' => "Something went wrong!", 'errors' => ['shipping_label' => ['Unable to fetch shipping label.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } } public function getCustomerVaults(Request $request) { abort_if(Gate::denies('order_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'user_id' => 'required|exists:users,id', ]); $user = User::where('id', $request->user_id)->where('user_type', '<>', 1)->first(); if (!$user) { return \response()->json([ 'message' => 'User not found', 'errors' => ['error' => 'User not found.'], ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $customer_id = $user->pj_customer_id; if (!$customer_id) { return \response()->json([ 'message' => 'Customer id not associated', 'errors' => ['error' => 'Customer id not associated with user.'], ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } $vaults = getCustomerVaults($customer_id); return \response() ->json(['data' => $vaults]) ->setStatusCode(Response::HTTP_OK); } public function getOrderTotals(OrderTotalsRequest $request) { $orderObj = new Order(); return \response()->json([ 'data' => $orderObj->getOrderTotals($request) ]) ->setStatusCode(Response::HTTP_OK); } public function getWorkOrder(Order $order) { return new WorkOrder($order->load(['user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address', 'items'])); } public function getOrderItemCustomizationSvg(OrderCustomizationSvgRequest $request) { // Generate a unique filename for the SVG file $filename = 'svg_' . time() . '.svg'; $svg = OrderItemCustomizationSvg::create([ 'order_id' => $request->order_id, 'order_item_id' => $request->order_item_id, 'customization_index' => $request->customization_index, 'file_content' => $request->file_content, 'file_name' => $filename, ]); Storage::disk('customization_svg')->put($filename, $request->input('file_content')); return \response()->json(['data' => $svg]); } public function deleteOrder(Order $order) { $item_ids = $order->items->pluck('id')->toArray(); OrderInvoice::where('order_id', $order->id)->delete(); OrderItemCustomizationSvg::where('order_id', $order->id)->delete(); OrderItemCustomizationData::whereIn('id', $item_ids)->delete(); OrderItemVariation::where('order_id', $order->id)->delete(); OrderNotes::where('order_id', $order->id)->delete(); DB::table('order_status')->where('order_id', $order->id)->delete(); OrderItems::where('order_id', $order->id)->delete(); PurchaseOrderToCreate::where('order_id', $order->id)->delete(); $order->delete(); return response() ->json(['message' => 'Order deleted successfully.'], Response::HTTP_OK); } public function addOrderPartialPayment(AddOrderPartialPaymentRequest $request, Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($order->payment_mode != 'Partial') { return \response() ->json([ 'message' => "Can not add payment.", 'errors' => ["payment_amount" => "The partial payment is not applicable on this order."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } if ($order->remaining_order_amount == 0) { return \response() ->json([ 'message' => "Can not add payment.", 'errors' => ["error" => "This order has been fully paid."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } if ($request->get('payment_amount') > $order->remaining_order_amount) { return \response() ->json([ 'message' => "Can not add payment.", 'errors' => ["payment_amount" => "Partial amount is greater than remaining amount ($" . $order->remaining_order_amount . ")."] ], Response::HTTP_UNPROCESSABLE_ENTITY); } DB::beginTransaction(); try { $charge_response = null; $charged_successfully = false; $order_totals['grand_total'] = $request->get('payment_amount'); if ($request->get('payment_type') == 'Credit Card') { $request->merge([ 'billing_address_id' => $order->billing_address_id, 'user_id' => $order->user_id, ]); $charge_response = handleOrderCharge($request, $order_totals); $charged_successfully = $charge_response['charged_successfully'] ?? false; if (!$charged_successfully) { return \response() ->json([ 'message' => "Can not add payment.", 'errors' => $charge_response["errors"] ], $charge_response["error_code"]); } } $partial_record = [ 'order_id' => $order->id, 'charged_by_id' => auth()->id(), 'payment_type' => $request->get('payment_type'), 'amount' => $request->get('payment_amount'), ]; if ($request->payment_type == 'Purchase Order') { $purchase_order_copy = $order->storePDF($request->file('purchase_order_copy'), $order->user_id, 'order'); $partial_record['purchase_order_number'] = $request->purchase_order_number; $partial_record['purchase_order_copy'] = $purchase_order_copy; } else if ($request->payment_type == 'Check') { $partial_record['cheque_number'] = $request->get('cheque_number'); } $partial = OrderPartialPayments::create($partial_record); if ($charged_successfully) { $charge_response['response']->order_id = $partial->id; $charge_response['response']->save(); $partial->payment_id = $charge_response['response']->id; $partial->save(); } $order->increment('paid_order_amount', $request->get('payment_amount')); $order->decrement('remaining_order_amount', $request->get('payment_amount')); //Check if order is fully paid via partial if ($order->remaining_order_amount == 0) { $order->payment_status = 'Paid'; $order->payment_date = new \DateTime(); } $order->save(); DB::commit(); if ($charged_successfully) { updatePJTransaction($charge_response['response']->transaction_id, $order->order_number); } return response() ->json(['message' => 'Partial payment added successfully.']) ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); Log::info('Partial Payment Error on line :' . $e->getLine()); Log::info($e->getMessage()); if ($charged_successfully) { $void_response = voidPJTransaction($charge_response['response']->transaction_id); if ($void_response['success']) { $charge_response['response']->delete(); } else { Log::info('Transaction id : ' . $charge_response['response']->transaction_id . " was not voided."); } } return \response() ->json([ 'message' => "Can not add payment.", 'errors' => ["payment_amount" => ["Unable to add partial payment."]] ]) ->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR); } } public function deleteOrderPartialPayment(OrderPartialPayments $orderPartialPayment) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $order = Order::find($orderPartialPayment->order_id); $order->payment_status = 'Unpaid'; $order->payment_date = null; $order->increment('remaining_order_amount', $orderPartialPayment->amount); $order->decrement('paid_order_amount', $orderPartialPayment->amount); $order->save(); if ($orderPartialPayment->payment_id != null) { $orderPartialPayment->payment->delete(); } else if ($orderPartialPayment->purchase_order_copy && (Storage::disk('order')->exists($orderPartialPayment->purchase_order_copy))) { Storage::disk('order')->delete($orderPartialPayment->purchase_order_copy); } $orderPartialPayment->delete(); return response() ->json(['message' => 'Partial payment deleted successfully.']) ->setStatusCode(Response::HTTP_CREATED); } /** * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function checkItemPriceChange(Request $request): \Illuminate\Http\JsonResponse { $request->validate([ 'item_id' => 'required|exists:order_items,id', 'quantity' => 'required|numeric|min:1', ]); $item = OrderItems::find($request->get('item_id')); $price_range = ProductVariationRange::where('product_price_id', $item->price_id) ->where('qty_from', '<=', $item->quantity) ->where('qty_to', '>=', $item->quantity) ->first(); if ($price_range->price != $item->price && request()->get('quantity') > $item->quantity) { return response() ->json([ 'message' => "Quantity can not be increased.", 'errors' => ['quantity' => ['Product quantity can not be increased due to change in price. Please add the item as a new product to proceed.']] ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } else { return response()->json(['success' => true, 'message' => 'Quantity can be updated.'])->setStatusCode(Response::HTTP_OK); } } } Controllers/Api/V1/Admin/OrderInvoiceController.php 0000644 00000005267 15021222673 0016260 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Resources\Admin\InvoiceResource; use App\Models\Order; use App\Models\OrderInvoice; use App\Notifications\OrderInvoiceNotification; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response; use Gate; class OrderInvoiceController extends Controller { public function index(Request $request) { abort_if(Gate::denies('invoice_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $invoices = OrderInvoice::when($request->filled('order_number'), function ($query) use ($request){ $query->whereHas('order', function ($query) use ($request) { $query->where('order_number', 'like', "%{$request->get('order_number')}%"); }); }) ->when($request->filled('invoice_number'), function ($query) use ($request){ $query->where('invoice_number', 'like', "%{$request->get('invoice_number')}%"); }) ->orderBy('created_at', 'DESC')->get(); InvoiceResource::withoutWrapping(); return InvoiceResource::collection($invoices); } public function sendInvoice(Order $order) { if ($order->invoice_id == null){ $order->createInvoice(); } $data = [ 'order_number' => $order->order_number ?? '', 'invoice_number' => $order->invoice->invoice_number ?? '', 'user_name' => $order->user->name ?? '', 'phone_number' => $order->user->phone_number ?? '', 'invoice_url' => $order->invoice->invoiceUrl ?? '', 'invoice_path' => $order->invoice->invoicePath ?? '', ]; try { // $order->user->notify((new OrderInvoiceNotification($data))->delay(now()->addSeconds(5))); $order->user->notify((new OrderInvoiceNotification($data))); return response() ->json(['message' => 'Invoice sent successfully.'], Response::HTTP_OK); }catch (\Exception $e){ Log::info('Mail Error => Sending Order Invoice :'.$order->order_number); Log::info($e->getMessage()); return response() ->json([ 'message' => "Invoice not sent.", 'errors' => ["error" => ["Unable to send order invoice."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function store(Request $request) { // } public function show($id) { // } public function update(Request $request, $id) { // } public function destroy($id) { // } } Controllers/Api/V1/Admin/StatusApiController.php 0000644 00000004527 15021222673 0015603 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreStatusRequest; use App\Http\Requests\Admin\UpdateStatusRequest; use App\Http\Resources\Admin\StatusResource; use App\Models\Status; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\Response; class StatusApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('status_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $statuses = Status::when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }) ->where('id', '<>', 12) ->orderBy('sort')->get(); StatusResource::withoutWrapping(); return StatusResource::collection($statuses); } public function store(StoreStatusRequest $request) { $status = Status::create($request->all()); return (new StatusResource($status)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Status $status) { abort_if(Gate::denies('status_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new StatusResource($status); } public function update(UpdateStatusRequest $request, Status $status) { $status->update($request->all()); return (new StatusResource($status)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Status $status) { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $status->delete(); return response() ->json(['message' => 'Status deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ Log::channel('db_errors')->info('Record Deletion Error : Status -> '.$status->id); Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete status."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/ContactUsApiController.php 0000644 00000007513 15021222673 0016221 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreContactQueryRequest; use App\Http\Resources\Admin\ContactQueryResource; use App\Mail\ContactQuerySubmitted; use App\Models\ContactQuery; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Symfony\Component\HttpFoundation\Response; class ContactUsApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('contact_us_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $queries = ContactQuery::when($request->filled('name'), function ($query) use ($request) { $searchQuery = $request->get('name'); $query->whereRaw("name like '%" . addslashes($searchQuery) . "%' OR email like '%" . addslashes($searchQuery) . "%' OR phone like '%" . addslashes($searchQuery) . "%' OR department like '%" . addslashes($searchQuery) . "%' OR subject like '%" . addslashes($searchQuery) . "%' OR message like '%" . addslashes($searchQuery) . "%'"); })->when($request->filled('is_read'), function ($query) use ($request) { $is_read = $request->get('is_read'); $query->where("is_read", $is_read); })->orderBy('created_at', 'DESC')->paginate(50); ContactQueryResource::withoutWrapping(); return ContactQueryResource::collection($queries); } public function store(StoreContactQueryRequest $request) { $contact_us = ContactQuery::create($request->all()); $contact_us = new ContactQueryResource($contact_us); //Send email to orders@jmtrophies.com Mail::to('orders@jmtrophies.com')->send(new ContactQuerySubmitted(['data' => $contact_us])); return ($contact_us) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(ContactQuery $contact_query) { abort_if(Gate::denies('contact_us_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $contact_query->is_read = true; $contact_query->save(); $query_count = ContactQuery::where('is_read', 0)->count(); return [ 'data' => new ContactQueryResource($contact_query), 'new_queries_count' => $query_count, ]; } public function destroy(ContactQuery $contact_query) { abort_if(Gate::denies('contact_us_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $contact_query->delete(); return response() ->json(['message' => 'Contact query deleted successfully'], Response::HTTP_OK); } catch (\Exception $e) { Log::channel('db_errors')->info('Record Deletion Error : Contact Query -> ' . $contact_query->id); Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete contact query."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function getDepartments() { return \response() ->json(['data' => ContactQuery::DEPARTMENTS], Response::HTTP_OK); } public function updateContactQueryStatus(Request $request) { $request->validate([ 'contact_query_id' => 'sometimes|array', ]); if (count($request->get('contact_query_id')) > 0) { ContactQuery::whereIn('id', $request->get('contact_query_id'))->update(['is_read' => true]); } else { ContactQuery::where('is_read', 0)->update(['is_read' => true]); } return response() ->json(['message' => 'Contact query status updated successfully'], Response::HTTP_OK); } } Controllers/Api/V1/Admin/CategoryApiController.php 0000644 00000010340 15021222673 0016063 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\StoreCategoryRequest; use App\Http\Requests\Admin\UpdateCategoryRequest; use App\Http\Resources\Admin\CategoryListResource; use App\Http\Resources\Admin\CategoryResource; use App\Http\Resources\Admin\CategoryTreeResource; use App\Models\Category; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CategoryApiController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('category_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $categories = Category::when($request->filled('name'), function ($query) use ($request){ $query->where('name', 'like', "%{$request->get('name')}%"); }) ->with(['parent']) ->orderBy('id', 'DESC')->paginate(50); return CategoryResource::collection($categories); } public function categories_tree() { $categories = Category::whereNull('parent_id') ->with(['categoryTree'=> function($q) { $q->where('status', 1); }]) ->active() ->get(); return new CategoryTreeResource($categories); } public function get_parent_categories() { $categories = Category::whereNull('parent_id')->active()->get(); CategoryListResource::withoutWrapping(); return CategoryListResource::collection($categories); } public function get_child_categories($id) { $categories = Category::where('parent_id', $id)->active()->get(); CategoryListResource::withoutWrapping(); return CategoryListResource::collection($categories); } public function change_status(Category $category) { abort_if(Gate::denies('category_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $category->status = !$category->status; $category->save(); return response() ->json(['message' => 'Status updated successfully'], Response::HTTP_OK); } public function store(StoreCategoryRequest $request) { $category = Category::create(array_merge( $request->validated(), ['slug' => \Str::slug($request->name)] )); if ($request->hasFile('featured_image')) { $category->addMediaFromRequest('featured_image') ->toMediaCollection('featured_image', 'category'); } return (new CategoryResource($category)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Category $category) { abort_if(Gate::denies('category_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CategoryResource($category->load(['parent'])); } public function update(UpdateCategoryRequest $request, Category $category) { $category->update($request->all()); if ($request->hasFile('featured_image')) { if (!empty($category->featured_image)) { $category->clearMediaCollection('featured_image'); } $category->addMediaFromRequest('featured_image') ->toMediaCollection('featured_image', 'category'); } return (new CategoryResource($category)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Category $category) { abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $category->delete(); return response() ->json(['message' => 'Category deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Category -> '.$category->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete category."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/OurPartnerApiController.php 0000644 00000006276 15021222673 0016424 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreOurPartnerRequest; use App\Http\Requests\Admin\UpdateOurPartnerRequest; use App\Http\Resources\Admin\OurPartnerEditResource; use App\Http\Resources\Admin\OurPartnerResource; use App\Models\OurPartner; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class OurPartnerApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('our_partner_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); OurPartnerResource::withoutWrapping(); $our_partners = OurPartner::when($request->filled('title'), function ($query) use ($request) { $query->where('title', 'like', "%{$request->get('title')}%"); })->orderBy('created_at', 'DESC')->paginate(50); return OurPartnerResource::collection($our_partners); } public function get_partners() { OurPartnerResource::withoutWrapping(); $our_partners = OurPartner::all(); return OurPartnerResource::collection($our_partners); } public function store(StoreOurPartnerRequest $request) { $our_partner = OurPartner::create($request->all()); if ($request->hasFile('logo')) { $our_partner->addMediaFromRequest('logo')->toMediaCollection('logo', 'partners'); } return (new OurPartnerResource($our_partner)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(OurPartner $our_partner) { abort_if(Gate::denies('our_partner_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OurPartnerEditResource($our_partner); } public function update(UpdateOurPartnerRequest $request, OurPartner $our_partner) { $our_partner->title = $request->title; $our_partner->status = $request->status; $our_partner->save(); if ($request->hasFile('logo')) { $request->validated([ 'logo' => 'mimes:jpg,gif,png|max:5120' ]); if (!empty($our_partner->logo)) { $our_partner->logo->delete(); } $our_partner->addMediaFromRequest('logo')->toMediaCollection('logo', 'partners'); } return (new OurPartnerResource($our_partner)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(OurPartner $our_partner) { abort_if(Gate::denies('our_partner_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $our_partner->delete(); return response(['message' => 'Partner deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Partner -> '.$our_partner->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete partner."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/RolesApiController.php 0000644 00000004773 15021222673 0015407 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreRoleRequest; use App\Http\Requests\Admin\UpdateRoleRequest; use App\Http\Resources\Admin\RoleResource; use App\Http\Resources\Admin\RoleResourceWithChecks; use App\Models\Role; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class RolesApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('role_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $roles = Role::when($request->filled('title'), function ($query) use ($request){ $query->where('title', 'like', "%{$request->get('title')}%"); }) ->where('id', '<>', 1) ->orderBy('created_at', 'DESC')->get(); RoleResource::withoutWrapping(); return RoleResource::collection($roles); } public function store(StoreRoleRequest $request) { $role = Role::create($request->all()); $role->permissions()->sync($request->input('permissions', [])); return (new RoleResource($role)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Role $role) { abort_if(Gate::denies('role_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); RoleResourceWithChecks::withoutWrapping(); return new RoleResourceWithChecks($role->load(['permissions'])); } public function update(UpdateRoleRequest $request, Role $role) { $role->update($request->all()); $role->permissions()->sync($request->input('permissions', [])); return (new RoleResource($role)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function destroy(Role $role) { abort_if(Gate::denies('role_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); try { $role->delete(); return response() ->json(['message' => 'Role deleted successfully'], Response::HTTP_OK); }catch (\Exception $e){ \Log::channel('db_errors')->info('Record Deletion Error : Role -> '.$role->id); \Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete role."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } } Controllers/Api/V1/Admin/PurchaseOrderApiController.php 0000644 00000063523 15021222673 0017067 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\PurchaseOrderReportRequest; use App\Http\Requests\Admin\StorePurchaseOrderRequest; use App\Http\Requests\Admin\UpdatePurchaseOrderAdminNotesRequest; use App\Http\Resources\Admin\PurchaseOrderDetailsResource; use App\Http\Resources\Admin\PurchaseOrderResource; use App\Mail\PurchaseOrderMail; use App\Models\OfficeSupplies; use App\Models\Order; use App\Models\OrderItems; use App\Models\Product; use App\Models\ProductPrice; use App\Models\ProductVariationCombination; use App\Models\PurchaseOrder; use App\Models\PurchaseOrderDetails; use App\Models\PurchaseOrderOrderDetails; use App\Models\PurchaseOrderToCreate; use App\Models\SiteSetting; use App\Models\Status; use App\Models\Variation; use App\Models\Vendor; use App\Notifications\OrderStatusUpdatedNotification; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Storage; use Symfony\Component\HttpFoundation\Response; class PurchaseOrderApiController extends Controller { public function index(Request $request) { abort_if(Gate::denies('purchase_order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $request->validate([ 'report_type' => 'nullable|in:' . implode(',', array_keys(PurchaseOrder::REPORTS_MODE)) ]); $report_scope = PurchaseOrder::REPORTS_MODE[$request->get('report_type') ?? "current_year"]; $purchase_orders = PurchaseOrder::when($request->filled('order_number'), function ($query) use ($request) { $query->where('order_number', 'like', "%{$request->get('order_number')}%"); })->when($request->filled('status'), function ($query) use ($request) { $query->where('status', 'like', "%{$request->get('status')}%"); })->when($request->filled('vendor'), function ($query) use ($request) { $query->whereHas('vendor', function ($query) use ($request) { $query->where('name', 'like', "%{$request->get('vendor')}%"); $query->orWhere('id', $request->get('category')); }); })->when($request->filled('product_number'), function ($query) use ($request) { $query->whereHas('orderDetails', function ($query) use ($request) { $query->where('product_number', 'like', "%{$request->get('product_number')}%"); }); })->$report_scope() ->orderBy('created_at', 'DESC')->paginate(50); $total_amount = $purchase_orders->sum('total_price'); PurchaseOrderResource::withoutWrapping(); return PurchaseOrderResource::collection($purchase_orders)->additional(["purchase_orders_total" => "$" . number_format($total_amount, 2)]); } public function get_purchase_order_items() { abort_if(Gate::denies('purchase_order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); /*$data = PurchaseOrderToCreate::select('*', DB::raw('SUM(quantity) as total_quantity')) ->groupBy('product_id') ->groupBy('price_id') ->get();*/ $data = PurchaseOrderToCreate::select('product_id', 'price_id', DB::raw('SUM(quantity) as total_quantity')) ->groupBy('price_id') ->get(); return \response()->json(['data' => $this->getPurchaseItemsToCreate($data)], Response::HTTP_OK); } public function get_shipping_speed() { return \response() ->json(['data' => PurchaseOrder::SHIPPING_SPEED], Response::HTTP_OK); } public function get_po_statuses() { return \response() ->json(['data' => PurchaseOrder::PURCHASE_ORDER_STATUS], Response::HTTP_OK); } public function get_payment_terms() { return \response() ->json(['data' => PurchaseOrder::PAYMENT_TERMS], Response::HTTP_OK); } public function get_po_addresses() { $shipping_address = SiteSetting::where('key', 'Shipping Address')->first(); $billing_address = SiteSetting::where('key', 'Billing Address')->first(); return \response() ->json(['data' => [ 'shipping_address' => $shipping_address->value ?? '', 'billing_address' => $billing_address->value ?? '', ]], Response::HTTP_OK); } public function change_po_status(Request $request, PurchaseOrder $purchaseOrder) { abort_if(Gate::denies('purchase_order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($purchaseOrder->status == 'Received') { return \response()->json([ 'message' => 'Purchase order already marked as received.', 'errors' => ['error' => ['Purchase order already marked as received']], ]) ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } else { /*$request->validate([ 'stock_location_id' => 'required|exists:stock_locations,id', ]);*/ $purchaseOrder->status = 'Received'; // $purchaseOrder->stock_location_id = $request->get('stock_location_id'); $purchaseOrder->save(); return (new PurchaseOrderResource($purchaseOrder)) ->response() ->setStatusCode(Response::HTTP_CREATED); } } public function store(StorePurchaseOrderRequest $request) { try { DB::beginTransaction(); foreach ($request->products ?? [] as $product) { if ($product['product_type'] == 'configurable' && $product['variation_id'] != null) { $product_exists = Variation::find($product['variation_id']); } else { $product_exists = Product::find($product['product_id']); } $total_product_quantity = 0; foreach ($product['orders'] as $p) { if (isset($p['quantity'])) { $total_product_quantity += (int) $p['quantity']; } if (isset($p['extra_quantity'])) { $total_product_quantity += (int) $p['extra_quantity']; } } $product['total_quantity'] = $total_product_quantity; if ($product_exists) { //Here we will get vendor depending on product type $vendor_id = $product_exists->vendor_id; if (isset($data[$vendor_id])) { $data[$vendor_id]['products'][] = $product; } else { $data[$vendor_id] = [ 'ordered_by_id' => auth()->id(), 'order_number' => 00, 'payment_terms' => $request->payment_terms, 'reference' => $request->reference, 'special_notes' => $request->special_notes, 'shipping_address' => $request->shipping_address, 'billing_address' => $request->billing_address ?? 'N/A', 'vendor_id' => $vendor_id, 'status' => 'Pending', 'products' => [$product], ]; } } } //Handle office supplies products foreach ($request->office_supplies ?? [] as $office_supply) { $office_supply['product_type'] = "office_supplies"; if (isset($data[$office_supply['vendor_id']])) { $data[$office_supply['vendor_id']]['office_products'][] = $office_supply; } else { $data[$office_supply['vendor_id']] = [ 'ordered_by_id' => auth()->id(), 'order_number' => 00, 'payment_terms' => $request->payment_terms, 'reference' => $request->reference, 'special_notes' => $request->special_notes, 'shipping_address' => $request->shipping_address, 'billing_address' => $request->billing_address ?? 'N/A', 'vendor_id' => $office_supply['vendor_id'], 'status' => 'Pending', 'office_products' => [$office_supply], ]; } } $data = $this->preparePurchaseOrder($data ?? []); $this->deletePurchaseOrderItemsCreated($request->products ?? []); DB::commit(); PurchaseOrderResource::withoutWrapping(); return (PurchaseOrderResource::collection($data ?? [])) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { Log::channel('db_errors')->info('Purchase Order Creation Error'); Log::channel('db_errors')->info($e->getMessage() . " at line : " . $e->getLine()); return response() ->json([ 'message' => "Can not create purchase order.", 'errors' => ["error" => ["Unable to create purchase order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function show(PurchaseOrder $purchaseOrder) { abort_if(Gate::denies('purchase_order_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return (new PurchaseOrderDetailsResource($purchaseOrder)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function update(Request $request, PurchaseOrder $purchaseOrder) { // } public function editAdminNotes(UpdatePurchaseOrderAdminNotesRequest $request, PurchaseOrder $purchaseOrder) { $purchaseOrder->admin_notes = $request->admin_notes; $purchaseOrder->save(); return response() ->json(['message' => 'Admin notes updated successfully'], Response::HTTP_OK); } public function destroy(PurchaseOrder $purchaseOrder) { abort_if(Gate::denies('purchase_order_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); abort_if($purchaseOrder->status != 'Received', Response::HTTP_FORBIDDEN, 'Can not delete pending purchase orders'); try { $purchaseOrder->delete(); return response() ->json(['message' => 'Purchase order deleted successfully'], Response::HTTP_OK); } catch (\Exception $e) { Log::channel('db_errors')->info('Record Deletion Error : Purchase Order -> ' . $purchaseOrder->id); Log::channel('db_errors')->info($e->getMessage()); return response() ->json([ 'message' => "Record not deleted.", 'errors' => ["error" => ["Unable to delete purchase order."]] ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function preparePurchaseOrder($data) { $mail_data = $purchase_orders = []; foreach ($data ?? [] as $datum) { $total_quantity = $total_amount = 0; $office_products_total_quantity = $office_products_total_amount = 0; $vendor = Vendor::find($datum['vendor_id']); $purchase_orders[] = $purchase_order = PurchaseOrder::create($datum); foreach ($datum['products'] ?? [] as $product) { $product_price = ProductPrice::find($product['price_id']); $variation_price = Variation::find($product['variation_id']); if ($variation_price) { $po_details[] = $po_detail = [ 'purchase_order_id' => $purchase_order->id, 'product_id' => $variation_price->id, 'product_number' => $variation_price->sku, 'price_id' => $product_price->id, 'quantity' => $product['total_quantity'], 'product_type' => $product['product_type'], 'price' => $variation_price->vendor_price, 'total_price' => $product['total_quantity'] * $variation_price->vendor_price, ]; } else { $po_details[] = $po_detail = [ 'purchase_order_id' => $purchase_order->id, 'product_id' => $product['product_id'], 'product_number' => $product_price->supplier_prod_number, 'price_id' => $product_price->id, 'quantity' => $product['total_quantity'], 'product_type' => $product['product_type'], 'price' => $product_price->vendor_price, 'total_price' => $product['total_quantity'] * $product_price->vendor_price, ]; } $purchase_order_details = PurchaseOrderDetails::create($po_detail); $total_quantity += $po_detail['quantity']; $total_amount += $po_detail['quantity'] * $po_detail['price']; foreach ($product['orders'] as $po_order) { $po_order_data = [ 'purchase_order_details_id' => $purchase_order_details->id ]; if (isset($po_order['order_id'])) { $po_order_data['order_id'] = $po_order['order_id']; $po_order_data['quantity'] = $po_order['quantity']; } if (isset($po_order['extra_quantity'])) { $po_order_data['order_id'] = 0; $po_order_data['quantity'] = $po_order['extra_quantity']; } PurchaseOrderOrderDetails::create($po_order_data); } } foreach ($datum['office_products'] ?? [] as $office_product) { $db_office_product = OfficeSupplies::find($office_product['product_id']); $os_details[] = $os_detail = [ 'purchase_order_id' => $purchase_order->id, 'product_id' => $office_product['product_id'], 'product_number' => $db_office_product->sku, 'quantity' => $office_product['quantity'], 'price' => $db_office_product->price, 'product_type' => $office_product['product_type'], 'total_price' => $office_product['quantity'] * $db_office_product->price, ]; $office_products_total_quantity += $office_product['quantity']; $office_products_total_amount += $office_product['quantity'] * $db_office_product->price; PurchaseOrderDetails::create($os_detail); } $purchase_order->total_quantity = $total_quantity + $office_products_total_quantity; $purchase_order->total_price = $total_amount + $office_products_total_amount; $purchase_order->save(); //Update PO number $purchase_order->order_number = (new Order)->str_random($purchase_order->id); $purchase_order->save(); $mail_data['p_order'] = $purchase_order; $mail_data['account_number'] = $vendor->account_number; $mail_data['p_order_products'] = $po_details ?? []; $mail_data['os_products'] = $os_details ?? []; $mail_data['secondary_email'] = $vendor->secondary_email; $path = $purchase_order->generateAttachment($mail_data); $mail_data['attachment_path'] = $path; //Send Mail to each vendor try { Mail::to($vendor->email)->send(new PurchaseOrderMail($mail_data)); } catch (\Exception $e) { Log::channel('info_errors')->info('Mail Error'); Log::channel('info_errors')->info($e->getMessage()); } } return $purchase_orders; } public function getPurchaseItemsToCreate($data) { $products = []; foreach ($data as $datum) { $orders = []; $vs = ProductVariationCombination::where('product_price_id', $datum->price_id)->get(); $bd_product = Product::find($datum->product_id); $price_id = ProductPrice::find($datum->price_id); $variations = []; foreach ($vs ?? [] as $variation) { $variations[] = [ 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($datum->orders as $order_item) { $order = $order_item->order; if (isset($orders[$order->id])) { $orders[$order->id]['quantity'] += $order_item->quantity; } else { $orders[$order->id] = [ 'id' => $order->id, 'order_number' => $order->order_number, 'quantity' => $order_item->quantity, ]; } } if ($bd_product->product_type == 'configurable') { $price_variations_ids = ProductVariationCombination::where('product_price_id', $datum->price_id) ->get() ->pluck('variation_id') ->toArray(); $price_variations = Variation::whereIn('id', $price_variations_ids)->get(); foreach ($price_variations as $price_variation) { $products[] = [ 'product_type' => 'configurable', 'variation_id' => $price_variation->id, 'product_id' => $bd_product->id, 'price_id' => $datum->price_id, 'product_name' => $price_variation->value, 'vendor_name' => $price_variation->vendor->name ?? "", 'product_number' => $price_variation->sku, 'vendor_price' => $price_variation->vendor_price, 'total_quantity' => $datum->total_quantity, 'total_price' => '$' . number_format($price_variation->vendor_price * $datum->total_quantity, 2), 'featured_image' => ($image = $bd_product->featured_image) ? [ 'url' => $image->url, 'preview' => $image->preview, 'thumbnail' => $image->thumbnail, ] : '', 'variations' => $variations, 'orders' => $orders ?? [], ]; } } else { if ($price_id != null) { $products[] = [ 'product_type' => 'standard', 'variation_id' => null, 'product_id' => $bd_product->id, 'price_id' => $datum->price_id, 'product_name' => $bd_product->name, 'vendor_name' => $bd_product->vendor->name ?? "", 'product_number' => $price_id->supplier_prod_number, 'vendor_price' => $price_id->vendor_price, 'total_quantity' => $datum->total_quantity, 'total_price' => '$' . number_format($price_id->vendor_price * $datum->quantity, 2), 'featured_image' => ($image = $bd_product->featured_image) ? [ 'url' => $image->url, 'preview' => $image->preview, 'thumbnail' => $image->thumbnail, ] : '', 'variations' => $variations, 'orders' => $orders ?? [], ]; } } } return $products; } public function sendOrderChangeMail(Order $order, Status $product_ordered_status, Status $product_received_status): void { $data = [ 'order_number' => $order->order_number, 'customer_name' => $order->user->name ?? '', 'previous_order_status' => $product_ordered_status->name, 'current_order_status' => $product_received_status->name, 'notes' => null, ]; $order->user->notify((new OrderStatusUpdatedNotification($data))->delay(now()->addSeconds(5))); } public function poReport(PurchaseOrderReportRequest $request) { $date_range = reportDateRange($request); $startYear = $date_range['year_from']->format('Y'); $endYear = $date_range['year_to']->format('Y'); $group_vendors = $request->get('group_vendors') ?? false; if ($group_vendors) { $data = DB::table('purchase_orders as p') ->select('vendors.name as vendor_name', DB::raw('SUM(p.total_quantity) as quantity'), DB::raw('SUM(p.total_price) as total')) ->join('vendors', 'p.vendor_id', '=', 'vendors.id') ->whereBetween('p.created_at', [$startYear . '-01-01', $endYear . '-12-31']) ->groupBy('vendor_id') ->get(); return $this->generateGroupedReport($data, year_from: $startYear, year_to: $endYear); } else { $data = DB::table('purchase_orders as p') ->select('p.*', 'vendors.name as vendor_name', 'users.name as ordered_by') ->join('vendors', 'p.vendor_id', '=', 'vendors.id') ->join('users', 'p.ordered_by_id', '=', 'users.id') ->whereBetween('p.created_at', [$startYear . '-01-01', $endYear . '-12-31']) ->orderByDesc('created_at') ->get(); return $this->generateNonGroupedReport($data, year_from: $startYear, year_to: $endYear); } } public function generateGroupedReport($reports, $year_from = "", $year_to = "") { $path = "storage/reports/yoy-grouped-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.yoy-grouped', compact('reports', 'year_from', 'year_to')) ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function generateNonGroupedReport($reports, $year_from = "", $year_to = "") { $report_filtered = []; $totals = []; foreach ($reports as $report) { $report_filtered[$report->vendor_name][] = [ 'id' => $report->id, 'ordered_by' => $report->ordered_by, 'order_number' => $report->order_number, 'payment_terms' => $report->payment_terms, 'reference' => $report->reference, 'vendor_name' => $report->vendor_name, 'quantity' => $report->total_quantity, 'price' => $report->total_price, 'created_at' => $report->created_at, ]; isset($totals[$report->vendor_name]['total_quantity']) ? $totals[$report->vendor_name]['total_quantity'] += $report->total_quantity : $totals[$report->vendor_name]['total_quantity'] = $report->total_quantity; isset($totals[$report->vendor_name]['total_price']) ? $totals[$report->vendor_name]['total_price'] += $report->total_price : $totals[$report->vendor_name]['total_price'] = $report->total_price; } $path = "storage/reports/yoy-non-grouped-report.pdf"; if (!is_dir(public_path('storage/reports'))) { Storage::disk('public')->makeDirectory('reports'); } Pdf::loadView('layouts.reports.yoy-non-grouped', compact('report_filtered', 'totals', 'year_from', 'year_to')) ->setPaper('A4', 'landscape') ->save(public_path($path)); return \response()->json(['data' => asset($path)])->setStatusCode(Response::HTTP_OK); } public function deletePurchaseOrderItemsCreated($products) { foreach ($products as $product) { foreach ($product['orders'] as $order) { if (isset($order['order_id'])) { //Update PO flag in order items OrderItems::where([ 'product_id' => $product['product_id'], 'price_id' => $product['price_id'], 'order_id' => $order['order_id'], ])->update([ 'po_created' => 1, ]); PurchaseOrderToCreate::where([ 'product_id' => $product['product_id'], 'price_id' => $product['price_id'], 'order_id' => $order['order_id'], ])->delete(); } } } } public function removePOItem(Request $request) { $request->validate([ 'product_id' => 'required', 'price_id' => 'required', 'order_id' => 'required', ]); //Update PO flag in order items OrderItems::where([ 'product_id' => $request->get('product_id'), 'price_id' => $request->get('price_id'), 'order_id' => $request->get('order_id'), ])->update([ 'po_created' => 1, ]); PurchaseOrderToCreate::where([ 'product_id' => $request->get('product_id'), 'price_id' => $request->get('price_id'), 'order_id' => $request->get('order_id'), ])->delete(); return response() ->json(['message' => 'Purchase order item deleted successfully'], Response::HTTP_OK); } } Controllers/APIController.php 0000644 00000023450 15021222673 0012244 0 ustar 00 <?php namespace App\Http\Controllers; use App\Http\Requests\Admin\ForgotPasswordRequest; use App\Http\Requests\Admin\RegisterRequest; use App\Http\Requests\Admin\ResetPasswordRequest; use App\Http\Requests\Admin\UpdatePasswordRequest; use App\Http\Requests\Admin\UpdateProfileRequest; use App\Models\User; use App\Notifications\ForgotPasswordNotification; use App\Notifications\RegisterNotification; use App\Notifications\VerifyEmail; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use Symfony\Component\HttpFoundation\Response; class APIController extends Controller { public function login(Request $request) { $credentials = $request->only('email', 'password'); //Validate credential $validator = Validator::make($credentials, [ 'email' => 'required|email', 'password' => 'required' ]); //Send failed response if request is not valid if ($validator->fails()) { return response() ->json(['errors' => $validator->messages()], 422); } if (!auth()->attempt($credentials)) { return response()->json([ 'message' => 'The given data was invalid.', 'errors' => [ 'password' => [ 'Invalid credentials' ], ] ], 422); } $user = User::where('email', $request->email)->first(); if (auth()->user()->status == 0) { return response()->json([ 'message' => 'Account disabled.', 'errors' => [ 'email' => [ 'Your account is disabled, please contact administrator.' ], ] ], 422); } if (!auth()->user()->hasVerifiedEmail()) { return response()->json([ 'message' => 'Email not verified.', 'errors' => [ 'email_verification' => [ 'Your email is not verified.' ], ] ], 422); } $authToken = $user->createToken('auth-token')->plainTextToken; return response()->json([ 'user' => [ 'id' => $user->id, 'user_type' => $user->user_type, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'company' => $user->company, 'secondary_email' => $user->secondary_email, 'secondary_phone' => $user->secondary_phone, 'secondary_name' => $user->secondary_name, 'email_verified' => $user->hasVerifiedEmail(), 'status' => $user->status, 'sms_notification' => $user->sms_notification, 'profile_image' => $user->profile_image->original_url ?? "", 'role' => isset($user->roles[0]) ? [ 'role_id' => $user->roles[0]->id, 'role_name' => $user->roles[0]->title, ]: [], ], 'access_token' => $authToken, ]); } public function register(RegisterRequest $request) { $token = md5(uniqid(rand(), true)); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'phone_number' => $request->phone_number, 'status' => 1, 'sms_notification' => (int)$request->sms_notification === 1 ? 1 : 0, 'user_type' => 3, 'password' => $request->password, 'email_token' => $token ]); if ($request->file('profile_image', false)) { $user->addMediaFromRequest('profile_image')->toMediaCollection('profile_image', 'user'); } // Assign user role $user->roles()->attach(3); try { //$user->notify((new RegisterNotification())->delay(now()->addSeconds(5))); $user->notify((new VerifyEmail($token))); //->delay(now()->addSeconds(5))); } catch (\Exception $e) { \Log::info($e->getMessage()); } return response()->json([ 'message' => 'User created successfully. Kindly check your inbox to verify email.', ], Response::HTTP_OK); } public function update_profile(UpdateProfileRequest $request) { $user = auth()->user(); $user->update( $request->all(), ); if ($request->file('profile_image', false)) { if (!empty($user->profile_image)) { $user->profile_image->delete(); } $user->addMediaFromRequest('profile_image')->toMediaCollection('profile_image', 'user'); } return response()->json([ 'message' => 'Profile updated successfully', ], Response::HTTP_OK); } public function get_user() { $user = auth()->user(); return response()->json(['user' => [ 'id' => $user->id, 'user_type' => $user->user_type, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'company' => $user->company, 'fax_number' => $user->fax_number, 'server_timezone' => date_default_timezone_get(), 'status' => $user->status, 'sms_notification' => $user->sms_notification, 'profile_image' => $user->profile_image ? [ "url" => $user->profile_image->url, "thumbnail" => $user->profile_image->thumbnail, "preview" => $user->profile_image->preview, ] : null, ]]); } function logout(Request $request) { $request->user()->tokens()->delete(); return response()->json(['message' => "User has been logged out successfully."]); } public function forgot_password(ForgotPasswordRequest $request) { $resetCode = substr(number_format(time() * rand(), 0, '', ''), 0, 6); $user = User::whereEmail($request->input("email"))->first(); if (!$user) return response()->json([ 'message' => "This user does not exists.", 'errors' => ["error" => ["This user does not exists."]] ], 422); $user->password_reset_code = $resetCode; $user->save(); try { $user->notify(new ForgotPasswordNotification($resetCode)); } catch (\Exception $e) { Log::info($e->getMessage()); } return response()->json(['message' => "A Password reset code has been sent to your email address."]); } public function reset_password(ResetPasswordRequest $request) { $user = User::whereEmail($request->input("email")) ->wherePasswordResetCode($request->input("password_reset_code")) ->first(); if (empty($user)) { return response()->json([ 'message' => "The given data was invalid.", 'errors' => ["password_reset_code" => ["The Password Reset Code is invalid or user does not exists."]] ], 422); } $user->password = \Hash::make($request->input("new_password")); $user->password_last_changed = new \DateTime; $user->password_reset_code = null; $user->save(); return response()->json(['message' => "Password has been changed successfully."]); } public function verifyEmail(Request $request) { $request->validate([ 'token' => 'required', ]); $user = User::where('email_token', $request->get('token'))->first(); if (empty($user)) { return response()->json([ 'message' => "Invalid token.", 'errors' => ["token" => ["The given token is invalid."]] ], 422); } $user->email_verified_at = now(); $user->email_token = null; $user->save(); return response()->json([ 'message' => "Email verified successfully.", ], Response::HTTP_OK); } public function resendVerificationEmail(Request $request) { $request->validate([ 'email' => 'required|exists:users,email', ]); $user = User::where('email', $request->get('email'))->first(); if (empty($user)) { return response()->json([ 'message' => "Invalid email.", 'errors' => ["token" => ["This email does not exists in our records."]] ], 422); } if($user->hasVerifiedEmail()){ return \response()->json([ 'message' => 'Email already verified.', 'errors' => ["email" => ["You have already verified your email."]] ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); }else{ try { $token = md5(uniqid(rand(), true)); $user->notify((new VerifyEmail($token))); $user->email_token = $token; $user->save(); return \response()->json([ 'message' => 'Verification link sent to your email address.', ])->setStatusCode(Response::HTTP_OK); } catch (\Exception $e) { Log::info($e->getMessage()); return \response()->json([ 'message' => 'Email not sent.', 'errors' => ["email" => ["Something went wrong."]] ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } } } public function update_password(UpdatePasswordRequest $request) { auth()->user()->update($request->validated()); return response()->json(['message' => "Password updated successfully."]); } } Controllers/VerifyEmailController.php 0000644 00000003513 15021222673 0014045 0 ustar 00 <?php namespace App\Http\Controllers; use Illuminate\Auth\Events\Verified; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use App\Models\User; use App\Notifications\WelcomeNotification; class VerifyEmailController extends Controller { public function __invoke(Request $request): RedirectResponse { $user = User::find($request->route('id')); if ($user->hasVerifiedEmail()) { return redirect(env('APP_URL') . '/email/verify/already-success'); } if ($user->markEmailAsVerified()) { try { event(new Verified($user)); $user->notify(new WelcomeNotification()); } catch (\Exception $e) { \Log::info($e->getMessage()); } } return redirect(env('APP_URL') . '/email/verify/success'); } /** * Resend email verification link. * * @return \Response */ public function resendEmailVerificationLink(Request $request) { try { if ($request->user()->hasVerifiedEmail()) { return response()->json(['message' => "Email already verified."]); } $request->user()->sendEmailVerificationNotification(); return response()->json(['message' => "Verification link sent."]); } catch (\Exception $e) { return response()->json(['message' => "Verification link could not be sent."], 500); } } /** * Show email verified page. * * @return string */ public function email_verified() { return view('email-verified'); } /** * Show email verified page. * * @return string */ public function email_already_verified() { return view('email-already-verified'); } } Controllers/.DS_Store 0000644 00000014004 15021222673 0010534 0 ustar 00 Bud1 spblob �bp A p ibwspblob �bplist00�]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{260, 330}, {920, 464}} #/;R_klmno� � A p ivSrnlong @ � @ � @ � @ E DSDB ` � @ � @ � @ Controllers/Traits/MediaUploadingTrait.php 0000644 00000002436 15021222673 0014724 0 ustar 00 <?php namespace App\Http\Controllers\Traits; use Illuminate\Http\Request; trait MediaUploadingTrait { public function storeMedia(Request $request) { // Validates file size if (request()->has('size')) { $this->validate(request(), [ 'file' => 'max:' . request()->input('size') * 1024, ]); } // If width or height is preset - we are validating it as an image if (request()->has('width') || request()->has('height')) { $this->validate(request(), [ 'file' => sprintf( 'image|dimensions:max_width=%s,max_height=%s', request()->input('width', 100000), request()->input('height', 100000) ), ]); } $path = storage_path('tmp/uploads'); try { if (! file_exists($path)) { mkdir($path, 0755, true); } } catch (\Exception $e) { } $file = $request->file('file'); $name = uniqid() . '_' . trim($file->getClientOriginalName()); $file->move($path, $name); return response()->json([ 'name' => $name, 'original_name' => $file->getClientOriginalName(), ]); } } Controllers/Admin/UsersController.php 0000644 00000016136 15021222673 0013767 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyUserRequest; use App\Http\Requests\StoreUserRequest; use App\Http\Requests\UpdateUserRequest; use App\Models\Company; use App\Models\Organization; use App\Models\Role; use App\Models\User; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class UsersController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = User::with(['organization', 'companies', 'roles'])->select(sprintf('%s.*', (new User)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'user_show'; $editGate = 'user_edit'; $deleteGate = 'user_delete'; $crudRoutePart = 'users'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('company', function ($row) { $labels = []; foreach ($row->companies as $company) { $labels[] = sprintf('<span class="label label-info label-many">%s</span>', $company->name); } return implode(' ', $labels); }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('email', function ($row) { return $row->email ? $row->email : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->editColumn('avatar', function ($row) { if ($photo = $row->avatar) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->editColumn('roles', function ($row) { $labels = []; foreach ($row->roles as $role) { $labels[] = sprintf('<span class="label label-info label-many">%s</span>', $role->title); } return implode(' ', $labels); }); $table->rawColumns(['actions', 'placeholder', 'organization', 'company', 'avatar', 'roles']); return $table->make(true); } $organizations = Organization::get(); $companies = Company::get(); $roles = Role::get(); return view('admin.users.index', compact('organizations', 'companies', 'roles')); } public function create() { abort_if(Gate::denies('user_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id'); $roles = Role::pluck('title', 'id'); return view('admin.users.create', compact('companies', 'organizations', 'roles')); } public function store(StoreUserRequest $request) { $user = User::create($request->all()); $user->companies()->sync($request->input('companies', [])); $user->roles()->sync($request->input('roles', [])); if ($request->input('avatar', false)) { $user->addMedia(storage_path('tmp/uploads/' . basename($request->input('avatar'))))->toMediaCollection('avatar'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $user->id]); } return redirect()->route('admin.users.index'); } public function edit(User $user) { abort_if(Gate::denies('user_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id'); $roles = Role::pluck('title', 'id'); $user->load('organization', 'companies', 'roles'); return view('admin.users.edit', compact('companies', 'organizations', 'roles', 'user')); } public function update(UpdateUserRequest $request, User $user) { $user->update($request->all()); $user->companies()->sync($request->input('companies', [])); $user->roles()->sync($request->input('roles', [])); if ($request->input('avatar', false)) { if (! $user->avatar || $request->input('avatar') !== $user->avatar->file_name) { if ($user->avatar) { $user->avatar->delete(); } $user->addMedia(storage_path('tmp/uploads/' . basename($request->input('avatar'))))->toMediaCollection('avatar'); } } elseif ($user->avatar) { $user->avatar->delete(); } return redirect()->route('admin.users.index'); } public function show(User $user) { abort_if(Gate::denies('user_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $user->load('organization', 'companies', 'roles'); return view('admin.users.show', compact('user')); } public function destroy(User $user) { abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $user->delete(); return back(); } public function massDestroy(MassDestroyUserRequest $request) { $users = User::find(request('ids')); foreach ($users as $user) { $user->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('user_create') && Gate::denies('user_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new User(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/HomeController.php 0000644 00000000214 15021222673 0013544 0 ustar 00 <?php namespace App\Http\Controllers\Admin; class HomeController { public function index() { return view('home'); } } Controllers/Admin/AttributeController.php 0000644 00000006210 15021222673 0014621 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyAttributeRequest; use App\Http\Requests\Admin\StoreAttributeRequest; use App\Http\Requests\Admin\UpdateAttributeRequest; use App\Models\Attribute; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class AttributeController extends Controller { public function index(Request $request) { abort_if(Gate::denies('attribute_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Attribute::query()->select(sprintf('%s.*', (new Attribute())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'attribute_show'; $editGate = 'attribute_edit'; $deleteGate = 'attribute_delete'; $crudRoutePart = 'attributes'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->rawColumns(['actions', 'placeholder']); return $table->make(true); } return view('admin.attributes.index'); } public function create() { abort_if(Gate::denies('attribute_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.attributes.create'); } public function store(StoreAttributeRequest $request) { $attribute = Attribute::create($request->all()); return redirect()->route('admin.attributes.index'); } public function edit(Attribute $attribute) { abort_if(Gate::denies('attribute_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.attributes.edit', compact('attribute')); } public function update(UpdateAttributeRequest $request, Attribute $attribute) { $attribute->update($request->all()); return redirect()->route('admin.attributes.index'); } public function show(Attribute $attribute) { abort_if(Gate::denies('attribute_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.attributes.show', compact('attribute')); } public function destroy(Attribute $attribute) { abort_if(Gate::denies('attribute_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attribute->delete(); return back(); } public function massDestroy(MassDestroyAttributeRequest $request) { Attribute::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/ProductController.php 0000644 00000021033 15021222673 0014276 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\Admin\MassDestroyProductRequest; use App\Http\Requests\Admin\StoreProductRequest; use App\Http\Requests\Admin\UpdateProductRequest; use App\Models\Category; use App\Models\Product; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class ProductController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('product_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Product::with(['category'])->select(sprintf('%s.*', (new Product())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'product_show'; $editGate = 'product_edit'; $deleteGate = 'product_delete'; $crudRoutePart = 'products'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('category_name', function ($row) { return $row->category ? $row->category->name : ''; }); $table->editColumn('sku', function ($row) { return $row->sku ? $row->sku : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('slug', function ($row) { return $row->slug ? $row->slug : ''; }); $table->editColumn('description', function ($row) { return $row->description ? $row->description : ''; }); $table->editColumn('featured_image', function ($row) { if ($photo = $row->featured_image) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->editColumn('gallery_images', function ($row) { if (!$row->gallery_images) { return ''; } $links = []; foreach ($row->gallery_images as $media) { $links[] = '<a href="' . $media->getUrl() . '" target="_blank"><img src="' . $media->getUrl('thumb') . '" width="50px" height="50px"></a>'; } return implode(' ', $links); }); $table->editColumn('status', function ($row) { return $row->status ? Product::STATUS_RADIO[$row->status] : ''; }); $table->editColumn('product_sketch', function ($row) { if ($photo = $row->product_sketch) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->rawColumns(['actions', 'placeholder', 'category', 'featured_image', 'gallery_images', 'product_sketch']); return $table->make(true); } $categories = Category::get(); return view('admin.products.index', compact('categories')); } public function create() { abort_if(Gate::denies('product_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $categories = Category::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.products.create', compact('categories')); } public function store(StoreProductRequest $request) { $product = Product::create($request->all()); if ($request->input('featured_image', false)) { $product->addMedia(storage_path('tmp/uploads/' . basename($request->input('featured_image'))))->toMediaCollection('featured_image'); } foreach ($request->input('gallery_images', []) as $file) { $product->addMedia(storage_path('tmp/uploads/' . basename($file)))->toMediaCollection('gallery_images'); } if ($request->input('product_sketch', false)) { $product->addMedia(storage_path('tmp/uploads/' . basename($request->input('product_sketch'))))->toMediaCollection('product_sketch'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $product->id]); } return redirect()->route('admin.products.index'); } public function edit(Product $product) { abort_if(Gate::denies('product_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $categories = Category::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $product->load('category'); return view('admin.products.edit', compact('categories', 'product')); } public function update(UpdateProductRequest $request, Product $product) { $product->update($request->all()); if ($request->input('featured_image', false)) { if (!$product->featured_image || $request->input('featured_image') !== $product->featured_image->file_name) { if ($product->featured_image) { $product->featured_image->delete(); } $product->addMedia(storage_path('tmp/uploads/' . basename($request->input('featured_image'))))->toMediaCollection('featured_image'); } } elseif ($product->featured_image) { $product->featured_image->delete(); } if (count($product->gallery_images) > 0) { foreach ($product->gallery_images as $media) { if (!in_array($media->file_name, $request->input('gallery_images', []))) { $media->delete(); } } } $media = $product->gallery_images->pluck('file_name')->toArray(); foreach ($request->input('gallery_images', []) as $file) { if (count($media) === 0 || !in_array($file, $media)) { $product->addMedia(storage_path('tmp/uploads/' . basename($file)))->toMediaCollection('gallery_images'); } } if ($request->input('product_sketch', false)) { if (!$product->product_sketch || $request->input('product_sketch') !== $product->product_sketch->file_name) { if ($product->product_sketch) { $product->product_sketch->delete(); } $product->addMedia(storage_path('tmp/uploads/' . basename($request->input('product_sketch'))))->toMediaCollection('product_sketch'); } } elseif ($product->product_sketch) { $product->product_sketch->delete(); } return redirect()->route('admin.products.index'); } public function show(Product $product) { abort_if(Gate::denies('product_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $product->load('category', 'productProductPrices'); return view('admin.products.show', compact('product')); } public function destroy(Product $product) { abort_if(Gate::denies('product_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $product->delete(); return back(); } public function massDestroy(MassDestroyProductRequest $request) { Product::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('product_create') && Gate::denies('product_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Product(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/AddressBookController.php 0000644 00000011402 15021222673 0015055 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyAddressBookRequest; use App\Http\Requests\Admin\StoreAddressBookRequest; use App\Http\Requests\Admin\UpdateAddressBookRequest; use App\Models\AddressBook; use App\Models\User; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class AddressBookController extends Controller { public function index(Request $request) { abort_if(Gate::denies('address_book_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = AddressBook::with(['user'])->select(sprintf('%s.*', (new AddressBook())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'address_book_show'; $editGate = 'address_book_edit'; $deleteGate = 'address_book_delete'; $crudRoutePart = 'address-books'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('user_name', function ($row) { return $row->user ? $row->user->name : ''; }); $table->editColumn('contact_person', function ($row) { return $row->contact_person ? $row->contact_person : ''; }); $table->editColumn('address_line_1', function ($row) { return $row->address_line_1 ? $row->address_line_1 : ''; }); $table->editColumn('address_line_2', function ($row) { return $row->address_line_2 ? $row->address_line_2 : ''; }); $table->editColumn('city', function ($row) { return $row->city ? $row->city : ''; }); $table->editColumn('state', function ($row) { return $row->state ? $row->state : ''; }); $table->editColumn('country', function ($row) { return $row->country ? $row->country : ''; }); $table->editColumn('zip_code', function ($row) { return $row->zip_code ? $row->zip_code : ''; }); $table->editColumn('is_default', function ($row) { return '<input type="checkbox" disabled ' . ($row->is_default ? 'checked' : null) . '>'; }); $table->rawColumns(['actions', 'placeholder', 'user', 'is_default']); return $table->make(true); } $users = User::get(); return view('admin.addressBooks.index', compact('users')); } public function create() { abort_if(Gate::denies('address_book_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.addressBooks.create', compact('users')); } public function store(StoreAddressBookRequest $request) { $addressBook = AddressBook::create($request->all()); return redirect()->route('admin.address-books.index'); } public function edit(AddressBook $addressBook) { abort_if(Gate::denies('address_book_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $addressBook->load('user'); return view('admin.addressBooks.edit', compact('addressBook', 'users')); } public function update(UpdateAddressBookRequest $request, AddressBook $addressBook) { $addressBook->update($request->all()); return redirect()->route('admin.address-books.index'); } public function show(AddressBook $addressBook) { abort_if(Gate::denies('address_book_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $addressBook->load('user'); return view('admin.addressBooks.show', compact('addressBook')); } public function destroy(AddressBook $addressBook) { abort_if(Gate::denies('address_book_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $addressBook->delete(); return back(); } public function massDestroy(MassDestroyAddressBookRequest $request) { AddressBook::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/ProductsImportController.php 0000644 00000015256 15021222673 0015666 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\StoreProductRequest; use App\Models\Product; use App\Models\Variation; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; class ProductsImportController extends Controller { public function importView() { return view('import-products'); } public function import(Request $request) { $reader = new Xlsx(); $spreadsheet = $reader->load($request->file('file')->getPathname()); $data = $spreadsheet->getSheet(0)->toArray(); /* * 0 => "PRIMARY IMAGE FILE NAME" * 1 => "VENDOR" * 2 => "PRODUCT FAMILY" * 3 => "PRODUCT NAME" * 4 => "PRODUCT DESCRIPTION" * 5 => "PRODUCT SUPPLIER NUMBER" * 6 => "PRODUCT DIMENSIONS" * 7 => "WEIGHT" * 8 => "UNIT COST" * 9 => "1-9 ea" * 10 => "10-24 ea" * 11 => "25-49 ea" * 12 => "50-99 ea" * 13 => "100-249 ea" * 14 => "250+ ea" * 16 => "ENGRAVING" * 17 => "COLOR UV PRINT" * 18 => "AWARD CATEGORY" * 19 => "Award Base Color 1" * 20 => "Award Base Color 2" * 21 => "Award Base Color 3" * 22 => "Award Base Color 4" * 23 => "Award Base Color 5" * 24 => "width (inches)" * 25 => "height (inches)" * 26 => "length(inches)" * */ $products_data = []; foreach ($data as $key => $datum){ if ($key == 0 || $datum[0] == null) continue; $slug = \str()->slug($datum[3]); $dimension = Variation::where('value', $datum[6])->first(); $dimension = $dimension ? $dimension->id : 0; //Product Dimension $colors = []; //Product Colors $supplier_number = $datum[5]; for ($i = 19; $i <= 23; $i++){ if ($datum[$i] != null || $datum[$i] != 0) { $db_color = Variation::where('type', 'color')->where('value', $datum[$i])->first(); $colors[] = $db_color->value ?? $datum[$i]; } } $price_range = [ [ 'qty_from' => 1, 'qty_to' => 9, 'price' => 0, ], [ 'qty_from' => 10, 'qty_to' => 24, 'price' => 0, ], [ 'qty_from' => 25, 'qty_to' => 49, 'price' => 0, ], [ 'qty_from' => 50, 'qty_to' => 99, 'price' => 0, ], [ 'qty_from' => 100, 'qty_to' => 249, 'price' => 0, ], ]; for ($i = 9, $j = 0; $i <= 13; $i++, $j++){ $price_range[$j]['price'] = str_replace('$', '', $datum[$i]); } $combinations = []; $colors = count($colors) > 0 ? $colors : null; $color_ids = []; foreach ($colors ?? [0] as $key2 => $color){ $v = [$dimension]; if ($color != 0 ) { $db_color = Variation::where('type', 'color')->where('value', $color)->first(); $v[] = $db_color->id; $color_ids[] = $db_color->id; } $combinations[] = [ 'variations' => $v, 'vendor_price' => str_replace('$', '', $datum[8]), 'supplier_prod_number' => $supplier_number .'-'. ($color ?? rand(1,1000)), 'shipping_weight' => $datum[7], 'width' => $datum[24], 'height' => $datum[25], 'length' => $datum[26], 'price_ranges' => $price_range ]; } $new_product = [ 'image' => $datum[0], 'vendor_id' => $datum[1], 'slug' => $slug, 'name' => $datum[3], 'sku' => $supplier_number, 'description' => $datum[4], 'engraving' => $datum[16], 'color_engraving' => $datum[17], 'status' => 1, 'category_id' => $datum[18], 'variations' => array_merge($v, $color_ids ?? []), 'combinations' => $combinations, ]; if (isset($products_data[$slug])){ $products_data[$slug]['variations'] = (array_unique(array_merge($products_data[$slug]['variations'], $new_product['variations']))); $products_data[$slug]['combinations'] = array_merge_recursive($products_data[$slug]['combinations'], $new_product['combinations']); }else{ $products_data[$slug] = $new_product; } } foreach ($products_data as $product){ $p_data = new StoreProductRequest(); $p_data->replace($product); $this->storeProducts($p_data); } } public function storeProducts(StoreProductRequest $request) { DB::beginTransaction(); try { $image = public_path('images/all_images/'.$request->image); $product = Product::create([ 'vendor_id' => $request['vendor_id'], 'slug' => \str()->slug($request['name']), 'sku' => $request['sku'], 'name' => $request['name'], 'description' => $request['description'], 'engraving' => $request['engraving'], 'color_engraving' => $request['color_engraving'], 'status' => $request['status'], 'category_id' => $request['category_id'], 'has_variations' => 1, ]); if (is_file($image)) { $product->addMedia($image) ->preservingOriginal() ->toMediaCollection('product_featured_image', 'product') ->save(); } foreach ($request->file('gallery_images', []) as $file) { $product->addMedia($file)->toMediaCollection('gallery_image', 'product'); } $product->handleVariations($request); DB::commit(); }catch (\Exception $e){ \Log::channel('db_errors')->info('Product Create Error'); \Log::channel('db_errors')->info($e->getMessage()); echo "error". $e->getMessage() . '<br>'; } } } Controllers/Admin/StatusController.php 0000644 00000006106 15021222673 0014145 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyStatusRequest; use App\Http\Requests\Admin\StoreStatusRequest; use App\Http\Requests\Admin\UpdateStatusRequest; use App\Models\Status; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class StatusController extends Controller { public function index(Request $request) { abort_if(Gate::denies('status_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Status::query()->select(sprintf('%s.*', (new Status())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'status_show'; $editGate = 'status_edit'; $deleteGate = 'status_delete'; $crudRoutePart = 'statuses'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->rawColumns(['actions', 'placeholder']); return $table->make(true); } return view('admin.statuses.index'); } public function create() { abort_if(Gate::denies('status_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.statuses.create'); } public function store(StoreStatusRequest $request) { $status = Status::create($request->all()); return redirect()->route('admin.statuses.index'); } public function edit(Status $status) { abort_if(Gate::denies('status_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.statuses.edit', compact('status')); } public function update(UpdateStatusRequest $request, Status $status) { $status->update($request->all()); return redirect()->route('admin.statuses.index'); } public function show(Status $status) { abort_if(Gate::denies('status_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $status->load('currentStatusOrders'); return view('admin.statuses.show', compact('status')); } public function destroy(Status $status) { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $status->delete(); return back(); } public function massDestroy(MassDestroyStatusRequest $request) { Status::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/RolesController.php 0000644 00000010630 15021222673 0013743 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyRoleRequest; use App\Http\Requests\StoreRoleRequest; use App\Http\Requests\UpdateRoleRequest; use App\Models\Organization; use App\Models\Permission; use App\Models\Role; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class RolesController extends Controller { public function index(Request $request) { abort_if(Gate::denies('role_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Role::with(['organization', 'permissions'])->select(sprintf('%s.*', (new Role)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'role_show'; $editGate = 'role_edit'; $deleteGate = 'role_delete'; $crudRoutePart = 'roles'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('title', function ($row) { return $row->title ? $row->title : ''; }); $table->editColumn('permissions', function ($row) { $labels = []; foreach ($row->permissions as $permission) { $labels[] = sprintf('<span class="label label-info label-many">%s</span>', $permission->title); } return implode(' ', $labels); }); $table->rawColumns(['actions', 'placeholder', 'organization', 'permissions']); return $table->make(true); } $organizations = Organization::get(); $permissions = Permission::get(); return view('admin.roles.index', compact('organizations', 'permissions')); } public function create() { abort_if(Gate::denies('role_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $permissions = Permission::pluck('title', 'id'); return view('admin.roles.create', compact('organizations', 'permissions')); } public function store(StoreRoleRequest $request) { $role = Role::create($request->all()); $role->permissions()->sync($request->input('permissions', [])); return redirect()->route('admin.roles.index'); } public function edit(Role $role) { abort_if(Gate::denies('role_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $permissions = Permission::pluck('title', 'id'); $role->load('organization', 'permissions'); return view('admin.roles.edit', compact('organizations', 'permissions', 'role')); } public function update(UpdateRoleRequest $request, Role $role) { $role->update($request->all()); $role->permissions()->sync($request->input('permissions', [])); return redirect()->route('admin.roles.index'); } public function show(Role $role) { abort_if(Gate::denies('role_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $role->load('organization', 'permissions'); return view('admin.roles.show', compact('role')); } public function destroy(Role $role) { abort_if(Gate::denies('role_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $role->delete(); return back(); } public function massDestroy(MassDestroyRoleRequest $request) { $roles = Role::find(request('ids')); foreach ($roles as $role) { $role->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/PermissionsController.php 0000644 00000000764 15021222673 0015201 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Permission; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class PermissionsController extends Controller { public function index() { abort_if(Gate::denies('permission_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $permissions = Permission::all(); return view('admin.permissions.index', compact('permissions')); } } Controllers/Admin/OrderController.php 0000644 00000015524 15021222673 0013741 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyOrderRequest; use App\Http\Requests\Admin\StoreOrderRequest; use App\Http\Requests\Admin\UpdateOrderRequest; use App\Models\AddressBook; use App\Models\Order; use App\Models\Status; use App\Models\User; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class OrderController extends Controller { public function index(Request $request) { abort_if(Gate::denies('order_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Order::with(['user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address'])->select(sprintf('%s.*', (new Order())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'order_show'; $editGate = 'order_edit'; $deleteGate = 'order_delete'; $crudRoutePart = 'orders'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('user_name', function ($row) { return $row->user ? $row->user->name : ''; }); $table->editColumn('user.email', function ($row) { return $row->user ? (is_string($row->user) ? $row->user : $row->user->email) : ''; }); $table->editColumn('order_number', function ($row) { return $row->order_number ? $row->order_number : ''; }); $table->addColumn('current_status_name', function ($row) { return $row->current_status ? $row->current_status->name : ''; }); $table->addColumn('assigned_to_name', function ($row) { return $row->assigned_to ? $row->assigned_to->name : ''; }); $table->editColumn('assigned_to.email', function ($row) { return $row->assigned_to ? (is_string($row->assigned_to) ? $row->assigned_to : $row->assigned_to->email) : ''; }); $table->editColumn('admin_approved', function ($row) { return '<input type="checkbox" disabled ' . ($row->admin_approved ? 'checked' : null) . '>'; }); $table->addColumn('shipping_address_contact_person', function ($row) { return $row->shipping_address ? $row->shipping_address->contact_person : ''; }); $table->editColumn('shipping_address.address_line_1', function ($row) { return $row->shipping_address ? (is_string($row->shipping_address) ? $row->shipping_address : $row->shipping_address->address_line_1) : ''; }); $table->addColumn('billing_address_contact_person', function ($row) { return $row->billing_address ? $row->billing_address->contact_person : ''; }); $table->editColumn('billing_address.address_line_1', function ($row) { return $row->billing_address ? (is_string($row->billing_address) ? $row->billing_address : $row->billing_address->address_line_1) : ''; }); $table->editColumn('payment_status', function ($row) { return $row->payment_status ? Order::PAYMENT_STATUS_RADIO[$row->payment_status] : ''; }); $table->editColumn('payment_type', function ($row) { return $row->payment_type ? Order::PAYMENT_TYPE_RADIO[$row->payment_type] : ''; }); $table->rawColumns(['actions', 'placeholder', 'user', 'current_status', 'assigned_to', 'admin_approved', 'shipping_address', 'billing_address']); return $table->make(true); } $users = User::get(); $statuses = Status::get(); $address_books = AddressBook::get(); return view('admin.orders.index', compact('users', 'statuses', 'address_books')); } public function create() { abort_if(Gate::denies('order_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $current_statuses = Status::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $shipping_addresses = AddressBook::pluck('contact_person', 'id')->prepend(trans('global.pleaseSelect'), ''); $billing_addresses = AddressBook::pluck('contact_person', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.orders.create', compact('billing_addresses', 'current_statuses', 'shipping_addresses', 'users')); } public function store(StoreOrderRequest $request) { $order = Order::create($request->all()); return redirect()->route('admin.orders.index'); } public function edit(Order $order) { abort_if(Gate::denies('order_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $users = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $current_statuses = Status::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $shipping_addresses = AddressBook::pluck('contact_person', 'id')->prepend(trans('global.pleaseSelect'), ''); $billing_addresses = AddressBook::pluck('contact_person', 'id')->prepend(trans('global.pleaseSelect'), ''); $order->load('user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address'); return view('admin.orders.edit', compact('billing_addresses', 'current_statuses', 'order', 'shipping_addresses', 'users')); } public function update(UpdateOrderRequest $request, Order $order) { $order->update($request->all()); return redirect()->route('admin.orders.index'); } public function show(Order $order) { abort_if(Gate::denies('order_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $order->load('user', 'current_status', 'assigned_to', 'shipping_address', 'billing_address'); return view('admin.orders.show', compact('order')); } public function destroy(Order $order) { abort_if(Gate::denies('order_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $order->delete(); return back(); } public function massDestroy(MassDestroyOrderRequest $request) { Order::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/AttributeOptionController.php 0000644 00000007723 15021222673 0016024 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyAttributeOptionRequest; use App\Http\Requests\Admin\StoreAttributeOptionRequest; use App\Http\Requests\Admin\UpdateAttributeOptionRequest; use App\Models\Attribute; use App\Models\AttributeOption; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class AttributeOptionController extends Controller { public function index(Request $request) { abort_if(Gate::denies('attribute_option_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = AttributeOption::with(['attribute'])->select(sprintf('%s.*', (new AttributeOption())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'attribute_option_show'; $editGate = 'attribute_option_edit'; $deleteGate = 'attribute_option_delete'; $crudRoutePart = 'attribute-options'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('attribute_name', function ($row) { return $row->attribute ? $row->attribute->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->rawColumns(['actions', 'placeholder', 'attribute']); return $table->make(true); } $attributes = Attribute::get(); return view('admin.attributeOptions.index', compact('attributes')); } public function create() { abort_if(Gate::denies('attribute_option_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attributes = Attribute::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.attributeOptions.create', compact('attributes')); } public function store(StoreAttributeOptionRequest $request) { $attributeOption = AttributeOption::create($request->all()); return redirect()->route('admin.attribute-options.index'); } public function edit(AttributeOption $attributeOption) { abort_if(Gate::denies('attribute_option_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attributes = Attribute::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $attributeOption->load('attribute'); return view('admin.attributeOptions.edit', compact('attributeOption', 'attributes')); } public function update(UpdateAttributeOptionRequest $request, AttributeOption $attributeOption) { $attributeOption->update($request->all()); return redirect()->route('admin.attribute-options.index'); } public function show(AttributeOption $attributeOption) { abort_if(Gate::denies('attribute_option_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attributeOption->load('attribute'); return view('admin.attributeOptions.show', compact('attributeOption')); } public function destroy(AttributeOption $attributeOption) { abort_if(Gate::denies('attribute_option_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $attributeOption->delete(); return back(); } public function massDestroy(MassDestroyAttributeOptionRequest $request) { AttributeOption::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/CategoryController.php 0000644 00000013503 15021222673 0014436 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyCategoryRequest; use App\Http\Requests\StoreCategoryRequest; use App\Http\Requests\UpdateCategoryRequest; use App\Models\Category; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class CategoryController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('category_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Category::with(['organization'])->select(sprintf('%s.*', (new Category)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'category_show'; $editGate = 'category_edit'; $deleteGate = 'category_delete'; $crudRoutePart = 'categories'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('description', function ($row) { return $row->description ? $row->description : ''; }); $table->editColumn('image', function ($row) { if ($photo = $row->image) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'image']); return $table->make(true); } $organizations = Organization::get(); return view('admin.categories.index', compact('organizations')); } public function create() { abort_if(Gate::denies('category_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.categories.create', compact('organizations')); } public function store(StoreCategoryRequest $request) { $category = Category::create($request->all()); if ($request->input('image', false)) { $category->addMedia(storage_path('tmp/uploads/' . basename($request->input('image'))))->toMediaCollection('image'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $category->id]); } return redirect()->route('admin.categories.index'); } public function edit(Category $category) { abort_if(Gate::denies('category_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $category->load('organization'); return view('admin.categories.edit', compact('category', 'organizations')); } public function update(UpdateCategoryRequest $request, Category $category) { $category->update($request->all()); if ($request->input('image', false)) { if (! $category->image || $request->input('image') !== $category->image->file_name) { if ($category->image) { $category->image->delete(); } $category->addMedia(storage_path('tmp/uploads/' . basename($request->input('image'))))->toMediaCollection('image'); } } elseif ($category->image) { $category->image->delete(); } return redirect()->route('admin.categories.index'); } public function show(Category $category) { abort_if(Gate::denies('category_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $category->load('organization'); return view('admin.categories.show', compact('category')); } public function destroy(Category $category) { abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $category->delete(); return back(); } public function massDestroy(MassDestroyCategoryRequest $request) { $categories = Category::find(request('ids')); foreach ($categories as $category) { $category->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('category_create') && Gate::denies('category_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Category(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/ProductPriceController.php 0000644 00000010403 15021222673 0015260 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MassDestroyProductPriceRequest; use App\Http\Requests\Admin\StoreProductPriceRequest; use App\Http\Requests\Admin\UpdateProductPriceRequest; use App\Models\Product; use App\Models\ProductPrice; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class ProductPriceController extends Controller { public function index(Request $request) { abort_if(Gate::denies('product_price_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = ProductPrice::with(['product'])->select(sprintf('%s.*', (new ProductPrice())->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'product_price_show'; $editGate = 'product_price_edit'; $deleteGate = 'product_price_delete'; $crudRoutePart = 'product-prices'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('product_name', function ($row) { return $row->product ? $row->product->name : ''; }); $table->editColumn('product.name', function ($row) { return $row->product ? (is_string($row->product) ? $row->product : $row->product->name) : ''; }); $table->editColumn('qty_from', function ($row) { return $row->qty_from ? $row->qty_from : ''; }); $table->editColumn('qty_to', function ($row) { return $row->qty_to ? $row->qty_to : ''; }); $table->editColumn('price', function ($row) { return $row->price ? $row->price : ''; }); $table->rawColumns(['actions', 'placeholder', 'product']); return $table->make(true); } $products = Product::get(); return view('admin.productPrices.index', compact('products')); } public function create() { abort_if(Gate::denies('product_price_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $products = Product::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.productPrices.create', compact('products')); } public function store(StoreProductPriceRequest $request) { $productPrice = ProductPrice::create($request->all()); return redirect()->route('admin.product-prices.index'); } public function edit(ProductPrice $productPrice) { abort_if(Gate::denies('product_price_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $products = Product::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $productPrice->load('product'); return view('admin.productPrices.edit', compact('productPrice', 'products')); } public function update(UpdateProductPriceRequest $request, ProductPrice $productPrice) { $productPrice->update($request->all()); return redirect()->route('admin.product-prices.index'); } public function show(ProductPrice $productPrice) { abort_if(Gate::denies('product_price_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $productPrice->load('product'); return view('admin.productPrices.show', compact('productPrice')); } public function destroy(ProductPrice $productPrice) { abort_if(Gate::denies('product_price_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $productPrice->delete(); return back(); } public function massDestroy(MassDestroyProductPriceRequest $request) { ProductPrice::whereIn('id', request('ids'))->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Auth/VerificationController.php 0000644 00000002152 15021222673 0015152 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\VerifiesEmails; class VerificationController extends Controller { /* |-------------------------------------------------------------------------- | Email Verification Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling email verification for any | user that recently registered with the application. Emails may also | be re-sent if the user didn't receive the original email message. | */ use VerifiesEmails; /** * Where to redirect users after verification. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('signed')->only('verify'); $this->middleware('throttle:6,1')->only('verify', 'resend'); } } Controllers/Auth/LoginController.php 0000644 00000001752 15021222673 0013605 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */ use AuthenticatesUsers; /** * Where to redirect users after login. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); } } Controllers/Auth/ForgotPasswordController.php 0000644 00000001233 15021222673 0015512 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; class ForgotPasswordController extends Controller { /* |-------------------------------------------------------------------------- | Password Reset Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling password reset emails and | includes a trait which assists in sending these notifications from | your application to your users. Feel free to explore this trait. | */ use SendsPasswordResetEmails; } Controllers/Auth/ConfirmPasswordController.php 0000644 00000002000 15021222673 0015640 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\ConfirmsPasswords; class ConfirmPasswordController extends Controller { /* |-------------------------------------------------------------------------- | Confirm Password Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling password confirmations and | uses a simple trait to include the behavior. You're free to explore | this trait and override any functions that require customization. | */ use ConfirmsPasswords; /** * Where to redirect users when the intended url fails. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } } Controllers/Auth/ChangePasswordController.php 0000644 00000002421 15021222673 0015437 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Http\Requests\UpdatePasswordRequest; use App\Http\Requests\UpdateProfileRequest; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class ChangePasswordController extends Controller { public function edit() { abort_if(Gate::denies('profile_password_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('auth.passwords.edit'); } public function update(UpdatePasswordRequest $request) { auth()->user()->update($request->validated()); return redirect()->route('profile.password.edit')->with('message', __('global.change_password_success')); } public function updateProfile(UpdateProfileRequest $request) { $user = auth()->user(); $user->update($request->validated()); return redirect()->route('profile.password.edit')->with('message', __('global.update_profile_success')); } public function destroy() { $user = auth()->user(); $user->update([ 'email' => time() . '_' . $user->email, ]); $user->delete(); return redirect()->route('login')->with('message', __('global.delete_account_success')); } } Controllers/Auth/ResetPasswordController.php 0000644 00000001514 15021222673 0015336 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\ResetsPasswords; class ResetPasswordController extends Controller { /* |-------------------------------------------------------------------------- | Password Reset Controller |-------------------------------------------------------------------------- | | This controller is responsible for handling password reset requests | and uses a simple trait to include this behavior. You're free to | explore this trait and override any methods you wish to tweak. | */ use ResetsPasswords; /** * Where to redirect users after resetting their password. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; } Controllers/Auth/RegisterController.php 0000644 00000003771 15021222673 0014324 0 ustar 00 <?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Models\User; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; class RegisterController extends Controller { /* |-------------------------------------------------------------------------- | Register Controller |-------------------------------------------------------------------------- | | This controller handles the registration of new users as well as their | validation and creation. By default this controller uses a trait to | provide this functionality without requiring any additional code. | */ use RegistersUsers; /** * Where to redirect users after registration. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); } /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */ protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]); } } Kernel.php 0000644 00000004574 15021222673 0006507 0 ustar 00 <?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { protected $middleware = [ // \App\Http\Middleware\TrustHosts::class, \App\Http\Middleware\TrustProxies::class, \Illuminate\Http\Middleware\HandleCors::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\IncludeOrganizationId::class, ]; protected $middlewareAliases = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'org.id' => \App\Http\Middleware\IncludeOrganizationId::class, ]; protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\AuthGates::class, \App\Http\Middleware\SetLocale::class, ], 'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // \Illuminate\Routing\Middleware\ThrottleRequests::class . ':api', 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\AuthGates::class, ], ]; } Middleware/AuthGates.php 0000644 00000001536 15021222673 0011224 0 ustar 00 <?php namespace App\Http\Middleware; use App\Models\Role; use Closure; use Illuminate\Support\Facades\Gate; class AuthGates { public function handle($request, Closure $next) { $user = auth()->user(); if (! $user) { return $next($request); } $roles = Role::with('permissions')->get(); $permissionsArray = []; foreach ($roles as $role) { foreach ($role->permissions as $permissions) { $permissionsArray[$permissions->title][] = $role->id; } } foreach ($permissionsArray as $title => $roles) { Gate::define($title, function ($user) use ($roles) { return count(array_intersect($user->roles->pluck('id')->toArray(), $roles)) > 0; }); } return $next($request); } } Middleware/TrustHosts.php 0000644 00000000573 15021222673 0011501 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustHosts as Middleware; class TrustHosts extends Middleware { /** * Get the host patterns that should be trusted. * * @return array<int, string|null> */ public function hosts(): array { return [ $this->allSubdomainsOfApplicationUrl(), ]; } } Middleware/SetLocale.php 0000644 00000001160 15021222673 0011203 0 ustar 00 <?php namespace App\Http\Middleware; use Closure; class SetLocale { public function handle($request, Closure $next) { if (request('change_language')) { session()->put('language', request('change_language')); $language = request('change_language'); } elseif (session('language')) { $language = session('language'); } elseif (config('panel.primary_language')) { $language = config('panel.primary_language'); } if (isset($language)) { app()->setLocale($language); } return $next($request); } } Middleware/RedirectIfAuthenticated.php 0000644 00000001370 15021222673 0014056 0 ustar 00 <?php namespace App\Http\Middleware; use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next, string ...$guards): Response { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } } return $next($request); } } Middleware/TrimStrings.php 0000644 00000000575 15021222673 0011626 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware; class TrimStrings extends Middleware { /** * The names of the attributes that should not be trimmed. * * @var array<int, string> */ protected $except = [ 'current_password', 'password', 'password_confirmation', ]; } Middleware/PreventRequestsDuringMaintenance.php 0000644 00000000556 15021222673 0016033 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware; class PreventRequestsDuringMaintenance extends Middleware { /** * The URIs that should be reachable while maintenance mode is enabled. * * @var array<int, string> */ protected $except = [ // ]; } Middleware/EncryptCookies.php 0000644 00000000463 15021222673 0012276 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Cookie\Middleware\EncryptCookies as Middleware; class EncryptCookies extends Middleware { /** * The names of the cookies that should not be encrypted. * * @var array<int, string> */ protected $except = [ // ]; } Middleware/TrustProxies.php 0000644 00000001211 15021222673 0012020 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware { /** * The trusted proxies for this application. * * @var array<int, string>|string|null */ protected $proxies; /** * The headers that should be used to detect proxies. * * @var int */ protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB; } Middleware/Authenticate.php 0000644 00000000631 15021222673 0011750 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; use Illuminate\Http\Request; class Authenticate extends Middleware { /** * Get the path the user should be redirected to when they are not authenticated. */ protected function redirectTo(Request $request): ?string { return $request->expectsJson() ? null : route('login'); } } Middleware/IsAdmin.php 0000644 00000001555 15021222673 0010664 0 ustar 00 <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class IsAdmin { /** * Handle an incoming request. * * @param Request $request * @param Closure(Request): (\Illuminate\Http\Response|RedirectResponse) $next * @return JsonResponse|RedirectResponse|\Illuminate\Http\Response|mixed */ public function handle(Request $request, Closure $next) { if (auth()->user()->user_type == 1 || auth()->user()->user_type == 2){ return $next($request); }else{ return \response()->json([ 'message' => "Unauthenticated.", 'errors' => ["error" => ["Unauthenticated."]] ], Response::HTTP_UNAUTHORIZED); } } } Middleware/VerifyCsrfToken.php 0000644 00000000506 15021222673 0012416 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array<int, string> */ protected $except = [ 'api/*', ]; } .DS_Store 0000644 00000014004 15021222673 0006226 0 ustar 00 Bud1 r o l l e r C o n t r o l l e r sIlocblob A .������ K e r n e l . p h pIlocblob � .������ M i d d l e w a r eIlocblob � .������ R e q u e s t sIlocblob .������ R e q u e s t sbwspblob �bplist00�]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{300, 102}, {960, 741}} #/;R_klmno� � R e q u e s t svSrnlong R e s o u r c e sIlocblob � .������ R e s o u r c e sbwspblob �bplist00�]ShowStatusBar[ShowToolbar[ShowTabView_ContainerShowSidebar\WindowBounds[ShowSidebar _{{300, 102}, {960, 741}} #/;R_klmno� � R e s o u r c e svSrnlong @ � @ � @ � @ E DSDB ` � @ � @ � @ Requests/User/StoreWishlistRequest.php 0000644 00000001211 15021222673 0014175 0 ustar 00 <?php namespace App\Http\Requests\User; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreWishlistRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'product_id' => [ 'required', 'integer', 'unique:wishlists,product_id,NULL,id,user_id,' . auth()->id(), 'exists:products,id' ], ]; } public function messages() { return [ 'product_id.unique' => 'Product already exists in your wishlist.', ]; } } Requests/User/UpdateOrderRequest.php 0000644 00000007754 15021222673 0013612 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Models\Order; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Foundation\Http\FormRequest; class UpdateOrderRequest extends FormRequest { public function rules() { return [ 'rush_order' => [ 'nullable', 'in:'. implode(',', Order::RUSH_ORDER_RADIO), ], 'delivery_date' => [ 'required', 'date', ], 'event_date' => [ 'required', 'date', 'after_or_equal:delivery_date', ], 'delivery_type' => [ 'required', 'in:'. implode(',', Order::DELIVERY_TYPE), ], 'description' => [ 'nullable', 'string', ], 'shipping_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', ], 'billing_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', ], 'pickup_location_id' => [ 'exclude_if:delivery_type,Shipping', 'required_if:delivery_type,Pickup', 'integer', 'exists:store_locations,id', ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.customization' => [ 'nullable', 'json', ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.image' => [ 'nullable', new ValidateImage, ], ]; } public function messages() { return [ 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.json' => 'Customization for product #:position must be json.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', 'rush_order.in' => ':attribute can only be '. implode(',', Order::RUSH_ORDER_RADIO), ]; } } Requests/User/StoreOrderRequest.php 0000644 00000016166 15021222673 0013461 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Models\Order; use App\Rules\ValidateCoupon; use App\Rules\ValidateDate; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Foundation\Http\FormRequest; class StoreOrderRequest extends FormRequest { public function rules() { $rules = [ 'rush_order' => [ 'nullable', 'in:'. implode(',', Order::RUSH_ORDER_RADIO), ], 'delivery_date' => [ 'required', 'date', 'after:today', new ValidateDate, ], 'event_date' => [ 'required', 'date', 'after:today', 'after_or_equal:delivery_date', ], 'delivery_type' => [ 'required', 'in:'. implode(',', Order::DELIVERY_TYPE), ], 'description' => [ 'nullable', 'string', ], 'shipping_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', ], 'career_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'service_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'package_type_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'billing_address_id' => [ 'required', 'integer', 'exists:address_books,id', ], 'pickup_location_id' => [ 'exclude_if:delivery_type,Shipping', 'required_if:delivery_type,Pickup', 'integer', 'exists:store_locations,id', ], 'coupon_code' => [ 'nullable', 'exists:coupons,code', new ValidateCoupon, ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.approve_consent' => [ 'required', 'boolean', ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.item_id' => [ 'nullable', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.customization' => [ 'nullable', 'array', ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.image' => [ 'nullable', new ValidateImage, ], 'products.*.notes' => [ 'nullable', 'string', ], 'payment_type' => [ 'required', 'in:Credit Card,Purchase Order', ], ]; if ($this->input('payment_type') == 'Credit Card') { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['expiry_year'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:Y', ]; $rules['expiry_month'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:m', ]; $rules['ccv'] = [ 'exclude_if:payment_type,Purchase Order', 'regex:/^[0-9]+$/', ]; $rules['save_card'] = [ 'exclude_if:payment_type,Purchase Order', 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } else if ($this->input('payment_type') == 'Purchase Order'){ $rules['purchase_order_number'] = [ 'required_if:payment_type,Purchase Order', 'string', 'max:25', ]; $rules['purchase_order_copy'] = [ 'required_if:payment_type,Purchase Order', 'mimes:pdf,jpg,jpeg,png,xlsx', ]; } return $rules; } public function messages() { return [ 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.approve_consent.required' => 'Consent for product #:position is required.', 'products.*.approve_consent.boolean' => 'Consent for product #:position can only be 1 or 0.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.array' => 'Customization for product #:position must be an array.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', 'rush_order.in' => ':attribute can only be '. implode(',', Order::RUSH_ORDER_RADIO), 'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.', 'ccv.regex' => 'Ccv must be a valid number.', ]; } } Requests/User/AddOrderPaymentRequest.php 0000644 00000003155 15021222673 0014405 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Models\Order; use Illuminate\Foundation\Http\FormRequest; class AddOrderPaymentRequest extends FormRequest { public function rules() { $order = Order::find(request()->route('order')->id); if ($order->payment_status == 'Paid'){ $rules['payment_status'] = [ 'required', ]; } else { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['card_number'] = [ 'required', ]; $rules['expiry_year'] = [ 'date_format:Y', ]; $rules['expiry_month'] = [ 'date_format:m', ]; $rules['ccv'] = [ 'integer', ]; $rules['save_card'] = [ 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } return $rules; } public function messages(): array { return [ 'payment_method.required' => 'Credit card details or vault id needed.', 'payment_status.required' => 'This order has already been paid', ]; } } Requests/User/OrderCustomizationSvgRequest.php 0000644 00000001366 15021222673 0015711 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Models\Order; use App\Rules\ValidateCoupon; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Foundation\Http\FormRequest; class OrderCustomizationSvgRequest extends FormRequest { public function rules(): array { return [ 'order_id' => [ 'required', 'exists:orders,id' ], 'order_item_id' => [ 'required', 'exists:order_items,id' ], 'customization_index' => [ 'required', 'integer', 'gte:0' ], 'file_content' => [ 'required', ], ]; } } Requests/User/ShippingQuoteRequest.php 0000644 00000003052 15021222673 0014156 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Rules\ValidateProductPrice; use Illuminate\Foundation\Http\FormRequest; class ShippingQuoteRequest extends FormRequest { public function rules() { return [ 'career_code' => [ 'required' ], 'service_code' => [ 'nullable' ], 'package_type_code' => [ 'required_with:service_code' ], 'products' => [ 'required', 'array' ], 'products.*.product_id' => [ 'required', 'exists:products,id' ], 'products.*.price_id' => [ 'required', new ValidateProductPrice, ], 'products.*.quantity' => [ 'required', 'min:1', ], 'shipping_address_id' => [ 'nullable', 'exists:address_books,id' ], 'zipcode' => [ 'required_without:shipping_address_id', 'integer', 'regex:/^[0-9]{5}$/' // 'regex:/^\d{5}(-\d{4})?$/' ], 'is_residential' => [ 'required', 'boolean' ], ]; } public function messages() { return [ 'zipcode.integer' => 'Zipcode must only contain numbers.', 'zipcode.regex' => 'Zipcode length must be 5 digits.', ]; } } Requests/User/StoreCartRequest.php 0000644 00000001647 15021222673 0013275 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Rules\AttributeOptionBelongsToAttribute; use App\Rules\ValidateProductPrice; use Illuminate\Foundation\Http\FormRequest; class StoreCartRequest extends FormRequest { public function rules() { return [ 'product_id' => [ 'required', 'integer', 'exists:products,id', ], 'price_id' => [ 'required', 'integer', 'exists:product_prices,id', new ValidateProductPrice, ], 'quantity' => [ 'required', 'integer', 'min:1', ], 'customization' => [ 'nullable', 'json', ], 'attachment' => [ 'nullable', 'mimes:pdf', ], ]; } } Requests/User/OrderTotalsRequest.php 0000644 00000010576 15021222673 0013632 0 ustar 00 <?php namespace App\Http\Requests\User; use App\Models\Order; use App\Rules\ValidateCoupon; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Foundation\Http\FormRequest; class OrderTotalsRequest extends FormRequest { public function rules(): array { return [ 'rush_order' => [ 'nullable', 'in:'. implode(',', Order::RUSH_ORDER_RADIO), ], 'shipping_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', ], 'is_residential' => [ /*'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping',*/ 'nullable', 'boolean', ], 'career_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'service_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'package_type_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'billing_address_id' => [ 'required', 'integer', 'exists:address_books,id', ], 'pickup_location_id' => [ 'exclude_if:delivery_type,Shipping', 'required_if:delivery_type,Pickup', 'integer', 'exists:store_locations,id', ], 'coupon_code' => [ 'nullable', 'exists:coupons,code', new ValidateCoupon, ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.customization' => [ 'nullable', 'array', ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.image' => [ 'nullable', new ValidateImage, ], ]; } public function messages(): array { return [ 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.array' => 'Customization for product #:position must be an array.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', 'rush_order.in' => 'Rush Order can only be "'. implode('", "', Order::RUSH_ORDER_RADIO).'"', ]; } } Requests/Admin/SalesComparisonRequest.php 0000644 00000002071 15021222673 0014573 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportYearOverYear; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class SalesComparisonRequest extends FormRequest { public function authorize() { return Gate::allows('sales_comparison_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:' . implode(',', array_keys(ReportYearOverYear::REPORTS_MODE)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/JobsCompletedRequest.php 0000644 00000001064 15021222673 0014224 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportJobsCompleted; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; use Gate; class JobsCompletedRequest extends FormRequest { public function authorize() { return Gate::allows('report_jobs_completed_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportJobsCompleted::REPORTS_MODE)) ], ]; } } Requests/Admin/UpdateRoleRequest.php 0000644 00000001723 15021222673 0013540 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateRoleRequest extends FormRequest { public function authorize() { return Gate::allows('role_edit'); } public function rules() { return [ 'title' => [ 'string', 'required', 'unique:roles,title,' . request()->route('role')->id ], 'permissions' => [ 'required', 'array', ], 'permissions.*' => [ 'integer', 'exists:permissions,id', ], ]; } public function messages(): array { return [ 'title.unique' => 'Title must be unique.', 'permissions.*.integer' => 'Permission :position must be an integer.', 'permissions.*.exists' => 'Invalid permission on position :position.', ]; } } Requests/Admin/UpdateVariationRequest.php 0000644 00000002526 15021222673 0014575 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Variation; use Illuminate\Foundation\Http\FormRequest; use Gate; class UpdateVariationRequest extends FormRequest { public function authorize() { return Gate::allows('variation_edit'); } public function rules() { return [ 'type' => [ 'required', 'string', ], 'value' => [ 'required', 'string', 'unique:variations,value,' . request()->route('variation')->id, ], 'vendor_id' => [ 'nullable', 'exists:vendors,id', ], 'vendor_price' => [ 'required_with:vendor_id', 'numeric', 'gt:0', ], 'sku' => [ 'required_with:vendor_id', 'string', 'unique:variations,sku,'. request()->route('variation')->id, ], 'status' => [ 'required', 'integer', 'in:' . implode(',', array_keys(Variation::STATUS_RADIO)), ], ]; } public function messages() { return [ 'vendor_price.gt' => 'The vendor price field must be greater than zero.', ]; } } Requests/Admin/StoreAttributeRequest.php 0000644 00000001436 15021222673 0014455 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Attribute; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreAttributeRequest extends FormRequest { public function authorize() { return Gate::allows('attribute_create'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:attributes', ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(Attribute::STATUS_RADIO)), ], ]; } public function messages() { return [ 'name.unique' => 'This attribute already exists', ]; } } Requests/Admin/UpdateSiteSettingRequest.php 0000644 00000001441 15021222673 0015076 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; class UpdateSiteSettingRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('site_setting_edit'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'key' => [ 'required', Rule::unique('site_settings')->ignore(request()->route('site_setting')->id), ], 'value' => [ 'required', ], ]; } } Requests/Admin/SalesTaxSummarizationReportRequest.php 0000644 00000000754 15021222673 0017202 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class SalesTaxSummarizationReportRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'date_from' => [ 'nullable', 'date', ], 'date_to' => [ 'required_with:date_from', 'date' ], ]; } } Requests/Admin/MassDestroyPermissionRequest.php 0000644 00000001014 15021222673 0016013 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyPermissionRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('permission_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:permissions,id', ]; } } Requests/Admin/StoreUserRequest.php 0000644 00000005647 15021222673 0013440 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\User; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreUserRequest extends FormRequest { public function authorize() { return Gate::allows('user_create'); } public function rules() { return [ 'name' => [ 'string', 'required', ], 'email' => [ 'required', 'unique:users', ], 'password' => [ 'required', 'regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/i', ], 'phone_number' => [ 'nullable', 'max:20', ], 'company' => [ 'nullable', 'string', 'max:50', ], 'fax_number' => [ 'nullable', 'string', 'max:50', ], 'roles' => [ 'required', 'array', ], 'roles.*' => [ 'integer', 'exists:roles,id', ], 'user_type' => [ 'required', 'integer', 'in:'.implode(",", array_keys(User::USER_TYPE_RADIO)) ], 'status' => [ 'required', 'integer', 'in:'.implode(',', array_keys(User::STATUS_RADIO)) ], 'profile_image' => [ 'nullable', 'mimes:jpg,gif,png', ], 'reminder_duration' => [ 'nullable', 'in:' . implode(',', User::REMINDER_DURATION), ], 'birth_date' => [ 'nullable', 'date', 'before:today' ], 'secondary_email' => [ 'nullable', 'email', ], 'secondary_phone' => [ 'nullable', 'max:20', ], 'secondary_name' => [ 'nullable', 'max:20', ], 'sms_notification' => [ 'in:0,1', ], ]; } public function messages() { return [ 'roles.*.integer' => 'Role #:position must be an integer.', 'roles.*.exists' => 'Invalid role on position #:position.', 'user_type.in' => "Invalid user type.", 'password.regex' => 'Password should contain at least 8 characters, one letter, one number & one special character.', 'phone_number.integer' => 'Phone number can only contain numbers.', 'secondary_phone.integer' => 'Secondary phone can only contain numbers.', 'reminder_duration.in' => ':attribute can only be '. implode(',', User::REMINDER_DURATION), ]; } } Requests/Admin/MassDestroyAddressBookRequest.php 0000644 00000001021 15021222673 0016061 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyAddressBookRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('address_book_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:address_books,id', ]; } } Requests/Admin/MassDestroyAttributeRequest.php 0000644 00000001011 15021222673 0015623 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyAttributeRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('attribute_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:attributes,id', ]; } } Requests/Admin/StoreStockLocationRequest.php 0000644 00000001660 15021222673 0015265 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreStockLocationRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('stock_location_create'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'location' => [ 'required', 'unique:stock_locations', 'string', 'max:50', ], 'status' => [ 'required', 'in:0,1', ], ]; } public function messages() { return [ 'location.unique' => 'This location already exists.' ]; } } Requests/Admin/StoreOfficeSupplyRequest.php 0000644 00000002724 15021222673 0015123 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\OfficeSupplies; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class StoreOfficeSupplyRequest extends FormRequest { public function authorize() { return Gate::allows('office_supplies_create'); } public function rules() { return [ 'vendor_id' => [ 'required', 'integer', 'exists:vendors,id', ], 'sku' => [ 'string', 'max:50', 'required', 'unique:office_supplies', ], 'name' => [ 'string', 'max:50', 'required', ], 'description' => [ 'string', 'nullable', 'max:2055', ], 'featured_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:5120', ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(OfficeSupplies::STATUS_RADIO)), ], ]; } public function messages() { return [ 'featured_image.uploaded' => "The featured image must not be greater than 5MB.", 'featured_image.max' => "The featured image must not be greater than 5MB.", ]; } } Requests/Admin/MassDestroyOrderRequest.php 0000644 00000000775 15021222673 0014753 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyOrderRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('order_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:orders,id', ]; } } Requests/Admin/StoreAddressBookRequest.php 0000644 00000004366 15021222673 0014717 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreAddressBookRequest extends FormRequest { public function authorize() { return (auth()->user()->user_type == 3 || Gate::allows('address_book_create')); } public function rules() { return [ 'user_id' => [ auth()->user()->user_type == 1 ? 'required' : 'nullable', 'exists:users,id', ], 'company_name' => [ 'nullable', 'string', 'max:50', ], 'primary_contact_name' => [ 'required', 'string', 'max:50', ], 'primary_contact_email' => [ 'required', 'email', ], 'secondary_contact_name' => [ 'nullable', 'string', 'max:50', ], 'secondary_contact_email' => [ 'nullable', 'email', ], 'address_line_1' => [ 'required', 'string', ], 'address_line_2' => [ 'nullable', 'string', ], 'city' => [ 'required', 'string', 'max:50', ], 'state_id' => [ 'required', 'integer', 'exists:state_sales_taxes,id', ], 'zipcode' => [ 'required', 'integer', 'max_digits:10', ], 'phone_number' => [ 'nullable', 'regex:/^[0-9]+$/', 'max_digits:20', ], 'is_default' => [ 'required', 'in:0,1', ], ]; } public function messages() { return [ 'zipcode.max_digits' => 'Zipcode can not contain more than 10 digits.', 'phone_number.max_digits' => 'Phone number can not contain more than 20 digits.', 'phone_number.regex' => 'Phone number can only contain numbers.', ]; } } Requests/Admin/StoreProductPriceRequest.php 0000644 00000001531 15021222673 0015111 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreProductPriceRequest extends FormRequest { public function authorize() { return Gate::allows('product_price_create'); } public function rules() { return [ 'product_id' => [ 'required', 'integer', ], 'qty_from' => [ 'required', 'integer', 'min:1', 'max:2147483647', ], 'qty_to' => [ 'required', 'integer', 'min:1', 'max:2147483647', 'gte:qty_from' ], 'price' => [ 'numeric', 'required', ], ]; } } Requests/Admin/UpdateReviewRequest.php 0000644 00000001024 15021222673 0014072 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateReviewRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'rating' => [ 'required', 'integer', 'between:0,5', ], 'comment' => [ 'nullable', 'string', 'max:500', ], ]; } } Requests/Admin/StoreSiteSettingRequest.php 0000644 00000001321 15021222673 0014745 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreSiteSettingRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('site_setting_create'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'key' => [ 'required', 'unique:site_settings,key', ], 'value' => [ 'required', ], ]; } } Requests/Admin/UpdateOrderRequest.php 0000644 00000025301 15021222673 0013710 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Coupon; use App\Models\Order; use App\Rules\AddressBelongsToUser; use App\Rules\LimitProductQuantityIncrease; use App\Rules\ValidateCoupon; use App\Rules\ValidateDate; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateOrderRequest extends FormRequest { public function authorize() { return Gate::allows('order_edit'); } public function rules() { $order = request()->route('order')->id; $order = Order::find($order); $rules = [ 'user_id' => [ 'required', 'integer', 'exists:users,id', ], 'order_type' => [ 'nullable', 'in:'. implode(',', Order::ORDER_TYPE_RADIO), ], 'rush_order' => [ 'nullable', 'in:'. implode(',', Order::RUSH_ORDER_RADIO), ], 'delivery_date' => [ 'nullable', 'date', ], 'event_date' => [ 'required', 'date', 'after_or_equal:delivery_date', 'after_or_equal:date_scheduled', ], 'date_scheduled' => [ 'nullable', 'date', new ValidateDate, ], 'date_pick_or_ship_by' => [ 'nullable', 'date', 'after_or_equal:date_scheduled', new ValidateDate, ], 'current_status_id' => [ 'required', 'integer', 'exists:statuses,id', ], 'admin_approved' => [ 'nullable', 'in:0,1', ], 'delivery_type' => [ 'required', 'in:'. implode(',', Order::DELIVERY_TYPE), ], 'description' => [ 'nullable', 'string', ], 'waive_off_sales_tax' => [ 'nullable', 'boolean', ], 'waive_off_sales_tax_reason' => [ 'required_if:waive_off_sales_tax,1', 'in:'. implode(',', Order::WAIVE_OFF_OPTIONS), ], 'resale_number' => [ 'required_if:waive_off_sales_tax_reason,Reseller Exemption', ], 'shipping_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', new AddressBelongsToUser ], 'is_residential' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'boolean', ], 'billing_address_id' => [ 'required', 'integer', 'exists:address_books,id', new AddressBelongsToUser ], 'pickup_location_id' => [ 'exclude_if:delivery_type,Shipping', 'required_if:delivery_type,Pickup', 'integer', 'exists:store_locations,id', ], 'payment_status' => [ 'required', 'in:'. implode(',', Order::PAYMENT_STATUS_RADIO), ], 'payment_mode' => [ 'required', 'in:'. implode(',', Order::PAYMENT_MODE_RADIO), ], 'payment_amount' => [ 'nullable', 'numeric', ], 'coupon_code' => [ 'nullable', 'exists:coupons,code', new ValidateCoupon, ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.item_id' => [ 'nullable', new LimitProductQuantityIncrease, ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.notes' => [ 'nullable', 'string', ], ]; if ($order->coupon_id != null) { //If order previously had discount $existing_coupon = Coupon::find($order->coupon_id); if ($existing_coupon?->id == $order->coupon_id) { //If current discount code & existing discount code are same $rules['coupon_code'] = [ 'nullable', 'exists:coupons,code', ]; } else { //If order does not have discount or the discount coupon has changed $rules['coupon_code'] = [ 'nullable', 'exists:coupons,code', new ValidateCoupon, ]; } } if ($this->input('payment_status') == 'Paid' && $order->payment_status != "Paid") { $rules['payment_type'] = [ 'required', 'in:'. implode(',', Order::PAYMENT_TYPE_RADIO), ]; if ($this->input('payment_type') == 'Credit Card') { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['expiry_year'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'date_format:Y', ]; $rules['expiry_month'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'date_format:m', ]; $rules['ccv'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'regex:/^[0-9]+$/', ]; $rules['save_card'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } else if($this->input('payment_type') == 'Purchase Order') { $rules['purchase_order_number'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'string', 'max:25', ]; if ($order->purchase_order_copy == null) { $rules['purchase_order_copy'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'mimes:pdf,jpg,jpeg,png,xlsx', ]; } } else if($this->input('payment_type') == 'Check') { $rules['cheque_number'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'string', 'max:25', ]; } } return $rules; } public function messages() { return [ 'date_pick_or_ship_by.required' => 'The date pick up / ship by is required.', 'date_pick_or_ship_by.after_or_equal' => 'The date pick up / ship by must be date after or equal today.', 'date_pick_or_ship_by.date' => 'Date pick up / ship by must be a valid date.', 'waive_off_sales_tax.boolean' => 'The waive off sales tax field must be 0 or 1.', 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.required' => 'Customization for product #:position required.', 'products.*.customization.array' => 'Customization for product #:position must be an array.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', 'rush_order.in' => ':attribute can only be '. implode(',', Order::RUSH_ORDER_RADIO), 'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.', 'waive_off_sales_tax_reason.required_if' => 'The waive off sales tax reason is required when waive off sales tax is true.', 'ccv.regex' => 'Ccv must be a valid number.', 'cheque_number.required' => 'The check number field is required.', 'is_residential.required_if' => 'The residential field is required when delivery type is "Shipping".', ]; } } Requests/Admin/StoreOrderRequest.php 0000644 00000025025 15021222673 0013565 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use App\Rules\AddressBelongsToUser; use App\Rules\ValidateCoupon; use App\Rules\ValidateDate; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class StoreOrderRequest extends FormRequest { public function authorize() { return Gate::allows('order_create'); } public function rules() { $rules = [ 'user_id' => [ 'required', 'integer', 'exists:users,id', ], 'order_type' => [ 'nullable', 'in:'. implode(',', Order::ORDER_TYPE_RADIO), ], 'rush_order' => [ 'nullable', 'in:'. implode(',', Order::RUSH_ORDER_RADIO), ], 'delivery_date' => [ 'nullable', 'date', 'after_or_equal:today', new ValidateDate, ], 'event_date' => [ 'required', 'date', 'after_or_equal:today', 'after_or_equal:delivery_date', 'after_or_equal:date_scheduled', ], 'date_scheduled' => [ 'required', 'date', 'after_or_equal:today', new ValidateDate, ], 'date_pick_or_ship_by' => [ 'required', 'date', 'after_or_equal:today', 'after_or_equal:date_scheduled', new ValidateDate, ], 'current_status_id' => [ 'required', 'integer', 'exists:statuses,id', ], 'delivery_type' => [ 'required', 'in:'. implode(',', Order::DELIVERY_TYPE), ], 'description' => [ 'nullable', 'string', ], 'waive_off_sales_tax' => [ 'nullable', 'boolean', ], 'waive_off_sales_tax_reason' => [ 'required_if:waive_off_sales_tax,1', 'in:'. implode(',', Order::WAIVE_OFF_OPTIONS), ], 'resale_number' => [ 'required_if:waive_off_sales_tax_reason,Reseller Exemption', ], 'shipping_address_id' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'integer', 'exists:address_books,id', new AddressBelongsToUser ], 'is_residential' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'boolean', ], 'career_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'service_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'package_type_code' => [ 'exclude_if:delivery_type,Pickup', 'required_if:delivery_type,Shipping', 'string', ], 'billing_address_id' => [ 'required', 'integer', 'exists:address_books,id', new AddressBelongsToUser ], 'pickup_location_id' => [ 'exclude_if:delivery_type,Shipping', 'required_if:delivery_type,Pickup', 'integer', 'exists:store_locations,id', ], 'payment_status' => [ 'required', 'in:'. implode(',', Order::PAYMENT_STATUS_RADIO), ], 'payment_mode' => [ 'required', 'in:'. implode(',', Order::PAYMENT_MODE_RADIO), ], 'payment_amount' => [ 'nullable', 'numeric', ], 'coupon_code' => [ 'nullable', 'exists:coupons,code', new ValidateCoupon, ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.item_id' => [ 'nullable', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.customization' => [ 'nullable', 'array', ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.image' => [ 'nullable', new ValidateImage, ], 'products.*.notes' => [ 'nullable', 'string', ], ]; if ($this->input('payment_status') == 'Paid') { $rules['payment_type'] = [ 'required', 'in:'. implode(',', Order::PAYMENT_TYPE_RADIO), ]; if ($this->input('payment_type') == 'Credit Card') { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['expiry_year'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'date_format:Y', ]; $rules['expiry_month'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'date_format:m', ]; $rules['ccv'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'regex:/^[0-9]+$/', ]; $rules['save_card'] = [ 'exclude_if:payment_status,Unpaid', 'exclude_if:payment_type,Purchase Order', 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } else if($this->input('payment_type') == 'Purchase Order') { $rules['purchase_order_number'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'string', 'max:25', ]; $rules['purchase_order_copy'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'mimes:pdf,jpg,jpeg,png,xlsx', ]; } else if($this->input('payment_type') == 'Check') { $rules['cheque_number'] = [ 'exclude_if:payment_status,Unpaid', 'required', 'string', 'max:25', ]; } } return $rules; } public function messages() { return [ 'date_pick_or_ship_by.required' => 'The date pick up / ship by is required.', 'date_pick_or_ship_by.after_or_equal' => 'The date pick up / ship by must be date after or equal today.', 'date_pick_or_ship_by.date' => 'Date pick up / ship by must be a valid date.', 'waive_off_sales_tax.boolean' => 'The waive off sales tax field must be 0 or 1.', 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.required' => 'Customization for product #:position required.', 'products.*.customization.array' => 'Customization for product #:position must be an array.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', 'rush_order.in' => ':attribute can only be '. implode(',', Order::RUSH_ORDER_RADIO), 'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.', 'waive_off_sales_tax_reason.required_if' => 'The waive off sales tax reason is required when waive off sales tax is true.', 'ccv.regex' => 'Ccv must be a valid number.', 'cheque_number.required' => 'The check number field is required.', 'is_residential.required_if' => 'The residential field is required when delivery type is "Shipping".', ]; } } Requests/Admin/UpdateOfficeSupplyRequest.php 0000644 00000003000 15021222673 0015235 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\OfficeSupplies; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateOfficeSupplyRequest extends FormRequest { public function authorize() { return Gate::allows('office_supplies_edit'); } public function rules() { return [ 'vendor_id' => [ 'required', 'integer', 'exists:vendors,id', ], 'sku' => [ 'string', 'max:50', 'required', 'unique:office_supplies,sku,' . request()->route('office_supply')->id, ], 'name' => [ 'string', 'max:50', 'required', ], 'description' => [ 'string', 'nullable', 'max:2055', ], 'featured_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:5120', ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(OfficeSupplies::STATUS_RADIO)), ], ]; } public function messages() { return [ 'featured_image.uploaded' => "The featured image must not be greater than 5MB.", 'featured_image.max' => "The featured image must not be greater than 5MB.", ]; } } Requests/Admin/AddOrderPaymentRequest.php 0000644 00000006022 15021222673 0014513 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use Gate; use Illuminate\Foundation\Http\FormRequest; class AddOrderPaymentRequest extends FormRequest { public function authorize() { return Gate::allows('order_edit'); } public function rules() { $order = Order::find(request()->route('order')->id); if ($order->payment_status == 'Paid'){ $rules['payment_status'] = [ 'required', ]; } else { $rules = [ 'payment_type' => [ 'required', 'in:'. implode(',', Order::PAYMENT_TYPE_RADIO), ], 'amount' => [ 'required', 'min:1', ], ]; if ($this->input('payment_type') == 'Credit Card') { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['expiry_year'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:Y', ]; $rules['expiry_month'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:m', ]; $rules['ccv'] = [ 'exclude_if:payment_type,Purchase Order', 'integer', ]; $rules['save_card'] = [ 'exclude_if:payment_type,Purchase Order', 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } else if($this->input('payment_type') == 'Purchase Order') { $rules['purchase_order_number'] = [ 'required', 'string', 'max:25', ]; $rules['purchase_order_copy'] = [ 'required', 'mimes:pdf,jpg,jpeg,png,xlsx', ]; } else if($this->input('payment_type') == 'Check') { $rules['cheque_number'] = [ 'required', 'string', 'max:25', ]; } } return $rules; } public function messages(): array { return [ 'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.', 'amount.min' => 'Enter a valid amount.', 'payment_status.required' => 'This order has already been paid', ]; } } Requests/Admin/ProductsImportRequest.php 0000644 00000001252 15021222673 0014467 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; use Gate; class ProductsImportRequest extends FormRequest { public function authorize() { return Gate::allows('import_product_create'); } public function rules() { return [ 'file' => [ 'required', 'mimes:xlsx', ], ]; } public function messages(): array { return [ 'file.required' => 'Kindly upload a file.', 'file.mimes' => 'Only Excel file with xlsx extension can be uploaded.', ]; } } Requests/Admin/AddOrderPartialPaymentRequest.php 0000644 00000005151 15021222673 0016032 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use App\Models\OrderPartialPayments; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class AddOrderPartialPaymentRequest extends FormRequest { public function authorize() { return Gate::allows('order_edit'); } public function rules() { $rules = [ 'payment_type' => [ 'required', 'in:'. implode(',', OrderPartialPayments::PAYMENT_TYPE_RADIO), ], 'payment_amount' => [ 'required', 'min:1', ], ]; if ($this->input('payment_type') == 'Credit Card') { if ($this->input('vault_id')) { $rules['vault_id'] = [ 'exclude_if:payment_type,Purchase Order', 'gt:0', ]; } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) { $rules['expiry_year'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:Y', ]; $rules['expiry_month'] = [ 'exclude_if:payment_type,Purchase Order', 'date_format:m', ]; $rules['ccv'] = [ 'exclude_if:payment_type,Purchase Order', 'integer', ]; $rules['save_card'] = [ 'exclude_if:payment_type,Purchase Order', 'boolean', 'nullable', ]; } else { $rules['payment_method'] = [ 'required', ]; } } else if($this->input('payment_type') == 'Purchase Order') { $rules['purchase_order_number'] = [ 'required', 'string', 'max:25', ]; $rules['purchase_order_copy'] = [ 'required', 'mimes:pdf,jpg,jpeg,png,xlsx', ]; } else if($this->input('payment_type') == 'Check') { $rules['cheque_number'] = [ 'required', 'string', 'max:25', ]; } return $rules; } public function messages(): array { return [ 'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.', 'amount.min' => 'Enter a valid amount.', ]; } } Requests/Admin/StorePurchaseOrderRequest.php 0000644 00000007661 15021222673 0015266 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Product; use App\Models\PurchaseOrder; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Http\FormRequest; class StorePurchaseOrderRequest extends FormRequest { public function authorize() { return Gate::allows('purchase_order_create'); } public function rules() { $rules = [ 'payment_terms' => [ 'required', 'in:'.implode(',', PurchaseOrder::PAYMENT_TERMS) ], 'reference' => [ 'nullable', ], 'shipping_address' => [ 'required', ], 'billing_address' => [ 'required', ], 'shipping_speed' => [ 'required', 'in:'. implode(',',PurchaseOrder::SHIPPING_SPEED), ], 'special_notes' => [ 'nullable', ], 'products' => [ 'required_without:office_supplies', 'array', ], 'products.*.product_id' => [ 'required', 'integer', // 'exists:products,id', ], 'products.*.price_id' => [ 'required', 'integer', // 'exists:product_prices,id' ], 'products.*.variation_id' => [ 'nullable', ], 'products.*.product_type' => [ 'required', 'in:'. implode(',', array_keys(Product::PRODUCT_TYPE)), ], 'products.*.orders' => [ 'required', 'array', ], 'products.*.orders.*' => [ function ($attribute, $value, $fail) { if (is_array($value)) { if (array_key_exists('extra_quantity', $value)) { if ($value['extra_quantity'] < 1) $fail('The extra_quantity should be greater than zero.'); } else if (array_key_exists('order_id', $value) && array_key_exists('quantity', $value)) { if ($value['quantity'] < 1) $fail('The quantity should be greater than zero.'); } else { $fail('The extra_quantity or order_id and quantity is required for product :position.'); } } else { $fail('The extra_quantity or order_id and quantity is required for product :position.'); } }, ], 'office_supplies' => [ 'required_without:products', 'array', ], 'office_supplies.*.product_id' => [ 'nullable', 'integer', 'exists:office_supplies,id', ], 'office_supplies.*.vendor_id' => [ 'nullable', 'integer', 'exists:vendors,id', ], 'office_supplies.*.quantity' => [ 'nullable', 'integer', 'min:1' ], ]; return $rules; } public function messages() { return [ 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', ]; } } Requests/Admin/UpdateProductRequest.php 0000644 00000025044 15021222673 0014261 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Product; use App\Rules\SupplierProductNumberBelongsToProductPrice; use App\Rules\ValidatePriceRangeQuantity; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateProductRequest extends FormRequest { public function authorize() { return Gate::allows('product_edit'); } public function rules() { return [ 'category_id' => [ 'required', 'numeric', 'exists:categories,id' ], 'vendor_id' => [ 'required_if:product_type,standard', 'integer', 'exists:vendors,id', ], 'sku' => [ 'string', 'max:50', 'required', 'unique:products,sku,' . request()->route('product')->id, ], 'name' => [ 'string', 'max:50', 'required', ], // 'slug' => [ // 'string', // 'max:50', // 'required', // 'unique:products,slug,' . request()->route('product')->id, // ], 'description' => [ 'string', 'nullable', ], 'featured_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:5120', ], 'gallery_images' => [ 'array', ], 'gallery_images.*' => [ 'mimes:jpg,gif,png', ], 'engraving' => [ 'required', 'integer', 'in:0,1', ], 'color_engraving' => [ 'required', 'integer', 'in:0,1', ], 'engraving_fee' => [ 'required', 'numeric', 'min:0', ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(Product::STATUS_RADIO)), ], 'is_draft' => [ 'required', 'bool', 'in:'. implode(',', array_keys(Product::DRAFT_RADIO)), ], 'product_type' => [ 'required', 'in:'. implode(',', array_keys(Product::PRODUCT_TYPE)), ], 'variations' => [ 'required', 'array', ], 'variations.*' => [ 'required', 'integer', 'exists:variations,id', ], 'combinations' => [ 'required', 'array', ], 'combinations.*.variations' => [ 'required', 'array', ], 'combinations.*.product_sketch' => [ 'mimes:svg', 'max:5120', ], 'combinations.*.variations.*' => [ 'required', 'integer', 'exists:variations,id', 'in:'.implode(',', $this->variations ?? []), ], 'combinations.*.vendor_price' => [ 'required_if:product_type,standard', 'numeric', 'gt:0', ], 'combinations.*.supplier_prod_number' => [ 'required', 'string', 'distinct', new SupplierProductNumberBelongsToProductPrice, ], 'combinations.*.shipping_weight' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.length' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.width' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.height' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.price_ranges' => [ 'required', 'array', ], 'combinations.*.price_ranges.*.qty_from' => [ 'required', 'integer', 'min:1', 'max:2147483647', new ValidatePriceRangeQuantity, ], 'combinations.*.price_ranges.*.qty_to' => [ 'required', 'integer', 'min:1', 'max:2147483647', 'gt:combinations.*.price_ranges.*.qty_from', ], 'combinations.*.price_ranges.*.price' => [ 'required', 'numeric', 'gt:0', 'max:2147483647', ], ]; } public function messages() { return [ 'variations.*.integer' => 'Variation on position #:position must be integer.', 'variations.*.exists' => 'Invalid variation on #:position.', 'combinations.*.variations.array' => 'Variations for combination #:position must be an array.', 'combinations.*.variations.required' => 'Variations for combination #:position are required.', 'combinations.*.product_sketch.required_if' => 'Product sketch for combination #:position field is required when engraving is 1.', 'combinations.*.product_sketch.mimes' => 'Product sketch for combination #:position field must be of type svg.', 'combinations.*.variations.*.integer' => 'Variations for combination #:position must be integer.', 'combinations.*.variations.*.exists' => 'Invalid variations for combination #:position.', 'combinations.*.variations.*.in' => 'Variations for combination #:position can only contain values selected above.', 'combinations.*.vendor_price.required' => 'Vendor price for combination #:position is required.', 'combinations.*.vendor_price.numeric' => 'Vendor price for combination #:position must be numeric.', 'combinations.*.vendor_price.gt' => 'Vendor price for combination #:position should be greater than 0.', 'gallery_images.*.mimes' => 'Invalid image on position #:position. Only image type of jpg,gif,png are supported.', 'combinations.*.supplier_prod_number.required' => 'Supplier production number for combination #:position is required.', 'combinations.*.supplier_prod_number.unique' => 'Supplier production number for combination #:position must be unique.', 'combinations.*.supplier_prod_number.string' => 'Supplier production number for combination #:position must be string.', 'combinations.*.supplier_prod_number.distinct' => 'Supplier production number for combination #:position must be distinct.', 'combinations.*.shipping_weight.required' => 'Shipping weight for combination #:position is required.', 'combinations.*.shipping_weight.numeric' => 'Shipping weight for combination #:position must be numeric.', 'combinations.*.shipping_weight.gt' => 'Shipping weight for combination #:position must be greater than 0.', 'combinations.*.length.required' => 'Length for combination #:position is required.', 'combinations.*.length.numeric' => 'Length for combination #:position must be numeric.', 'combinations.*.length.gt' => 'Length for combination #:position must be greater than 0.', 'combinations.*.width.required' => 'Width for combination #:position is required.', 'combinations.*.width.numeric' => 'Width for combination #:position must be numeric.', 'combinations.*.width.gt' => 'Width for combination #:position must be greater than 0.', 'combinations.*.height.required' => 'Height for combination #:position is required.', 'combinations.*.height.numeric' => 'Height for combination #:position must be numeric.', 'combinations.*.height.gt' => 'Height for combination #:position must be greater than 0.', 'combinations.*.price_ranges.required' => 'Price range for combination #:position is required.', 'combinations.*.price_ranges.array' => 'Price range for combination #:position should be an array.', 'combinations.*.price_ranges.*.qty_from.required' => 'Quantity from for price range of combination #:position is required.', 'combinations.*.price_ranges.*.qty_from.integer' => 'Quantity from for price range of combination #:position must be an integer.', 'combinations.*.price_ranges.*.qty_from.min' => 'Quantity from for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.qty_from.max' => 'Quantity from for price range of combination #:position must be less than 2147483647.', 'combinations.*.price_ranges.*.qty_to.required' => 'Quantity to for price range of combination #:position is required.', 'combinations.*.price_ranges.*.qty_to.integer' => 'Quantity to for price range of combination #:position must be an integer.', 'combinations.*.price_ranges.*.qty_to.min' => 'Quantity to for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.qty_to.max' => 'Quantity to for price range of combination #:position must be less than 2147483647.', 'combinations.*.price_ranges.*.qty_to.gt' => 'Quantity to for price range of combination #:position must be greater than quantity from.', 'combinations.*.price_ranges.*.price.required' => 'Price for price range of combination #:position is required.', 'combinations.*.price_ranges.*.price.numeric' => 'Price for price range of combination #:position must be numeric.', 'combinations.*.price_ranges.*.price.gt' => 'Price for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.price.max' => 'Price for price range of combination #:position must be less than 2147483647.', 'featured_image.uploaded' => "The featured image must not be greater than 5MB.", 'featured_image.max' => "The featured image must not be greater than 5MB.", 'is_draft.required' => "The draft field is required.", 'is_draft.in' => "The draft field can only be true or false.", 'product_type.in' => "The product type field can only be standard or configurable.", ]; } } Requests/Admin/UpdateUserRequest.php 0000644 00000005714 15021222673 0013561 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\User; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateUserRequest extends FormRequest { public function authorize() { return Gate::allows('user_edit'); } public function rules() { return [ 'name' => [ 'string', 'required', ], 'email' => [ 'required', 'unique:users,email,' . request()->route('user')->id, ], 'password' => [ 'nullable', 'regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/i', ], 'phone_number' => [ 'nullable', 'max:20', ], 'company' => [ 'nullable', 'string', 'max:50', ], 'fax_number' => [ 'nullable', 'string', 'max:50', ], 'roles' => [ 'required', 'array', ], 'roles.*' => [ 'integer', 'exists:roles,id', ], 'user_type' => [ 'required', 'integer', 'in:'.implode(",", array_keys(User::USER_TYPE_RADIO)) ], 'status' => [ 'required', 'integer', 'in:'.implode(',', array_keys(User::STATUS_RADIO)) ], 'profile_image' => [ 'nullable', 'mimes:jpg,gif,png', ], 'reminder_duration' => [ 'nullable', 'in:' . implode(',', User::REMINDER_DURATION), ], 'birth_date' => [ 'nullable', 'date', 'before:today' ], 'secondary_email' => [ 'nullable', 'email', ], 'secondary_name' => [ 'nullable', 'max:20', ], 'secondary_phone' => [ 'nullable', 'max:20', ], 'sms_notification' => [ 'in:0,1', ], ]; } public function messages() { return [ 'roles.*.integer' => 'Role #:position must be an integer.', 'roles.*.exists' => 'Invalid role on position #:position.', 'user_type.in' => "Invalid user type.", 'password.regex' => 'Password should contain at least 8 characters, one letter, one number & one special character.', 'phone_number.integer' => 'Phone number can only contain numbers.', 'secondary_phone.integer' => 'Secondary phone can only contain numbers.', 'reminder_duration.in' => ':attribute can only be '. implode(',', User::REMINDER_DURATION), ]; } } Requests/Admin/StoreVendorRequest.php 0000644 00000002772 15021222673 0013753 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreVendorRequest extends FormRequest { public function authorize() { return Gate::allows('vendor_create'); } public function rules() { return [ 'name' => [ 'required', 'string', 'max:50', ], 'email' => [ 'required', 'string', 'email', ], 'secondary_email' => [ 'nullable', 'string', 'email', ], 'phone' => [ 'required', 'numeric', 'max_digits:20', ], 'address' => [ 'nullable', ], 'account_number' => [ 'nullable', ], 'payment_terms' => [ 'nullable', ], 'credit_card_ending' => [ 'nullable', 'regex:/^\d{4}$/', ], ]; } public function messages() { return [ 'credit_card_ending.regex' => 'Card ending must be valid 4 digits.', 'phone.required' => 'The phone number field is required.', 'phone.numeric' => 'The phone number must contain only numbers.', 'phone.max_digits' => 'The phone number can not be longer than 20 digits.', ]; } } Requests/Admin/MassDestroyStatusRequest.php 0000644 00000001001 15021222673 0015142 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyStatusRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:statuses,id', ]; } } Requests/Admin/PurchaseOrderReportRequest.php 0000644 00000002074 15021222673 0015436 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\PurchaseOrder; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class PurchaseOrderReportRequest extends FormRequest { public function authorize() { return Gate::allows('purchase_order_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:' . implode(',', array_keys(PurchaseOrder::REPORTS_MODE_FOR_REPORT)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/StoreVariationRequest.php 0000644 00000002443 15021222673 0014445 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Variation; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class StoreVariationRequest extends FormRequest { public function authorize() { return Gate::allows('variation_create'); } public function rules() { return [ 'type' => [ 'required', 'string', ], 'value' => [ 'required', 'string', 'unique:variations', ], 'vendor_id' => [ 'nullable', 'exists:vendors,id', ], 'vendor_price' => [ 'required_with:vendor_id', 'numeric', 'gt:0', ], 'sku' => [ 'required_with:vendor_id', 'string', 'unique:variations,sku', ], 'status' => [ 'required', 'integer', 'in:' . implode(',', array_keys(Variation::STATUS_RADIO)), ], ]; } public function messages() { return [ 'vendor_price.gt' => 'The vendor price field must be greater than zero.', ]; } } Requests/Admin/SalesTaxExemptionReportRequest.php 0000644 00000001371 15021222673 0016304 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use App\Models\ReportSalesTax; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; use Gate; class SalesTaxExemptionReportRequest extends FormRequest { public function authorize() { return Gate::allows('report_sales_tax_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportSalesTax::REPORTS_MODE)) ], 'waive_off_sales_tax_reason' => [ 'required_if:waive_off_sales_tax,true', 'in:'. implode(',', Order::WAIVE_OFF_OPTIONS), ], ]; } } Requests/Admin/UpdateAddressBookRequest.php 0000644 00000004503 15021222673 0015036 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateAddressBookRequest extends FormRequest { public function authorize() { return Gate::allows('update-record', request('address_book')) || Gate::allows('address_book_edit'); } public function rules() { return [ 'user_id' => [ auth()->user()->user_type == 1 ? 'required' : 'nullable', 'exists:users,id', ], 'company_name' => [ 'nullable', 'string', 'max:50', ], 'primary_contact_name' => [ 'required', 'string', 'max:50', ], 'primary_contact_email' => [ 'required', 'email', ], 'secondary_contact_name' => [ 'nullable', 'string', 'max:50', ], 'secondary_contact_email' => [ 'nullable', 'email', ], 'address_line_1' => [ 'required', 'string', ], 'address_line_2' => [ 'nullable', 'string', ], 'city' => [ 'required', 'string', 'max:50', ], 'state_id' => [ 'required', 'integer', 'exists:state_sales_taxes,id', ], 'zipcode' => [ 'required', 'integer', 'max_digits:10', ], 'phone_number' => [ 'nullable', 'regex:/^[0-9]+$/', 'max_digits:20', ], 'is_default' => [ 'required', 'in:0,1', ], ]; } public function messages() { return [ 'zipcode.max_digits' => 'Zipcode can not contain more than 10 digits.', 'phone_number.max_digits' => 'Phone number can not contain more than 20 digits.', 'phone_number.regex' => 'Phone number can only contain numbers.', 'state_id.integer' => 'State is required.', ]; } } Requests/Admin/StoreCategoryRequest.php 0000644 00000001676 15021222673 0014275 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreCategoryRequest extends FormRequest { public function authorize() { return Gate::allows('category_create'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:categories' ], 'parent_id' => [ 'nullable', 'integer' ], 'status' => [ 'required', 'integer', 'in:0,1' ], 'show_in_navigation' => [ 'nullable', 'integer', 'in:0,1' ], 'featured_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:4096' ], ]; } } Requests/Admin/PaymentCollectionReportRequest.php 0000644 00000002661 15021222673 0016323 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use App\Models\ReportJobsCompletedDetailed; use App\Models\ReportPaymentsCollection; use Illuminate\Foundation\Http\FormRequest; use Gate; class PaymentCollectionReportRequest extends FormRequest { public function authorize() { return Gate::allows('jobs_completed_comparison_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportPaymentsCollection::REPORTS_MODE)) ], 'payment_type' => [ 'nullable', 'in:'. implode(',', array_keys(Order::PAYMENT_TYPE_RADIO)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], 'date' => [ 'required_if:report_type,monthly', 'date_format:Y-m', 'before:tomorrow', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/UpdateProfileRequest.php 0000644 00000002771 15021222673 0014243 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateProfileRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => ['required', 'string', 'max:50'], // 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . auth()->id()], 'phone_number' => ['required_if:sms_notification,1', 'nullable', 'max:20'], 'company' => ['nullable', 'max:20'], 'fax_number' => ['nullable', 'max:20'], 'password' => ['nullable', 'confirmed', 'regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/i'], 'profile_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:4096' ], ]; } public function messages() { return [ 'password.regex' => 'Password should contain at least 8 characters, one letter, one number & one special character', 'phone_number.required_if' => 'You must provide phone number in order to receive SMS notifications.', 'phone_number.integer' => 'Phone number can only contain numbers.', ]; } } Requests/Admin/CouponStoreRequest.php 0000644 00000002161 15021222673 0013751 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Coupon; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class CouponStoreRequest extends FormRequest { public function authorize(): bool { return Gate::allows('coupon_create'); } public function rules(): array { return [ 'code' => 'required|string|max:30|unique:coupons,code', 'discount_type' => 'required|in:' . implode(',', array_keys(Coupon::DISCOUNT_TYPE)), 'discount_value' => [ 'required', 'numeric', 'min:0', 'not_in:0', function ($attribute, $value, $fail) { if ($this->discount_type === 'percentage' && $value > 100) { $fail('The discount value cannot exceed 100% when the discount type is percentage.'); } }, ], 'expiry_date' => 'nullable|date|after:yesterday', 'number_of_usage' => 'nullable|numeric', 'status' => 'required|boolean', ]; } } Requests/Admin/SalesTaxComparisonRequest.php 0000644 00000002163 15021222673 0015252 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportYearOverYear; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use Symfony\Component\HttpFoundation\Response; use Gate; class SalesTaxComparisonRequest extends FormRequest { public function authorize() { return Gate::allows('sales_tax_comparison_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportYearOverYear::REPORTS_MODE)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/StoreReviewRequest.php 0000644 00000002101 15021222673 0013741 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Review; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreReviewRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'product_id' => [ 'required', 'integer', 'exists:products,id', 'unique:reviews,product_id,NULL,id,user_id,' . auth()->id(), // 'exists:orders,id,user_id,' . auth()->id(), ], 'rating' => [ 'required', 'integer', 'between:0,5', ], 'comment' => [ 'nullable', 'string', 'max:500', ], ]; } public function messages() { return [ // 'order_id.unique' => 'You have already submitted review against this order.', 'product_id.unique' => 'You have already submitted review against this product.', ]; } } Requests/Admin/ForgotPasswordRequest.php 0000644 00000001337 15021222673 0014460 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class ForgotPasswordRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => [ 'required', 'exists:users,email' ] ]; } public function messages() { return [ 'email.exists' => 'This user does not exists', ]; } } Requests/Admin/UpdateVendorRequest.php 0000644 00000002771 15021222673 0014100 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateVendorRequest extends FormRequest { public function authorize() { return Gate::allows('vendor_edit'); } public function rules() { return [ 'name' => [ 'required', 'string', 'max:50', ], 'email' => [ 'required', 'string', 'email', ], 'secondary_email' => [ 'nullable', 'string', 'email', ], 'phone' => [ 'required', 'numeric', 'max_digits:20', ], 'address' => [ 'nullable', ], 'account_number' => [ 'nullable', ], 'payment_terms' => [ 'nullable', ], 'credit_card_ending' => [ 'nullable', 'regex:/^\d{4}$/', ], ]; } public function messages() { return [ 'credit_card_ending.regex' => 'Card ending must be valid 4 digits.', 'phone.required' => 'The phone number field is required.', 'phone.numeric' => 'The phone number must contain only numbers.', 'phone.max_digits' => 'The phone number can not be longer than 20 digits.', ]; } } Requests/Admin/YearOverYearRequest.php 0000644 00000002156 15021222673 0014052 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportYearOverYear; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use Symfony\Component\HttpFoundation\Response; use Gate; class YearOverYearRequest extends FormRequest { public function authorize() { return Gate::allows('report_year_over_year_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportYearOverYear::REPORTS_MODE)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/UpdateAttributeRequest.php 0000644 00000001301 15021222673 0014572 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Attribute; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateAttributeRequest extends FormRequest { public function authorize() { return Gate::allows('attribute_edit'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:attributes,name,' . request()->route('attribute')->id, ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(Attribute::STATUS_RADIO)), ], ]; } } Requests/Admin/StoreAttributeOptionRequest.php 0000644 00000001371 15021222673 0015644 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreAttributeOptionRequest extends FormRequest { public function authorize() { return Gate::allows('attribute_option_create'); } public function rules() { return [ 'attribute_id' => [ 'required', 'integer', 'exists:attributes,id', ], 'name' => [ 'string', 'max:50', 'required', 'unique:attribute_options', ], ]; } public function messages() { return [ 'name.unique' => 'This option already exists', ]; } } Requests/Admin/StoreRoleRequest.php 0000644 00000001657 15021222673 0013420 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreRoleRequest extends FormRequest { public function authorize() { return Gate::allows('role_create'); } public function rules() { return [ 'title' => [ 'string', 'required', 'unique:roles', ], 'permissions' => [ 'required', 'array', ], 'permissions.*' => [ 'integer', 'exists:permissions,id', ], ]; } public function messages(): array { return [ 'title.unique' => 'Title must be unique.', 'permissions.*.integer' => 'Permission :position must be an integer.', 'permissions.*.exists' => 'Invalid permission on position :position.', ]; } } Requests/Admin/MassDestroyUserRequest.php 0000644 00000000772 15021222673 0014613 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyUserRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:users,id', ]; } } Requests/Admin/StoreContactQueryRequest.php 0000644 00000002012 15021222673 0015122 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ContactQuery; use Illuminate\Foundation\Http\FormRequest; class StoreContactQueryRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'name' => [ 'required', 'string', 'max:50', ], 'email' => [ 'required', 'email', ], 'phone' => [ 'required', 'max:20', ], 'department' => [ 'required', 'in:'. implode(',',ContactQuery::DEPARTMENTS), ], 'subject' => [ 'required', 'max:50', ], 'message' => [ 'required', ], 'location_id' => [ 'required', 'exists:store_locations,id', ], ]; } } Requests/Admin/UpdatePurchaseOrderAdminNotesRequest.php 0000644 00000001074 15021222673 0017366 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class UpdatePurchaseOrderAdminNotesRequest extends FormRequest { public function authorize() { return Gate::allows('purchase_order_create'); } public function rules() { return [ 'admin_notes' => [ 'required', ], ]; } public function messages() { return [ 'admin_notes.required' => 'Please enter admin notes.', ]; } } Requests/Admin/RegisterRequest.php 0000644 00000002422 15021222673 0013255 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class RegisterRequest extends FormRequest { /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'name' => ['required', 'string', 'max:50'], 'phone_number' => ['required_if:sms_notification,1', 'nullable', 'max_digits:20', 'integer'], 'email' => ['required', 'email', 'unique:users'], 'company' => ['nullable', 'max:20'], 'fax_number' => ['nullable', 'max:20'], 'password' => ['required', 'confirmed', 'regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/i'], 'profile_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:4096' ], ]; } public function messages() { return [ 'password.regex' => 'Password should contain at least 8 characters, one letter, one number & one special character', 'phone_number.required_if' => 'You must provide phone number in order to receive SMS notifications.', 'phone_number.integer' => 'Phone number can only contain numbers.', ]; } } Requests/Admin/StoreStoreLocationRequest.php 0000644 00000001720 15021222673 0015273 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreStoreLocationRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('store_location_create'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'title' => [ 'required', 'string', 'max:50', ], 'address' => [ 'required', 'string', ], 'state_id' => [ 'required', 'exists:state_sales_taxes,id', ], 'status' => [ 'required', 'in:0,1', ], ]; } } Requests/Admin/UpdateStatusRequest.php 0000644 00000000762 15021222673 0014124 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateStatusRequest extends FormRequest { public function authorize() { return Gate::allows('status_edit'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:statuses,name,' . request()->route('status')->id, ], ]; } } Requests/Admin/MassDestroyCategoryRequest.php 0000644 00000001007 15021222673 0015442 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyCategoryRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:categories,id', ]; } } Requests/Admin/StoreStatusRequest.php 0000644 00000000714 15021222673 0013773 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreStatusRequest extends FormRequest { public function authorize() { return Gate::allows('status_create'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:statuses', ], ]; } } Requests/Admin/StorePermissionRequest.php 0000644 00000000630 15021222673 0014635 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class StorePermissionRequest extends FormRequest { public function authorize() { return Gate::allows('permission_create'); } public function rules() { return [ 'title' => [ 'string', 'required', ], ]; } } Requests/Admin/MassDestroyProductRequest.php 0000644 00000001003 15021222673 0015301 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyProductRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('product_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:products,id', ]; } } Requests/Admin/UpdateProductPriceRequest.php 0000644 00000001530 15021222673 0015236 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateProductPriceRequest extends FormRequest { public function authorize() { return Gate::allows('product_price_edit'); } public function rules() { return [ 'product_id' => [ 'required', 'integer', ], 'qty_from' => [ 'required', 'integer', 'min:1', 'max:2147483647', ], 'qty_to' => [ 'required', 'integer', 'min:1', 'max:2147483647', 'gte:qty_from' ], 'price' => [ 'numeric', 'required', ], ]; } } Requests/Admin/AddOrderProductRequest.php 0000644 00000005511 15021222673 0014520 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use App\Rules\ValidateImage; use App\Rules\ValidateRange; use Illuminate\Foundation\Http\FormRequest; use Gate; class AddOrderProductRequest extends FormRequest { public function authorize() { return Gate::allows('order_edit'); } public function rules() { return [ 'order_id' => [ 'required', 'exists:orders,id' ], 'products' => [ 'required', 'array', ], 'products.*.product_id' => [ 'required', 'integer', 'exists:products,id', ], 'products.*.price_id' => [ 'required', 'integer', 'exists:product_prices,id', ], 'products.*.quantity' => [ 'required', 'integer', 'min:1', new ValidateRange, ], 'products.*.customization' => [ 'nullable', 'json', ], 'products.*.template' => [ 'nullable', 'mimes:pdf,application/pdf', 'max:5120', ], 'products.*.image' => [ 'nullable', new ValidateImage, ], ]; } public function messages() { return [ 'products.*.product_id.required' => 'Product id for product #:position is required.', 'products.*.product_id.integer' => 'Product id for product #:position must be an integer.', 'products.*.product_id.exists' => 'Product id for product #:position is invalid.', 'products.*.price_id.required' => 'Price id for product #:position is required.', 'products.*.price_id.integer' => 'Price id for product #:position must be an integer.', 'products.*.price_id.exists' => 'Price id for product #:position is invalid.', 'products.*.quantity.required' => 'Quantity for product #:position is required.', 'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.', 'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.', 'products.*.customization.json' => 'Customization for product #:position must be json.', 'products.*.template.mimes' => 'Template for product #:position must be of type pdf.', 'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.', 'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.', 'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.', ]; } } Requests/Admin/OutstandingReportRequest.php 0000644 00000000650 15021222673 0015165 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Order; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class OutstandingReportRequest extends FormRequest { public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(Order::REPORTS_MODE)) ], ]; } } Requests/Admin/MassDestroyRoleRequest.php 0000644 00000000772 15021222673 0014576 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyRoleRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('role_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:roles,id', ]; } } Requests/Admin/StoreProductRequest.php 0000644 00000024407 15021222673 0014135 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Product; use App\Rules\ValidatePriceRangeQuantity; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreProductRequest extends FormRequest { public function authorize() { return Gate::allows('product_create'); } public function rules() { return [ 'category_id' => [ 'required', 'numeric', 'exists:categories,id' ], 'vendor_id' => [ 'required_if:product_type,standard', 'integer', 'exists:vendors,id', ], 'sku' => [ 'string', 'max:50', 'required', 'unique:products', ], 'name' => [ 'string', 'max:50', 'required', ], 'description' => [ 'string', 'nullable', ], 'featured_image' => [ 'required', 'mimes:jpg,gif,png', 'max:5120', ], 'gallery_images' => [ 'array', ], 'gallery_images.*' => [ 'mimes:jpg,gif,png', ], 'engraving' => [ 'required', 'integer', 'in:0,1', ], 'color_engraving' => [ 'required', 'integer', 'in:0,1', ], 'engraving_fee' => [ 'required', 'numeric', 'min:0', ], 'status' => [ 'required', 'integer', 'in:'. implode(',', array_keys(Product::STATUS_RADIO)), ], 'is_draft' => [ 'required', 'integer', 'in:'. implode(',', array_keys(Product::DRAFT_RADIO)), ], 'product_type' => [ 'required', 'in:'. implode(',', array_keys(Product::PRODUCT_TYPE)), ], 'variations' => [ 'required', 'array', ], 'variations.*' => [ 'required', 'integer', 'exists:variations,id', ], 'combinations' => [ 'required', 'array', ], 'combinations.*.variations' => [ 'required', 'array', ], 'combinations.*.product_sketch' => [ 'required_if:engraving,1', 'mimes:svg', 'max:5120', ], 'combinations.*.variations.*' => [ 'required', 'integer', 'exists:variations,id', 'in:'.implode(',', $this->variations ?? []), ], 'combinations.*.vendor_price' => [ 'required_if:product_type,standard', 'numeric', 'gt:0', ], 'combinations.*.supplier_prod_number' => [ 'required', 'string', 'unique:product_prices', 'distinct', ], 'combinations.*.shipping_weight' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.length' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.width' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.height' => [ 'required', 'numeric', 'gt:0', ], 'combinations.*.price_ranges' => [ 'required', 'array', ], 'combinations.*.price_ranges.*.qty_from' => [ 'required', 'integer', 'min:1', 'max:2147483647', new ValidatePriceRangeQuantity, ], 'combinations.*.price_ranges.*.qty_to' => [ 'required', 'integer', 'min:1', 'max:2147483647', 'gt:combinations.*.price_ranges.*.qty_from', ], 'combinations.*.price_ranges.*.price' => [ 'required', 'numeric', 'gt:0', 'max:2147483647', ], ]; } public function messages() { return [ 'variations.*.integer' => 'Variation on position #:position must be integer.', 'variations.*.exists' => 'Invalid variation on #:position.', 'combinations.*.variations.array' => 'Variations for combination #:position must be an array.', 'combinations.*.variations.required' => 'Variations for combination #:position are required.', 'combinations.*.product_sketch.required_if' => 'Product sketch for combination #:position field is required when engraving is 1.', 'combinations.*.product_sketch.mimes' => 'Product sketch for combination #:position field must be of type svg.', 'combinations.*.variations.*.integer' => 'Variations for combination #:position must be integer.', 'combinations.*.variations.*.exists' => 'Invalid variations for combination #:position.', 'combinations.*.variations.*.in' => 'Variations for combination #:position can only contain values selected above.', 'combinations.*.vendor_price.required' => 'Vendor price for combination #:position is required.', 'combinations.*.vendor_price.numeric' => 'Vendor price for combination #:position must be numeric.', 'combinations.*.vendor_price.gt' => 'Vendor price for combination #:position should be greater than 0.', 'gallery_images.*.mimes' => 'Invalid image on position #:position. Only image type of jpg,gif,png are supported.', 'combinations.*.supplier_prod_number.required' => 'Supplier production number for combination #:position is required.', 'combinations.*.supplier_prod_number.unique' => 'Supplier production number for combination #:position must be unique.', 'combinations.*.supplier_prod_number.string' => 'Supplier production number for combination #:position must be string.', 'combinations.*.supplier_prod_number.distinct' => 'Supplier production number for combination #:position must be distinct.', 'combinations.*.shipping_weight.required' => 'Shipping weight for combination #:position is required.', 'combinations.*.shipping_weight.numeric' => 'Shipping weight for combination #:position must be numeric.', 'combinations.*.shipping_weight.gt' => 'Shipping weight for combination #:position must be greater than 0.', 'combinations.*.length.required' => 'Length for combination #:position is required.', 'combinations.*.length.numeric' => 'Length for combination #:position must be numeric.', 'combinations.*.length.gt' => 'Length for combination #:position must be greater than 0.', 'combinations.*.width.required' => 'Width for combination #:position is required.', 'combinations.*.width.numeric' => 'Width for combination #:position must be numeric.', 'combinations.*.width.gt' => 'Width for combination #:position must be greater than 0.', 'combinations.*.height.required' => 'Height for combination #:position is required.', 'combinations.*.height.numeric' => 'Height for combination #:position must be numeric.', 'combinations.*.height.gt' => 'Height for combination #:position must be greater than 0.', 'combinations.*.price_ranges.required' => 'Price range for combination #:position is required.', 'combinations.*.price_ranges.array' => 'Price range for combination #:position should be an array.', 'combinations.*.price_ranges.*.qty_from.required' => 'Quantity from for price range of combination #:position is required.', 'combinations.*.price_ranges.*.qty_from.integer' => 'Quantity from for price range of combination #:position must be an integer.', 'combinations.*.price_ranges.*.qty_from.min' => 'Quantity from for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.qty_from.max' => 'Quantity from for price range of combination #:position must be less than 2147483647.', 'combinations.*.price_ranges.*.qty_to.required' => 'Quantity to for price range of combination #:position is required.', 'combinations.*.price_ranges.*.qty_to.integer' => 'Quantity to for price range of combination #:position must be an integer.', 'combinations.*.price_ranges.*.qty_to.min' => 'Quantity to for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.qty_to.max' => 'Quantity to for price range of combination #:position must be less than 2147483647.', 'combinations.*.price_ranges.*.qty_to.gt' => 'Quantity to for price range of combination #:position must be greater than quantity from.', 'combinations.*.price_ranges.*.price.required' => 'Price for price range of combination #:position is required.', 'combinations.*.price_ranges.*.price.numeric' => 'Price for price range of combination #:position must be numeric.', 'combinations.*.price_ranges.*.price.gt' => 'Price for price range of combination #:position must be greater than 0.', 'combinations.*.price_ranges.*.price.max' => 'Price for price range of combination #:position must be less than 2147483647.', 'featured_image.uploaded' => "The featured image must not be greater than 5MB.", 'featured_image.max' => "The featured image must not be greater than 5MB.", 'is_draft.required' => "The draft field is required.", 'is_draft.in' => "The draft field can only be true or false.", 'product_type.in' => "The product type field can only be standard or configurable.", ]; } } Requests/Admin/UpdateCartRequest.php 0000644 00000001434 15021222673 0013527 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class UpdateCartRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'product_id' => [ 'required', 'integer', 'exists:products,id', 'exists:product_attribute_options,product_id', ], 'quantity' => [ 'required', 'integer', 'min:1', ], 'customization' => [ 'nullable', 'json', ], 'attachment' => [ 'nullable', 'mimes:pdf', ], ]; } } Requests/Admin/UpdatePasswordRequest.php 0000644 00000001632 15021222673 0014440 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdatePasswordRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('profile_password_edit'); } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'password' => ['required', 'confirmed', 'regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/i', ], ]; } public function messages() { return [ 'password.regex' => 'Password should contain at least 8 characters, one letter, one number & one special character', ]; } } Requests/Admin/MassDestroyProductPriceRequest.php 0000644 00000001024 15021222673 0016267 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyProductPriceRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('product_price_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:product_prices,id', ]; } } Requests/Admin/UpdateSalesTaxRequest.php 0000644 00000001212 15021222673 0014354 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateSalesTaxRequest extends FormRequest { public function authorize() { return Gate::allows('sales_tax_edit'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:state_sales_taxes,name,' . request()->route('state_sales_tax')->id, ], 'tax_percentage' => [ 'numeric', 'required', 'min:0', ], ]; } } Requests/Admin/SalesTaxReportRequest.php 0000644 00000001046 15021222673 0014412 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportSalesTax; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; use Gate; class SalesTaxReportRequest extends FormRequest { public function authorize() { return Gate::allows('report_sales_tax_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportSalesTax::REPORTS_MODE)) ], ]; } } Requests/Admin/JobsCompletedComparisonRequest.php 0000644 00000002347 15021222673 0016264 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportJobsCompletedDetailed; use Illuminate\Foundation\Http\FormRequest; use Gate; class JobsCompletedComparisonRequest extends FormRequest { public function authorize() { return Gate::allows('jobs_completed_comparison_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportJobsCompletedDetailed::REPORTS_MODE)) ], 'year_from' => [ 'required_if:report_type,custom', 'date_format:Y', ], 'year_to' => [ 'required_if:report_type,custom', 'date_format:Y', 'after_or_equal:year_from', ], 'date' => [ 'required_if:report_type,daily,weekly', 'date_format:Y-m-d', 'before:tomorrow', ], ]; } public function messages() { return [ 'year_from.date_format' => 'The year from should be a valid 4 digit year.', 'year_to.date_format' => 'The year to should be a valid 4 digit year.', ]; } } Requests/Admin/UpdateCategoryRequest.php 0000644 00000002112 15021222673 0014405 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateCategoryRequest extends FormRequest { public function authorize() { return Gate::allows('category_edit'); } public function rules() { return [ 'name' => [ 'string', 'max:50', 'required', 'unique:categories,name,' . request()->route('category')->id, ], 'slug' => [ 'string', 'max:50', 'required', 'unique:categories,slug,' . request()->route('category')->id, ], 'status' => [ 'required', 'integer', 'in:0,1' ], 'show_in_navigation' => [ 'nullable', 'integer', 'in:0,1' ], 'featured_image' => [ 'nullable', 'mimes:jpg,gif,png', 'max:4096' ], ]; } } Requests/Admin/CouponUpdateRequest.php 0000644 00000002220 15021222673 0014073 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\Coupon; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Gate; class CouponUpdateRequest extends FormRequest { public function authorize(): bool { return Gate::allows('coupon_edit'); } public function rules(): array { return [ 'code' => 'required|string|max:30|unique:coupons,code,'.request()->route('coupon')->id, 'discount_type' => 'required|in:' . implode(',', array_keys(Coupon::DISCOUNT_TYPE)), 'discount_value' => [ 'required', 'numeric', 'min:0', 'not_in:0', function ($attribute, $value, $fail) { if ($this->discount_type === 'percentage' && $value > 100) { $fail('The discount value cannot exceed 100% when the discount type is percentage.'); } }, ], 'expiry_date' => 'nullable|date|after:yesterday', 'number_of_usage' => 'nullable|numeric', 'status' => 'required|boolean', ]; } } Requests/Admin/TopSellingProductsRequest.php 0000644 00000000743 15021222673 0015301 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class TopSellingProductsRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'date_from' => [ 'nullable', 'date', ], 'date_to' => [ 'required_with:date_from', 'date' ], ]; } } Requests/Admin/UpdateStoreLocationRequest.php 0000644 00000001717 15021222673 0015427 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateStoreLocationRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('store_location_edit'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'title' => [ 'required', 'string', 'max:50', ], 'address' => [ 'required', 'string', ], 'state_id' => [ 'required', 'exists:state_sales_taxes,id', ], 'status' => [ 'required', 'in:0,1', ], ]; } } Requests/Admin/UpdateOurPartnerRequest.php 0000644 00000001415 15021222673 0014736 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\OurPartner; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateOurPartnerRequest extends FormRequest { public function authorize() { return Gate::allows('our_partner_edit'); } public function rules() { return [ 'title' => [ 'string', 'required', 'unique:our_partners,title,'. request()->route('our_partner')->id, 'max:50', ], 'logo' => [ 'nullable', ], 'status' => [ 'required', 'integer', 'in:'.implode(',', array_keys(OurPartner::STATUS_RADIO)), ], ]; } } Requests/Admin/MassDestroyAttributeOptionRequest.php 0000644 00000001035 15021222673 0017022 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyAttributeOptionRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('attribute_option_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:attribute_options,id', ]; } } Requests/Admin/StoreOurPartnerRequest.php 0000644 00000001415 15021222673 0014610 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\OurPartner; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreOurPartnerRequest extends FormRequest { public function authorize() { return Gate::allows('our_partner_create'); } public function rules() { return [ 'title' => [ 'string', 'required', 'unique:our_partners,title', 'max:50', ], 'logo' => [ 'required', 'mimes:jpg,gif,png', ], 'status' => [ 'required', 'integer', 'in:'.implode(',', array_keys(OurPartner::STATUS_RADIO)), ], ]; } } Requests/Admin/SalesReportRequest.php 0000644 00000001065 15021222673 0013736 0 ustar 00 <?php namespace App\Http\Requests\Admin; use App\Models\ReportSales; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Gate; class SalesReportRequest extends FormRequest { public function authorize() { return Gate::allows('report_sales_access'); } public function rules() { return [ 'report_type' => [ 'nullable', 'in:'. implode(',', array_keys(ReportSales::REPORTS_MODE)) ], ]; } } Requests/Admin/UpdatePermissionRequest.php 0000644 00000000627 15021222673 0014771 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdatePermissionRequest extends FormRequest { public function authorize() { return Gate::allows('permission_edit'); } public function rules() { return [ 'title' => [ 'string', 'required', ], ]; } } Requests/Admin/UpdateAttributeOptionRequest.php 0000644 00000001246 15021222673 0015773 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateAttributeOptionRequest extends FormRequest { public function authorize() { return Gate::allows('attribute_option_edit'); } public function rules() { return [ 'attribute_id' => [ 'required', 'integer', 'exists:attributes,id', ], 'name' => [ 'string', 'max:50', 'required', 'unique:attribute_options,name,' . request()->route('attribute_option')->id, ], ]; } } Requests/Admin/UpdateStockLocationRequest.php 0000644 00000001531 15021222673 0015410 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateStockLocationRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return Gate::allows('stock_location_edit'); } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'location' => [ 'required', 'unique:stock_locations,location,' . request()->route('stock_location')->id, 'string', 'max:50', ], 'status' => [ 'required', 'in:0,1', ], ]; } } Requests/Admin/ResetPasswordRequest.php 0000644 00000001354 15021222673 0014301 0 ustar 00 <?php namespace App\Http\Requests\Admin; use Illuminate\Foundation\Http\FormRequest; class ResetPasswordRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'password_reset_code' => [ 'required', ], 'email' => [ 'required', 'email' ], 'new_password' => [ 'required', ], ]; } } Resources/.DS_Store 0000644 00000014004 15021222673 0010200 0 ustar 00 Bud1 % A d m i ndsclbool ndsclbool @ � @ � @ � @ E % DSDB ` � @ � @ � @ Resources/User/OrderRepeatResource.php 0000644 00000010317 15021222673 0014073 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class OrderRepeatResource extends JsonResource { public function toArray($request) { $orderItems = $customization_array = []; foreach ($this->items as $item) { $variations = []; foreach ($item->itemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->orderItemCustomizations as $customization){ $customization_array['url'][] = $customization->mediaUrl; } $product = $item->product; $productVariations = []; foreach ($product->variations ?? [] as $variation){ $v = $variation->variation; if($v){ $productVariations[$v->type][] = ['id' => $v->id, 'value' => $v->value]; } } $productPrices = []; foreach ($product->prices ?? [] as $price){ $combinations = $ranges = []; foreach ($price->combinations ?? [] as $combination){ $combinations[] = [ 'variation_id' => $combination->variation_id, ]; } foreach ($price->priceRanges ?? [] as $range){ $ranges[] = [ 'qty_from' => $range->qty_from, 'qty_to' => $range->qty_to, 'price' => $range->price, ]; } $productPrices[$price->id] = [ 'price_id' => $price->id, 'supplier_prod_number' => $price->supplier_prod_number, 'product_sketch' => $price->product_sketch_media, 'min_price' => $price->min_price, 'max_price' => $price->max_price, 'combination' => $combinations, 'ranges' => $ranges, ]; } $productDetails = [ 'id' => $product->id, 'sku' => $product->sku, 'name' => $product->name, 'description' => $product->description, 'category' => $product->category?->name, 'featured_image' => $product->featured_image ? [ $product->featured_image->url, $product->featured_image->thumbnail, $product->featured_image->preview ] :[], 'gallery_images' => $product->gallery_images, 'variations' => $productVariations, 'product_prices' => $productPrices ]; $orderItems[] = [ 'item_id' => $item->id, 'product_id' => $item->product_id, 'price_id' => $item->price_id, 'quantity' => $item->quantity, 'price' => $item->price, 'customization' => json_decode($item->customization ?? '[]'), 'template' => $item->template_media, 'image' => $item->imageUrl, 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes': 'No', 'product_detail' => $productDetails ]; } return [ 'rush_order' => $this->rush_order, 'shipping_address_id' => $this->shipping_address_id, 'billing_address_id' => $this->billing_address_id, 'pickup_location_id' => $this->pickup_location_id, 'delivery_date' => $this->delivery_date?->format('m-d-Y'), 'event_date' => $this->event_date?->format('m-d-Y'), 'delivery_type' => $this->delivery_type, 'description' => $this->description, 'products' => $orderItems, ]; } } Resources/User/VariationResource.php 0000644 00000000503 15021222673 0013607 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class VariationResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'type' => $this->type, 'value' => $this->value, ]; } } Resources/User/PartnerResource.php 0000644 00000001037 15021222673 0013271 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class PartnerResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'logo' => $this->logo ? [ 'url' => $this->logo->url, 'thumbnail' => $this->logo->thumbnail, 'preview' => $this->logo->preview, ] : null, ]; } } Resources/User/ProductResource.php 0000644 00000002115 15021222673 0013274 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class ProductResource extends JsonResource { public function toArray($request) { $product_sketch = isset($this->productProductPrices[0]) ? $this->productProductPrices[0]->product_sketch_media : ''; return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'slug' => $this->slug, 'price_from' => $this->price_from, 'price_to' => $this->price_to, 'price_id' => isset($this->productProductPrices[0]) ? $this->productProductPrices[0]->id : 0, 'product_sketch' => $product_sketch, 'featured_image' => $this->featured_image ? [ $this->featured_image->url, $this->featured_image->thumbnail, $this->featured_image->preview, ] : [], ]; } } Resources/User/CategoryResource.php 0000644 00000001210 15021222673 0013424 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class CategoryResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'total_products' => $this->products_count, 'featured_image' => $this->featured_image ? [ 'url' => $this->featured_image->url, 'thumbnail' => $this->featured_image->thumbnail, 'preview' => $this->featured_image->preview, ] : null, ]; } } Resources/User/BestSellingResource.php 0000644 00000001276 15021222673 0014076 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class BestSellingResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'price_range' => $this->price_from .' - $'. $this->price_to, 'featured_image' => $this->featured_image ? [ 'url' => $this->featured_image->url, 'thumbnail' => $this->featured_image->thumbnail, 'preview' => $this->featured_image->preview, ] : null, ]; } } Resources/User/WishlistResource.php 0000644 00000002522 15021222673 0013464 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class WishlistResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'product' => [ 'id' => $this->product_id, 'name' => $this->product ?->name, 'featured_image' => $this->product->featured_image ? [ 'url' => $this->product->featured_image->url, 'thumbnail' => $this->product->featured_image->thumbnail, 'preview' => $this->product->featured_image->preview, ] : [], 'price_id' => isset($this->product->productProductPrices[0]) ? $this->product->productProductPrices[0]->id : 0, 'average_price' => isset($this->product->productProductPrices[0]) ? $this->product->productProductPrices[0]->avg_price : 0, 'min_price' => isset($this->product->productProductPrices[0]) ? $this->product->productProductPrices[0]->min_price : 0, 'price_from' => $this->product->price_from, 'price_to' => $this->product->price_to, ], 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/User/OrderResource.php 0000644 00000003711 15021222673 0012732 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class OrderResource extends JsonResource { public function toArray($request = null) { $total_items_qty = $this->items->sum('quantity') ?? 0; $total_engraving_fee = $this->items->sum('engraving_fee') ?? 0; $total_price_after_engraving = $this->items->sum('total_price_after_engraving') ?? 0; //Rush order Calculation $grand_total = $total_price_after_engraving + $this->rush_order_amount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1) $grand_total += $this->sales_tax_amount; return [ 'id' => $this->id, 'order_number' => $this->order_number, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0).'%', 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'current_status' => $this->current_status?->name, 'total_products' => $total_items_qty, 'engraving_fee' => '$'.number_format($total_engraving_fee, 2), 'sub_total' => '$'.number_format($this->items_total, 2), 'state_sales_tax' => [ 'percentage' => $this->state_sales_tax, 'amount' => number_format($this->sales_tax_amount, 2), ], 'waive_off_sales_tax' => $this->waive_off_sales_tax == 1 ? 'Yes' : 'No', 'shipping_charges' => '$'.number_format($this->shipping_charges, 2), 'grand_total' => '$'.(number_format($grand_total, 2)), 'created_at' => $this->created_at->format('m-d-Y'), ]; } } Resources/User/ProductResourceWithAttributesTest.php 0000644 00000012204 15021222673 0017037 0 ustar 00 <?php namespace App\Http\Resources\User; use App\Models\Product; use Illuminate\Http\Resources\Json\JsonResource; class ProductResourceWithAttributesTest extends JsonResource { public function toArray($request) { $product_variations = $price_chart = []; $product_prices = []; foreach ($this->prices ?? [] as $price){ $combinations = $ranges = []; foreach ($price->combinations ?? [] as $combination){ $combinations[] = [ 'variation_id' => $combination->variation_id, ]; } foreach ($price->combinations ?? [] as $combination){ $v = $combination->variation; if($v){ if (isset($product_variations[$v->type]) && in_array($v->value, array_column($product_variations[$v->type], 'value'))) continue; $product_variations[$v->type][] = ['id' => $v->id, 'value' => $v->value]; } } foreach ($price->priceRanges ?? [] as $range){ if ($range->qty_from > 249) { $ranges[] = [ 'qty_from' => '250+', 'qty_to' => '', 'price' => number_format($range->price, 2, '.', ''), ]; } else { $ranges[] = [ 'qty_from' => $range->qty_from, 'qty_to' => $range->qty_to, 'price' => number_format($range->price, 2, '.', ''), ]; } } $product_prices[$price->id] = [ 'price_id' => $price->id, 'product_sketch' => asset('images/BR-004S-01.svg'), 'supplier_prod_number' => $price->supplier_prod_number, 'min_price' => number_format($price->min_price, 2, '.', ''), 'max_price' => number_format($price->max_price, 2, '.', ''), 'combination' => $combinations, 'ranges' => $ranges, ]; $price_chart[$price->id] = [ 'product_number' => $price->supplier_prod_number, 'wight' => number_format($price->shipping_weight, 2, '.', ''), 'length' => $price->length, 'width' => $price->width, 'height' => $price->height, ]; } // Reviews foreach ($this->reviews as $review) { $reviews[] = [ "name" => $review->user?->name, "rating" => $review->rating, "comment" => $review->comment, ]; } //Related Products $related_products = Product::where('category_id', $this->category_id) ->where('id', '<>', $this->id) ->active() ->limit(4) ->get(); foreach ($related_products as $related_product) { $p[] = [ 'id' => $related_product->id, 'sku' => $related_product->sku, 'slug' => $related_product->slug, 'name' => $related_product->name, 'price_from' => number_format($related_product->price_from, 2, '.', ''), 'price_to' => number_format($related_product->price_to, 2, '.', ''), 'featured_image' => $related_product->featured_image ? [ $related_product->featured_image->url, $related_product->featured_image->thumbnail, $related_product->featured_image->preview, ] : [], ]; } return [ 'id' => $this->id, 'sku' => $this->sku, 'slug' => $this->slug, 'name' => $this->name, 'description' => $this->description, 'category' => $this->category?->name, 'price_from' => number_format($this->price_from, 2, '.', ''), 'price_to' => number_format($this->price_to, 2, '.', ''), 'engraving' => $this->engraving, 'color_engraving' => $this->color_engraving, 'engraving_fee' => number_format($this->engraving_fee, 2, '.', ''), 'featured_image' => $this->featured_image ? [ $this->featured_image->url, $this->featured_image->thumbnail, $this->featured_image->preview, ] : [], 'gallery_images' => $this->gallery_images, 'variations' => $product_variations, 'product_prices' => $product_prices, 'price_chart' => $price_chart, 'reviews' => $reviews ?? [], 'related_products' => $p ?? [], ]; } } Resources/User/CartResource.php 0000644 00000002764 15021222673 0012557 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class CartResource extends JsonResource { public function toArray($request) { $p_price = $this->price; $variations = []; foreach ($p_price?->combinations ?? [] as $combination){ if ($variation = $combination->variation){ $variations[] = [ 'type' => $variation->type, 'value' => $variation->value, ]; } } $range = $p_price->priceRanges() ->where('qty_from', '<=', $this->quantity) ->where('qty_to', '>=', $this->quantity) ->first(); return [ 'id' => $this->id, 'product' => [ 'id' => $this->product_id, 'name' => $this->product?->name, 'featured_image' => $this->product->featured_image ? [ 'url' => $this->product->featured_image->url, 'thumbnail' => $this->product->featured_image->thumbnail, 'preview' => $this->product->featured_image->preview, ] : [] ], 'price_id' => $this->price_id, 'quantity' => $this->quantity, 'total' => $this->quantity * $range?->price, 'customization' => $this->customization, 'attachment' => $this->attachment_url, 'variations' => $variations, ]; } } Resources/User/OrderInfoResource.php 0000644 00000013320 15021222673 0013543 0 ustar 00 <?php namespace App\Http\Resources\User; use App\Models\Status; use Illuminate\Http\Resources\Json\JsonResource; class OrderInfoResource extends JsonResource { public function toArray($request) { $statuses = []; $order_items = []; $existing_order_statuses = $this->statuses; foreach (Status::all() as $status) { $st = $existing_order_statuses->where('id', $status->id)->first(); if ($st){ $checked = true; $notes = $st->pivot->notes; }else{ $checked = false; $notes = ''; } $statuses[] = [ 'id' => $status->id, 'name' => $status->name, 'color' => $status->color, 'notes' => $notes, 'is_selected' => $checked, ]; } foreach ($this->items as $item) { $variations = $customization_array = []; foreach ($item->itemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->orderItemCustomizations as $customization){ $customization_array['url'][] = $customization->mediaUrl; } $order_items[] = [ 'item_id' => $item->id, 'product_id' => $item->product_id, 'quantity' => $item->quantity, 'price' => $item->price, 'customization' => $customization_array, 'template' => $item->template_media, 'image' => $item->imageUrl, 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes': 'No', ]; } $user_addresses = []; foreach($this->user?->userAddressBooks ?? []as $address){ $user_addresses[] = [ 'id' => $address->id, 'company_name' => $address->company_name, 'primary_contact_name' => $address->primary_contact_name, 'primary_contact_email' => $address->primary_contact_email, 'secondary_contact_name' => $address->secondary_contact_name, 'secondary_contact_email' => $address->secondary_contact_email, 'address_line_1' => $address->address_line_1, 'address_line_2' => $address->address_line_2, 'city' => $address->city, 'state' => $address->state, 'zipcode' => $address->zipcode, 'phone_number' => $address->phone_number, 'is_default' => $address->is_default, 'selected_as_shipping' => $address->id == $this->shipping_address_id, 'selected_as_billing' => $address->id == $this->billing_address_id, ]; } return [ 'id' => $this->id, 'rush_order' => $this->rush_order, 'order_number' => $this->order_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'delivery_date' => $this->delivery_date?->format('m-d-Y'), 'event_date' => $this->event_date?->format('m-d-Y'), 'delivery_type' => $this->delivery_type, 'tracking_number' => $this->tracking_number, 'description' => $this->description, 'current_status_id' => $this->current_status_id, 'shipping_address_id' => $this->shipping_address_id, 'billing_address_id' => $this->billing_address_id, 'billing_company_name' => $this->billing_company_name, 'billing_primary_contact_name' => $this->billing_primary_contact_name, 'billing_primary_contact_email' => $this->billing_primary_contact_email, 'billing_secondary_contact_name' => $this->billing_secondary_contact_name, 'billing_secondary_contact_email' => $this->billing_secondary_contact_email, 'billing_address_line_1' => $this->billing_address_line_1, 'billing_address_line_2' => $this->billing_address_line_2, 'billing_city' => $this->billing_city, 'billing_state' => $this->billing_state, 'billing_zipcode' => $this->billing_zipcode, 'billing_phone_number' => $this->billing_phone_number, 'shipping_company_name' => $this->shipping_company_name, 'shipping_primary_contact_name' => $this->shipping_primary_contact_name, 'shipping_primary_contact_email' => $this->shipping_primary_contact_email, 'shipping_secondary_contact_name' => $this->shipping_secondary_contact_name, 'shipping_secondary_contact_email' => $this->shipping_secondary_contact_email, 'shipping_address_line_1' => $this->shipping_address_line_1, 'shipping_address_line_2' => $this->shipping_address_line_2, 'shipping_city' => $this->shipping_city, 'shipping_state' => $this->shipping_state, 'shipping_zipcode' => $this->shipping_zipcode, 'pickup_location_id' => $this->pickup_location_id, 'products' => $order_items, 'available_statuses' => $statuses, 'available_addresses' => $user_addresses, ]; } } Resources/User/CategoryTreeResource.php 0000644 00000002260 15021222673 0014252 0 ustar 00 <?php namespace App\Http\Resources\User; use Illuminate\Http\Resources\Json\JsonResource; class CategoryTreeResource extends JsonResource { public function toArray($request) { $child_categories = []; foreach ($this->categoryTree as $tree){ $child_categories[] = [ 'id' => $tree->id, 'name' => $tree->name, 'featured_image' => $tree->featured_image ? [ 'url' => $tree->featured_image->url, 'thumbnail' => $tree->featured_image->thumbnail, 'preview' => $tree->featured_image->preview, ] : null, ]; } return [ 'id' => $this->id, 'name' => $this->name, 'featured_image' => $this->featured_image ? [ 'url' => $this->featured_image->url, 'thumbnail' => $this->featured_image->thumbnail, 'preview' => $this->featured_image->preview, ] : null, 'child_categories' => $child_categories, ]; } } Resources/User/OrderUserInfoResource.php 0000644 00000014767 15021222673 0014422 0 ustar 00 <?php namespace App\Http\Resources\User; use App\Models\Status; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; class OrderUserInfoResource extends JsonResource { public function toArray($request) { $statuses = $order_items = []; $sub_total = 0; $all_statuses = Status::all(); foreach ($this->statuses as $sts) { $statusId = $sts->pivot->status_id; $notes = $sts?->pivot?->notes; $updated_at = $sts->pivot->updated_at; $db_status = $all_statuses->where('id', $statusId)->first(); $statuses[] = [ 'id' => $statusId, 'name' => $db_status->name, 'color' => $db_status->color, 'notes' => $notes ?? 'N/A', 'updated_at' => $updated_at->diffForHumans(), 'is_selected' => true, ]; } foreach ($this->items as $item) { $variations = $customization_array = []; foreach ($item->orderItemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->orderItemCustomizations as $customization){ $customization_array['url'][] = $customization->mediaUrl; } $order_items[] = [ 'product_id' => $item->product?->id, 'product_slug' => $item->product?->slug, 'product_image' => $item->product?->featured_image?->preview, 'product' => $item->product?->name, 'quantity' => $item->quantity, 'engraving_fee' => $item->engraving_fee, 'price' => $item->price, 'product_total' => $item->total_price, 'customization' => $customization_array, 'product_customization' => $item->customization ? json_decode($item->customization) : [], 'sketch_file' => $item->productPrice?->product_sketch_media, 'template' => $item->template_media ?: 'N/A', 'image' => $item->imageUrl ?: 'N/A', 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes': 'No', ]; $sub_total += $item->total_price_after_engraving; } //Rush order Calculation $sub_total_after_discount = ($sub_total + $this->rush_order_amount) - $this->discount_total; $grand_total = $sub_total_after_discount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1) { $grand_total += $this->sales_tax_amount; } return [ 'id' => $this->id, 'order_number' => $this->order_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'cc_details' => $this->payment ? [ 'last_four' => $this->payment->last_four, 'card_type' => $this->payment->account_type, 'payment_date' => $this->payment->created_at->format('Y-m-d'), ] : [], 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'delivery_date' => $this->delivery_date?->format('Y-m-d'), 'event_date' => $this->event_date?->format('Y-m-d'), 'description' => $this->description, 'current_status' => $this->current_status?->name, 'products' => $order_items, 'sub_total' => '$'.number_format($sub_total, 2), 'sub_total_after_discount' => '$'.number_format($sub_total_after_discount, 2), 'discount' => $this->discount_type != null ? [ 'discount_type' => $this->discount_type, 'discount_value' => $this->discount_value, 'discount_total' => $this->discount_total, ] : null, 'state_sales_tax' => [ 'percentage' => $this->state_sales_tax, 'amount' => number_format($this->sales_tax_amount, 2), ], 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0).'%', 'rush_order_amount' => $this->rush_order_amount, 'shipping_charges' => '$'.number_format($this->shipping_charges, 2), 'grand_total' => '$'.(number_format($grand_total, 2)), 'delivery_type' => $this->delivery_type, 'tracking_number' => $this->tracking_number, 'pickup_location_title' => $this->pickLocation?->title, 'pickup_location_address' => $this->pickLocation?->address, 'billing_company_name' => $this->billing_company_name, 'billing_primary_contact_name' => $this->billing_primary_contact_name, 'billing_primary_contact_email' => $this->billing_primary_contact_email, 'billing_secondary_contact_name' => $this->billing_secondary_contact_name, 'billing_secondary_contact_email' => $this->billing_secondary_contact_email, 'billing_address_line_1' => $this->billing_address_line_1, 'billing_address_line_2' => $this->billing_address_line_2, 'billing_city' => $this->billing_city, 'billing_state' => $this->billing_state, 'billing_zipcode' => $this->billing_zipcode, 'billing_phone_number' => $this->billing_phone_number, 'shipping_company_name' => $this->shipping_company_name, 'shipping_primary_contact_name' => $this->shipping_primary_contact_name, 'shipping_primary_contact_email' => $this->shipping_primary_contact_email, 'shipping_secondary_contact_name' => $this->shipping_secondary_contact_name, 'shipping_secondary_contact_email' => $this->shipping_secondary_contact_email, 'shipping_address_line_1' => $this->shipping_address_line_1, 'shipping_address_line_2' => $this->shipping_address_line_2, 'shipping_city' => $this->shipping_city, 'shipping_state' => $this->shipping_state, 'shipping_zipcode' => $this->shipping_zipcode, 'available_statuses' => $statuses, ]; } } Resources/User/ProductResourceWithAttributes.php 0000644 00000012176 15021222673 0016207 0 ustar 00 <?php namespace App\Http\Resources\User; use App\Models\Product; use Illuminate\Http\Resources\Json\JsonResource; class ProductResourceWithAttributes extends JsonResource { public function toArray($request) { $product_variations = $price_chart = []; $product_prices = []; foreach ($this->prices ?? [] as $price){ $combinations = $ranges = []; foreach ($price->combinations ?? [] as $combination){ $combinations[] = [ 'variation_id' => $combination->variation_id, ]; } foreach ($price->combinations ?? [] as $combination){ $v = $combination->variation; if($v){ if (isset($product_variations[$v->type]) && in_array($v->value, array_column($product_variations[$v->type], 'value'))) continue; $product_variations[$v->type][] = ['id' => $v->id, 'value' => $v->value]; } } foreach ($price->priceRanges ?? [] as $range){ if ($range->qty_from > 249) { $ranges[] = [ 'qty_from' => '250+', 'qty_to' => '', 'price' => number_format($range->price, 2, '.', ''), ]; } else { $ranges[] = [ 'qty_from' => $range->qty_from, 'qty_to' => $range->qty_to, 'price' => number_format($range->price, 2, '.', ''), ]; } } $product_prices[$price->id] = [ 'price_id' => $price->id, 'product_sketch' => $price->product_sketch_media, 'supplier_prod_number' => $price->supplier_prod_number, 'min_price' => number_format($price->min_price, 2, '.', ''), 'max_price' => number_format($price->max_price, 2, '.', ''), 'combination' => $combinations, 'ranges' => $ranges, ]; $price_chart[$price->id] = [ 'product_number' => $price->supplier_prod_number, 'wight' => number_format($price->shipping_weight, 2, '.', ''), 'length' => $price->length, 'width' => $price->width, 'height' => $price->height, ]; } // Reviews foreach ($this->reviews as $review) { $reviews[] = [ "name" => $review->user?->name, "rating" => $review->rating, "comment" => $review->comment, ]; } //Related Products $related_products = Product::where('category_id', $this->category_id) ->where('id', '<>', $this->id) ->active() ->limit(4) ->get(); foreach ($related_products as $related_product) { $p[] = [ 'id' => $related_product->id, 'sku' => $related_product->sku, 'slug' => $related_product->slug, 'name' => $related_product->name, 'price_from' => number_format($related_product->price_from, 2, '.', ''), 'price_to' => number_format($related_product->price_to, 2, '.', ''), 'featured_image' => $related_product->featured_image ? [ $related_product->featured_image->url, $related_product->featured_image->thumbnail, $related_product->featured_image->preview, ] : [], ]; } return [ 'id' => $this->id, 'sku' => $this->sku, 'slug' => $this->slug, 'name' => $this->name, 'description' => $this->description, 'category' => $this->category?->name, 'price_from' => number_format($this->price_from, 2, '.', ''), 'price_to' => number_format($this->price_to, 2, '.', ''), 'engraving' => $this->engraving, 'color_engraving' => $this->color_engraving, 'engraving_fee' => number_format($this->engraving_fee, 2, '.', ''), 'featured_image' => $this->featured_image ? [ $this->featured_image->url, $this->featured_image->thumbnail, $this->featured_image->preview, ] : [], 'gallery_images' => $this->gallery_images, 'variations' => $product_variations, 'product_prices' => $product_prices, 'price_chart' => $price_chart, 'reviews' => $reviews ?? [], 'related_products' => $p ?? [], ]; } } Resources/Admin/OrderRepeatResource.php 0000644 00000010614 15021222673 0014205 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Status; use Illuminate\Http\Resources\Json\JsonResource; class OrderRepeatResource extends JsonResource { public function toArray($request) { $orderItems = []; foreach ($this->items as $item) { $variations = $customization_array = []; foreach ($item->itemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->orderItemCustomizations as $customization){ $customization_array['url'][] = $customization->mediaUrl; } $product = $item->product; $productVariations = []; foreach ($product->variations ?? [] as $variation){ $v = $variation->variation; if($v){ $productVariations[$v->type][] = ['id' => $v->id, 'value' => $v->value]; } } $productPrices = []; foreach ($product->prices ?? [] as $price){ $combinations = $ranges = []; foreach ($price->combinations ?? [] as $combination){ $combinations[] = [ 'variation_id' => $combination->variation_id, ]; } foreach ($price->priceRanges ?? [] as $range){ $ranges[] = [ 'qty_from' => $range->qty_from, 'qty_to' => $range->qty_to, 'price' => $range->price, ]; } $productPrices[$price->id] = [ 'price_id' => $price->id, 'supplier_prod_number' => $price->supplier_prod_number, 'product_sketch' => $price->product_sketch_media, 'min_price' => $price->min_price, 'max_price' => $price->max_price, 'combination' => $combinations, 'ranges' => $ranges, ]; } $productDetails = [ 'id' => $product->id, 'sku' => $product->sku, 'name' => $product->name, 'description' => $product->description, 'category' => $product->category?->name, 'featured_image' => $product->featured_image ? [ $product->featured_image->url, $product->featured_image->thumbnail, $product->featured_image->preview ] :[], 'gallery_images' => $product->gallery_images, 'variations' => $productVariations, 'product_prices' => $productPrices ]; $orderItems[] = [ 'item_id' => $item->id, 'product_id' => $item->product_id, 'price_id' => $item->price_id, 'quantity' => $item->quantity, 'price' => $item->price, 'customization' => $customization_array, 'product_customization' => json_decode($item->customization ?? "[]"), 'template' => null, //$item->template_media, 'image' => $item->imageUrl, 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes': 'No', 'product_detail' => $productDetails ]; } return [ 'user_id' => $this->user_id, 'order_type' => $this->order_type, 'payment_type' => $this->payment_type, 'current_status_id' => $this->current_status_id, 'shipping_address_id' => $this->shipping_address_id, 'billing_address_id' => $this->billing_address_id, 'rush_order' => $this->rush_order, 'waive_off_sales_tax' => $this->waive_off_sales_tax, 'waive_off_sales_tax_reason' => $this->waive_off_sales_tax_reason, 'resale_number' => $this->resale_number, 'products' => $orderItems, ]; } } Resources/Admin/AddressBookResource.php 0000644 00000002321 15021222673 0014165 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AddressBookResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); return [ "id" => $this->id, "user_id" => $this->userId, "user" => $this->user_name, "company_name" => $this->company_name, "primary_contact_name" => $this->primary_contact_name, "primary_contact_email" => $this->primary_contact_email, "secondary_contact_name" => $this->secondary_contact_name, "secondary_contact_email" => $this->secondary_contact_email, "address_line_1" => $this->address_line_1, "address_line_2" => $this->address_line_2, "city" => $this->city, "state" => $this->state_name, "zipcode" => $this->zipcode, "phone_number" => $this->phone_number, "is_default" => $this->is_default, ]; } } Resources/Admin/OrderInfoEditResource.php 0000644 00000016440 15021222673 0014471 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Coupon; use App\Models\Status; use App\Models\User; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; class OrderInfoEditResource extends JsonResource { public function toArray($request) { $statuses = $order_items = []; $user = $this->user; $coupon_code = Coupon::where('id', $this->coupon_id)->first(); $existing_order_statuses = $this->statuses; foreach (Status::all() as $status) { $st = $existing_order_statuses->where('id', $status->id)->first(); if ($st) { $status_user = User::find($st->pivot->user_id); $checked = true; $notes = $st->pivot->notes ?: 'N/A'; $updated_by = $status_user->name ?? 'N/A'; $updated_at = $st->pivot->updated_at ? Carbon::make($st->pivot->updated_at)->diffForHumans() : 'N/A'; } else { $checked = false; $notes = 'N/A'; $updated_by = 'N/A'; $updated_at = 'N/A'; } $statuses[] = [ 'id' => $status->id, 'name' => $status->name, 'color' => $status->color, 'notes' => $notes, 'updated_by' => $updated_by, 'updated_at' => $updated_at, 'is_selected' => $checked, ]; } foreach ($this->items as $item) { $variations = $customization_array = []; foreach ($item->orderItemVariations as $variation) { $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->orderItemCustomizations as $customization) { $customization_array['url'][] = $customization->mediaUrl; } $order_items[] = [ 'product_id' => $item->product?->id, 'item_id' => $item->id, 'price_id' => $item->price_id, 'product_sku' => $item->product?->sku, 'product_price_sku' => $item->productPrice?->supplier_prod_number, 'product_slug' => $item->product?->slug, 'product_image' => $item->product?->featured_image?->preview, 'product' => $item->product?->name, 'product_vendor' => $item->product?->vendor?->name, 'quantity' => $item->quantity, 'price' => $item->price, 'customization' => $customization_array, 'product_customization' => json_decode($item->customization ?? "[]"), 'sketch_file' => $item->productPrice?->product_sketch_media, 'template' => $item->template_media ?: 'N/A', 'image' => $item->imageUrl ?: 'N/A', 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes' : 'No', ]; } return [ 'id' => $this->id, 'order_type' => $this->order_type, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0) . '%', 'order_number' => $this->order_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'payment_mode' => $this->payment_mode, 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'delivery_date' => $this->delivery_date?->format('Y-m-d'), 'event_date' => $this->event_date?->format('Y-m-d'), 'date_scheduled' => $this->date_scheduled?->format('Y-m-d'), 'date_pick_or_ship_by' => $this->date_pick_or_ship_by?->format('Y-m-d'), 'delivery_type' => $this->delivery_type, 'tracking_number' => $this->tracking_number, 'pickup_by' => $this->pickup_by, 'pickup_location_id' => $this->pickup_location_id, 'billing_address_id' => $this->billing_address_id, 'shipping_address_id' => $this->shipping_address_id, 'is_residential' => $this->is_residential, 'description' => $this->description, 'waive_off_sales_tax' => $this->waive_off_sales_tax, 'waive_off_sales_tax_reason' => $this->waive_off_sales_tax_reason, 'career_code' => $this->career_code, 'service_code' => $this->service_code, 'package_type_code' => $this->package_type_code, 'shipping_total_amount' => $this->shipping_charges, 'resale_number' => $this->resale_number, 'coupon_code' => $coupon_code?->code, 'current_status' => [ 'id' => $this->current_status_id, 'status' => $this->current_status?->name, ], 'products' => $order_items, 'user' => $user ? [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, ] : [], 'available_statuses' => $statuses, 'relational_shipping_address' => $this->shipping_address ? [ 'company_name' => $this->shipping_address->company_name, 'primary_contact_name' => $this->shipping_address->primary_contact_name, 'primary_contact_email' => $this->shipping_address->primary_contact_email, 'secondary_contact_name' => $this->shipping_address->secondary_contact_name, 'secondary_contact_email' => $this->shipping_address->secondary_contact_email, 'address_line_1' => $this->shipping_address->address_line_1, 'address_line_2' => $this->shipping_address->address_line_2, 'city' => $this->shipping_address->city, 'state' => $this->shipping_address->state->name, 'zipcode' => $this->shipping_address->zipcode, 'phone_number' => $this->shipping_address->phone_number, ] : [], 'relational_billing_address' => $this->billing_address ? [ 'company_name' => $this->billing_address->company_name, 'primary_contact_name' => $this->billing_address->primary_contact_name, 'primary_contact_email' => $this->billing_address->primary_contact_email, 'secondary_contact_name' => $this->billing_address->secondary_contact_name, 'secondary_contact_email' => $this->billing_address->secondary_contact_email, 'address_line_1' => $this->billing_address->address_line_1, 'address_line_2' => $this->billing_address->address_line_2, 'city' => $this->billing_address->city, 'state' => $this->billing_address->state->name, 'zipcode' => $this->billing_address->zipcode, 'phone_number' => $this->billing_address->phone_number, ] : [], ]; } } Resources/Admin/ReviewResource.php 0000644 00000001123 15021222673 0013225 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ReviewResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); return [ 'id' => $this->id, 'product' => $this->product?->name, 'user' => $this->user?->name, 'rating' => $this->rating, 'comment' => $this->comment, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/TopSellingV2Resource.php 0000644 00000000764 15021222673 0014266 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class TopSellingV2Resource extends JsonResource { public function toArray($request) { return [ "product_name" => $this->product_name, "sku" => $this->sku, "vendor_name" => $this->vendor_name, "total_quantity" => number_format($this->total_quantity), "total_price" => "$" . number_format($this->total_price, 2), ]; } } Resources/Admin/VariationResource.php 0000644 00000001237 15021222673 0013726 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class VariationResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "type" => $this->type, "value" => $this->value, "vendor_id" => $this->vendor_id, "vendor_name" => $this->vendor?->name, "vendor_price" => $this->vendor_price, "sku" => $this->sku, "status" => $this->status, "created_at" => $this->created_at->format('m-d-Y'), "updated_at" => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/StoreLocationEditResource.php 0000644 00000000644 15021222673 0015366 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StoreLocationEditResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'state_id' => $this->state_id, 'title' => $this->title, 'address' => $this->address, 'status' => $this->status, ]; } } Resources/Admin/WorkOrder.php 0000644 00000020520 15021222673 0012174 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\SiteSetting; use Illuminate\Http\Resources\Json\JsonResource; class WorkOrder extends JsonResource { public function toArray($request) { $order_items = []; $user = $this->user; foreach ($this->items as $item) { $variations = $svgs = []; foreach ($item->orderItemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->customizationSvg as $svg){ $svgs[] = [ 'order_id' => $svg->order_id, 'order_item_id' => $svg->order_item_id, 'customization_index' => $svg->customization_index, 'url' => $svg->customization_svg_url, ]; } $order_items[] = [ 'product_id' => $item->product?->id, 'product_description' => $item->product?->description, 'product_sku' => $item->productPrice?->supplier_prod_number, 'product_image' => $item->product?->featured_image?->preview, 'product' => $item->product?->name, 'quantity' => $item->quantity, 'product_customization' => json_decode($item->customization ?? '[]'), 'sketch_file' => $item->productPrice?->product_sketch_media, 'template' => $item->template_media ?: 'N/A', 'image' => $item->imageUrl ?: 'N/A', 'variations' => $variations, 'notes' => $item->notes, 'customization_svgs' => $svgs, 'template_pages' => getTemplatePngs($this->user_id, $item->id), ]; } //Business Information $site_email = SiteSetting::where('key', 'Site Email')->first(); $site_phone = SiteSetting::where('key', 'Site Phone')->first(); $location_1 = SiteSetting::where('key', 'Location')->first(); $location_2 = SiteSetting::where('key', 'Location 2')->first(); $business_information = [ 'site_email' => $site_email->value ?? "NA", 'site_phone' => $site_phone->value ?? "NA", 'location_1' => $location_1->value ?? "NA", 'location_2' => $location_2->value ?? "NA", ]; return [ 'invoice' => $this->invoice ? [ "invoice_number" => $this->invoice->invoice_number, "invoice_date" => $this->invoice->created_at->format('m/d/Y') ] : null, 'assigned_to' => $this->assigned_to?->name, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0).'%', 'order_number' => $this->order_number, 'tracking_number' => $this->tracking_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'cc_details' => $this->payment ? [ 'last_four' => $this->payment->last_four, 'card_type' => $this->payment->account_type, 'payment_date' => $this->payment->created_at->format('m/d/Y'), 'transaction_id' => $this->payment->transaction_id ] : [], 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'date_pick_or_ship_by' => $this->date_pick_or_ship_by?->format('m/d/Y'), 'event_date' => $this->event_date?->format('m/d/Y'), 'created_at' => $this->created_at?->format('m/d/Y H:i:s'), 'delivery_type' => $this->delivery_type, 'pickup_location_title' => $this->pickLocation?->title, 'pickup_location_address' => $this->pickLocation?->address, 'billing_details' => [ 'billing_company_name' => $this->billing_company_name, 'billing_primary_contact_name' => $this->billing_primary_contact_name, 'billing_primary_contact_email' => $this->billing_primary_contact_email, 'billing_secondary_contact_name' => $this->billing_secondary_contact_name, 'billing_secondary_contact_email' => $this->billing_secondary_contact_email, 'billing_address_line_1' => $this->billing_address_line_1, 'billing_address_line_2' => $this->billing_address_line_2, 'billing_city' => $this->billing_city, 'billing_state' => $this->billing_state, 'billing_zipcode' => $this->billing_zipcode, 'billing_phone_number' => $this->billing_phone_number, ], 'shipping_details' => $this->delivery_type == 'Shipping' ? [ 'career_code' => str_replace('_', ' ', $this->career_code), 'service_code' => str_replace('_', ' ', $this->service_code), 'package_type_code' => str_replace('_', ' ', $this->package_type_code), 'shipping_company_name' => $this->shipping_company_name, 'shipping_primary_contact_name' => $this->shipping_primary_contact_name, 'shipping_primary_contact_email' => $this->shipping_primary_contact_email, 'shipping_secondary_contact_name' => $this->shipping_secondary_contact_name, 'shipping_secondary_contact_email' => $this->shipping_secondary_contact_email, 'shipping_address_line_1' => $this->shipping_address_line_1, 'shipping_address_line_2' => $this->shipping_address_line_2, 'shipping_city' => $this->shipping_city, 'shipping_state' => $this->shipping_state, 'shipping_zipcode' => $this->shipping_zipcode, ] : [], 'description' => $this->description, 'current_status' => $this->current_status?->name, 'stock_location' => $this->stockLocation ? $this->stockLocation->location : null, 'business_information' => $business_information, 'products' => $order_items, 'user' => $user ? [ 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, ] : [], 'relational_shipping_address' => $this->shipping_address ? [ 'company_name' => $this->shipping_address->company_name, 'primary_contact_name' => $this->shipping_address->primary_contact_name, 'primary_contact_email' => $this->shipping_address->primary_contact_email, 'secondary_contact_name' => $this->shipping_address->secondary_contact_name, 'secondary_contact_email' => $this->shipping_address->secondary_contact_email, 'address_line_1' => $this->shipping_address->address_line_1, 'address_line_2' => $this->shipping_address->address_line_2, 'city' => $this->shipping_address->city, 'state' => $this->shipping_address->state->name, 'zipcode' => $this->shipping_address->zipcode, 'phone_number' => $this->shipping_address->phone_number, ] : [], 'relational_billing_address' => $this->billing_address ? [ 'company_name' => $this->billing_address->company_name, 'primary_contact_name' => $this->billing_address->primary_contact_name, 'primary_contact_email' => $this->billing_address->primary_contact_email, 'secondary_contact_name' => $this->billing_address->secondary_contact_name, 'secondary_contact_email' => $this->billing_address->secondary_contact_email, 'address_line_1' => $this->billing_address->address_line_1, 'address_line_2' => $this->billing_address->address_line_2, 'city' => $this->billing_address->city, 'state' => $this->billing_address->state->name, 'zipcode' => $this->billing_address->zipcode, 'phone_number' => $this->billing_address->phone_number, ] : [], ]; } } Resources/Admin/ContactQueryResource.php 0000644 00000001320 15021222673 0014404 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ContactQueryResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'phone' => $this->phone, 'subject' => $this->subject, 'message' => $this->message, 'is_read' => (bool) $this->is_read, 'department' => $this->department, 'location' => $this->location?->title, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/RoleResource.php 0000644 00000000572 15021222673 0012674 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class RoleResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "title" => $this->title, "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/PONonGroupResource.php 0000644 00000001442 15021222673 0013776 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PONonGroupResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'order_number' => $this->order_number, 'ordered_by' => $this->ordered_by, 'vendor_name' => $this->vendor_name, 'payment_terms' => $this->payment_terms, 'reference' => $this->reference, 'shipping_address' => $this->shipping_address, 'billing_address' => $this->billing_address, 'total_quantity' => $this->total_quantity, 'total_price' => '$'.number_format($this->total_price, 2), 'create_at' => $this->created_at->format('m-d-Y') ]; } } Resources/Admin/PurchaseItemsResource.php 0000644 00000000716 15021222673 0014547 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PurchaseItemsResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'product_id' => $this->product_id, 'attribute_id' => $this->attribute_id, 'attribute_option_id' => $this->attribute_option_id, 'quantity' => $this->quantity, ]; } } Resources/Admin/RoleResourceWithChecks.php 0000644 00000001450 15021222673 0014645 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Permission; use Illuminate\Http\Resources\Json\JsonResource; class RoleResourceWithChecks extends JsonResource { public function toArray($request) { $user_permissions = $permissions = []; foreach ($this->permissions ?? [] as $permission){ $user_permissions[] = $permission->id; } foreach (Permission::all() as $permission){ $permissions[] = [ 'id' => $permission->id, 'title' => $permission->title, 'is_selected' => in_array($permission->id, $user_permissions), ]; } return [ 'id' => $this->id, 'title' => $this->title, 'permissions' => $permissions, ]; } } Resources/Admin/StoreLocationResource.php 0000644 00000001046 15021222673 0014555 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StoreLocationResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'state' => $this->state?->name, 'title' => $this->title, 'address' => $this->address, 'status' => $this->status_name, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/ReportYearOverYearResource.php 0000644 00000000705 15021222673 0015542 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; class ReportYearOverYearResource extends JsonResource { public function toArray($request = null) { $start_date = Carbon::createFromFormat('d-m-Y', '2023-01-01'); return [ 'order_number' => $this->order_number, 'date' => $this->date, 'amount' => $this->amount, ]; } } Resources/Admin/OurPartnerResource.php 0000644 00000001041 15021222673 0014064 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Role; use App\Models\User; use Illuminate\Http\Resources\Json\JsonResource; class OurPartnerResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'logo' => $this->logo?->url, 'status' => $this->status_name, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/OrderDashboardResource.php 0000644 00000002472 15021222673 0014657 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\SiteSetting; use Illuminate\Http\Resources\Json\JsonResource; class OrderDashboardResource extends JsonResource { public function toArray($request) { $sub_total = $this->items()?->sum('total_price_after_engraving'); //Rush order Calculation () $grand_total = $sub_total + $this->rush_order_amount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1) $grand_total += $this->sales_tax_amount; return [ 'id' => $this->id, 'order_number' => $this->order_number, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0).'%', 'rush_order_amount' => '$'.number_format($this->rush_order_amount, 2), 'total_quantity' => $this->items()?->sum('quantity'), 'sub_total' => '$'.number_format($sub_total, 2), 'state_sales_tax' => [ 'percentage' => $this->state_sales_tax, 'amount' => number_format($this->sales_tax_amount, 2), ], 'shipping_fee' => '$'.(number_format($this->shipping_charges, 2)), 'grand_total' => '$'.(number_format($grand_total, 2)), ]; } } Resources/Admin/ProductResource.php 0000644 00000001445 15021222673 0013413 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Product; use Illuminate\Http\Resources\Json\JsonResource; class ProductResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'slug' => $this->slug, 'category' => $this->category?->name, 'featured_image' => $this->featured_image?->thumbnail, 'status' => $this->status_name, 'is_draft' => Product::DRAFT_RADIO[$this->is_draft], 'product_type' => Product::PRODUCT_TYPE[$this->product_type], 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/StatusResource.php 0000644 00000000572 15021222673 0013256 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StatusResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/StockLocationResource.php 0000644 00000000727 15021222673 0014551 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StockLocationResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'location' => $this->location, 'status' => $this->status_name, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/CategoryListResource.php 0000644 00000000442 15021222673 0014400 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CategoryListResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } } Resources/Admin/AttributeOptionResource.php 0000644 00000000361 15021222673 0015123 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AttributeOptionResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/CategoryResource.php 0000644 00000001324 15021222673 0013544 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CategoryResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "image" => [ "thumbnail" => $this->image?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), "url" => $this->image?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/PurchaseOrderResource.php 0000644 00000001606 15021222673 0014540 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PurchaseOrderResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'order_number' => $this->order_number, 'ordered_by' => $this->user?->name, 'vendor' => $this->vendor?->name, 'payment_terms' => $this->payment_terms, 'reference' => $this->reference, 'shipping_address' => $this->shipping_address, 'billing_address' => $this->billing_address, 'total_quantity' => $this->total_quantity, 'stock_location' => $this->location?->location, 'total_price' => '$'.number_format($this->total_price, 2), 'status' => $this->status, 'create_at' => $this->created_at->format('m-d-Y') ]; } } Resources/Admin/CouponResource.php 0000644 00000000350 15021222673 0013230 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CouponResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/ReviewUserResource.php 0000644 00000001211 15021222673 0014062 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ReviewUserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'product' => [ 'product_id' => $this->product_id, 'name' => $this->product?->name, ], // 'order_id' => $this->order_id, 'rating' => $this->rating, 'comment' => $this->comment, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/SiteSettingResource.php 0000644 00000000355 15021222673 0014234 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class SiteSettingResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/StateSalesTaxResource.php 0000644 00000000357 15021222673 0014521 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StateSalesTaxResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/PermissionResource.php 0000644 00000000354 15021222673 0014121 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PermissionResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/InvoiceResource.php 0000644 00000001106 15021222673 0013361 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class InvoiceResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "user" => $this->order?->user?->name, "invoice_number" => $this->invoice_number, "order_number" => $this->order?->order_number, "pdf" => $this->invoiceUrl, "created_at" => $this->created_at->format('m-d-Y'), "updated_at" => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/AttributeListResource.php 0000644 00000000443 15021222673 0014567 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AttributeListResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, ]; } } Resources/Admin/AddressBookUserResource.php 0000644 00000002140 15021222673 0015023 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AddressBookUserResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); return [ "id" => $this->id, "company_name" => $this->company_name, "primary_contact_name" => $this->primary_contact_name, "primary_contact_email" => $this->primary_contact_email, "secondary_contact_name" => $this->secondary_contact_name, "secondary_contact_email" => $this->secondary_contact_email, "address_line_1" => $this->address_line_1, "address_line_2" => $this->address_line_2, "city" => $this->city, "state" => $this->state?->name, "zipcode" => $this->zipcode, "phone_number" => $this->phone_number, "is_default" => $this->is_default, ]; } } Resources/Admin/AttributeByIdResource.php 0000644 00000000443 15021222673 0014503 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AttributeByIdResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } } Resources/Admin/VendorResource.php 0000644 00000000350 15021222673 0013222 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class VendorResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/AddressBookSpecificResource.php 0000644 00000002233 15021222673 0015635 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AddressBookSpecificResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); return [ "id" => $this->id, "user_id" => $this->user_id, "company_name" => $this->company_name, "primary_contact_name" => $this->primary_contact_name, "primary_contact_email" => $this->primary_contact_email, "secondary_contact_name" => $this->secondary_contact_name, "secondary_contact_email" => $this->secondary_contact_email, "address_line_1" => $this->address_line_1, "address_line_2" => $this->address_line_2, "city" => $this->city, "state_id" => $this->state_id, "zipcode" => $this->zipcode, "phone_number" => $this->phone_number, "is_default" => $this->is_default, ]; } } Resources/Admin/OrderResource.php 0000644 00000007561 15021222673 0013053 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Status; use Illuminate\Http\Resources\Json\JsonResource; class OrderResource extends JsonResource { public function toArray($request) { $total_items_qty = $this->items->sum('quantity') ?? 0; $total_engraving_fee = $this->items->sum('engraving_fee') ?? 0; $existing_order_statuses = $this->statuses; foreach (Status::all() as $status) { $st = $existing_order_statuses->where('id', $status->id)->first(); if ($st) { $checked = true; $notes = $st->pivot->notes; } else { $checked = false; $notes = null; } $statuses[] = [ 'id' => $status->id, 'name' => $status->name, 'color' => $status->color, 'notes' => $notes, 'is_selected' => $checked, ]; } $sub_total_after_discount = ($this->items_total + $this->rush_order_amount) - $this->discount_total; $grand_total = $sub_total_after_discount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1) { $grand_total += $this->sales_tax_amount; } return [ 'id' => $this->id, 'order_number' => $this->order_number, 'book_number' => $this->book_number, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0) . '%', 'admin_approved' => $this->admin_approved_status, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'cheque_number' => $this->cheque_number, 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'user_name' => $this->user?->name, 'user_email' => $this->user?->email, 'billing_company_name' => $this->billing_company_name, 'assigned_to' => $this->assigned_to?->name, 'current_status' => $this->current_status?->name, 'is_completed' => $this->current_status_id == 13 || $this->current_status_id == 14, 'total_products' => $total_items_qty, 'engraving_fee' => '$' . number_format($total_engraving_fee, 2), 'sub_total' => '$' . (number_format($this->items_total, 2)), 'sub_total_after_discount' => '$' . (number_format($sub_total_after_discount, 2)), 'discount' => $this->discount_type != null ? [ 'discount_type' => $this->discount_type, 'discount_value' => $this->discount_value, 'discount_total' => $this->discount_total, ] : null, 'state_sales_tax' => [ 'percentage' => $this->state_sales_tax, 'amount' => number_format($this->sales_tax_amount, 2), ], 'waive_off_sales_tax' => $this->waive_off_sales_tax == 1 ? 'Yes' : 'No', 'shipping_charges' => '$' . number_format($this->shipping_charges, 2), 'grand_total' => '$' . (number_format($grand_total, 2)), 'paid_order_amount' => '$' . (number_format($this->paid_order_amount, 2)), 'remaining_order_amount' => '$' . (number_format($this->remaining_order_amount, 2)), 'delivery_date' => $this->delivery_date?->format('Y-m-d'), 'event_date' => $this->event_date?->format('Y-m-d'), 'delivery_type' => $this->delivery_type, 'tracking_number' => $this->tracking_number, 'pickup_by' => $this->pickup_by, 'description' => $this->description, 'stock_location' => $this->stockLocation?->location, 'statuses' => $statuses, ]; } } Resources/Admin/UserEmployeeResource.php 0000644 00000000442 15021222673 0014405 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class UserEmployeeResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } } Resources/Admin/POReportGroupedResource.php 0000644 00000000564 15021222673 0015034 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class POReportGroupedResource extends JsonResource { public function toArray($request) { return [ 'vendor_name' => $this->vendor_name, 'total_quantity' => $this->quantity, 'total_price' => "$".$this->total, ]; } } Resources/Admin/ImportedProductsResource.php 0000644 00000001231 15021222673 0015273 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ImportedProductsResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "imported_by" => $this->user?->name, "file_name" => $this->file_url?->name, "file_url" => $this->file_url?->url, "status" => $this->status, "completed_at" => $this->completed_at ?? "Never", "created_at" => $this->created_at->format('m-d-Y'), "updated_at" => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/UserResource.php 0000644 00000002671 15021222673 0012713 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->full_name, "email" => $this->email, "contact_number" => $this->contact_number, "status" => $this->status, "email_verified" => $this->hasVerifiedEmail(), "avatar" => [ "thumbnail" => $this->avatar?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->full_name, 0, 2)), "url" => $this->avatar?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->full_name, 0, 2)), ], "organization" => [ "id" => $this->organization->id, "name" => $this->organization->name, "logo" => [ "thumbnail" => $this->organization->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . substr($this->organization->name, 0, 2), "url" => $this->organization->logo?->url ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . substr($this->organization->name, 0, 2), ] ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/OfficeSuppliesResource.php 0000644 00000001443 15021222673 0014711 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class OfficeSuppliesResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'vendor_id' => $this->vendor_id, 'vendor_name' => $this->vendor?->name ?? "", 'sku' => $this->sku, 'name' => $this->name, 'description' => $this->description, 'price' => $this->price, 'featured_image' => $this->supply_featured_image?->thumbnail, 'status_name' => $this->status_name, 'status' => $this->status, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/ProductDetailsResource.php 0000644 00000005467 15021222673 0014731 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Category; use App\Models\Variation; use App\Models\Vendor; use Illuminate\Http\Resources\Json\JsonResource; class ProductDetailsResource extends JsonResource { public function toArray($request) { $variations = $combinations = []; $v_ids = $this->variations->map(function ($item) { return $item['variation_id']; })->toArray(); $variations_all = Variation::all(); foreach ($variations_all as $variation){ $variations[] = [ 'id' => $variation->id, 'type' => $variation->type, 'value' => $variation->value, 'is_selected' => in_array($variation->id, $v_ids), ]; } foreach ($this->prices ?? [] as $price){ $combination_variations = $combination_price_ranges = []; foreach ($price->combinations ?? [] as $c_v){ $combination_variations[] = $c_v->variation_id; } foreach ($price->priceRanges ?? [] as $p_r){ $combination_price_ranges[] = [ 'qty_from' => $p_r->qty_from, 'qty_to' => $p_r->qty_to, 'price' => $p_r->price, ]; } $combinations[] = [ 'price_id' => $price->id, 'product_sketch' => $price->product_sketch_media, 'vendor_price' => $price->vendor_price, 'supplier_prod_number' => $price->supplier_prod_number, 'shipping_weight' => $price->shipping_weight, 'length' => $price->length, 'width' => $price->width, 'height' => $price->height, 'variations' => $combination_variations, 'price_ranges' => $combination_price_ranges, ]; } return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'slug' => $this->slug, 'description' => $this->description, 'engraving' => $this->engraving, 'color_engraving' => $this->color_engraving, 'engraving_fee' => $this->engraving_fee, 'featured_image' => $this->featured_image ? [ 'url' => $this->featured_image->url, 'thumbnail' => $this->featured_image->thumbnail, 'preview' => $this->featured_image->preview ] :[], 'variations' => $variations, 'combinations' => $combinations, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/OutstandingOrderResource.php 0000644 00000003517 15021222673 0015270 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class OutstandingOrderResource extends JsonResource { public function toArray($request) { $sub_total = 0; $user = $this->user; foreach ($this->items as $item) { $sub_total += $item->total_price_after_engraving; } $sub_total_after_discount = ($sub_total + $this->rush_order_amount) - $this->discount_total; $grand_total = $sub_total_after_discount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1) { $grand_total += $this->sales_tax_amount; } return [ 'id' => $this->id, 'rush_order' => $this->rush_order, 'order_number' => $this->order_number, 'purchase_order_number' => $this->purchase_order_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'delivery_date' => $this->delivery_date?->format('m-d-Y'), 'event_date' => $this->event_date?->format('m-d-Y'), 'date_scheduled' => $this->date_scheduled?->format('m-d-Y'), 'date_pick_or_ship_by' => $this->date_pick_or_ship_by?->format('m-d-Y'), 'delivery_type' => $this->delivery_type, 'current_status' => $this->current_status?->name, 'waive_off_sales_tax' => $this->waive_off_sales_tax, 'waive_off_sales_tax_reason' => $this->waive_off_sales_tax_reason, 'grand_total' => '$'.(number_format($grand_total, 2)), 'created_at' => $this->created_at->format('m-d-Y'), 'user' => $user ? [ 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, ] : [], ]; } } Resources/Admin/CalendarWidgetResource.php 0000644 00000001342 15021222673 0014644 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CalendarWidgetResource extends JsonResource { public function toArray($request) { $total = $this->total; $color = match (true) { in_array($total, range(1, 5)) => '#00FF00', in_array($total, range(6, 11)) => '#FFFF00', in_array($total, range(12, 18)) => '#FFA500', $total > 18 => '#FF0000', default => '', }; return [ 'date' => $this->delivery_date?->format('Y-m-d'), 'day' => substr($this->delivery_date?->format('D'), 0, 1), 'total' => $this->total, 'color' => $color, ]; } } Resources/Admin/OrderNotesResource.php 0000644 00000001770 15021222673 0014060 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class OrderNotesResource extends JsonResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable */ public function toArray($request) { $note_documents = null; if ($this->getMedia("*")->count() > 0) { foreach ($this->getMedia("*") as $media) { $note_documents = [ 'url' => $media->getUrl(), 'is_image' => str_contains($media->mime_type, 'image'), ]; } } return [ 'user_name' => $this->user?->name, 'note' => $this->note, 'note_documents' => $note_documents, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/AttributeResource.php 0000644 00000000767 15021222673 0013744 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AttributeResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); return [ 'id' => $this->id, 'name' => $this->name, 'status' => $this->status_name, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/OrderInfoResource.php 0000644 00000027511 15021222673 0013664 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Status; use App\Models\User; use Illuminate\Http\Resources\Json\JsonResource; class OrderInfoResource extends JsonResource { public function toArray($request) { $statuses = $order_items = []; $sub_total = $total_engraving_fee = 0; $user = $this->user; $updatable_statuses = []; $all_statuses = Status::where('id', '!=', 12)->get(); foreach ($all_statuses as $status) { $updatable_statuses[] = [ 'id' => $status->id, 'name' => $status->name, ]; } foreach ($this->statuses as $sts) { $status_user = User::find($sts->pivot->user_id); $statusId = $sts->pivot->status_id; $notes = $sts->pivot->notes; $updated_by = $status_user->name ?? 'N/A'; $updated_at = $sts->pivot->updated_at; $db_status = $all_statuses->where('id', $statusId)->first(); if($db_status) { $statuses[] = [ 'id' => $statusId, 'name' => $db_status->name, 'color' => $db_status->color, 'notes' => $notes ?? 'N/A', 'updated_by' => $updated_by, 'updated_at' => $updated_at->format('m-d-Y h:i:s'), 'is_selected' => true, ]; } } foreach ($this->items as $item) { $variations = $svgs = []; foreach ($item->orderItemVariations as $variation){ $variations[] = [ 'id' => $variation->variation?->id, 'type' => $variation->variation?->type, 'value' => $variation->variation?->value, ]; } foreach ($item->customizationSvg as $svg){ $svgs[] = [ 'order_id' => $svg->order_id, 'order_item_id' => $svg->order_item_id, 'customization_index' => $svg->customization_index, 'url' => $svg->customization_svg_url, ]; } $order_items[] = [ 'product_id' => $item->product?->id, 'product_sku' => $item->product?->sku, 'product_price_sku' => $item->productPrice?->supplier_prod_number, 'product_slug' => $item->product?->slug, 'product_image' => $item->product?->featured_image?->preview, 'product' => $item->product?->name, 'product_vendor' => $item->product?->vendor?->name, 'quantity' => $item->quantity, 'price' => '$'.number_format($item->price, 2), 'engraving_fee' => $item->engraving_fee, 'product_total' => '$'.number_format($item->total_price, 2), // 'customization' => $customization_array, 'product_customization' => json_decode($item->customization ?? '[]'), 'sketch_file' => $item->productPrice?->product_sketch_media, 'template' => $item->template_media ?: 'N/A', 'image' => $item->imageUrl ?: 'N/A', 'variations' => $variations, 'notes' => $item->notes, 'approved_consent' => $item->approved_consent ? 'Yes': 'No', 'customization_svgs' => $svgs, ]; $sub_total += $item->total_price_after_engraving; $total_engraving_fee += $item->engraving_fee; } //Rush order Calculation () $sub_total_after_discount = ($sub_total + $this->rush_order_amount) - $this->discount_total; $grand_total = $sub_total_after_discount + $this->shipping_charges; if ($this->waive_off_sales_tax != 1){ $grand_total += $this->sales_tax_amount; } foreach ($this->partialPayments as $partialPayment){ $payments[] = [ 'id' => $partialPayment->id, 'charged_by' => $partialPayment->user->name, 'payment_type' => $partialPayment->payment_type, 'amount' => "$".number_format($partialPayment->amount, 2), 'cheque_number' => $partialPayment->cheque_number, 'purchase_order_number' => $partialPayment->purchase_order_number, 'purchase_order_copy' => $partialPayment->purchase_order_copy_url, 'cc_details' => $partialPayment->payment ? [ 'last_four' => $partialPayment->payment->last_four, 'card_type' => $partialPayment->payment->account_type, 'payment_date' => $partialPayment->payment->created_at->format('m-d-Y h:i:s'), 'transaction_id' => $partialPayment->payment->transaction_id ] : [], 'created_at' => $partialPayment->created_at->format('m-d-Y h:i:s'), ]; } return [ 'id' => $this->id, 'assigned_to' => $this->assigned_to?->name, 'order_type' => $this->order_type, 'rush_order' => $this->rush_order, 'rush_order_fee' => ($this->rush_order_fee ?? 0).'%', 'order_number' => $this->order_number, 'book_number' => $this->book_number, 'payment_status' => $this->payment_status, 'payment_date' => $this->formated_payment_date, 'payment_type' => $this->payment_type, 'payment_mode' => $this->payment_mode, 'cc_details' => $this->payment ? [ 'last_four' => $this->payment->last_four, 'card_type' => $this->payment->account_type, 'payment_date' => $this->payment->created_at->format('Y-m-d'), 'transaction_id' => $this->payment->transaction_id ] : [], 'cheque_number' => $this->cheque_number, 'notes_count' => $this->notes->count(), 'purchase_order_number' => $this->purchase_order_number ?? 'N/A', 'purchase_order_copy' => $this->purchase_order_copy_url ?? 'N/A', 'delivery_date' => $this->delivery_date?->format('Y-m-d'), 'event_date' => $this->event_date?->format('Y-m-d'), 'date_scheduled' => $this->date_scheduled?->format('Y-m-d'), 'date_pick_or_ship_by' => $this->date_pick_or_ship_by?->format('Y-m-d'), 'delivery_type' => $this->delivery_type, 'tracking_number' => $this->tracking_number, 'pickup_by' => $this->pickup_by, 'pickup_location_title' => $this->pickLocation?->title, 'pickup_location_address' => $this->pickLocation?->address, 'billing_company_name' => $this->billing_company_name, 'billing_primary_contact_name' => $this->billing_primary_contact_name, 'billing_primary_contact_email' => $this->billing_primary_contact_email, 'billing_secondary_contact_name' => $this->billing_secondary_contact_name, 'billing_secondary_contact_email' => $this->billing_secondary_contact_email, 'billing_address_line_1' => $this->billing_address_line_1, 'billing_address_line_2' => $this->billing_address_line_2, 'billing_city' => $this->billing_city, 'billing_state' => $this->billing_state, 'billing_zipcode' => $this->billing_zipcode, 'billing_phone_number' => $this->billing_phone_number, 'shipping_company_name' => $this->shipping_company_name, 'shipping_primary_contact_name' => $this->shipping_primary_contact_name, 'shipping_primary_contact_email' => $this->shipping_primary_contact_email, 'shipping_secondary_contact_name' => $this->shipping_secondary_contact_name, 'shipping_secondary_contact_email' => $this->shipping_secondary_contact_email, 'shipping_address_line_1' => $this->shipping_address_line_1, 'shipping_address_line_2' => $this->shipping_address_line_2, 'shipping_city' => $this->shipping_city, 'shipping_state' => $this->shipping_state, 'shipping_zipcode' => $this->shipping_zipcode, 'is_residential' => $this->is_residential ? 'Yes' : 'No', 'description' => $this->description, 'current_status' => $this->current_status?->name, 'cancellation_charges' => $this->cancellation_charges, 'waive_off_sales_tax' => $this->waive_off_sales_tax, 'waive_off_sales_tax_reason' => $this->waive_off_sales_tax_reason, 'stock_location' => $this->stockLocation?->location, 'resale_number' => $this->resale_number, 'products' => $order_items, 'sub_total' => '$'.number_format($sub_total, 2), 'sub_total_after_discount' => '$'.number_format($sub_total_after_discount, 2), 'engraving_fee' => '$'.number_format($total_engraving_fee, 2), 'discount' => $this->discount_type != null ? [ 'discount_type' => $this->discount_type, 'discount_value' => $this->discount_value, 'discount_total' => $this->discount_total, ] : null, 'state_sales_tax' => [ 'percentage' => $this->state_sales_tax, 'amount' => '$'.number_format($this->sales_tax_amount, 2), ], 'shipping_charges' => '$'.number_format($this->shipping_charges, 2), 'grand_total' => '$'.(number_format($grand_total, 2)), 'paid_order_amount' => '$'.(number_format($this->paid_order_amount, 2)), 'remaining_order_amount' => $this->remaining_order_amount, 'partial_payments' => $payments ?? [], 'user' => $user ? [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, ] : [], 'available_statuses' => $statuses, 'updatable_statuses' => $updatable_statuses, 'relational_shipping_address' => $this->shipping_address ? [ 'company_name' => $this->shipping_address->company_name, 'primary_contact_name' => $this->shipping_address->primary_contact_name, 'primary_contact_email' => $this->shipping_address->primary_contact_email, 'secondary_contact_name' => $this->shipping_address->secondary_contact_name, 'secondary_contact_email' => $this->shipping_address->secondary_contact_email, 'address_line_1' => $this->shipping_address->address_line_1, 'address_line_2' => $this->shipping_address->address_line_2, 'city' => $this->shipping_address->city, 'state' => $this->shipping_address->state->name, 'zipcode' => $this->shipping_address->zipcode, 'phone_number' => $this->shipping_address->phone_number, ] : [], 'relational_billing_address' => $this->billing_address ? [ 'company_name' => $this->billing_address->company_name, 'primary_contact_name' => $this->billing_address->primary_contact_name, 'primary_contact_email' => $this->billing_address->primary_contact_email, 'secondary_contact_name' => $this->billing_address->secondary_contact_name, 'secondary_contact_email' => $this->billing_address->secondary_contact_email, 'address_line_1' => $this->billing_address->address_line_1, 'address_line_2' => $this->billing_address->address_line_2, 'city' => $this->billing_address->city, 'state' => $this->billing_address->state->name, 'zipcode' => $this->billing_address->zipcode, 'phone_number' => $this->billing_address->phone_number, ] : [], ]; } } Resources/Admin/PurchaseOrderDetailsResource.php 0000644 00000007447 15021222673 0016057 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PurchaseOrderDetailsResource extends JsonResource { public function toArray($request) { $po_items = []; foreach ($this->orderDetails as $item){ $orders = []; foreach ($item->ordersPODetails as $ordersPODetail) { if ($ordersPODetail->order_id) { $orders[] = [ 'order_id' => $ordersPODetail->order_id, 'order_number' => $ordersPODetail?->order?->order_number, 'quantity' => $ordersPODetail->quantity, ]; } else { $orders[] = [ 'extra_quantity' => $ordersPODetail->quantity, ]; } } $variations = []; if ($item->product_type == 'office_supplies') { $po_items[] = [ 'id' => $item->id, 'product_id' => $item->officeSupply?->name, 'product_number' => $item->product_number, 'product_type' => $item->product_type, 'product_variations' => $variations, 'quantity' => $item->quantity, 'price' => $item->price, 'total_price' => $item->total_price, 'featured_image' => $item->officeSupply?->supply_featured_image ? [ 'url' => $item->officeSupply?->supply_featured_image->url, 'thumbnail' => $item->officeSupply?->supply_featured_image->thumbnail, 'preview' => $item->officeSupply?->supply_featured_image->preview ] :[], 'orders' => [], ]; } else { if ($item->product_type == 'standard') { foreach ($item->productPrice->combinations ?? [] as $combination) { $variations[] = $combination->variation->type.': '.$combination->variation->value; } } $po_items[] = [ 'id' => $item->id, 'product_id' => $item->product_type == 'standard' ? $item->product?->name : $item->variation?->value, 'product_number' => $item->product_number, 'product_type' => $item->product_type, 'product_variations' => $variations, 'quantity' => $item->quantity, 'price' => $item->price, 'total_price' => $item->total_price, 'featured_image' => $item->product?->featured_image ? [ 'url' => $item->product?->featured_image->url, 'thumbnail' => $item->product?->featured_image->thumbnail, 'preview' => $item->product?->featured_image->preview ] :[], 'orders' => $orders, ]; } } return [ 'id' => $this->id, 'order_number' => $this->order_number, 'ordered_by' => $this->user?->name, 'vendor' => $this->vendor?->name, 'payment_terms' => $this->payment_terms, 'reference' => $this->reference, 'admin_notes' => $this->admin_notes, 'shipping_address' => $this->shipping_address, 'billing_address' => $this->billing_address, 'total_quantity' => $this->total_quantity, 'total_price' => '$'.number_format($this->total_price, 2), 'status' => $this->status, 'created_at' => $this->created_at->format('m/d/Y H:i:s'), 'products' => $po_items, ]; } } Resources/Admin/UserResourceWithRoles.php 0000644 00000004027 15021222673 0014551 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Role; use App\Models\User; use Illuminate\Http\Resources\Json\JsonResource; class UserResourceWithRoles extends JsonResource { public function toArray($request) { // return parent::toArray($request); $user_roles = $roles = $status = $user_types = []; //User existing roles foreach ($this->roles ?? [] as $role){ $user_roles[$role->id] = $role->title; } foreach (Role::all() as $role){ $roles[$role->id] = [ 'id' => $role->id, 'title' => $role->title, 'is_selected' => array_key_exists($role->id, $user_roles), ]; } foreach (User::USER_TYPE_RADIO as $key => $type){ $user_types[] = [ 'id' => $key, 'name' => $type, 'is_selected' => $key == $this->user_type, ]; } foreach (User::STATUS_RADIO as $key => $st){ $status[] = [ 'id' => $key, 'name' => $st, 'is_selected' => $key == $this->status, ]; } return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'phone_number' => $this->phone_number, 'company' => $this->company, 'fax_number' => $this->fax_number, 'email_verified' => $this->email_verified_at ? 'Yes' : 'No', 'reminder_duration' => $this->reminder_duration, 'profile_image' => $this->profile_image?->url, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, 'roles' => $roles, 'user_types' => $user_types, 'birth_date' => $this->birth_date ? $this->birth_date->format('Y-m-d') : $this->birth_date, 'secondary_email' => $this->secondary_email, 'secondary_phone' => $this->secondary_phone, 'status' => $status, ]; } } Resources/Admin/AttributeWithOptionsResource.php 0000644 00000001222 15021222673 0016137 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AttributeWithOptionsResource extends JsonResource { public function toArray($request) { // return parent::toArray($request); $options = []; if($this->attributeOptions) { foreach ($this->attributeOptions as $option) { $options[] = [ "id" => $option->id, "name" => $option->name, ]; } } return [ "id" => $this->id, "name" => $this->name, "options" => $options, ]; } } Resources/Admin/StateResource.php 0000644 00000000433 15021222673 0013047 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StateResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } } Resources/Admin/CategoryTreeResource.php 0000644 00000000356 15021222673 0014370 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CategoryTreeResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/OurPartnerEditResource.php 0000644 00000001040 15021222673 0014671 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Role; use App\Models\User; use Illuminate\Http\Resources\Json\JsonResource; class OurPartnerEditResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'logo' => $this->logo?->url, 'status' => $this->status, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), ]; } } Resources/Admin/EmployeeOrderResource.php 0000644 00000000646 15021222673 0014550 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class EmployeeOrderResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'order_number' => $this->order_number, 'rush_order' => $this->rush_order, 'total_quantity' => $this->items()?->sum('quantity'), ]; } } Resources/Admin/ProductSimple.php 0000644 00000001352 15021222673 0013052 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Category; use App\Models\Variation; use App\Models\Vendor; use Illuminate\Http\Resources\Json\JsonResource; class ProductSimple extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'slug' => $this->slug, 'featured_image' => $this->featured_image ? [ 'url' => $this->featured_image->url, 'thumbnail' => $this->featured_image->thumbnail, 'preview' => $this->featured_image->preview ] :[], ]; } } Resources/Admin/ProductResourceWithAttributes.php 0000644 00000007170 15021222673 0016317 0 ustar 00 <?php namespace App\Http\Resources\Admin; use App\Models\Category; use App\Models\OrderItems; use App\Models\Variation; use App\Models\Vendor; use Illuminate\Http\Resources\Json\JsonResource; class ProductResourceWithAttributes extends JsonResource { public function toArray($request) { $vendors = $categories = $variations = $combinations = []; foreach (Vendor::all() as $vendor){ $vendors[] = [ 'id' => $vendor->id, 'name' => $vendor->name, 'is_selected' => $vendor->id == $this->vendor_id, ]; } foreach (Category::all() as $category){ $categories[] = [ 'id' => $category->id, 'name' => $category->name, 'is_selected' => $category->id == $this->category_id, ]; } $v_ids = $this->variations->map(function ($item) { return $item['variation_id']; })->toArray(); $variations_all = Variation::all(); foreach ($variations_all as $variation){ $variations[] = [ 'id' => $variation->id, 'type' => $variation->type, 'value' => $variation->value, 'is_selected' => in_array($variation->id, $v_ids), ]; } foreach ($this->prices ?? [] as $price){ $order_check = OrderItems::where('price_id', $price->id)->exists(); $combination_variations = $combination_price_ranges = []; foreach ($price->combinations ?? [] as $c_v){ $combination_variations[] = $c_v->variation_id; } foreach ($price->priceRanges ?? [] as $p_r){ $combination_price_ranges[] = [ 'qty_from' => $p_r->qty_from, 'qty_to' => $p_r->qty_to, 'price' => $p_r->price, ]; } $combinations[] = [ 'price_id' => $price->id, 'exists_in_order' => $order_check, 'product_sketch' => $price->product_sketch_media, 'vendor_price' => $price->vendor_price, 'supplier_prod_number' => $price->supplier_prod_number, 'shipping_weight' => $price->shipping_weight, 'length' => $price->length, 'width' => $price->width, 'height' => $price->height, 'variations' => $combination_variations, 'price_ranges' => $combination_price_ranges, ]; } return [ 'id' => $this->id, 'name' => $this->name, 'sku' => $this->sku, 'slug' => $this->slug, 'description' => $this->description, 'engraving' => $this->engraving, 'color_engraving' => $this->color_engraving, 'engraving_fee' => $this->engraving_fee, 'has_variations' => $this->has_variations, 'status' => ['status' => $this->status, 'name' => $this->status_name], 'is_draft' => $this->is_draft, 'product_type' => $this->product_type, 'featured_image' => $this->featured_image, 'created_at' => $this->created_at->format('m-d-Y'), 'updated_at' => $this->updated_at->format('m-d-Y'), 'vendors' => $vendors, 'categories' => $categories, 'variations' => $variations, 'combinations' => $combinations, ]; } } Resources/Admin/StockLocationEditResource.php 0000644 00000000526 15021222673 0015354 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StockLocationEditResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'location' => $this->location, 'status' => $this->status, ]; } } Controllers/Api/V1/AssetsApiController.php 0000644 00000004625 15021236146 0014531 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreAssetRequest; use App\Http\Requests\UpdateAssetRequest; use App\Http\Resources\Admin\AssetDetailResource; use App\Http\Resources\Admin\AssetResource; use App\Models\Asset; use Gate; use Symfony\Component\HttpFoundation\Response; class AssetsApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('asset_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return AssetResource::collection(Asset::with([ 'asset_status:id,name', 'category:id,name', 'company:id,name', 'branch:id,name', 'currency:id,code' ]) ->paginate(50)); } public function store(StoreAssetRequest $request) { $asset = Asset::create($request->all()); if ($request->file('asset_image')) { $asset->addMediaFromRequest('asset_image')->toMediaCollection('asset_image', 'asset'); } return (new AssetResource($asset)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Asset $asset) { abort_if(Gate::denies('asset_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new AssetDetailResource($asset->load([ 'asset_status:id,name', 'category:id,name', 'company:id,name', 'branch:id,name', 'currency:id,code' ])); } public function update(UpdateAssetRequest $request, Asset $asset) { $asset->update($request->all()); if ($request->file('asset_image', false)) { if ($asset->asset_image) { $asset->asset_image->delete(); } $asset->addMediaFromRequest('asset_image')->toMediaCollection('asset_image', 'asset'); } return (new AssetResource($asset)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Asset $asset) { abort_if(Gate::denies('asset_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($asset->asset_image) { $asset->asset_image->delete(); } $asset->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/StatusesApiController.php 0000644 00000003271 15021236146 0015076 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreStatusRequest; use App\Http\Requests\UpdateStatusRequest; use App\Http\Resources\Admin\StatusDropDownResource; use App\Http\Resources\Admin\StatusResource; use App\Models\Status; use Gate; use Symfony\Component\HttpFoundation\Response; class StatusesApiController extends Controller { public function index() { abort_if(Gate::denies('status_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return StatusResource::collection(Status::paginate(50)); } public function dropDown() { abort_if(Gate::denies('status_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return StatusDropDownResource::collection(Status::get()); } public function store(StoreStatusRequest $request) { $status = Status::create($request->all()); return (new StatusResource($status)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Status $status) { abort_if(Gate::denies('status_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new StatusResource($status); } public function update(UpdateStatusRequest $request, Status $status) { $status->update($request->all()); return (new StatusResource($status)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Status $status) { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $status->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/CompanyApiController.php 0000644 00000004474 15021236146 0014677 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreCompanyRequest; use App\Http\Requests\UpdateCompanyRequest; use App\Http\Resources\Admin\CompanyDropDownResource; use App\Http\Resources\Admin\CompanyResource; use App\Http\Resources\Admin\CompanyShowResource; use App\Models\Company; use Gate; use Symfony\Component\HttpFoundation\Response; class CompanyApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CompanyResource::collection(Company::paginate(50)); } public function dropDown() { abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CompanyDropDownResource::collection(Company::get()); } public function store(StoreCompanyRequest $request) { $company = Company::create($request->all()); if ($request->file('logo')) { $company->addMediaFromRequest('logo')->toMediaCollection('logo', 'company'); } return (new CompanyShowResource($company)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Company $company) { abort_if(Gate::denies('company_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CompanyShowResource($company->load(['branches'])); } public function update(UpdateCompanyRequest $request, Company $company) { $company->update($request->all()); if ($request->file('logo', false)) { if ($company->logo) { $company->logo->delete(); } $company->addMediaFromRequest('logo')->toMediaCollection('logo', 'company'); } return (new CompanyResource($company)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Company $company) { abort_if(Gate::denies('company_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($company->logo) { $company->logo->delete(); } $company->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/MaintenanceSchedulesApiController.php 0000644 00000003304 15021236146 0017342 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreMaintenanceScheduleRequest; use App\Http\Requests\UpdateMaintenanceScheduleRequest; use App\Http\Resources\Admin\MaintenanceScheduleResource; use App\Models\MaintenanceSchedule; use Gate; use Symfony\Component\HttpFoundation\Response; class MaintenanceSchedulesApiController extends Controller { public function index() { abort_if(Gate::denies('maintenance_schedule_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return MaintenanceScheduleResource::collection(MaintenanceSchedule::paginate(50)); } public function store(StoreMaintenanceScheduleRequest $request) { $schedule = MaintenanceSchedule::create($request->all()); return (new MaintenanceScheduleResource($schedule)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(MaintenanceSchedule $schedule) { abort_if(Gate::denies('maintenance_schedule_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new MaintenanceScheduleResource($schedule); } public function update(UpdateMaintenanceScheduleRequest $request, MaintenanceSchedule $schedule) { $schedule->update($request->all()); return (new MaintenanceScheduleResource($schedule)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(MaintenanceSchedule $schedule) { abort_if(Gate::denies('maintenance_schedule_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $schedule->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/SuppliersApiController.php 0000644 00000004473 15021236146 0015256 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreSupplierRequest; use App\Http\Requests\UpdateSupplierRequest; use App\Http\Resources\Admin\SupplierDropDownResource; use App\Http\Resources\Admin\SupplierResource; use App\Models\Supplier; use Gate; use Symfony\Component\HttpFoundation\Response; class SuppliersApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('supplier_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return SupplierResource::collection(Supplier::with('country')->paginate(50)); } public function dropDown() { abort_if(Gate::denies('supplier_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return SupplierDropDownResource::collection(Supplier::get()); } public function store(StoreSupplierRequest $request) { $supplier = Supplier::create($request->all()); if ($request->file('logo')) { $supplier->addMediaFromRequest('logo')->toMediaCollection('logo', 'supplier'); } return (new SupplierResource($supplier)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Supplier $supplier) { abort_if(Gate::denies('supplier_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new SupplierResource($supplier->load(['country'])); } public function update(UpdateSupplierRequest $request, Supplier $supplier) { $supplier->update($request->all()); if ($request->file('logo', false)) { if ($supplier->logo) { $supplier->logo->delete(); } $supplier->addMediaFromRequest('logo')->toMediaCollection('logo', 'supplier'); } return (new SupplierResource($supplier)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Supplier $supplier) { abort_if(Gate::denies('supplier_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($supplier->logo) { $supplier->logo->delete(); } $supplier->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/UsersApiController.php 0000644 00000006133 15021236146 0014364 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreUserRequest; use App\Http\Requests\UpdateUserRequest; use App\Http\Resources\Admin\UserDropDownResource; use App\Http\Resources\Admin\UserResource; use App\Http\Resources\Admin\UserShowResource; use App\Models\User; use DB; use Gate; use Symfony\Component\HttpFoundation\Response; class UsersApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return UserResource::collection(User::paginate(50)); } public function dropDown() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return UserDropDownResource::collection(User::select('id', 'first_name', 'last_name')->get()); } public function store(StoreUserRequest $request) { DB::beginTransaction(); try { $user = User::create($request->all()); $user->companies()->attach($request->input('companies', [])); $user->roles()->attach($request->input('roles', [])); if ($request->file('avatar')) { $user->addMediaFromRequest('avatar')->toMediaCollection('avatar', 'avatar'); } DB::commit(); return (new UserShowResource($user)) ->response() ->setStatusCode(Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); return response()->json(['message' => $e->getMessage()], 500); } } public function show(User $user) { abort_if(Gate::denies('user_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new UserShowResource($user->load(['organization', 'companies', 'roles'])); } public function update(UpdateUserRequest $request, User $user) { DB::beginTransaction(); try { $user->update($request->all()); $user->companies()->sync($request->input('companies', [])); $user->roles()->sync($request->input('roles', [])); if ($request->file('avatar', false)) { if ($user->avatar) { $user->avatar->delete(); } $user->addMediaFromRequest('avatar')->toMediaCollection('avatar', 'avatar'); } DB::commit(); return (new UserShowResource($user)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } catch (\Exception $e) { DB::rollBack(); return response()->json(['message' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function destroy(User $user) { abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($user->avatar) { $user->avatar->delete(); } $user->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/BranchesApiController.php 0000644 00000003403 15021236146 0015005 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreBranchRequest; use App\Http\Requests\UpdateBranchRequest; use App\Http\Resources\Admin\BranchDropDownResource; use App\Http\Resources\Admin\BranchResource; use App\Models\Branch; use Gate; use Symfony\Component\HttpFoundation\Response; class BranchesApiController extends Controller { public function index() { abort_if(Gate::denies('branch_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return BranchResource::collection(Branch::paginate(50)); } public function dropDown($companyId) { abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return BranchDropDownResource::collection(Branch::whereCompanyId($companyId)->get()); } public function store(StoreBranchRequest $request) { $branch = Branch::create($request->all()); return (new BranchResource($branch)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Branch $branch) { abort_if(Gate::denies('branch_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new BranchResource($branch->load(['organization', 'company'])); } public function update(UpdateBranchRequest $request, Branch $branch) { $branch->update($request->all()); return (new BranchResource($branch)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Branch $branch) { abort_if(Gate::denies('branch_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $branch->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/CountriesApiController.php 0000644 00000002743 15021236146 0015241 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreCountryRequest; use App\Http\Requests\UpdateCountryRequest; use App\Http\Resources\Admin\CountryResource; use App\Models\Country; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class CountriesApiController extends Controller { public function index() { abort_if(Gate::denies('country_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CountryResource(Country::all()); } public function store(StoreCountryRequest $request) { $country = Country::create($request->all()); return (new CountryResource($country)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Country $country) { abort_if(Gate::denies('country_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CountryResource($country); } public function update(UpdateCountryRequest $request, Country $country) { $country->update($request->all()); return (new CountryResource($country)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Country $country) { abort_if(Gate::denies('country_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $country->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/DepartmentsApiController.php 0000644 00000003144 15021236146 0015550 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreDepartmentRequest; use App\Http\Requests\UpdateDepartmentRequest; use App\Http\Resources\Admin\DepartmentResource; use App\Models\Department; use Gate; use Symfony\Component\HttpFoundation\Response; class DepartmentsApiController extends Controller { public function index() { abort_if(Gate::denies('department_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return DepartmentResource::collection(Department::with(['company', 'manager'])->paginate(50)); } public function store(StoreDepartmentRequest $request) { $department = Department::create($request->all()); return (new DepartmentResource($department)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Department $department) { abort_if(Gate::denies('department_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new DepartmentResource($department->load(['company', 'manager'])); } public function update(UpdateDepartmentRequest $request, Department $department) { $department->update($request->all()); return (new DepartmentResource($department)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Department $department) { abort_if(Gate::denies('department_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $department->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/AssetTagsApiController.php 0000644 00000003103 15021236146 0015153 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreAssetTagRequest; use App\Http\Requests\UpdateAssetTagRequest; use App\Http\Resources\Admin\AssetTagResource; use App\Models\AssetTag; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class AssetTagsApiController extends Controller { public function index() { abort_if(Gate::denies('asset_tag_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new AssetTagResource(AssetTag::with(['organization', 'asset'])->get()); } public function store(StoreAssetTagRequest $request) { $assetTag = AssetTag::create($request->all()); return (new AssetTagResource($assetTag)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(AssetTag $assetTag) { abort_if(Gate::denies('asset_tag_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new AssetTagResource($assetTag->load(['organization', 'asset'])); } public function update(UpdateAssetTagRequest $request, AssetTag $assetTag) { $assetTag->update($request->all()); return (new AssetTagResource($assetTag)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(AssetTag $assetTag) { abort_if(Gate::denies('asset_tag_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $assetTag->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/CategoryApiController.php 0000644 00000004527 15021236146 0015045 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreCategoryRequest; use App\Http\Requests\UpdateCategoryRequest; use App\Http\Resources\Admin\CategoryDropDownResource; use App\Http\Resources\Admin\CategoryResource; use App\Http\Resources\Admin\CategoryShowResource; use App\Models\Category; use Gate; use Symfony\Component\HttpFoundation\Response; class CategoryApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('category_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CategoryResource::collection(Category::paginate(50)); } public function dropDown() { abort_if(Gate::denies('category_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CategoryDropDownResource::collection(Category::get()); } public function store(StoreCategoryRequest $request) { $category = Category::create($request->all()); if ($request->file('image')) { $category->addMediaFromRequest('image')->toMediaCollection('image', 'category'); } return (new CategoryResource($category)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Category $category) { abort_if(Gate::denies('category_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CategoryShowResource($category); } public function update(UpdateCategoryRequest $request, Category $category) { $category->update($request->all()); if ($request->file('image', false)) { if ($category->image) { $category->image->delete(); } $category->addMediaFromRequest('image')->toMediaCollection('image', 'category'); } return (new CategoryResource($category)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Category $category) { abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($category->image) { $category->image->delete(); } $category->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/OrganizationApiController.php 0000644 00000004526 15021236146 0015733 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreOrganizationRequest; use App\Http\Requests\UpdateOrganizationRequest; use App\Http\Resources\Admin\OrganizationResource; use App\Models\Organization; use Gate; use Symfony\Component\HttpFoundation\Response; class OrganizationApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('organization_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OrganizationResource(Organization::all()); } public function store(StoreOrganizationRequest $request) { $organization = Organization::create($request->all()); if ($request->input('logo', false)) { $organization->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } return (new OrganizationResource($organization)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Organization $organization) { abort_if(Gate::denies('organization_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new OrganizationResource($organization); } public function update(UpdateOrganizationRequest $request, Organization $organization) { $organization->update($request->all()); if ($request->input('logo', false)) { if (! $organization->logo || $request->input('logo') !== $organization->logo->file_name) { if ($organization->logo) { $organization->logo->delete(); } $organization->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } } elseif ($organization->logo) { $organization->logo->delete(); } return (new OrganizationResource($organization)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Organization $organization) { abort_if(Gate::denies('organization_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organization->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/RolesApiController.php 0000644 00000004174 15021236146 0014352 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreRoleRequest; use App\Http\Requests\UpdateRoleRequest; use App\Http\Resources\Admin\PermissionDropDownResource; use App\Http\Resources\Admin\RoleDropDownResource; use App\Http\Resources\Admin\RoleResource; use App\Models\Permission; use App\Models\Role; use Gate; use Symfony\Component\HttpFoundation\Response; class RolesApiController extends Controller { public function index() { abort_if(Gate::denies('role_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return RoleResource::collection(Role::paginate(50)); } public function dropDown() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new RoleDropDownResource(Role::select('id', 'title')->get()); } public function permissionDropDown() { abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new PermissionDropDownResource(Permission::select('id', 'title')->get()); } public function store(StoreRoleRequest $request) { $role = Role::create($request->all()); $role->permissions()->sync($request->input('permissions', [])); return (new RoleResource($role)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Role $role) { abort_if(Gate::denies('role_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new RoleResource($role->load(['organization', 'permissions'])); } public function update(UpdateRoleRequest $request, Role $role) { $role->update($request->all()); $role->permissions()->sync($request->input('permissions', [])); return (new RoleResource($role)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Role $role) { abort_if(Gate::denies('role_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $role->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/CurrenciesApiController.php 0000644 00000003371 15021236146 0015366 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Requests\StoreCurrencyRequest; use App\Http\Requests\UpdateCurrencyRequest; use App\Http\Resources\Admin\CurrencyDropDownResource; use App\Http\Resources\Admin\CurrencyResource; use App\Models\Currency; use Gate; use Symfony\Component\HttpFoundation\Response; class CurrenciesApiController extends Controller { public function index() { abort_if(Gate::denies('currency_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CurrencyResource::collection(Currency::paginate(50)); } public function dropDown() { abort_if(Gate::denies('currency_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return CurrencyDropDownResource::collection(Currency::get()); } public function store(StoreCurrencyRequest $request) { $currency = Currency::create($request->all()); return (new CurrencyResource($currency)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Currency $currency) { abort_if(Gate::denies('currency_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new CurrencyResource($currency); } public function update(UpdateCurrencyRequest $request, Currency $currency) { $currency->update($request->all()); return (new CurrencyResource($currency)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Currency $currency) { abort_if(Gate::denies('currency_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $currency->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Api/V1/ManufacturersApiController.php 0000644 00000004712 15021236146 0016103 0 ustar 00 <?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\StoreManufacturerRequest; use App\Http\Requests\UpdateManufacturerRequest; use App\Http\Resources\Admin\ManufacturerDropDownResource; use App\Http\Resources\Admin\ManufacturerResource; use App\Models\Manufacturer; use Gate; use Symfony\Component\HttpFoundation\Response; class ManufacturersApiController extends Controller { use MediaUploadingTrait; public function index() { abort_if(Gate::denies('manufacturer_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return ManufacturerResource::collection(Manufacturer::paginate(50)); } public function dropDown() { abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return ManufacturerDropDownResource::collection(Manufacturer::get()); } public function store(StoreManufacturerRequest $request) { $manufacturer = Manufacturer::create($request->all()); if ($request->file('logo')) { $manufacturer->addMediaFromRequest('logo')->toMediaCollection('logo', 'manufacturer'); } return (new ManufacturerResource($manufacturer)) ->response() ->setStatusCode(Response::HTTP_CREATED); } public function show(Manufacturer $manufacturer) { abort_if(Gate::denies('manufacturer_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return new ManufacturerResource($manufacturer->load(['organization'])); } public function update(UpdateManufacturerRequest $request, Manufacturer $manufacturer) { $manufacturer->update($request->all()); if ($request->file('logo', false)) { if ($manufacturer->logo) { $manufacturer->logo->delete(); } $manufacturer->addMediaFromRequest('logo')->toMediaCollection('logo', 'manufacturer'); } return (new ManufacturerResource($manufacturer)) ->response() ->setStatusCode(Response::HTTP_ACCEPTED); } public function destroy(Manufacturer $manufacturer) { abort_if(Gate::denies('manufacturer_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($manufacturer->logo) { $manufacturer->logo->delete(); } $manufacturer->delete(); return response(null, Response::HTTP_NO_CONTENT); } } Controllers/ApiController.php 0000644 00000017773 15021236146 0012357 0 ustar 00 <?php namespace App\Http\Controllers; use App\Http\Requests\OrganizationSignupRequest; use App\Models\Currency; use App\Models\Organization; use App\Models\User; use App\Models\Role; use App\Models\Permission; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Validator; use App\Http\Requests\ForgotPasswordRequest; use App\Http\Requests\ResetPasswordRequest; use App\Notifications\ForgotPasswordNotification; use Illuminate\Auth\Events\Registered; use Carbon\Carbon; use DB; class ApiController extends Controller { public function login(Request $request) { $credentials = $request->only('email', 'password'); //Validate credential $validator = Validator::make($credentials, [ 'email' => 'required|email', 'password' => 'required' ]); //Send failed response if request is not valid if ($validator->fails()) { return response()->json(['error' => $validator->messages()], 200); } if (!auth()->attempt($credentials)) { return response()->json([ 'message' => 'The given data was invalid.', 'errors' => [ 'password' => [ 'Invalid credentials' ], ] ], 422); } $user = User::where('email', $request->email)->first(); if ($user->organization->status == 0) { return response()->json([ 'message' => 'Organization disabled.', 'errors' => [ 'email' => [ 'Your organization is disabled, please contact administrator.' ], ] ], 422); } if ($user->status == 0) { return response()->json([ 'message' => 'Account disabled.', 'errors' => [ 'email' => [ 'Your account is disabled, please contact administrator.' ], ] ], 422); } $isVerifiedEmail = $user->hasVerifiedEmail(); if (!$isVerifiedEmail) { return response()->json([ 'message' => 'Email not verified.', 'errors' => [ 'email' => [ 'Please verify your email address.' ], ] ], 422); } $authToken = $user->createToken('auth-token')->plainTextToken; return response()->json([ 'user' => [ "id" => $user->id, "first_name" => $user->first_name, "last_name" => $user->last_name, 'full_name' => $user->full_name, "email" => $user->email, "contact_number" => $user->contact_number, "organization" => [ "id" => $user->organization->id, "name" => $user->organization->name, ], "email_verified" => $isVerifiedEmail, ], 'access_token' => $authToken, ], Response::HTTP_OK); } public function organizationSignup(OrganizationSignupRequest $request) { try { DB::beginTransaction(); $organization = Organization::create([ 'name' => $request->organization_name, 'email' => $request->organization_email, 'contact_number' => $request->organization_contact_number, 'address_line_1' => $request->organization_address_line1, 'address_line_2' => $request->organization_address_line2, 'date_expiration' => Carbon::now()->addYear()->format(config('panel.date_format')), 'status' => 1, ]); if ($request->file('logo')) { $organization->addMediaFromRequest('logo')->toMediaCollection('logo', 'organization'); } $user = User::create([ 'first_name' => $request->user_first_name, 'last_name' => $request->user_last_name, 'email' => $request->user_email, 'password' => $request->user_password, 'status' => 1, 'organization_id' => $organization->id, ]); $role = Role::create([ 'title' => 'Admin', 'organization_id' => $organization->id, ]); $permissions = Permission::all()->pluck("id"); $role->permissions()->attach($permissions); $user->roles()->attach($role->id); Currency::insert([ [ 'code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'organization_id' => $organization->id, 'created_at' => now(), ], [ 'code' => 'PKR', 'name' => 'Pakistan Rupee', 'symbol' => 'Rs.', 'organization_id' => $organization->id, 'created_at' => now(), ] ]); $authToken = $user->createToken('auth-token')->plainTextToken; try { event(new Registered($user)); } catch (\Exception $e) { \Log::info($e->getMessage()); } DB::commit(); return response()->json([ 'message' => 'Organization has been created.', 'user' => [ "id" => $user->id, "first_name" => $user->first_name, "last_name" => $user->last_name, 'full_name' => $user->full_name, "email" => $user->email, "contact_number" => $user->contact_number, "organization" => [ "id" => $organization->id, "name" => $organization->name, ], "email_verified" => $user->hasVerifiedEmail(), ], 'access_token' => $authToken, ], Response::HTTP_CREATED); } catch (\Exception $e) { DB::rollBack(); \Log::info($e->getMessage()); return response()->json([ 'message' => 'Something went wrong.', ], Response::HTTP_INTERNAL_SERVER_ERROR); } } public function logout(Request $request) { $request->user()->tokens()->delete(); return response()->json(['success' => true, "message" => "User has been logged out successfully."]); } public function forgot_password(ForgotPasswordRequest $request) { $resetCode = substr(number_format(time() * rand(), 0, '', ''), 0, 6); $user = User::whereEmail($request->input("email"))->first(); $user->password_reset_code = $resetCode; $user->save(); try { $user->notify(new ForgotPasswordNotification($resetCode)); } catch (\Exception $e) { \Log::info($e->getMessage()); } return response()->json(['success' => true, "message" => "A password reset code has been sent to your email address."]); } public function reset_password(ResetPasswordRequest $request) { $user = User::whereEmail($request->input("email")) ->wherePasswordResetCode($request->input("password_reset_code")) ->first(); if (empty($user)) { return response()->json([ "message" => "The given data was invalid.", "errors" => ["password_reset_code" => ["The password reset code is invalid or user does not exists."]] ], 422); } $user->password = \Hash::make($request->input("password")); $user->password_reset_code = null; $user->save(); return response()->json(['success' => true, "message" => "Password has been changed successfully."]); } } Controllers/Admin/AssetsController.php 0000644 00000022765 15021236146 0014135 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyAssetRequest; use App\Http\Requests\StoreAssetRequest; use App\Http\Requests\UpdateAssetRequest; use App\Models\Asset; use App\Models\Branch; use App\Models\Category; use App\Models\Company; use App\Models\Currency; use App\Models\Manufacturer; use App\Models\Organization; use App\Models\Status; use App\Models\Supplier; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class AssetsController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('asset_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Asset::with(['organization', 'asset_status', 'category', 'manufacturer', 'supplier', 'company', 'branch', 'currency'])->select(sprintf('%s.*', (new Asset)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'asset_show'; $editGate = 'asset_edit'; $deleteGate = 'asset_delete'; $crudRoutePart = 'assets'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('asset_name', function ($row) { return $row->asset_name ? $row->asset_name : ''; }); $table->addColumn('asset_status_name', function ($row) { return $row->asset_status ? $row->asset_status->name : ''; }); $table->addColumn('category_name', function ($row) { return $row->category ? $row->category->name : ''; }); $table->addColumn('manufacturer_name', function ($row) { return $row->manufacturer ? $row->manufacturer->name : ''; }); $table->addColumn('supplier_contact_name', function ($row) { return $row->supplier ? $row->supplier->contact_name : ''; }); $table->addColumn('company_name', function ($row) { return $row->company ? $row->company->name : ''; }); $table->addColumn('branch_name', function ($row) { return $row->branch ? $row->branch->name : ''; }); $table->editColumn('qty', function ($row) { return $row->qty ? $row->qty : ''; }); $table->editColumn('notes', function ($row) { return $row->notes ? $row->notes : ''; }); $table->editColumn('asset_image', function ($row) { if ($photo = $row->asset_image) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->editColumn('purchase_cost', function ($row) { return $row->purchase_cost ? $row->purchase_cost : ''; }); $table->addColumn('currency_name', function ($row) { return $row->currency ? $row->currency->name : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'asset_status', 'category', 'manufacturer', 'supplier', 'company', 'branch', 'asset_image', 'currency']); return $table->make(true); } $organizations = Organization::get(); $statuses = Status::get(); $categories = Category::get(); $manufacturers = Manufacturer::get(); $suppliers = Supplier::get(); $companies = Company::get(); $branches = Branch::get(); $currencies = Currency::get(); return view('admin.assets.index', compact('organizations', 'statuses', 'categories', 'manufacturers', 'suppliers', 'companies', 'branches', 'currencies')); } public function create() { abort_if(Gate::denies('asset_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $asset_statuses = Status::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $categories = Category::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $manufacturers = Manufacturer::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $suppliers = Supplier::pluck('contact_name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $branches = Branch::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $currencies = Currency::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.assets.create', compact('asset_statuses', 'branches', 'categories', 'companies', 'currencies', 'manufacturers', 'organizations', 'suppliers')); } public function store(StoreAssetRequest $request) { $asset = Asset::create($request->all()); if ($request->input('asset_image', false)) { $asset->addMedia(storage_path('tmp/uploads/' . basename($request->input('asset_image'))))->toMediaCollection('asset_image'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $asset->id]); } return redirect()->route('admin.assets.index'); } public function edit(Asset $asset) { abort_if(Gate::denies('asset_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $asset_statuses = Status::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $categories = Category::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $manufacturers = Manufacturer::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $suppliers = Supplier::pluck('contact_name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $branches = Branch::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $currencies = Currency::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $asset->load('organization', 'asset_status', 'category', 'manufacturer', 'supplier', 'company', 'branch', 'currency'); return view('admin.assets.edit', compact('asset', 'asset_statuses', 'branches', 'categories', 'companies', 'currencies', 'manufacturers', 'organizations', 'suppliers')); } public function update(UpdateAssetRequest $request, Asset $asset) { $asset->update($request->all()); if ($request->input('asset_image', false)) { if (! $asset->asset_image || $request->input('asset_image') !== $asset->asset_image->file_name) { if ($asset->asset_image) { $asset->asset_image->delete(); } $asset->addMedia(storage_path('tmp/uploads/' . basename($request->input('asset_image'))))->toMediaCollection('asset_image'); } } elseif ($asset->asset_image) { $asset->asset_image->delete(); } return redirect()->route('admin.assets.index'); } public function show(Asset $asset) { abort_if(Gate::denies('asset_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $asset->load('organization', 'asset_status', 'category', 'manufacturer', 'supplier', 'company', 'branch', 'currency'); return view('admin.assets.show', compact('asset')); } public function destroy(Asset $asset) { abort_if(Gate::denies('asset_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $asset->delete(); return back(); } public function massDestroy(MassDestroyAssetRequest $request) { $assets = Asset::find(request('ids')); foreach ($assets as $asset) { $asset->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('asset_create') && Gate::denies('asset_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Asset(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/CountriesController.php 0000644 00000006462 15021236146 0014642 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyCountryRequest; use App\Http\Requests\StoreCountryRequest; use App\Http\Requests\UpdateCountryRequest; use App\Models\Country; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class CountriesController extends Controller { public function index(Request $request) { abort_if(Gate::denies('country_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Country::query()->select(sprintf('%s.*', (new Country)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'country_show'; $editGate = 'country_edit'; $deleteGate = 'country_delete'; $crudRoutePart = 'countries'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('short_code', function ($row) { return $row->short_code ? $row->short_code : ''; }); $table->rawColumns(['actions', 'placeholder']); return $table->make(true); } return view('admin.countries.index'); } public function create() { abort_if(Gate::denies('country_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.countries.create'); } public function store(StoreCountryRequest $request) { $country = Country::create($request->all()); return redirect()->route('admin.countries.index'); } public function edit(Country $country) { abort_if(Gate::denies('country_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.countries.edit', compact('country')); } public function update(UpdateCountryRequest $request, Country $country) { $country->update($request->all()); return redirect()->route('admin.countries.index'); } public function show(Country $country) { abort_if(Gate::denies('country_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.countries.show', compact('country')); } public function destroy(Country $country) { abort_if(Gate::denies('country_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $country->delete(); return back(); } public function massDestroy(MassDestroyCountryRequest $request) { $countries = Country::find(request('ids')); foreach ($countries as $country) { $country->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/CompanyController.php 0000644 00000013402 15021236146 0014265 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyCompanyRequest; use App\Http\Requests\StoreCompanyRequest; use App\Http\Requests\UpdateCompanyRequest; use App\Models\Company; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class CompanyController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Company::with(['organization'])->select(sprintf('%s.*', (new Company)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'company_show'; $editGate = 'company_edit'; $deleteGate = 'company_delete'; $crudRoutePart = 'companies'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->editColumn('logo', function ($row) { if ($photo = $row->logo) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'logo']); return $table->make(true); } $organizations = Organization::get(); return view('admin.companies.index', compact('organizations')); } public function create() { abort_if(Gate::denies('company_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.companies.create', compact('organizations')); } public function store(StoreCompanyRequest $request) { $company = Company::create($request->all()); if ($request->input('logo', false)) { $company->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $company->id]); } return redirect()->route('admin.companies.index'); } public function edit(Company $company) { abort_if(Gate::denies('company_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $company->load('organization'); return view('admin.companies.edit', compact('company', 'organizations')); } public function update(UpdateCompanyRequest $request, Company $company) { $company->update($request->all()); if ($request->input('logo', false)) { if (! $company->logo || $request->input('logo') !== $company->logo->file_name) { if ($company->logo) { $company->logo->delete(); } $company->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } } elseif ($company->logo) { $company->logo->delete(); } return redirect()->route('admin.companies.index'); } public function show(Company $company) { abort_if(Gate::denies('company_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $company->load('organization'); return view('admin.companies.show', compact('company')); } public function destroy(Company $company) { abort_if(Gate::denies('company_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $company->delete(); return back(); } public function massDestroy(MassDestroyCompanyRequest $request) { $companies = Company::find(request('ids')); foreach ($companies as $company) { $company->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('company_create') && Gate::denies('company_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Company(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/CurrenciesController.php 0000644 00000006720 15021236146 0014766 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyCurrencyRequest; use App\Http\Requests\StoreCurrencyRequest; use App\Http\Requests\UpdateCurrencyRequest; use App\Models\Currency; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class CurrenciesController extends Controller { public function index(Request $request) { abort_if(Gate::denies('currency_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Currency::query()->select(sprintf('%s.*', (new Currency)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'currency_show'; $editGate = 'currency_edit'; $deleteGate = 'currency_delete'; $crudRoutePart = 'currencies'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('code', function ($row) { return $row->code ? $row->code : ''; }); $table->editColumn('symbol', function ($row) { return $row->symbol ? $row->symbol : ''; }); $table->rawColumns(['actions', 'placeholder']); return $table->make(true); } return view('admin.currencies.index'); } public function create() { abort_if(Gate::denies('currency_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.currencies.create'); } public function store(StoreCurrencyRequest $request) { $currency = Currency::create($request->all()); return redirect()->route('admin.currencies.index'); } public function edit(Currency $currency) { abort_if(Gate::denies('currency_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.currencies.edit', compact('currency')); } public function update(UpdateCurrencyRequest $request, Currency $currency) { $currency->update($request->all()); return redirect()->route('admin.currencies.index'); } public function show(Currency $currency) { abort_if(Gate::denies('currency_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.currencies.show', compact('currency')); } public function destroy(Currency $currency) { abort_if(Gate::denies('currency_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $currency->delete(); return back(); } public function massDestroy(MassDestroyCurrencyRequest $request) { $currencies = Currency::find(request('ids')); foreach ($currencies as $currency) { $currency->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/SuppliersController.php 0000644 00000016641 15021236147 0014656 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroySupplierRequest; use App\Http\Requests\StoreSupplierRequest; use App\Http\Requests\UpdateSupplierRequest; use App\Models\Country; use App\Models\Organization; use App\Models\Supplier; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class SuppliersController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('supplier_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Supplier::with(['organization', 'country'])->select(sprintf('%s.*', (new Supplier)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'supplier_show'; $editGate = 'supplier_edit'; $deleteGate = 'supplier_delete'; $crudRoutePart = 'suppliers'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('contact_name', function ($row) { return $row->contact_name ? $row->contact_name : ''; }); $table->editColumn('contact_email', function ($row) { return $row->contact_email ? $row->contact_email : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->editColumn('address_line_1', function ($row) { return $row->address_line_1 ? $row->address_line_1 : ''; }); $table->editColumn('address_line_2', function ($row) { return $row->address_line_2 ? $row->address_line_2 : ''; }); $table->editColumn('city', function ($row) { return $row->city ? $row->city : ''; }); $table->editColumn('state', function ($row) { return $row->state ? $row->state : ''; }); $table->editColumn('zip_code', function ($row) { return $row->zip_code ? $row->zip_code : ''; }); $table->addColumn('country_name', function ($row) { return $row->country ? $row->country->name : ''; }); $table->editColumn('url', function ($row) { return $row->url ? $row->url : ''; }); $table->editColumn('logo', function ($row) { if ($photo = $row->logo) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->editColumn('status', function ($row) { return $row->status ? Supplier::STATUS_RADIO[$row->status] : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'country', 'logo']); return $table->make(true); } $organizations = Organization::get(); $countries = Country::get(); return view('admin.suppliers.index', compact('organizations', 'countries')); } public function create() { abort_if(Gate::denies('supplier_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $countries = Country::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.suppliers.create', compact('countries', 'organizations')); } public function store(StoreSupplierRequest $request) { $supplier = Supplier::create($request->all()); if ($request->input('logo', false)) { $supplier->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $supplier->id]); } return redirect()->route('admin.suppliers.index'); } public function edit(Supplier $supplier) { abort_if(Gate::denies('supplier_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $countries = Country::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $supplier->load('organization', 'country'); return view('admin.suppliers.edit', compact('countries', 'organizations', 'supplier')); } public function update(UpdateSupplierRequest $request, Supplier $supplier) { $supplier->update($request->all()); if ($request->input('logo', false)) { if (! $supplier->logo || $request->input('logo') !== $supplier->logo->file_name) { if ($supplier->logo) { $supplier->logo->delete(); } $supplier->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } } elseif ($supplier->logo) { $supplier->logo->delete(); } return redirect()->route('admin.suppliers.index'); } public function show(Supplier $supplier) { abort_if(Gate::denies('supplier_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $supplier->load('organization', 'country'); return view('admin.suppliers.show', compact('supplier')); } public function destroy(Supplier $supplier) { abort_if(Gate::denies('supplier_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $supplier->delete(); return back(); } public function massDestroy(MassDestroySupplierRequest $request) { $suppliers = Supplier::find(request('ids')); foreach ($suppliers as $supplier) { $supplier->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('supplier_create') && Gate::denies('supplier_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Supplier(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/AssetTagsController.php 0000644 00000011051 15021236147 0014554 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyAssetTagRequest; use App\Http\Requests\StoreAssetTagRequest; use App\Http\Requests\UpdateAssetTagRequest; use App\Models\Asset; use App\Models\AssetTag; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class AssetTagsController extends Controller { public function index(Request $request) { abort_if(Gate::denies('asset_tag_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = AssetTag::with(['organization', 'asset'])->select(sprintf('%s.*', (new AssetTag)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'asset_tag_show'; $editGate = 'asset_tag_edit'; $deleteGate = 'asset_tag_delete'; $crudRoutePart = 'asset-tags'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->addColumn('asset_asset_name', function ($row) { return $row->asset ? $row->asset->asset_name : ''; }); $table->editColumn('tag_name', function ($row) { return $row->tag_name ? $row->tag_name : ''; }); $table->editColumn('code', function ($row) { return $row->code ? $row->code : ''; }); $table->editColumn('serial', function ($row) { return $row->serial ? $row->serial : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'asset']); return $table->make(true); } $organizations = Organization::get(); $assets = Asset::get(); return view('admin.assetTags.index', compact('organizations', 'assets')); } public function create() { abort_if(Gate::denies('asset_tag_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $assets = Asset::pluck('asset_name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.assetTags.create', compact('assets', 'organizations')); } public function store(StoreAssetTagRequest $request) { $assetTag = AssetTag::create($request->all()); return redirect()->route('admin.asset-tags.index'); } public function edit(AssetTag $assetTag) { abort_if(Gate::denies('asset_tag_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $assets = Asset::pluck('asset_name', 'id')->prepend(trans('global.pleaseSelect'), ''); $assetTag->load('organization', 'asset'); return view('admin.assetTags.edit', compact('assetTag', 'assets', 'organizations')); } public function update(UpdateAssetTagRequest $request, AssetTag $assetTag) { $assetTag->update($request->all()); return redirect()->route('admin.asset-tags.index'); } public function show(AssetTag $assetTag) { abort_if(Gate::denies('asset_tag_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $assetTag->load('organization', 'asset'); return view('admin.assetTags.show', compact('assetTag')); } public function destroy(AssetTag $assetTag) { abort_if(Gate::denies('asset_tag_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $assetTag->delete(); return back(); } public function massDestroy(MassDestroyAssetTagRequest $request) { $assetTags = AssetTag::find(request('ids')); foreach ($assetTags as $assetTag) { $assetTag->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/OrganizationController.php 0000644 00000013362 15021236147 0015331 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyOrganizationRequest; use App\Http\Requests\StoreOrganizationRequest; use App\Http\Requests\UpdateOrganizationRequest; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class OrganizationController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('organization_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Organization::query()->select(sprintf('%s.*', (new Organization)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'organization_show'; $editGate = 'organization_edit'; $deleteGate = 'organization_delete'; $crudRoutePart = 'organizations'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('email', function ($row) { return $row->email ? $row->email : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->editColumn('logo', function ($row) { if ($photo = $row->logo) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->editColumn('status', function ($row) { return $row->status ? Organization::STATUS_RADIO[$row->status] : ''; }); $table->rawColumns(['actions', 'placeholder', 'logo']); return $table->make(true); } return view('admin.organizations.index'); } public function create() { abort_if(Gate::denies('organization_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.organizations.create'); } public function store(StoreOrganizationRequest $request) { $organization = Organization::create($request->all()); if ($request->input('logo', false)) { $organization->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $organization->id]); } return redirect()->route('admin.organizations.index'); } public function edit(Organization $organization) { abort_if(Gate::denies('organization_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return view('admin.organizations.edit', compact('organization')); } public function update(UpdateOrganizationRequest $request, Organization $organization) { $organization->update($request->all()); if ($request->input('logo', false)) { if (! $organization->logo || $request->input('logo') !== $organization->logo->file_name) { if ($organization->logo) { $organization->logo->delete(); } $organization->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } } elseif ($organization->logo) { $organization->logo->delete(); } return redirect()->route('admin.organizations.index'); } public function show(Organization $organization) { abort_if(Gate::denies('organization_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organization->load('organizationRoles'); return view('admin.organizations.show', compact('organization')); } public function destroy(Organization $organization) { abort_if(Gate::denies('organization_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organization->delete(); return back(); } public function massDestroy(MassDestroyOrganizationRequest $request) { $organizations = Organization::find(request('ids')); foreach ($organizations as $organization) { $organization->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('organization_create') && Gate::denies('organization_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Organization(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/DepartmentsController.php 0000644 00000011744 15021236147 0015155 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyDepartmentRequest; use App\Http\Requests\StoreDepartmentRequest; use App\Http\Requests\UpdateDepartmentRequest; use App\Models\Company; use App\Models\Department; use App\Models\Organization; use App\Models\User; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class DepartmentsController extends Controller { public function index(Request $request) { abort_if(Gate::denies('department_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Department::with(['organization', 'company', 'manager'])->select(sprintf('%s.*', (new Department)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'department_show'; $editGate = 'department_edit'; $deleteGate = 'department_delete'; $crudRoutePart = 'departments'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->addColumn('company_name', function ($row) { return $row->company ? $row->company->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->addColumn('manager_name', function ($row) { return $row->manager ? $row->manager->name : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'company', 'manager']); return $table->make(true); } $organizations = Organization::get(); $companies = Company::get(); $users = User::get(); return view('admin.departments.index', compact('organizations', 'companies', 'users')); } public function create() { abort_if(Gate::denies('department_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $managers = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.departments.create', compact('companies', 'managers', 'organizations')); } public function store(StoreDepartmentRequest $request) { $department = Department::create($request->all()); return redirect()->route('admin.departments.index'); } public function edit(Department $department) { abort_if(Gate::denies('department_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $managers = User::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $department->load('organization', 'company', 'manager'); return view('admin.departments.edit', compact('companies', 'department', 'managers', 'organizations')); } public function update(UpdateDepartmentRequest $request, Department $department) { $department->update($request->all()); return redirect()->route('admin.departments.index'); } public function show(Department $department) { abort_if(Gate::denies('department_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $department->load('organization', 'company', 'manager'); return view('admin.departments.show', compact('department')); } public function destroy(Department $department) { abort_if(Gate::denies('department_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $department->delete(); return back(); } public function massDestroy(MassDestroyDepartmentRequest $request) { $departments = Department::find(request('ids')); foreach ($departments as $department) { $department->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/BranchesController.php 0000644 00000011157 15021236147 0014412 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyBranchRequest; use App\Http\Requests\StoreBranchRequest; use App\Http\Requests\UpdateBranchRequest; use App\Models\Branch; use App\Models\Company; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class BranchesController extends Controller { public function index(Request $request) { abort_if(Gate::denies('branch_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Branch::with(['organization', 'company'])->select(sprintf('%s.*', (new Branch)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'branch_show'; $editGate = 'branch_edit'; $deleteGate = 'branch_delete'; $crudRoutePart = 'branches'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->addColumn('company_name', function ($row) { return $row->company ? $row->company->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('email', function ($row) { return $row->email ? $row->email : ''; }); $table->editColumn('contact_number', function ($row) { return $row->contact_number ? $row->contact_number : ''; }); $table->editColumn('address', function ($row) { return $row->address ? $row->address : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'company']); return $table->make(true); } $organizations = Organization::get(); $companies = Company::get(); return view('admin.branches.index', compact('organizations', 'companies')); } public function create() { abort_if(Gate::denies('branch_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.branches.create', compact('companies', 'organizations')); } public function store(StoreBranchRequest $request) { $branch = Branch::create($request->all()); return redirect()->route('admin.branches.index'); } public function edit(Branch $branch) { abort_if(Gate::denies('branch_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $companies = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $branch->load('organization', 'company'); return view('admin.branches.edit', compact('branch', 'companies', 'organizations')); } public function update(UpdateBranchRequest $request, Branch $branch) { $branch->update($request->all()); return redirect()->route('admin.branches.index'); } public function show(Branch $branch) { abort_if(Gate::denies('branch_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $branch->load('organization', 'company'); return view('admin.branches.show', compact('branch')); } public function destroy(Branch $branch) { abort_if(Gate::denies('branch_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $branch->delete(); return back(); } public function massDestroy(MassDestroyBranchRequest $request) { $branches = Branch::find(request('ids')); foreach ($branches as $branch) { $branch->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Controllers/Admin/ManufacturersController.php 0000644 00000015253 15021236147 0015505 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\MediaUploadingTrait; use App\Http\Requests\MassDestroyManufacturerRequest; use App\Http\Requests\StoreManufacturerRequest; use App\Http\Requests\UpdateManufacturerRequest; use App\Models\Manufacturer; use App\Models\Organization; use Gate; use Illuminate\Http\Request; use Spatie\MediaLibrary\MediaCollections\Models\Media; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class ManufacturersController extends Controller { use MediaUploadingTrait; public function index(Request $request) { abort_if(Gate::denies('manufacturer_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Manufacturer::with(['organization'])->select(sprintf('%s.*', (new Manufacturer)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'manufacturer_show'; $editGate = 'manufacturer_edit'; $deleteGate = 'manufacturer_delete'; $crudRoutePart = 'manufacturers'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->editColumn('support_url', function ($row) { return $row->support_url ? $row->support_url : ''; }); $table->editColumn('support_contact_number', function ($row) { return $row->support_contact_number ? $row->support_contact_number : ''; }); $table->editColumn('support_email', function ($row) { return $row->support_email ? $row->support_email : ''; }); $table->editColumn('warranty_lookup_url', function ($row) { return $row->warranty_lookup_url ? $row->warranty_lookup_url : ''; }); $table->editColumn('status', function ($row) { return $row->status ? Manufacturer::STATUS_RADIO[$row->status] : ''; }); $table->editColumn('logo', function ($row) { if ($photo = $row->logo) { return sprintf( '<a href="%s" target="_blank"><img src="%s" width="50px" height="50px"></a>', $photo->url, $photo->thumbnail ); } return ''; }); $table->rawColumns(['actions', 'placeholder', 'organization', 'logo']); return $table->make(true); } $organizations = Organization::get(); return view('admin.manufacturers.index', compact('organizations')); } public function create() { abort_if(Gate::denies('manufacturer_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.manufacturers.create', compact('organizations')); } public function store(StoreManufacturerRequest $request) { $manufacturer = Manufacturer::create($request->all()); if ($request->input('logo', false)) { $manufacturer->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } if ($media = $request->input('ck-media', false)) { Media::whereIn('id', $media)->update(['model_id' => $manufacturer->id]); } return redirect()->route('admin.manufacturers.index'); } public function edit(Manufacturer $manufacturer) { abort_if(Gate::denies('manufacturer_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $manufacturer->load('organization'); return view('admin.manufacturers.edit', compact('manufacturer', 'organizations')); } public function update(UpdateManufacturerRequest $request, Manufacturer $manufacturer) { $manufacturer->update($request->all()); if ($request->input('logo', false)) { if (! $manufacturer->logo || $request->input('logo') !== $manufacturer->logo->file_name) { if ($manufacturer->logo) { $manufacturer->logo->delete(); } $manufacturer->addMedia(storage_path('tmp/uploads/' . basename($request->input('logo'))))->toMediaCollection('logo'); } } elseif ($manufacturer->logo) { $manufacturer->logo->delete(); } return redirect()->route('admin.manufacturers.index'); } public function show(Manufacturer $manufacturer) { abort_if(Gate::denies('manufacturer_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $manufacturer->load('organization'); return view('admin.manufacturers.show', compact('manufacturer')); } public function destroy(Manufacturer $manufacturer) { abort_if(Gate::denies('manufacturer_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $manufacturer->delete(); return back(); } public function massDestroy(MassDestroyManufacturerRequest $request) { $manufacturers = Manufacturer::find(request('ids')); foreach ($manufacturers as $manufacturer) { $manufacturer->delete(); } return response(null, Response::HTTP_NO_CONTENT); } public function storeCKEditorImages(Request $request) { abort_if(Gate::denies('manufacturer_create') && Gate::denies('manufacturer_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $model = new Manufacturer(); $model->id = $request->input('crud_id', 0); $model->exists = true; $media = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media'); return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED); } } Controllers/Admin/StatusesController.php 0000644 00000007347 15021236147 0014506 0 ustar 00 <?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\MassDestroyStatusRequest; use App\Http\Requests\StoreStatusRequest; use App\Http\Requests\UpdateStatusRequest; use App\Models\Organization; use App\Models\Status; use Gate; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Yajra\DataTables\Facades\DataTables; class StatusesController extends Controller { public function index(Request $request) { abort_if(Gate::denies('status_access'), Response::HTTP_FORBIDDEN, '403 Forbidden'); if ($request->ajax()) { $query = Status::with(['organization'])->select(sprintf('%s.*', (new Status)->table)); $table = Datatables::of($query); $table->addColumn('placeholder', ' '); $table->addColumn('actions', ' '); $table->editColumn('actions', function ($row) { $viewGate = 'status_show'; $editGate = 'status_edit'; $deleteGate = 'status_delete'; $crudRoutePart = 'statuses'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row' )); }); $table->editColumn('id', function ($row) { return $row->id ? $row->id : ''; }); $table->addColumn('organization_name', function ($row) { return $row->organization ? $row->organization->name : ''; }); $table->editColumn('name', function ($row) { return $row->name ? $row->name : ''; }); $table->rawColumns(['actions', 'placeholder', 'organization']); return $table->make(true); } $organizations = Organization::get(); return view('admin.statuses.index', compact('organizations')); } public function create() { abort_if(Gate::denies('status_create'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); return view('admin.statuses.create', compact('organizations')); } public function store(StoreStatusRequest $request) { $status = Status::create($request->all()); return redirect()->route('admin.statuses.index'); } public function edit(Status $status) { abort_if(Gate::denies('status_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $organizations = Organization::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), ''); $status->load('organization'); return view('admin.statuses.edit', compact('organizations', 'status')); } public function update(UpdateStatusRequest $request, Status $status) { $status->update($request->all()); return redirect()->route('admin.statuses.index'); } public function show(Status $status) { abort_if(Gate::denies('status_show'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $status->load('organization'); return view('admin.statuses.show', compact('status')); } public function destroy(Status $status) { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); $status->delete(); return back(); } public function massDestroy(MassDestroyStatusRequest $request) { $statuses = Status::find(request('ids')); foreach ($statuses as $status) { $status->delete(); } return response(null, Response::HTTP_NO_CONTENT); } } Middleware/ValidateSignature.php 0000644 00000000714 15021236147 0012750 0 ustar 00 <?php namespace App\Http\Middleware; use Illuminate\Routing\Middleware\ValidateSignature as Middleware; class ValidateSignature extends Middleware { /** * The names of the query string parameters that should be ignored. * * @var array<int, string> */ protected $except = [ // 'fbclid', // 'utm_campaign', // 'utm_content', // 'utm_medium', // 'utm_source', // 'utm_term', ]; } Middleware/IncludeOrganizationId.php 0000644 00000001437 15021236147 0013565 0 ustar 00 <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Facades\Auth; class IncludeOrganizationId { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { // Get the authenticated user $user = Auth::user(); // Check if the user is authenticated and has an organization_id if ($user && $user->organization_id) { // Add organization_id to the request $request->merge(['organization_id' => $user->organization_id]); } return $next($request); } } Requests/UpdateMaintenanceScheduleRequest.php 0000644 00000003407 15021236147 0015510 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateMaintenanceScheduleRequest extends FormRequest { public function authorize() { return Gate::allows('maintenance_schedule_edit'); } public function rules() { return [ 'asset_id' => [ 'required', 'integer', 'exists:assets,id,organization_id,' . auth()->user()->organization_id, ], 'maintenance_type' => [ 'required', 'integer', 'in:1,2,3', ], 'scheduled_date' => [ 'required', 'date_format:' . config('panel.date_format'), ], 'completion_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'status' => [ 'required', 'integer', 'in:1,2,3', ], 'frequency' => [ 'required', 'integer', 'in:1,2,3,4,5,6', ], 'interval' => [ 'nullable', 'integer', ], 'cost' => [ 'required', 'number', ], 'assigned_to' => [ 'required', 'integer', 'exists:users,id,organization_id,' . auth()->user()->organization_id, ], 'next_scheduled_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'notes' => [ 'nullable', 'max:2048', ], ]; } } Requests/MassDestroyDepartmentRequest.php 0000644 00000001124 15021236147 0014741 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Department; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyDepartmentRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('department_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:departments,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreManufacturerRequest.php 0000644 00000002031 15021236147 0014107 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Manufacturer; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreManufacturerRequest extends FormRequest { public function authorize() { return Gate::allows('manufacturer_create'); } public function rules() { return [ 'name' => [ 'required', 'string', 'min:1', 'max:50', ], 'support_url' => [ 'nullable', 'string', 'max:255', ], 'support_contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'warranty_lookup_url' => [ 'nullable', 'string', 'max:255', ], 'logo' => [ 'nullable', 'mimes:jpeg,png,jpg,gif', ], ]; } } Requests/UpdateRoleRequest.php 0000644 00000001063 15021236147 0012506 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateRoleRequest extends FormRequest { public function authorize() { return Gate::allows('role_edit'); } public function rules() { return [ 'title' => [ 'string', 'required', ], 'permissions.*' => [ 'integer', ], 'permissions' => [ 'required', 'array', ], ]; } } Requests/UpdateSupplierRequest.php 0000644 00000003410 15021236147 0013406 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Supplier; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateSupplierRequest extends FormRequest { public function authorize() { return Gate::allows('supplier_edit'); } public function rules() { return [ 'contact_name' => [ 'required', 'string', 'min:1', 'max:30', ], 'contact_email' => [ 'nullable', 'email', ], 'contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'address_line_1' => [ 'nullable', 'string', ], 'address_line_2' => [ 'nullable', 'string', ], 'city' => [ 'nullable', 'string', 'min:1', 'max:30', ], 'state' => [ 'nullable', 'string', 'min:1', 'max:30', ], 'zip_code' => [ 'string', 'min:1', 'max:15', 'nullable', ], 'country_id' => [ 'required', 'integer', 'exists:countries,id', ], 'url' => [ 'nullable', 'string', 'max:255', ], 'logo' => [ 'nullable', 'mimes:png,jpg,jpeg', 'max:2048', ], ]; } } Requests/MassDestroyPermissionRequest.php 0000644 00000001041 15021236147 0014764 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Permission; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyPermissionRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('permission_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:permissions,id', ]; } } Requests/StoreUserRequest.php 0000644 00000002723 15021236147 0012401 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\User; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreUserRequest extends FormRequest { public function authorize() { return Gate::allows('user_create'); } public function rules() { return [ 'companies' => [ 'required', 'array', ], 'companies.*.company_id' => [ 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'companies.*.branch_id' => [ 'required', 'integer', 'exists:branches,id,organization_id,' . auth()->user()->organization_id, ], 'first_name' => [ 'string', 'required', ], 'email' => [ 'required', 'unique:users', ], 'password' => [ 'required', ], 'contact_number' => [ 'string', 'min:10', 'max:12', 'nullable', ], 'roles' => [ 'required', 'array', ], 'roles.*' => [ 'integer', 'exists:roles,id,organization_id,' . auth()->user()->organization_id, ], ]; } } Requests/StoreDepartmentRequest.php 0000644 00000002020 15021236147 0013554 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Department; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreDepartmentRequest extends FormRequest { public function authorize() { return Gate::allows('department_create'); } public function rules() { return [ 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'name' => [ 'required', 'string', 'min:1', 'max:30', ], 'contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'manager_id' => [ 'required', 'integer', 'exists:users,id,organization_id,' . auth()->user()->organization_id, ], ]; } } Requests/StoreCompanyRequest.php 0000644 00000001252 15021236147 0013065 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreCompanyRequest extends FormRequest { public function authorize() { return Gate::allows('company_create'); } public function rules() { return [ 'name' => [ 'required', 'min:1', 'max:30', ], 'contact_number' => [ 'nullable', 'min:10', 'max:12', ], 'logo' => [ 'nullable', 'mimes:png,jpg,jpeg', 'max:2048', ], ]; } } Requests/OrganizationSignupRequest.php 0000644 00000003102 15021236147 0014270 0 ustar 00 <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class OrganizationSignupRequest extends FormRequest { /** * Determine if the user is authorized to make this request. */ public function authorize(): bool { return true; } /** * Get the validation rules that apply to the request. * * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string> */ public function rules(): array { return [ 'organization_name' => [ 'required', 'min:1', 'max:50', ], 'organization_email' => [ 'required', 'unique:organizations,email', ], 'organization_contact_number' => [ 'nullable', 'min:11', 'max:15' ], 'logo' => [ 'nullable', 'mimes:png,jpg,jpeg', 'max:2048', ], 'user_first_name' => [ 'required', 'min:1', 'max:30', ], 'user_last_name' => [ 'nullable', 'min:1', 'max:30', ], 'user_email' => [ 'required', 'unique:users,email', ], 'user_password' => [ 'required', 'min:8', 'max:20', 'confirmed', ], ]; } } Requests/StoreOrganizationRequest.php 0000644 00000002060 15021236147 0014121 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Organization; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreOrganizationRequest extends FormRequest { public function authorize() { return Gate::allows('organization_create'); } public function rules() { return [ 'name' => [ 'string', 'min:1', 'max:50', 'required', ], 'email' => [ 'required', 'unique:organizations', ], 'contact_number' => [ 'string', 'nullable', ], 'address_line_1' => [ 'string', 'nullable', ], 'address_line_2' => [ 'string', 'nullable', ], 'date_expiration' => [ 'required', 'date_format:' . config('panel.date_format'), ], ]; } } Requests/UpdateOrganizationRequest.php 0000644 00000002135 15021236147 0014252 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Organization; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateOrganizationRequest extends FormRequest { public function authorize() { return Gate::allows('organization_edit'); } public function rules() { return [ 'name' => [ 'string', 'min:1', 'max:50', 'required', ], 'email' => [ 'required', 'unique:organizations,email,' . request()->route('organization')->id, ], 'contact_number' => [ 'string', 'nullable', ], 'address_line_1' => [ 'string', 'nullable', ], 'address_line_2' => [ 'string', 'nullable', ], 'date_expiration' => [ 'required', 'date_format:' . config('panel.date_format'), ], ]; } } Requests/UpdateDepartmentRequest.php 0000644 00000001525 15021236147 0013713 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Department; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateDepartmentRequest extends FormRequest { public function authorize() { return Gate::allows('department_edit'); } public function rules() { return [ 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'name' => [ 'required', 'string', 'min:1', 'max:30', ], 'contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], ]; } } Requests/MassDestroyCountryRequest.php 0000644 00000001111 15021236147 0014275 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Country; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyCountryRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('country_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:countries,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreMaintenanceScheduleRequest.php 0000644 00000003410 15021236147 0015354 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreMaintenanceScheduleRequest extends FormRequest { public function authorize() { return Gate::allows('maintenance_schedule_create'); } public function rules() { return [ 'asset_id' => [ 'required', 'integer', 'exists:assets,id,organization_id,' . auth()->user()->organization_id, ], 'maintenance_type' => [ 'required', 'integer', 'in:1,2,3', ], 'scheduled_date' => [ 'required', 'date_format:' . config('panel.date_format'), ], 'completion_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'status' => [ 'required', 'integer', 'in:1,2,3', ], 'frequency' => [ 'required', 'integer', 'in:1,2,3,4,5,6', ], 'interval' => [ 'nullable', 'integer', ], 'cost' => [ 'required', 'number', ], 'assigned_to' => [ 'required', 'integer', 'exists:users,id,organization_id,' . auth()->user()->organization_id, ], 'next_scheduled_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'notes' => [ 'nullable', 'max:2048', ], ]; } } Requests/UpdateAssetRequest.php 0000644 00000005146 15021236147 0012672 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class UpdateAssetRequest extends FormRequest { public function authorize() { return Gate::allows('asset_edit'); } public function rules() { return [ 'asset_name' => [ 'required', 'string', 'min:1', 'max:50', ], 'asset_status_id' => [ 'required', 'integer', 'exists:statuses,id,organization_id,' . auth()->user()->organization_id, ], 'category_id' => [ 'required', 'integer', 'exists:categories,id,organization_id,' . auth()->user()->organization_id, ], 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'branch_id' => [ 'required', 'integer', 'exists:branches,id,organization_id,' . auth()->user()->organization_id, ], 'manufacturer_id' => [ 'required', 'integer', 'exists:manufacturers,id,organization_id,' . auth()->user()->organization_id, ], 'supplier_id' => [ 'required', 'integer', 'exists:suppliers,id,organization_id,' . auth()->user()->organization_id, ], 'qty' => [ 'nullable', 'integer', ], 'purchase_cost' => [ 'nullable', 'numeric', ], 'currency_id' => [ 'nullable', 'integer', 'exists:currencies,id,organization_id,' . auth()->user()->organization_id, ], 'asset_expiration_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'next_audit_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'purchase_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'eol_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'asset_image' => [ 'nullable', 'mimes:png,jpg,jpeg,gif', ], ]; } } Requests/MassDestroySupplierRequest.php 0000644 00000001114 15021236147 0014440 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Supplier; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroySupplierRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('supplier_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:suppliers,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/UpdateAssetTagRequest.php 0000644 00000001726 15021236147 0013326 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\AssetTag; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateAssetTagRequest extends FormRequest { public function authorize() { return Gate::allows('asset_tag_edit'); } public function rules() { return [ 'asset_id' => [ 'required', 'integer', 'exists:assets,id,organization_id,' . auth()->user()->organization_id, ], 'tag_name' => [ 'string', 'min:1', 'max:30', 'required', ], 'code' => [ 'string', 'min:1', 'max:15', 'required', ], 'serial' => [ 'string', 'min:1', 'max:30', 'required', ], ]; } } Requests/MassDestroyCurrencyRequest.php 0000644 00000001115 15021236147 0014430 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Currency; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyCurrencyRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('currency_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:currencies,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/UpdateUserRequest.php 0000644 00000002770 15021236147 0012531 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\User; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateUserRequest extends FormRequest { public function authorize() { return Gate::allows('user_edit'); } public function rules() { return [ 'companies' => [ 'required', 'array', ], 'companies.*.company_id' => [ 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'companies.*.branch_id' => [ 'required', 'integer', 'exists:branches,id,organization_id,' . auth()->user()->organization_id, ], 'first_name' => [ 'string', 'required', ], 'email' => [ 'required', 'unique:users,email,' . request()->route('user')->id, ], 'password' => [ 'required', ], 'contact_number' => [ 'string', 'min:10', 'max:12', 'nullable', ], 'roles' => [ 'required', 'array', ], 'roles.*' => [ 'integer', 'exists:roles,id,organization_id,' . auth()->user()->organization_id, ], ]; } } Requests/StoreAssetRequest.php 0000644 00000005147 15021236147 0012545 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreAssetRequest extends FormRequest { public function authorize() { return Gate::allows('asset_create'); } public function rules() { return [ 'asset_name' => [ 'required', 'string', 'min:1', 'max:50', ], 'asset_status_id' => [ 'required', 'integer', 'exists:statuses,id,organization_id,' . auth()->user()->organization_id, ], 'category_id' => [ 'required', 'integer', 'exists:categories,id,organization_id,' . auth()->user()->organization_id, ], 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'branch_id' => [ 'required', 'integer', 'exists:branches,id,organization_id,' . auth()->user()->organization_id, ], 'manufacturer_id' => [ 'required', 'integer', 'exists:manufacturers,id,organization_id,' . auth()->user()->organization_id, ], 'supplier_id' => [ 'required', 'integer', 'exists:suppliers,id,organization_id,' . auth()->user()->organization_id, ], 'qty' => [ 'nullable', 'integer', ], 'purchase_cost' => [ 'nullable', 'numeric', ], 'currency_id' => [ 'nullable', 'integer', 'exists:currencies,id,organization_id,' . auth()->user()->organization_id, ], 'asset_expiration_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'next_audit_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'purchase_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'eol_date' => [ 'nullable', 'date_format:' . config('panel.date_format'), ], 'asset_image' => [ 'nullable', 'mimes:png,jpg,jpeg,gif', ], ]; } } Requests/MassDestroyStatusRequest.php 0000644 00000001105 15021236147 0014120 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Status; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyStatusRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('status_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:statuses,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/MassDestroyAssetRequest.php 0000644 00000001100 15021236147 0013707 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Asset; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyAssetRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('asset_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:assets,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreCurrencyRequest.php 0000644 00000001517 15021236147 0013255 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreCurrencyRequest extends FormRequest { public function authorize() { return Gate::allows('currency_create'); } public function rules() { return [ 'name' => [ 'required', 'string', 'min:1', 'max:20', 'unique:currencies', ], 'code' => [ 'required', 'string', 'min:1', 'max:3', 'unique:currencies', ], 'symbol' => [ 'required', 'string', 'min:1', 'max:3', 'unique:currencies', ], ]; } } Requests/StoreCategoryRequest.php 0000644 00000001062 15021236147 0013233 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Category; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreCategoryRequest extends FormRequest { public function authorize() { return Gate::allows('category_create'); } public function rules() { return [ 'name' => [ 'string', 'required', ], 'image' => [ 'nullable', 'mimes:jpeg,png,jpg,gif', ], ]; } } Requests/UpdateProfileRequest.php 0000644 00000001456 15021236147 0013213 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; use Illuminate\Validation\Rule; class UpdateProfileRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { abort_if(Gate::denies('profile_password_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . auth()->id()], ]; } } Requests/ForgotPasswordRequest.php 0000644 00000000677 15021236147 0013437 0 ustar 00 <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ForgotPasswordRequest extends FormRequest { public function rules() { return [ 'email' => [ 'required', 'email', 'exists:users,email' ], ]; } public function attributes() { return [ 'email' => 'Email Address', ]; } } Requests/MassDestroyAssetTagRequest.php 0000644 00000001116 15021236147 0014352 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\AssetTag; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyAssetTagRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('asset_tag_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:asset_tags,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreBranchRequest.php 0000644 00000002042 15021236147 0012652 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreBranchRequest extends FormRequest { public function authorize() { return Gate::allows('branch_create'); } public function rules() { return [ 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'name' => [ 'required', 'string', 'min:1', 'max:50', ], 'email' => [ 'nullable', 'string', 'max:255', ], 'contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'address' => [ 'nullable', 'string', 'min:1', 'max:255', ], ]; } } Requests/StoreRoleRequest.php 0000644 00000001135 15021236147 0012360 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; class StoreRoleRequest extends FormRequest { public function authorize() { return Gate::allows('role_create'); } public function rules() { return [ 'title' => [ 'required', 'string', ], 'permissions' => [ 'required', 'array', ], 'permissions.*' => [ 'integer', 'exists:permissions,id', ], ]; } } Requests/MassDestroyUserRequest.php 0000644 00000001074 15021236147 0013560 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\User; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyUserRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:users,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/UpdateCurrencyRequest.php 0000644 00000002002 15021236147 0013371 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Currency; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateCurrencyRequest extends FormRequest { public function authorize() { return Gate::allows('currency_edit'); } public function rules() { return [ 'name' => [ 'string', 'min:1', 'max:20', 'required', 'unique:currencies,name,' . request()->route('currency')->id, ], 'code' => [ 'string', 'min:1', 'max:3', 'required', 'unique:currencies,code,' . request()->route('currency')->id, ], 'symbol' => [ 'string', 'min:1', 'max:3', 'required', 'unique:currencies,symbol,' . request()->route('currency')->id, ], ]; } } Requests/UpdateManufacturerRequest.php 0000644 00000002030 15021236147 0014234 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Manufacturer; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateManufacturerRequest extends FormRequest { public function authorize() { return Gate::allows('manufacturer_edit'); } public function rules() { return [ 'name' => [ 'required', 'string', 'min:1', 'max:50', ], 'support_url' => [ 'nullable', 'string', 'max:255', ], 'support_contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'warranty_lookup_url' => [ 'nullable', 'string', 'max:255', ], 'logo' => [ 'nullable', 'mimes:jpeg,png,jpg,gif', ], ]; } } Requests/StoreSupplierRequest.php 0000644 00000003411 15021236147 0013261 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Supplier; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreSupplierRequest extends FormRequest { public function authorize() { return Gate::allows('supplier_create'); } public function rules() { return [ 'contact_name' => [ 'required', 'string', 'min:1', 'max:30', ], 'contact_email' => [ 'nullable', 'email', ], 'contact_number' => [ 'nullable', 'string', 'min:10', 'max:12', ], 'address_line_1' => [ 'nullable', 'string', ], 'address_line_2' => [ 'nullable', 'string', ], 'city' => [ 'nullable', 'string', 'min:1', 'max:30', ], 'state' => [ 'nullable', 'string', 'min:1', 'max:30', ], 'zip_code' => [ 'string', 'min:1', 'max:15', 'nullable', ], 'country_id' => [ 'required', 'integer', 'exists:countries,id', ], 'url' => [ 'nullable', 'string', 'max:255', ], 'logo' => [ 'nullable', 'mimes:png,jpg,jpeg', 'max:2048', ], ]; } } Requests/StoreAssetTagRequest.php 0000644 00000001727 15021236147 0013201 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\AssetTag; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreAssetTagRequest extends FormRequest { public function authorize() { return Gate::allows('asset_tag_create'); } public function rules() { return [ 'asset_id' => [ 'required', 'integer', 'exists:assets,id,organization_id,' . auth()->user()->organization_id, ], 'tag_name' => [ 'string', 'min:1', 'max:30', 'required', ], 'code' => [ 'string', 'min:1', 'max:15', 'required', ], 'serial' => [ 'string', 'min:1', 'max:30', 'required', ], ]; } } Requests/UpdateStatusRequest.php 0000644 00000000760 15021236147 0013073 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Status; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateStatusRequest extends FormRequest { public function authorize() { return Gate::allows('status_edit'); } public function rules() { return [ 'name' => [ 'required', 'string', 'min:1', 'max:30', ], ]; } } Requests/MassDestroyCategoryRequest.php 0000644 00000001115 15021236147 0014413 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Category; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyCategoryRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('category_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:categories,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreStatusRequest.php 0000644 00000000761 15021236147 0012746 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Status; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreStatusRequest extends FormRequest { public function authorize() { return Gate::allows('status_create'); } public function rules() { return [ 'name' => [ 'required', 'string', 'min:1', 'max:30', ], ]; } } Requests/MassDestroyOrganizationRequest.php 0000644 00000001134 15021236147 0015303 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Organization; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyOrganizationRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('organization_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:organizations,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StorePermissionRequest.php 0000644 00000000713 15021236147 0013610 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Permission; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StorePermissionRequest extends FormRequest { public function authorize() { return Gate::allows('permission_create'); } public function rules() { return [ 'title' => [ 'string', 'required', ], ]; } } Requests/UpdateBranchRequest.php 0000644 00000002126 15021236147 0013003 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Branch; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateBranchRequest extends FormRequest { public function authorize() { return Gate::allows('branch_edit'); } public function rules() { return [ 'company_id' => [ 'required', 'integer', 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ], 'name' => [ 'string', 'min:1', 'max:50', 'required', ], 'email' => [ 'string', 'max:255', 'nullable', ], 'contact_number' => [ 'string', 'min:10', 'max:12', 'nullable', ], 'address' => [ 'string', 'min:1', 'max:255', 'nullable', ], ]; } } Requests/MassDestroyRoleRequest.php 0000644 00000001074 15021236147 0013543 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Role; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyRoleRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('role_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:roles,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/MassDestroyCompanyRequest.php 0000644 00000001111 15021236147 0014240 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Company; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyCompanyRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('company_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:companies,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/UpdatePasswordRequest.php 0000644 00000001324 15021236147 0013407 0 ustar 00 <?php namespace App\Http\Requests; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; use Illuminate\Validation\Rule; class UpdatePasswordRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { abort_if(Gate::denies('profile_password_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'password' => ['required', 'string', 'min:8', 'confirmed'], ]; } } Requests/MassDestroyManufacturerRequest.php 0000644 00000001134 15021236147 0015273 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Manufacturer; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyManufacturerRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('manufacturer_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:manufacturers,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/StoreCountryRequest.php 0000644 00000001044 15021236147 0013121 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Country; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class StoreCountryRequest extends FormRequest { public function authorize() { return Gate::allows('country_create'); } public function rules() { return [ 'name' => [ 'string', 'required', ], 'short_code' => [ 'string', 'required', ], ]; } } Requests/UpdateCategoryRequest.php 0000644 00000000703 15021236147 0013362 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Category; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateCategoryRequest extends FormRequest { public function authorize() { return Gate::allows('category_edit'); } public function rules() { return [ 'name' => [ 'string', 'required', ], ]; } } Requests/UpdateCompanyRequest.php 0000644 00000001216 15021236147 0013213 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Company; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateCompanyRequest extends FormRequest { public function authorize() { return Gate::allows('company_edit'); } public function rules() { return [ 'name' => [ 'string', 'min:1', 'max:30', 'required', ], 'contact_number' => [ 'string', 'min:10', 'max:12', 'nullable', ], ]; } } Requests/MassDestroyBranchRequest.php 0000644 00000001105 15021236147 0014032 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Branch; use Gate; use Illuminate\Foundation\Http\FormRequest; use Symfony\Component\HttpFoundation\Response; class MassDestroyBranchRequest extends FormRequest { public function authorize() { abort_if(Gate::denies('branch_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden'); return true; } public function rules() { return [ 'ids' => 'required|array', 'ids.*' => 'exists:branches,id,organization_id,' . auth()->user()->organization_id, ]; } } Requests/UpdateCountryRequest.php 0000644 00000001043 15021236147 0013246 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Country; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdateCountryRequest extends FormRequest { public function authorize() { return Gate::allows('country_edit'); } public function rules() { return [ 'name' => [ 'string', 'required', ], 'short_code' => [ 'string', 'required', ], ]; } } Requests/UpdatePermissionRequest.php 0000644 00000000712 15021236147 0013735 0 ustar 00 <?php namespace App\Http\Requests; use App\Models\Permission; use Gate; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Response; class UpdatePermissionRequest extends FormRequest { public function authorize() { return Gate::allows('permission_edit'); } public function rules() { return [ 'title' => [ 'string', 'required', ], ]; } } Requests/ResetPasswordRequest.php 0000644 00000001445 15021236147 0013253 0 ustar 00 <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ResetPasswordRequest extends FormRequest { public function rules() { return [ 'password_reset_code' => [ 'required', 'integer', ], 'email' => [ 'required', 'email', 'exists:users,email', ], 'password' => [ 'required', 'confirmed', 'min:8', 'max:20', ], ]; } public function attributes() { return [ 'email' => 'Email Address', 'password_reset_code' => 'Password Reset Code', 'password' => 'Password', ]; } } Resources/Admin/CompanyResource.php 0000644 00000001407 15021236147 0013400 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CompanyResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "contact_number" => $this->contact_number, "logo" => [ "thumbnail" => $this->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), "url" => $this->logo?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/CurrencyResource.php 0000644 00000000352 15021236147 0013562 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CurrencyResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/SupplierResource.php 0000644 00000002246 15021236147 0013577 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class SupplierResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->contact_name, 'contact_email' => $this->contact_email, 'contact_number' => $this->contact_number, 'address_line_1' => $this->address_line_1, 'address_line_2' => $this->address_line_2, 'country' => [ "id" => $this->country->id, "name" => $this->country->name, ], "city" => $this->city, "state" => $this->state, "zip_code" => $this->zip_code, "url" => $this->url, "status" => $this->status, "logo" => [ "thumbnail" => $this->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->contact_name, 0, 2)), "url" => $this->logo?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->contact_name, 0, 2)), ], ]; } } Resources/Admin/PermissionDropDownResource.php 0000644 00000000364 15021236147 0015600 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class PermissionDropDownResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/BranchResource.php 0000644 00000001206 15021236147 0013164 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class BranchResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "email" => $this->email, "contact_number" => $this->contact_number, "address" => $this->address, "company" => [ "id" => $this->company?->id, "name" => $this->company?->name ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/ManufacturerDropDownResource.php 0000644 00000000452 15021236147 0016102 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ManufacturerDropDownResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } } Resources/Admin/AssetTagResource.php 0000644 00000000352 15021236147 0013503 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AssetTagResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/RoleDropDownResource.php 0000644 00000000356 15021236147 0014352 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class RoleDropDownResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/BranchDropDownResource.php 0000644 00000000444 15021236147 0014644 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class BranchDropDownResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, ]; } } Resources/Admin/UserShowResource.php 0000644 00000003302 15021236147 0013545 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class UserShowResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "first_name" => $this->first_name, "last_name" => $this->last_name, "name" => $this->full_name, "email" => $this->email, "contact_number" => $this->contact_number, "status" => $this->status, "email_verified" => $this->is_email_verified, "avatar" => [ "thumbnail" => $this->avatar?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->full_name, 0, 2)), "url" => $this->avatar?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->full_name, 0, 2)), ], "organization" => [ "id" => $this->organization->id, "name" => $this->organization->name, "logo" => [ "thumbnail" => $this->organization->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . substr($this->organization->name, 0, 2), "url" => $this->organization->logo?->url ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . substr($this->organization->name, 0, 2), ] ], "companies" => CompanyResource::collection($this->companies), "roles" => RoleResource::collection($this->roles), "permissions" => [], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/DepartmentResource.php 0000644 00000001306 15021236147 0014073 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class DepartmentResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "contact_number" => $this->contact_number, "company" => [ "id" => $this->company->id, "name" => $this->company->name, ], "manager" => [ "id" => $this->manager->id, "name" => $this->manager->full_name, ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/StatusDropDownResource.php 0000644 00000000444 15021236147 0014732 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class StatusDropDownResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, ]; } } Resources/Admin/MaintenanceScheduleResource.php 0000644 00000000544 15021236147 0015672 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class MaintenanceScheduleResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } } Resources/Admin/CurrencyDropDownResource.php 0000644 00000000560 15021236147 0015240 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CurrencyDropDownResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "code" => $this->code, "symbol" => $this->symbol, ]; } } Resources/Admin/OrganizationResource.php 0000644 00000000356 15021236147 0014440 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class OrganizationResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/UserDropDownResource.php 0000644 00000000454 15021236147 0014366 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class UserDropDownResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'full_name' => $this->full_name, ]; } } Resources/Admin/CountryResource.php 0000644 00000000351 15021236147 0013432 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CountryResource extends JsonResource { public function toArray($request) { return parent::toArray($request); } } Resources/Admin/CategoryDropDownResource.php 0000644 00000000446 15021236147 0015226 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CategoryDropDownResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, ]; } } Resources/Admin/CompanyDropDownResource.php 0000644 00000000445 15021236147 0015056 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CompanyDropDownResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, ]; } } Resources/Admin/CategoryShowResource.php 0000644 00000001411 15021236147 0014403 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CategoryShowResource extends JsonResource { public function toArray($request) { return [ "id" => $this->id, "name" => $this->name, "description" => $this->description, "image" => [ "thumbnail" => $this->image?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), "url" => $this->image?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), ], "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/AssetResource.php 0000644 00000003630 15021236147 0013051 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AssetResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'asset_name' => $this->asset_name, 'qty' => $this->qty, "asset_image" => [ "thumbnail" => $this->asset_image?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->asset_name, 0, 2)), "url" => $this->asset_image?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->asset_name, 0, 2)), ], 'asset_expiration_date' => $this->asset_expiration_date, 'category' => [ "id" => $this->category->id, "name" => $this->category->name ], 'company' => [ "id" => $this->company->id, "name" => $this->company->name, ], 'branch' => [ "id" => $this->branch->id, "name" => $this->branch->name, ], 'status' => [ "id" => $this->asset_status->id, "name" => $this->asset_status->name, ], 'manufacturer' => [ "id" => $this->manufacturer->id, "name" => $this->manufacturer->name, ], 'supplier' => [ "id" => $this->supplier->id, "name" => $this->supplier->name, ], 'purchase_cost' => $this->purchase_cost, 'currency' => $this->currency, 'next_audit_date' => $this->next_audit_date, 'purchase_date' => $this->purchase_date, 'eol_date' => $this->eol_date, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } } Resources/Admin/AssetDetailResource.php 0000644 00000003703 15021236147 0014175 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class AssetDetailResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'asset_name' => $this->asset_name, 'qty' => $this->qty, 'notes' => $this->notes, 'asset_expiration_date' => $this->asset_expiration_date, 'next_audit_date' => $this->next_audit_date, 'purchase_date' => $this->purchase_date, 'eol_date' => $this->eol_date, 'purchase_cost' => $this->purchase_cost, 'status' => [ "id" => $this->asset_status->id, "name" => $this->asset_status->name, ], 'category' => [ "id" => $this->category->id, "name" => $this->category->name ], 'manufacturer' => [ "id" => $this->manufacturer->id, "name" => $this->manufacturer->name, ], 'supplier' => [ "id" => $this->supplier->id, "name" => $this->supplier->name, ], 'company' => [ "id" => $this->company->id, "name" => $this->company->name, ], 'branch' => [ "id" => $this->branch->id, "name" => $this->branch->name, ], 'currency' => $this->currency, "asset_image" => [ "thumbnail" => $this->asset_image?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->asset_name, 0, 2)), "url" => $this->asset_image?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->asset_name, 0, 2)), ], 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } } Resources/Admin/SupplierDropDownResource.php 0000644 00000000456 15021236147 0015255 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class SupplierDropDownResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->contact_name, ]; } } Resources/Admin/CompanyShowResource.php 0000644 00000002221 15021236147 0014234 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class CompanyShowResource extends JsonResource { public function toArray($request) { $branches = []; foreach ($this->branches as $branch) { $branches[] = [ "id" => $branch->id, "name" => $branch->name, "email" => $branch->email, "contact_number" => $branch->contact_number, "address" => $branch->address, ]; } return [ "id" => $this->id, "name" => $this->name, "contact_number" => $this->contact_number, "logo" => [ "thumbnail" => $this->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), "url" => $this->logo?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), ], "branches" => $branches, "created_at" => $this->created_at, "updated_at" => $this->updated_at, ]; } } Resources/Admin/ManufacturerResource.php 0000644 00000001752 15021236147 0014431 0 ustar 00 <?php namespace App\Http\Resources\Admin; use Illuminate\Http\Resources\Json\JsonResource; class ManufacturerResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'support_url' => $this->support_url, 'support_contact_number' => $this->support_contact_number, 'support_email' => $this->support_email, 'warranty_lookup_url' => $this->warranty_lookup_url, 'status' => $this->status, "logo" => [ "thumbnail" => $this->logo?->thumbnail ?? "https://placehold.co/100x100/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), "url" => $this->logo?->url ?? "https://placehold.co/200x200/EEE/31343C?font-Lato&text=" . strtoupper(substr($this->name, 0, 2)), ], 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
| ver. 1.4 |
Github
|
.
| PHP 8.1.29 | Генерация страницы: 0.41 |
proxy
|
phpinfo
|
Настройка