497 lines
36 KiB
PHP
497 lines
36 KiB
PHP
@extends('layouts.app')
|
|
@section('title', $line->name.' — '.__('industrialengineering::lang.structure_tree'))
|
|
@section('css')
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nestable2@1.6.0/jquery.nestable.min.css">
|
|
<link rel="stylesheet" href="{{ asset('modules/industrialengineering/css/bom_tree_themes.css') }}?v=6">
|
|
<style>
|
|
.ie-structure-panel { min-height: 400px; }
|
|
.ie-cost-table { max-height: 500px; overflow-y: auto; }
|
|
</style>
|
|
@endsection
|
|
@section('content')
|
|
@include('industrialengineering::layouts.nav')
|
|
<section class="content-header">
|
|
<h1>
|
|
<i class="fa fa-industry"></i> {{ $line->name }}
|
|
<small>{{ $line->productPlatform?->name }}</small>
|
|
<a href="{{ action([\Modules\IndustrialEngineering\Http\Controllers\ProductHubController::class, 'show'], $line->product_platform_id) }}" class="btn btn-default btn-sm"><i class="fa fa-arrow-right"></i> @lang('industrialengineering::lang.back_to_product')</a>
|
|
</h1>
|
|
</section>
|
|
<section class="content" id="ie_structure_editor"
|
|
data-bom-id="{{ $mbom->id }}"
|
|
data-store-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'storeNode'], $mbom->id) }}"
|
|
data-move-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'move'], $mbom->id) }}"
|
|
data-update-url="{{ url('/industrial-engineering/bom-structure/nodes') }}"
|
|
data-delete-url="{{ url('/industrial-engineering/bom-structure/nodes') }}"
|
|
data-quick-item-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'quickCreateItem']) }}"
|
|
data-templates-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'listTemplates'], $mbom->id) }}"
|
|
data-apply-template-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'applyTemplate'], $mbom->id) }}"
|
|
data-save-template-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'saveTemplate']) }}"
|
|
data-delete-template-url="{{ url('/industrial-engineering/bom-structure/templates') }}"
|
|
data-duplicate-url="{{ action([\Modules\IndustrialEngineering\Http\Controllers\BomStructureController::class, 'duplicateBranch'], $mbom->id) }}"
|
|
data-product-search-url="{{ url('/products/list') }}">
|
|
@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
|
|
@if(session('integration_messages'))
|
|
@foreach(session('integration_messages') as $msg)
|
|
<div class="alert alert-{{ $msg['type'] === 'success' ? 'success' : ($msg['type'] === 'warning' ? 'warning' : 'info') }} alert-dismissible">
|
|
<button type="button" class="close" data-dismiss="alert">×</button>
|
|
<i class="fa fa-plug"></i> {{ $msg['text'] }}
|
|
</div>
|
|
@endforeach
|
|
@endif
|
|
@if(!empty($integrationMessages))
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
@foreach($integrationMessages as $msg)
|
|
<div class="alert alert-{{ $msg['type'] === 'success' ? 'success' : ($msg['type'] === 'warning' ? 'warning' : 'info') }} alert-dismissible">
|
|
<button type="button" class="close" data-dismiss="alert">×</button>
|
|
<i class="fa fa-plug"></i> {{ $msg['text'] }}
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
@endif
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<div class="box box-{{ $connectionGate['can_run_mrp'] ? 'success' : 'warning' }}">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title"><i class="fa fa-plug"></i> @lang('industrialengineering::lang.connection_status')</h3>
|
|
</div>
|
|
<div class="box-body">
|
|
<div class="row text-center">
|
|
<div class="col-xs-3"><small>@lang('industrialengineering::lang.total_leaves')</small><div><strong>{{ $connectionGate['stats']['total_leaves'] }}</strong></div></div>
|
|
<div class="col-xs-3"><small>@lang('industrialengineering::lang.erp_linked')</small><div><strong class="text-success">{{ $connectionGate['stats']['erp_linked'] }}</strong></div></div>
|
|
<div class="col-xs-3"><small>@lang('industrialengineering::lang.unlinked_items')</small><div><strong class="text-danger">{{ $connectionGate['stats']['unlinked'] }}</strong></div></div>
|
|
<div class="col-xs-3"><small>@lang('industrialengineering::lang.shortage_count')</small><div><strong>{{ $connectionGate['stats']['shortage_count'] }}</strong></div></div>
|
|
</div>
|
|
@if(!empty($connectionGate['warnings']))
|
|
<hr>
|
|
<p class="text-warning"><i class="fa fa-exclamation-triangle"></i> @lang('industrialengineering::lang.connection_warnings_title')</p>
|
|
<ul class="small">
|
|
@foreach(array_slice($connectionGate['warnings'], 0, 8) as $w)<li>{{ $w }}</li>@endforeach
|
|
</ul>
|
|
@endif
|
|
@if(!$connectionGate['can_run_mrp'])
|
|
<p class="text-danger"><i class="fa fa-ban"></i> @lang('industrialengineering::lang.gate_mrp_blocked_unlinked')</p>
|
|
<form method="POST" action="{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'resolveConnections'], $line->id) }}">
|
|
@csrf
|
|
<input type="hidden" name="redirect_to" value="structure">
|
|
<input type="hidden" name="sync_cmms" value="1">
|
|
<button type="submit" class="btn btn-warning btn-block">
|
|
<i class="fa fa-magic"></i> @lang('industrialengineering::lang.auto_resolve_connections')
|
|
</button>
|
|
<p class="text-muted small" style="margin-top:6px">@lang('industrialengineering::lang.auto_resolve_hint')</p>
|
|
</form>
|
|
@else
|
|
<p class="text-success"><i class="fa fa-check-circle"></i> @lang('industrialengineering::lang.connections_ready')</p>
|
|
@if(!empty($cmmsAvailable) && !$line->maintenance_equipment_id)
|
|
<form method="POST" action="{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'resolveConnections'], $line->id) }}" style="margin-top:8px">
|
|
@csrf
|
|
<input type="hidden" name="redirect_to" value="structure">
|
|
<input type="hidden" name="sync_cmms" value="1">
|
|
<button type="submit" class="btn btn-primary btn-block btn-sm"><i class="fa fa-sync"></i> @lang('industrialengineering::lang.sync_cmms_only')</button>
|
|
</form>
|
|
@endif
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-md-8">
|
|
<div class="box box-primary">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title"><i class="fa fa-sitemap"></i> @lang('industrialengineering::lang.structure_tree')</h3>
|
|
<div class="box-tools">
|
|
<div class="btn-group btn-group-sm" style="margin-left:6px">
|
|
<button type="button" class="btn btn-default" id="ie_expand_all" title="@lang('industrialengineering::lang.expand_all')"><i class="fa fa-plus-square-o"></i></button>
|
|
<button type="button" class="btn btn-default" id="ie_collapse_all" title="@lang('industrialengineering::lang.collapse_all')"><i class="fa fa-minus-square-o"></i></button>
|
|
</div>
|
|
<button type="button" class="btn btn-success btn-sm" id="ie_add_root_node"><i class="fa fa-plus"></i> @lang('industrialengineering::lang.add_root_assembly')</button>
|
|
<button type="button" class="btn btn-primary btn-sm" id="ie_save_tree"><i class="fa fa-save"></i> @lang('industrialengineering::lang.save_tree_order')</button>
|
|
</div>
|
|
</div>
|
|
<div class="box-body">
|
|
@php
|
|
$treeThemes = [
|
|
['id' => 1, 'pv' => 'pv-classic', 'c1' => '#3c8dbc', 'c2' => '#00a65a', 'c3' => '#f39c12'],
|
|
['id' => 2, 'pv' => 'pv-card', 'c1' => '#3c8dbc', 'c2' => '#00a65a', 'c3' => '#dd4b39'],
|
|
['id' => 3, 'pv' => 'pv-minimal', 'c1' => '#666', 'c2' => '#999', 'c3' => '#bbb'],
|
|
['id' => 4, 'pv' => 'pv-industrial', 'c1' => '#444', 'c2' => '#3c8dbc', 'c3' => '#00a65a'],
|
|
['id' => 5, 'pv' => 'pv-striped', 'c1' => '#3c8dbc', 'c2' => '#f4f4f4', 'c3' => '#fff'],
|
|
['id' => 6, 'pv' => 'pv-compact', 'c1' => '#888', 'c2' => '#aaa', 'c3' => '#ccc'],
|
|
['id' => 7, 'pv' => 'pv-color', 'c1' => '#e8f4fc', 'c2' => '#e8f8ee', 'c3' => '#f3e8fc'],
|
|
['id' => 8, 'pv' => 'pv-orgchart', 'c1' => '#64748b', 'c2' => '#3b82f6', 'c3' => '#22c55e'],
|
|
['id' => 9, 'pv' => 'pv-blueprint', 'c1' => '#1e3a5f', 'c2' => '#2563eb', 'c3' => '#60a5fa'],
|
|
['id' => 10, 'pv' => 'pv-gradient', 'c1' => '#6366f1', 'c2' => '#8b5cf6', 'c3' => '#ec4899'],
|
|
['id' => 11, 'pv' => 'pv-neon', 'c1' => '#00f5d4', 'c2' => '#7b2ff7', 'c3' => '#f72585'],
|
|
['id' => 12, 'pv' => 'pv-glass', 'c1' => '#94a3b8', 'c2' => '#cbd5e1', 'c3' => '#e2e8f0'],
|
|
['id' => 13, 'pv' => 'pv-pastel', 'c1' => '#fecdd3', 'c2' => '#bbf7d0', 'c3' => '#bfdbfe'],
|
|
['id' => 14, 'pv' => 'pv-timeline', 'c1' => '#0ea5e9', 'c2' => '#38bdf8', 'c3' => '#7dd3fc'],
|
|
['id' => 15, 'pv' => 'pv-material', 'c1' => '#1976d2', 'c2' => '#42a5f5', 'c3' => '#90caf9'],
|
|
['id' => 16, 'pv' => 'pv-branch', 'c1' => '#15803d', 'c2' => '#4ade80', 'c3' => '#86efac'],
|
|
['id' => 17, 'pv' => 'pv-aurora', 'c1' => '#7c3aed', 'c2' => '#06b6d4', 'c3' => '#f472b6'],
|
|
['id' => 18, 'pv' => 'pv-indented', 'c1' => '#3c8dbc', 'c2' => '#00a65a', 'c3' => '#f39c12'],
|
|
];
|
|
@endphp
|
|
<div class="ie-theme-picker">
|
|
<a class="ie-theme-picker-toggle" data-toggle="collapse" href="#ie_tree_theme_picker" aria-expanded="false">
|
|
<span><i class="fa fa-paint-brush"></i> @lang('industrialengineering::lang.tree_design_picker')</span>
|
|
<span class="text-muted small" id="ie_current_theme_label">@lang('industrialengineering::lang.tree_theme_2')</span>
|
|
<i class="fa fa-chevron-down"></i>
|
|
</a>
|
|
<div id="ie_tree_theme_picker" class="collapse">
|
|
<div class="ie-theme-default-bar">
|
|
<span><i class="fa fa-star text-warning"></i> @lang('industrialengineering::lang.tree_theme_default'): <strong id="ie_default_theme_label">—</strong></span>
|
|
<button type="button" class="btn btn-xs btn-default" id="ie_apply_default_theme">@lang('industrialengineering::lang.tree_theme_use_default')</button>
|
|
</div>
|
|
<div class="ie-theme-grid">
|
|
@foreach($treeThemes as $th)
|
|
<div class="ie-theme-card" data-theme="{{ $th['id'] }}" title="@lang('industrialengineering::lang.tree_theme_'.$th['id'])">
|
|
<button type="button" class="ie-theme-pin" data-theme="{{ $th['id'] }}" title="@lang('industrialengineering::lang.tree_theme_set_default')">
|
|
<i class="fa fa-star-o"></i>
|
|
</button>
|
|
<span class="ie-theme-default-badge">@lang('industrialengineering::lang.tree_theme_default_badge')</span>
|
|
<div class="ie-theme-card-name">@lang('industrialengineering::lang.tree_theme_'.$th['id'])</div>
|
|
<div class="ie-theme-preview {{ $th['pv'] }}">
|
|
<div class="pv-row"><span class="pv-dot" style="background:{{ $th['c1'] }}"></span><span class="pv-bar" style="width:62%;background:{{ $th['c1'] }}33"></span></div>
|
|
<div class="pv-row pv-indent-1"><span class="pv-dot" style="background:{{ $th['c2'] }}"></span><span class="pv-bar" style="width:48%;background:{{ $th['c2'] }}33"></span></div>
|
|
<div class="pv-row pv-indent-2"><span class="pv-dot" style="background:{{ $th['c3'] }}"></span><span class="pv-bar" style="width:34%;background:{{ $th['c3'] }}33"></span></div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
<select id="ie_tree_theme_select" class="form-control input-sm" style="margin-top:8px">
|
|
@foreach($treeThemes as $th)
|
|
<option value="{{ $th['id'] }}">@lang('industrialengineering::lang.tree_theme_'.$th['id'])</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div id="ie_clipboard_bar" class="ie-clipboard-bar" style="display:none">
|
|
<i class="fa fa-clipboard text-info"></i>
|
|
<span>@lang('industrialengineering::lang.clipboard_branch'): <strong id="ie_clipboard_label">—</strong></span>
|
|
<button type="button" class="btn btn-xs btn-info" id="ie_paste_to_root">@lang('industrialengineering::lang.paste_to_root')</button>
|
|
<button type="button" class="btn btn-xs btn-default" id="ie_clear_clipboard">@lang('industrialengineering::lang.clear_clipboard')</button>
|
|
</div>
|
|
<p class="text-muted"><i class="fa fa-info-circle"></i> @lang('industrialengineering::lang.tree_drag_hint')</p>
|
|
<div id="ie_tree_wrapper" class="ie-tree-indented ie-tree-theme-18">
|
|
<div class="dd" id="ie_bom_nestable">
|
|
<ol class="dd-list">
|
|
@include('industrialengineering::production_lines.partials.nestable_items', ['nodes' => $tree])
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
@if(empty($tree))
|
|
<p class="text-center text-muted" id="ie_empty_tree_msg">@lang('industrialengineering::lang.empty_tree_hint')</p>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="box box-info">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title"><i class="fa fa-clone"></i> @lang('industrialengineering::lang.structure_templates')</h3>
|
|
</div>
|
|
<div class="box-body">
|
|
<p class="text-muted small"><i class="fa fa-info-circle"></i> @lang('industrialengineering::lang.template_panel_hint')</p>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.template_target_parent')</label>
|
|
<input type="text" class="form-control input-sm" id="ie_template_parent_label" readonly placeholder="@lang('industrialengineering::lang.template_root_target')">
|
|
<input type="hidden" id="ie_template_parent_id" value="">
|
|
<p class="help-block small">@lang('industrialengineering::lang.template_parent_hint')</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.builtin_templates')</label>
|
|
<select id="ie_builtin_template" class="form-control">
|
|
<option value="">— @lang('industrialengineering::lang.select_template') —</option>
|
|
@foreach($structureTemplates['builtin'] as $preset)
|
|
<option value="{{ $preset['key'] }}" data-desc="{{ $preset['description'] }}">{{ $preset['name'] }}</option>
|
|
@endforeach
|
|
</select>
|
|
<p class="help-block small" id="ie_template_desc"></p>
|
|
</div>
|
|
<button type="button" class="btn btn-success btn-block btn-sm" id="ie_apply_builtin_template">
|
|
<i class="fa fa-bolt"></i> @lang('industrialengineering::lang.apply_template')
|
|
</button>
|
|
<hr>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.saved_templates')</label>
|
|
<select id="ie_saved_template" class="form-control">
|
|
<option value="">— @lang('industrialengineering::lang.no_saved_templates') —</option>
|
|
@foreach($structureTemplates['saved'] as $saved)
|
|
<option value="{{ $saved['key'] }}">{{ $saved['name'] }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="btn-group btn-group-justified" style="margin-bottom:10px">
|
|
<a class="btn btn-primary btn-sm" id="ie_apply_saved_template"><i class="fa fa-play"></i> @lang('industrialengineering::lang.apply')</a>
|
|
<a class="btn btn-danger btn-sm" id="ie_delete_saved_template"><i class="fa fa-trash"></i></a>
|
|
</div>
|
|
<hr>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.save_as_template')</label>
|
|
<input type="text" id="ie_save_template_name" class="form-control input-sm" placeholder="@lang('industrialengineering::lang.template_name_placeholder')">
|
|
</div>
|
|
<button type="button" class="btn btn-default btn-block btn-sm" id="ie_save_template_btn">
|
|
<i class="fa fa-save"></i> @lang('industrialengineering::lang.save_selected_subtree')
|
|
</button>
|
|
<p class="help-block small">@lang('industrialengineering::lang.save_template_hint')</p>
|
|
</div>
|
|
</div>
|
|
<div class="box box-solid box-default ie-structure-panel">
|
|
<div class="box-header"><h3 class="box-title" id="ie_panel_title">@lang('industrialengineering::lang.add_child')</h3></div>
|
|
<div class="box-body">
|
|
<form id="ie_node_form">
|
|
<input type="hidden" name="parent_line_id" id="ie_parent_line_id" value="">
|
|
<input type="hidden" name="bom_line_id" id="ie_bom_line_id" value="">
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.type') @include('industrialengineering::partials.field_help', ['key' => 'item_type'])</label>
|
|
<select name="item_type" id="ie_item_type" class="form-control">
|
|
@foreach($itemTypes as $k => $v)<option value="{{ $k }}">{{ $v }}</option>@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.name')</label>
|
|
<input type="text" name="name" id="ie_item_name" class="form-control" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.manual_code_optional')</label>
|
|
<input type="text" name="item_code" id="ie_item_code" class="form-control">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.quantity')</label>
|
|
<input type="number" name="quantity" id="ie_quantity" class="form-control" value="1" min="0.0001" step="any">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.position_code') @include('industrialengineering::partials.field_help', ['key' => 'position_code'])</label>
|
|
<input type="text" name="position_code" id="ie_position_code" class="form-control" placeholder="M01-A">
|
|
<p class="help-block" style="margin-bottom:6px">@lang('industrialengineering::lang.help_position_code')</p>
|
|
<div class="input-group input-group-sm">
|
|
<select class="form-control" id="ie_position_quick">
|
|
<option value="">@lang('industrialengineering::lang.select_position')</option>
|
|
<option value="M01-AIR">@lang('industrialengineering::lang.name') باد / Air Section</option>
|
|
<option value="M01-PMP">@lang('industrialengineering::lang.name') پمپ / Pump</option>
|
|
<option value="M01-DRY">@lang('industrialengineering::lang.name') خشک کن / Dryer</option>
|
|
<option value="M01-TNK">@lang('industrialengineering::lang.name') مخزن / Tank</option>
|
|
</select>
|
|
<span class="input-group-btn">
|
|
<button class="btn btn-default" type="button" id="ie_apply_position_quick"><i class="fa fa-bolt"></i></button>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.find_number') @include('industrialengineering::partials.field_help', ['key' => 'find_number'])</label>
|
|
<input type="text" name="find_number" id="ie_find_number" class="form-control">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.erp_product_link') @include('industrialengineering::partials.field_help', ['key' => 'erp_link'])</label>
|
|
<input type="text" name="search_product" id="ie_search_product" class="form-control" placeholder="@lang('lang_v1.search_product_placeholder')" autocomplete="off">
|
|
<input type="hidden" name="variation_id" id="ie_variation_id">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.or_select_existing')</label>
|
|
<select name="item_master_id" id="ie_item_master_id" class="form-control select2">
|
|
<option value="">—</option>
|
|
@foreach($existingItems as $id => $name)
|
|
<option value="{{ $id }}">{{ $name }}</option>
|
|
@endforeach
|
|
</select>
|
|
<a href="{{ action([\Modules\IndustrialEngineering\Http\Controllers\ItemMasterController::class, 'create']) }}" target="_blank" class="btn btn-xs btn-default" style="margin-top:4px"><i class="fa fa-external-link-alt"></i> @lang('industrialengineering::lang.quick_define_item')</a>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-block" id="ie_submit_node"><i class="fa fa-plus"></i> @lang('industrialengineering::lang.add_to_tree')</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="box box-warning">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title"><i class="fa fa-calculator"></i> @lang('industrialengineering::lang.live_cost_analysis')</h3>
|
|
</div>
|
|
<div class="box-body">
|
|
@if($liveComparison)
|
|
<div class="row text-center" style="margin-bottom:12px">
|
|
<div class="col-xs-4">
|
|
<small class="text-muted">@lang('industrialengineering::lang.standard_cost_total')</small>
|
|
<div><strong>{{ number_format($liveComparison['standard_total'], 0) }}</strong></div>
|
|
</div>
|
|
<div class="col-xs-4">
|
|
<small class="text-muted">@lang('industrialengineering::lang.live_cost_total')</small>
|
|
<div><strong class="text-primary">{{ number_format($liveComparison['live_total'], 0) }}</strong></div>
|
|
</div>
|
|
<div class="col-xs-4">
|
|
<small class="text-muted">@lang('industrialengineering::lang.shortage_value')</small>
|
|
<div><strong class="text-danger">{{ number_format($liveComparison['shortage_value'], 0) }}</strong></div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
<form id="ie_live_cost_form" class="form-inline" style="margin-bottom:10px">
|
|
<input type="number" name="planned_quantity" class="form-control input-sm" value="1" min="0.0001" step="any" style="width:70px" title="@lang('industrialengineering::lang.planned_quantity')">
|
|
<select name="location_id" class="form-control input-sm">
|
|
<option value="">@lang('industrialengineering::lang.all_locations')</option>
|
|
@foreach($locations as $lid => $lname)
|
|
<option value="{{ $lid }}">{{ $lname }}</option>
|
|
@endforeach
|
|
</select>
|
|
<button type="button" class="btn btn-sm btn-warning" id="ie_refresh_live_cost"><i class="fa fa-refresh"></i></button>
|
|
</form>
|
|
<div class="ie-cost-table" id="ie_live_cost_table">
|
|
<table class="table table-condensed table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>@lang('industrialengineering::lang.name')</th>
|
|
<th>@lang('industrialengineering::lang.required')</th>
|
|
<th>@lang('industrialengineering::lang.stock')</th>
|
|
<th>@lang('industrialengineering::lang.shortage')</th>
|
|
<th>@lang('industrialengineering::lang.live_cost_total')</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@if($liveAnalysis)
|
|
@foreach($liveAnalysis['lines'] as $row)
|
|
<tr class="{{ $row['shortage_qty'] > 0 ? 'danger' : '' }}">
|
|
<td><small>{{ $row['item_name'] }}</small></td>
|
|
<td>{{ $row['required_qty'] }}</td>
|
|
<td>{{ $row['stock_available'] }}</td>
|
|
<td>{{ $row['shortage_qty'] > 0 ? $row['shortage_qty'] : '—' }}</td>
|
|
<td>{{ number_format($row['live_extended'], 0) }}</td>
|
|
</tr>
|
|
@endforeach
|
|
@endif
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="box box-success">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title"><i class="fa fa-cogs"></i> @lang('industrialengineering::lang.erp_operations')</h3>
|
|
</div>
|
|
<div class="box-body">
|
|
<form method="POST" action="{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'runMrp'], $line->id) }}">
|
|
@csrf
|
|
<p class="text-muted small">@lang('industrialengineering::lang.mrp_hint')</p>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.planned_quantity')</label>
|
|
<input type="number" name="planned_quantity" class="form-control" value="1" min="0.0001" step="any">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.business_location')</label>
|
|
<select name="location_id" class="form-control select2">
|
|
@foreach($locations as $lid => $lname)
|
|
<option value="{{ $lid }}">{{ $lname }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>@lang('industrialengineering::lang.default_supplier') @include('industrialengineering::partials.field_help', ['key' => 'default_supplier'])</label>
|
|
<select name="supplier_contact_id" class="form-control select2">
|
|
<option value="">@lang('industrialengineering::lang.auto_from_catalog')</option>
|
|
@foreach($suppliers as $sid => $sname)
|
|
<option value="{{ $sid }}">{{ $sname }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="checkbox"><label><input type="checkbox" name="create_purchase_orders" value="1" checked> @lang('industrialengineering::lang.create_purchase_orders')</label></div>
|
|
<div class="checkbox"><label><input type="checkbox" name="create_work_order" value="1" checked> @lang('industrialengineering::lang.create_work_order')</label></div>
|
|
@if(!$connectionGate['can_run_mrp'])
|
|
<div class="alert alert-danger small">@lang('industrialengineering::lang.gate_mrp_blocked_unlinked')</div>
|
|
@endif
|
|
<button type="submit" class="btn btn-success btn-block" @if(!$connectionGate['can_run_mrp']) disabled title="@lang('industrialengineering::lang.gate_mrp_blocked_unlinked')" @endif><i class="fa fa-play"></i> @lang('industrialengineering::lang.run_mrp')</button>
|
|
</form>
|
|
@if(!$connectionGate['can_run_mrp'])
|
|
<form method="POST" action="{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'resolveConnections'], $line->id) }}" style="margin-top:10px">
|
|
@csrf
|
|
<input type="hidden" name="redirect_to" value="structure">
|
|
<input type="hidden" name="sync_cmms" value="1">
|
|
<button type="submit" class="btn btn-warning btn-block btn-sm">
|
|
<i class="fa fa-magic"></i> @lang('industrialengineering::lang.auto_resolve_connections')
|
|
</button>
|
|
</form>
|
|
@endif
|
|
<hr>
|
|
@if(!empty($cmmsAvailable))
|
|
<form method="POST" action="{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'syncCmms'], $line->id) }}">
|
|
@csrf
|
|
<p class="text-muted small">@lang('industrialengineering::lang.cmms_hint')</p>
|
|
@if($line->cmms_synced_at)
|
|
<p class="text-success small"><i class="fa fa-check"></i> @lang('industrialengineering::lang.last_cmms_sync'): @include('industrialengineering::partials.jalali_date', ['date' => $line->cmms_synced_at])</p>
|
|
@endif
|
|
@if($line->maintenance_equipment_id && class_exists(\Modules\Maintenance\Http\Controllers\EquipmentController::class))
|
|
<a href="{{ action([\Modules\Maintenance\Http\Controllers\EquipmentController::class, 'show'], $line->maintenance_equipment_id) }}" class="btn btn-default btn-sm btn-block" target="_blank">
|
|
<i class="fa fa-wrench"></i> @lang('industrialengineering::lang.open_cmms_equipment')
|
|
</a>
|
|
@endif
|
|
<button type="submit" class="btn btn-primary btn-block" style="margin-top:8px"><i class="fa fa-sync"></i> @lang('industrialengineering::lang.sync_cmms')</button>
|
|
</form>
|
|
@else
|
|
<div class="alert alert-warning small" style="margin:0">
|
|
<i class="fa fa-info-circle"></i> @lang('industrialengineering::lang.cmms_not_installed')
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
@endsection
|
|
|
|
@section('javascript')
|
|
<script src="https://cdn.jsdelivr.net/npm/nestable2@1.6.0/jquery.nestable.min.js"></script>
|
|
<script src="{{ asset('modules/industrialengineering/js/bom_tree_editor.js') }}?v=6"></script>
|
|
<script>
|
|
$(function(){
|
|
$('[data-toggle="tooltip"]').tooltip();
|
|
if (typeof IeBomTreeEditor !== 'undefined') {
|
|
IeBomTreeEditor.init();
|
|
}
|
|
if ($('#ie_search_product').length && typeof $('#ie_search_product').autocomplete === 'function') {
|
|
$('#ie_search_product').autocomplete({
|
|
source: function(request, response) {
|
|
$.getJSON('{{ url('/products/list') }}', { term: request.term }, function(data) {
|
|
var items = typeof data === 'string' ? JSON.parse(data) : data;
|
|
response($.map(items, function(item) {
|
|
return {
|
|
label: item.name || item.text || item.label,
|
|
value: item.name || item.text,
|
|
variation_id: item.variation_id
|
|
};
|
|
}));
|
|
});
|
|
},
|
|
minLength: 2,
|
|
select: function(e, ui) {
|
|
$('#ie_variation_id').val(ui.item.variation_id || '');
|
|
}
|
|
});
|
|
}
|
|
$('#ie_refresh_live_cost').on('click', function(){
|
|
var $form = $('#ie_live_cost_form');
|
|
$.post('{{ action([\Modules\IndustrialEngineering\Http\Controllers\LineOperationsController::class, 'liveCostAnalysis'], $line->id) }}', {
|
|
_token: $('meta[name="csrf-token"]').attr('content'),
|
|
planned_quantity: $form.find('[name=planned_quantity]').val(),
|
|
location_id: $form.find('[name=location_id]').val()
|
|
}, function(res){
|
|
if (!res.success) return;
|
|
var $tbody = $('#ie_live_cost_table tbody').empty();
|
|
$.each(res.analysis.lines, function(i, row){
|
|
$tbody.append('<tr class="'+(row.shortage_qty>0?'danger':'')+'"><td><small>'+row.item_name+'</small></td><td>'+row.required_qty+'</td><td>'+row.stock_available+'</td><td>'+(row.shortage_qty>0?row.shortage_qty:'—')+'</td><td>'+Math.round(row.live_extended).toLocaleString()+'</td></tr>');
|
|
});
|
|
if (typeof toastr !== 'undefined') toastr.success('{{ __("industrialengineering::lang.live_cost_refreshed") }}');
|
|
});
|
|
});
|
|
$('#ie_apply_position_quick').on('click', function () {
|
|
var quickVal = $('#ie_position_quick').val();
|
|
if (quickVal) {
|
|
$('#ie_position_code').val(quickVal).focus();
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
@endsection
|