Files
CKB/app/Http/Controllers/WarehouseManagement/StocksController.php
2025-06-10 18:38:06 +07:00

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]);
}
}