258 lines
5.3 KiB
Markdown
258 lines
5.3 KiB
Markdown
# Audit Histori Stock
|
|
|
|
## Deskripsi
|
|
|
|
Fitur Audit Histori Stock memungkinkan untuk melacak semua perubahan stock yang terjadi di sistem. Setiap kali ada perubahan stock (penambahan, pengurangan, penyesuaian), sistem akan mencatat detail perubahan tersebut untuk keperluan audit.
|
|
|
|
## Fitur Utama
|
|
|
|
### 1. Tracking Otomatis
|
|
|
|
- Sistem otomatis mencatat setiap perubahan stock
|
|
- Mencatat stock sebelum dan sesudah perubahan
|
|
- Mencatat sumber perubahan (mutasi, opname, dll)
|
|
- Mencatat user yang melakukan perubahan
|
|
- Mencatat timestamp perubahan
|
|
|
|
### 2. Filter dan Pencarian
|
|
|
|
- Filter berdasarkan dealer
|
|
- Filter berdasarkan produk
|
|
- Filter berdasarkan jenis perubahan
|
|
- Filter berdasarkan tanggal
|
|
- Pencarian realtime pada semua kolom
|
|
|
|
### 3. Detail Audit
|
|
|
|
- Informasi lengkap perubahan stock
|
|
- Detail sumber perubahan (mutasi/opname)
|
|
- History user yang melakukan aksi
|
|
- Catatan dan keterangan perubahan
|
|
|
|
### 4. Export Data
|
|
|
|
- Export ke Excel
|
|
- Export ke PDF
|
|
- Data yang diekspor dapat disesuaikan
|
|
|
|
## Jenis Perubahan Stock
|
|
|
|
### 1. Penambahan (Increase)
|
|
|
|
- Stock bertambah dari transaksi
|
|
- Biasanya dari mutasi masuk atau opname correction
|
|
|
|
### 2. Pengurangan (Decrease)
|
|
|
|
- Stock berkurang dari transaksi
|
|
- Biasanya dari mutasi keluar atau penjualan
|
|
|
|
### 3. Penyesuaian (Adjustment)
|
|
|
|
- Penyesuaian stock dari opname
|
|
- Koreksi stock manual
|
|
|
|
### 4. Tidak Ada Perubahan (No Change)
|
|
|
|
- Record dibuat tapi tidak ada perubahan quantity
|
|
- Biasanya untuk tracking purpose
|
|
|
|
## Cara Menggunakan
|
|
|
|
### 1. Akses Menu
|
|
|
|
```
|
|
Warehouse -> Stock Audit
|
|
```
|
|
|
|
### 2. Menggunakan Filter
|
|
|
|
```javascript
|
|
// Filter dealer
|
|
$("#filter-dealer").val("Nama Dealer");
|
|
|
|
// Filter produk
|
|
$("#filter-product").val("Nama Produk");
|
|
|
|
// Filter jenis perubahan
|
|
$("#filter-change-type").val("increase"); // increase, decrease, adjustment, no_change
|
|
|
|
// Filter tanggal
|
|
$("#filter-date").val("2024-01-15");
|
|
|
|
// Reset semua filter
|
|
$("#reset-filters").click();
|
|
```
|
|
|
|
### 3. Melihat Detail
|
|
|
|
```javascript
|
|
// Klik tombol Detail pada baris data
|
|
showAuditDetail(stockLogId);
|
|
```
|
|
|
|
## Setup dan Instalasi
|
|
|
|
### 1. Setup Menu dan Privileges
|
|
|
|
```bash
|
|
php artisan setup:stock-audit-menu
|
|
```
|
|
|
|
### 2. Atau Menggunakan Seeder
|
|
|
|
```bash
|
|
php artisan db:seed --class=StockAuditMenuSeeder
|
|
```
|
|
|
|
## Struktur Data
|
|
|
|
### Model yang Terlibat
|
|
|
|
- **StockLog**: Record audit perubahan stock
|
|
- **Stock**: Data stock utama
|
|
- **Product**: Data produk
|
|
- **Dealer**: Data dealer
|
|
- **User**: Data user
|
|
- **Mutation**: Data mutasi stock
|
|
- **StockOpname**: Data opname stock
|
|
|
|
### Relasi Database
|
|
|
|
```php
|
|
StockLog belongsTo Stock
|
|
StockLog belongsTo User
|
|
StockLog morphTo Source (Mutation, StockOpname, etc)
|
|
Stock belongsTo Product
|
|
Stock belongsTo Dealer
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### 1. Index (List Data)
|
|
|
|
```
|
|
GET /warehouse/stock-audit
|
|
```
|
|
|
|
### 2. Detail Audit
|
|
|
|
```
|
|
GET /warehouse/stock-audit/{stockLog}/detail
|
|
```
|
|
|
|
## Kustomisasi
|
|
|
|
### 1. Menambah Jenis Perubahan
|
|
|
|
Edit enum `StockChangeType`:
|
|
|
|
```php
|
|
// app/Enums/StockChangeType.php
|
|
case NEW_TYPE = 'new_type';
|
|
|
|
public function label(): string
|
|
{
|
|
return match($this) {
|
|
// ... existing cases
|
|
self::NEW_TYPE => 'Label Baru',
|
|
};
|
|
}
|
|
```
|
|
|
|
### 2. Menambah Filter Custom
|
|
|
|
Edit controller dan view untuk menambah filter baru:
|
|
|
|
```php
|
|
// Controller
|
|
->filterColumn('new_field', function($query, $keyword) {
|
|
$query->where('new_field', 'like', "%{$keyword}%");
|
|
})
|
|
|
|
// View
|
|
<select class="form-select" id="filter-new-field">
|
|
<option value="">Semua</option>
|
|
// ... options
|
|
</select>
|
|
```
|
|
|
|
### 3. Kustomisasi Export
|
|
|
|
Edit DataTables buttons untuk menyesuaikan kolom export:
|
|
|
|
```javascript
|
|
exportOptions: {
|
|
columns: [1, 2, 3, 4, 5, 6, 7, 8]; // Sesuaikan kolom yang ingin diekspor
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### 1. Menu Tidak Muncul
|
|
|
|
- Pastikan menu sudah di-setup dengan benar
|
|
- Cek privileges user untuk menu stock-audit.index
|
|
- Cek role user memiliki akses view = 1
|
|
|
|
### 2. Data Tidak Muncul
|
|
|
|
- Cek apakah ada data StockLog di database
|
|
- Cek filter yang aktive
|
|
- Cek permission user untuk melihat data dealer tertentu
|
|
|
|
### 3. Detail Tidak Loading
|
|
|
|
- Cek URL endpoint `/warehouse/stock-audit/{id}/detail`
|
|
- Cek network tab di browser untuk error response
|
|
- Cek log Laravel untuk error detail
|
|
|
|
## Keamanan
|
|
|
|
### 1. Filter Berdasarkan Role
|
|
|
|
- User dengan `dealer_id` hanya melihat data dealer mereka
|
|
- Admin dapat melihat semua data
|
|
|
|
### 2. View-Only Access
|
|
|
|
- Menu ini adalah read-only
|
|
- Tidak ada aksi create, update, atau delete
|
|
- Hanya viewing dan export yang diizinkan
|
|
|
|
### 3. Audit Trail
|
|
|
|
- Setiap akses audit log dapat di-track
|
|
- User activity dapat dimonitor
|
|
- Data tidak dapat dimanipulasi
|
|
|
|
## Performance Tips
|
|
|
|
### 1. Index Database
|
|
|
|
Pastikan ada index pada kolom yang sering difilter:
|
|
|
|
```sql
|
|
-- Index untuk performance
|
|
CREATE INDEX idx_stock_logs_created_at ON stock_logs(created_at);
|
|
CREATE INDEX idx_stock_logs_change_type ON stock_logs(change_type);
|
|
CREATE INDEX idx_stock_logs_stock_id ON stock_logs(stock_id);
|
|
```
|
|
|
|
### 2. Pagination
|
|
|
|
- DataTables menggunakan server-side processing
|
|
- Default page length: 25 records
|
|
- Dapat disesuaikan sesuai kebutuhan
|
|
|
|
### 3. Caching
|
|
|
|
Jika data sangat besar, pertimbangkan untuk menambah caching:
|
|
|
|
```php
|
|
// Cache dealer dan product data
|
|
$dealers = Cache::remember('dealers_for_audit', 3600, function () {
|
|
return Dealer::all();
|
|
});
|
|
```
|