Merge pull request 'ranjith-dev' (#1106) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s

Reviewed-on: #1106
This commit was merged in pull request #1106.
This commit is contained in:
2026-09-28 06:00:59 +00:00
2 changed files with 319 additions and 139 deletions

View File

@@ -2992,6 +2992,13 @@ class ClassCharacteristicResource extends Resource
} }
} }
if ($record) {
Notification::make()
->title('Import Successful')
->body("{$insertedCount} records inserted successfully.")
->success();
}
$itemCharacteristic = ItemCharacteristic::where('plant_id', $plantId)->where('item_id', $item->id)->first(); $itemCharacteristic = ItemCharacteristic::where('plant_id', $plantId)->where('item_id', $item->id)->first();
if ($itemCharacteristic) { if ($itemCharacteristic) {
@@ -3137,18 +3144,11 @@ class ClassCharacteristicResource extends Resource
'zmm_operating_temperature' => $itemCharacteristic->zmm_operating_temperature, 'zmm_operating_temperature' => $itemCharacteristic->zmm_operating_temperature,
'zmm_axial_force' => $itemCharacteristic->zmm_axial_force, 'zmm_axial_force' => $itemCharacteristic->zmm_axial_force,
]); ]);
}
$updatedCount++; $updatedCount++;
} }
} }
if ($record) {
Notification::make()
->title('Import Successful')
->body("{$insertedCount} records inserted successfully and updated zmm values success for '{$updatedCount}' records.")
->success();
}
}
}) })
->visible(function () { ->visible(function () {
return Filament::auth()->user()->can('view import class characteristic serial'); return Filament::auth()->user()->can('view import class characteristic serial');

View File

@@ -174,161 +174,161 @@ class ProductionTargetPlan extends Component
// } // }
public function loadProductionData($year, $month, $plantId, $lineId, $category) // public function loadProductionData($year, $month, $plantId, $lineId, $category)
{ // {
if (!$plantId || !$lineId || !$month || !$year) { // if (!$plantId || !$lineId || !$month || !$year) {
$this->records = []; // $this->records = [];
$this->dates = []; // $this->dates = [];
$this->leaveDates = []; // $this->leaveDates = [];
return; // return;
} // }
$dates = $this->getMonthDates($month, $year); // $dates = $this->getMonthDates($month, $year);
$this->dates = $dates; // $this->dates = $dates;
$plans = ProductionPlan::query() // $plans = ProductionPlan::query()
->join('items', 'items.id', '=', 'production_plans.item_id') // ->join('items', 'items.id', '=', 'production_plans.item_id')
->join('lines', 'lines.id', '=', 'production_plans.line_id') // ->join('lines', 'lines.id', '=', 'production_plans.line_id')
->join('plants', 'plants.id', '=', 'production_plans.plant_id') // ->join('plants', 'plants.id', '=', 'production_plans.plant_id')
->where('production_plans.plant_id', $plantId) // ->where('production_plans.plant_id', $plantId)
->where('production_plans.line_id', $lineId) // ->where('production_plans.line_id', $lineId)
->whereMonth('production_plans.created_at', $month) // ->whereMonth('production_plans.created_at', $month)
->whereYear('production_plans.created_at', $year) // ->whereYear('production_plans.created_at', $year)
->when($category, function ($query) use ($category) { // ->when($category, function ($query) use ($category) {
$query->where('items.category', $category); // $query->where('items.category', $category);
}) // })
->select( // ->select(
'production_plans.item_id', // 'production_plans.item_id',
'production_plans.plant_id', // 'production_plans.plant_id',
'production_plans.line_id', // 'production_plans.line_id',
'production_plans.plan_quantity', // 'production_plans.plan_quantity',
'production_plans.working_days', // 'production_plans.working_days',
'production_plans.leave_dates', // 'production_plans.leave_dates',
'items.code as item_code', // 'items.code as item_code',
'items.category as category', // 'items.category as category',
'items.description as item_description', // 'items.description as item_description',
'items.hourly_quantity as hourly_quantity', // 'items.hourly_quantity as hourly_quantity',
'lines.name as line_name', // 'lines.name as line_name',
// 'lines.line_capacity as line_capacity', // // 'lines.line_capacity as line_capacity',
'plants.name as plant_name' // 'plants.name as plant_name'
) // )
->get(); // ->get();
$leaveDates = []; // $leaveDates = [];
if ($plans->isNotEmpty() && $plans[0]->leave_dates) { // if ($plans->isNotEmpty() && $plans[0]->leave_dates) {
$leaveDates = array_map('trim', explode(',', $plans[0]->leave_dates)); // $leaveDates = array_map('trim', explode(',', $plans[0]->leave_dates));
} // }
$this->leaveDates = $leaveDates; // $this->leaveDates = $leaveDates;
// // $producedData = QualityValidation::selectRaw("
// // plant_id,
// // line_id,
// // sticker_master_id,
// // DATE(created_at) as prod_date,
// // COUNT(*) as total_qty
// // ")
// // ->where('plant_id', $plantId)
// // ->where('line_id', $lineId)
// // ->whereMonth('created_at', $month)
// // ->whereYear('created_at', $year)
// // ->when($category, function ($query) use ($category) {
// // $query->whereHas('item', function ($q) use ($category) {
// // $q->where('category', $category);
// // });
// // })
// // ->groupBy('plant_id', 'line_id', 'sticker_master_id', DB::raw('DATE(created_at)'))
// // ->get()
// // ->groupBy(fn($row) =>
// // $row->plant_id . '_' . $row->line_id . '_' . $row->item_id
// // )
// // ->map(fn($group) => $group->keyBy('prod_date'));
// $producedData = QualityValidation::selectRaw(" // $producedData = QualityValidation::selectRaw("
// plant_id, // quality_validations.plant_id,
// line_id, // quality_validations.line_id,
// sticker_master_id, // quality_validations.sticker_master_id,
// DATE(created_at) as prod_date, // sticker_masters.item_id,
// DATE(quality_validations.created_at) as prod_date,
// COUNT(*) as total_qty // COUNT(*) as total_qty
// ") // ")
// ->where('plant_id', $plantId) // ->join('sticker_masters', 'sticker_masters.id', '=', 'quality_validations.sticker_master_id')
// ->where('line_id', $lineId) // ->where('quality_validations.plant_id', $plantId)
// ->whereMonth('created_at', $month) // ->where('quality_validations.line_id', $lineId)
// ->whereYear('created_at', $year) // ->whereMonth('quality_validations.created_at', $month)
// ->whereYear('quality_validations.created_at', $year)
// ->when($category, function ($query) use ($category) { // ->when($category, function ($query) use ($category) {
// $query->whereHas('item', function ($q) use ($category) { // $query->whereHas('item', function ($q) use ($category) {
// $q->where('category', $category); // $q->where('category', $category);
// }); // });
// }) // })
// ->groupBy('plant_id', 'line_id', 'sticker_master_id', DB::raw('DATE(created_at)')) // ->groupBy(
// 'quality_validations.plant_id',
// 'quality_validations.line_id',
// 'quality_validations.sticker_master_id',
// 'sticker_masters.item_id',
// DB::raw('DATE(quality_validations.created_at)')
// )
// ->get() // ->get()
// ->groupBy(fn($row) => // ->groupBy(fn($row) =>
// $row->plant_id . '_' . $row->line_id . '_' . $row->item_id // $row->plant_id . '_' . $row->line_id . '_' . $row->item_id
// ) // )
// ->map(fn($group) => $group->keyBy('prod_date')); // ->map(fn($group) => $group->keyBy('prod_date'));
$producedData = QualityValidation::selectRaw("
quality_validations.plant_id,
quality_validations.line_id,
quality_validations.sticker_master_id,
sticker_masters.item_id,
DATE(quality_validations.created_at) as prod_date,
COUNT(*) as total_qty
")
->join('sticker_masters', 'sticker_masters.id', '=', 'quality_validations.sticker_master_id')
->where('quality_validations.plant_id', $plantId)
->where('quality_validations.line_id', $lineId)
->whereMonth('quality_validations.created_at', $month)
->whereYear('quality_validations.created_at', $year)
->when($category, function ($query) use ($category) {
$query->whereHas('item', function ($q) use ($category) {
$q->where('category', $category);
});
})
->groupBy(
'quality_validations.plant_id',
'quality_validations.line_id',
'quality_validations.sticker_master_id',
'sticker_masters.item_id',
DB::raw('DATE(quality_validations.created_at)')
)
->get()
->groupBy(fn($row) =>
$row->plant_id . '_' . $row->line_id . '_' . $row->item_id
)
->map(fn($group) => $group->keyBy('prod_date'));
// $records = [];
$records = []; // foreach ($plans as $plan) {
foreach ($plans as $plan) { // $row = $plan->toArray();
$row = $plan->toArray(); // $remainingQty = (float) $row['plan_quantity'];
// $remainingDays = (int) ($row['working_days'] ?? 0);
$remainingQty = (float) $row['plan_quantity']; // $lineCapacity = (float) ($row['line_capacity'] ?? 0);
$remainingDays = (int) ($row['working_days'] ?? 0); // $dailyHourlyQuantity = (float) ($row['hourly_quantity'] ?? 0);
$lineCapacity = (float) ($row['line_capacity'] ?? 0); // $row['category'] = $row['category'] ?? '-';
$dailyHourlyQuantity = (float) ($row['hourly_quantity'] ?? 0); // $row['daily_hourly_quantity'] = [];
// $row['daily_target_dynamic'] = [];
// $row['produced_quantity'] = [];
$row['category'] = $row['category'] ?? '-'; // $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];
$row['daily_hourly_quantity'] = [];
$row['daily_target_dynamic'] = [];
$row['produced_quantity'] = [];
$key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id']; // foreach ($dates as $date) {
foreach ($dates as $date) { // // Skip leave dates fast
// if (isset($leaveDates) && in_array($date, $leaveDates)) {
// $row['daily_hourly_quantity'][$date] = '-';
// $row['daily_target_dynamic'][$date] = '-';
// $row['produced_quantity'][$date] = '-';
// continue;
// }
// Skip leave dates fast // $todayTarget = $remainingDays > 0
if (isset($leaveDates) && in_array($date, $leaveDates)) { // ? round($remainingQty / $remainingDays, 2)
$row['daily_hourly_quantity'][$date] = '-'; // : 0;
$row['daily_target_dynamic'][$date] = '-';
$row['produced_quantity'][$date] = '-';
continue;
}
$todayTarget = $remainingDays > 0 // $producedQty = $producedData[$key][$date]->total_qty ?? 0;
? round($remainingQty / $remainingDays, 2)
: 0;
$producedQty = $producedData[$key][$date]->total_qty ?? 0; // $row['daily_target_dynamic'][$date] = $todayTarget;
// $row['produced_quantity'][$date] = $producedQty;
// $row['daily_hourly_quantity'][$date] = $dailyHourlyQuantity * 22.5;
$row['daily_target_dynamic'][$date] = $todayTarget; // // Carry forward remaining qty
$row['produced_quantity'][$date] = $producedQty; // $remainingQty = max(0, $remainingQty - $producedQty);
$row['daily_hourly_quantity'][$date] = $dailyHourlyQuantity * 22.5;
// Carry forward remaining qty // if ($remainingDays > 0) {
$remainingQty = max(0, $remainingQty - $producedQty); // $remainingDays--;
// }
// }
if ($remainingDays > 0) { // $records[] = $row;
$remainingDays--; // }
}
}
$records[] = $row; // $this->records = $records;
} // }
$this->records = $records;
}
// public function loadProductionDataCategory($year, $month, $plantId, $lineId, $category) // public function loadProductionDataCategory($year, $month, $plantId, $lineId, $category)
// { // {
@@ -446,6 +446,186 @@ class ProductionTargetPlan extends Component
// } // }
public function loadProductionData($year, $month, $plantId, $lineId)
{
if (!$plantId || !$lineId || !$month || !$year) {
$this->records = [];
$this->dates = [];
$this->leaveDates = [];
return;
}
$dates = $this->getMonthDates($month, $year);
$this->dates = $dates;
$plans = ProductionPlan::query()
->join('items', 'items.id', '=', 'production_plans.item_id')
->join('lines', 'lines.id', '=', 'production_plans.line_id')
->join('plants', 'plants.id', '=', 'production_plans.plant_id')
->where('production_plans.plant_id', $plantId)
->where('production_plans.line_id', $lineId)
->whereMonth('production_plans.created_at', $month)
->whereYear('production_plans.created_at', $year)
->select(
'production_plans.item_id',
'production_plans.plant_id',
'production_plans.line_id',
'production_plans.plan_quantity',
'production_plans.working_days',
'production_plans.leave_dates',
'items.code as item_code',
'items.category as category',
'items.description as item_description',
'items.hourly_quantity as hourly_quantity',
'lines.name as line_name',
// 'lines.line_capacity as line_capacity',
'plants.name as plant_name'
)
->get();
$leaveDates = [];
if ($plans->isNotEmpty() && $plans[0]->leave_dates) {
$leaveDates = array_map('trim', explode(',', $plans[0]->leave_dates));
}
$this->leaveDates = $leaveDates;
$producedData = QualityValidation::selectRaw("
quality_validations.plant_id,
quality_validations.line_id,
quality_validations.sticker_master_id,
sticker_masters.item_id,
DATE(quality_validations.created_at) as prod_date,
COUNT(*) as total_qty
")
->join(
'sticker_masters',
'sticker_masters.id',
'=',
'quality_validations.sticker_master_id'
)
->where('quality_validations.plant_id', $plantId)
->where('quality_validations.line_id', $lineId)
->whereMonth('quality_validations.created_at', $month)
->whereYear('quality_validations.created_at', $year)
->groupBy(
'quality_validations.plant_id',
'quality_validations.line_id',
'quality_validations.sticker_master_id',
'sticker_masters.item_id',
DB::raw('DATE(quality_validations.created_at)')
)
->get()
->groupBy(fn($row) =>
$row->plant_id . '_' . $row->line_id . '_' . $row->item_id
)
->map(fn($group) => $group->keyBy('prod_date'));
$records = [];
foreach ($plans as $plan) {
$row = $plan->toArray();
/*
* Calculate the normal daily target.
*
* Example:
* Plan quantity = 60
* Working days = 3
*
* Normal daily target = 60 / 3 = 20
*/
$workingDays = (int) ($row['working_days'] ?? 0);
$normalDailyTarget = $workingDays > 0
? round((float) $row['plan_quantity'] / $workingDays, 2)
: 0;
/*
* This stores the uncompleted quantity from the previous
* working day and carries it to the next working day.
*/
$pendingQty = 0;
$lineCapacity = (float) ($row['line_capacity'] ?? 0);
$dailyHourlyQuantity = (float) ($row['hourly_quantity'] ?? 0);
$row['category'] = $row['category'] ?? '-';
$row['daily_hourly_quantity'] = [];
$row['daily_target_dynamic'] = [];
$row['produced_quantity'] = [];
$key = $row['plant_id'] . '_' . $row['line_id'] . '_' . $row['item_id'];
foreach ($dates as $date) {
/*
* Skip leave dates.
*
* Pending quantity is NOT changed here.
* Therefore it will carry forward to the next working day.
*/
if (in_array($date, $leaveDates)) {
$row['daily_hourly_quantity'][$date] = '-';
$row['daily_target_dynamic'][$date] = '-';
$row['produced_quantity'][$date] = '-';
continue;
}
/*
* Today's target:
*
* Normal daily target
* +
* Previous day's pending quantity
*/
$todayTarget = round(
$normalDailyTarget + $pendingQty,
2
);
/*
* Get actual produced quantity for this item/date.
*/
$producedQty = $producedData[$key][$date]->total_qty ?? 0;
/*
* Store today's values.
*/
$row['daily_target_dynamic'][$date] = $todayTarget;
$row['produced_quantity'][$date] = $producedQty;
$row['daily_hourly_quantity'][$date] = $dailyHourlyQuantity * 22.5;
/*
* Calculate today's pending quantity.
*
* Example:
*
* Target = 40
* Produced = 30
*
* Pending = 10
*
* This 10 will be added to tomorrow's target.
*/
$pendingQty = max(
0,
$todayTarget - $producedQty
);
}
$records[] = $row;
}
$this->records = $records;
}
public function exportProductionData() public function exportProductionData()
{ {
return Excel::download( return Excel::download(