22
33namespace App \Http \Controllers ;
44
5- use App \ Models \ BlEmpaque ;
5+
66use App \Models \BlEstanteria ;
77use App \Models \BlInventarioDetalle ;
88use App \Models \BlProducto ;
99use Illuminate \Http \Request ;
1010use Illuminate \Support \Facades \Auth ;
1111use Illuminate \Support \Facades \DB ;
12+ use Illuminate \Support \Facades \Log ;
1213use Inertia \Inertia ;
1314
1415class BLInventarioController extends Controller
@@ -24,41 +25,37 @@ public function index()
2425 {
2526 $ productos = BlProducto::with ([
2627 'color ' ,
27- 'empaques. inventarioDetalle.zona.nivel.estanteria '
28+ 'inventarioDetalle.zona.nivel.estanteria ' // ✅ Relación directa
2829 ])
2930 ->get ()
3031 ->map (function ($ producto ) {
3132 // Obtener todas las ubicaciones donde está este producto
3233 $ ubicaciones = [];
3334 $ zonasUnicas = [];
34- $ estanteriasUnicas = []; // NUEVO: para almacenar códigos de estanterías
35+ $ estanteriasUnicas = [];
3536
36- foreach ($ producto ->empaques as $ empaque ) {
37- foreach ($ empaque ->inventarioDetalle as $ inventario ) {
38- if ($ inventario ->zona && $ inventario ->zona ->nivel && $ inventario ->zona ->nivel ->estanteria ) {
39- $ estanteria = $ inventario ->zona ->nivel ->estanteria ;
40- $ nivel = $ inventario ->zona ->nivel ;
41- $ zona = $ inventario ->zona ;
42-
43- // Crear ubicación legible
44- $ ubicacionLegible = $ estanteria ->nombre . ' - ' .
45- $ nivel ->nivel . ' - ' .
46- 'Zona ' . $ zona ->zona ;
47-
48- $ ubicaciones [] = $ ubicacionLegible ;
49-
50- // Guardar información de zona única
51- $ zonasUnicas [] = [
52- 'estanteria_nombre ' => $ estanteria ->nombre ,
53- 'estanteria_codigo ' => $ estanteria ->codigo , // EST-04, RACK-04, etc.
54- 'nivel_nombre ' => $ nivel ->nivel ,
55- 'zona_nombre ' => $ zona ->zona ,
56- 'codigo_completo ' => $ zona ->codigo_completo
57- ];
58-
59- // NUEVO: Guardar código de estantería para el plano
60- $ estanteriasUnicas [] = $ estanteria ->codigo ;
61- }
37+ // ✅ Ahora accedemos directamente desde el producto
38+ foreach ($ producto ->inventarioDetalle as $ inventario ) {
39+ if ($ inventario ->zona && $ inventario ->zona ->nivel && $ inventario ->zona ->nivel ->estanteria ) {
40+ $ estanteria = $ inventario ->zona ->nivel ->estanteria ;
41+ $ nivel = $ inventario ->zona ->nivel ;
42+ $ zona = $ inventario ->zona ;
43+
44+ $ ubicacionLegible = $ estanteria ->nombre . ' - ' .
45+ $ nivel ->nivel . ' - ' .
46+ 'Zona ' . $ zona ->zona ;
47+
48+ $ ubicaciones [] = $ ubicacionLegible ;
49+
50+ $ zonasUnicas [] = [
51+ 'estanteria_nombre ' => $ estanteria ->nombre ,
52+ 'estanteria_codigo ' => $ estanteria ->codigo ,
53+ 'nivel_nombre ' => $ nivel ->nivel ,
54+ 'zona_nombre ' => $ zona ->zona ,
55+ 'codigo_completo ' => $ zona ->codigo_completo
56+ ];
57+
58+ $ estanteriasUnicas [] = $ estanteria ->codigo ;
6259 }
6360 }
6461
@@ -71,20 +68,101 @@ public function index()
7168 'color_nombre ' => $ producto ->color ->nombre ,
7269 'descripcion ' => $ producto ->descripcion ,
7370 'stock_total ' => $ producto ->empaques
74- ->where ('estado ' , 'disponible ' )
75- ->sum ('cantidad_por_empaque ' ),
71+ ->where ('estado ' , 'disponible ' )
72+ ->sum ('cantidad_por_empaque ' ),
7673 'estanteria ' => $ estanteria ,
7774 'tiene_ubicacion ' => !empty ($ ubicaciones ),
7875 'ubicaciones_detalladas ' => $ zonasUnicas ,
7976 'estanterias ' => array_unique (array_column ($ zonasUnicas , 'estanteria_nombre ' )),
8077 'zonas_completas ' => array_unique (array_column ($ zonasUnicas , 'codigo_completo ' )),
81- // NUEVO: Array de códigos de estantería para el plano
8278 'estanterias_codigos ' => array_unique ($ estanteriasUnicas ),
8379 ];
8480 });
8581
82+ $ estanterias = BlEstanteria::with ('niveles.zonaNivel.inventarioDetalle ' )->get ();
8683 return Inertia::render ('BLInventario ' , [
8784 'productos ' => $ productos ,
85+ 'estanterias ' => $ estanterias
8886 ]);
8987 }
90- }
88+ public function store (Request $ request )
89+ {
90+ try {
91+ // Validar los datos recibidos
92+ $ validated = $ request ->validate ([
93+ 'producto_id ' => 'required|exists:bl_productos,id ' ,
94+ 'zona_id ' => 'required|exists:bl_zonas_nivel,id ' ,
95+ 'cantidad_actual ' => 'required|integer|min:1 ' ,
96+ 'fecha_ubicacion ' => 'required|date ' ,
97+ 'estado ' => 'required|in:disponible,reservado,danado,caducado ' ,
98+ ]);
99+
100+ Log::info ('Datos validados: ' , $ validated );
101+
102+ // Buscar si ya existe el inventario en esa zona para ese producto
103+ $ inventarioExistente = BlInventarioDetalle::where ('producto_id ' , $ validated ['producto_id ' ])
104+ ->where ('zona_id ' , $ validated ['zona_id ' ])
105+ ->first ();
106+
107+ Log::info ('Inventario existente: ' , [$ inventarioExistente ]);
108+
109+ if ($ inventarioExistente ) {
110+ $ inventarioExistente ->update ([
111+ 'cantidad_actual ' => $ validated ['cantidad_actual ' ],
112+ 'fecha_ubicacion ' => $ validated ['fecha_ubicacion ' ],
113+ 'estado ' => $ validated ['estado ' ],
114+ 'fecha_vencimiento ' => $ request ->fecha_vencimiento ,
115+ 'notas ' => $ request ->notas ,
116+ ]);
117+
118+ $ mensaje = 'Ubicación actualizada correctamente ' ;
119+ } else {
120+ // Crear nuevo inventario
121+ Log::info ('Insertando inventario nuevo: ' , $ validated );
122+
123+ BlInventarioDetalle::create ([
124+ 'producto_id ' => $ validated ['producto_id ' ],
125+ 'zona_id ' => $ validated ['zona_id ' ],
126+ 'cantidad_actual ' => $ validated ['cantidad_actual ' ],
127+ 'fecha_ubicacion ' => $ validated ['fecha_ubicacion ' ],
128+ 'fecha_vencimiento ' => $ request ->fecha_vencimiento ,
129+ 'estado ' => $ validated ['estado ' ],
130+ 'notas ' => $ request ->notas ,
131+ ]);
132+
133+ $ mensaje = 'Producto ubicado correctamente en el almacén ' ;
134+ }
135+
136+ // Actualizar contador de la zona
137+ $ this ->actualizarContadorZona ($ validated ['zona_id ' ]);
138+
139+ return redirect ()->back ()->with ([
140+ 'toast ' => [
141+ 'type ' => 'success ' ,
142+ 'message ' => $ mensaje ,
143+ ],
144+ ]);
145+
146+ } catch (\Exception $ e ) {
147+ Log::error ('Error en store inventario: ' , [$ e ->getMessage ()]);
148+
149+ return redirect ()->back ()->with ([
150+ 'toast ' => [
151+ 'type ' => 'error ' ,
152+ 'message ' => 'Error al guardar la ubicación: ' . $ e ->getMessage (),
153+ ],
154+ ]);
155+ }
156+ }
157+
158+ // Método auxiliar para actualizar el contador de la zona
159+ private function actualizarContadorZona ($ zonaId )
160+ {
161+ $ totalProductos = BlInventarioDetalle::where ('zona_id ' , $ zonaId )
162+ ->where ('estado ' , 'disponible ' )
163+ ->sum ('cantidad_actual ' );
164+ DB ::table ('bl_zonas_nivel ' )
165+ ->where ('id ' , $ zonaId )
166+ ->update (['productos_actuales ' => $ totalProductos ]);
167+ }
168+ }
0 commit comments