This commit is contained in:
2025-09-25 03:03:31 +05:00
commit ae480cf2f6
2768 changed files with 1485826 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Nova\Resources\Ecommerce\Product\Order\Concerns;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\Location\Region;
use App\Nova\Fields\FieldHelpers;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;
trait HasFieldsForIndex
{
/**
* Get the fields displayed by the resource.
*/
public function fieldsForIndex(NovaRequest $request): array
{
return [
ID::make()->sortable(),
Text::make(__('Customer'), 'customer_name')
->canSeeWhen('systemUser', $this)
->sortable(),
Text::make(__('Phone'), 'customer_phone')
->canSeeWhen('systemUser', $this)
->sortable(),
Select::make(__('Welaýat'), 'region')
->displayUsingLabels()
->options(Region::values())
->canSeeWhen('systemUser', $this)
->sortable(),
Select::make(__('Delivery time'), 'delivery_time')
->displayUsingLabels()
->searchable()
->options(OrderShipping::times())
->rules('required')
->sortable(),
Date::make(__('Delivery date'), 'delivery_at')
->displayUsing(FieldHelpers::tmDate())
->sortable(),
Text::make(__('Total'), fn () => $this->resource->fullPriceWithShipping().' TMT')
->canSeeWhen('systemUser', $this)
->sortable(),
Badge::make('Status')->map(OrderStatus::classes())->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])->labels(OrderStatus::values())->sortable(),
];
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Nova\Resources\Ecommerce\Product\Order\Concerns;
use App\Models\Ecommerce\Product\Order\Payment\OrderPayment;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\Location\Province;
use App\Models\System\Settings\Location\Region;
use App\Models\System\Settings\OS;
use App\Repositories\Ecommerce\Order\NovaOrderRepository;
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\Hidden;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Nurmuhammet\NovaInputmask\NovaInputmask;
class OrderFieldsForCreate
{
/**
* Order fields for create
*/
public static function make($resource, $request): array
{
return [
Hidden::make('number')->default(Str::random(30)),
Hidden::make('user_id')->default($request->user()->id),
Hidden::make('source_app')->default(OS::ADMIN),
ID::make(),
Text::make(__('Customer name'), 'customer_name')
->rules('nullable', 'string', 'max:255')
->canSeeWhen('systemUser', $resource)
->default('Walk in customer'),
NovaInputmask::make(__('Customer phone'), 'customer_phone')
->mask(phoneMaskFormat())
->storeRawValue()
->canSeeWhen('systemUser', $resource),
Select::make(__('Region'), 'region')
->displayUsingLabels()
->searchable()
->options(Region::values())
->default(Region::default())
->canSeeWhen('systemUser', $resource),
Select::make(__('Province'), 'province_id')
->displayUsingLabels()
->searchable()
->dependsOn(['region'], NovaOrderRepository::dependsOnWhere('region', Province::class)),
Text::make(__('Customer address'), 'customer_address')
->rules('nullable', 'string', 'max:255'),
Select::make(__('Payment type'), 'payment_type_id')
->displayUsingLabels()
->searchable()
->options(OrderPayment::values())
->default(OrderPayment::default()),
Select::make(__('Shipping method'), 'shipping_method')
->displayUsingLabels()
->searchable()
->options(OrderShipping::values())
->default(OrderShipping::default())
->sortable(),
Text::make(__('Shipping price'), 'shipping_price')
->rules('required', 'numeric')
->dependsOn('shipping_method', function ($field, $request, $formData) {
if ($formData->shipping_method) {
$field->setValue(OrderShipping::priceFor($formData->shipping_method));
}
}),
Date::make(__('Delivery at'), 'delivery_at')
->default(date('Y-m-d'))
->rules('required'),
Select::make(__('Delivery time'), 'delivery_time')
->displayUsingLabels()
->searchable()
->options(OrderShipping::times())
->default(OrderShipping::defaultTime()),
Text::make(__('Additional tax'), 'additional_tax')
->rules('nullable', 'numeric'),
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderStatus::values())
->default(OrderStatus::default()),
Text::make(__('Notes'), 'notes')
->rules('nullable', 'string', 'max:255'),
];
}
}

View File

@@ -0,0 +1,98 @@
<?php
namespace App\Nova\Resources\Ecommerce\Product\Order\Concerns;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\OS;
use App\Nova\Resources\Ecommerce\Product\Order\OrderItem;
use App\Nova\Resources\System\Payments\PaymentType;
use App\Nova\User;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Nurmuhammet\NovaInputmask\NovaInputmask;
class OrderFieldsForDetail
{
/**
* Order fields for detail
*/
public static function make($resource, $request): array
{
// nova has a wierd bug, can load detail fields while on Index
if (! $request->isResourceDetailRequest()) {
if ($request->viaResource && $request->viaRelationship && $request->relationshipType) {
} else {
return [];
}
}
return [
ID::make()->sortable(),
Text::make(__('Customer name'), 'customer_name'),
NovaInputmask::make(__('Customer phone'), 'customer_phone')
->mask(phoneMaskFormat())
->storeRawValue(),
Text::make(
name: __('Address'),
attribute: fn ($model) => view('vendor.nova.resources.order.create-fields.address', [
'model' => $model,
])->render()
)
->asHtml(),
BelongsTo::make(__('Payment type'), 'paymentType', PaymentType::class),
Text::make(
name: __('Shipping'),
attribute: fn ($model) => view('vendor.nova.resources.order.create-fields.shipping', [
'model' => $model,
])->render()
)
->asHtml(),
Text::make(
name: __('Shipping time'),
attribute: fn ($model) => view('vendor.nova.resources.order.create-fields.shipping-time', [
'model' => $model,
])->render()
)
->asHtml(),
Select::make(__('App'), 'source_app')
->displayUsingLabels()
->options(OS::apps())
->sortable(),
Badge::make('Status')->map(OrderStatus::classes())->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])->labels(OrderStatus::values())->sortable(),
Text::make(__('Notes'), 'notes'),
Text::make(__('Additional tax'), fn () => $resource->additional_tax.' TMT')
->canSeeWhen('systemUser', $resource),
Text::make(__('Products total'), fn () => $resource->total().' TMT')
->canSeeWhen('systemUser', $resource),
Text::make(__('Total'), fn () => $resource->fullPriceWithShipping().' TMT')
->canSeeWhen('systemUser', $resource),
DateTime::make(__('Created at'), 'created_at')
->turkmenDate(),
BelongsTo::make(__('Filled by:'), 'user', User::class),
HasMany::make(__('Products'), 'items', OrderItem::class),
];
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace App\Nova\Resources\Ecommerce\Product\Order\Concerns;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\Location\Region;
use App\Models\System\Settings\OS;
use App\Nova\Fields\FieldHelpers;
use Laravel\Nova\Fields\Badge;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Nurmuhammet\NovaInputmask\NovaInputmask;
class OrderFieldsForIndex
{
/**
* Fields for index
*/
public static function make($resource, $request): array
{
return [
ID::make()->sortable(),
Text::make(__('Customer'), 'customer_name')
->sortable(),
NovaInputmask::make(__('Customer phone'), 'customer_phone')
->mask(phoneMaskFormat())
->storeRawValue()
->sortable(),
Select::make(__('Welaýat'), 'region')
->displayUsingLabels()
->options(Region::values())
->sortable(),
Select::make(__('Delivery time'), 'delivery_time')
->displayUsingLabels()
->searchable()
->options(OrderShipping::times())
->rules('required')
->sortable(),
Date::make(__('Delivery date'), 'delivery_at')
->displayUsing(FieldHelpers::tmDate())
->sortable(),
Select::make(__('Shipping method'), 'shipping_method')
->displayUsingLabels()
->options(OrderShipping::values())
->default(OrderShipping::default())
->sortable(),
Select::make(__('Source'), 'source_app')
->displayUsingLabels()
->options(OS::apps())
->sortable(),
Text::make(__('Total'), fn () => $resource->fullPriceWithShipping().' TMT')
->canSeeWhen('systemUser', $resource)
->sortable(),
DateTime::make(__('Created at'), 'created_at')
->turkmenDate(),
Badge::make('Status')
->map(OrderStatus::classes())
->labels(OrderStatus::values())
->addTypes([
'primary' => 'dark:bg-gray-900 bg-gray-600 text-white',
])
->sortable(),
];
}
}

View File

@@ -0,0 +1,99 @@
<?php
namespace App\Nova\Resources\Ecommerce\Product\Order\Concerns;
use App\Models\Ecommerce\Product\Order\Payment\OrderPayment;
use App\Models\Ecommerce\Product\Order\Shipping\OrderShipping;
use App\Models\Ecommerce\Product\Order\Status\OrderStatus;
use App\Models\System\Settings\Location\Province;
use App\Models\System\Settings\Location\Region;
use App\Repositories\Ecommerce\Order\NovaOrderRepository;
use Laravel\Nova\Fields\Date;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Nurmuhammet\NovaInputmask\NovaInputmask;
class OrderFieldsForUpdate
{
/**
* Order
*/
public static function make($resource, $request): array
{
return [
ID::make()->sortable(),
Text::make(__('Customer name'), 'customer_name')
->rules('nullable', 'string', 'max:255')
->canSeeWhen('systemUser', $resource),
NovaInputmask::make(__('Customer phone'), 'customer_phone')
->mask(phoneMaskFormat())
->storeRawValue()
->canSeeWhen('systemUser', $resource),
Select::make(__('Region'), 'region')
->displayUsingLabels()
->searchable()
->options(Region::values())
->default(Region::default())
->canSeeWhen('systemUser', $resource),
Select::make(__('Province'), 'province_id')
->displayUsingLabels()
->searchable()
->dependsOn(['region'], NovaOrderRepository::dependsOnWhere('region', Province::class)),
Text::make(__('Customer address'), 'customer_address')
->rules('nullable', 'string', 'max:255'),
Select::make(__('Payment type'), 'payment_type_id')
->displayUsingLabels()
->searchable()
->options(OrderPayment::values())
->default(OrderPayment::default()),
Select::make(__('Shipping method'), 'shipping_method')
->displayUsingLabels()
->searchable()
->options(OrderShipping::values())
->default(OrderShipping::default())
->sortable(),
Text::make(__('Shipping price'), 'shipping_price')
->rules('required', 'numeric')
->dependsOn('shipping_method', function ($field, $request, $formData) use ($resource) {
if ($formData->shipping_price) {
return;
}
if ($formData->shipping_method) {
$field->setValue(OrderShipping::orderShippingPrice($resource));
}
}),
Text::make(__('Additional tax'), 'additional_tax')
->rules('nullable', 'numeric'),
Date::make(__('Delivery at'), 'delivery_at')
->default(date('Y-m-d'))
->rules('required'),
Select::make(__('Delivery time'), 'delivery_time')
->displayUsingLabels()
->searchable()
->options(OrderShipping::times())
->default(OrderShipping::defaultTime()),
Select::make(__('Status'), 'status')
->displayUsingLabels()
->searchable()
->options(OrderStatus::values())
->default(OrderStatus::default()),
Text::make(__('Notes'), 'notes')
->rules('nullable', 'string', 'max:255'),
];
}
}