201 lines
11 KiB
PHP
201 lines
11 KiB
PHP
@extends('layouts.app')
|
|
@section('title', __('advancedplanning::lang.sop_cycles').' — '.$cycle->cycle_month?->format('Y-m'))
|
|
@section('content')
|
|
@include('advancedplanning::layouts.nav')
|
|
@php
|
|
$util = app(\Modules\AdvancedPlanning\Utils\AdvancedPlanningUtil::class);
|
|
$demand = $cycle->demand_plan ?? [];
|
|
$supply = $cycle->supply_plan ?? [];
|
|
$financial = $cycle->financial_plan ?? [];
|
|
$gaps = $cycle->gaps ?? [];
|
|
@endphp
|
|
<section class="content-header">
|
|
<h1>@lang('advancedplanning::lang.sop_cycles'): @format_date($cycle->cycle_month)
|
|
<small>{{ $util->statusLabel($cycle->status) }}</small>
|
|
</h1>
|
|
</section>
|
|
<section class="content">
|
|
@if(session('status'))
|
|
<div class="alert alert-{{ session('status.success') ? 'success' : 'warning' }} alert-dismissible">
|
|
<button type="button" class="close" data-dismiss="alert">×</button>
|
|
{{ session('status.msg') }}
|
|
</div>
|
|
@endif
|
|
|
|
@can('ap.sop.manage')
|
|
<div class="box box-solid">
|
|
<div class="box-body">
|
|
<form action="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'refresh'], $cycle->id) }}" method="POST" style="display:inline;">
|
|
@csrf
|
|
<button type="submit" class="btn btn-info btn-sm"><i class="fa fa-refresh"></i> @lang('advancedplanning::lang.refresh_plans')</button>
|
|
</form>
|
|
@if($cycle->status === 'draft')
|
|
<form action="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'advanceStatus'], $cycle->id) }}" method="POST" style="display:inline;">
|
|
@csrf
|
|
<input type="hidden" name="status" value="consensus">
|
|
<button type="submit" class="btn btn-warning btn-sm">@lang('advancedplanning::lang.advance_to_consensus')</button>
|
|
</form>
|
|
@endif
|
|
@if($cycle->status === 'consensus')
|
|
<form action="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'advanceStatus'], $cycle->id) }}" method="POST" style="display:inline;">
|
|
@csrf
|
|
<input type="hidden" name="status" value="approved">
|
|
<button type="submit" class="btn btn-success btn-sm">@lang('advancedplanning::lang.advance_to_approved')</button>
|
|
</form>
|
|
<form action="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'advanceStatus'], $cycle->id) }}" method="POST" style="display:inline;">
|
|
@csrf
|
|
<input type="hidden" name="status" value="draft">
|
|
<button type="submit" class="btn btn-default btn-sm">@lang('advancedplanning::lang.revert_to_draft')</button>
|
|
</form>
|
|
@endif
|
|
@if($cycle->status === 'approved')
|
|
<form action="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'advanceStatus'], $cycle->id) }}" method="POST" style="display:inline;">
|
|
@csrf
|
|
<input type="hidden" name="status" value="draft">
|
|
<button type="submit" class="btn btn-default btn-sm">@lang('advancedplanning::lang.revert_to_draft')</button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endcan
|
|
|
|
<div class="row">
|
|
<div class="col-md-3 col-sm-6">
|
|
<div class="info-box bg-aqua">
|
|
<span class="info-box-icon"><i class="fa fa-shopping-cart"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">@lang('advancedplanning::lang.total_demand')</span>
|
|
<span class="info-box-number">{{ $demand['total_demand_units'] ?? 0 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6">
|
|
<div class="info-box bg-green">
|
|
<span class="info-box-icon"><i class="fa fa-clock-o"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">@lang('advancedplanning::lang.total_capacity')</span>
|
|
<span class="info-box-number">{{ $supply['total_available_hours'] ?? 0 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6">
|
|
<div class="info-box bg-yellow">
|
|
<span class="info-box-icon"><i class="fa fa-wrench"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">@lang('advancedplanning::lang.open_work_orders')</span>
|
|
<span class="info-box-number">{{ $supply['open_work_orders'] ?? 0 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6">
|
|
<div class="info-box bg-purple">
|
|
<span class="info-box-icon"><i class="fa fa-money"></i></span>
|
|
<div class="info-box-content">
|
|
<span class="info-box-text">@lang('advancedplanning::lang.margin_estimate')</span>
|
|
<span class="info-box-number">{{ $financial['margin_estimate'] ?? 0 }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="box box-primary">
|
|
<div class="box-header"><h3 class="box-title">@lang('advancedplanning::lang.demand_plan')</h3></div>
|
|
<div class="box-body">
|
|
<p><strong>@lang('advancedplanning::lang.period'):</strong>
|
|
{{ $demand['period']['start'] ?? '—' }} — {{ $demand['period']['end'] ?? '—' }}
|
|
</p>
|
|
@if(!empty($demand['sales_history']))
|
|
<h5>@lang('advancedplanning::lang.sales_history')</h5>
|
|
<table class="table table-condensed table-bordered">
|
|
<thead><tr><th>@lang('advancedplanning::lang.product')</th><th>@lang('advancedplanning::lang.quantity')</th></tr></thead>
|
|
<tbody>
|
|
@foreach(array_slice($demand['sales_history'], 0, 10) as $row)
|
|
<tr>
|
|
<td>{{ $row['product_id'] }} / {{ $row['variation_id'] ?? '—' }}</td>
|
|
<td>{{ $row['quantity'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
@endif
|
|
@if(!empty($demand['mrp_demand']))
|
|
<h5>@lang('advancedplanning::lang.mrp_demand')</h5>
|
|
<table class="table table-condensed table-bordered">
|
|
<thead><tr><th>@lang('advancedplanning::lang.ref_no')</th><th>@lang('advancedplanning::lang.work_order')</th><th>@lang('advancedplanning::lang.quantity')</th></tr></thead>
|
|
<tbody>
|
|
@foreach($demand['mrp_demand'] as $row)
|
|
<tr>
|
|
<td>{{ $row['run_code'] }}</td>
|
|
<td>{{ $row['work_order_number'] ?? '—' }}</td>
|
|
<td>{{ $row['planned_quantity'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="box box-primary">
|
|
<div class="box-header"><h3 class="box-title">@lang('advancedplanning::lang.supply_plan')</h3></div>
|
|
<div class="box-body">
|
|
<p><strong>@lang('advancedplanning::lang.scheduled_hours'):</strong> {{ $supply['scheduled_hours'] ?? 0 }}</p>
|
|
<p><strong>@lang('advancedplanning::lang.open_work_order_qty'):</strong> {{ $supply['open_work_order_qty'] ?? 0 }}</p>
|
|
@if(!empty($supply['capacity_resources']))
|
|
<table class="table table-condensed table-bordered">
|
|
<thead><tr><th>@lang('advancedplanning::lang.resource')</th><th>@lang('advancedplanning::lang.type')</th><th>@lang('advancedplanning::lang.available_hours')</th></tr></thead>
|
|
<tbody>
|
|
@foreach($supply['capacity_resources'] as $row)
|
|
<tr>
|
|
<td>{{ $row['name'] }}</td>
|
|
<td>{{ $util->resourceTypeLabel($row['type']) }}</td>
|
|
<td>{{ $row['available_hours'] }}</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="box box-solid">
|
|
<div class="box-header"><h3 class="box-title">@lang('advancedplanning::lang.financial_plan')</h3></div>
|
|
<div class="box-body">
|
|
<p><strong>@lang('advancedplanning::lang.projected_revenue'):</strong> {{ $financial['projected_revenue'] ?? 0 }}</p>
|
|
<p><strong>@lang('advancedplanning::lang.projected_supply_cost'):</strong> {{ $financial['projected_supply_cost'] ?? 0 }}</p>
|
|
<p><strong>@lang('advancedplanning::lang.capacity_cost_ceiling'):</strong> {{ $financial['capacity_cost_ceiling'] ?? 0 }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="box box-warning">
|
|
<div class="box-header"><h3 class="box-title">@lang('advancedplanning::lang.gaps')</h3></div>
|
|
<div class="box-body">
|
|
<p><strong>@lang('advancedplanning::lang.demand_vs_supply_units'):</strong> {{ $gaps['demand_vs_supply_units'] ?? 0 }}</p>
|
|
<p><strong>@lang('advancedplanning::lang.capacity_vs_scheduled_hours'):</strong> {{ $gaps['capacity_vs_scheduled_hours'] ?? 0 }}</p>
|
|
@if(!empty($gaps['recommendations']))
|
|
<h5>@lang('advancedplanning::lang.recommendations')</h5>
|
|
<ul>
|
|
@foreach($gaps['recommendations'] as $rec)
|
|
<li>{{ $rec }}</li>
|
|
@endforeach
|
|
</ul>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="box-footer">
|
|
<a href="{{ action([\Modules\AdvancedPlanning\Http\Controllers\SopCycleController::class, 'index']) }}" class="btn btn-default">@lang('advancedplanning::lang.back')</a>
|
|
</div>
|
|
</section>
|
|
@endsection
|