ultimatepos/Modules/ManagementTools/Resources/views/executive_cockpit/partials/content.blade.php

478 lines
27 KiB
PHP

<div id="mt-cockpit-content">
<div id="mt-cockpit-meta"
data-board-pack-url="{{ $export_urls['board_pack'] }}"
data-pdf-url="{{ $export_urls['pdf'] }}"
data-drill-tab-url="{{ $drill_tab_url }}"
data-updated-at="{{ now()->format('Y-m-d H:i:s') }}"
hidden></div>
<div class="row">
<div class="col-md-12">
<div class="mt-exec-strip">
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.from_date')</span>
<strong>{{ $start_date }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.to_date')</span>
<strong>{{ $end_date }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.total_modules')</span>
<strong>{{ $data['summary']['total_modules'] }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.enabled_modules')</span>
<strong>{{ $data['summary']['enabled_modules'] }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.critical_alerts')</span>
<strong>{{ $data['summary']['critical_alerts'] }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.previous_period')</span>
<strong>{{ $data['previous_range']['start']->format('Y-m-d') }} {{ $data['previous_range']['end']->format('Y-m-d') }}</strong>
</div>
<div class="mt-exec-strip__item">
<span>@lang('managementtools::lang.system_health')</span>
<strong>{{ $data['summary']['system_score'] }}%</strong>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
@include('managementtools::executive_cockpit.partials.executive_summary')
</div>
</div>
<div class="row">
<div class="col-md-12">
@include('managementtools::executive_cockpit.partials.holding_comparison')
</div>
</div>
<div class="row">
<div class="col-md-3 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--sales mt-kpi-card--clickable" data-drill-tab="sales" role="button" tabindex="0">
<span>@lang('managementtools::lang.sales_this_month')</span>
<i class="fas fa-chart-line mt-kpi-card__icon"></i>
<strong class="display_currency" data-currency_symbol="true">{{ $data['kpis']['sales_this_month'] }}</strong>
@include('managementtools::executive_cockpit.partials.period_badge', ['comparison' => $data['kpi_comparisons']['sales_this_month'] ?? null])
</div>
</div>
<div class="col-md-3 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--margin mt-kpi-card--clickable" data-drill-tab="finance" role="button" tabindex="0">
<span>@lang('managementtools::lang.gross_margin_estimate')</span>
<i class="fas fa-coins mt-kpi-card__icon"></i>
<strong class="display_currency" data-currency_symbol="true">{{ $data['kpis']['gross_margin_estimate'] }}</strong>
@include('managementtools::executive_cockpit.partials.period_badge', ['comparison' => $data['kpi_comparisons']['gross_margin_estimate'] ?? null])
</div>
</div>
<div class="col-md-3 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--receivable mt-kpi-card--clickable" data-drill-tab="finance" role="button" tabindex="0">
<span>@lang('managementtools::lang.customer_due')</span>
<i class="fas fa-hand-holding-usd mt-kpi-card__icon"></i>
<strong class="display_currency" data-currency_symbol="true">{{ $data['kpis']['customer_due'] }}</strong>
</div>
</div>
<div class="col-md-3 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--payable mt-kpi-card--clickable" data-drill-tab="finance" role="button" tabindex="0">
<span>@lang('managementtools::lang.supplier_due')</span>
<i class="fas fa-file-invoice-dollar mt-kpi-card__icon"></i>
<strong class="display_currency" data-currency_symbol="true">{{ $data['kpis']['supplier_due'] }}</strong>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--clickable" data-drill-tab="quality" role="button" tabindex="0">
<span>@lang('managementtools::lang.open_ncrs')</span>
<i class="fas fa-clipboard-check mt-kpi-card__icon"></i>
<strong>{{ number_format($data['kpis']['open_ncrs'] ?? 0) }}</strong>
</div>
</div>
<div class="col-md-4 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--clickable" data-drill-tab="shopfloor" role="button" tabindex="0">
<span>@lang('managementtools::lang.avg_oee')</span>
<i class="fas fa-industry mt-kpi-card__icon"></i>
<strong>{{ number_format($data['kpis']['avg_oee_30d'] ?? 0, 1) }}%</strong>
</div>
</div>
<div class="col-md-4 col-sm-6">
<div class="mt-kpi-card mt-kpi-card--clickable" data-drill-tab="maintenance" role="button" tabindex="0">
<span>@lang('managementtools::lang.alert_iot_predictive')</span>
<i class="fas fa-broadcast-tower mt-kpi-card__icon"></i>
<strong>{{ number_format($data['kpis']['open_iot_alerts'] ?? 0) }}</strong>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.module_command_center')</h3>
<span class="label label-{{ $data['system_health']['status'] === 'good' ? 'success' : ($data['system_health']['status'] === 'watch' ? 'warning' : 'danger') }}">
@lang('managementtools::lang.system_health'): {{ $data['system_health']['score'] }}%
</span>
</div>
<div class="mt-card-body">
<div class="row">
@foreach($data['module_cockpit'] as $module)
<div class="col-md-3 col-sm-6">
<div class="mt-module-card">
<div class="mt-module-card__head">
<strong><a href="{{ $module['url'] }}" target="_blank">{{ $module['label'] }}</a></strong>
<span class="label label-{{ $module['enabled'] ? 'success' : 'default' }}">
{{ $module['enabled'] ? __('managementtools::lang.enabled') : __('managementtools::lang.disabled') }}
</span>
</div>
<div class="mt-module-card__meta">
<div>@lang('managementtools::lang.data_table'): {{ $module['table_exists'] ? __('managementtools::lang.ready') : __('managementtools::lang.not_ready') }}</div>
<div>@lang('managementtools::lang.records'): {{ number_format($module['records']) }}</div>
</div>
<div class="progress" style="margin-bottom:0;">
<div class="progress-bar progress-bar-{{ $module['score'] >= 80 ? 'success' : ($module['score'] >= 50 ? 'warning' : 'danger') }}" style="width: {{ $module['score'] }}%;">
{{ $module['score'] }}%
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="mt-card" id="mt-drilldown-center">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.drilldown_center')</h3>
</div>
<div class="mt-card-body">
<ul class="nav nav-tabs mt-drill-tabs" role="tablist">
@php
$tabs = [];
foreach ($data['drilldown_labels'] as $tabKey => $tabLabel) {
$tabs[$tabKey] = 'dd-'.$tabKey;
}
@endphp
@foreach($tabs as $key => $tabId)
<li class="{{ $active_tab === $key ? 'active' : '' }}">
<a href="#{{ $tabId }}" data-toggle="tab" data-tab-key="{{ $key }}">{{ $data['drilldown_labels'][$key] ?? $key }}</a>
</li>
@endforeach
</ul>
<div class="tab-content mt-drill-tab-content">
@foreach($tabs as $key => $tabId)
<div id="{{ $tabId }}" class="tab-pane fade {{ $active_tab === $key ? 'in active' : '' }}">
@if(!empty($lazy_drill_tabs) && $active_tab !== $key)
<div class="mt-drill-lazy" data-tab-key="{{ $key }}" data-loaded="0">
<div class="mt-drill-lazy__placeholder text-muted text-center">
<i class="fas fa-spinner fa-spin"></i> @lang('managementtools::lang.loading_drill_tab')
</div>
</div>
@else
@include('managementtools::executive_cockpit.partials.drill_tab_body', [
'tab_key' => $key,
'section' => $data['drilldown'][$key] ?? [],
])
@endif
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.target_variance')</h3>
</div>
<div class="mt-card-body">
<div class="row">
<div class="col-md-6">
@can('managementtools.board_manage')
{!! Form::open(['url' => action([\Modules\ManagementTools\Http\Controllers\ExecutiveCockpitController::class, 'saveTargets']), 'method' => 'post', 'class' => 'form']) !!}
<div class="form-group">
<label>@lang('managementtools::lang.sales_this_month')</label>
<input type="number" step="0.01" class="form-control" name="targets[sales_this_month]" value="{{ $data['targets']['sales_this_month'] ?? '' }}">
</div>
<div class="form-group">
<label>@lang('managementtools::lang.gross_margin_estimate')</label>
<input type="number" step="0.01" class="form-control" name="targets[gross_margin_estimate]" value="{{ $data['targets']['gross_margin_estimate'] ?? '' }}">
</div>
<div class="form-group">
<label>@lang('managementtools::lang.workforce_productivity')</label>
<input type="number" step="0.01" class="form-control" name="targets[workforce_productivity]" value="{{ $data['targets']['workforce_productivity'] ?? '' }}">
</div>
<button type="submit" class="btn btn-primary">@lang('managementtools::lang.save_targets')</button>
{!! Form::close() !!}
@else
<div class="alert alert-info">@lang('managementtools::lang.board_manage_required')</div>
@endcan
</div>
<div class="col-md-6">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>@lang('managementtools::lang.metric')</th>
<th>@lang('managementtools::lang.actual')</th>
<th>@lang('managementtools::lang.target')</th>
<th>@lang('managementtools::lang.variance')</th>
</tr>
</thead>
<tbody>
@forelse($data['variance'] as $key => $variance)
<tr>
<td>{{ __('managementtools::lang.' . $key) }}</td>
<td>{{ $variance['actual'] }}</td>
<td>{{ $variance['target'] }}</td>
<td class="{{ $variance['delta'] >= 0 ? 'text-success' : 'text-danger' }}">
{{ number_format($variance['delta'], 2) }} ({{ number_format($variance['delta_pct'], 2) }}%)
</td>
</tr>
@empty
<tr><td colspan="4" class="text-center">@lang('managementtools::lang.no_data')</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.ceo_notes')</h3>
</div>
<div class="mt-card-body">
<div class="row">
<div class="col-md-6">
@can('managementtools.board_manage')
{!! Form::open(['url' => action([\Modules\ManagementTools\Http\Controllers\ExecutiveCockpitController::class, 'saveNote']), 'method' => 'post']) !!}
<div class="form-group">
<label>@lang('managementtools::lang.title')</label>
<input type="text" name="title" class="form-control" required>
</div>
<div class="form-group">
<label>@lang('managementtools::lang.description')</label>
<textarea name="note" class="form-control" rows="4" required></textarea>
</div>
<button type="submit" class="btn btn-primary">@lang('managementtools::lang.save_note')</button>
{!! Form::close() !!}
@else
<div class="alert alert-info">@lang('managementtools::lang.board_manage_required')</div>
@endcan
</div>
<div class="col-md-6">
@forelse($data['notes'] as $note)
<div class="alert alert-info" style="margin-bottom:10px;">
<strong>{{ $note['title'] }}</strong>
<div style="font-size:12px;color:#475569;">
{{ $note['note_date'] }}
@if(!empty($note['author']))
{{ $note['author'] }}
@endif
</div>
<div>{{ $note['note'] }}</div>
</div>
@empty
<div class="alert alert-warning">@lang('managementtools::lang.no_notes')</div>
@endforelse
</div>
</div>
</div>
</div>
</div>
<div class="col-md-9">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.executive_trends')</h3>
</div>
<div class="mt-card-body">
@php
$salesTrend = $data['trends']['sales'] ?? [];
$purchaseTrend = $data['trends']['purchase'] ?? [];
$labels = $data['trends']['labels'] ?? [];
@endphp
<div class="mt-trend-chart mt-trend-chart--canvas">
<canvas id="mt-executive-trends-chart"
data-labels='@json($labels)'
data-sales='@json($salesTrend)'
data-purchase='@json($purchaseTrend)'
data-sales-label="@lang('managementtools::lang.sales_this_month')"
data-purchase-label="@lang('managementtools::lang.purchase_this_month')"></canvas>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="mt-kpi-card">
<span>@lang('managementtools::lang.holding_risk_score')</span>
<strong>{{ $data['risk_score'] }}/100</strong>
</div>
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.quick_actions')</h3>
</div>
<div class="mt-card-body">
@foreach($quick_links as $link)
<p style="margin:0 0 8px;"><a href="{{ $link['url'] }}" class="btn btn-default btn-sm" style="width:100%;text-align:right;">{{ $link['title'] }}</a></p>
@endforeach
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.executive_operational_view')</h3>
</div>
<div class="mt-card-body">
<div class="row">
<div class="col-sm-4">
<div class="mt-metric-box mt-metric-box--clickable" data-drill-tab="maintenance" role="button" tabindex="0">
<small>@lang('managementtools::lang.open_work_orders')</small>
<div>{{ $data['kpis']['open_work_orders'] }}</div>
</div>
</div>
<div class="col-sm-4">
<div class="mt-metric-box mt-metric-box--clickable" data-drill-tab="projects" role="button" tabindex="0">
<small>@lang('managementtools::lang.active_projects')</small>
<div>{{ $data['kpis']['active_projects'] }}</div>
</div>
</div>
<div class="col-sm-4">
<div class="mt-metric-box mt-metric-box--clickable" data-drill-tab="workforce" role="button" tabindex="0">
<small>@lang('managementtools::lang.open_tickets')</small>
<div>{{ $data['kpis']['open_tickets'] }}</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-6">
<p><strong>@lang('managementtools::lang.mt_reports_submitted'):</strong> {{ $data['kpis']['mt_reports_submitted'] }}</p>
</div>
<div class="col-sm-6">
<p><strong>@lang('managementtools::lang.workforce_productivity'):</strong> {{ $data['kpis']['workforce_productivity'] }}%</p>
</div>
</div>
</div>
</div>
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.top_management_focus')</h3>
</div>
<div class="mt-card-body">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>@lang('managementtools::lang.entity')</th>
<th>@lang('managementtools::lang.type')</th>
<th>@lang('managementtools::lang.amount')</th>
<th>@lang('managementtools::lang.actions')</th>
</tr>
</thead>
<tbody>
@forelse($data['focus_items'] as $focus)
<tr>
<td>
@if(!empty($focus['url']))
<a href="{{ $focus['url'] }}" target="_blank">{{ $focus['label'] }}</a>
@else
{{ $focus['label'] }}
@endif
</td>
<td>{{ __('managementtools::lang.' . $focus['type']) }}</td>
<td class="display_currency" data-currency_symbol="true">{{ $focus['amount'] }}</td>
<td>
@if(!empty($focus['actions']) && is_array($focus['actions']))
@foreach($focus['actions'] as $action)
<a href="{{ $action['url'] }}" target="_blank" class="btn btn-default btn-xs">{{ $action['label'] }}</a>
@endforeach
@else
<span class="text-muted"></span>
@endif
</td>
</tr>
@empty
<tr><td colspan="4" class="text-center">@lang('managementtools::lang.no_data')</td></tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.executive_alert_center')</h3>
</div>
<div class="mt-card-body">
@forelse($data['alerts'] as $alert)
<div class="alert alert-{{ $alert['level'] == 'danger' ? 'danger' : 'warning' }}" style="margin-bottom:10px;">
<strong>{{ $alert['title'] }}</strong>
<div>{{ $alert['value'] }}</div>
@if(!empty($alert['subtitle']))
<div style="margin-top:4px;">{{ $alert['subtitle'] }}</div>
@endif
@if(!empty($alert['url']))
<div style="margin-top:6px;">
<a href="{{ $alert['url'] }}" class="btn btn-xs btn-default">@lang('managementtools::lang.view_details')</a>
</div>
@endif
</div>
@empty
<div class="alert alert-success">@lang('managementtools::lang.no_critical_alerts')</div>
@endforelse
</div>
</div>
<div class="mt-card">
<div class="mt-card-header">
<h3 class="mt-card-title">@lang('managementtools::lang.action_center')</h3>
</div>
<div class="mt-card-body">
@foreach($data['action_center'] as $action)
<div class="alert alert-{{ $action['priority'] === 'high' ? 'danger' : ($action['priority'] === 'medium' ? 'warning' : 'info') }}" style="margin-bottom:10px;">
<strong>{{ $action['title'] }}</strong>
<div>{{ $action['description'] }}</div>
<div style="margin-top:8px;display:flex;flex-wrap:wrap;gap:6px;">
@if(!empty($action['drill_tab']))
<button type="button" class="btn btn-xs btn-default mt-open-drill-tab" data-drill-tab="{{ $action['drill_tab'] }}">
@lang('managementtools::lang.open_drilldown_tab')
</button>
@endif
@if(!empty($action['url']))
<a href="{{ $action['url'] }}" target="_blank" class="btn btn-xs btn-primary">
@lang('managementtools::lang.take_action')
</a>
@endif
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>