98 lines
3.4 KiB
PHP
98 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\WarehouseManagement;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Dealer;
|
|
use App\Models\Menu;
|
|
use App\Models\Opname;
|
|
use App\Models\OpnameDetail;
|
|
use App\Models\Product;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
|
|
class OpnamesController extends Controller
|
|
{
|
|
public function index(Request $request){
|
|
$menu = Menu::where('link','opnames.index')->first();
|
|
if($request->ajax()){
|
|
$data = Opname::with('user','dealer');
|
|
return DataTables::of($data)
|
|
->addIndexColumn()
|
|
->addColumn('user_name', function ($row){
|
|
return $row->user ? $row->user->name : '-';
|
|
})
|
|
->addColumn('dealer_name', function ($row){
|
|
return $row->dealer ? $row->dealer->name : '-';
|
|
})
|
|
->addColumn('action', function ($row) use ($menu) {
|
|
$btn = '<div class="d-flex">';
|
|
|
|
$btn .= '<button class="btn btn-sm btn-secondary btn-product-stock-dealers">Detail</button>';
|
|
|
|
$btn .= '</div>';
|
|
|
|
return $btn;
|
|
})
|
|
->rawColumns(['action'])
|
|
->make(true);
|
|
}
|
|
|
|
return view('warehouse_management.opnames.index');
|
|
}
|
|
|
|
public function create(){
|
|
try{
|
|
$dealers = Dealer::all();
|
|
$products = Product::all();
|
|
return view('warehouse_management.opnames.create', compact('dealers','products'));
|
|
}catch(\Exception $ex){
|
|
Log::error($ex->getMessage());
|
|
}
|
|
}
|
|
|
|
public function store(Request $request){
|
|
try{
|
|
$request->validate([
|
|
'dealer' => 'required|exists:dealers,id',
|
|
'product' => 'required|array',
|
|
'product.*' => 'nullable|exists:products,id',
|
|
'system_quantity' => 'required|array',
|
|
'physical_quantity' => 'required|array',
|
|
]);
|
|
|
|
// 1. Create Opname master record
|
|
$opname = Opname::create([
|
|
'dealer_id' => $request->dealer,
|
|
'opname_date' => now(), // or $request->opname_date if you provide it
|
|
'user_id' => auth()->id(), // assuming the user is logged in
|
|
'note' => null, // or $request->note if needed
|
|
]);
|
|
|
|
// 2. Loop over products to create OpnameDetails
|
|
foreach ($request->product as $index => $productId) {
|
|
if (!$productId) continue; // Skip empty rows
|
|
|
|
$system = $request->system_quantity[$index] ?? 0;
|
|
$physical = $request->physical_quantity[$index] ?? 0;
|
|
|
|
OpnameDetail::create([
|
|
'opname_id' => $opname->id,
|
|
'product_id' => $productId,
|
|
'system_stock' => $system,
|
|
'physical_stock' => $physical,
|
|
'difference' => $physical - $system,
|
|
'note' => null, // or include from input
|
|
]);
|
|
}
|
|
|
|
return redirect()->route('opnames.index')
|
|
->with('success', 'Opname berhasil disimpan.');
|
|
}catch(\Exception $ex){
|
|
Log::error($ex->getMessage());
|
|
}
|
|
}
|
|
}
|