Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
Laravel Pint / pint (pull_request) Has been cancelled
237 lines
7.7 KiB
PHP
237 lines
7.7 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Exports\ProductionPlanExport;
|
|
use App\Models\ProductionPlan;
|
|
use App\Models\ProductionQuantity;
|
|
use Livewire\Component;
|
|
use Carbon\Carbon;
|
|
use DB;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
|
class ProductionTargetPlan extends Component
|
|
{
|
|
|
|
public $plantId, $lineId, $month, $year;
|
|
|
|
public $records = [];
|
|
|
|
public $dates = [];
|
|
|
|
public $leaveDates = [];
|
|
|
|
public $productionPlanDates = '';
|
|
|
|
|
|
protected $listeners = [
|
|
'loadData' => 'loadProductionData',
|
|
'loadData1' => 'exportProductionData',
|
|
];
|
|
|
|
public function getMonthDates($month, $year)
|
|
{
|
|
$start = Carbon::createFromDate($year, $month, 1);
|
|
$days = $start->daysInMonth;
|
|
|
|
$dates = [];
|
|
|
|
for ($i = 1; $i <= $days; $i++) {
|
|
$dates[] = Carbon::createFromDate($year, $month, $i)
|
|
->format('Y-m-d');
|
|
}
|
|
|
|
return $dates;
|
|
}
|
|
|
|
public function loadProductionData($plantId, $lineId, $month, $year){
|
|
|
|
if (!$plantId || !$lineId || !$month || !$year) {
|
|
$this->records = [];
|
|
$this->dates = [];
|
|
$this->leaveDates = [];
|
|
return;
|
|
}
|
|
|
|
$this->dates = $this->getMonthDates($month, $year);
|
|
|
|
$data = 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.created_at',
|
|
'production_plans.operator_id',
|
|
'plants.name as plant',
|
|
'items.code as item_code',
|
|
'items.description as item_description',
|
|
'lines.name as line_name',
|
|
'production_plans.leave_dates'
|
|
)
|
|
->first();
|
|
|
|
if ($data && $data->leave_dates) {
|
|
$this->leaveDates = array_map('trim', explode(',', $data->leave_dates));
|
|
}
|
|
|
|
$producedData = ProductionQuantity::selectRaw("
|
|
plant_id,
|
|
line_id,
|
|
item_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)
|
|
->groupBy('plant_id', 'line_id', 'item_id', DB::raw('DATE(created_at)'))
|
|
->get()
|
|
->groupBy(function ($row) {
|
|
return $row->plant_id . '_' . $row->line_id . '_' . $row->item_id;
|
|
})
|
|
->map(function ($group) {
|
|
return $group->keyBy('prod_date');
|
|
});
|
|
|
|
$this->records = 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',
|
|
'items.code as item_code',
|
|
'items.description as item_description',
|
|
'lines.name as line_name',
|
|
'plants.name as plant_name'
|
|
)
|
|
->get()
|
|
// ->map(function ($row) use ($producedData) {
|
|
// $row = $row->toArray();
|
|
|
|
// $row['daily_target'] = ($row['working_days'] > 0)
|
|
// ? round($row['plan_quantity'] / $row['working_days'], 2)
|
|
// : 0;
|
|
|
|
// // $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];
|
|
|
|
// // foreach ($this->dates as $date) {
|
|
// // $found = $producedData[$key][$date] ?? null;
|
|
// // $row['produced_quantity'][$date] = $found->total_qty ?? 0;
|
|
// // }
|
|
|
|
// $remainingDays = $row['working_days'];
|
|
// $pendingQty = 0;
|
|
|
|
// $row['daily_target_dynamic'] = [];
|
|
// $row['produced_quantity'] = [];
|
|
|
|
// $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];
|
|
|
|
// foreach ($this->dates as $date) {
|
|
|
|
// $found = $producedData[$key][$date] ?? null;
|
|
// $producedQty = $found->total_qty ?? 0;
|
|
|
|
// // today's adjusted target
|
|
// $todayTarget = $baseDailyTarget;
|
|
|
|
// if ($remainingDays > 1 && $pendingQty > 0) {
|
|
// $todayTarget += $pendingQty / $remainingDays;
|
|
// }
|
|
|
|
// $row['daily_target_dynamic'][$date] = round($todayTarget, 2);
|
|
// $row['produced_quantity'][$date] = $producedQty;
|
|
|
|
// // calculate today's shortfall
|
|
// $pendingQty += ($todayTarget - $producedQty);
|
|
|
|
// if ($pendingQty < 0) {
|
|
// $pendingQty = 0;
|
|
// }
|
|
|
|
// $remainingDays--;
|
|
// }
|
|
|
|
// return $row;
|
|
// })
|
|
->map(function ($row) use ($producedData) {
|
|
|
|
$row = $row->toArray();
|
|
|
|
$remainingQty = $row['plan_quantity'];
|
|
$remainingDays = $row['working_days'];
|
|
|
|
$row['daily_target_dynamic'] = [];
|
|
$row['produced_quantity'] = [];
|
|
|
|
$key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];
|
|
|
|
foreach ($this->dates as $date) {
|
|
|
|
// Skip leave dates
|
|
if (in_array($date, $this->leaveDates)) {
|
|
$row['daily_target_dynamic'][$date] = '-';
|
|
$row['produced_quantity'][$date] = '-';
|
|
continue;
|
|
}
|
|
|
|
$todayTarget = $remainingDays > 0
|
|
? round($remainingQty / $remainingDays, 2)
|
|
: 0;
|
|
|
|
//$todayTarget = $remainingDays > 0
|
|
// ? $remainingQty / $remainingDays
|
|
// : 0;
|
|
|
|
$producedQty = isset($producedData[$key][$date])
|
|
? $producedData[$key][$date]->total_qty
|
|
: 0;
|
|
|
|
$row['daily_target_dynamic'][$date] = $todayTarget;
|
|
$row['produced_quantity'][$date] = $producedQty;
|
|
|
|
// Carry forward pending
|
|
$remainingQty -= $producedQty;
|
|
if ($remainingQty < 0) {
|
|
$remainingQty = 0;
|
|
}
|
|
|
|
$remainingDays--;
|
|
}
|
|
|
|
return $row;
|
|
})
|
|
->toArray();
|
|
}
|
|
|
|
public function exportProductionData()
|
|
{
|
|
return Excel::download(
|
|
new ProductionPlanExport($this->records, $this->dates),
|
|
'production_plan_data.xlsx'
|
|
);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
// return view('livewire.production-target-plan');
|
|
return view('livewire.production-target-plan', [
|
|
'records' => $this->records,
|
|
'dates' => $this->dates,
|
|
]);
|
|
}
|
|
}
|