create stock and stock logs
This commit is contained in:
117
app/Http/Controllers/WarehouseManagement/StocksController.php
Normal file
117
app/Http/Controllers/WarehouseManagement/StocksController.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?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]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user