ultimatepos/Modules/Connector/Http/Controllers/Api/ProductController.php

1084 lines
46 KiB
PHP

<?php
namespace Modules\Connector\Http\Controllers\Api;
use App\Product;
use App\SellingPriceGroup;
use App\Variation;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Modules\Connector\Transformers\CommonResource;
use Modules\Connector\Transformers\ProductResource;
use Modules\Connector\Transformers\VariationResource;
/**
* @group Product management
* @authenticated
*
* APIs for managing products
*/
class ProductController extends ApiController
{
/**
* List products
*
* @queryParam order_by Values: product_name or newest
* @queryParam order_direction Values: asc or desc
* @queryParam brand_id comma separated ids of one or multiple brands
* @queryParam category_id comma separated ids of one or multiple category
* @queryParam sub_category_id comma separated ids of one or multiple sub-category
* @queryParam location_id Example: 1
* @queryParam selling_price_group (1, 0)
* @queryParam send_lot_detail Send lot details in each variation location details(1, 0)
* @queryParam name Search term for product name
* @queryParam sku Search term for product sku
* @queryParam per_page Total records per page. default: 10, Set -1 for no pagination Example:10
* @response {
"data": [
{
"id": 1,
"name": "Men's Reverse Fleece Crew",
"business_id": 1,
"type": "single",
"sub_unit_ids": null,
"enable_stock": 1,
"alert_quantity": "5.0000",
"sku": "AS0001",
"barcode_type": "C128",
"expiry_period": null,
"expiry_period_type": null,
"enable_sr_no": 0,
"weight": null,
"product_custom_field1": null,
"product_custom_field2": null,
"product_custom_field3": null,
"product_custom_field4": null,
"image": null,
"woocommerce_media_id": null,
"product_description": null,
"created_by": 1,
"warranty_id": null,
"is_inactive": 0,
"repair_model_id": null,
"not_for_selling": 0,
"ecom_shipping_class_id": null,
"ecom_active_in_store": 1,
"woocommerce_product_id": 356,
"woocommerce_disable_sync": 0,
"image_url": "http://local.pos.com/img/default.png",
"product_variations": [
{
"id": 1,
"variation_template_id": null,
"name": "DUMMY",
"product_id": 1,
"is_dummy": 1,
"created_at": "2018-01-03 21:29:08",
"updated_at": "2018-01-03 21:29:08",
"variations": [
{
"id": 1,
"name": "DUMMY",
"product_id": 1,
"sub_sku": "AS0001",
"product_variation_id": 1,
"woocommerce_variation_id": null,
"variation_value_id": null,
"default_purchase_price": "130.0000",
"dpp_inc_tax": "143.0000",
"profit_percent": "0.0000",
"default_sell_price": "130.0000",
"sell_price_inc_tax": "143.0000",
"created_at": "2018-01-03 21:29:08",
"updated_at": "2020-06-09 00:23:22",
"deleted_at": null,
"combo_variations": null,
"variation_location_details": [
{
"id": 56,
"product_id": 1,
"product_variation_id": 1,
"variation_id": 1,
"location_id": 1,
"qty_available": "20.0000",
"created_at": "2020-06-08 23:46:40",
"updated_at": "2020-06-08 23:46:40"
}
],
"media": [
{
"id": 1,
"business_id": 1,
"file_name": "1591686466_978227300_nn.jpeg",
"description": null,
"uploaded_by": 9,
"model_type": "App\\Variation",
"woocommerce_media_id": null,
"model_id": 1,
"created_at": "2020-06-09 00:07:46",
"updated_at": "2020-06-09 00:07:46",
"display_name": "nn.jpeg",
"display_url": "http://local.pos.com/uploads/media/1591686466_978227300_nn.jpeg"
}
],
"discounts": [
{
"id": 2,
"name": "FLAT 10%",
"business_id": 1,
"brand_id": null,
"category_id": null,
"location_id": 1,
"priority": 2,
"discount_type": "fixed",
"discount_amount": "5.0000",
"starts_at": "2021-09-01 11:45:00",
"ends_at": "2021-09-30 11:45:00",
"is_active": 1,
"spg": null,
"applicable_in_cg": 1,
"created_at": "2021-09-01 11:46:00",
"updated_at": "2021-09-01 12:12:55",
"formated_starts_at": " 11:45",
"formated_ends_at": " 11:45"
}
],
"selling_price_group": [
{
"id": 2,
"variation_id": 1,
"price_group_id": 1,
"price_inc_tax": "140.0000",
"created_at": "2020-06-09 00:23:31",
"updated_at": "2020-06-09 00:23:31"
}
]
}
]
}
],
"brand": {
"id": 1,
"business_id": 1,
"name": "Levis",
"description": null,
"created_by": 1,
"deleted_at": null,
"created_at": "2018-01-03 21:19:47",
"updated_at": "2018-01-03 21:19:47"
},
"unit": {
"id": 1,
"business_id": 1,
"actual_name": "Pieces",
"short_name": "Pc(s)",
"allow_decimal": 0,
"base_unit_id": null,
"base_unit_multiplier": null,
"created_by": 1,
"deleted_at": null,
"created_at": "2018-01-03 15:15:20",
"updated_at": "2018-01-03 15:15:20"
},
"category": {
"id": 1,
"name": "Men's",
"business_id": 1,
"short_code": null,
"parent_id": 0,
"created_by": 1,
"category_type": "product",
"description": null,
"slug": null,
"woocommerce_cat_id": null,
"deleted_at": null,
"created_at": "2018-01-03 21:06:34",
"updated_at": "2018-01-03 21:06:34"
},
"sub_category": {
"id": 5,
"name": "Shirts",
"business_id": 1,
"short_code": null,
"parent_id": 1,
"created_by": 1,
"category_type": "product",
"description": null,
"slug": null,
"woocommerce_cat_id": null,
"deleted_at": null,
"created_at": "2018-01-03 21:08:18",
"updated_at": "2018-01-03 21:08:18"
},
"product_tax": {
"id": 1,
"business_id": 1,
"name": "VAT@10%",
"amount": 10,
"is_tax_group": 0,
"created_by": 1,
"woocommerce_tax_rate_id": null,
"deleted_at": null,
"created_at": "2018-01-04 02:40:07",
"updated_at": "2018-01-04 02:40:07"
},
"product_locations": [
{
"id": 1,
"business_id": 1,
"location_id": null,
"name": "Awesome Shop",
"landmark": "Linking Street",
"country": "USA",
"state": "Arizona",
"city": "Phoenix",
"zip_code": "85001",
"invoice_scheme_id": 1,
"invoice_layout_id": 1,
"selling_price_group_id": null,
"print_receipt_on_invoice": 1,
"receipt_printer_type": "browser",
"printer_id": null,
"mobile": null,
"alternate_number": null,
"email": null,
"website": null,
"featured_products": [
"5",
"71"
],
"is_active": 1,
"default_payment_accounts": "{\"cash\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"card\":{\"is_enabled\":\"1\",\"account\":\"3\"},\"cheque\":{\"is_enabled\":\"1\",\"account\":\"2\"},\"bank_transfer\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"other\":{\"is_enabled\":\"1\",\"account\":\"3\"},\"custom_pay_1\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"custom_pay_2\":{\"is_enabled\":\"1\",\"account\":\"2\"},\"custom_pay_3\":{\"is_enabled\":\"1\",\"account\":\"3\"}}",
"custom_field1": null,
"custom_field2": null,
"custom_field3": null,
"custom_field4": null,
"deleted_at": null,
"created_at": "2018-01-04 02:15:20",
"updated_at": "2020-06-09 01:07:05",
"pivot": {
"product_id": 2,
"location_id": 1
}
}]
}
],
"links": {
"first": "http://local.pos.com/connector/api/product?page=1",
"last": "http://local.pos.com/connector/api/product?page=32",
"prev": null,
"next": "http://local.pos.com/connector/api/product?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"path": "http://local.pos.com/connector/api/product",
"per_page": 10,
"to": 10
}
}
*/
public function index()
{
$user = Auth::user();
$business_id = $user->business_id;
$filters = request()->only(['brand_id', 'category_id', 'location_id', 'sub_category_id', 'per_page']);
$filters['selling_price_group'] = request()->input('selling_price_group') == 1 ? true : false;
$search = request()->only(['sku', 'name']);
//order
$order_by = null;
$order_direction = null;
if (! empty(request()->input('order_by'))) {
$order_by = in_array(request()->input('order_by'), ['product_name', 'newest']) ? request()->input('order_by') : null;
$order_direction = in_array(request()->input('order_direction'), ['asc', 'desc']) ? request()->input('order_direction') : 'asc';
}
$products = $this->__getProducts($business_id, $filters, $search, true, $order_by, $order_direction);
return ProductResource::collection($products);
}
/**
* Get the specified product
*
* @urlParam product required comma separated ids of products Example: 1
* @queryParam selling_price_group (1, 0)
* @queryParam send_lot_detail Send lot details in each variation location details(1, 0)
* @response {
"data": [
{
"id": 1,
"name": "Men's Reverse Fleece Crew",
"business_id": 1,
"type": "single",
"sub_unit_ids": null,
"enable_stock": 1,
"alert_quantity": "5.0000",
"sku": "AS0001",
"barcode_type": "C128",
"expiry_period": null,
"expiry_period_type": null,
"enable_sr_no": 0,
"weight": null,
"product_custom_field1": null,
"product_custom_field2": null,
"product_custom_field3": null,
"product_custom_field4": null,
"image": null,
"woocommerce_media_id": null,
"product_description": null,
"created_by": 1,
"warranty_id": null,
"is_inactive": 0,
"repair_model_id": null,
"not_for_selling": 0,
"ecom_shipping_class_id": null,
"ecom_active_in_store": 1,
"woocommerce_product_id": 356,
"woocommerce_disable_sync": 0,
"image_url": "http://local.pos.com/img/default.png",
"product_variations": [
{
"id": 1,
"variation_template_id": null,
"name": "DUMMY",
"product_id": 1,
"is_dummy": 1,
"created_at": "2018-01-03 21:29:08",
"updated_at": "2018-01-03 21:29:08",
"variations": [
{
"id": 1,
"name": "DUMMY",
"product_id": 1,
"sub_sku": "AS0001",
"product_variation_id": 1,
"woocommerce_variation_id": null,
"variation_value_id": null,
"default_purchase_price": "130.0000",
"dpp_inc_tax": "143.0000",
"profit_percent": "0.0000",
"default_sell_price": "130.0000",
"sell_price_inc_tax": "143.0000",
"created_at": "2018-01-03 21:29:08",
"updated_at": "2020-06-09 00:23:22",
"deleted_at": null,
"combo_variations": null,
"variation_location_details": [
{
"id": 56,
"product_id": 1,
"product_variation_id": 1,
"variation_id": 1,
"location_id": 1,
"qty_available": "20.0000",
"created_at": "2020-06-08 23:46:40",
"updated_at": "2020-06-08 23:46:40"
}
],
"media": [
{
"id": 1,
"business_id": 1,
"file_name": "1591686466_978227300_nn.jpeg",
"description": null,
"uploaded_by": 9,
"model_type": "App\\Variation",
"woocommerce_media_id": null,
"model_id": 1,
"created_at": "2020-06-09 00:07:46",
"updated_at": "2020-06-09 00:07:46",
"display_name": "nn.jpeg",
"display_url": "http://local.pos.com/uploads/media/1591686466_978227300_nn.jpeg"
}
],
"discounts": [
{
"id": 2,
"name": "FLAT 10%",
"business_id": 1,
"brand_id": null,
"category_id": null,
"location_id": 1,
"priority": 2,
"discount_type": "fixed",
"discount_amount": "5.0000",
"starts_at": "2021-09-01 11:45:00",
"ends_at": "2021-09-30 11:45:00",
"is_active": 1,
"spg": null,
"applicable_in_cg": 1,
"created_at": "2021-09-01 11:46:00",
"updated_at": "2021-09-01 12:12:55",
"formated_starts_at": " 11:45",
"formated_ends_at": " 11:45"
}
],
"selling_price_group": [
{
"id": 2,
"variation_id": 1,
"price_group_id": 1,
"price_inc_tax": "140.0000",
"created_at": "2020-06-09 00:23:31",
"updated_at": "2020-06-09 00:23:31"
}
]
}
]
}
],
"brand": {
"id": 1,
"business_id": 1,
"name": "Levis",
"description": null,
"created_by": 1,
"deleted_at": null,
"created_at": "2018-01-03 21:19:47",
"updated_at": "2018-01-03 21:19:47"
},
"unit": {
"id": 1,
"business_id": 1,
"actual_name": "Pieces",
"short_name": "Pc(s)",
"allow_decimal": 0,
"base_unit_id": null,
"base_unit_multiplier": null,
"created_by": 1,
"deleted_at": null,
"created_at": "2018-01-03 15:15:20",
"updated_at": "2018-01-03 15:15:20"
},
"category": {
"id": 1,
"name": "Men's",
"business_id": 1,
"short_code": null,
"parent_id": 0,
"created_by": 1,
"category_type": "product",
"description": null,
"slug": null,
"woocommerce_cat_id": null,
"deleted_at": null,
"created_at": "2018-01-03 21:06:34",
"updated_at": "2018-01-03 21:06:34"
},
"sub_category": {
"id": 5,
"name": "Shirts",
"business_id": 1,
"short_code": null,
"parent_id": 1,
"created_by": 1,
"category_type": "product",
"description": null,
"slug": null,
"woocommerce_cat_id": null,
"deleted_at": null,
"created_at": "2018-01-03 21:08:18",
"updated_at": "2018-01-03 21:08:18"
},
"product_tax": {
"id": 1,
"business_id": 1,
"name": "VAT@10%",
"amount": 10,
"is_tax_group": 0,
"created_by": 1,
"woocommerce_tax_rate_id": null,
"deleted_at": null,
"created_at": "2018-01-04 02:40:07",
"updated_at": "2018-01-04 02:40:07"
},
"product_locations": [
{
"id": 1,
"business_id": 1,
"location_id": null,
"name": "Awesome Shop",
"landmark": "Linking Street",
"country": "USA",
"state": "Arizona",
"city": "Phoenix",
"zip_code": "85001",
"invoice_scheme_id": 1,
"invoice_layout_id": 1,
"selling_price_group_id": null,
"print_receipt_on_invoice": 1,
"receipt_printer_type": "browser",
"printer_id": null,
"mobile": null,
"alternate_number": null,
"email": null,
"website": null,
"featured_products": [
"5",
"71"
],
"is_active": 1,
"default_payment_accounts": "{\"cash\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"card\":{\"is_enabled\":\"1\",\"account\":\"3\"},\"cheque\":{\"is_enabled\":\"1\",\"account\":\"2\"},\"bank_transfer\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"other\":{\"is_enabled\":\"1\",\"account\":\"3\"},\"custom_pay_1\":{\"is_enabled\":\"1\",\"account\":\"1\"},\"custom_pay_2\":{\"is_enabled\":\"1\",\"account\":\"2\"},\"custom_pay_3\":{\"is_enabled\":\"1\",\"account\":\"3\"}}",
"custom_field1": null,
"custom_field2": null,
"custom_field3": null,
"custom_field4": null,
"deleted_at": null,
"created_at": "2018-01-04 02:15:20",
"updated_at": "2020-06-09 01:07:05",
"pivot": {
"product_id": 2,
"location_id": 1
}
}]
}
]
}
*/
public function show($product_ids)
{
$user = Auth::user();
// if (!$user->can('api.access')) {
// return $this->respondUnauthorized();
// }
$business_id = $user->business_id;
$filters['selling_price_group'] = request()->input('selling_price_group') == 1 ? true : false;
$filters['product_ids'] = explode(',', $product_ids);
$products = $this->__getProducts($business_id, $filters);
return ProductResource::collection($products);
}
/**
* Function to query product
*
* @return Response
*/
private function __getProducts($business_id, $filters = [], $search = [], $pagination = false, $order_by = null, $order_direction = null)
{
$query = Product::where('business_id', $business_id);
$with = ['product_variations.variations.variation_location_details', 'brand', 'unit', 'category', 'sub_category', 'product_tax', 'product_variations.variations.media', 'product_locations'];
if (! empty($filters['category_id'])) {
$category_ids = explode(',', $filters['category_id']);
$query->whereIn('category_id', $category_ids);
}
if (! empty($filters['sub_category_id'])) {
$sub_category_id = explode(',', $filters['sub_category_id']);
$query->whereIn('sub_category_id', $sub_category_id);
}
if (! empty($filters['brand_id'])) {
$brand_ids = explode(',', $filters['brand_id']);
$query->whereIn('brand_id', $brand_ids);
}
if (! empty($filters['selling_price_group']) && $filters['selling_price_group'] == true) {
$with[] = 'product_variations.variations.group_prices';
}
if (! empty($filters['location_id'])) {
$location_id = $filters['location_id'];
$query->whereHas('product_locations', function ($q) use ($location_id) {
$q->where('product_locations.location_id', $location_id);
});
$with['product_variations.variations.variation_location_details'] = function ($q) use ($location_id) {
$q->where('location_id', $location_id);
};
$with['product_locations'] = function ($q) use ($location_id) {
$q->where('product_locations.location_id', $location_id);
};
}
if (! empty($filters['product_ids'])) {
$query->whereIn('id', $filters['product_ids']);
}
if (! empty($search)) {
$query->where(function ($query) use ($search) {
if (! empty($search['name'])) {
$query->where('products.name', 'like', '%'.$search['name'].'%');
}
if (! empty($search['sku'])) {
$sku = $search['sku'];
$query->orWhere('sku', 'like', '%'.$sku.'%');
$query->orWhereHas('variations', function ($q) use ($sku) {
$q->where('variations.sub_sku', 'like', '%'.$sku.'%');
});
}
});
}
//Order by
if (! empty($order_by)) {
if ($order_by == 'product_name') {
$query->orderBy('products.name', $order_direction);
}
if ($order_by == 'newest') {
$query->orderBy('products.id', $order_direction);
}
}
$query->with($with);
$perPage = ! empty($filters['per_page']) ? $filters['per_page'] : $this->perPage;
if ($pagination && $perPage != -1) {
$products = $query->paginate($perPage);
$products->appends(request()->query());
} else {
$products = $query->get();
}
return $products;
}
/**
* List Variations
*
* @urlParam id comma separated ids of variations Example: 2
* @queryParam product_id Filter by comma separated products ids
* @queryParam location_id Example: 1
* @queryParam brand_id
* @queryParam category_id
* @queryParam sub_category_id
* @queryParam not_for_selling Values: 0 or 1
* @queryParam name Search term for product name
* @queryParam sku Search term for product sku
* @queryParam per_page Total records per page. default: 10, Set -1 for no pagination Example:10
* @response {
"data": [
{
"variation_id": 1,
"variation_name": "",
"sub_sku": "AS0001",
"product_id": 1,
"product_name": "Men's Reverse Fleece Crew",
"sku": "AS0001",
"type": "single",
"business_id": 1,
"barcode_type": "C128",
"expiry_period": null,
"expiry_period_type": null,
"enable_sr_no": 0,
"weight": null,
"product_custom_field1": null,
"product_custom_field2": null,
"product_custom_field3": null,
"product_custom_field4": null,
"product_image": "1528728059_fleece_crew.jpg",
"product_description": null,
"warranty_id": null,
"brand_id": 1,
"brand_name": "Levis",
"unit_id": 1,
"enable_stock": 1,
"not_for_selling": 0,
"unit_name": "Pc(s)",
"unit_allow_decimal": 0,
"category_id": 1,
"category": "Men's",
"sub_category_id": 5,
"sub_category": "Shirts",
"tax_id": 1,
"tax_type": "exclusive",
"tax_name": "VAT@10%",
"tax_amount": 10,
"product_variation_id": 1,
"default_purchase_price": "130.0000",
"dpp_inc_tax": "143.0000",
"profit_percent": "0.0000",
"default_sell_price": "130.0000",
"sell_price_inc_tax": "143.0000",
"product_variation_name": "",
"variation_location_details": [],
"media": [],
"selling_price_group": [],
"product_image_url": "http://local.pos.com/uploads/img/1528728059_fleece_crew.jpg",
"product_locations": [
{
"id": 1,
"business_id": 1,
"location_id": null,
"name": "Awesome Shop",
"landmark": "Linking Street",
"country": "USA",
"state": "Arizona",
"city": "Phoenix",
"zip_code": "85001",
"invoice_scheme_id": 1,
"invoice_layout_id": 1,
"selling_price_group_id": null,
"print_receipt_on_invoice": 1,
"receipt_printer_type": "browser",
"printer_id": null,
"mobile": null,
"alternate_number": null,
"email": null,
"website": null,
"featured_products": null,
"is_active": 1,
"default_payment_accounts": "",
"custom_field1": null,
"custom_field2": null,
"custom_field3": null,
"custom_field4": null,
"deleted_at": null,
"created_at": "2018-01-04 02:15:20",
"updated_at": "2019-12-11 04:53:39",
"pivot": {
"product_id": 1,
"location_id": 1
}
}
]
},
{
"variation_id": 2,
"variation_name": "28",
"sub_sku": "AS0002-1",
"product_id": 2,
"product_name": "Levis Men's Slimmy Fit Jeans",
"sku": "AS0002",
"type": "variable",
"business_id": 1,
"barcode_type": "C128",
"expiry_period": null,
"expiry_period_type": null,
"enable_sr_no": 0,
"weight": null,
"product_custom_field1": null,
"product_custom_field2": null,
"product_custom_field3": null,
"product_custom_field4": null,
"product_image": "1528727964_levis_jeans.jpg",
"product_description": null,
"warranty_id": null,
"brand_id": 1,
"brand_name": "Levis",
"unit_id": 1,
"enable_stock": 1,
"not_for_selling": 0,
"unit_name": "Pc(s)",
"unit_allow_decimal": 0,
"category_id": 1,
"category": "Men's",
"sub_category_id": 4,
"sub_category": "Jeans",
"tax_id": 1,
"tax_type": "exclusive",
"tax_name": "VAT@10%",
"tax_amount": 10,
"product_variation_id": 2,
"default_purchase_price": "70.0000",
"dpp_inc_tax": "77.0000",
"profit_percent": "0.0000",
"default_sell_price": "70.0000",
"sell_price_inc_tax": "77.0000",
"product_variation_name": "Waist Size",
"variation_location_details": [
{
"id": 1,
"product_id": 2,
"product_variation_id": 2,
"variation_id": 2,
"location_id": 1,
"qty_available": "50.0000",
"created_at": "2018-01-06 06:57:11",
"updated_at": "2020-08-04 04:11:27"
}
],
"media": [
{
"id": 1,
"business_id": 1,
"file_name": "1596701997_743693452_test.jpg",
"description": null,
"uploaded_by": 9,
"model_type": "App\\Variation",
"woocommerce_media_id": null,
"model_id": 2,
"created_at": "2020-08-06 13:49:57",
"updated_at": "2020-08-06 13:49:57",
"display_name": "test.jpg",
"display_url": "http://local.pos.com/uploads/media/1596701997_743693452_test.jpg"
}
],
"selling_price_group": [],
"product_image_url": "http://local.pos.com/uploads/img/1528727964_levis_jeans.jpg",
"product_locations": [
{
"id": 1,
"business_id": 1,
"location_id": null,
"name": "Awesome Shop",
"landmark": "Linking Street",
"country": "USA",
"state": "Arizona",
"city": "Phoenix",
"zip_code": "85001",
"invoice_scheme_id": 1,
"invoice_layout_id": 1,
"selling_price_group_id": null,
"print_receipt_on_invoice": 1,
"receipt_printer_type": "browser",
"printer_id": null,
"mobile": null,
"alternate_number": null,
"email": null,
"website": null,
"featured_products": null,
"is_active": 1,
"default_payment_accounts": "",
"custom_field1": null,
"custom_field2": null,
"custom_field3": null,
"custom_field4": null,
"deleted_at": null,
"created_at": "2018-01-04 02:15:20",
"updated_at": "2019-12-11 04:53:39",
"pivot": {
"product_id": 2,
"location_id": 1
}
}
],
"discounts": [
{
"id": 2,
"name": "FLAT 10%",
"business_id": 1,
"brand_id": null,
"category_id": null,
"location_id": 1,
"priority": 2,
"discount_type": "fixed",
"discount_amount": "5.0000",
"starts_at": "2021-09-01 11:45:00",
"ends_at": "2021-09-30 11:45:00",
"is_active": 1,
"spg": null,
"applicable_in_cg": 1,
"created_at": "2021-09-01 11:46:00",
"updated_at": "2021-09-01 12:12:55",
"formated_starts_at": " 11:45",
"formated_ends_at": " 11:45"
}
]
}
],
"links": {
"first": "http://local.pos.com/connector/api/variation?page=1",
"last": null,
"prev": null,
"next": "http://local.pos.com/connector/api/variation?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"path": "http://local.pos.com/connector/api/variation",
"per_page": "2",
"to": 2
}
}
*/
public function listVariations($variation_ids = null)
{
$user = Auth::user();
$business_id = $user->business_id;
$query = Variation::join('products AS p', 'variations.product_id', '=', 'p.id')
->join('product_variations AS pv', 'variations.product_variation_id', '=', 'pv.id')
->leftjoin('units', 'p.unit_id', '=', 'units.id')
->leftjoin('tax_rates as tr', 'p.tax', '=', 'tr.id')
->leftjoin('brands', function ($join) {
$join->on('p.brand_id', '=', 'brands.id')
->whereNull('brands.deleted_at');
})
->leftjoin('categories as c', 'p.category_id', '=', 'c.id')
->leftjoin('categories as sc', 'p.sub_category_id', '=', 'sc.id')
->where('p.business_id', $business_id)
->select(
'variations.id',
'variations.name as variation_name',
'variations.sub_sku',
'p.id as product_id',
'p.name as product_name',
'p.sku',
'p.type as type',
'p.business_id',
'p.barcode_type',
'p.expiry_period',
'p.expiry_period_type',
'p.enable_sr_no',
'p.weight',
'p.product_custom_field1',
'p.product_custom_field2',
'p.product_custom_field3',
'p.product_custom_field4',
'p.image as product_image',
'p.product_description',
'p.warranty_id',
'p.brand_id',
'brands.name as brand_name',
'p.unit_id',
'p.enable_stock',
'p.not_for_selling',
'units.short_name as unit_name',
'units.allow_decimal as unit_allow_decimal',
'p.category_id',
'c.name as category',
'p.sub_category_id',
'sc.name as sub_category',
'p.tax as tax_id',
'p.tax_type',
'tr.name as tax_name',
'tr.amount as tax_amount',
'variations.product_variation_id',
'variations.default_purchase_price',
'variations.dpp_inc_tax',
'variations.profit_percent',
'variations.default_sell_price',
'variations.sell_price_inc_tax',
'pv.id as product_variation_id',
'pv.name as product_variation_name'
);
$with = [
'variation_location_details',
'media',
'group_prices',
'product',
'product.product_locations',
];
if (! empty(request()->input('category_id'))) {
$query->where('category_id', request()->input('category_id'));
}
if (! empty(request()->input('sub_category_id'))) {
$query->where('p.sub_category_id', request()->input('sub_category_id'));
}
if (! empty(request()->input('brand_id'))) {
$query->where('p.brand_id', request()->input('brand_id'));
}
if (request()->has('not_for_selling')) {
$not_for_selling = request()->input('not_for_selling') == 1 ? 1 : 0;
$query->where('p.not_for_selling', $not_for_selling);
}
$filters['selling_price_group'] = request()->input('selling_price_group') == 1 ? true : false;
if (! empty(request()->input('location_id'))) {
$location_id = request()->input('location_id');
$query->whereHas('product.product_locations', function ($q) use ($location_id) {
$q->where('product_locations.location_id', $location_id);
});
$with['variation_location_details'] = function ($q) use ($location_id) {
$q->where('location_id', $location_id);
};
$with['product.product_locations'] = function ($q) use ($location_id) {
$q->where('product_locations.location_id', $location_id);
};
}
$search = request()->only(['sku', 'name']);
if (! empty($search)) {
$query->where(function ($query) use ($search) {
if (! empty($search['name'])) {
$query->where('p.name', 'like', '%'.$search['name'].'%');
}
if (! empty($search['sku'])) {
$sku = $search['sku'];
$query->orWhere('p.sku', 'like', '%'.$sku.'%')
->where('variations.sub_sku', 'like', '%'.$sku.'%');
}
});
}
//filter by variations ids
if (! empty($variation_ids)) {
$variation_ids = explode(',', $variation_ids);
$query->whereIn('variations.id', $variation_ids);
}
//filter by product ids
if (! empty(request()->input('product_id'))) {
$product_ids = explode(',', request()->input('product_id'));
$query->whereIn('p.id', $product_ids);
}
$query->with($with);
$perPage = ! empty(request()->input('per_page')) ? request()->input('per_page') : $this->perPage;
if ($perPage == -1) {
$variations = $query->get();
} else {
//paginate
$variations = $query->paginate($perPage);
$variations->appends(request()->query());
}
return VariationResource::collection($variations);
}
/**
* List Selling Price Group
*
* @response {
"data": [
{
"id": 1,
"name": "Retail",
"description": null,
"business_id": 1,
"is_active": 1,
"deleted_at": null,
"created_at": "2020-10-21 04:30:06",
"updated_at": "2020-11-16 18:23:15"
},
{
"id": 2,
"name": "Wholesale",
"description": null,
"business_id": 1,
"is_active": 1,
"deleted_at": null,
"created_at": "2020-10-21 04:30:21",
"updated_at": "2020-11-16 18:23:00"
}
]
}
*/
public function getSellingPriceGroup()
{
$user = Auth::user();
$business_id = $user->business_id;
$price_groups = SellingPriceGroup::where('business_id', $business_id)
->get();
return CommonResource::collection($price_groups);
}
}