Compare commits
10 Commits
60d17902a2
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f53580b930 | |||
|
|
10081fd20e | ||
| 01209efaac | |||
|
|
5d7b9d52f8 | ||
| 257c60e69a | |||
|
|
499fa0b2dd | ||
| 9b5468fdf7 | |||
|
|
27b5ad2cfe | ||
| 74cdcb89b9 | |||
|
|
4c7bed8c63 |
@@ -132,7 +132,10 @@ class ProcessOrderImporter extends Importer
|
|||||||
if ($iCode == null || $iCode == '') {
|
if ($iCode == null || $iCode == '') {
|
||||||
$warnMsg[] = "Item code can't be empty!";
|
$warnMsg[] = "Item code can't be empty!";
|
||||||
} elseif (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
|
} elseif (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
|
||||||
$warnMsg[] = 'Invalid item code found';
|
$warnMsg[] = 'Invalid item code found!';
|
||||||
|
}
|
||||||
|
if ($machineName != null && $machineName != '' && Str::length($machineName) > 18) {
|
||||||
|
$warnMsg[] = 'Invalid machine name found!';
|
||||||
}
|
}
|
||||||
if ($processOrder == null || $processOrder == '') {
|
if ($processOrder == null || $processOrder == '') {
|
||||||
$warnMsg[] = "Process order can't be empty!";
|
$warnMsg[] = "Process order can't be empty!";
|
||||||
@@ -169,7 +172,7 @@ class ProcessOrderImporter extends Importer
|
|||||||
} elseif ($reworkStatus == 1 || $reworkStatus = '1') {
|
} elseif ($reworkStatus == 1 || $reworkStatus = '1') {
|
||||||
$reworkStatus = 1;
|
$reworkStatus = 1;
|
||||||
} else {
|
} else {
|
||||||
$warnMsg[] = 'Invalid rework status found';
|
$warnMsg[] = 'Invalid rework status found!';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! empty($warnMsg)) {
|
if (! empty($warnMsg)) {
|
||||||
@@ -233,7 +236,7 @@ class ProcessOrderImporter extends Importer
|
|||||||
->first();
|
->first();
|
||||||
|
|
||||||
if ($existingOrder && $existingOrder->item_id !== ($itemId ?? null)) {
|
if ($existingOrder && $existingOrder->item_id !== ($itemId ?? null)) {
|
||||||
$warnMsg[] = 'Same Process Order already exists for this Plant with a different Item Code';
|
$warnMsg[] = 'Same Process Order already exists for this Plant with a different Item Code!';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,7 +265,7 @@ class ProcessOrderImporter extends Importer
|
|||||||
->where('process_order', $processOrder)
|
->where('process_order', $processOrder)
|
||||||
->sum('received_quantity');
|
->sum('received_quantity');
|
||||||
|
|
||||||
if($existing){
|
if ($existing) {
|
||||||
$liveOrdQuan = (float) $existing->order_quantity;
|
$liveOrdQuan = (float) $existing->order_quantity;
|
||||||
$liveUpdatedOrdQuan = (float) $existing->updated_order_quantity;
|
$liveUpdatedOrdQuan = (float) $existing->updated_order_quantity;
|
||||||
|
|
||||||
@@ -273,16 +276,15 @@ class ProcessOrderImporter extends Importer
|
|||||||
|
|
||||||
if ($liveUpdatedOrdQuan > $maxAllowedQty) {
|
if ($liveUpdatedOrdQuan > $maxAllowedQty) {
|
||||||
throw new RowImportFailedException(
|
throw new RowImportFailedException(
|
||||||
"Updated order quantity cannot exceed 10% of existing order quantity. Max allowed: {$maxAllowedQty}"
|
"Updated order quantity cannot exceed 10% of existing order quantity. Max allowed: {$maxAllowedQty}!"
|
||||||
);
|
);
|
||||||
}
|
} elseif ($liveUpdatedOrdQuan < $minAllowedQty) {
|
||||||
else if ($liveUpdatedOrdQuan < $minAllowedQty) {
|
|
||||||
throw new RowImportFailedException(
|
throw new RowImportFailedException(
|
||||||
"Updated order quantity cannot decrease -10% of existing order quantity. Min allowed: {$minAllowedQty}"
|
"Updated order quantity cannot decrease -10% of existing order quantity. Min allowed: {$minAllowedQty}!"
|
||||||
);
|
);
|
||||||
}else if($liveUpdatedOrdQuan < $receivedQty) {
|
} elseif ($liveUpdatedOrdQuan < $receivedQty) {
|
||||||
throw new RowImportFailedException(
|
throw new RowImportFailedException(
|
||||||
"Updated order quantity cannot decrease below its received quantity {$receivedQty}"
|
"Updated order quantity cannot decrease below its received quantity {$receivedQty}!"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,10 +301,9 @@ class ProcessOrderImporter extends Importer
|
|||||||
// ->where('line_id', $lineId)
|
// ->where('line_id', $lineId)
|
||||||
// ->first();
|
// ->first();
|
||||||
|
|
||||||
if($existing){
|
if ($existing) {
|
||||||
$existUpdateOrdQuan = $existing->updated_order_quantity;
|
$existUpdateOrdQuan = $existing->updated_order_quantity;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$existUpdateOrdQuan = $updatedOrderQuan;
|
$existUpdateOrdQuan = $updatedOrderQuan;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,10 +351,9 @@ class ProcessOrderImporter extends Importer
|
|||||||
// // ->where('coil_number', $coilNo)
|
// // ->where('coil_number', $coilNo)
|
||||||
// ->first();
|
// ->first();
|
||||||
|
|
||||||
if($existing){
|
if ($existing) {
|
||||||
$existUpdateOrdQuan = $existing->updated_order_quantity;
|
$existUpdateOrdQuan = $existing->updated_order_quantity;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$existUpdateOrdQuan = $updatedOrderQuan;
|
$existUpdateOrdQuan = $updatedOrderQuan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
namespace App\Filament\Pages;
|
namespace App\Filament\Pages;
|
||||||
|
|
||||||
use App\Filament\Widgets\CumulativeChart;
|
use App\Filament\Widgets\CumulativeChart;
|
||||||
|
use App\Filament\Widgets\ProductionQuantityStat;
|
||||||
use Filament\Forms\Components\Select;
|
use Filament\Forms\Components\Select;
|
||||||
use Filament\Forms\Components\TextInput;
|
use Filament\Forms\Components\TextInput;
|
||||||
use Filament\Forms\Form;
|
use Filament\Forms\Form;
|
||||||
@@ -9,64 +10,117 @@ use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
|
|||||||
use Filament\Tables\Filters\SelectFilter;
|
use Filament\Tables\Filters\SelectFilter;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use App\Models\Plant;
|
use App\Models\Plant;
|
||||||
|
use Filament\Facades\Filament;
|
||||||
|
use Filament\Forms\Components\DatePicker;
|
||||||
use Filament\Widgets\Widget;
|
use Filament\Widgets\Widget;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
class Dashboard extends \Filament\Pages\Dashboard
|
class Dashboard extends \Filament\Pages\Dashboard
|
||||||
{
|
{
|
||||||
use HasFiltersForm;
|
use HasFiltersForm;
|
||||||
|
|
||||||
protected static ?string $navigationGroup = 'Production DashBoard';
|
protected static ?string $navigationIcon = 'heroicon-s-gift';
|
||||||
|
|
||||||
public function mount(): void
|
protected static string $view = 'filament.pages.dashboard';
|
||||||
{
|
|
||||||
session()->forget(['selected_plant']);
|
|
||||||
$this->filtersForm->fill([
|
|
||||||
'plant' => null
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function filtersForm(Form $form): Form
|
// public function mount(): void
|
||||||
{
|
// {
|
||||||
return $form
|
// session()->forget(['selected_plant']);
|
||||||
->statePath('filters') // Store form state in 'filters'
|
// session()->forget(['from_date']);
|
||||||
->schema([
|
// session()->forget(['to_date']);
|
||||||
Select::make('plant')
|
// $this->filtersForm->fill([
|
||||||
->options(Plant::pluck('name', 'id'))
|
// 'plant' => null,
|
||||||
->label('Select Plant')
|
// 'from_date' => null,
|
||||||
->reactive()
|
// 'to_date' => null,
|
||||||
->afterStateUpdated(function ($state) {
|
// // 'success_status' => null
|
||||||
session(['selected_plant' => $state]); // fixed typo
|
// ]);
|
||||||
//$this->dispatch('cumulativeChart'); // custom Livewire event
|
// }
|
||||||
}),
|
|
||||||
]);
|
|
||||||
|
|
||||||
}
|
// public function filtersForm(Form $form): Form
|
||||||
|
// {
|
||||||
|
// return $form
|
||||||
|
// ->statePath('filters') // Store form state in 'filters'
|
||||||
|
// ->schema([
|
||||||
|
// Select::make('plant')
|
||||||
|
// ->label('Select Plant')
|
||||||
|
// ->reactive()
|
||||||
|
// // ->options(Plant::pluck('name', 'id'))
|
||||||
|
// ->options(function (callable $get) {
|
||||||
|
// $userHas = Filament::auth()->user()->plant_id;
|
||||||
|
// return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
|
||||||
|
// })
|
||||||
|
// ->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
// session(['selected_plant' => $state]); // fixed typo
|
||||||
|
// //$this->dispatch('cumulativeChart'); // custom Livewire event
|
||||||
|
// // Reset success_status whenever plant changes
|
||||||
|
// $set('success_status', null);
|
||||||
|
// session()->forget('success_status');
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// // Select::make('success_status')
|
||||||
|
// // ->label('Select Status')
|
||||||
|
// // ->options([
|
||||||
|
// // 'Ok' => 'Ok',
|
||||||
|
// // 'Not Ok' => 'Not Ok',
|
||||||
|
// // ])
|
||||||
|
// // ->reactive()
|
||||||
|
// // ->afterStateUpdated(function ($state) {
|
||||||
|
// // session(['success_status' => $state]);
|
||||||
|
// // }),
|
||||||
|
|
||||||
|
// DatePicker::make('created_from')
|
||||||
|
// ->label('Created From')
|
||||||
|
// ->reactive()
|
||||||
|
// ->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
// session(['from_date' => $state]);
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// DatePicker::make('created_to')
|
||||||
|
// ->label('Created To')
|
||||||
|
// ->reactive()
|
||||||
|
// ->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
// session(['to_date' => $state]);
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// ]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
public static function getNavigationLabel(): string
|
// public static function getNavigationLabel(): string
|
||||||
{
|
// {
|
||||||
return 'Production Line Count';
|
// return 'Production Line Count';
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
// public function getHeading(): string
|
||||||
|
// {
|
||||||
|
// return 'Production Line Count';
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public function getWidgets(): array
|
||||||
|
// {
|
||||||
|
// $widgets = [];
|
||||||
|
|
||||||
|
// if (CumulativeChart::canView()) {
|
||||||
|
// $widgets[] = CumulativeChart::class;
|
||||||
|
|
||||||
|
// }
|
||||||
|
// return $widgets;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public static function canAccess(): bool
|
||||||
|
// {
|
||||||
|
// return Auth::check() && Auth::user()->can('view production line count dashboard');
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
public function getHeading(): string
|
public function getHeading(): string
|
||||||
{
|
{
|
||||||
return 'Production Line Count';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWidgets(): array
|
public static function getNavigationLabel(): string
|
||||||
{
|
{
|
||||||
$widgets = [];
|
return 'Welcome';
|
||||||
|
|
||||||
if (CumulativeChart::canView()) {
|
|
||||||
$widgets[] = CumulativeChart::class;
|
|
||||||
}
|
|
||||||
return $widgets;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function canAccess(): bool
|
|
||||||
{
|
|
||||||
return Auth::check() && Auth::user()->can('view production line count dashboard');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,124 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Filament\Pages;
|
namespace App\Filament\Pages;
|
||||||
|
|
||||||
use Filament\Pages\Page;
|
use App\Filament\Widgets\CumulativeChart;
|
||||||
|
use App\Filament\Widgets\ProductionQuantityStat;
|
||||||
|
use Filament\Forms\Components\Select;
|
||||||
|
use Filament\Forms\Components\TextInput;
|
||||||
|
use Filament\Forms\Form;
|
||||||
|
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
|
||||||
|
use Filament\Tables\Filters\SelectFilter;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use App\Models\Plant;
|
||||||
|
use Filament\Facades\Filament;
|
||||||
|
use Filament\Forms\Components\DatePicker;
|
||||||
|
use Filament\Widgets\Widget;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Filament\Pages\Page;
|
||||||
|
use Filament\Forms\Concerns\InteractsWithForms;
|
||||||
|
|
||||||
class Welcome extends Page
|
class Welcome extends Page
|
||||||
{
|
{
|
||||||
protected static ?string $navigationIcon = 'heroicon-s-gift'; // 'heroicon-o-document-text';
|
|
||||||
|
|
||||||
protected static string $view = 'filament.pages.welcome';
|
protected static string $view = 'filament.pages.welcome';
|
||||||
|
|
||||||
public function getHeading(): string
|
protected static ?string $navigationIcon = 'heroicon-o-document-text';
|
||||||
|
|
||||||
|
use HasFiltersForm;
|
||||||
|
|
||||||
|
use InteractsWithForms;
|
||||||
|
|
||||||
|
protected static ?string $navigationGroup = 'Production DashBoard';
|
||||||
|
|
||||||
|
protected static ?string $slug = 'production-line-count';
|
||||||
|
|
||||||
|
public function mount(): void
|
||||||
{
|
{
|
||||||
return '';
|
session()->forget(['selected_plant']);
|
||||||
|
// session()->forget(['from_date']);
|
||||||
|
// session()->forget(['to_date']);
|
||||||
|
$this->filtersForm->fill([
|
||||||
|
'plant' => null,
|
||||||
|
// 'from_date' => null,
|
||||||
|
// 'to_date' => null,
|
||||||
|
// 'success_status' => null
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filtersForm(Form $form): Form
|
||||||
|
{
|
||||||
|
return $form
|
||||||
|
->statePath('filters')
|
||||||
|
->schema([
|
||||||
|
Select::make('plant')
|
||||||
|
->label('Select Plant')
|
||||||
|
->reactive()
|
||||||
|
// ->options(Plant::pluck('name', 'id'))
|
||||||
|
->options(function (callable $get) {
|
||||||
|
$userHas = Filament::auth()->user()->plant_id;
|
||||||
|
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
|
||||||
|
})
|
||||||
|
->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
session(['selected_plant' => $state]);
|
||||||
|
//$this->dispatch('cumulativeChart'); // custom Livewire event
|
||||||
|
// Reset success_status whenever plant changes
|
||||||
|
// $set('success_status', null);
|
||||||
|
// session()->forget('success_status');
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Select::make('success_status')
|
||||||
|
// ->label('Select Status')
|
||||||
|
// ->options([
|
||||||
|
// 'Ok' => 'Ok',
|
||||||
|
// 'Not Ok' => 'Not Ok',
|
||||||
|
// ])
|
||||||
|
// ->reactive()
|
||||||
|
// ->afterStateUpdated(function ($state) {
|
||||||
|
// session(['success_status' => $state]);
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// DatePicker::make('created_from')
|
||||||
|
// ->label('Created From')
|
||||||
|
// ->reactive()
|
||||||
|
// ->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
// session(['from_date' => $state]);
|
||||||
|
// }),
|
||||||
|
|
||||||
|
// DatePicker::make('created_to')
|
||||||
|
// ->label('Created To')
|
||||||
|
// ->reactive()
|
||||||
|
// ->afterStateUpdated(function ($state,callable $set) {
|
||||||
|
// session(['to_date' => $state]);
|
||||||
|
// }),
|
||||||
|
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// public static function canAccess(): bool
|
|
||||||
|
public static function getNavigationLabel(): string
|
||||||
|
{
|
||||||
|
return 'Production Line Count';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeading(): string
|
||||||
|
{
|
||||||
|
return 'Production Line Count';
|
||||||
|
}
|
||||||
|
|
||||||
|
// public function getWidgets(): array
|
||||||
// {
|
// {
|
||||||
// return Auth::check() && Auth::user()->can('view welcome page');
|
// $widgets = [];
|
||||||
|
|
||||||
|
// if (CumulativeChart::canView()) {
|
||||||
|
// $widgets[] = CumulativeChart::class;
|
||||||
|
|
||||||
|
// }
|
||||||
|
// return $widgets;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
public static function canAccess(): bool
|
||||||
|
{
|
||||||
|
return Auth::check() && Auth::user()->can('view production line count dashboard');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace App\Filament\Resources;
|
namespace App\Filament\Resources;
|
||||||
|
|
||||||
|
use App\Filament\Exports\NotInStockExporter;
|
||||||
|
use App\Filament\Imports\NotInStockImporter;
|
||||||
use App\Filament\Resources\NotInStockResource\Pages;
|
use App\Filament\Resources\NotInStockResource\Pages;
|
||||||
use App\Models\NotInStock;
|
use App\Models\NotInStock;
|
||||||
use App\Models\StickerMaster;
|
use App\Models\StickerMaster;
|
||||||
@@ -13,6 +15,9 @@ use Filament\Tables;
|
|||||||
use Filament\Tables\Table;
|
use Filament\Tables\Table;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||||
|
use Filament\Tables\Actions\ExportAction;
|
||||||
|
use Filament\Tables\Actions\ImportAction;
|
||||||
|
|
||||||
|
|
||||||
class NotInStockResource extends Resource
|
class NotInStockResource extends Resource
|
||||||
{
|
{
|
||||||
@@ -232,6 +237,22 @@ class NotInStockResource extends Resource
|
|||||||
Tables\Actions\ForceDeleteBulkAction::make(),
|
Tables\Actions\ForceDeleteBulkAction::make(),
|
||||||
Tables\Actions\RestoreBulkAction::make(),
|
Tables\Actions\RestoreBulkAction::make(),
|
||||||
]),
|
]),
|
||||||
|
])
|
||||||
|
->headerActions([
|
||||||
|
ImportAction::make()
|
||||||
|
->label('Import Not In Stock')
|
||||||
|
->color('warning')
|
||||||
|
->importer(NotInStockImporter::class)
|
||||||
|
->visible(function () {
|
||||||
|
return Filament::auth()->user()->can('view import not in stock');
|
||||||
|
}),
|
||||||
|
ExportAction::make()
|
||||||
|
->label('Export Not In Stock')
|
||||||
|
->color('warning')
|
||||||
|
->exporter(NotInStockExporter::class)
|
||||||
|
->visible(function () {
|
||||||
|
return Filament::auth()->user()->can('view export not in stock');
|
||||||
|
}),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,6 +273,7 @@ class NotInStockResource extends Resource
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static function getEloquentQuery(): Builder
|
public static function getEloquentQuery(): Builder
|
||||||
{
|
{
|
||||||
return parent::getEloquentQuery()
|
return parent::getEloquentQuery()
|
||||||
|
|||||||
@@ -410,13 +410,13 @@ class ProcessOrderResource extends Resource
|
|||||||
$orderQty = (float) $get('order_quantity');
|
$orderQty = (float) $get('order_quantity');
|
||||||
$updatedQty = (float) $value;
|
$updatedQty = (float) $value;
|
||||||
|
|
||||||
$allowedVariance = $orderQty * 0.10;
|
$allowedVariance = $orderQty * 0.10;
|
||||||
|
|
||||||
$maxAllowed = $orderQty + $allowedVariance;
|
$maxAllowed = $orderQty + $allowedVariance;
|
||||||
$minAllowed = $orderQty - $allowedVariance;
|
$minAllowed = $orderQty - $allowedVariance;
|
||||||
|
|
||||||
if ($updatedQty > $maxAllowed || $updatedQty < $minAllowed) {
|
if ($updatedQty > $maxAllowed || $updatedQty < $minAllowed) {
|
||||||
$fail("Quantity can vary by ±10% of the order quantity.");
|
$fail('Quantity can vary by ±10% of the order quantity.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$otherReceivedQty = ProcessOrder::where('plant_id', $plantId)
|
$otherReceivedQty = ProcessOrder::where('plant_id', $plantId)
|
||||||
@@ -631,6 +631,7 @@ class ProcessOrderResource extends Resource
|
|||||||
Forms\Components\TextInput::make('machine_name')
|
Forms\Components\TextInput::make('machine_name')
|
||||||
->label('Machine Name')
|
->label('Machine Name')
|
||||||
->reactive()
|
->reactive()
|
||||||
|
->maxLength(18)
|
||||||
->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == ''))
|
->readOnly(fn ($get) => (trim($get('process_order')) == null || trim($get('process_order')) == ''))
|
||||||
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
|
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
|
||||||
$set('updated_by', Filament::auth()->user()?->name);
|
$set('updated_by', Filament::auth()->user()?->name);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
126
resources/views/filament/pages/dashboard.blade.php
Normal file
126
resources/views/filament/pages/dashboard.blade.php
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<x-filament-panels::page>
|
||||||
|
|
||||||
|
<!-- HEADER -->
|
||||||
|
<div class="mb-8">
|
||||||
|
<h1 class="text-4xl font-bold tracking-tight">
|
||||||
|
CRI Digital Manufacturing IIoT Platform
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg text-gray-600 mt-2">
|
||||||
|
Complete visibility, traceability, and control across your manufacturing operations.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- BANNER -->
|
||||||
|
{{-- <div class="w-full overflow-hidden rounded-2xl shadow mb-10"> --}}
|
||||||
|
<div class="w-full overflow-hidden rounded-xl shadow">
|
||||||
|
<img
|
||||||
|
src="{{ asset('images/iiot-banner.jpg') }}"
|
||||||
|
alt="CRI Digital Manufacturing IIoT"
|
||||||
|
class="w-full h-72 object-cover"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- INTRO -->
|
||||||
|
<div class="max-w-4xl mb-10">
|
||||||
|
<p class="text-lg text-gray-700 mb-4">
|
||||||
|
CRI Digital Manufacturing IIoT is built to deliver
|
||||||
|
<strong>end-to-end traceability, real-time insights, and operational transparency</strong>
|
||||||
|
across plants, lines, and production processes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="text-lg text-gray-700">
|
||||||
|
The platform ensures <strong>right quality and on-time delivery</strong> by enabling
|
||||||
|
complete tracking of materials, production orders, and finished goods—helping teams
|
||||||
|
make faster, data-driven decisions with confidence.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- KEY PILLARS -->
|
||||||
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-10">
|
||||||
|
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h3 class="text-lg font-semibold mb-2">🔍 Traceability</h3>
|
||||||
|
<p class="text-gray-600">
|
||||||
|
Track materials, batches, and serials from input to dispatch.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h3 class="text-lg font-semibold mb-2">✅ Quality Assurance</h3>
|
||||||
|
<p class="text-gray-600">
|
||||||
|
Validate process data and ensure first-time-right production.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h3 class="text-lg font-semibold mb-2">⏱ On-Time Delivery</h3>
|
||||||
|
<p class="text-gray-600">
|
||||||
|
Identify delays early and meet production commitments.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h3 class="text-lg font-semibold mb-2">📊 Real-Time Insights</h3>
|
||||||
|
<p class="text-gray-600">
|
||||||
|
Monitor performance and take quick corrective actions.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- SUPPORT -->
|
||||||
|
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h2 class="text-2xl font-semibold mb-3">24×7 Support</h2>
|
||||||
|
<p class="text-gray-700 mb-2">
|
||||||
|
Our dedicated IIoT support team is available round-the-clock to ensure
|
||||||
|
uninterrupted operations and quick issue resolution.
|
||||||
|
</p>
|
||||||
|
<p class="text-lg font-medium text-gray-900">
|
||||||
|
📞 Support Landline: <span class="font-semibold">0422 711 7179</span>
|
||||||
|
</p>
|
||||||
|
{{-- <p class="text-lg font-medium text-gray-900">
|
||||||
|
📞 Technical Support Contact: <span class="font-semibold">9952468104 / 9100832269</span>
|
||||||
|
</p> --}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h2 class="text-2xl font-semibold mb-4">24×7 Support</h2>
|
||||||
|
|
||||||
|
<p class="text-lg text-gray-700 mb-4">
|
||||||
|
Our support structure is designed to ensure quick resolution based on the type
|
||||||
|
of issue — whether it is on-site, application-related, or infrastructure-related.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="space-y-3">
|
||||||
|
|
||||||
|
<p class="text-lg font-medium text-gray-900">
|
||||||
|
🏭 <strong>Plant & On-Site Support</strong> <br>
|
||||||
|
<span class="text-gray-700">
|
||||||
|
For plant visits, industry-level issues, and on-ground validation
|
||||||
|
</span><br>
|
||||||
|
📞 <span class="font-semibold">8925899458 / 8925899459</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="text-lg font-medium text-gray-900">
|
||||||
|
💻 <strong>Application & Logic Support</strong> <br>
|
||||||
|
<span class="text-gray-700">
|
||||||
|
For website errors, logic issues, and application-level problems
|
||||||
|
</span><br>
|
||||||
|
📞 <span class="font-semibold">9952468104 / 9100832269</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
|
||||||
|
<!-- TEAM -->
|
||||||
|
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
|
||||||
|
<h2 class="text-2xl font-semibold mb-4">IIOT Team Members</h2>
|
||||||
|
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 text-gray-700">
|
||||||
|
<div class="flex items-center gap-2">👤 Jothikumar</div>
|
||||||
|
<div class="flex items-center gap-2">👤 Jeithef Shibu</div>
|
||||||
|
<div class="flex items-center gap-2">👤 Dhanabalan</div>
|
||||||
|
<div class="flex items-center gap-2">👤 Ranjith</div>
|
||||||
|
<div class="flex items-center gap-2">👤 Srimathy</div>
|
||||||
|
<div class="flex items-center gap-2">👤 Gokul</div>
|
||||||
|
</div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
</x-filament-panels::page>
|
||||||
@@ -1,126 +1,13 @@
|
|||||||
<x-filament-panels::page>
|
<x-filament-panels::page>
|
||||||
|
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 sm:gap-4 md:gap-4 p-2 md:p-4 items-start">
|
||||||
<!-- HEADER -->
|
{{-- Filters form --}}
|
||||||
<div class="mb-8">
|
<div class="space-y-4 w-full max-w-full col-span-1">
|
||||||
<h1 class="text-4xl font-bold tracking-tight">
|
{{ $this->filtersForm($this->form) }}
|
||||||
CRI Digital Manufacturing IIoT Platform
|
|
||||||
</h1>
|
|
||||||
<p class="text-lg text-gray-600 mt-2">
|
|
||||||
Complete visibility, traceability, and control across your manufacturing operations.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- BANNER -->
|
|
||||||
{{-- <div class="w-full overflow-hidden rounded-2xl shadow mb-10"> --}}
|
|
||||||
<div class="w-full overflow-hidden rounded-xl shadow">
|
|
||||||
<img
|
|
||||||
src="{{ asset('images/iiot-banner.jpg') }}"
|
|
||||||
alt="CRI Digital Manufacturing IIoT"
|
|
||||||
class="w-full h-72 object-cover"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- INTRO -->
|
|
||||||
<div class="max-w-4xl mb-10">
|
|
||||||
<p class="text-lg text-gray-700 mb-4">
|
|
||||||
CRI Digital Manufacturing IIoT is built to deliver
|
|
||||||
<strong>end-to-end traceability, real-time insights, and operational transparency</strong>
|
|
||||||
across plants, lines, and production processes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="text-lg text-gray-700">
|
|
||||||
The platform ensures <strong>right quality and on-time delivery</strong> by enabling
|
|
||||||
complete tracking of materials, production orders, and finished goods—helping teams
|
|
||||||
make faster, data-driven decisions with confidence.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- KEY PILLARS -->
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-10">
|
|
||||||
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h3 class="text-lg font-semibold mb-2">🔍 Traceability</h3>
|
|
||||||
<p class="text-gray-600">
|
|
||||||
Track materials, batches, and serials from input to dispatch.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
{{-- Stat widget --}}
|
||||||
<h3 class="text-lg font-semibold mb-2">✅ Quality Assurance</h3>
|
<div class="w-full max-w-full col-span-1 sm:col-span-1 lg:col-span-2">
|
||||||
<p class="text-gray-600">
|
@livewire(\App\Filament\Widgets\CumulativeChart::class)
|
||||||
Validate process data and ensure first-time-right production.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h3 class="text-lg font-semibold mb-2">⏱ On-Time Delivery</h3>
|
|
||||||
<p class="text-gray-600">
|
|
||||||
Identify delays early and meet production commitments.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h3 class="text-lg font-semibold mb-2">📊 Real-Time Insights</h3>
|
|
||||||
<p class="text-gray-600">
|
|
||||||
Monitor performance and take quick corrective actions.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- SUPPORT -->
|
|
||||||
<div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h2 class="text-2xl font-semibold mb-3">24×7 Support</h2>
|
|
||||||
<p class="text-gray-700 mb-2">
|
|
||||||
Our dedicated IIoT support team is available round-the-clock to ensure
|
|
||||||
uninterrupted operations and quick issue resolution.
|
|
||||||
</p>
|
|
||||||
<p class="text-lg font-medium text-gray-900">
|
|
||||||
📞 Support Landline: <span class="font-semibold">0422 711 7179</span>
|
|
||||||
</p>
|
|
||||||
{{-- <p class="text-lg font-medium text-gray-900">
|
|
||||||
📞 Technical Support Contact: <span class="font-semibold">9952468104 / 9100832269</span>
|
|
||||||
</p> --}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4">24×7 Support</h2>
|
|
||||||
|
|
||||||
<p class="text-lg text-gray-700 mb-4">
|
|
||||||
Our support structure is designed to ensure quick resolution based on the type
|
|
||||||
of issue — whether it is on-site, application-related, or infrastructure-related.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="space-y-3">
|
|
||||||
|
|
||||||
<p class="text-lg font-medium text-gray-900">
|
|
||||||
🏭 <strong>Plant & On-Site Support</strong> <br>
|
|
||||||
<span class="text-gray-700">
|
|
||||||
For plant visits, industry-level issues, and on-ground validation
|
|
||||||
</span><br>
|
|
||||||
📞 <span class="font-semibold">8925899458 / 8925899459</span>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="text-lg font-medium text-gray-900">
|
|
||||||
💻 <strong>Application & Logic Support</strong> <br>
|
|
||||||
<span class="text-gray-700">
|
|
||||||
For website errors, logic issues, and application-level problems
|
|
||||||
</span><br>
|
|
||||||
📞 <span class="font-semibold">9952468104 / 9100832269</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div> --}}
|
|
||||||
|
|
||||||
|
|
||||||
<!-- TEAM -->
|
|
||||||
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
|
|
||||||
<h2 class="text-2xl font-semibold mb-4">IIOT Team Members</h2>
|
|
||||||
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 text-gray-700">
|
|
||||||
<div class="flex items-center gap-2">👤 Jothikumar</div>
|
|
||||||
<div class="flex items-center gap-2">👤 Jeithef Shibu</div>
|
|
||||||
<div class="flex items-center gap-2">👤 Dhanabalan</div>
|
|
||||||
<div class="flex items-center gap-2">👤 Ranjith</div>
|
|
||||||
<div class="flex items-center gap-2">👤 Srimathy</div>
|
|
||||||
<div class="flex items-center gap-2">👤 Gokul</div>
|
|
||||||
</div>
|
|
||||||
</div> --}}
|
|
||||||
|
|
||||||
</x-filament-panels::page>
|
</x-filament-panels::page>
|
||||||
|
|||||||
Reference in New Issue
Block a user