group(function() { // Tus rutas protegidas //INVENTARIO Route::get('inventario/almacen/{warehouse}', [InventoryController::class, 'getProductsByWarehouse']); Route::post('inventario/import', [InventoryController::class, 'import']); Route::get('inventario/template/download', [InventoryController::class, 'downloadTemplate']); Route::resource('inventario', InventoryController::class); // NÚMEROS DE SERIE DE INVENTARIO Route::resource('inventario.serials', InventorySerialController::class)->only(['index', 'show', 'destroy']); Route::get('serials/search', [InventorySerialController::class, 'search']); // ALMACENES Route::resource('almacenes', WarehouseController::class)->except(['create', 'edit']); // MOVIMIENTOS DE INVENTARIO Route::prefix('movimientos')->group(function () { Route::get('/', [InventoryMovementController::class, 'index']); Route::get('/{id}', [InventoryMovementController::class, 'show']); Route::put('/{id}', [InventoryMovementController::class, 'update']); Route::post('/entrada', [InventoryMovementController::class, 'entry']); Route::post('/salida', [InventoryMovementController::class, 'exit']); Route::post('/traspaso', [InventoryMovementController::class, 'transfer']); }); // UNIDADES DE MEDIDA Route::prefix('unidades-medida')->group(function () { Route::get('/', [UnitOfMeasurementController::class, 'index']); Route::get('/active', [UnitOfMeasurementController::class, 'active']); Route::get('/{unidad}', [UnitOfMeasurementController::class, 'show']); Route::post('/', [UnitOfMeasurementController::class, 'store']); Route::put('/{unidad}', [UnitOfMeasurementController::class, 'update']); Route::delete('/{unidad}', [UnitOfMeasurementController::class, 'destroy']); }); //CATEGORIAS Route::resource('categorias', CategoryController::class); //PRECIOS Route::resource('precios', PriceController::class); //VENTAS Route::resource('/sales', SaleController::class); Route::put('/sales/{sale}/cancel', [SaleController::class, 'cancel']); // DEVOLUCIONES Route::prefix('returns')->group(function () { Route::get('/', [ReturnController::class, 'index']); Route::get('/{return}', [ReturnController::class, 'show']); Route::post('/', [ReturnController::class, 'store']); Route::put('/{return}/cancel', [ReturnController::class, 'cancel']); }); // Items que pueden ser devueltos de una venta Route::get('/sales/{sale}/returnable', [ReturnController::class, 'returnable']); // Rutas de caja Route::prefix('cash-registers')->group(function () { Route::get('/', [CashRegisterController::class, 'index']); Route::get('/current', [CashRegisterController::class, 'current']); Route::get('/{register}', [CashRegisterController::class, 'show']); Route::post('/open', [CashRegisterController::class, 'open']); Route::put('/{register}/close', [CashRegisterController::class, 'close']); }); // REPORTES Route::prefix('reports')->group(function () { Route::get('top-selling-product', [ReportController::class, 'topSellingProduct']); Route::get('products-without-movement', [ReportController::class, 'productsWithoutMovement']); Route::get('client-discounts/excel', [ExcelController::class, 'clientDiscountsReport']); Route::get('sales/excel', [ExcelController::class, 'salesReport']); Route::get('inventory/excel', [ExcelController::class, 'inventoryReport']); Route::get('kardex/excel', [KardexController::class, 'export']); }); //CLIENTES Route::resource('clients', ClientController::class); // ESTADÍSTICAS Y DESCUENTOS DE CLIENTES Route::prefix('clients')->group(function () { Route::get('/{client}/stats', [ClientController::class, 'stats']); Route::get('/{client}/tier-history', [ClientController::class, 'tierHistory']); Route::get('/{client}/sales-with-discounts', [ClientController::class, 'salesWithDiscounts']); }); // RANGOS DE CLIENTES Route::prefix('client-tiers')->group(function () { Route::get('/', [ClientTierController::class, 'index']); Route::get('/active', [ClientTierController::class, 'active']); Route::get('/{tier}', [ClientTierController::class, 'show']); Route::post('/', [ClientTierController::class, 'store']); Route::put('/{tier}', [ClientTierController::class, 'update']); Route::delete('/{tier}', [ClientTierController::class, 'destroy']); Route::patch('/{tier}/toggle-active', [ClientTierController::class, 'toggleActive']); }); // SOLICITUDES DE FACTURACIÓN Route::prefix('invoice-requests')->group(function () { Route::get('/', [InvoiceRequestController::class, 'index']); Route::get('/stats', [InvoiceRequestController::class, 'stats']); Route::get('/{id}', [InvoiceRequestController::class, 'show']); Route::put('/{id}/process', [InvoiceRequestController::class, 'process']); Route::put('/{id}/reject', [InvoiceRequestController::class, 'reject']); Route::post('/{id}/upload', [InvoiceRequestController::class, 'uploadInvoiceFile']); }); Route::prefix('proveedores')->group(function () { Route::get('/', [SupplierController::class, 'index']); Route::post('/', [SupplierController::class, 'store']); Route::get('/{supplier}', [SupplierController::class, 'show']); Route::put('/{supplier}', [SupplierController::class, 'update']); Route::delete('/{supplier}', [SupplierController::class, 'destroy']); Route::get('/{supplier}/productos', [SupplierController::class, 'products']); Route::get('/{supplier}/compras', [SupplierController::class, 'purchases']); }); // WHATSAPP Route::prefix('whatsapp')->group(function () { Route::post('/send-document', [WhatsappController::class, 'sendDocument']); Route::post('/send-invoice', [WhatsappController::class, 'sendInvoice']); Route::post('/send-ticket', [WhatsappController::class, 'sendSaleTicket']); }); }); /** Rutas públicas */ // Formulario de datos fiscales para facturación Route::prefix('facturacion')->group(function () { Route::get('/check-rfc', [InvoiceController::class, 'checkRfc']); Route::get('/{invoiceNumber}', [InvoiceController::class, 'show']); Route::post('/{invoiceNumber}', [InvoiceController::class, 'store']); });