From a881779c4fedeb4b9389020d1027fe178a6fd51c Mon Sep 17 00:00:00 2001 From: arifal Date: Mon, 2 Jun 2025 18:51:04 +0700 Subject: [PATCH] partial update create toggle active product and mutations --- .../ProductsController.php | 137 +++++++++++++++--- .../StockMutationsController.php | 41 ++++++ app/Models/Product.php | 2 +- app/Models/StockMutation.php | 35 +++++ app/Models/StockOpname.php | 36 +++++ ...02_162509_create_stock_mutations_table.php | 37 +++++ ...6_02_162952_create_stock_opnames_table.php | 38 +++++ ...6_02_173028_add_unit_to_products_table.php | 32 ++++ ...02_180058_add_active_to_products_table.php | 32 ++++ database/seeders/MenuSeeder.php | 4 + .../js/warehouse_management/products/edit.js | 2 +- .../js/warehouse_management/products/index.js | 2 +- .../stock_mutations/index.js | 32 ++++ public/mix-manifest.json | 1 + .../js/warehouse_management/products/index.js | 35 +++++ .../stock_mutations/index.js | 0 .../products/create.blade.php | 5 + .../products/edit.blade.php | 5 + .../products/index.blade.php | 1 + .../stock_mutations/index.blade.php | 47 ++++++ routes/web.php | 5 +- webpack.mix.js | 4 + 22 files changed, 512 insertions(+), 21 deletions(-) create mode 100644 app/Http/Controllers/WarehouseManagement/StockMutationsController.php create mode 100644 app/Models/StockMutation.php create mode 100644 app/Models/StockOpname.php create mode 100644 database/migrations/2025_06_02_162509_create_stock_mutations_table.php create mode 100644 database/migrations/2025_06_02_162952_create_stock_opnames_table.php create mode 100644 database/migrations/2025_06_02_173028_add_unit_to_products_table.php create mode 100644 database/migrations/2025_06_02_180058_add_active_to_products_table.php create mode 100644 public/js/warehouse_management/stock_mutations/index.js create mode 100644 resources/js/warehouse_management/stock_mutations/index.js create mode 100644 resources/views/warehouse_management/stock_mutations/index.blade.php diff --git a/app/Http/Controllers/WarehouseManagement/ProductsController.php b/app/Http/Controllers/WarehouseManagement/ProductsController.php index ae6372b..1d91d35 100644 --- a/app/Http/Controllers/WarehouseManagement/ProductsController.php +++ b/app/Http/Controllers/WarehouseManagement/ProductsController.php @@ -7,10 +7,12 @@ use App\Models\Dealer; use App\Models\Menu; use App\Models\Product; use App\Models\ProductCategory; +use App\Models\StockMutation; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Yajra\DataTables\Facades\DataTables; +use Illuminate\Validation\Rule; class ProductsController extends Controller { @@ -37,13 +39,18 @@ class ProductsController extends Controller ->addColumn('action', function ($row) use ($menu) { $btn = '
'; - if (Auth::user()->can('delete', $menu)) { - $btn .= ''; - } + // if (Auth::user()->can('delete', $menu)) { + // $btn .= ''; + // } if (Auth::user()->can('update', $menu)) { - $btn .= 'Edit'; + $btn .= 'Edit'; } + + $btn .= ''; $btn .= '
'; @@ -76,9 +83,15 @@ class ProductsController extends Controller public function store(Request $request) { $request->validate([ - 'code' => 'required|string|unique:products,code', + 'code' => [ + 'required', + 'string', + Rule::unique('products')->whereNull('deleted_at'), + ], 'name' => 'required|string', 'description' => 'nullable|string', + 'unit' => 'nullable|string', + 'active' => 'required|boolean', 'product_category_id' => 'required|exists:product_categories,id', 'dealer_stock' => 'nullable|array', 'dealer_stock.*.dealer_id' => 'required|exists:dealers,id', @@ -89,19 +102,33 @@ class ProductsController extends Controller $product = Product::create([ 'code' => $request->code, 'name' => $request->name, + 'unit' => $request->unit, 'description' => $request->description, 'product_category_id' => $request->product_category_id, ]); - // Prepare dealer stock for pivot + // Prepare dealer stock for pivot and create mutation records $pivotData = []; if ($request->has('dealer_stock')) { foreach ($request->dealer_stock as $stockData) { if (empty($stockData['dealer_id']) || !isset($stockData['quantity'])) continue; - - $pivotData[$stockData['dealer_id']] = ['quantity' => $stockData['quantity']]; + + $dealerId = $stockData['dealer_id']; + $quantity = $stockData['quantity']; + + $pivotData[$dealerId] = ['quantity' => $quantity]; + + // Create stock mutation for initial stock "in" + StockMutation::create([ + 'product_id' => $product->id, + 'dealer_id' => $dealerId, + 'mutation_type' => 'in', // karena ini penambahan stok awal + 'quantity' => $quantity, + 'description' => 'Initial stock added when product created', + 'user_id' => Auth::id(), + ]); } - + // Attach dealer stock using pivot table $product->dealers()->attach($pivotData); } @@ -146,28 +173,75 @@ class ProductsController extends Controller public function update(Request $request, Product $product) { $request->validate([ - 'code' => 'required|string|unique:products,code,' . $product->id, + 'code' => [ + 'required', + 'string', + Rule::unique('products')->ignore($product->id)->whereNull('deleted_at'), + ], 'name' => 'required|string', 'description' => 'nullable|string', + 'unit' => 'nullable|string', + 'active' => 'required|boolean', 'product_category_id' => 'required|exists:product_categories,id', 'dealer_stock' => 'nullable|array', 'dealer_stock.*.dealer_id' => 'required|exists:dealers,id', 'dealer_stock.*.quantity' => 'required|integer|min:0', ]); - $product->update($request->only(['code', 'name', 'description', 'product_category_id'])); + $product->update($request->only(['code', 'name', 'description', 'unit', 'product_category_id'])); - // Prepare pivot sync data + // Ambil stok lama dari pivot + $oldStocks = $product->dealers()->pluck('quantity', 'dealer_id')->toArray(); + + // Data baru untuk sync pivot $syncData = []; + + $newStocks = []; if ($request->has('dealer_stock')) { foreach ($request->dealer_stock as $item) { - $syncData[$item['dealer_id']] = ['quantity' => $item['quantity']]; + $dealerId = $item['dealer_id']; + $newQty = $item['quantity']; + $syncData[$dealerId] = ['quantity' => $newQty]; + $newStocks[$dealerId] = $newQty; } } - // Sync with pivot table + // Sync pivot table $product->dealers()->sync($syncData); + // Hitung mutasi stok (selisih) + // Mutasi stok untuk stok baru atau perubahan stok + foreach ($newStocks as $dealerId => $newQty) { + $oldQty = $oldStocks[$dealerId] ?? 0; + $diff = $newQty - $oldQty; + + if ($diff != 0) { + StockMutation::create([ + 'product_id' => $product->id, + 'dealer_id' => $dealerId, + 'mutation_type' => $diff > 0 ? 'in' : 'out', + 'quantity' => abs($diff), + 'description' => 'Stock updated via product update', + 'user_id' => auth()->id(), + ]); + } + } + + // Mutasi stok untuk dealer yang dihapus (stok jadi 0) + $deletedDealers = array_diff_key($oldStocks, $newStocks); + foreach ($deletedDealers as $dealerId => $oldQty) { + if ($oldQty > 0) { + StockMutation::create([ + 'product_id' => $product->id, + 'dealer_id' => $dealerId, + 'mutation_type' => 'out', + 'quantity' => $oldQty, + 'description' => 'Stock removed via product update (dealer removed)', + 'user_id' => auth()->id(), + ]); + } + } + return redirect()->route('products.index')->with('success', 'Produk berhasil diperbarui.'); } @@ -179,12 +253,41 @@ class ProductsController extends Controller */ public function destroy(Product $product) { - // Detach all dealer relationships (optional if using cascade on delete) + // Ambil stok pivot sebelum hapus + $dealerStocks = $product->dealers()->pluck('quantity', 'dealer_id')->toArray(); + + // Buat mutasi stok keluar (out) untuk semua stok yang dihapus + foreach ($dealerStocks as $dealerId => $qty) { + if ($qty > 0) { + StockMutation::create([ + 'product_id' => $product->id, + 'dealer_id' => $dealerId, + 'mutation_type' => 'out', + 'quantity' => $qty, + 'description' => 'Stock removed due to product deletion', + 'user_id' => auth()->id(), + ]); + } + } + + // Hapus pivot stok dealer $product->dealers()->detach(); - // Delete the product + // Hapus produk $product->delete(); - return response()->json(['success' => true, 'message' => 'Produk berhasil dihapus.']); + return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus.'); + } + public function toggleActive(Request $request, Product $product) + { + // You can add authorization here + $product->active = !$product->active; + $product->save(); + + return response()->json([ + 'success' => true, + 'active' => $product->active, + 'message' => 'Status produk berhasil diperbarui.' + ]); } } diff --git a/app/Http/Controllers/WarehouseManagement/StockMutationsController.php b/app/Http/Controllers/WarehouseManagement/StockMutationsController.php new file mode 100644 index 0000000..d2c3c20 --- /dev/null +++ b/app/Http/Controllers/WarehouseManagement/StockMutationsController.php @@ -0,0 +1,41 @@ +ajax()) { + $query = StockMutation::with(['product', 'dealer', 'user']); + + return DataTables::of($query) + ->addIndexColumn() + ->addColumn('product_name', function ($row) { + return $row->product ? $row->product->name : '-'; + }) + ->addColumn('dealer_name', function ($row) { + return $row->dealer ? $row->dealer->name : '-'; + }) + ->addColumn('user_name', function ($row) { + return $row->user ? $row->user->name : '-'; + }) + ->addColumn('mutation_type_label', function ($row) { + return $row->mutation_type == 'in' + ? 'Masuk' + : 'Keluar'; + }) + ->editColumn('created_at', function ($row) { + return $row->created_at->format('d M Y H:i'); + }) + ->rawColumns(['mutation_type_label']) + ->make(true); + } + + return view('warehouse_management.stock_mutations.index'); + } +} diff --git a/app/Models/Product.php b/app/Models/Product.php index eb7392f..5034d7e 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -10,7 +10,7 @@ class Product extends Model { use HasFactory, SoftDeletes; - protected $fillable = ['code','name','description','product_category_id']; + protected $fillable = ['code','name','description','unit','active','product_category_id']; public function category(){ return $this->belongsTo(ProductCategory::class, 'product_category_id'); diff --git a/app/Models/StockMutation.php b/app/Models/StockMutation.php new file mode 100644 index 0000000..62b24bc --- /dev/null +++ b/app/Models/StockMutation.php @@ -0,0 +1,35 @@ +belongsTo(Product::class); + } + + public function dealer() + { + return $this->belongsTo(Dealer::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/StockOpname.php b/app/Models/StockOpname.php new file mode 100644 index 0000000..44da6bc --- /dev/null +++ b/app/Models/StockOpname.php @@ -0,0 +1,36 @@ +belongsTo(Product::class); + } + + public function dealer() + { + return $this->belongsTo(Dealer::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/database/migrations/2025_06_02_162509_create_stock_mutations_table.php b/database/migrations/2025_06_02_162509_create_stock_mutations_table.php new file mode 100644 index 0000000..0ba67d1 --- /dev/null +++ b/database/migrations/2025_06_02_162509_create_stock_mutations_table.php @@ -0,0 +1,37 @@ +id(); + $table->foreignId('product_id')->constrained()->onDelete('cascade'); + $table->foreignId('dealer_id')->constrained()->onDelete('cascade'); + $table->enum('mutation_type',['in','out','adjustment']); + $table->integer('quantity'); + $table->text('description')->nullable(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('stock_mutations'); + } +} diff --git a/database/migrations/2025_06_02_162952_create_stock_opnames_table.php b/database/migrations/2025_06_02_162952_create_stock_opnames_table.php new file mode 100644 index 0000000..ce9d145 --- /dev/null +++ b/database/migrations/2025_06_02_162952_create_stock_opnames_table.php @@ -0,0 +1,38 @@ +id(); + $table->foreignId('product_id')->constrained()->onDelete('cascade'); + $table->foreignId('dealer_id')->constrained()->onDelete('cascade'); + $table->integer('system_quantity'); + $table->integer('physical_quantity'); + $table->integer('difference'); + $table->date('opname_date'); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('stock_opnames'); + } +} diff --git a/database/migrations/2025_06_02_173028_add_unit_to_products_table.php b/database/migrations/2025_06_02_173028_add_unit_to_products_table.php new file mode 100644 index 0000000..72d8d53 --- /dev/null +++ b/database/migrations/2025_06_02_173028_add_unit_to_products_table.php @@ -0,0 +1,32 @@ +string('unit')->nullable()->after('description'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('products', function (Blueprint $table) { + $table->dropColumn('unit'); + }); + } +} diff --git a/database/migrations/2025_06_02_180058_add_active_to_products_table.php b/database/migrations/2025_06_02_180058_add_active_to_products_table.php new file mode 100644 index 0000000..c6d0004 --- /dev/null +++ b/database/migrations/2025_06_02_180058_add_active_to_products_table.php @@ -0,0 +1,32 @@ +boolean('active')->default(true)->after('unit'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('products', function (Blueprint $table) { + $table->dropColumn('active'); + }); + } +} diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php index 8c67eaf..98100cc 100644 --- a/database/seeders/MenuSeeder.php +++ b/database/seeders/MenuSeeder.php @@ -22,6 +22,10 @@ class MenuSeeder extends Seeder [ 'name' => 'Kategori Produk', 'link' => 'product_categories.index' + ], + [ + 'name' => 'Mutasi Produk', + 'link' => 'mutations.index' ] ]; diff --git a/public/js/warehouse_management/products/edit.js b/public/js/warehouse_management/products/edit.js index ad8b808..19e1850 100644 --- a/public/js/warehouse_management/products/edit.js +++ b/public/js/warehouse_management/products/edit.js @@ -15,7 +15,7 @@ \************************************************************/ /***/ (() => { -eval("document.addEventListener(\"DOMContentLoaded\", function () {\n var dealerRowContainer = document.getElementById(\"dynamicDealerRows\");\n var addDealerButton = document.getElementById(\"addDealerRow\"); // Initial index from existing dealer rows\n\n var rowIndex = dealerRowContainer.querySelectorAll(\".dealer-stock-row\").length;\n addDealerButton.addEventListener(\"click\", function () {\n var newRow = document.createElement(\"div\");\n newRow.className = \"form-group row align-items-center dealer-stock-row\";\n newRow.innerHTML = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n
\\n \");\n dealerRowContainer.appendChild(newRow);\n rowIndex++;\n }); // Handle removal of dealer row\n\n dealerRowContainer.addEventListener(\"click\", function (event) {\n if (event.target && event.target.classList.contains(\"remove-dealer-row\")) {\n event.target.closest(\".dealer-stock-row\").remove();\n }\n }); // Function to generate dealer \");\n }).join(\"\");\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvZWRpdC5qcy5qcyIsIm5hbWVzIjpbImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImRlYWxlclJvd0NvbnRhaW5lciIsImdldEVsZW1lbnRCeUlkIiwiYWRkRGVhbGVyQnV0dG9uIiwicm93SW5kZXgiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwibmV3Um93IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImlubmVySFRNTCIsImdlbmVyYXRlRGVhbGVyT3B0aW9ucyIsImFwcGVuZENoaWxkIiwiZXZlbnQiLCJ0YXJnZXQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImNsb3Nlc3QiLCJyZW1vdmUiLCJkZWFsZXJEYXRhRGl2IiwiZGVhbGVycyIsIkpTT04iLCJwYXJzZSIsImdldEF0dHJpYnV0ZSIsIm1hcCIsImQiLCJpZCIsIm5hbWUiLCJqb2luIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvZWRpdC5qcz81YTM4Il0sInNvdXJjZXNDb250ZW50IjpbImRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGVhbGVyUm93Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkeW5hbWljRGVhbGVyUm93c1wiKTtcbiAgICBsZXQgYWRkRGVhbGVyQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhZGREZWFsZXJSb3dcIik7XG5cbiAgICAvLyBJbml0aWFsIGluZGV4IGZyb20gZXhpc3RpbmcgZGVhbGVyIHJvd3NcbiAgICBsZXQgcm93SW5kZXggPVxuICAgICAgICBkZWFsZXJSb3dDb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcIi5kZWFsZXItc3RvY2stcm93XCIpLmxlbmd0aDtcblxuICAgIGFkZERlYWxlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBuZXdSb3cuY2xhc3NOYW1lID0gXCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZGVhbGVyLXN0b2NrLXJvd1wiO1xuICAgICAgICBuZXdSb3cuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJkZWFsZXJfc3RvY2tbJHtyb3dJbmRleH1dW2RlYWxlcl9pZF1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFBpbGloIERlYWxlciAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgJHtnZW5lcmF0ZURlYWxlck9wdGlvbnMoKX1cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmFtZT1cImRlYWxlcl9zdG9ja1ske3Jvd0luZGV4fV1bcXVhbnRpdHldXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2YWx1ZT1cIjFcIiBtaW49XCIxXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJKdW1sYWggU3Rva1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIHJlbW92ZS1kZWFsZXItcm93XCI+IEhhcHVzIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgICAgZGVhbGVyUm93Q29udGFpbmVyLmFwcGVuZENoaWxkKG5ld1Jvdyk7XG4gICAgICAgIHJvd0luZGV4Kys7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgcmVtb3ZhbCBvZiBkZWFsZXIgcm93XG4gICAgZGVhbGVyUm93Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICYmXG4gICAgICAgICAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVtb3ZlLWRlYWxlci1yb3dcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5kZWFsZXItc3RvY2stcm93XCIpLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBkZWFsZXIgPG9wdGlvbj4gZWxlbWVudHMgZHluYW1pY2FsbHlcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZURlYWxlck9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGRlYWxlckRhdGFEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlYWxlckRhdGFcIik7XG4gICAgICAgIGNvbnN0IGRlYWxlcnMgPSBKU09OLnBhcnNlKGRlYWxlckRhdGFEaXYuZ2V0QXR0cmlidXRlKFwiZGF0YS1kZWFsZXJzXCIpKTtcbiAgICAgICAgcmV0dXJuIGRlYWxlcnNcbiAgICAgICAgICAgIC5tYXAoKGQpID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtkLmlkfVwiPiR7ZC5uYW1lfTwvb3B0aW9uPmApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLFFBQVEsQ0FBQ0MsZ0JBQVQsQ0FBMEIsa0JBQTFCLEVBQThDLFlBQVk7RUFDdEQsSUFBSUMsa0JBQWtCLEdBQUdGLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixtQkFBeEIsQ0FBekI7RUFDQSxJQUFJQyxlQUFlLEdBQUdKLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixjQUF4QixDQUF0QixDQUZzRCxDQUl0RDs7RUFDQSxJQUFJRSxRQUFRLEdBQ1JILGtCQUFrQixDQUFDSSxnQkFBbkIsQ0FBb0MsbUJBQXBDLEVBQXlEQyxNQUQ3RDtFQUdBSCxlQUFlLENBQUNILGdCQUFoQixDQUFpQyxPQUFqQyxFQUEwQyxZQUFZO0lBQ2xELElBQU1PLE1BQU0sR0FBR1IsUUFBUSxDQUFDUyxhQUFULENBQXVCLEtBQXZCLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxTQUFQLEdBQW1CLG9EQUFuQjtJQUNBRixNQUFNLENBQUNHLFNBQVAsNkZBRW1DTixRQUZuQyx5SUFJWU8scUJBQXFCLEVBSmpDLHVKQVFnRFAsUUFSaEQ7SUFjQUgsa0JBQWtCLENBQUNXLFdBQW5CLENBQStCTCxNQUEvQjtJQUNBSCxRQUFRO0VBQ1gsQ0FuQkQsRUFSc0QsQ0E2QnREOztFQUNBSCxrQkFBa0IsQ0FBQ0QsZ0JBQW5CLENBQW9DLE9BQXBDLEVBQTZDLFVBQVVhLEtBQVYsRUFBaUI7SUFDMUQsSUFDSUEsS0FBSyxDQUFDQyxNQUFOLElBQ0FELEtBQUssQ0FBQ0MsTUFBTixDQUFhQyxTQUFiLENBQXVCQyxRQUF2QixDQUFnQyxtQkFBaEMsQ0FGSixFQUdFO01BQ0VILEtBQUssQ0FBQ0MsTUFBTixDQUFhRyxPQUFiLENBQXFCLG1CQUFyQixFQUEwQ0MsTUFBMUM7SUFDSDtFQUNKLENBUEQsRUE5QnNELENBdUN0RDs7RUFDQSxTQUFTUCxxQkFBVCxHQUFpQztJQUM3QixJQUFNUSxhQUFhLEdBQUdwQixRQUFRLENBQUNHLGNBQVQsQ0FBd0IsWUFBeEIsQ0FBdEI7SUFDQSxJQUFNa0IsT0FBTyxHQUFHQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0gsYUFBYSxDQUFDSSxZQUFkLENBQTJCLGNBQTNCLENBQVgsQ0FBaEI7SUFDQSxPQUFPSCxPQUFPLENBQ1RJLEdBREUsQ0FDRSxVQUFDQyxDQUFEO01BQUEsaUNBQXlCQSxDQUFDLENBQUNDLEVBQTNCLGdCQUFrQ0QsQ0FBQyxDQUFDRSxJQUFwQztJQUFBLENBREYsRUFFRkMsSUFGRSxDQUVHLEVBRkgsQ0FBUDtFQUdIO0FBQ0osQ0EvQ0QifQ==\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/edit.js\n"); +eval("document.addEventListener(\"DOMContentLoaded\", function () {\n var dealerRowContainer = document.getElementById(\"dynamicDealerRows\");\n var addDealerButton = document.getElementById(\"addDealerRow\"); // Initial index from existing dealer rows\n\n var rowIndex = dealerRowContainer.querySelectorAll(\".dealer-stock-row\").length;\n addDealerButton.addEventListener(\"click\", function () {\n var newRow = document.createElement(\"div\");\n newRow.className = \"form-group row align-items-center dealer-stock-row\";\n newRow.innerHTML = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n
\\n \");\n dealerRowContainer.appendChild(newRow);\n rowIndex++;\n }); // Handle removal of dealer row\n\n dealerRowContainer.addEventListener(\"click\", function (event) {\n if (event.target && event.target.classList.contains(\"remove-dealer-row\")) {\n event.target.closest(\".dealer-stock-row\").remove();\n }\n }); // Function to generate dealer \");\n }).join(\"\");\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJkZWFsZXJSb3dDb250YWluZXIiLCJnZXRFbGVtZW50QnlJZCIsImFkZERlYWxlckJ1dHRvbiIsInJvd0luZGV4IiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsIm5ld1JvdyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJpbm5lckhUTUwiLCJnZW5lcmF0ZURlYWxlck9wdGlvbnMiLCJhcHBlbmRDaGlsZCIsImV2ZW50IiwidGFyZ2V0IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJjbG9zZXN0IiwicmVtb3ZlIiwiZGVhbGVyRGF0YURpdiIsImRlYWxlcnMiLCJKU09OIiwicGFyc2UiLCJnZXRBdHRyaWJ1dGUiLCJtYXAiLCJkIiwiaWQiLCJuYW1lIiwiam9pbiJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvZWRpdC5qcz81YTM4Il0sInNvdXJjZXNDb250ZW50IjpbImRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGVhbGVyUm93Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkeW5hbWljRGVhbGVyUm93c1wiKTtcbiAgICBsZXQgYWRkRGVhbGVyQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhZGREZWFsZXJSb3dcIik7XG5cbiAgICAvLyBJbml0aWFsIGluZGV4IGZyb20gZXhpc3RpbmcgZGVhbGVyIHJvd3NcbiAgICBsZXQgcm93SW5kZXggPVxuICAgICAgICBkZWFsZXJSb3dDb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcIi5kZWFsZXItc3RvY2stcm93XCIpLmxlbmd0aDtcblxuICAgIGFkZERlYWxlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBuZXdSb3cuY2xhc3NOYW1lID0gXCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZGVhbGVyLXN0b2NrLXJvd1wiO1xuICAgICAgICBuZXdSb3cuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJkZWFsZXJfc3RvY2tbJHtyb3dJbmRleH1dW2RlYWxlcl9pZF1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFBpbGloIERlYWxlciAtLTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgJHtnZW5lcmF0ZURlYWxlck9wdGlvbnMoKX1cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmFtZT1cImRlYWxlcl9zdG9ja1ske3Jvd0luZGV4fV1bcXVhbnRpdHldXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB2YWx1ZT1cIjFcIiBtaW49XCIxXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJKdW1sYWggU3Rva1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIHJlbW92ZS1kZWFsZXItcm93XCI+IEhhcHVzIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgICAgZGVhbGVyUm93Q29udGFpbmVyLmFwcGVuZENoaWxkKG5ld1Jvdyk7XG4gICAgICAgIHJvd0luZGV4Kys7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgcmVtb3ZhbCBvZiBkZWFsZXIgcm93XG4gICAgZGVhbGVyUm93Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICYmXG4gICAgICAgICAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVtb3ZlLWRlYWxlci1yb3dcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5kZWFsZXItc3RvY2stcm93XCIpLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBkZWFsZXIgPG9wdGlvbj4gZWxlbWVudHMgZHluYW1pY2FsbHlcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZURlYWxlck9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGRlYWxlckRhdGFEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlYWxlckRhdGFcIik7XG4gICAgICAgIGNvbnN0IGRlYWxlcnMgPSBKU09OLnBhcnNlKGRlYWxlckRhdGFEaXYuZ2V0QXR0cmlidXRlKFwiZGF0YS1kZWFsZXJzXCIpKTtcbiAgICAgICAgcmV0dXJuIGRlYWxlcnNcbiAgICAgICAgICAgIC5tYXAoKGQpID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtkLmlkfVwiPiR7ZC5uYW1lfTwvb3B0aW9uPmApXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLFFBQVEsQ0FBQ0MsZ0JBQVQsQ0FBMEIsa0JBQTFCLEVBQThDLFlBQVk7RUFDdEQsSUFBSUMsa0JBQWtCLEdBQUdGLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixtQkFBeEIsQ0FBekI7RUFDQSxJQUFJQyxlQUFlLEdBQUdKLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixjQUF4QixDQUF0QixDQUZzRCxDQUl0RDs7RUFDQSxJQUFJRSxRQUFRLEdBQ1JILGtCQUFrQixDQUFDSSxnQkFBbkIsQ0FBb0MsbUJBQXBDLEVBQXlEQyxNQUQ3RDtFQUdBSCxlQUFlLENBQUNILGdCQUFoQixDQUFpQyxPQUFqQyxFQUEwQyxZQUFZO0lBQ2xELElBQU1PLE1BQU0sR0FBR1IsUUFBUSxDQUFDUyxhQUFULENBQXVCLEtBQXZCLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxTQUFQLEdBQW1CLG9EQUFuQjtJQUNBRixNQUFNLENBQUNHLFNBQVAsNkZBRW1DTixRQUZuQyx5SUFJWU8scUJBQXFCLEVBSmpDLHVKQVFnRFAsUUFSaEQ7SUFjQUgsa0JBQWtCLENBQUNXLFdBQW5CLENBQStCTCxNQUEvQjtJQUNBSCxRQUFRO0VBQ1gsQ0FuQkQsRUFSc0QsQ0E2QnREOztFQUNBSCxrQkFBa0IsQ0FBQ0QsZ0JBQW5CLENBQW9DLE9BQXBDLEVBQTZDLFVBQVVhLEtBQVYsRUFBaUI7SUFDMUQsSUFDSUEsS0FBSyxDQUFDQyxNQUFOLElBQ0FELEtBQUssQ0FBQ0MsTUFBTixDQUFhQyxTQUFiLENBQXVCQyxRQUF2QixDQUFnQyxtQkFBaEMsQ0FGSixFQUdFO01BQ0VILEtBQUssQ0FBQ0MsTUFBTixDQUFhRyxPQUFiLENBQXFCLG1CQUFyQixFQUEwQ0MsTUFBMUM7SUFDSDtFQUNKLENBUEQsRUE5QnNELENBdUN0RDs7RUFDQSxTQUFTUCxxQkFBVCxHQUFpQztJQUM3QixJQUFNUSxhQUFhLEdBQUdwQixRQUFRLENBQUNHLGNBQVQsQ0FBd0IsWUFBeEIsQ0FBdEI7SUFDQSxJQUFNa0IsT0FBTyxHQUFHQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0gsYUFBYSxDQUFDSSxZQUFkLENBQTJCLGNBQTNCLENBQVgsQ0FBaEI7SUFDQSxPQUFPSCxPQUFPLENBQ1RJLEdBREUsQ0FDRSxVQUFDQyxDQUFEO01BQUEsaUNBQXlCQSxDQUFDLENBQUNDLEVBQTNCLGdCQUFrQ0QsQ0FBQyxDQUFDRSxJQUFwQztJQUFBLENBREYsRUFFRkMsSUFGRSxDQUVHLEVBRkgsQ0FBUDtFQUdIO0FBQ0osQ0EvQ0QiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvZWRpdC5qcy5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/edit.js\n"); /***/ }) diff --git a/public/js/warehouse_management/products/index.js b/public/js/warehouse_management/products/index.js index 3805235..2765602 100644 --- a/public/js/warehouse_management/products/index.js +++ b/public/js/warehouse_management/products/index.js @@ -15,7 +15,7 @@ \*************************************************************/ /***/ (() => { -eval("$.ajaxSetup({\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\")\n }\n});\nvar tableContainer = $(\"#products-table\");\nvar url = tableContainer.data(\"url\");\nvar table = $(\"#products-table\").DataTable({\n processing: true,\n serverSide: true,\n ajax: url,\n columns: [{\n data: \"code\",\n name: \"code\"\n }, {\n data: \"name\",\n name: \"name\"\n }, {\n data: \"category_name\",\n name: \"category.name\"\n }, {\n data: \"total_stock\",\n name: \"total_stock\"\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }]\n});\n$(document).on(\"click\", \".btn-destroy-product\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus produk?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var _url = $(_this).data(\"action\");\n\n $.ajax({\n url: _url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n alert(\"Produk berhasil dihapus.\");\n $(\"#products-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menghapus produk.\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvaW5kZXguanMuanMiLCJuYW1lcyI6WyIkIiwiYWpheFNldHVwIiwiaGVhZGVycyIsImF0dHIiLCJ0YWJsZUNvbnRhaW5lciIsInVybCIsImRhdGEiLCJ0YWJsZSIsIkRhdGFUYWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsImNvbHVtbnMiLCJuYW1lIiwib3JkZXJhYmxlIiwic2VhcmNoYWJsZSIsImRvY3VtZW50Iiwib24iLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsInNob3dDYW5jZWxCdXR0b24iLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjYW5jZWxCdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwidGhlbiIsInJlc3VsdCIsInZhbHVlIiwibWV0aG9kIiwiX21ldGhvZCIsIl90b2tlbiIsInN1Y2Nlc3MiLCJhbGVydCIsInJlbG9hZCIsImVycm9yIiwieGhyIiwiY29uc29sZSIsInJlc3BvbnNlVGV4dCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L3Byb2R1Y3RzL2luZGV4LmpzP2ZjZDYiXSwic291cmNlc0NvbnRlbnQiOlsiJC5hamF4U2V0dXAoe1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJYLUNTUkYtVE9LRU5cIjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgIH0sXG59KTtcbmxldCB0YWJsZUNvbnRhaW5lciA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIik7XG5sZXQgdXJsID0gdGFibGVDb250YWluZXIuZGF0YShcInVybFwiKTtcbmxldCB0YWJsZSA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgIHNlcnZlclNpZGU6IHRydWUsXG4gICAgYWpheDogdXJsLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBkYXRhOiBcImNvZGVcIiwgbmFtZTogXCJjb2RlXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcIm5hbWVcIiwgbmFtZTogXCJuYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcImNhdGVnb3J5X25hbWVcIiwgbmFtZTogXCJjYXRlZ29yeS5uYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcInRvdGFsX3N0b2NrXCIsIG5hbWU6IFwidG90YWxfc3RvY2tcIiB9LFxuICAgICAgICB7IGRhdGE6IFwiYWN0aW9uXCIsIG5hbWU6IFwiYWN0aW9uXCIsIG9yZGVyYWJsZTogZmFsc2UsIHNlYXJjaGFibGU6IGZhbHNlIH0sXG4gICAgXSxcbn0pO1xuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1kZXN0cm95LXByb2R1Y3RcIiwgZnVuY3Rpb24gKCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkhhcHVzIHByb2R1az9cIixcbiAgICAgICAgdGV4dDogXCJBbmRhIHRpZGFrIGFrYW4gYmlzYSBtZW5nZW1iYWxpa2FubnlhIVwiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZGVkZWRlXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIkhhcHVzXCIsXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICQodGhpcykuZGF0YShcImFjdGlvblwiKTtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIF9tZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlByb2R1ayBiZXJoYXNpbCBkaWhhcHVzLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0cy10YWJsZVwiKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJHYWdhbCBtZW5naGFwdXMgcHJvZHVrLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQUEsQ0FBQyxDQUFDQyxTQUFGLENBQVk7RUFDUkMsT0FBTyxFQUFFO0lBQ0wsZ0JBQWdCRixDQUFDLENBQUMseUJBQUQsQ0FBRCxDQUE2QkcsSUFBN0IsQ0FBa0MsU0FBbEM7RUFEWDtBQURELENBQVo7QUFLQSxJQUFJQyxjQUFjLEdBQUdKLENBQUMsQ0FBQyxpQkFBRCxDQUF0QjtBQUNBLElBQUlLLEdBQUcsR0FBR0QsY0FBYyxDQUFDRSxJQUFmLENBQW9CLEtBQXBCLENBQVY7QUFDQSxJQUFJQyxLQUFLLEdBQUdQLENBQUMsQ0FBQyxpQkFBRCxDQUFELENBQXFCUSxTQUFyQixDQUErQjtFQUN2Q0MsVUFBVSxFQUFFLElBRDJCO0VBRXZDQyxVQUFVLEVBQUUsSUFGMkI7RUFHdkNDLElBQUksRUFBRU4sR0FIaUM7RUFJdkNPLE9BQU8sRUFBRSxDQUNMO0lBQUVOLElBQUksRUFBRSxNQUFSO0lBQWdCTyxJQUFJLEVBQUU7RUFBdEIsQ0FESyxFQUVMO0lBQUVQLElBQUksRUFBRSxNQUFSO0lBQWdCTyxJQUFJLEVBQUU7RUFBdEIsQ0FGSyxFQUdMO0lBQUVQLElBQUksRUFBRSxlQUFSO0lBQXlCTyxJQUFJLEVBQUU7RUFBL0IsQ0FISyxFQUlMO0lBQUVQLElBQUksRUFBRSxhQUFSO0lBQXVCTyxJQUFJLEVBQUU7RUFBN0IsQ0FKSyxFQUtMO0lBQUVQLElBQUksRUFBRSxRQUFSO0lBQWtCTyxJQUFJLEVBQUUsUUFBeEI7SUFBa0NDLFNBQVMsRUFBRSxLQUE3QztJQUFvREMsVUFBVSxFQUFFO0VBQWhFLENBTEs7QUFKOEIsQ0FBL0IsQ0FBWjtBQWFBZixDQUFDLENBQUNnQixRQUFELENBQUQsQ0FBWUMsRUFBWixDQUFlLE9BQWYsRUFBd0Isc0JBQXhCLEVBQWdELFlBQVk7RUFBQTs7RUFDeERDLElBQUksQ0FBQ0MsSUFBTCxDQUFVO0lBQ05DLEtBQUssRUFBRSxlQUREO0lBRU5DLElBQUksRUFBRSx3Q0FGQTtJQUdOQyxnQkFBZ0IsRUFBRSxJQUhaO0lBSU5DLGtCQUFrQixFQUFFLE1BSmQ7SUFLTkMsaUJBQWlCLEVBQUUsU0FMYjtJQU1OQyxpQkFBaUIsRUFBRTtFQU5iLENBQVYsRUFPR0MsSUFQSCxDQU9RLFVBQUNDLE1BQUQsRUFBWTtJQUNoQixJQUFJQSxNQUFNLENBQUNDLEtBQVgsRUFBa0I7TUFDZCxJQUFNdkIsSUFBRyxHQUFHTCxDQUFDLENBQUMsS0FBRCxDQUFELENBQVFNLElBQVIsQ0FBYSxRQUFiLENBQVo7O01BQ0FOLENBQUMsQ0FBQ1csSUFBRixDQUFPO1FBQ0hOLEdBQUcsRUFBRUEsSUFERjtRQUVId0IsTUFBTSxFQUFFLE1BRkw7UUFHSHZCLElBQUksRUFBRTtVQUNGd0IsT0FBTyxFQUFFLFFBRFA7VUFFRkMsTUFBTSxFQUFFL0IsQ0FBQyxDQUFDLHlCQUFELENBQUQsQ0FBNkJHLElBQTdCLENBQWtDLFNBQWxDO1FBRk4sQ0FISDtRQU9INkIsT0FBTyxFQUFFLG1CQUFZO1VBQ2pCQyxLQUFLLENBQUMsMEJBQUQsQ0FBTDtVQUNBakMsQ0FBQyxDQUFDLGlCQUFELENBQUQsQ0FBcUJRLFNBQXJCLEdBQWlDRyxJQUFqQyxDQUFzQ3VCLE1BQXRDO1FBQ0gsQ0FWRTtRQVdIQyxLQUFLLEVBQUUsZUFBVUMsR0FBVixFQUFlO1VBQ2xCSCxLQUFLLENBQUMseUJBQUQsQ0FBTDtVQUNBSSxPQUFPLENBQUNGLEtBQVIsQ0FBY0MsR0FBRyxDQUFDRSxZQUFsQjtRQUNIO01BZEUsQ0FBUDtJQWdCSDtFQUNKLENBM0JEO0FBNEJILENBN0JEIn0=\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/index.js\n"); +eval("$.ajaxSetup({\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\")\n }\n});\nvar tableContainer = $(\"#products-table\");\nvar url = tableContainer.data(\"url\");\nvar table = $(\"#products-table\").DataTable({\n processing: true,\n serverSide: true,\n ajax: url,\n columns: [{\n data: \"code\",\n name: \"code\"\n }, {\n data: \"name\",\n name: \"name\"\n }, {\n data: \"category_name\",\n name: \"category.name\"\n }, {\n data: \"unit\",\n name: \"unit\"\n }, {\n data: \"total_stock\",\n name: \"total_stock\"\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }]\n});\n$(document).on(\"click\", \".btn-destroy-product\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus produk?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var _url = $(_this).data(\"action\");\n\n $.ajax({\n url: _url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n alert(\"Produk berhasil dihapus.\");\n $(\"#products-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menghapus produk.\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});\n$(document).on(\"click\", \".btn-toggle-active\", function () {\n var button = $(this);\n var url = button.data(\"url\");\n Swal.fire({\n title: \"Status produk?\",\n text: \"Anda yakin ingin mengganti status produk!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Ya\"\n }).then(function (result) {\n if (result.value) {\n $.ajax({\n url: url,\n method: \"POST\",\n data: {\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success(response) {\n if (response.success) {\n $(\"#products-table\").DataTable().ajax.reload(null, false);\n alert(response.message);\n }\n },\n error: function error() {\n alert(\"Gagal mengubah status produk.\");\n }\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvaW5kZXguanMuanMiLCJuYW1lcyI6WyIkIiwiYWpheFNldHVwIiwiaGVhZGVycyIsImF0dHIiLCJ0YWJsZUNvbnRhaW5lciIsInVybCIsImRhdGEiLCJ0YWJsZSIsIkRhdGFUYWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsImNvbHVtbnMiLCJuYW1lIiwib3JkZXJhYmxlIiwic2VhcmNoYWJsZSIsImRvY3VtZW50Iiwib24iLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsInNob3dDYW5jZWxCdXR0b24iLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjYW5jZWxCdXR0b25Db2xvciIsImNvbmZpcm1CdXR0b25UZXh0IiwidGhlbiIsInJlc3VsdCIsInZhbHVlIiwibWV0aG9kIiwiX21ldGhvZCIsIl90b2tlbiIsInN1Y2Nlc3MiLCJhbGVydCIsInJlbG9hZCIsImVycm9yIiwieGhyIiwiY29uc29sZSIsInJlc3BvbnNlVGV4dCIsImJ1dHRvbiIsInJlc3BvbnNlIiwibWVzc2FnZSJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L3Byb2R1Y3RzL2luZGV4LmpzP2ZjZDYiXSwic291cmNlc0NvbnRlbnQiOlsiJC5hamF4U2V0dXAoe1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJYLUNTUkYtVE9LRU5cIjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgIH0sXG59KTtcbmxldCB0YWJsZUNvbnRhaW5lciA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIik7XG5sZXQgdXJsID0gdGFibGVDb250YWluZXIuZGF0YShcInVybFwiKTtcbmxldCB0YWJsZSA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgIHNlcnZlclNpZGU6IHRydWUsXG4gICAgYWpheDogdXJsLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBkYXRhOiBcImNvZGVcIiwgbmFtZTogXCJjb2RlXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcIm5hbWVcIiwgbmFtZTogXCJuYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcImNhdGVnb3J5X25hbWVcIiwgbmFtZTogXCJjYXRlZ29yeS5uYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcInVuaXRcIiwgbmFtZTogXCJ1bml0XCIgfSxcbiAgICAgICAgeyBkYXRhOiBcInRvdGFsX3N0b2NrXCIsIG5hbWU6IFwidG90YWxfc3RvY2tcIiB9LFxuICAgICAgICB7IGRhdGE6IFwiYWN0aW9uXCIsIG5hbWU6IFwiYWN0aW9uXCIsIG9yZGVyYWJsZTogZmFsc2UsIHNlYXJjaGFibGU6IGZhbHNlIH0sXG4gICAgXSxcbn0pO1xuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1kZXN0cm95LXByb2R1Y3RcIiwgZnVuY3Rpb24gKCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkhhcHVzIHByb2R1az9cIixcbiAgICAgICAgdGV4dDogXCJBbmRhIHRpZGFrIGFrYW4gYmlzYSBtZW5nZW1iYWxpa2FubnlhIVwiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZGVkZWRlXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIkhhcHVzXCIsXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICQodGhpcykuZGF0YShcImFjdGlvblwiKTtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIF9tZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgICAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlByb2R1ayBiZXJoYXNpbCBkaWhhcHVzLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0cy10YWJsZVwiKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJHYWdhbCBtZW5naGFwdXMgcHJvZHVrLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5idG4tdG9nZ2xlLWFjdGl2ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGJ1dHRvbiA9ICQodGhpcyk7XG4gICAgbGV0IHVybCA9IGJ1dHRvbi5kYXRhKFwidXJsXCIpO1xuXG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgdGl0bGU6IFwiU3RhdHVzIHByb2R1az9cIixcbiAgICAgICAgdGV4dDogXCJBbmRhIHlha2luIGluZ2luIG1lbmdnYW50aSBzdGF0dXMgcHJvZHVrIVwiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZGVkZWRlXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIllhXCIsXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIF90b2tlbjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI3Byb2R1Y3RzLXRhYmxlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRhdGFUYWJsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFqYXgucmVsb2FkKG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIkdhZ2FsIG1lbmd1YmFoIHN0YXR1cyBwcm9kdWsuXCIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFD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\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/index.js\n"); /***/ }) diff --git a/public/js/warehouse_management/stock_mutations/index.js b/public/js/warehouse_management/stock_mutations/index.js new file mode 100644 index 0000000..595a39e --- /dev/null +++ b/public/js/warehouse_management/stock_mutations/index.js @@ -0,0 +1,32 @@ +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./resources/js/warehouse_management/stock_mutations/index.js": +/*!********************************************************************!*\ + !*** ./resources/js/warehouse_management/stock_mutations/index.js ***! + \********************************************************************/ +/***/ (() => { + +eval("//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9zdG9ja19tdXRhdGlvbnMvaW5kZXguanM/OGNlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIiXSwibWFwcGluZ3MiOiIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvc3RvY2tfbXV0YXRpb25zL2luZGV4LmpzLmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/stock_mutations/index.js\n"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval-source-map devtool is used. +/******/ var __webpack_exports__ = {}; +/******/ __webpack_modules__["./resources/js/warehouse_management/stock_mutations/index.js"](); +/******/ +/******/ })() +; \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 619cc73..480162f 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -4,5 +4,6 @@ "/js/warehouse_management/products/index.js": "/js/warehouse_management/products/index.js", "/js/warehouse_management/products/create.js": "/js/warehouse_management/products/create.js", "/js/warehouse_management/products/edit.js": "/js/warehouse_management/products/edit.js", + "/js/warehouse_management/stock_mutations/index.js": "/js/warehouse_management/stock_mutations/index.js", "/css/app.css": "/css/app.css" } diff --git a/resources/js/warehouse_management/products/index.js b/resources/js/warehouse_management/products/index.js index 5d35582..63f6ff3 100644 --- a/resources/js/warehouse_management/products/index.js +++ b/resources/js/warehouse_management/products/index.js @@ -13,6 +13,7 @@ let table = $("#products-table").DataTable({ { data: "code", name: "code" }, { data: "name", name: "name" }, { data: "category_name", name: "category.name" }, + { data: "unit", name: "unit" }, { data: "total_stock", name: "total_stock" }, { data: "action", name: "action", orderable: false, searchable: false }, ], @@ -48,3 +49,37 @@ $(document).on("click", ".btn-destroy-product", function () { } }); }); +$(document).on("click", ".btn-toggle-active", function () { + let button = $(this); + let url = button.data("url"); + + Swal.fire({ + title: "Status produk?", + text: "Anda yakin ingin mengganti status produk!", + showCancelButton: true, + confirmButtonColor: "#d33", + cancelButtonColor: "#dedede", + confirmButtonText: "Ya", + }).then((result) => { + if (result.value) { + $.ajax({ + url: url, + method: "POST", + data: { + _token: $('meta[name="csrf-token"]').attr("content"), + }, + success: function (response) { + if (response.success) { + $("#products-table") + .DataTable() + .ajax.reload(null, false); + alert(response.message); + } + }, + error: function () { + alert("Gagal mengubah status produk."); + }, + }); + } + }); +}); diff --git a/resources/js/warehouse_management/stock_mutations/index.js b/resources/js/warehouse_management/stock_mutations/index.js new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/warehouse_management/products/create.blade.php b/resources/views/warehouse_management/products/create.blade.php index 16ee38b..883f507 100644 --- a/resources/views/warehouse_management/products/create.blade.php +++ b/resources/views/warehouse_management/products/create.blade.php @@ -26,6 +26,11 @@ +
+ + +
+
diff --git a/resources/views/warehouse_management/products/edit.blade.php b/resources/views/warehouse_management/products/edit.blade.php index f711f5e..c027ee3 100644 --- a/resources/views/warehouse_management/products/edit.blade.php +++ b/resources/views/warehouse_management/products/edit.blade.php @@ -27,6 +27,11 @@
+
+ + +
+
diff --git a/resources/views/warehouse_management/products/index.blade.php b/resources/views/warehouse_management/products/index.blade.php index 324a821..cbaee0b 100644 --- a/resources/views/warehouse_management/products/index.blade.php +++ b/resources/views/warehouse_management/products/index.blade.php @@ -31,6 +31,7 @@ Kode Nama Kategori + Satuan Stok Aksi diff --git a/resources/views/warehouse_management/stock_mutations/index.blade.php b/resources/views/warehouse_management/stock_mutations/index.blade.php new file mode 100644 index 0000000..867bea8 --- /dev/null +++ b/resources/views/warehouse_management/stock_mutations/index.blade.php @@ -0,0 +1,47 @@ +@extends('layouts.backapp') + +@section('content') +
+
+
+ + + +

+ Tabel Mutasi Stock Produk +

+
+ {{-- @can('create', $menus['mutations.index']) +
+
+
+ Tambah +
+
+
+ @endcan --}} +
+ +
+
+ + + + + + + + + + + +
ProdukDealerUserTipe MutasiDibuat
+ +
+
+
+@endsection + +@section('javascripts') + +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 230e0b0..a9ad273 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,6 +9,7 @@ use App\Http\Controllers\TransactionController; use App\Http\Controllers\UserController; use App\Http\Controllers\WarehouseManagement\ProductCategoriesController; use App\Http\Controllers\WarehouseManagement\ProductsController; +use App\Http\Controllers\WarehouseManagement\StockMutationsController; use App\Http\Controllers\WorkController; use App\Models\Menu; use App\Models\Privilege; @@ -206,7 +207,9 @@ Route::group(['middleware' => 'auth'], function() { Route::prefix('warehouse')->group(function (){ Route::resource('products', ProductsController::class); Route::resource('product_categories', ProductCategoriesController::class); - Route::get('categories/parents', [ProductCategoriesController::class, 'getParents']); + Route::get('categories/parents', [ProductCategoriesController::class, 'getParents'])->name('products.parents'); + Route::post('products/{product}/toggle-active', [ProductsController::class, 'toggleActive'])->name('products.toggleActive'); + Route::get('mutations/index',[StockMutationsController::class, 'index'])->name('mutations.index'); }); }); diff --git a/webpack.mix.js b/webpack.mix.js index 181f80b..693ec6d 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -29,4 +29,8 @@ mix.js("resources/js/app.js", "public/js") "resources/js/warehouse_management/products/edit.js", "public/js/warehouse_management/products" ) + .js( + "resources/js/warehouse_management/stock_mutations/index.js", + "public/js/warehouse_management/stock_mutations" + ) .sourceMaps();