2141 lines
85 KiB
PHP
2141 lines
85 KiB
PHP
@extends('base.layout')
|
||
|
||
@section('content')
|
||
<div class="wrapper">
|
||
<div class="container-fluid">
|
||
<div class="row">
|
||
<div class="col-sm-12">
|
||
<div class="page-title-box">
|
||
<div class="btn-group pull-right">
|
||
<ol class="breadcrumb hide-phone p-0 m-0">
|
||
<li class="breadcrumb-item active">SMART-REAGEN STOK</li>
|
||
</ol>
|
||
</div>
|
||
<h4 class="page-title">SMART-REAGEN STOK</h4>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="row">
|
||
<div class="col-sm-12">
|
||
<div class="card-box">
|
||
<ul class="nav nav-tabs m-b-20">
|
||
<li class="nav-item">
|
||
<a href="#tab_keluar" data-toggle="tab" aria-expanded="true" class="nav-link active">POS (Barang Keluar)</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_masuk" data-toggle="tab" aria-expanded="false" class="nav-link">Stok Opname (Barang Masuk)</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_hilang" data-toggle="tab" aria-expanded="false" class="nav-link">Stok Opname - Barang Hilang</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_statistik" data-toggle="tab" aria-expanded="false" class="nav-link">Statistik</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_warning" data-toggle="tab" aria-expanded="false" class="nav-link">Warning</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_report" data-toggle="tab" aria-expanded="false" class="nav-link">Report</a>
|
||
</li>
|
||
<li class="nav-item">
|
||
<a href="#tab_master" data-toggle="tab" aria-expanded="false" class="nav-link">Master Barang</a>
|
||
</li>
|
||
</ul>
|
||
<div class="tab-content">
|
||
<div class="tab-pane active" id="tab_keluar">
|
||
@livewire('gudang-pos')
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_masuk">
|
||
<div class="row">
|
||
<div class="col-lg-4">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0">Barang Masuk (Stok Opname)</h4>
|
||
<div class="form-group">
|
||
<label>Tanggal Masuk</label>
|
||
<input type="text" id="op_in_tanggal" class="form-control" value="{{$tanggal}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Supplier / Keterangan</label>
|
||
<input type="text" id="op_in_supplier" class="form-control" placeholder="contoh: PT ABC / PO # / dll">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Pilih Barang</label>
|
||
<select id="op_in_pos" class="form-control">
|
||
<option value="" selected disabled>-- Pilih Barang --</option>
|
||
@foreach($jjenis as $rjenis)
|
||
@php($kode = ($rjenis['kodejenis'] ?? '') ?: preg_replace('/\s+/', '', (string) ($rjenis['jenis'] ?? '')))
|
||
<option value="{{ $rjenis['jenis'] }}"
|
||
data-kodejenis="{{ $kode }}"
|
||
data-jenisid="{{ $rjenis['id'] ?? '' }}"
|
||
data-satuan="{{ $rjenis['satuan'] }}"
|
||
data-satuan-kecil="{{ $rjenis['satuan_kecil'] ?? '' }}"
|
||
data-konversi="{{ $rjenis['konversi_kecil'] ?? 1 }}">{{ $kode }} - {{ $rjenis['jenis'] }} ( {{ $rjenis['satuan'] }} )</option>
|
||
@endforeach
|
||
<option value="__NEW__">+ Barang Baru (Input Manual)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Kode Barang (Internal)</label>
|
||
<input type="text" id="op_in_kode_barang" class="form-control" placeholder="contoh: ATK / CAIRAN / KODE ITEM" maxlength="40" readonly>
|
||
<small class="text-muted">Kode internal barang (bukan barcode). Otomatis terisi jika pilih barang dari list.</small>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Barcode (CODE128 - Angka)</label>
|
||
<input type="text" id="op_in_barcode" class="form-control" placeholder="akan terisi otomatis" readonly>
|
||
<small class="text-muted">Barcode dibedakan: satuan besar vs satuan kecil (nilai barcode berbeda).</small>
|
||
</div>
|
||
<div id="op_in_new_fields" style="display:none;">
|
||
<div class="form-group">
|
||
<label>Nama Barang (Baru)</label>
|
||
<input type="text" id="op_in_new_jenis" class="form-control" placeholder="contoh: AST N806">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Besar</label>
|
||
<input type="text" id="op_in_new_satuan" class="form-control" placeholder="contoh: BOX">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Kecil (opsional)</label>
|
||
<input type="text" id="op_in_new_satuan_kecil" class="form-control" placeholder="contoh: PCS / STRIP">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Konversi ke Satuan Kecil (opsional)</label>
|
||
<input type="number" id="op_in_new_konversi" class="form-control" value="1" min="1">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Stok Minimum Warning (base)</label>
|
||
<input type="number" id="op_in_new_stok_minimum" class="form-control" value="0" min="0">
|
||
</div>
|
||
<div class="form-group">
|
||
<small class="text-muted">Catatan: barcode (CODE128 angka) untuk barang baru dibuat otomatis setelah barang disimpan.</small>
|
||
</div>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Scan Barcode (CODE128)</label>
|
||
<input type="text" id="op_in_scan" class="form-control" placeholder="scan lalu Enter">
|
||
<small class="text-muted">Scan akan otomatis memilih barang & set satuan (besar/kecil) sesuai barcode.</small>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Input</label>
|
||
<select id="op_in_satuan_transaksi" class="form-control">
|
||
<option value="besar">Satuan Besar</option>
|
||
<option value="kecil">Satuan Kecil (Pecah Satuan)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Jumlah</label>
|
||
<input type="text" id="op_in_total" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Masa Expired</label>
|
||
<input type="text" id="op_in_masa_expired" class="form-control" placeholder="dd-mm-yyyy (opsional)">
|
||
</div>
|
||
<div class="form-group">
|
||
<button type="button" class="btn btn-success btn-block" id="btn_op_in_addline">Tambah ke Daftar</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-8">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0">Daftar Barang Masuk</h4>
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-striped m-b-0">
|
||
<thead>
|
||
<tr>
|
||
<th style="width: 110px">Kode</th>
|
||
<th>Barang</th>
|
||
<th style="width: 140px">Qty</th>
|
||
<th style="width: 120px">Satuan</th>
|
||
<th style="width: 140px">Expired</th>
|
||
<th style="width: 90px">Aksi</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="op_in_lines">
|
||
<tr><td colspan="6" class="text-center text-muted">Belum ada item.</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<small class="text-muted d-block m-t-10">Catatan: sistem akan menyimpan per-item menjadi baris transaksi (mirip stok opname).</small>
|
||
<div class="text-right m-t-15">
|
||
<button type="button" class="btn btn-custom" id="btn_op_in_commit">Simpan Semua Barang Masuk</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_hilang">
|
||
<div class="row">
|
||
<div class="col-lg-4">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0">Stok Opname Barang Hilang</h4>
|
||
<div class="form-group">
|
||
<label>Tanggal Opname</label>
|
||
<input type="text" id="op_adj_tanggal" class="form-control" value="{{$tanggal}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Keterangan (opsional)</label>
|
||
<input type="text" id="op_adj_note" class="form-control" placeholder="contoh: pecah saat distribusi / tidak ditemukan saat audit">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Pilih Barang</label>
|
||
<select id="op_adj_pos" class="form-control">
|
||
<option value="" selected disabled>-- Pilih Barang --</option>
|
||
@foreach($jjenis as $rjenis)
|
||
@php($kode = ($rjenis['kodejenis'] ?? '') ?: preg_replace('/\s+/', '', (string) ($rjenis['jenis'] ?? '')))
|
||
<option value="{{ $rjenis['jenis'] }}"
|
||
data-kodejenis="{{ $kode }}"
|
||
data-jenisid="{{ $rjenis['id'] ?? '' }}"
|
||
data-satuan="{{ $rjenis['satuan'] }}"
|
||
data-satuan-kecil="{{ $rjenis['satuan_kecil'] ?? '' }}"
|
||
data-konversi="{{ $rjenis['konversi_kecil'] ?? 1 }}">{{ $kode }} - {{ $rjenis['jenis'] }} ( {{ $rjenis['satuan'] }} )</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Barcode (CODE128 - Angka)</label>
|
||
<input type="text" id="op_adj_barcode" class="form-control" placeholder="akan terisi otomatis" readonly>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Scan Barcode (CODE128)</label>
|
||
<input type="text" id="op_adj_scan" class="form-control" placeholder="scan lalu Enter">
|
||
<small class="text-muted">Scan akan otomatis memilih barang & set satuan (besar/kecil) sesuai barcode.</small>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Input</label>
|
||
<select id="op_adj_satuan_transaksi" class="form-control">
|
||
<option value="besar">Satuan Besar</option>
|
||
<option value="kecil">Satuan Kecil (Pecah Satuan)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Jumlah</label>
|
||
<input type="text" id="op_adj_total" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<button type="button" class="btn btn-danger btn-block" id="btn_op_adj_addline">Tambah ke Daftar Pengurangan</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-lg-8">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0">Daftar Barang Hilang</h4>
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-striped m-b-0">
|
||
<thead>
|
||
<tr>
|
||
<th style="width: 110px">Kode</th>
|
||
<th>Barang</th>
|
||
<th>Keterangan</th>
|
||
<th style="width: 120px">Qty</th>
|
||
<th style="width: 120px">Satuan</th>
|
||
<th style="width: 90px">Aksi</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="op_adj_lines">
|
||
<tr><td colspan="6" class="text-center text-muted">Belum ada item.</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<small class="text-muted d-block m-t-10">Catatan: item di daftar ini akan mengurangi stok sebagai hasil opname barang hilang.</small>
|
||
<div class="text-right m-t-15">
|
||
<button type="button" class="btn btn-danger" id="btn_op_adj_commit">Simpan Semua Pengurangan Stok</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_report">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div class="card-box ribbon-box">
|
||
<div class="ribbon ribbon-primary">Report Transaksi</div>
|
||
<p class="m-b-0"></p>
|
||
<div class="form-group">
|
||
<div class="row">
|
||
<div class="form-group col-lg-4">
|
||
<input type="text" name="mulai" id="mulai" class="form-control" placeholder="Start Date" data-mask="9999-99-99">
|
||
</div>
|
||
<div class="form-group col-lg-4">
|
||
<input type="text" name="akhir" id="akhir" class="form-control" placeholder="End Date" data-mask="9999-99-99">
|
||
</div>
|
||
<div class="col-lg-2">
|
||
<button class="btn btn-warning btn-flat" type="button" id="btnviewdata">View Report</button>
|
||
</div>
|
||
<div class="col-lg-2">
|
||
<button class="btn btn-success btn-flat" type="button" id="btnexportreport">Export</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="form-group">
|
||
<div id="gridreportblnini"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_statistik">
|
||
<div class="row">
|
||
<div class="col-md-4">
|
||
<div class="card-box">
|
||
<h5 class="m-t-0">Statistik Harian (Base Unit)</h5>
|
||
<div>Masuk: <b id="stat_harian_masuk">{{ number_format($stat_harian_masuk ?? 0, 0, '.', ',') }}</b></div>
|
||
<div>Keluar: <b id="stat_harian_keluar">{{ number_format($stat_harian_keluar ?? 0, 0, '.', ',') }}</b></div>
|
||
<hr>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm table-bordered m-b-0">
|
||
<thead><tr><th>Jenis</th><th>Masuk</th><th>Keluar</th><th>Sisa Stok</th></tr></thead>
|
||
<tbody id="stat_perjenis_harian_body">
|
||
@forelse($stat_perjenis_harian ?? [] as $row)
|
||
<tr><td>{{ $row['jenis'] }}</td><td class="text-right">{{ number_format($row['masuk'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['keluar'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['sisa'] ?? 0,0,'.',',') }}</td></tr>
|
||
@empty
|
||
<tr><td colspan="4" class="text-center">Belum ada transaksi</td></tr>
|
||
@endforelse
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="card-box">
|
||
<h5 class="m-t-0">Statistik Bulanan (Base Unit)</h5>
|
||
<div>Masuk: <b id="stat_bulanan_masuk">{{ number_format($stat_bulanan_masuk ?? 0, 0, '.', ',') }}</b></div>
|
||
<div>Keluar: <b id="stat_bulanan_keluar">{{ number_format($stat_bulanan_keluar ?? 0, 0, '.', ',') }}</b></div>
|
||
<hr>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm table-bordered m-b-0">
|
||
<thead><tr><th>Jenis</th><th>Masuk</th><th>Keluar</th><th>Sisa Stok</th></tr></thead>
|
||
<tbody id="stat_perjenis_bulanan_body">
|
||
@forelse($stat_perjenis_bulanan ?? [] as $row)
|
||
<tr><td>{{ $row['jenis'] }}</td><td class="text-right">{{ number_format($row['masuk'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['keluar'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['sisa'] ?? 0,0,'.',',') }}</td></tr>
|
||
@empty
|
||
<tr><td colspan="4" class="text-center">Belum ada transaksi</td></tr>
|
||
@endforelse
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="card-box">
|
||
<h5 class="m-t-0">Statistik Tahunan (Base Unit)</h5>
|
||
<div>Masuk: <b id="stat_tahunan_masuk">{{ number_format($stat_tahunan_masuk ?? 0, 0, '.', ',') }}</b></div>
|
||
<div>Keluar: <b id="stat_tahunan_keluar">{{ number_format($stat_tahunan_keluar ?? 0, 0, '.', ',') }}</b></div>
|
||
<hr>
|
||
<div class="table-responsive">
|
||
<table class="table table-sm table-bordered m-b-0">
|
||
<thead><tr><th>Jenis</th><th>Masuk</th><th>Keluar</th><th>Sisa Stok</th></tr></thead>
|
||
<tbody id="stat_perjenis_tahunan_body">
|
||
@forelse($stat_perjenis_tahunan ?? [] as $row)
|
||
<tr><td>{{ $row['jenis'] }}</td><td class="text-right">{{ number_format($row['masuk'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['keluar'],0,'.',',') }}</td><td class="text-right">{{ number_format($row['sisa'] ?? 0,0,'.',',') }}</td></tr>
|
||
@empty
|
||
<tr><td colspan="4" class="text-center">Belum ada transaksi</td></tr>
|
||
@endforelse
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_warning">
|
||
<div class="row">
|
||
<div class="col-md-6">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0 m-b-15">Warning Barang Segera Habis</h4>
|
||
<div id="warningStockList">
|
||
@if(isset($warningstok) && count($warningstok) > 0)
|
||
@foreach($warningstok as $w)
|
||
<div class="alert alert-danger m-b-10">
|
||
<b>{{ $w['jenis'] }}</b> tersisa {{ $w['saldo'] }}.
|
||
Stok minimum: {{ number_format($w['minimum'], 0, '.', ',') }} {{ $w['satuan_kecil'] }}.
|
||
</div>
|
||
@endforeach
|
||
@else
|
||
<div class="alert alert-success m-b-0">Semua stok masih aman.</div>
|
||
@endif
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<div class="card-box">
|
||
<h4 class="m-t-0 m-b-15">Barang Mendekati Expired (H-30)</h4>
|
||
@if(isset($expiringSoon) && count($expiringSoon) > 0)
|
||
<div class="table-responsive">
|
||
<table class="table table-bordered table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>Jenis</th>
|
||
<th>Deskripsi</th>
|
||
<th>Tanggal Masuk</th>
|
||
<th>Masa Expired</th>
|
||
<th>Jumlah</th>
|
||
<th>Satuan</th>
|
||
<th>Sisa Hari</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="expiringSoonBody">
|
||
@foreach($expiringSoon as $e)
|
||
<tr>
|
||
<td>{{ $e['jenis'] }}</td>
|
||
<td>{{ $e['deskripsi'] }}</td>
|
||
<td class="text-center">{{ $e['tanggal_masuk'] }}</td>
|
||
<td class="text-center">{{ $e['masa_expired'] }}</td>
|
||
<td class="text-right">{{ number_format($e['qty'], 0, '.', ',') }}</td>
|
||
<td class="text-center">{{ strtoupper($e['satuan']) }}</td>
|
||
<td class="text-center"><span class="badge badge-{{ $e['badge'] }}">{{ $e['sisa_hari'] }} hari</span></td>
|
||
</tr>
|
||
@endforeach
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
@else
|
||
<div class="alert alert-success m-b-0">Tidak ada barang yang mendekati masa expired dalam 30 hari ke depan.</div>
|
||
@endif
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tab-pane" id="tab_master">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div class="card-box ribbon-box">
|
||
<div class="ribbon ribbon-primary">Master Barang / Stok</div>
|
||
<p class="m-b-0"></p>
|
||
<div class="form-group">
|
||
<a href="#" id="topbtntambahjenis" class="btn btn-block btn-social btn-flickr">
|
||
<i class="fa fa-database"></i> Tambah Jenis
|
||
</a>
|
||
</div>
|
||
<div class="form-group">
|
||
<div class="table-responsive">
|
||
<table id="gridjenisTable" class="table table-bordered table-striped">
|
||
<thead>
|
||
<tr>
|
||
<th>Kode</th>
|
||
<th>Jenis</th>
|
||
<th>Satuan</th>
|
||
<th>Satuan Kecil</th>
|
||
<th>Konversi</th>
|
||
<th>Stok Min</th>
|
||
<th>Sisa</th>
|
||
<th>Warning</th>
|
||
<th>Barcode</th>
|
||
<th>Detail</th>
|
||
<th>Edit</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
@foreach(($jenisRows ?? []) as $row)
|
||
@php($kode = ($row['kodejenis'] ?? '') ?: preg_replace('/\s+/', '', (string) ($row['jenis'] ?? '')))
|
||
@php($hasBreakdown = trim((string)($row['satuan_kecil'] ?? '')) !== '' && (int)($row['konversi_kecil'] ?? 1) > 1)
|
||
<tr>
|
||
<td class="text-center"><code>{{ $kode }}</code></td>
|
||
<td>{{ $row['jenis'] }}</td>
|
||
<td>{{ $row['satuan'] }}</td>
|
||
<td>{{ $row['satuan_kecil'] }}</td>
|
||
<td class="text-right">{{ number_format($row['konversi_kecil'], 0, '.', ',') }}</td>
|
||
<td class="text-right">{{ number_format($row['stok_minimum'], 0, '.', ',') }}</td>
|
||
<td>{{ $row['saldo'] }}</td>
|
||
<td class="text-center">{{ $row['warning'] }}</td>
|
||
<td class="text-center">
|
||
<button type="button"
|
||
class="btn btn-sm btn-info btnprintbarcode"
|
||
data-id="{{ $row['id'] }}"
|
||
data-jenis="{{ $row['jenis'] }}"
|
||
data-mode="besar"
|
||
data-satuan="{{ $row['satuan'] }}">Besar</button>
|
||
@if($hasBreakdown)
|
||
<button type="button"
|
||
class="btn btn-sm btn-info btnprintbarcode"
|
||
data-id="{{ $row['id'] }}"
|
||
data-jenis="{{ $row['jenis'] }}"
|
||
data-mode="kecil"
|
||
data-satuan="{{ $row['satuan_kecil'] }}">Kecil</button>
|
||
@endif
|
||
</td>
|
||
<td class="text-center">
|
||
<button type="button"
|
||
class="btn btn-sm btn-primary btndetailbarang"
|
||
data-id="{{ $row['id'] }}"
|
||
data-kode="{{ $kode }}"
|
||
data-jenis="{{ $row['jenis'] }}"
|
||
data-satuan="{{ $row['satuan'] }}"
|
||
data-has-breakdown="{{ $hasBreakdown ? 1 : 0 }}"
|
||
data-satuan-kecil="{{ $row['satuan_kecil'] }}"
|
||
data-konversi="{{ $row['konversi_kecil'] }}"
|
||
data-saldo="{{ $row['saldo'] }}">Detail</button>
|
||
</td>
|
||
<td class="text-center">
|
||
<button type="button"
|
||
class="btn btn-sm btn-warning btneditjenis"
|
||
data-id="{{ $row['id'] }}"
|
||
data-kodejenis="{{ $kode }}"
|
||
data-jenis="{{ $row['jenis'] }}"
|
||
data-satuan="{{ $row['satuan'] }}"
|
||
data-satuan-kecil="{{ $row['satuan_kecil'] }}"
|
||
data-konversi-kecil="{{ $row['konversi_kecil'] }}"
|
||
data-stok-minimum="{{ $row['stok_minimum'] }}">Edit</button>
|
||
</td>
|
||
</tr>
|
||
@endforeach
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div> <!-- end container -->
|
||
</div>
|
||
<!-- TOKEN -->
|
||
<div id="modaltambahjenisbrg" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h4 class="modal-title" id="myModalLabel">Input Jenis Barang</h4>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label>Jenis Barang</label>
|
||
<input type="text" id="jenis_deskripsi" name="jenis_deskripsi" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Kode Barang (Internal)</label>
|
||
<div class="input-group">
|
||
<input type="text" id="jenis_kode" name="jenis_kode" class="form-control" placeholder="contoh: ASTN806" maxlength="40">
|
||
<div class="input-group-append">
|
||
<button class="btn btn-info" type="button" id="btn_autokode">Auto</button>
|
||
</div>
|
||
</div>
|
||
<small class="text-muted">Kode internal untuk identifikasi (bukan barcode). Hanya huruf/angka dan simbol <code>-</code> <code>_</code> <code>.</code>, tanpa spasi (2-40 karakter).</small>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan </label>
|
||
<input type="text" id="jenis_satuan" name="jenis_satuan" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Kecil (untuk pecah satuan)</label>
|
||
<input type="text" id="jenis_satuan_kecil" name="jenis_satuan_kecil" class="form-control" placeholder="contoh: strip / pcs / vial">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Konversi ke Satuan Kecil</label>
|
||
<input type="number" id="jenis_konversi_kecil" name="jenis_konversi_kecil" class="form-control" value="1" min="1">
|
||
<small class="text-muted">Contoh: 1 box = 100 strip, isi 100.</small>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Stok Minimum Warning (dalam satuan kecil/base)</label>
|
||
<input type="number" id="jenis_stok_minimum" name="jenis_stok_minimum" class="form-control" value="0" min="0">
|
||
</div>
|
||
<div class="form-group account-btn text-center m-t-10">
|
||
<div class="col-12">
|
||
<input type="hidden" id="jenis_idne" name="jenis_idne" class="form-control">
|
||
<button class="btn w-lg btn-custom waves-effect waves-light" type="button" id="btnsimpanjenis">Tambahkan</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><!-- /.modal-content -->
|
||
</div><!-- /.modal-dialog -->
|
||
</div>
|
||
<div id="modalpemasukan" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h4 class="modal-title" id="myModalLabel">Input Data Penerimaan</h4>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label>Tanggal Masuk</label>
|
||
<input type="text" id="in_tanggal" name="in_tanggal" class="form-control" value="{{$tanggal}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Jenis Barang</label>
|
||
<select id="in_pos" name="in_pos" class="form-control" >
|
||
@foreach($jjenis as $rjenis)
|
||
@php($kode = ($rjenis['kodejenis'] ?? '') ?: preg_replace('/\s+/', '', (string) ($rjenis['jenis'] ?? '')))
|
||
<option value="{{ $rjenis['jenis'] }}" data-kodejenis="{{ $kode }}" data-satuan="{{ $rjenis['satuan'] }}" data-satuan-kecil="{{ $rjenis['satuan_kecil'] ?? '' }}" data-konversi="{{ $rjenis['konversi_kecil'] ?? 1 }}">{{ $kode }} - {{ $rjenis['jenis'] }} ( {{ $rjenis['satuan'] }} )</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Input</label>
|
||
<select id="in_satuan_transaksi" class="form-control">
|
||
<option value="besar">Satuan Besar</option>
|
||
<option value="kecil">Satuan Kecil (Pecah Satuan)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Supplier</label>
|
||
<input type="text" id="in_deskripsi" name="in_deskripsi" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Jumlah</label>
|
||
<input type="text" id="in_total" name="in_total" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Masa Expired</label>
|
||
<input type="text" id="in_masa_expired" name="in_masa_expired" class="form-control" placeholder="dd-mm-yyyy">
|
||
</div>
|
||
<div class="form-group account-btn text-center m-t-10">
|
||
<div class="col-12">
|
||
<button class="btn w-lg btn-custom waves-effect waves-light" type="button" id="btnsimpanpemasukan">Simpan</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="modalpengeluaran" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h4 class="modal-title" id="myModalLabel">Input Data Pengeluaran</h4>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label>Tanggal</label>
|
||
<input type="text" id="out_tanggal" name="out_tanggal" class="form-control" value="{{$tanggal}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Barang yang diminta</label>
|
||
<select id="out_pos" name="out_pos" class="form-control" >
|
||
@foreach($jjenis as $rjenis)
|
||
@php($kode = ($rjenis['kodejenis'] ?? '') ?: preg_replace('/\s+/', '', (string) ($rjenis['jenis'] ?? '')))
|
||
<option value="{{ $rjenis['jenis'] }}" data-kodejenis="{{ $kode }}" data-satuan="{{ $rjenis['satuan'] }}" data-satuan-kecil="{{ $rjenis['satuan_kecil'] ?? '' }}" data-konversi="{{ $rjenis['konversi_kecil'] ?? 1 }}">{{ $kode }} - {{ $rjenis['jenis'] }} ( {{ $rjenis['satuan'] }} )</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Satuan Pengeluaran</label>
|
||
<select id="out_satuan_transaksi" class="form-control">
|
||
<option value="kecil">Satuan Kecil (Pecah Satuan)</option>
|
||
<option value="besar">Satuan Besar</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Peminta</label>
|
||
<select id="out_deskripsi" name="out_deskripsi" class="form-control" >
|
||
@foreach($pegawai as $rpegawai)
|
||
<option value="{{ $rpegawai['id'] }}">{{ $rpegawai['nama'] }} ( {{ $rpegawai['previlege'] }} )</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Total</label>
|
||
<input type="text" id="out_total" name="out_total" class="form-control">
|
||
</div>
|
||
<div class="form-group account-btn text-center m-t-10">
|
||
<div class="col-12">
|
||
<button class="btn w-lg btn-custom waves-effect waves-light" type="button" id="btnsimpanpengeluaran">Simpan</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="modaleditor" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h4 class="modal-title" id="myModalLabel">Editor Data</h4>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label>Tanggal</label>
|
||
<input type="text" id="edit_tanggal" name="edit_tanggal" class="form-control" value="{{$tanggal}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Jenis barang</label>
|
||
<select id="edit_pos" name="edit_pos" class="form-control" >
|
||
@foreach($jjenis as $rjenis)
|
||
<option value="{{ $rjenis['jenis'] }}">{{ $rjenis['jenis'] }} ( {{ $rjenis['satuan'] }} )</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Deskripsi</label>
|
||
<input type="text" id="edit_deskripsi" name="edit_deskripsi" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Total</label>
|
||
<input type="text" id="edit_total" name="edit_total" class="form-control">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Masa Expired</label>
|
||
<input type="text" id="edit_masa_expired" name="edit_masa_expired" class="form-control" placeholder="dd-mm-yyyy">
|
||
</div>
|
||
<div class="form-group">
|
||
<label>Alasan Di Edit / Di Hapus</label>
|
||
<input type="text" id="edit_alasan" name="edit_alasan" class="form-control">
|
||
</div>
|
||
<div class="form-group account-btn text-center m-t-10">
|
||
<div class="col-12">
|
||
<button class="btn w-lg btn-danger waves-effect waves-light" type="button" id="btnsimpanhapus">Delete</button>
|
||
<input type="hidden" id="edit_id" name="edit_id" class="form-control">
|
||
<button class="btn w-lg btn-custom waves-effect waves-light" type="button" id="btnsimpanedit">Simpan</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="modalDetailBarang" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalDetailBarangLabel" aria-hidden="true">
|
||
<div class="modal-dialog modal-lg">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h4 class="modal-title" id="modalDetailBarangLabel">Detail Barang</h4>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="row">
|
||
<div class="col-md-7">
|
||
<table class="table table-bordered m-b-0">
|
||
<tr><td style="width: 160px"><b>Kode</b></td><td><code id="detail_kode">-</code></td></tr>
|
||
<tr><td><b>Nama</b></td><td id="detail_jenis">-</td></tr>
|
||
<tr><td><b>Satuan</b></td><td id="detail_satuan">-</td></tr>
|
||
<tr><td><b>Satuan Kecil</b></td><td id="detail_satuan_kecil">-</td></tr>
|
||
<tr><td><b>Konversi</b></td><td id="detail_konversi">-</td></tr>
|
||
<tr><td><b>Stok</b></td><td id="detail_saldo">-</td></tr>
|
||
</table>
|
||
</div>
|
||
<div class="col-md-5">
|
||
<div class="text-center" style="border:1px dashed #ddd; padding:12px;">
|
||
<div class="form-group text-left">
|
||
<label>Satuan Barcode</label>
|
||
<select id="detail_barcode_mode" class="form-control">
|
||
<option value="besar">Satuan Besar</option>
|
||
<option value="kecil">Satuan Kecil</option>
|
||
</select>
|
||
</div>
|
||
<svg id="detail_barcode_svg"></svg>
|
||
<div class="m-t-5">
|
||
<small class="text-muted">Barcode: <code id="detail_barcode_value">-</code></small>
|
||
</div>
|
||
<div class="m-t-10">
|
||
<button type="button" class="btn btn-info" id="btn_detail_print_barcode">Cetak Barcode</button>
|
||
</div>
|
||
<small class="text-muted d-block m-t-10">Format: CODE128</small>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<hr>
|
||
<div class="row">
|
||
<div class="col-md-6">
|
||
<button type="button" class="btn btn-success btn-block" id="btn_detail_quick_masuk">Input Barang Masuk</button>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<button type="button" class="btn btn-primary btn-block" id="btn_detail_quick_keluar">Input Barang Keluar</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="tempatctk" style="overflow: hidden; display: none;">
|
||
<div id="tabel_cetak"></div>
|
||
</div>
|
||
<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">
|
||
|
||
@endsection
|
||
@push('script')
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
|
||
<script type="text/javascript">
|
||
$(function () {
|
||
$("#in_tanggal").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#out_tanggal").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#edit_tanggal").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#op_in_tanggal").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#op_adj_tanggal").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#in_masa_expired").datepicker({format: 'dd-mm-yyyy'});
|
||
$("#op_in_masa_expired").datepicker({format: 'dd-mm-yyyy'});
|
||
$("#edit_masa_expired").datepicker({format: 'dd-mm-yyyy'});
|
||
$("#mulai").datepicker({format: 'yyyy-mm-dd'});
|
||
$("#akhir").datepicker({format: 'yyyy-mm-dd'});
|
||
});
|
||
function openedpage( jQuery ){
|
||
var set01=document.getElementById('mulai').value;
|
||
var set02=document.getElementById('akhir').value;
|
||
var token=document.getElementById('token').value;
|
||
var source = {
|
||
datatype: "json",
|
||
datafields: [
|
||
{ name: 'id',type: 'text'},
|
||
{ name: 'tanggal',type: 'text'},
|
||
{ name: 'bulan',type: 'text'},
|
||
{ name: 'tahun',type: 'text'},
|
||
{ name: 'deskripsi',type: 'text'},
|
||
{ name: 'pemasukan',type: 'text'},
|
||
{ name: 'pengeluaran',type: 'text'},
|
||
{ name: 'jenis',type: 'text'},
|
||
{ name: 'masa_expired',type: 'text'},
|
||
{ name: 'keterangan',type: 'text'},
|
||
{ name: 'tgllengkap',type: 'date'},
|
||
{ name: 'total',type: 'text'},
|
||
],
|
||
type: 'POST',
|
||
data: {val01: set01, val02: set02, _token: token},
|
||
url: 'simbhp/reportbhp',
|
||
};
|
||
var dataAdapter = new $.jqx.dataAdapter(source);
|
||
$("#gridreportblnini").jqxGrid({
|
||
width: '100%',
|
||
showfilterrow: true,
|
||
filterable: true,
|
||
columnsresize: true,
|
||
autoshowfiltericon: true,
|
||
pageable: true,
|
||
autoheight: true,
|
||
theme: "energyblue",
|
||
source: dataAdapter,
|
||
showaggregates: true,
|
||
showstatusbar: true,
|
||
statusbarheight: 50,
|
||
altrows: true,
|
||
selectionmode: 'multiplecellsextended',
|
||
columns: [
|
||
{ text: 'Tanggal', cellsformat: 'dd-MMMM-yyyy', filtertype: 'date', datafield: 'tgllengkap', width: '15%', cellsalign: 'center', align: 'center' },
|
||
{ text: 'Jenis', datafield: 'jenis', filtertype: 'checkedlist', width: '10%', cellsalign: 'center', align: 'center' },
|
||
{ text: 'Deskripsi', datafield: 'deskripsi', width: '25%', cellsalign: 'left', align: 'center' },
|
||
{ text: 'MASUK', cellsformat: 'n2',aggregates: ['sum'], datafield: 'pemasukan', width: '10%', cellsalign: 'right', align: 'center' },
|
||
{ text: 'KELUAR', cellsformat: 'n2', aggregates: ['sum'], datafield: 'pengeluaran', width: '10%', cellsalign: 'right', align: 'center' },
|
||
{ text: 'Masa Expired', datafield: 'masa_expired', width: '12%', cellsalign: 'center', align: 'center' },
|
||
{ text: 'Keterangan', datafield: 'keterangan', width: '8%', cellsalign: 'right', align: 'center' },
|
||
{ text: 'Edit', columntype: 'button', width: '10%', cellsrenderer: function () { return "Edit";
|
||
}, buttonclick: function (row) {
|
||
editrow = row;
|
||
var offset = $("#gridreportblnini").offset();
|
||
var dataRecord = $("#gridreportblnini").jqxGrid('getrowdata', editrow);
|
||
var previlage = "{{ Session('previlage') }}";
|
||
if (previlage == 'developer' || previlage == 'supervisor') {
|
||
var tanggal = dataRecord.tanggal;
|
||
var bulan = dataRecord.bulan;
|
||
var tahun = dataRecord.tahun;
|
||
var tulis = tahun+'-'+bulan+'-'+tanggal;
|
||
$("#edit_deskripsi").val(dataRecord.deskripsi);
|
||
$("#edit_id").val(dataRecord.id);
|
||
$("#edit_pos").val(dataRecord.jenis);
|
||
$("#edit_total").val(dataRecord.total);
|
||
$("#edit_tanggal").val(tulis);
|
||
$("#edit_masa_expired").val(dataRecord.masa_expired || '');
|
||
$("#modaleditor").modal('show');
|
||
} else {
|
||
swal({
|
||
title: 'Akses Ditolak',
|
||
text: 'Anda tidak memiliki izin untuk mengedit data.',
|
||
icon: 'error',
|
||
confirmButtonText: 'OK'
|
||
});
|
||
}
|
||
|
||
}
|
||
},
|
||
],
|
||
columngroups:
|
||
[
|
||
{ text: 'Tanggal', align: 'center', name: 'tglinput' },
|
||
]
|
||
});
|
||
}
|
||
$(document).ready(function() {
|
||
var token=document.getElementById('token').value;
|
||
var reportInited = false;
|
||
var jenisTableInited = false;
|
||
|
||
function initReportIfNeeded(){
|
||
if(reportInited){ return; }
|
||
openedpage();
|
||
reportInited = true;
|
||
}
|
||
|
||
function initJenisTableIfNeeded(){
|
||
if(jenisTableInited){ return; }
|
||
$('#gridjenisTable').DataTable();
|
||
jenisTableInited = true;
|
||
}
|
||
|
||
if($('#tab_report').hasClass('active')){
|
||
initReportIfNeeded();
|
||
}
|
||
if($('#tab_master').hasClass('active')){
|
||
initJenisTableIfNeeded();
|
||
}
|
||
$('a[href="#tab_report"]').on('shown.bs.tab', function(){
|
||
initReportIfNeeded();
|
||
});
|
||
$('a[href="#tab_master"]').on('shown.bs.tab', function(){
|
||
initJenisTableIfNeeded();
|
||
});
|
||
var snapshotUrl = "{{ route('simbhp.snapshot') }}";
|
||
var refreshInFlight = false;
|
||
|
||
var jenisRows = @json($jenisRows ?? []);
|
||
var opInLines = [];
|
||
var opAdjLines = [];
|
||
var currentDetail = null;
|
||
|
||
function escapeHtml(value){
|
||
var v = (value === undefined || value === null) ? '' : String(value);
|
||
return $('<div>').text(v).html();
|
||
}
|
||
|
||
function formatInt(value){
|
||
var n = parseInt(value, 10);
|
||
if(isNaN(n)){ n = 0; }
|
||
try { return n.toLocaleString('en-US'); } catch(e){ return (''+n); }
|
||
}
|
||
|
||
function normalizeKode(value){
|
||
return (value || '').toString()
|
||
.toUpperCase()
|
||
.trim()
|
||
.replace(/\s+/g, '')
|
||
.replace(/[^A-Z0-9._-]/g, '')
|
||
.substring(0, 40);
|
||
}
|
||
|
||
function parseBarcodeInput(value){
|
||
var v = normalizeKode(value);
|
||
if(!v){ return { kode: '', jenis_id: null, mode: 'besar', barcode_value: '' }; }
|
||
|
||
var n = v.match(/^91(\d{8})([12])$/);
|
||
if(n){
|
||
var id = parseInt(n[1], 10);
|
||
var unitDigit = (n[2] || '1').toString();
|
||
return { kode: '', jenis_id: id, mode: (unitDigit === '2' ? 'kecil' : 'besar'), barcode_value: v };
|
||
}
|
||
|
||
var m = v.match(/^(.*)-(B|K)$/);
|
||
if(m){
|
||
var base = normalizeKode(m[1] || '');
|
||
var suf = (m[2] || 'B').toString();
|
||
return { kode: base, jenis_id: null, mode: (suf === 'K' ? 'kecil' : 'besar'), barcode_value: base + '-' + suf };
|
||
}
|
||
return { kode: v, jenis_id: null, mode: 'besar', barcode_value: v };
|
||
}
|
||
|
||
function buildBarcodeValueById(jenisId, mode){
|
||
var id = parseInt(jenisId || 0, 10);
|
||
if(!id || id <= 0){ return ''; }
|
||
var idPart = id.toString().padStart(8, '0');
|
||
var unitDigit = (mode === 'kecil') ? '2' : '1';
|
||
return '91' + idPart + unitDigit;
|
||
}
|
||
|
||
function buildKodeMap(rows){
|
||
var map = {};
|
||
(rows || []).forEach(function(r){
|
||
var kode = normalizeKode((r && r.kodejenis) ? r.kodejenis : (r ? r.jenis : ''));
|
||
if(kode){
|
||
map[kode.toUpperCase()] = r;
|
||
}
|
||
});
|
||
return map;
|
||
}
|
||
|
||
var kodeMap = buildKodeMap(jenisRows);
|
||
|
||
function buildIdMap(rows){
|
||
var map = {};
|
||
(rows || []).forEach(function(r){
|
||
var id = parseInt((r && r.id) ? r.id : 0, 10);
|
||
if(id > 0){
|
||
map[id] = r;
|
||
}
|
||
});
|
||
return map;
|
||
}
|
||
|
||
var idMap = buildIdMap(jenisRows);
|
||
|
||
function renderStatPerjenis(tbodyId, rows){
|
||
var html = '';
|
||
(rows || []).forEach(function(r){
|
||
html += '<tr>' +
|
||
'<td>' + escapeHtml(r.jenis || '-') + '</td>' +
|
||
'<td class="text-right">' + formatInt(r.masuk || 0) + '</td>' +
|
||
'<td class="text-right">' + formatInt(r.keluar || 0) + '</td>' +
|
||
'<td class="text-right">' + formatInt(r.sisa || 0) + '</td>' +
|
||
'</tr>';
|
||
});
|
||
if(!html){
|
||
html = '<tr><td colspan="4" class="text-center">Belum ada transaksi</td></tr>';
|
||
}
|
||
$(tbodyId).html(html);
|
||
}
|
||
|
||
function renderStats(stat){
|
||
if(!stat){ return; }
|
||
var harian = (stat && stat.harian) ? stat.harian : {};
|
||
var bulanan = (stat && stat.bulanan) ? stat.bulanan : {};
|
||
var tahunan = (stat && stat.tahunan) ? stat.tahunan : {};
|
||
$('#stat_harian_masuk').text(formatInt(harian.masuk || 0));
|
||
$('#stat_harian_keluar').text(formatInt(harian.keluar || 0));
|
||
$('#stat_bulanan_masuk').text(formatInt(bulanan.masuk || 0));
|
||
$('#stat_bulanan_keluar').text(formatInt(bulanan.keluar || 0));
|
||
$('#stat_tahunan_masuk').text(formatInt(tahunan.masuk || 0));
|
||
$('#stat_tahunan_keluar').text(formatInt(tahunan.keluar || 0));
|
||
renderStatPerjenis('#stat_perjenis_harian_body', harian.perjenis || []);
|
||
renderStatPerjenis('#stat_perjenis_bulanan_body', bulanan.perjenis || []);
|
||
renderStatPerjenis('#stat_perjenis_tahunan_body', tahunan.perjenis || []);
|
||
}
|
||
|
||
function renderWarnings(warnings){
|
||
var html = '';
|
||
(warnings || []).forEach(function(w){
|
||
html += '<div class="alert alert-danger m-b-10">' +
|
||
'<b>' + escapeHtml(w.jenis || '-') + '</b> tersisa ' + escapeHtml(w.saldo || '-') + '. ' +
|
||
'Stok minimum: ' + formatInt(w.minimum || 0) + ' ' + escapeHtml(w.satuan_kecil || '-') + '.' +
|
||
'</div>';
|
||
});
|
||
if(!html){
|
||
html = '<div class="alert alert-success m-b-0">Semua stok masih aman.</div>';
|
||
}
|
||
$('#warningStockList').html(html);
|
||
}
|
||
|
||
function renderExpiring(items){
|
||
var $tbody = $('#expiringSoonBody');
|
||
if(!$tbody.length){ return; }
|
||
var html = '';
|
||
(items || []).forEach(function(e){
|
||
html += '<tr>' +
|
||
'<td>' + escapeHtml(e.jenis || '-') + '</td>' +
|
||
'<td>' + escapeHtml(e.deskripsi || '-') + '</td>' +
|
||
'<td class="text-center">' + escapeHtml(e.tanggal_masuk || '-') + '</td>' +
|
||
'<td class="text-center">' + escapeHtml(e.masa_expired || '-') + '</td>' +
|
||
'<td class="text-right">' + formatInt(e.qty || 0) + '</td>' +
|
||
'<td class="text-center">' + escapeHtml((e.satuan || '').toString().toUpperCase() || '-') + '</td>' +
|
||
'<td class="text-center"><span class="badge badge-' + escapeHtml(e.badge || 'warning') + '">' + escapeHtml(e.sisa_hari || 0) + ' hari</span></td>' +
|
||
'</tr>';
|
||
});
|
||
$tbody.html(html || '<tr><td colspan="7" class="text-center text-muted">Tidak ada data.</td></tr>');
|
||
}
|
||
|
||
function rebuildJenisTable(rows){
|
||
var $table = $('#gridjenisTable');
|
||
if(!$table.length){ return; }
|
||
var html = '';
|
||
(rows || []).forEach(function(row){
|
||
var kode = normalizeKode((row && row.kodejenis) ? row.kodejenis : (row ? row.jenis : ''));
|
||
var konv = parseInt((row && row.konversi_kecil) ? row.konversi_kecil : 1, 10);
|
||
if(!konv || konv <= 0){ konv = 1; }
|
||
var satuanKecil = ((row && row.satuan_kecil) ? row.satuan_kecil : '').toString().trim();
|
||
var hasBreakdown = (satuanKecil !== '' && konv > 1);
|
||
html += '<tr>' +
|
||
'<td class="text-center"><code>' + escapeHtml(kode) + '</code></td>' +
|
||
'<td>' + escapeHtml((row && row.jenis) ? row.jenis : '-') + '</td>' +
|
||
'<td>' + escapeHtml((row && row.satuan) ? row.satuan : '-') + '</td>' +
|
||
'<td>' + escapeHtml((row && row.satuan_kecil) ? row.satuan_kecil : '') + '</td>' +
|
||
'<td class="text-right">' + formatInt(konv) + '</td>' +
|
||
'<td class="text-right">' + formatInt((row && row.stok_minimum) ? row.stok_minimum : 0) + '</td>' +
|
||
'<td>' + escapeHtml((row && row.saldo) ? row.saldo : '-') + '</td>' +
|
||
'<td class="text-center">' + escapeHtml((row && row.warning) ? row.warning : '-') + '</td>' +
|
||
'<td class="text-center">' +
|
||
'<button type="button" class="btn btn-sm btn-info btnprintbarcode" data-id="' + escapeHtml((row && row.id) ? row.id : '') + '" data-jenis="' + escapeHtml((row && row.jenis) ? row.jenis : '') + '" data-mode="besar" data-satuan="' + escapeHtml((row && row.satuan) ? row.satuan : '') + '">Besar</button> ' +
|
||
(hasBreakdown ? '<button type="button" class="btn btn-sm btn-info btnprintbarcode" data-id="' + escapeHtml((row && row.id) ? row.id : '') + '" data-jenis="' + escapeHtml((row && row.jenis) ? row.jenis : '') + '" data-mode="kecil" data-satuan="' + escapeHtml((row && row.satuan_kecil) ? row.satuan_kecil : '') + '">Kecil</button>' : '') +
|
||
'</td>' +
|
||
'<td class="text-center">' +
|
||
'<button type="button" class="btn btn-sm btn-primary btndetailbarang" ' +
|
||
'data-id="' + escapeHtml((row && row.id) ? row.id : '') + '" ' +
|
||
'data-kode="' + escapeHtml(kode) + '" ' +
|
||
'data-jenis="' + escapeHtml((row && row.jenis) ? row.jenis : '') + '" ' +
|
||
'data-satuan="' + escapeHtml((row && row.satuan) ? row.satuan : '') + '" ' +
|
||
'data-has-breakdown="' + (hasBreakdown ? '1' : '0') + '" ' +
|
||
'data-satuan-kecil="' + escapeHtml((row && row.satuan_kecil) ? row.satuan_kecil : '') + '" ' +
|
||
'data-konversi="' + escapeHtml(konv) + '" ' +
|
||
'data-saldo="' + escapeHtml((row && row.saldo) ? row.saldo : '') + '">Detail</button>' +
|
||
'</td>' +
|
||
'<td class="text-center">' +
|
||
'<button type="button" class="btn btn-sm btn-warning btneditjenis" ' +
|
||
'data-id="' + escapeHtml((row && row.id) ? row.id : '') + '" ' +
|
||
'data-kodejenis="' + escapeHtml(kode) + '" ' +
|
||
'data-jenis="' + escapeHtml((row && row.jenis) ? row.jenis : '') + '" ' +
|
||
'data-satuan="' + escapeHtml((row && row.satuan) ? row.satuan : '') + '" ' +
|
||
'data-satuan-kecil="' + escapeHtml((row && row.satuan_kecil) ? row.satuan_kecil : '') + '" ' +
|
||
'data-konversi-kecil="' + escapeHtml(konv) + '" ' +
|
||
'data-stok-minimum="' + escapeHtml((row && row.stok_minimum) ? row.stok_minimum : 0) + '">Edit</button>' +
|
||
'</td>' +
|
||
'</tr>';
|
||
});
|
||
if(!html){
|
||
html = '<tr><td colspan="11" class="text-center text-muted">Belum ada data.</td></tr>';
|
||
}
|
||
|
||
var hadDataTable = ($.fn.DataTable && $.fn.DataTable.isDataTable && $.fn.DataTable.isDataTable('#gridjenisTable'));
|
||
if(hadDataTable){
|
||
try{ $('#gridjenisTable').DataTable().destroy(); } catch(e){}
|
||
jenisTableInited = false;
|
||
}
|
||
$('#gridjenisTable tbody').html(html);
|
||
if(hadDataTable){
|
||
initJenisTableIfNeeded();
|
||
}
|
||
}
|
||
|
||
function rebuildSelectOptions(jjenis){
|
||
var items = (jjenis || []).filter(function(x){
|
||
return x && (x.jenis || '').toString().trim() !== '' && (x.jenis || '') !== 'Belum Ada Jenis Barang';
|
||
});
|
||
|
||
function makeOption(r){
|
||
var kode = (((r && r.kodejenis) ? r.kodejenis : '') || '').toString();
|
||
if(kode.trim() === ''){ kode = (r.jenis || '').toString().replace(/\s+/g, ''); }
|
||
kode = normalizeKode(kode);
|
||
var satuan = ((r && r.satuan) ? r.satuan : '').toString();
|
||
var satuanKecil = ((r && r.satuan_kecil) ? r.satuan_kecil : '').toString();
|
||
var konv = parseInt((r && r.konversi_kecil) ? r.konversi_kecil : 1, 10);
|
||
if(!konv || konv <= 0){ konv = 1; }
|
||
return '<option value="' + escapeHtml(r.jenis) + '"' +
|
||
' data-kodejenis="' + escapeHtml(kode) + '"' +
|
||
' data-jenisid="' + escapeHtml((r && r.id) ? r.id : '') + '"' +
|
||
' data-satuan="' + escapeHtml(satuan) + '"' +
|
||
' data-satuan-kecil="' + escapeHtml(satuanKecil) + '"' +
|
||
' data-konversi="' + escapeHtml(konv) + '">' +
|
||
escapeHtml(kode + ' - ' + r.jenis + ' ( ' + satuan + ' )') +
|
||
'</option>';
|
||
}
|
||
|
||
// Stok opname select (punya opsi Barang Baru)
|
||
var currentOp = $('#op_in_pos').val();
|
||
var htmlOp = '<option value=\"\" selected disabled>-- Pilih Barang --</option>';
|
||
items.forEach(function(r){ htmlOp += makeOption(r); });
|
||
htmlOp += '<option value=\"__NEW__\">+ Barang Baru (Input Manual)</option>';
|
||
$('#op_in_pos').html(htmlOp);
|
||
if(currentOp){
|
||
$('#op_in_pos').val(currentOp);
|
||
}
|
||
syncOpInSelected();
|
||
|
||
var currentAdj = $('#op_adj_pos').val();
|
||
var htmlAdj = '<option value=\"\" selected disabled>-- Pilih Barang --</option>';
|
||
items.forEach(function(r){ htmlAdj += makeOption(r); });
|
||
$('#op_adj_pos').html(htmlAdj);
|
||
if(currentAdj){
|
||
$('#op_adj_pos').val(currentAdj);
|
||
}
|
||
syncOpAdjSelected();
|
||
|
||
// Legacy selects (modal lama / editor)
|
||
var legacyIds = ['#in_pos', '#out_pos'];
|
||
legacyIds.forEach(function(sel){
|
||
var current = $(sel).val();
|
||
var html = '';
|
||
items.forEach(function(r){
|
||
var kode = normalizeKode((((r && r.kodejenis) ? r.kodejenis : '') || r.jenis || '').toString());
|
||
html += '<option value="' + escapeHtml(r.jenis) + '"' +
|
||
' data-kodejenis="' + escapeHtml(kode) + '"' +
|
||
' data-jenisid="' + escapeHtml((r && r.id) ? r.id : '') + '"' +
|
||
' data-satuan="' + escapeHtml((r && r.satuan) ? r.satuan : '') + '"' +
|
||
' data-satuan-kecil="' + escapeHtml((r && r.satuan_kecil) ? r.satuan_kecil : '') + '"' +
|
||
' data-konversi="' + escapeHtml((r && r.konversi_kecil) ? r.konversi_kecil : 1) + '">' +
|
||
escapeHtml(kode + ' - ' + r.jenis + ' ( ' + ((r && r.satuan) ? r.satuan : '') + ' )') +
|
||
'</option>';
|
||
});
|
||
$(sel).html(html);
|
||
if(current){ $(sel).val(current); }
|
||
syncSatuanMode(sel, (sel === '#in_pos' ? '#in_satuan_transaksi' : '#out_satuan_transaksi'));
|
||
});
|
||
}
|
||
|
||
function applySnapshot(data){
|
||
if(!data){ return; }
|
||
if(Array.isArray(data.jenisRows)){
|
||
jenisRows = data.jenisRows;
|
||
kodeMap = buildKodeMap(jenisRows);
|
||
idMap = buildIdMap(jenisRows);
|
||
rebuildJenisTable(jenisRows);
|
||
}
|
||
if(Array.isArray(data.warningstok)){
|
||
renderWarnings(data.warningstok);
|
||
}
|
||
if(Array.isArray(data.expiringSoon)){
|
||
renderExpiring(data.expiringSoon);
|
||
}
|
||
if(data.stat){
|
||
renderStats(data.stat);
|
||
}
|
||
if(Array.isArray(data.jjenis)){
|
||
rebuildSelectOptions(data.jjenis);
|
||
}
|
||
}
|
||
|
||
window.gudangRefresh = function(){
|
||
if(refreshInFlight){ return; }
|
||
refreshInFlight = true;
|
||
|
||
// Refresh report grid
|
||
try{
|
||
if($("#gridreportblnini").data('jqxGrid')){
|
||
$("#gridreportblnini").jqxGrid('updatebounddata');
|
||
}else if(typeof openedpage === 'function'){
|
||
openedpage();
|
||
}
|
||
}catch(e){
|
||
try{ if(typeof openedpage === 'function'){ openedpage(); } }catch(_){}
|
||
}
|
||
|
||
$.ajax({ url: snapshotUrl, method: 'GET' })
|
||
.done(function(resp){
|
||
applySnapshot(resp);
|
||
if (window.Livewire && typeof window.Livewire.dispatch === 'function') {
|
||
window.Livewire.dispatch('gudangpos-refresh');
|
||
}
|
||
})
|
||
.always(function(){
|
||
refreshInFlight = false;
|
||
});
|
||
};
|
||
|
||
(function initGudangRefreshListener(){
|
||
function attach(){
|
||
if(!window.Livewire || typeof window.Livewire.on !== 'function'){ return; }
|
||
window.Livewire.on('gudang-refresh', function(){
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
});
|
||
}
|
||
if(document.readyState === 'loading'){
|
||
document.addEventListener('livewire:init', attach, { once: true });
|
||
}else{
|
||
document.addEventListener('livewire:init', attach);
|
||
attach();
|
||
}
|
||
})();
|
||
|
||
function syncSatuanMode(itemSelect, satuanSelect){
|
||
var selected = $(itemSelect).find('option:selected');
|
||
var satuanKecil = (selected.data('satuan-kecil') || '').toString().trim();
|
||
var konversi = parseInt(selected.data('konversi') || 1, 10);
|
||
var hasBreakdown = satuanKecil !== '' && konversi > 1;
|
||
$(satuanSelect).find('option[value="kecil"]').prop('disabled', !hasBreakdown);
|
||
if(!hasBreakdown && $(satuanSelect).val() === 'kecil'){
|
||
$(satuanSelect).val('besar');
|
||
}
|
||
}
|
||
|
||
function setSelectByKode(itemSelect, kode){
|
||
var parsed = parseBarcodeInput(kode);
|
||
if(parsed.jenis_id){
|
||
var foundById = idMap[parsed.jenis_id];
|
||
if(!foundById || !foundById.jenis){ return false; }
|
||
$(itemSelect).val(foundById.jenis).trigger('change');
|
||
return { ok:true, mode: parsed.mode, kode: normalizeKode(foundById.kodejenis || ''), jenis_id: parsed.jenis_id };
|
||
}
|
||
|
||
kode = (parsed.kode || '').toUpperCase();
|
||
if(!kode){ return { ok:false, mode:'besar', kode:'', jenis_id:null }; }
|
||
var found = kodeMap[kode];
|
||
if(!found || !found.jenis){ return false; }
|
||
$(itemSelect).val(found.jenis).trigger('change');
|
||
return { ok:true, mode: parsed.mode, kode: kode, jenis_id: found.id || null };
|
||
}
|
||
|
||
function renderBarcodeInto(svgEl, kode){
|
||
try{
|
||
JsBarcode(svgEl, kode, {
|
||
format: "CODE128",
|
||
displayValue: true,
|
||
height: 45,
|
||
margin: 0
|
||
});
|
||
}catch(e){
|
||
console.error(e);
|
||
}
|
||
}
|
||
|
||
function printBarcode(barcodeValue, jenis, satuan){
|
||
barcodeValue = normalizeKode(barcodeValue);
|
||
if(!barcodeValue){
|
||
$.toast({ heading: 'Gagal', text: 'Kode barang kosong', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3000, stack: 1 });
|
||
return;
|
||
}
|
||
if (typeof window.jspdf === 'undefined' || typeof JsBarcode === 'undefined') {
|
||
alert('Kesalahan: Library jsPDF atau JsBarcode belum dimuat.');
|
||
return;
|
||
}
|
||
|
||
const { jsPDF } = window.jspdf;
|
||
const doc = new jsPDF({
|
||
orientation: 'landscape',
|
||
unit: 'mm',
|
||
format: [50, 35]
|
||
});
|
||
const leftMargin = 2;
|
||
const contentWidth = 50 - (leftMargin * 2);
|
||
let yPosition = 4;
|
||
|
||
let nama = (jenis || '').toString().trim();
|
||
if (nama.length > 18) {
|
||
nama = nama.substring(0, 18) + ".";
|
||
}
|
||
|
||
doc.setFont('helvetica', 'bold');
|
||
doc.setFontSize(7);
|
||
doc.text(nama, leftMargin, yPosition, { maxWidth: contentWidth });
|
||
yPosition += 4;
|
||
|
||
try {
|
||
const canvas = document.createElement('canvas');
|
||
JsBarcode(canvas, barcodeValue, {
|
||
format: "CODE128",
|
||
displayValue: false,
|
||
height: 40,
|
||
width: 1.5,
|
||
margin: 5
|
||
});
|
||
const barcodeDataUrl = canvas.toDataURL('image/png');
|
||
const barcodeHeight = 10;
|
||
doc.addImage(barcodeDataUrl, 'PNG', leftMargin, yPosition, contentWidth, barcodeHeight);
|
||
yPosition += barcodeHeight + 3;
|
||
doc.setFont('helvetica', 'bold');
|
||
doc.setFontSize(9);
|
||
const centerX = 50 / 2;
|
||
doc.text(barcodeValue, centerX, yPosition, { align: 'center' });
|
||
yPosition += 4;
|
||
} catch (e) {
|
||
console.error("Gagal membuat barcode:", e);
|
||
doc.text("Error Barcode", leftMargin, yPosition);
|
||
yPosition += 12;
|
||
}
|
||
|
||
doc.setFont('helvetica', 'normal');
|
||
doc.setFontSize(6.5);
|
||
doc.text(('Satuan: ' + (satuan || '').toString()), leftMargin, yPosition, { maxWidth: contentWidth });
|
||
|
||
doc.output('dataurlnewwindow');
|
||
}
|
||
|
||
$('#in_pos').on('change', function(){ syncSatuanMode('#in_pos', '#in_satuan_transaksi'); });
|
||
$('#out_pos').on('change', function(){ syncSatuanMode('#out_pos', '#out_satuan_transaksi'); });
|
||
$('#op_in_pos').on('change', function(){ syncSatuanMode('#op_in_pos', '#op_in_satuan_transaksi'); });
|
||
$('#op_adj_pos').on('change', function(){ syncSatuanMode('#op_adj_pos', '#op_adj_satuan_transaksi'); });
|
||
syncSatuanMode('#in_pos', '#in_satuan_transaksi');
|
||
syncSatuanMode('#out_pos', '#out_satuan_transaksi');
|
||
syncSatuanMode('#op_in_pos', '#op_in_satuan_transaksi');
|
||
syncSatuanMode('#op_adj_pos', '#op_adj_satuan_transaksi');
|
||
|
||
function syncOpInSelected(){
|
||
var val = $('#op_in_pos').val();
|
||
if(val === '__NEW__'){
|
||
$('#op_in_new_fields').show();
|
||
$('#op_in_kode_barang').prop('readonly', false).val('');
|
||
$('#op_in_barcode').val('');
|
||
$('#op_in_new_jenis').val('');
|
||
$('#op_in_new_satuan').val('');
|
||
$('#op_in_new_satuan_kecil').val('');
|
||
$('#op_in_new_konversi').val('1');
|
||
$('#op_in_new_stok_minimum').val('0');
|
||
$('#op_in_satuan_transaksi').val('besar');
|
||
$('#op_in_satuan_transaksi option[value="kecil"]').prop('disabled', true);
|
||
return;
|
||
}
|
||
$('#op_in_new_fields').hide();
|
||
var selected = $('#op_in_pos option:selected');
|
||
var kode = normalizeKode(selected.data('kodejenis') || '');
|
||
$('#op_in_kode_barang').prop('readonly', true).val(kode);
|
||
syncSatuanMode('#op_in_pos', '#op_in_satuan_transaksi');
|
||
var jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
var mode = $('#op_in_satuan_transaksi').val() || 'besar';
|
||
$('#op_in_barcode').val(buildBarcodeValueById(jenisId, mode));
|
||
}
|
||
|
||
$('#op_in_pos').on('change', function(){
|
||
syncOpInSelected();
|
||
});
|
||
syncOpInSelected();
|
||
|
||
function syncOpAdjSelected(){
|
||
var selected = $('#op_adj_pos option:selected');
|
||
syncSatuanMode('#op_adj_pos', '#op_adj_satuan_transaksi');
|
||
var jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
var mode = $('#op_adj_satuan_transaksi').val() || 'besar';
|
||
$('#op_adj_barcode').val(buildBarcodeValueById(jenisId, mode));
|
||
}
|
||
|
||
$('#op_adj_pos').on('change', function(){
|
||
syncOpAdjSelected();
|
||
});
|
||
syncOpAdjSelected();
|
||
|
||
$('#op_in_kode_barang').on('input', function(){
|
||
if($('#op_in_pos').val() !== '__NEW__'){ return; }
|
||
$(this).val(normalizeKode($(this).val()));
|
||
});
|
||
|
||
function syncOpInNewSatuanAvailability(){
|
||
if($('#op_in_pos').val() !== '__NEW__'){ return; }
|
||
var satuanKecil = ($('#op_in_new_satuan_kecil').val() || '').toString().trim();
|
||
var konv = parseInt($('#op_in_new_konversi').val() || 1, 10);
|
||
var hasBreakdown = satuanKecil !== '' && konv > 1;
|
||
$('#op_in_satuan_transaksi option[value="kecil"]').prop('disabled', !hasBreakdown);
|
||
if(!hasBreakdown && $('#op_in_satuan_transaksi').val() === 'kecil'){
|
||
$('#op_in_satuan_transaksi').val('besar');
|
||
}
|
||
}
|
||
|
||
$('#op_in_new_satuan_kecil').on('input', syncOpInNewSatuanAvailability);
|
||
$('#op_in_new_konversi').on('input', syncOpInNewSatuanAvailability);
|
||
|
||
$('#op_in_satuan_transaksi').on('change', function(){
|
||
if($('#op_in_pos').val() === '__NEW__'){ return; }
|
||
var selected = $('#op_in_pos option:selected');
|
||
var jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
var mode = $('#op_in_satuan_transaksi').val() || 'besar';
|
||
$('#op_in_barcode').val(buildBarcodeValueById(jenisId, mode));
|
||
});
|
||
|
||
$('#op_adj_satuan_transaksi').on('change', function(){
|
||
var selected = $('#op_adj_pos option:selected');
|
||
var jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
var mode = $('#op_adj_satuan_transaksi').val() || 'besar';
|
||
$('#op_adj_barcode').val(buildBarcodeValueById(jenisId, mode));
|
||
});
|
||
|
||
$("#topbtntambahjenis").click(function(){
|
||
$("#jenis_idne").val('new');
|
||
$("#jenis_deskripsi").val('');
|
||
$("#jenis_kode").val('').data('manual', 0);
|
||
$("#jenis_satuan").val('');
|
||
$("#jenis_satuan_kecil").val('');
|
||
$("#jenis_konversi_kecil").val('1');
|
||
$("#jenis_stok_minimum").val('0');
|
||
$("#modaltambahjenisbrg").modal('show');
|
||
});
|
||
$("#topbtnhapus").click(function(){ $("#modaleditor").modal('show'); $("#edit_id").val('delete'); });
|
||
$(document).on('click', '.btneditjenis', function(){
|
||
$("#jenis_idne").val($(this).data('id'));
|
||
$("#jenis_deskripsi").val($(this).data('jenis'));
|
||
$("#jenis_kode").val($(this).data('kodejenis') || '').data('manual', 1);
|
||
$("#jenis_satuan").val($(this).data('satuan'));
|
||
$("#jenis_satuan_kecil").val($(this).data('satuan-kecil'));
|
||
$("#jenis_konversi_kecil").val($(this).data('konversi-kecil'));
|
||
$("#jenis_stok_minimum").val($(this).data('stok-minimum'));
|
||
$("#modaltambahjenisbrg").modal('show');
|
||
});
|
||
|
||
function sanitizeKodeBarang(value){
|
||
return (value || '').toString()
|
||
.toUpperCase()
|
||
.replace(/\s+/g,'')
|
||
.replace(/[^A-Z0-9._-]/g,'')
|
||
.substring(0, 40);
|
||
}
|
||
|
||
function autogenKodeFromJenis(){
|
||
var jenis = $('#jenis_deskripsi').val();
|
||
$('#jenis_kode').val(sanitizeKodeBarang(jenis)).data('manual', 0);
|
||
}
|
||
|
||
$('#btn_autokode').on('click', function(){
|
||
autogenKodeFromJenis();
|
||
});
|
||
|
||
$('#jenis_kode').on('input', function(){
|
||
$(this).data('manual', 1);
|
||
$(this).val(sanitizeKodeBarang($(this).val()));
|
||
});
|
||
|
||
$('#jenis_deskripsi').on('input', function(){
|
||
var manual = parseInt($('#jenis_kode').data('manual') || 0, 10);
|
||
if(manual === 0){
|
||
autogenKodeFromJenis();
|
||
}
|
||
});
|
||
|
||
$(document).on('click', '.btnprintbarcode', function(){
|
||
var id = parseInt($(this).data('id') || 0, 10);
|
||
var mode = ($(this).data('mode') || 'besar').toString();
|
||
var barcodeValue = buildBarcodeValueById(id, mode);
|
||
printBarcode(barcodeValue, $(this).data('jenis'), $(this).data('satuan'));
|
||
});
|
||
|
||
$(document).on('click', '.btndetailbarang', function(){
|
||
currentDetail = {
|
||
id: parseInt($(this).data('id') || 0, 10),
|
||
kode: $(this).data('kode'),
|
||
jenis: $(this).data('jenis'),
|
||
satuan: $(this).data('satuan'),
|
||
hasBreakdown: parseInt($(this).data('has-breakdown') || 0, 10) === 1,
|
||
satuanKecil: $(this).data('satuan-kecil'),
|
||
konversi: $(this).data('konversi'),
|
||
saldo: $(this).data('saldo')
|
||
};
|
||
$('#detail_kode').text(currentDetail.kode || '-');
|
||
$('#detail_jenis').text(currentDetail.jenis || '-');
|
||
$('#detail_satuan').text(currentDetail.satuan || '-');
|
||
$('#detail_satuan_kecil').text(currentDetail.satuanKecil || '-');
|
||
$('#detail_konversi').text(currentDetail.konversi || '-');
|
||
$('#detail_saldo').text(currentDetail.saldo || '-');
|
||
$('#modalDetailBarang').modal('show');
|
||
$('#detail_barcode_mode').val('besar');
|
||
$('#detail_barcode_mode option[value="kecil"]').prop('disabled', !currentDetail.hasBreakdown);
|
||
if(!currentDetail.hasBreakdown){
|
||
$('#detail_barcode_mode').val('besar');
|
||
}
|
||
setTimeout(function(){
|
||
var el = document.getElementById('detail_barcode_svg');
|
||
if(el){
|
||
var mode = $('#detail_barcode_mode').val() || 'besar';
|
||
var val = buildBarcodeValueById(currentDetail.id, mode);
|
||
$('#detail_barcode_value').text(val || '-');
|
||
renderBarcodeInto(el, val);
|
||
}
|
||
}, 100);
|
||
});
|
||
|
||
$('#detail_barcode_mode').on('change', function(){
|
||
if(!currentDetail){ return; }
|
||
var el = document.getElementById('detail_barcode_svg');
|
||
if(!el){ return; }
|
||
var mode = $('#detail_barcode_mode').val() || 'besar';
|
||
if(mode === 'kecil' && !currentDetail.hasBreakdown){
|
||
mode = 'besar';
|
||
$('#detail_barcode_mode').val('besar');
|
||
}
|
||
var val = buildBarcodeValueById(currentDetail.id, mode);
|
||
$('#detail_barcode_value').text(val || '-');
|
||
renderBarcodeInto(el, val);
|
||
});
|
||
|
||
$('#btn_detail_print_barcode').on('click', function(){
|
||
if(!currentDetail){ return; }
|
||
var mode = $('#detail_barcode_mode').val() || 'besar';
|
||
if(mode === 'kecil' && !currentDetail.hasBreakdown){
|
||
mode = 'besar';
|
||
}
|
||
var sat = (mode === 'kecil' ? (currentDetail.satuanKecil || currentDetail.satuan) : currentDetail.satuan);
|
||
printBarcode(buildBarcodeValueById(currentDetail.id, mode), currentDetail.jenis, sat);
|
||
});
|
||
$('#btn_detail_quick_masuk').on('click', function(){
|
||
if(!currentDetail){ return; }
|
||
$('#modalDetailBarang').modal('hide');
|
||
$('a[href="#tab_masuk"]').tab('show');
|
||
setSelectByKode('#op_in_pos', currentDetail.kode);
|
||
setTimeout(function(){ $('#op_in_total').focus(); }, 200);
|
||
});
|
||
$('#btn_detail_quick_keluar').on('click', function(){
|
||
if(!currentDetail){ return; }
|
||
$('#modalDetailBarang').modal('hide');
|
||
$('a[href="#tab_keluar"]').tab('show');
|
||
if (window.Livewire && typeof window.Livewire.dispatch === 'function') {
|
||
window.Livewire.dispatch('gudangpos-select', { kode: currentDetail.kode });
|
||
}
|
||
});
|
||
|
||
// DataTable di-init saat tab report dibuka (lihat initJenisTableIfNeeded)
|
||
|
||
$("#btnsimpanjenis").click(function(){
|
||
var val01=document.getElementById('jenis_idne').value;
|
||
var val02=document.getElementById('jenis_deskripsi').value;
|
||
var val03=document.getElementById('jenis_satuan').value;
|
||
var val04=document.getElementById('jenis_konversi_kecil').value;
|
||
var val05='jenis';
|
||
var val06=document.getElementById('jenis_kode').value;
|
||
var val07='';
|
||
var val08=document.getElementById('jenis_satuan_kecil').value;
|
||
var val09=document.getElementById('jenis_konversi_kecil').value;
|
||
var val10=document.getElementById('jenis_stok_minimum').value;
|
||
var val11='besar';
|
||
$("#modaltambahjenisbrg").modal('hide');
|
||
$.post('simbhp/exaddbarang', { _token: token, set01: val01, set02: val02, set03: val03, set04: val04, set05: val05, set06: val06, set07: val07, set08: val08, set09: val09, set10: val10, set11: val11 },
|
||
function(data){
|
||
var status = data.status;
|
||
var message = data.message;
|
||
$.toast({
|
||
heading: status,
|
||
text: message,
|
||
position: 'top-right',
|
||
loaderBg: data.warna,
|
||
icon: data.icon,
|
||
hideAfter: 3000,
|
||
stack: 1
|
||
});
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return false;
|
||
});
|
||
});
|
||
$("#btnsimpanpemasukan").click(function(){
|
||
var val01=document.getElementById('in_deskripsi').value;
|
||
var val02=document.getElementById('in_pos').value;
|
||
var val03=document.getElementById('in_tanggal').value;
|
||
var val04=document.getElementById('in_total').value;
|
||
var val05='pemasukan';
|
||
var val06='';
|
||
var val07='';
|
||
var val08='';
|
||
var val09='';
|
||
var val10='';
|
||
var val11=document.getElementById('in_satuan_transaksi').value;
|
||
var val12=document.getElementById('in_masa_expired').value;
|
||
$.post('simbhp/exaddbarang', { _token: token, set01: val01, set02: val02, set03: val03, set04: val04, set05: val05, set06: val06, set07: val07, set08: val08, set09: val09, set10: val10, set11: val11, set12: val12 },
|
||
function(data){
|
||
$("#modalpemasukan").modal('hide');
|
||
var status = data.status;
|
||
var message = data.message;
|
||
$.toast({
|
||
heading: status,
|
||
text: message,
|
||
position: 'top-right',
|
||
loaderBg: data.warna,
|
||
icon: data.icon,
|
||
hideAfter: 5000,
|
||
stack: 1
|
||
});
|
||
openedpage();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return false;
|
||
});
|
||
});
|
||
$("#btnsimpanpengeluaran").click(function(){
|
||
var val01=document.getElementById('out_deskripsi').value;
|
||
var val02=document.getElementById('out_pos').value;
|
||
var val03=document.getElementById('out_tanggal').value;
|
||
var val04=document.getElementById('out_total').value;
|
||
var val05='pengeluaran';
|
||
var val06='';
|
||
var val07='';
|
||
var val08='';
|
||
var val09='';
|
||
var val10='';
|
||
var val11=document.getElementById('out_satuan_transaksi').value;
|
||
var val12='';
|
||
$.post('simbhp/exaddbarang', { _token: token, set01: val01, set02: val02, set03: val03, set04: val04, set05: val05, set06: val06, set07: val07, set08: val08, set09: val09, set10: val10, set11: val11, set12: val12 },
|
||
function(data){
|
||
$("#modalpengeluaran").modal('hide');
|
||
var status = data.status;
|
||
var message = data.message;
|
||
$.toast({
|
||
heading: status,
|
||
text: message,
|
||
position: 'top-right',
|
||
loaderBg: data.warna,
|
||
icon: data.icon,
|
||
hideAfter: 5000,
|
||
stack: 1
|
||
});
|
||
openedpage();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return false;
|
||
});
|
||
});
|
||
$("#btnsimpanedit").click(function(){
|
||
var val01=document.getElementById('edit_deskripsi').value;
|
||
var val02=document.getElementById('edit_pos').value;
|
||
var val03=document.getElementById('edit_tanggal').value;
|
||
var val04=document.getElementById('edit_total').value;
|
||
var val05='editor';
|
||
var val06=document.getElementById('edit_id').value;
|
||
var val07=document.getElementById('edit_alasan').value;
|
||
var val08='';
|
||
var val09='';
|
||
var val10='';
|
||
var val11='besar';
|
||
var val12=document.getElementById('edit_masa_expired').value;
|
||
$.post('simbhp/exaddbarang', { _token: token, set01: val01, set02: val02, set03: val03, set04: val04, set05: val05, set06: val06, set07: val07, set08: val08, set09: val09, set10: val10, set11: val11, set12: val12 },
|
||
function(data){
|
||
$("#modaleditor").modal('hide');
|
||
var status = data.status;
|
||
var message = data.message;
|
||
$.toast({
|
||
heading: status,
|
||
text: message,
|
||
position: 'top-right',
|
||
loaderBg: data.warna,
|
||
icon: data.icon,
|
||
hideAfter: 5000,
|
||
stack: 1
|
||
});
|
||
openedpage();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return false;
|
||
});
|
||
});
|
||
$("#btnsimpanhapus").click(function(){
|
||
var val01=document.getElementById('edit_deskripsi').value;
|
||
var val02=document.getElementById('edit_pos').value;
|
||
var val03=document.getElementById('edit_tanggal').value;
|
||
var val04=document.getElementById('edit_total').value;
|
||
var val05='hapus';
|
||
var val06=document.getElementById('edit_id').value;
|
||
var val07=document.getElementById('edit_alasan').value;
|
||
var val08='';
|
||
var val09='';
|
||
var val10='';
|
||
var val11='besar';
|
||
var val12='';
|
||
$.post('simbhp/exaddbarang', { _token: token, set01: val01, set02: val02, set03: val03, set04: val04, set05: val05, set06: val06, set07: val07, set08: val08, set09: val09, set10: val10, set11: val11, set12: val12 },
|
||
function(data){
|
||
$("#modaleditor").modal('hide');
|
||
var status = data.status;
|
||
var message = data.message;
|
||
$.toast({
|
||
heading: status,
|
||
text: message,
|
||
position: 'top-right',
|
||
loaderBg: data.warna,
|
||
icon: data.icon,
|
||
hideAfter: 5000,
|
||
stack: 1
|
||
});
|
||
openedpage();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return false;
|
||
});
|
||
});
|
||
$("#btnviewdata").click(function(){
|
||
openedpage();
|
||
});
|
||
$("#in_total").autoNumeric( 'init', {aSep: ',', mDec: '0', vMax: '99999999999999999999999999'} );
|
||
$("#out_total").autoNumeric( 'init', {aSep: ',', mDec: '0', vMax: '99999999999999999999999999'} );
|
||
$("#op_in_total").autoNumeric( 'init', {aSep: ',', mDec: '0', vMax: '99999999999999999999999999'} );
|
||
$("#op_adj_total").autoNumeric( 'init', {aSep: ',', mDec: '0', vMax: '99999999999999999999999999'} );
|
||
|
||
function renderOpInLines(){
|
||
if(!opInLines.length){
|
||
$('#op_in_lines').html('<tr><td colspan="6" class="text-center text-muted">Belum ada item.</td></tr>');
|
||
return;
|
||
}
|
||
var html = '';
|
||
opInLines.forEach(function(line, idx){
|
||
html += '<tr>' +
|
||
'<td class="text-center"><code>' + (line.barcode_value || line.kode || '') + '</code></td>' +
|
||
'<td>' + (line.jenis || '') + '</td>' +
|
||
'<td class="text-right">' + (line.qty || '') + '</td>' +
|
||
'<td class="text-center">' + (line.satuan_transaksi || '') + '</td>' +
|
||
'<td class="text-center">' + (line.masa_expired || '-') + '</td>' +
|
||
'<td class="text-center"><button type="button" class="btn btn-sm btn-danger btn_op_in_remove" data-index="' + idx + '">Hapus</button></td>' +
|
||
'</tr>';
|
||
});
|
||
$('#op_in_lines').html(html);
|
||
}
|
||
|
||
function renderOpAdjLines(){
|
||
if(!opAdjLines.length){
|
||
$('#op_adj_lines').html('<tr><td colspan="6" class="text-center text-muted">Belum ada item.</td></tr>');
|
||
return;
|
||
}
|
||
var html = '';
|
||
opAdjLines.forEach(function(line, idx){
|
||
html += '<tr>' +
|
||
'<td class="text-center"><code>' + (line.barcode_value || line.kode || '') + '</code></td>' +
|
||
'<td>' + escapeHtml(line.jenis || '') + '</td>' +
|
||
'<td>' + escapeHtml(line.note || '-') + '</td>' +
|
||
'<td class="text-right">' + escapeHtml(line.qty || '') + '</td>' +
|
||
'<td class="text-center">' + escapeHtml(line.satuan_transaksi || '') + '</td>' +
|
||
'<td class="text-center"><button type="button" class="btn btn-sm btn-danger btn_op_adj_remove" data-index="' + idx + '">Hapus</button></td>' +
|
||
'</tr>';
|
||
});
|
||
$('#op_adj_lines').html(html);
|
||
}
|
||
|
||
function getSelectedKode(selectId){
|
||
var selected = $(selectId).find('option:selected');
|
||
return normalizeKode(selected.data('kodejenis') || '');
|
||
}
|
||
|
||
$('#op_in_scan').on('keypress', function(e){
|
||
if(e.which === 13){
|
||
e.preventDefault();
|
||
var scanVal = $(this).val();
|
||
var ok = setSelectByKode('#op_in_pos', scanVal);
|
||
$(this).val('');
|
||
if(ok){
|
||
if(ok.mode){
|
||
$('#op_in_satuan_transaksi').val(ok.mode);
|
||
}
|
||
syncOpInSelected();
|
||
setTimeout(function(){ $('#op_in_total').focus(); }, 100);
|
||
}else{
|
||
$.toast({ heading: 'Gagal', text: 'Kode barang tidak ditemukan', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3000, stack: 1 });
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#op_adj_scan').on('keypress', function(e){
|
||
if(e.which === 13){
|
||
e.preventDefault();
|
||
var scanVal = $(this).val();
|
||
var ok = setSelectByKode('#op_adj_pos', scanVal);
|
||
$(this).val('');
|
||
if(ok){
|
||
if(ok.mode){
|
||
$('#op_adj_satuan_transaksi').val(ok.mode);
|
||
}
|
||
syncOpAdjSelected();
|
||
setTimeout(function(){ $('#op_adj_total').focus(); }, 100);
|
||
}else{
|
||
$.toast({ heading: 'Gagal', text: 'Kode barang tidak ditemukan', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3000, stack: 1 });
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#btn_op_in_addline').on('click', function(){
|
||
var jenisSelect = $('#op_in_pos').val();
|
||
var jenis = jenisSelect;
|
||
var kode = '';
|
||
var isNew = false;
|
||
var satuanBesarNew = '';
|
||
var satuanKecilNew = '';
|
||
var konversiNew = 1;
|
||
var stokMinNew = 0;
|
||
|
||
if(jenisSelect === '__NEW__'){
|
||
isNew = true;
|
||
jenis = ($('#op_in_new_jenis').val() || '').toString().trim();
|
||
kode = normalizeKode($('#op_in_kode_barang').val());
|
||
satuanBesarNew = ($('#op_in_new_satuan').val() || '').toString().trim();
|
||
satuanKecilNew = ($('#op_in_new_satuan_kecil').val() || '').toString().trim();
|
||
konversiNew = parseInt($('#op_in_new_konversi').val() || 1, 10);
|
||
stokMinNew = parseInt($('#op_in_new_stok_minimum').val() || 0, 10);
|
||
} else {
|
||
kode = getSelectedKode('#op_in_pos');
|
||
}
|
||
|
||
var qty = $('#op_in_total').val();
|
||
var satuanTransaksi = $('#op_in_satuan_transaksi').val();
|
||
var expired = $('#op_in_masa_expired').val();
|
||
if(!jenis || !qty){
|
||
$.toast({ heading: 'Gagal', text: 'Barang dan jumlah wajib diisi', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3000, stack: 1 });
|
||
return;
|
||
}
|
||
if(isNew){
|
||
if(!kode || kode.length < 2){
|
||
$.toast({ heading: 'Gagal', text: 'Kode barang (internal) barang baru wajib (min 2 karakter)', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3500, stack: 1 });
|
||
return;
|
||
}
|
||
if(!satuanBesarNew){
|
||
$.toast({ heading: 'Gagal', text: 'Satuan besar barang baru wajib diisi', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3500, stack: 1 });
|
||
return;
|
||
}
|
||
if(satuanKecilNew !== '' && (!konversiNew || konversiNew <= 1)){
|
||
$.toast({ heading: 'Gagal', text: 'Jika memakai satuan kecil, konversi harus > 1', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3500, stack: 1 });
|
||
return;
|
||
}
|
||
if(satuanTransaksi === 'kecil' && satuanKecilNew === ''){
|
||
$.toast({ heading: 'Gagal', text: 'Satuan transaksi kecil dipilih, tapi satuan kecil barang baru belum diisi', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3500, stack: 1 });
|
||
return;
|
||
}
|
||
}
|
||
|
||
var barcodeValue = '';
|
||
var jenisId = null;
|
||
if(!isNew){
|
||
var selected = $('#op_in_pos option:selected');
|
||
jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
barcodeValue = buildBarcodeValueById(jenisId, satuanTransaksi);
|
||
}
|
||
opInLines.push({
|
||
jenis_id: jenisId,
|
||
kode: kode,
|
||
barcode_value: barcodeValue,
|
||
jenis: jenis,
|
||
qty: qty,
|
||
satuan_transaksi: satuanTransaksi,
|
||
masa_expired: expired,
|
||
is_new: isNew,
|
||
new_satuan: satuanBesarNew,
|
||
new_satuan_kecil: satuanKecilNew,
|
||
new_konversi: konversiNew,
|
||
new_stok_minimum: stokMinNew
|
||
});
|
||
$('#op_in_total').val('');
|
||
$('#op_in_masa_expired').val('');
|
||
renderOpInLines();
|
||
});
|
||
|
||
$(document).on('click', '.btn_op_in_remove', function(){
|
||
var idx = parseInt($(this).data('index'), 10);
|
||
if(!isNaN(idx)){ opInLines.splice(idx, 1); renderOpInLines(); }
|
||
});
|
||
|
||
$('#btn_op_adj_addline').on('click', function(){
|
||
var jenis = $('#op_adj_pos').val();
|
||
var qty = $('#op_adj_total').val();
|
||
var satuanTransaksi = $('#op_adj_satuan_transaksi').val();
|
||
var note = ($('#op_adj_note').val() || '').toString().trim();
|
||
var kode = getSelectedKode('#op_adj_pos');
|
||
var selected = $('#op_adj_pos option:selected');
|
||
var jenisId = parseInt(selected.data('jenisid') || 0, 10);
|
||
var barcodeValue = buildBarcodeValueById(jenisId, satuanTransaksi);
|
||
|
||
if(!jenis || !qty){
|
||
$.toast({ heading: 'Gagal', text: 'Barang dan jumlah wajib diisi', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 3000, stack: 1 });
|
||
return;
|
||
}
|
||
|
||
opAdjLines.push({
|
||
jenis: jenis,
|
||
kode: kode,
|
||
barcode_value: barcodeValue,
|
||
qty: qty,
|
||
satuan_transaksi: satuanTransaksi,
|
||
note: note
|
||
});
|
||
$('#op_adj_total').val('');
|
||
renderOpAdjLines();
|
||
});
|
||
|
||
$(document).on('click', '.btn_op_adj_remove', function(){
|
||
var idx = parseInt($(this).data('index'), 10);
|
||
if(!isNaN(idx)){ opAdjLines.splice(idx, 1); renderOpAdjLines(); }
|
||
});
|
||
|
||
function runBatchPost(lines, buildPayload, onDone){
|
||
var i = 0;
|
||
function next(){
|
||
if(i >= lines.length){
|
||
onDone(true);
|
||
return;
|
||
}
|
||
var payload = buildPayload(lines[i]);
|
||
i++;
|
||
$.ajax({ url: 'simbhp/exaddbarang', method: 'POST', data: payload })
|
||
.done(function(resp){
|
||
if(resp && resp.status && resp.status.toString().toLowerCase() !== 'success'){
|
||
onDone(false, resp && resp.message ? resp.message : 'Gagal menyimpan');
|
||
return;
|
||
}
|
||
next();
|
||
})
|
||
.fail(function(){
|
||
onDone(false, 'Request gagal');
|
||
});
|
||
}
|
||
next();
|
||
}
|
||
|
||
$('#btn_op_in_commit').on('click', function(){
|
||
if(!opInLines.length){
|
||
$.toast({ heading: 'Info', text: 'Daftar barang masuk masih kosong', position: 'top-right', loaderBg: '#3b98b5', icon: 'info', hideAfter: 2500, stack: 1 });
|
||
return;
|
||
}
|
||
var supplier = $('#op_in_supplier').val();
|
||
var tanggal = $('#op_in_tanggal').val();
|
||
var $btn = $(this);
|
||
$btn.prop('disabled', true).text('Menyimpan...');
|
||
|
||
var i = 0;
|
||
function next(){
|
||
if(i >= opInLines.length){
|
||
$btn.prop('disabled', false).text('Simpan Semua Barang Masuk');
|
||
$.toast({ heading: 'Success', text: 'Barang masuk berhasil disimpan', position: 'top-right', loaderBg: '#5ba035', icon: 'success', hideAfter: 2500, stack: 1 });
|
||
opInLines = [];
|
||
renderOpInLines();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return;
|
||
}
|
||
|
||
var line = opInLines[i];
|
||
i++;
|
||
|
||
function postPemasukan(){
|
||
$.ajax({
|
||
url: 'simbhp/exaddbarang',
|
||
method: 'POST',
|
||
data: {
|
||
_token: token,
|
||
set01: supplier,
|
||
set02: line.jenis,
|
||
set03: tanggal,
|
||
set04: line.qty,
|
||
set05: 'pemasukan',
|
||
set06: '',
|
||
set07: '',
|
||
set08: '',
|
||
set09: '',
|
||
set10: '',
|
||
set11: line.satuan_transaksi,
|
||
set12: line.masa_expired
|
||
}
|
||
}).done(function(resp){
|
||
if(resp && resp.status && resp.status.toString().toLowerCase() !== 'success'){
|
||
$btn.prop('disabled', false).text('Simpan Semua Barang Masuk');
|
||
$.toast({ heading: 'Gagal', text: (resp && resp.message) ? resp.message : 'Gagal menyimpan', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
return;
|
||
}
|
||
next();
|
||
}).fail(function(){
|
||
$btn.prop('disabled', false).text('Simpan Semua Barang Masuk');
|
||
$.toast({ heading: 'Gagal', text: 'Request gagal', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
});
|
||
}
|
||
|
||
if(line.is_new){
|
||
$.ajax({
|
||
url: 'simbhp/exaddbarang',
|
||
method: 'POST',
|
||
data: {
|
||
_token: token,
|
||
set01: 'new',
|
||
set02: line.jenis,
|
||
set03: line.new_satuan,
|
||
set04: line.new_konversi,
|
||
set05: 'jenis',
|
||
set06: line.kode,
|
||
set07: '',
|
||
set08: line.new_satuan_kecil,
|
||
set09: line.new_konversi,
|
||
set10: line.new_stok_minimum,
|
||
set11: 'besar'
|
||
}
|
||
}).done(function(resp){
|
||
if(resp && resp.status && resp.status.toString().toLowerCase() !== 'success'){
|
||
$btn.prop('disabled', false).text('Simpan Semua Barang Masuk');
|
||
$.toast({ heading: 'Gagal', text: (resp && resp.message) ? resp.message : 'Gagal membuat barang baru', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
return;
|
||
}
|
||
postPemasukan();
|
||
}).fail(function(){
|
||
$btn.prop('disabled', false).text('Simpan Semua Barang Masuk');
|
||
$.toast({ heading: 'Gagal', text: 'Request gagal', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
});
|
||
} else {
|
||
postPemasukan();
|
||
}
|
||
}
|
||
|
||
next();
|
||
});
|
||
|
||
$('#btn_op_adj_commit').on('click', function(){
|
||
if(!opAdjLines.length){
|
||
$.toast({ heading: 'Info', text: 'Daftar pengurangan stok masih kosong', position: 'top-right', loaderBg: '#3b98b5', icon: 'info', hideAfter: 2500, stack: 1 });
|
||
return;
|
||
}
|
||
|
||
var tanggal = $('#op_adj_tanggal').val();
|
||
var $btn = $(this);
|
||
$btn.prop('disabled', true).text('Menyimpan...');
|
||
|
||
var i = 0;
|
||
function nextAdj(){
|
||
if(i >= opAdjLines.length){
|
||
$btn.prop('disabled', false).text('Simpan Semua Pengurangan Stok');
|
||
$.toast({ heading: 'Success', text: 'Pengurangan stok opname berhasil disimpan', position: 'top-right', loaderBg: '#5ba035', icon: 'success', hideAfter: 2500, stack: 1 });
|
||
opAdjLines = [];
|
||
renderOpAdjLines();
|
||
if(typeof window.gudangRefresh === 'function'){
|
||
window.gudangRefresh();
|
||
}
|
||
return;
|
||
}
|
||
|
||
var line = opAdjLines[i];
|
||
i++;
|
||
|
||
$.ajax({
|
||
url: 'simbhp/exaddbarang',
|
||
method: 'POST',
|
||
data: {
|
||
_token: token,
|
||
set01: 'hilang',
|
||
set02: line.jenis,
|
||
set03: tanggal,
|
||
set04: line.qty,
|
||
set05: 'opname_pengurangan',
|
||
set06: '',
|
||
set07: line.note,
|
||
set08: '',
|
||
set09: '',
|
||
set10: '',
|
||
set11: line.satuan_transaksi,
|
||
set12: ''
|
||
}
|
||
}).done(function(resp){
|
||
if(resp && resp.status && resp.status.toString().toLowerCase() !== 'success'){
|
||
$btn.prop('disabled', false).text('Simpan Semua Pengurangan Stok');
|
||
$.toast({ heading: 'Gagal', text: (resp && resp.message) ? resp.message : 'Gagal menyimpan', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
return;
|
||
}
|
||
nextAdj();
|
||
}).fail(function(){
|
||
$btn.prop('disabled', false).text('Simpan Semua Pengurangan Stok');
|
||
$.toast({ heading: 'Gagal', text: 'Request gagal', position: 'top-right', loaderBg: '#bf441d', icon: 'error', hideAfter: 4500, stack: 1 });
|
||
});
|
||
}
|
||
|
||
nextAdj();
|
||
});
|
||
|
||
renderOpInLines();
|
||
renderOpAdjLines();
|
||
$('#btnexportreport').click(function(){
|
||
var gridContent = $("#gridreportblnini").jqxGrid('exportdata', 'json');
|
||
data = $.parseJSON(gridContent);
|
||
var noOfContacts = data.length;
|
||
if(noOfContacts>0){
|
||
var table = document.createElement("table");
|
||
table.style.width = '100%';
|
||
table.setAttribute('border', '1');
|
||
table.setAttribute('cellspacing', '0');
|
||
table.setAttribute('cellpadding', '5');
|
||
table.setAttribute('id', 'tabelcetak');
|
||
table.setAttribute('class', 'text');
|
||
var col = [];
|
||
for (var i = 0; i < noOfContacts; i++) {
|
||
for (var key in data[i]) {
|
||
if (col.indexOf(key) === -1) {
|
||
col.push(key);
|
||
}
|
||
}
|
||
}
|
||
var tHead = document.createElement("thead");
|
||
var hRow = document.createElement("tr");
|
||
for (var i = 0; i < col.length; i++) {
|
||
var th = document.createElement("th");
|
||
th.innerHTML = col[i];
|
||
hRow.appendChild(th);
|
||
}
|
||
tHead.appendChild(hRow);
|
||
table.appendChild(tHead);
|
||
var tBody = document.createElement("tbody");
|
||
for (var i = 0; i < noOfContacts; i++) {
|
||
var bRow = document.createElement("tr");
|
||
for (var j = 0; j < col.length; j++) {
|
||
var td = document.createElement("td");
|
||
td.setAttribute('style', 'mso-number-format: "\@";');
|
||
td.innerHTML = data[i][col[j]];
|
||
bRow.appendChild(td);
|
||
}
|
||
tBody.appendChild(bRow)
|
||
}
|
||
table.appendChild(tBody);
|
||
var divContainer = document.getElementById("tabel_cetak");
|
||
divContainer.innerHTML = "";
|
||
divContainer.appendChild(table);
|
||
}
|
||
$("#tabel_cetak").btechco_excelexport({
|
||
containerid: "tabel_cetak"
|
||
, datatype: $datatype.Table
|
||
});
|
||
});
|
||
});
|
||
</script>
|
||
@endpush
|