Compare commits

..

56 Commits

Author SHA1 Message Date
Mekan1206
6093a45761 WIP 2026-05-04 17:00:01 +05:00
Mekan1206
7f0b92a7ff WIP 2026-05-04 16:56:17 +05:00
Mekan1206
715acc4e97 WIP 2026-05-04 16:47:49 +05:00
Mekan1206
859e4ebbe8 tr in category 2026-05-04 16:44:41 +05:00
Mekan1206
24b85763e5 fix tr 2026-05-04 16:34:33 +05:00
Mekan1206
a6cf6410b2 WIP 2026-05-04 16:33:56 +05:00
Mekan1206
8c4e214e7b WIP 2026-05-04 16:31:51 +05:00
Mekan1206
e227b24de5 WIP 2026-05-04 13:42:09 +05:00
Mekan1206
79b10b20ea WIP 2026-05-04 13:41:21 +05:00
Mekan1206
fa9d9b68b5 WIP 2026-05-04 13:39:45 +05:00
Mekan1206
c23d0eeab0 downgrade 2026-05-04 13:37:25 +05:00
Mekan1206
14b47d40e8 WIP 2026-05-04 13:34:54 +05:00
Mekan1206
f365bff782 WIP 2026-05-04 13:24:27 +05:00
Mekan1206
82ed332637 WIP 2026-05-03 19:08:02 +05:00
Mekan1206
bac2ad9a3e WIP 2026-05-03 18:42:16 +05:00
Mekan1206
1b467108de WIP 2026-05-03 18:36:49 +05:00
Mekan1206
774ac3c622 remove modal 2026-05-02 16:19:31 +05:00
Mekan1206
62f8deb51f WIP 2026-05-02 16:16:56 +05:00
Mekan1206
40cac31648 fix 2026-05-02 12:56:32 +05:00
Mekan1206
6617c8bd27 WIP 2026-05-02 12:55:20 +05:00
Mekan1206
005b428cf1 Channel 2026-05-01 16:53:04 +05:00
Mekan1206
f772562376 WIP 2026-04-30 20:01:23 +05:00
Mekan1206
a07c764dfe WIP 2026-04-30 19:50:59 +05:00
Mekan1206
6dc6802445 WIP 2026-04-29 23:45:51 +05:00
Mekan1206
7cc0c0e0a6 WIP 2026-04-29 23:45:51 +05:00
Mekan1206
bc2770c24d good 2026-04-29 23:45:51 +05:00
Mekan1206
dd633ef7da WIP 2026-04-29 23:45:51 +05:00
Mekan1206
9b95087b94 add filtering by properties 2026-04-29 23:45:51 +05:00
b9ce4cc5d5 wip 2026-03-21 17:44:08 +05:00
78b9e6ee0b wip 2026-03-21 17:40:59 +05:00
1f9942f08a wip 2026-03-17 16:56:32 +05:00
0fe90e6b0e wip 2026-03-17 16:55:53 +05:00
7eefafa805 wip 2026-03-14 14:10:33 +05:00
fdc4c2a1a5 wip 2026-03-12 01:06:16 +05:00
72432d36e7 wip 2026-03-12 00:39:18 +05:00
Mekan1206
34ad7c43e9 WIP 2026-02-13 23:01:07 +05:00
Mekan1206
d728a3af83 WIP 2025-12-23 19:45:03 +05:00
Mekan1206
f477142f11 WIP 2025-12-23 19:40:28 +05:00
Mekan1206
9f27fe260e WIP 2025-12-23 19:08:58 +05:00
Mekan1206
ba9402afb0 Refactor helper functions, improve product filtering, and update seeders. Adjusted SMS sending logic for better readability, implemented multi-level category filtering in ProductRepository, and commented out old data seeding in ChannelTableSeeder and UserTableSeeder for a cleaner setup. 2025-12-19 21:50:17 +05:00
19cc47942b wip 2025-12-19 18:00:49 +05:00
aef0e38be9 wip 2025-12-19 17:59:40 +05:00
637951b5ab wip 2025-12-10 13:02:37 +05:00
125d619935 wip 2025-12-10 13:01:39 +05:00
8c38dd846f wip 2025-12-09 19:56:19 +05:00
6f5eb0d776 wip 2025-12-08 19:48:53 +05:00
1cdabc9b8f wip 2025-12-05 20:47:08 +05:00
7259cf7a05 wip 2025-10-02 22:30:06 +05:00
d957b07231 wip 2025-09-25 15:42:03 +05:00
b06755adcf wip 2025-09-25 15:41:27 +05:00
9a9afc9218 wip 2025-09-25 15:41:02 +05:00
df70431042 wip 2025-09-25 15:37:14 +05:00
d46b03abef wip 2025-09-25 15:35:16 +05:00
d9aae9fa1a wip 2025-09-25 15:31:42 +05:00
a9df04edc5 wip 2025-09-25 15:30:13 +05:00
b6bfcfcdd8 wip 2025-09-25 15:28:35 +05:00
206 changed files with 3436 additions and 2253 deletions

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@
/public/build
/public/hot
/public/storage
/public/favicons/
/storage/*.key
/vendor
.env

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Events\Conversation;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class MessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $message;
/**
* Create a new event instance.
*/
public function __construct($message)
{
$this->message = $message->load('user');
}
/**
* Get the channels the event should broadcast on.
*
* @return array<int, Channel>
*/
public function broadcastOn(): array
{
return [
new PrivateChannel('chat.'.$this->message->conversation_id),
];
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Exports\Ecommerce\Product\Order;
use App\Models\Ecommerce\Product\Order\OrderItem;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
@@ -23,7 +24,7 @@ class ExportOrderReport implements FromQuery, ShouldAutoSize, WithHeadings, With
) {}
/**
* @return \Illuminate\Support\Collection
* @return Collection
*/
public function query()
{

View File

@@ -41,13 +41,14 @@ class ProductFilterer
public function validateRequest(): \Illuminate\Contracts\Validation\Validator
{
return Validator::make($this->request->all(), [
'ids' => ['nullable', 'string', new CommaSeparatedIntegers()],
'brands' => ['nullable', 'string', new CommaSeparatedIntegers()],
'categories' => ['nullable', 'string', new CommaSeparatedIntegers()],
'ids' => ['nullable', 'string', new CommaSeparatedIntegers],
'brands' => ['nullable', 'string', new CommaSeparatedIntegers],
'categories' => ['nullable', 'string', new CommaSeparatedIntegers],
'name' => ['nullable', 'string', 'max:255'],
'min_price' => ['nullable', 'numeric'],
'max_price' => ['nullable', 'numeric'],
'backorder' => ['nullable', 'in:0,1'],
'properties' => ['nullable', 'array'],
]);
}
@@ -93,6 +94,18 @@ class ProductFilterer
$this->queryBuilder->where('products.backorder', $this->request->backorder);
}
if ($this->request->filled('properties')) {
foreach ($this->request->input('properties') as $attributeSlug => $values) {
$valuesArray = explode(',', $values);
$this->queryBuilder->where(function ($query) use ($attributeSlug, $valuesArray) {
foreach ($valuesArray as $value) {
$query->orWhereJsonContains("properties_json->{$attributeSlug}", $value);
}
});
}
}
return $this->queryBuilder;
}
}

View File

@@ -3,7 +3,6 @@
use App\Models\Auth\Verification;
use App\Models\Ecommerce\Channel\Channel;
use App\Models\Ecommerce\Product\Inventory\Inventory;
use App\Models\System\Settings\Settings;
use App\Repositories\Ecommerce\Product\Barcode\BarcodeRepository;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Collection;
@@ -33,6 +32,20 @@ if (! function_exists('translatable')) {
}
}
/**
* Translate
*/
function tr(string $text, string $locale = 'tk'): string
{
$text = json_decode($text);
if ($text) {
return $text->{$locale} ?? '';
}
return '';
}
if (! function_exists('removeWhiteSpace')) {
/**
* Remove white sapce from string
@@ -71,18 +84,18 @@ if (! function_exists('sendSMS')) {
function sendSMS(string|int $phone, string|int $message): mixed
{
$response = Http::retry(
times: 3,
sleepMilliseconds: 50,
throw: false,
when: function (Exception $exception, PendingRequest $request) {
Log::channel('sms_api_error')
->error('Exception: ', [
'message' => $exception->getMessage(),
'line' => $exception->getLine(),
]);
times: 3,
sleepMilliseconds: 50,
throw: false,
when: function (Exception $exception, PendingRequest $request) {
Log::channel('sms_api_error')
->error('Exception: ', [
'message' => $exception->getMessage(),
'line' => $exception->getLine(),
]);
return true;
})
return true;
})
->post('http://216.250.14.144:3000/api/data', [
'phone' => '+993'.$phone,
'code' => $message,
@@ -96,7 +109,7 @@ if (! function_exists('sendSMSVerification')) {
/**
* Send a sms verification code
*
* @return \App\Models\Verification | null
* @return App\Models\Verification | null
*/
function sendSMSVerification(string|int $phone_number): ?Verification
{
@@ -168,7 +181,7 @@ if (! function_exists('tmpostChannel')) {
/**
* Default channel
*
* @return \App\Models\Shop\Channel
* @return App\Models\Shop\Channel
*/
function tmpostChannel(): Channel
{
@@ -324,7 +337,7 @@ if (! function_exists('orderAdminNumber')) {
*/
function orderAdminNumber(): int
{
return 65728952;
return 61126667;
}
}
@@ -355,7 +368,7 @@ if (! function_exists('calculateProductPriceAmount')) {
*/
function halkbankCredentials(string $key = ''): int|string|array
{
return match($key) {
return match ($key) {
'username' => 516122500260,
'password' => 'MrZsO9wfgWOBjf4',
default => [
@@ -368,7 +381,7 @@ function halkbankCredentials(string $key = ''): int|string|array
/**
* Create halkbank order
*
* @param string $price
* @param string $price
* @return array{status: string, url: string|null}
*/
function createHalkbankOrder($price = 123): array
@@ -397,11 +410,23 @@ function createHalkbankOrder($price = 123): array
return [
'status' => 'failed',
'url' => '',
'orderId' => '',
];
}
return [
'status' => 'success',
'url' => $paymentResponse['formUrl'],
'orderId' => $paymentResponse['orderId'],
];
}
/**
* Original quality :D
*/
function convertToOriginalFormat(int|float|string $apiPrice): string
{
$originalPrice = intval($apiPrice) / 100;
return number_format($originalPrice, 2, '.', '');
}

View File

@@ -4,13 +4,14 @@ namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Models\Shop\Product\Attribute;
use Illuminate\Http\Response;
class AttributeController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index()
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Auth\Register;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class AuthRegisterRequest extends FormRequest
@@ -9,7 +10,7 @@ class AuthRegisterRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\V1\Banner\Requests;
use App\Models\CMS\Media\Banner;
use App\Models\System\Settings\OS;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -12,7 +13,7 @@ class BannerIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Api\V1\Brand\Resources;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class BrandResource extends JsonResource
@@ -9,8 +11,8 @@ class BrandResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\V1\Carousel\Requests;
use App\Models\CMS\Media\Carousel;
use App\Models\System\Settings\OS;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -12,7 +13,7 @@ class CarouselIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -16,7 +16,7 @@ class CartController extends Controller
public function index(): JsonResponse
{
$cartItems = auth()->user()->carts()
->with(['product' => ['media', 'brand']])
->with(['product' => ['media', 'brand', 'channels']])
->orderBy('cart_items.id', 'desc')
->get()
->each(function ($cartItem) {
@@ -31,16 +31,26 @@ class CartController extends Controller
}
});
$data = $cartItems->map(fn ($cartItem) => [
'id' => $cartItem->id,
'user_id' => $cartItem->user_id,
'product_id' => $cartItem->product_id,
'product_quantity' => $cartItem->product_quantity,
'created_at' => $cartItem->created_at,
'updated_at' => $cartItem->updated_at,
'product' => new ProductResource($cartItem->product),
])->groupBy(function (array $cartItem) {
if (isset($cartItem['product']) && $cartItem['product']->channels->count() > 0) {
return $cartItem['product']->channels[0]->slug;
}
return 'default';
});
return response()->rest(
$cartItems->map(fn ($cartItem) => [
'id' => $cartItem->id,
'user_id' => $cartItem->user_id,
'product_id' => $cartItem->product_id,
'product_quantity' => $cartItem->product_quantity,
'created_at' => $cartItem->created_at,
'updated_at' => $cartItem->updated_at,
'product' => new ProductResource($cartItem->product),
])
$data,
code: 200,
message: 'Cart items'
);
}

View File

@@ -62,7 +62,8 @@ class CategoryController extends Controller
return response()->rest_paginate(
ProductResource::collection(
ProductRepository::make($request)
->queryAsFromResource($category)
// ->queryAsFromResource($category)
->applyMultiLevelFilter($category)
->applyBasicQueries()
->applyFilters()
->applySorting()

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Category\Resources;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -10,7 +11,7 @@ class CategoryResource extends JsonResource
/**
* Transform the resource into an array.
*
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @return array|Arrayable|\JsonSerializable
*/
public function toArray(Request $request): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api\V1\Channel\Requests;
use App\Models\Ecommerce\Channel\Channel;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ChannelIndexRequest extends FormRequest
@@ -10,7 +11,7 @@ class ChannelIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -20,7 +20,7 @@ class CollectionController extends Controller
{
return response()->rest(
CollectionResource::collection(
Collection::with('media')->where('is_visible', true)->ordered()->get()
Collection::query()->with('media')->where('is_visible', true)->inRandomOrder()->get()
)
);
}
@@ -34,7 +34,7 @@ class CollectionController extends Controller
return response()->rest_paginate(
CollectionResource::collection(
Collection::with('media')->where('is_visible', true)->ordered()->simplePaginate($perPage)
Collection::query()->with('media')->where('is_visible', true)->inRandomOrder()->simplePaginate($perPage)
)
);
}

View File

@@ -3,6 +3,8 @@
namespace App\Http\Controllers\Api\V1\Collection\Resources;
use App\Http\Resources\MediaResource;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CollectionResource extends JsonResource
@@ -10,8 +12,8 @@ class CollectionResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request)
{

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Models\Shop\Product\Product;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
@@ -13,7 +14,7 @@ class CommentController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index()
{
@@ -25,7 +26,7 @@ class CommentController extends Controller
/**
* Store a newly created resource in storage.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function store(Request $request)
{
@@ -50,7 +51,7 @@ class CommentController extends Controller
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function show($id)
{
@@ -61,7 +62,7 @@ class CommentController extends Controller
* Update the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function update(Request $request)
{
@@ -85,7 +86,7 @@ class CommentController extends Controller
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function destroy(Request $request)
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Entrepreneur\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class VendorProductStoreRequest extends FormRequest
@@ -9,7 +10,7 @@ class VendorProductStoreRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Entrepreneur\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class VendorProductUpdateRequest extends FormRequest
@@ -9,7 +10,7 @@ class VendorProductUpdateRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -11,6 +11,7 @@ use App\Models\Ecommerce\Product\Product\Product;
use App\Models\User;
use App\Repositories\Ecommerce\Product\ProductRepository;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class VendorProductController extends Controller
@@ -18,7 +19,7 @@ class VendorProductController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index(Request $request)
{
@@ -49,7 +50,7 @@ class VendorProductController extends Controller
/**
* Store a newly created resource in storage.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function store(VendorProductStoreRequest $request)
{
@@ -105,7 +106,7 @@ class VendorProductController extends Controller
* Display the specified resource.
*
* @param App\Models\Ecommerce\Product\Product\Product $product
* @return \Illuminate\Http\Response
* @return Response
*/
public function show(Product $product)
{
@@ -118,7 +119,7 @@ class VendorProductController extends Controller
* Update the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function update(VendorProductUpdateRequest $request, Product $product)
{
@@ -188,7 +189,7 @@ class VendorProductController extends Controller
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function destroy(Product $product)
{

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers\Api\V1\Entrepreneur\Resources\Order;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -19,7 +18,7 @@ class OrderIndexResource extends JsonResource
return [
'id' => $this->id,
'status' => OrderStatus::formattedStatusFor($this->status),
'shipping_method' => OrderShipping::formattedShippingMethod($this->shipping_method),
'shipping_method' => $this->formattedShippingMethod(),
'notes' => $this->notes,
'delivery_time' => $this->delivery_time,
'delivery_at' => $this->delivery_at,

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers\Api\V1\Entrepreneur\Resources\Order;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -19,7 +18,7 @@ class OrderShowResource extends JsonResource
return [
'id' => $this->id,
'status' => OrderStatus::formattedStatusFor($this->status),
'shipping_method' => OrderShipping::formattedShippingMethod($this->shipping_method),
'shipping_method' => $this->formattedShippingMethod(),
'notes' => $this->notes,
'delivery_time' => $this->delivery_time,
'delivery_at' => $this->delivery_at,

View File

@@ -3,6 +3,8 @@
namespace App\Http\Controllers\Api\V1\Favorite\Resources;
use App\Http\Controllers\Api\V1\Product\Resources\ProductResource;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class FavoriteResource extends JsonResource
@@ -10,8 +12,8 @@ class FavoriteResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -4,7 +4,9 @@ namespace App\Http\Controllers\Api\V1\Filters;
use App\Http\Controllers\Api\V1\Filters\Requests\FilterIndexRequest;
use App\Http\Controllers\Controller;
use App\Models\Ecommerce\Channel\Channel;
use App\Models\Ecommerce\Product\Brand\Brand;
use Illuminate\Support\Facades\DB;
use App\Models\Ecommerce\Product\Category\Category;
use App\Models\Ecommerce\Product\Collection\Collection;
use Illuminate\Http\JsonResponse;
@@ -25,11 +27,7 @@ class FilterController extends Controller
public function index(FilterIndexRequest $request): JsonResponse
{
return response()->rest([
'categories' => $this->categories()->map(fn ($category) => [
'id' => $category->id,
'parent_id' => $category->parent_id,
'name' => $category->name,
]),
'categories' => $this->categories(),
'brands' => $this->brands(),
]);
}
@@ -40,15 +38,29 @@ class FilterController extends Controller
private function categories()
{
if ($this->shouldFilterByCategory()) {
return Category::find($this->request->category_id, ['id', 'parent_id'])->children()->get(['id', 'parent_id', 'name']);
return Category::query()
->find($this->request->category_id, ['id', 'parent_id'])
->children()
->where('is_visible', true)
->ordered()
->get(['id', 'parent_id', 'name'])
->map(fn ($category) => [
'id' => $category->id,
'parent_id' => $category->parent_id,
'name' => $category->name,
]);
}
if ($this->shouldFilterByCollection()) {
return $this->filterByCategoryResource(Collection::find($this->request->collection_id));
return $this->categoriesFor($this->request->collection_id, 'collection');
}
if ($this->shouldFilterByBrand()) {
return $this->filterByCategoryResource(Brand::find($this->request->brand_id));
return $this->categoriesForBrand($this->request->brand_id);
}
if ($this->shouldFilterByChannel()) {
return $this->categoriesFor($this->request->channel_id, 'channel');
}
return Category::query()->where('is_visible', true)->ordered()->get(['id', 'parent_id', 'name']);
@@ -57,51 +69,116 @@ class FilterController extends Controller
private function brands()
{
if ($this->shouldFilterByBrand()) {
return Brand::where('id', $this->request->brand_id)->get(['id', 'name']);
return Brand::query()->where('id', $this->request->brand_id)->get(['id', 'name']);
}
if ($this->shouldFilterByCategory()) {
$brands = Category::find($this->request->category_id)->products()
->where('products.is_visible', true)
->where('products.parent_id', null)
->where('products.stock', '>', 0)
->distinct('products.brand_id')
->pluck('products.brand_id');
$categoryId = (int) $this->request->category_id;
return Brand::whereIntegerInRaw('id', $brands)->get(['id', 'name']);
return DB::table('brands')
->select('brands.id', 'brands.name')
->join('products', 'products.brand_id', '=', 'brands.id')
->join('product_has_relations', 'products.id', '=', 'product_has_relations.product_id')
->where('product_has_relations.productable_type', 'category')
->where('product_has_relations.productable_id', $categoryId)
->where('products.is_visible', true)
->whereNull('products.parent_id')
->where('products.stock', '>', 0)
->groupBy('brands.id', 'brands.name', 'brands.sort_order')
->orderBy('brands.sort_order')
->get();
}
if ($this->shouldFilterByCollection()) {
$brands = Collection::find($this->request->collection_id)->products()
->where('products.is_visible', true)
->where('products.parent_id', null)
->where('products.stock', '>', 0)
->distinct('products.brand_id')
->pluck('products.brand_id');
$collectionId = (int) $this->request->collection_id;
return Brand::whereIntegerInRaw('id', $brands)->get(['id', 'name']);
return DB::table('brands')
->select('brands.id', 'brands.name')
->join('products', 'products.brand_id', '=', 'brands.id')
->join('product_has_relations', 'products.id', '=', 'product_has_relations.product_id')
->where('product_has_relations.productable_type', 'collection')
->where('product_has_relations.productable_id', $collectionId)
->where('products.is_visible', true)
->whereNull('products.parent_id')
->where('products.stock', '>', 0)
->groupBy('brands.id', 'brands.name', 'brands.sort_order')
->orderBy('brands.sort_order')
->get();
}
if ($this->shouldFilterByChannel()) {
$channelId = (int) $this->request->channel_id;
return DB::table('brands')
->select('brands.id', 'brands.name')
->join('products', 'products.brand_id', '=', 'brands.id')
->join('product_has_relations', 'products.id', '=', 'product_has_relations.product_id')
->where('product_has_relations.productable_type', 'channel')
->where('product_has_relations.productable_id', $channelId)
->where('products.is_visible', true)
->whereNull('products.parent_id')
->where('products.stock', '>', 0)
->groupBy('brands.id', 'brands.name', 'brands.sort_order')
->orderBy('brands.sort_order')
->get();
}
return Brand::query()->where('is_visible', true)->ordered()->get(['id', 'name']);
}
/**
* Filter by category
* Categories for a resource
*/
private function filterByCategoryResource($resource)
private function categoriesFor(int $id, string $type)
{
$products = $resource->products()
->where('products.is_visible', true)
->where('products.parent_id', null)
->where('products.stock', '>', 0)
->distinct('products.id')
->pluck('products.id');
return DB::table('categories as c')
->select('c.id', 'c.parent_id', 'c.name')
->where('c.is_visible', true)
->whereExists(function ($query) use ($id, $type) {
$query->select(DB::raw(1))
->from('product_has_relations as phr_cat')
->join('products as p', 'p.id', '=', 'phr_cat.product_id')
->join('product_has_relations as phr_chan', 'phr_chan.product_id', '=', 'p.id')
->whereColumn('phr_cat.productable_id', 'c.id')
->where('phr_cat.productable_type', 'category')
->where('phr_chan.productable_type', $type)
->where('phr_chan.productable_id', $id)
->where('p.is_visible', true)
->whereNull('p.parent_id')
->where('p.stock', '>', 0);
})
->get()
->map(fn ($category) => [
'id' => $category->id,
'parent_id' => $category->parent_id,
'name' => tr($category->name),
]);
}
return Category::where('is_visible', true)->ordered()->join('product_has_relations', 'categories.id', '=', 'product_has_relations.productable_id')
->where('product_has_relations.productable_type', '=', 'category')
->whereIntegerInRaw('product_has_relations.product_id', $products)
->get(['id', 'parent_id', 'name'])
->unique('categories.id');
/**
* Brands
*/
private function categoriesForBrand(int $id)
{
return DB::table('categories')
->select('categories.id', 'categories.parent_id', 'categories.name')
->join('product_has_relations', function ($join) {
$join->on('categories.id', '=', 'product_has_relations.productable_id')
->where('product_has_relations.productable_type', 'category');
})
->join('products', 'product_has_relations.product_id', '=', 'products.id')
->where('products.brand_id', $id)
->where('products.is_visible', true)
->whereNull('products.parent_id')
->where('products.stock', '>', 0)
->where('categories.is_visible', true)
->distinct()
->get()
->map(fn ($category) => [
'id' => $category->id,
'parent_id' => $category->parent_id,
'name' => tr($category->name),
]);
}
/**
@@ -127,4 +204,12 @@ class FilterController extends Controller
{
return $this->request->filled('brand_id');
}
/**
* Check if request should be filtered by channel
*/
private function shouldFilterByChannel(): bool
{
return $this->request->filled('channel_id');
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Filters\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class FilterIndexRequest extends FormRequest
@@ -9,7 +10,7 @@ class FilterIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
@@ -17,6 +18,7 @@ class FilterIndexRequest extends FormRequest
'collection_id' => ['bail', 'nullable', 'int', 'exists:collections,id'],
'category_id' => ['bail', 'nullable', 'int', 'exists:categories,id'],
'brand_id' => ['bail', 'nullable', 'int', 'exists:brands,id'],
'channel_id' => ['bail', 'nullable', 'int', 'exists:channels,id'],
];
}
}

View File

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Resources\Products\ProductResource;
use App\Models\Shop\Product\Product;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Validator;
use Maize\Markable\Models\Like;
@@ -14,7 +15,7 @@ class LikeController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index()
{
@@ -26,7 +27,7 @@ class LikeController extends Controller
/**
* Store a newly created resource in storage.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function store(Request $request)
{
@@ -49,7 +50,7 @@ class LikeController extends Controller
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function destroy(Request $request)
{

View File

@@ -108,7 +108,7 @@ class OnlinePaymentController extends Controller
sms_code: $request->sms_code
);
$doc = new \DOMDocument();
$doc = new \DOMDocument;
$doc->loadHTML($response->body());
$inputs = $doc->getElementsByTagName('input');

View File

@@ -14,7 +14,9 @@ class OrderPaymentController extends Controller
public function index(): JsonResponse
{
return response()->rest(
PaymentType::all(['id', 'name'])
PaymentType::query()
->where('is_enabled', true)
->get(['id', 'name', 'is_enabled'])
->map(fn ($paymentType) => [
'id' => $paymentType->id,
'name' => $paymentType->name,

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Api\V1\Order;
use App\Http\Controllers\Controller;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShippingMethod;
use Illuminate\Http\JsonResponse;
class OrderShippingMethodController extends Controller
{
/**
* Order shipping methods
*/
public function index(): JsonResponse
{
return response()->rest(
OrderShippingMethod::query()->where('is_active', true)
->get(['id', 'name', 'slug', 'price'])
->map(fn ($shippingMethod) => [
'id' => $shippingMethod->id,
'name' => $shippingMethod->name,
'slug' => $shippingMethod->slug,
'price' => $shippingMethod->price,
])
);
}
}

View File

@@ -9,6 +9,7 @@ use App\Models\Ecommerce\Product\Order\Order;
use App\Repositories\Ecommerce\Order\OrderRepository;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class OrderController extends Controller
{
@@ -47,14 +48,14 @@ class OrderController extends Controller
$url = $response['url'];
$order->update([
'halkbank_id' => $response['orderId']
'halkbank_id' => $response['orderId'],
]);
}
}
return response()->rest([
'order_id' => $order->id,
'payment_url' => $url
'payment_url' => $url,
], 201);
}
@@ -72,7 +73,7 @@ class OrderController extends Controller
* Update the specified resource in storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function update(Request $request, Order $order): JsonResponse
{
@@ -85,7 +86,7 @@ class OrderController extends Controller
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function destroy($id)
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api\V1\Product\Barcode\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ProductBarcodeSearchIndexRequest extends FormRequest
@@ -9,7 +10,7 @@ class ProductBarcodeSearchIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Api\V1\Product\Resources\Attribute;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductAttributeProductShowResource extends JsonResource
@@ -9,8 +11,8 @@ class ProductAttributeProductShowResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Api\V1\Product\Resources\Attribute;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductAttributeResource extends JsonResource
@@ -9,8 +11,8 @@ class ProductAttributeResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request)
{

View File

@@ -4,6 +4,8 @@ namespace App\Http\Controllers\Api\V1\Product\Resources;
use App\Http\Resources\MediaResource;
use App\Repositories\Ecommerce\Product\Property\PropertyRepository;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductIndexResource extends JsonResource
@@ -11,8 +13,8 @@ class ProductIndexResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -6,6 +6,8 @@ use App\Http\Controllers\Api\V1\Product\Resources\Attribute\ProductAttributeProd
use App\Http\Controllers\Api\V1\Product\Resources\Variant\ProductVariantResource;
use App\Http\Resources\Api\V1\Channel\ChannelResource;
use App\Repositories\Ecommerce\Product\Property\PropertyRepository;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductResource extends JsonResource
@@ -13,8 +15,8 @@ class ProductResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -8,6 +8,8 @@ use App\Http\Controllers\Api\V1\Product\Resources\Variant\ProductVariantResource
use App\Http\Resources\Api\V1\Channel\ChannelResource;
use App\Http\Resources\MediaResource;
use App\Repositories\Ecommerce\Product\Property\PropertyRepository;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductShowResource extends JsonResource
@@ -15,8 +17,8 @@ class ProductShowResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -2,6 +2,8 @@
namespace App\Http\Controllers\Api\V1\Product\Resources\Review;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductReviewResource extends JsonResource
@@ -9,8 +11,8 @@ class ProductReviewResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request): array
{

View File

@@ -4,6 +4,8 @@ namespace App\Http\Controllers\Api\V1\Product\Resources\Variant;
use App\Http\Controllers\Api\V1\Product\Resources\Attribute\ProductAttributeResource;
use App\Repositories\Ecommerce\Product\Property\PropertyRepository;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductVariantResource extends JsonResource
@@ -11,8 +13,8 @@ class ProductVariantResource extends JsonResource
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
* @param Request $request
* @return array|Arrayable|\JsonSerializable
*/
public function toArray($request)
{

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers;
use App\Events\Conversation\MessageSent;
use App\Models\Chat\Conversation;
use App\Models\Chat\Message;
use App\Models\User;
use Illuminate\Http\Request;
class ChatController extends Controller
{
public function contacts()
{
return User::select(['id', 'first_name', 'last_name'])
->get()
->map(function ($user) {
return [
'id' => $user->id,
'name' => $user->first_name.' '.$user->last_name,
];
});
}
public function start(Request $request)
{
$user1 = auth()->id();
$user2 = $request->user_id;
$conversation = Conversation::whereHas('users', fn ($q) => $q->where('user_id', $user1))
->whereHas('users', fn ($q) => $q->where('user_id', $user2))
->first();
if (! $conversation) {
$conversation = Conversation::create();
$conversation->users()->attach([$user1, $user2]);
}
return $conversation;
}
public function messages($id)
{
return Message::with('user')
->where('conversation_id', $id)
->latest()
->take(50)
->get()
->reverse()
->values();
}
public function send(Request $request)
{
$message = Message::create([
'conversation_id' => $request->conversation_id,
'user_id' => auth()->id(),
'body' => $request->body,
]);
broadcast(new MessageSent($message))->toOthers();
return $message->load('user');
}
}

View File

@@ -12,7 +12,7 @@ class OnlinePaymentController extends Controller
public function index(Request $request)
{
$request->validate([
'orderId' => ['required', 'string']
'orderId' => ['required', 'string'],
]);
$resource = Order::query()->where('halkbank_id', $request->orderId)->first();
@@ -41,19 +41,19 @@ class OnlinePaymentController extends Controller
status: $payment_status,
message: $payment_status ? 'Töleg geçdi' : 'Töleg geçmedi',
pnr: $response['orderNumber'],
price_amount: number_format($response['amount']),
price_amount: convertToOriginalFormat($response['amount']),
);
}
public function view(
$status = false,
$status,
$message,
string $pnr = '-',
string $branch_name = 'MM.COM.TM',
int|string $price_amount = '-',
string $return_url = 'https://mm.com.tm/orders',
): View {
return view('oninepayment.status', [
return view('halkbank.status', [
'success' => $status,
'title' => $message,
'pnr' => $pnr,

View File

@@ -33,8 +33,6 @@ class TestController extends Controller
public function ok()
{
if (! app()->isProduction()) {
auth()->login(User::where('email', 'nurmuhammet@mail.com')->first());

View File

@@ -6,13 +6,14 @@ use App\Http\Controllers\Controller;
use App\Models\Ecommerce\Channel\Channel;
use App\Repositories\Ecommerce\Product\ProductRepository;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class EntrepreneurController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index()
{
@@ -25,7 +26,7 @@ class EntrepreneurController extends Controller
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
* @return Response
*/
public function show(Request $request, $entrepreneur)
{

View File

@@ -2,7 +2,33 @@
namespace App\Http;
use App\Http\Middleware\Authenticate;
use App\Http\Middleware\CheckApiToken;
use App\Http\Middleware\CheckIfUserIsBanned;
use App\Http\Middleware\EncryptCookies;
use App\Http\Middleware\EnsureUserHasRole;
use App\Http\Middleware\PreventRequestsDuringMaintenance;
use App\Http\Middleware\RedirectIfAuthenticated;
use App\Http\Middleware\SetLanguage;
use App\Http\Middleware\TrimStrings;
use App\Http\Middleware\TrustProxies;
use App\Http\Middleware\ValidateSignature;
use App\Http\Middleware\VerifyCsrfToken;
use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;
use Illuminate\Auth\Middleware\Authorize;
use Illuminate\Auth\Middleware\EnsureEmailIsVerified;
use Illuminate\Auth\Middleware\RequirePassword;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\ValidatePostSize;
use Illuminate\Http\Middleware\HandleCors;
use Illuminate\Http\Middleware\SetCacheHeaders;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
class Kernel extends HttpKernel
{
@@ -15,12 +41,12 @@ 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,
TrustProxies::class,
HandleCors::class,
PreventRequestsDuringMaintenance::class,
ValidatePostSize::class,
TrimStrings::class,
ConvertEmptyStringsToNull::class,
];
/**
@@ -30,18 +56,18 @@ class Kernel extends HttpKernel
*/
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,
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
ThrottleRequests::class.':api',
SubstituteBindings::class,
],
];
@@ -53,19 +79,19 @@ class Kernel extends HttpKernel
* @var array<string, class-string|string>
*/
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,
'api_token' => \App\Http\Middleware\CheckApiToken::class,
'set_lang' => \App\Http\Middleware\SetLanguage::class,
'banned' => \App\Http\Middleware\CheckIfUserIsBanned::class,
'role' => \App\Http\Middleware\EnsureUserHasRole::class,
'auth' => Authenticate::class,
'auth.basic' => AuthenticateWithBasicAuth::class,
'auth.session' => AuthenticateSession::class,
'cache.headers' => SetCacheHeaders::class,
'can' => Authorize::class,
'guest' => RedirectIfAuthenticated::class,
'password.confirm' => RequirePassword::class,
'signed' => ValidateSignature::class,
'throttle' => ThrottleRequests::class,
'verified' => EnsureEmailIsVerified::class,
'api_token' => CheckApiToken::class,
'set_lang' => SetLanguage::class,
'banned' => CheckIfUserIsBanned::class,
'role' => EnsureUserHasRole::class,
];
}

View File

@@ -11,7 +11,7 @@ class CheckApiToken
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@@ -11,7 +11,7 @@ class CheckIfUserIsBanned
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@@ -11,7 +11,7 @@ class EnsureUserHasRole
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next, string $role): Response
{

View File

@@ -13,7 +13,7 @@ class RedirectIfAuthenticated
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next, string ...$guards): Response
{

View File

@@ -12,7 +12,7 @@ class SetLanguage
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\System\VersionManagement;
use App\Models\System\Settings\OS;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -11,7 +12,7 @@ class CheckForUpdateRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class AuthLoginRequest extends FormRequest
@@ -9,7 +10,7 @@ class AuthLoginRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\V1\Auth;
use App\Rules\VerificationRule;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class AuthVerifyRequest extends FormRequest
@@ -10,7 +11,7 @@ class AuthVerifyRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\V1\Brand;
use App\Models\Ecommerce\Product\Brand\Brand;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -11,7 +12,7 @@ class BrandIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Brand;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -10,7 +11,7 @@ class BrandProductsRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Cart;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class CartRemoveRequest extends FormRequest
@@ -9,7 +10,7 @@ class CartRemoveRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\V1\Cart;
use App\Rules\ProductStockIsAvailable;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class CartStoreRequest extends FormRequest
@@ -10,7 +11,7 @@ class CartStoreRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Category;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class CategoryIndexRequest extends FormRequest
@@ -9,7 +10,7 @@ class CategoryIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\V1\Forms\ContactUS;
use App\Models\System\Settings\OS;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -11,7 +12,7 @@ class ContactUSStoreRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Forms\Newsletter;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class NewsletterSubscriptionStoreRequest extends FormRequest
@@ -9,7 +10,7 @@ class NewsletterSubscriptionStoreRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Product;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -10,7 +11,7 @@ class BasicProductIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Product;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ProductCommentStore extends FormRequest
@@ -9,7 +10,7 @@ class ProductCommentStore extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Product;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -10,7 +11,7 @@ class ProductIndexRequest extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -3,6 +3,7 @@
namespace App\Http\Requests\Api\V1\Product\Review;
use App\Models\System\Settings\OS;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@@ -11,7 +12,7 @@ class ProductReviewStore extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Api\V1\Product\Review;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ProductReviewUpdate extends FormRequest
@@ -9,7 +10,7 @@ class ProductReviewUpdate extends FormRequest
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{

View File

@@ -4,19 +4,36 @@ namespace App\Http\Requests;
use App\Models\Ecommerce\Product\Order\Payment\OrderPayment;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShippingMethod;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\Location\Region;
use App\Models\System\Settings\OS;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Validator;
class CheckoutOrderRequest extends FormRequest
{
/**
* Prepare the data for validation.
*/
protected function prepareForValidation(): void
{
if (! $this->has('shipping_method_id') && $this->has('shipping_method')) {
$method = OrderShippingMethod::query()->where('slug', $this->shipping_method)->first();
if ($method) {
$this->merge([
'shipping_method_id' => $method->id,
]);
}
}
}
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @param Validator $validator
*/
public function withValidator($validator): void
{
@@ -39,16 +56,20 @@ class CheckoutOrderRequest extends FormRequest
'customer_phone' => ['required', 'integer', 'between:61000000,71999999'],
'customer_address' => ['required', 'string', 'max:255'],
'shipping_method' => ['required', 'string', 'max:255', Rule::in(array_keys(OrderShipping::values()))],
'shipping_method_id' => ['required', 'integer', 'exists:order_shipping_methods,id'],
'shipping_method' => ['nullable', 'string', 'max:255', Rule::in(array_keys(OrderShipping::values()))],
'shipping_price' => ['nullable', 'numeric'],
'product_ids' => ['required', 'array'],
'product_ids.*' => ['required', 'integer', 'exists:products,id'],
'payment_type_id' => ['required', Rule::in(array_keys(OrderPayment::values()))],
'notes' => ['nullable', 'string', 'max:255'],
'delivery_time' => ['nullable', 'string', 'max:255', Rule::in(array_keys(OrderShipping::times()))],
'delivery_at' => ['nullable', 'string', 'max:255', 'date'],
'region' => ['required', 'string', 'max:255', Rule::in(array_keys(Region::values()))],
'province_id' => ['nullable', Rule::when($this->region !== Region::AG, [
'integer', 'exists:provinces,id',
])],
'province_id' => ['nullable'],
'source' => ['nullable', 'string', 'in:site,mobile_app'],
@@ -64,13 +85,16 @@ class CheckoutOrderRequest extends FormRequest
*/
protected function passedValidation(): void
{
$shippingMethod = OrderShippingMethod::query()->find($this->shipping_method_id);
$this->merge([
'number' => Str::random(30),
'status' => OrderStatus::default(),
'user_id' => auth()->id(),
'notes' => $this->notes ?: null,
'province_id' => $this->province_id ?: null,
'shipping_price' => OrderShipping::priceFor($this->shipping_method),
'shipping_method' => $this->shipping_method ?: $shippingMethod?->slug,
'shipping_price' => $this->shipping_price ?: ($shippingMethod?->price ?? 0),
'delivery_time' => $this->delivery_time ?: OrderShipping::MORNING,
'delivery_at' => $this->delivery_at ?: date('Y-m-d'),
'source_app' => $this->source ?: OS::MOBILE_APP,
@@ -85,9 +109,7 @@ class CheckoutOrderRequest extends FormRequest
public function messages(): array
{
return [
'shipping_method.in' => sprintf('Valid sources: %s', implode(', ', array_keys(
OrderShipping::values()
))),
'shipping_method_id.exists' => 'The selected shipping method is invalid.',
'payment_type_id.in' => sprintf('Valid sources: %s', implode(', ', array_keys(
OrderPayment::values()
))),

View File

@@ -20,6 +20,7 @@ class ChannelResource extends JsonResource
'sort_order' => $this->whenHas('sort_order'),
'name' => $this->whenHas('name'),
'slug' => $this->whenHas('slug'),
'shipping_price' => $this->whenHas('shipping_price'),
'description' => $this->whenHas('description'),
'media' => ChannelMediaResource::collection($this->whenLoaded('media')),
];

View File

@@ -2,7 +2,6 @@
namespace App\Http\Resources\Api\V1\Order;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -19,7 +18,7 @@ class OrderIndexResource extends JsonResource
return [
'id' => $this->id,
'status' => OrderStatus::formattedStatusFor($this->status),
'shipping_method' => OrderShipping::formattedShippingMethod($this->shipping_method),
'shipping_method' => $this->formattedShippingMethod(),
'notes' => $this->notes,
'customer_name' => $this->customer_name,
'customer_phone' => $this->customer_phone,

View File

@@ -2,7 +2,6 @@
namespace App\Http\Resources\Api\V1\Vendor\Order;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -19,7 +18,7 @@ class VendorOrderIndexResource extends JsonResource
return [
'id' => $this->id,
'status' => OrderStatus::formattedStatusFor($this->status),
'shipping_method' => OrderShipping::formattedShippingMethod($this->shipping_method),
'shipping_method' => $this->formattedShippingMethod(),
'notes' => $this->notes,
'delivery_time' => $this->delivery_time,
'delivery_at' => $this->delivery_at?->format('d.m.Y'),

View File

@@ -2,7 +2,6 @@
namespace App\Http\Resources\Api\V1\Vendor\Order;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -19,7 +18,7 @@ class VendorOrderShowResource extends JsonResource
return [
'id' => $this->id,
'status' => OrderStatus::formattedStatusFor($this->status),
'shipping_method' => OrderShipping::formattedShippingMethod($this->shipping_method),
'shipping_method' => $this->formattedShippingMethod(),
'notes' => $this->notes,
'delivery_time' => $this->delivery_time,
'delivery_at' => $this->delivery_at,

View File

@@ -48,8 +48,8 @@ class ProductImport implements OnEachRow, WithHeadingRow
[
'channel_id' => $this->channel_id,
'ynamdyr_product_code' => $row['product_code'],
'ynamdyr_brand_id' => $row['brand_id'],
'ynamdyr_category_id' => $row['category_id'],
// 'ynamdyr_brand_id' => $row['brand_id'],
// 'ynamdyr_category_id' => $row['category_id'],
]
)
),
@@ -113,7 +113,7 @@ class ProductImport implements OnEachRow, WithHeadingRow
'old_price_amount' => $row['old_price'],
'cost_amount' => $row['sale_price'],
'price_amount' => $row['sale_price'],
'is_visible' => false,
'is_visible' => true,
];
}
}

View File

@@ -31,9 +31,9 @@ class SendOrderCreatedNotification implements ShouldQueue
return;
}
$this->sendSMSToClient($event->order);
$this->sendSMSToStaff($event->order);
$this->sendSMSToVendors($event->order);
// $this->sendSMSToClient($event->order);
// $this->sendSMSToStaff($event->order);
// $this->sendSMSToVendors($event->order);
}
/**
@@ -75,38 +75,38 @@ class SendOrderCreatedNotification implements ShouldQueue
*/
public function sendSMSToStaff($order): void
{
// $exists = DB::table('order_sent_notifications')
// ->where('order_id', $order->id)
// ->where('phone_number', orderAdminNumber())
// ->exists();
$exists = DB::table('order_sent_notifications')
->where('order_id', $order->id)
->where('phone_number', orderAdminNumber())
->exists();
// if (! $exists) {
// DB::table('order_sent_notifications')
// ->insert([
// 'order_id' => $order->id,
// 'phone_number' => orderAdminNumber(),
// ]);
if (! $exists) {
DB::table('order_sent_notifications')
->insert([
'order_id' => $order->id,
'phone_number' => orderAdminNumber(),
]);
// sendSMS(
// phone: orderAdminNumber(),
// message: sprintf(
// 'Täze sargyt: %s, eltip bermek: %s',
// $order->id,
// $order->shipping_method
// )
// );
sendSMS(
phone: orderAdminNumber(),
message: sprintf(
'Täze sargyt: %s, eltip bermek: %s',
$order->id,
$order->shipping_method
)
);
// Log::channel('order_sms_notification_sent_activity')
// ->info(sprintf('SMS_SENT_FOR_ORDER[id, phone]: %s, %s', $order->id, orderAdminNumber()));
Log::channel('order_sms_notification_sent_activity')
->info(sprintf('SMS_SENT_FOR_ORDER[id, phone]: %s, %s', $order->id, orderAdminNumber()));
// User::where('phone_number', orderAdminNumber())->first()->notify(
// NovaNotification::make()
// ->message('Täze sargyt.')
// ->action('Gör', sprintf('/turkmenpostadmin/resources/orders/%s', $order->id))
// ->icon('download')
// ->type('info')
// );
// }
User::where('phone_number', orderAdminNumber())->first()->notify(
NovaNotification::make()
->message('Täze sargyt.')
->action('Gör', sprintf('/turkmenpostadmin/resources/orders/%s', $order->id))
->icon('download')
->type('info')
);
}
}
/**

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Models\Chat;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Conversation extends Model
{
use HasFactory;
public function users()
{
return $this->belongsToMany(User::class);
}
public function messages()
{
return $this->hasMany(Message::class);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Models\Chat;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
use HasFactory;
public function user()
{
return $this->belongsTo(User::class);
}
}

View File

@@ -169,7 +169,7 @@ class Channel extends Model implements HasMedia, Sortable
/**
* Channels inventories
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
* @return HasMany
*/
// public function inventories(): HasMany
// {

View File

@@ -11,6 +11,10 @@ trait HasShipping
*/
public function shippingPrice(): int
{
if ($this->shippingMethod) {
return intval($this->shipping_price) ?: $this->shippingMethod->price;
}
return intval($this->shipping_price) ?: OrderShipping::priceFor($this->shipping_method);
}
@@ -19,6 +23,10 @@ trait HasShipping
*/
public function formattedShippingMethod(): string
{
if ($this->shippingMethod) {
return $this->shippingMethod->name;
}
return OrderShipping::formattedShippingMethod($this->shipping_method);
}

View File

@@ -5,6 +5,7 @@ namespace App\Models\Ecommerce\Product\Order;
use App\Models\Ecommerce\Product\Order\Concerns\HasPayments;
use App\Models\Ecommerce\Product\Order\Concerns\HasShipping;
use App\Models\Ecommerce\Product\Order\Concerns\HasStatus;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShippingMethod;
use App\Models\System\Settings\Location\Province;
use App\Models\System\Settings\Payments\PaymentType;
use App\Models\User;
@@ -31,6 +32,7 @@ class Order extends Model
'number',
'status',
'shipping_method',
'shipping_method_id',
'shipping_price',
'payment_type_id',
'notes',
@@ -40,6 +42,7 @@ class Order extends Model
'delivery_time',
'delivery_at',
'region',
'halkbank_id',
'user_id',
'additional_tax',
'province_id',
@@ -84,4 +87,12 @@ class Order extends Model
{
return $this->belongsTo(PaymentType::class, 'payment_type_id');
}
/**
* Shipping method
*/
public function shippingMethod(): BelongsTo
{
return $this->belongsTo(OrderShippingMethod::class, 'shipping_method_id');
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Models\Ecommerce\Product\Order\Shipping;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Spatie\Translatable\HasTranslations;
class OrderShippingMethod extends Model
{
use HasFactory;
use HasSlug;
use HasTranslations;
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'order_shipping_methods';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'slug',
'description',
'price',
'is_active',
];
/**
* Translatable fields
*
* @var array<int, string>
*/
public $translatable = [
'name',
'description',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'is_active' => 'boolean',
];
/**
* Get the options for generating the slug.
*/
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom('name')
->saveSlugsTo('slug');
}
}

View File

@@ -40,7 +40,7 @@ class LegalPage extends Model
*
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Model|null
* @return Model|null
*/
public function resolveRouteBinding($value, $field = null)
{

View File

@@ -23,7 +23,7 @@ class GlobalOrderResource extends Resource
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Modules\GlobalOrder\Models\GlobalOrder>
* @var class-string<GlobalOrder>
*/
public static $model = GlobalOrder::class;

View File

@@ -3,6 +3,7 @@
namespace App\Nova\Filters;
use App\Models\System\Settings\OS;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -18,9 +19,9 @@ class AppTypeFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -3,6 +3,7 @@
namespace App\Nova\Filters;
use App\Models\System\Settings\Location\Region;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -26,9 +27,9 @@ class RegionFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Filters;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -20,15 +21,15 @@ class ResourceLimitFilter extends Filter
public function __construct(
protected $resource
) {
//...
// ...
}
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -3,6 +3,7 @@
namespace App\Nova\Filters;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -26,9 +27,9 @@ class StatusFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -3,6 +3,7 @@
namespace App\Nova\Filters;
use App\Models\System\Roles\Role;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -26,9 +27,9 @@ class UserRoleFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Filters;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -25,9 +26,9 @@ class VerifiedUsersFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Filters;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -25,9 +26,9 @@ class VisableFilter extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -3,6 +3,7 @@
namespace App\Nova\Lenses;
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Number;
@@ -31,7 +32,7 @@ class MostSoldProducts extends Lens
/**
* Get the query builder / paginator for the lens.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
*/
public static function query(LensRequest $request, $query): mixed
{

View File

@@ -5,6 +5,7 @@ namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Resource as NovaResource;
use Laravel\Scout\Builder;
abstract class Resource extends NovaResource
{
@@ -46,8 +47,8 @@ abstract class Resource extends NovaResource
/**
* Build a Scout search query for the given resource.
*
* @param \Laravel\Scout\Builder $query
* @return \Laravel\Scout\Builder
* @param Builder $query
* @return Builder
*/
public static function scoutQuery(NovaRequest $request, $query)
{

View File

@@ -28,7 +28,7 @@ class Banner extends Resource
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\CMS\Media\Banner>
* @var class-string<BannerModel>
*/
public static $model = BannerModel::class;
@@ -156,8 +156,8 @@ class Banner extends Resource
public function filters(NovaRequest $request): array
{
return [
new VisableFilter(),
new AppTypeFilter(),
new VisableFilter,
new AppTypeFilter,
];
}

View File

@@ -163,8 +163,8 @@ class Carousel extends Resource
public function filters(NovaRequest $request)
{
return [
new VisableFilter(),
new AppTypeFilter(),
new VisableFilter,
new AppTypeFilter,
];
}

View File

@@ -100,6 +100,9 @@ class Channel extends Resource
Text::make(__('Description'), 'description')
->rules(['nullable', 'string', 'max:255']),
Text::make('Daswtawka bahasy', 'shipping_price')
->rules('nullable', 'numeric'),
URL::make('URL'),
Hidden::make('is_default')->default(true),
Hidden::make('timezone')->default('Asia/Ashgabat'),

View File

@@ -7,6 +7,7 @@ use App\Nova\Resource;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\URL;
class AttributeValue extends Resource
{
@@ -53,7 +54,7 @@ class AttributeValue extends Resource
* Return the location to redirect the user after creation.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterCreate(NovaRequest $request, $resource): string
{
@@ -64,7 +65,7 @@ class AttributeValue extends Resource
* Return the location to redirect the user after update.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterUpdate(NovaRequest $request, $resource)
{

View File

@@ -7,6 +7,7 @@ use App\Nova\Filters\VisableFilter;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Product\Product\Product;
use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\ID;
@@ -80,7 +81,7 @@ class Brand extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
*/
public static function indexQuery(NovaRequest $request, $query)
{

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Resources\Ecommerce\Product\Category\Filters;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -17,9 +18,9 @@ class Level extends Filter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -2,6 +2,7 @@
namespace App\Nova\Resources\Ecommerce\Product\Category\Filters;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Filters\BooleanFilter;
use Laravel\Nova\Http\Requests\NovaRequest;
@@ -10,9 +11,9 @@ class RelatedToMarket extends BooleanFilter
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
* @return Builder
*/
public function apply(NovaRequest $request, $query, $value)
{

View File

@@ -9,6 +9,7 @@ use App\Nova\Permissions\NovaPermission;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Channel\Channel;
use App\Nova\Resources\Ecommerce\Product\Inventory\Product\ProductResource;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Boolean;
@@ -70,8 +71,8 @@ class Inventory extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $query
* @return Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{

View File

@@ -2,21 +2,24 @@
namespace App\Nova\Resources\Ecommerce\Product\Inventory;
use App\Models\Ecommerce\Product\Inventory\InventoryHistory;
use App\Models\Ecommerce\Product\Inventory\InventoryHistoryItem;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Product\Product\Product;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\URL;
class InventoryHistoryItemResource extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\Ecommerce\Product\Inventory\InventoryHistory>
* @var class-string<InventoryHistory>
*/
public static $model = InventoryHistoryItem::class;
@@ -60,8 +63,8 @@ class InventoryHistoryItemResource extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $query
* @return Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
@@ -109,7 +112,7 @@ class InventoryHistoryItemResource extends Resource
* Return the location to redirect the user after creation.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterUpdate(NovaRequest $request, $resource): string
{

View File

@@ -2,21 +2,24 @@
namespace App\Nova\Resources\Ecommerce\Product\Inventory;
use App\Models\Ecommerce\Product\Inventory\InventoryHistory;
use App\Models\Ecommerce\Product\Inventory\InventoryHistoryRemovedItem;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Product\Product\Product;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Number;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\URL;
class InventoryHistoryRemovedItemResource extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\Ecommerce\Product\Inventory\InventoryHistory>
* @var class-string<InventoryHistory>
*/
public static $model = InventoryHistoryRemovedItem::class;
@@ -60,8 +63,8 @@ class InventoryHistoryRemovedItemResource extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $query
* @return Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
@@ -109,7 +112,7 @@ class InventoryHistoryRemovedItemResource extends Resource
* Return the location to redirect the user after creation.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterUpdate(NovaRequest $request, $resource): string
{

View File

@@ -7,6 +7,7 @@ use App\Models\Ecommerce\Product\Product\Product;
use App\Nova\Repeater\InventoryHistoryItemRepeater;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Channel\Channel;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@@ -17,13 +18,14 @@ use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Repeater;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\URL;
class InventoryHistoryRemovedResource extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\Ecommerce\Product\Inventory\InventoryHistoryRemoved>
* @var class-string<InventoryHistoryRemoved>
*/
public static $model = InventoryHistoryRemoved::class;
@@ -67,8 +69,8 @@ class InventoryHistoryRemovedResource extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $query
* @return Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
@@ -85,7 +87,7 @@ class InventoryHistoryRemovedResource extends Resource
* Return the location to redirect the user after creation.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterCreate(NovaRequest $request, $resource): string
{

View File

@@ -7,6 +7,7 @@ use App\Models\Ecommerce\Product\Product\Product;
use App\Nova\Repeater\InventoryHistoryItemRepeater;
use App\Nova\Resource;
use App\Nova\Resources\Ecommerce\Channel\Channel;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@@ -17,13 +18,14 @@ use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Repeater;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\URL;
class InventoryHistoryResource extends Resource
{
/**
* The model the resource corresponds to.
*
* @var class-string<\App\Models\Ecommerce\Product\Inventory\InventoryHistory>
* @var class-string<InventoryHistory>
*/
public static $model = InventoryHistory::class;
@@ -67,8 +69,8 @@ class InventoryHistoryResource extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
* @param Builder $query
* @return Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
@@ -85,7 +87,7 @@ class InventoryHistoryResource extends Resource
* Return the location to redirect the user after creation.
*
* @param \Laravel\Nova\Resource $resource
* @return \Laravel\Nova\URL|string
* @return URL|string
*/
public static function redirectAfterCreate(NovaRequest $request, $resource): string
{

View File

@@ -67,7 +67,7 @@ class ProductResource extends Resource
/**
* Build an "index" query for the given resource.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param Builder $query
*/
public static function indexQuery(NovaRequest $request, $query): Builder
{

Some files were not shown because too many files have changed in this diff Show More