117 lines
3.8 KiB
PHP
117 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\WarehouseManagement;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Dealer;
|
|
use App\Models\Product;
|
|
use App\Models\Stock;
|
|
use App\Models\StockLog;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class StocksController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
if ($request->ajax()) {
|
|
$query = Stock::with(['dealer', 'product'])
|
|
->when($request->dealer_id, function($q) use ($request) {
|
|
return $q->where('dealer_id', $request->dealer_id);
|
|
})
|
|
->when($request->product_id, function($q) use ($request) {
|
|
return $q->where('product_id', $request->product_id);
|
|
});
|
|
|
|
return datatables()->of($query)
|
|
->addColumn('dealer_name', function($stock) {
|
|
return $stock->dealer->name;
|
|
})
|
|
->addColumn('product_name', function($stock) {
|
|
return $stock->product->name;
|
|
})
|
|
->addColumn('action', function($stock) {
|
|
return view('warehouse_management.stocks._action', compact('stock'));
|
|
})
|
|
->toJson();
|
|
}
|
|
|
|
$dealers = Dealer::all();
|
|
$products = Product::where('active', true)->get();
|
|
|
|
return view('warehouse_management.stocks.index', compact('dealers', 'products'));
|
|
}
|
|
|
|
public function adjust(Request $request)
|
|
{
|
|
$request->validate([
|
|
'stock_id' => 'required|exists:stocks,id',
|
|
'type' => 'required|in:add,reduce',
|
|
'quantity' => 'required|numeric|min:0.01',
|
|
'note' => 'required|string|max:255'
|
|
]);
|
|
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$stock = Stock::findOrFail($request->stock_id);
|
|
$oldQuantity = $stock->quantity;
|
|
|
|
// Calculate new quantity
|
|
$change = $request->type === 'add' ? $request->quantity : -$request->quantity;
|
|
$newQuantity = $oldQuantity + $change;
|
|
|
|
// Update stock
|
|
$stock->update(['quantity' => $newQuantity]);
|
|
|
|
// Log the change
|
|
StockLog::create([
|
|
'stock_id' => $stock->id,
|
|
'user_id' => Auth::id(),
|
|
'old_quantity' => $oldQuantity,
|
|
'new_quantity' => $newQuantity,
|
|
'change' => $change,
|
|
'note' => $request->note,
|
|
'reference_type' => 'manual_adjustment'
|
|
]);
|
|
|
|
DB::commit();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Stok berhasil diadjust'
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Gagal mengadjust stok: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
public function history(Request $request)
|
|
{
|
|
$request->validate([
|
|
'stock_id' => 'required|exists:stocks,id'
|
|
]);
|
|
|
|
$logs = StockLog::with('user')
|
|
->where('stock_id', $request->stock_id)
|
|
->orderBy('created_at', 'desc')
|
|
->get()
|
|
->map(function($log) {
|
|
return [
|
|
'date' => $log->created_at->format('d/m/Y H:i'),
|
|
'user' => $log->user->name,
|
|
'change' => $log->change > 0 ? '+' . $log->change : $log->change,
|
|
'old_quantity' => $log->old_quantity,
|
|
'new_quantity' => $log->new_quantity,
|
|
'note' => $log->note
|
|
];
|
|
});
|
|
|
|
return response()->json(['logs' => $logs]);
|
|
}
|
|
}
|