1717use Illuminate \Support \Facades \DB ;
1818use Illuminate \Support \Str ;
1919use Illuminate \Support \Facades \Auth ;
20+ use Illuminate \Support \Facades \Log ;
2021
2122class BLPedidosController extends Controller
2223{
@@ -51,7 +52,9 @@ public function index()
5152 public function store (Request $ request )
5253 {
5354 $ user = Auth::user ();
55+ logger ()->info ('Iniciando creación de pedido ' , ['user_id ' => $ user ->id ]);
5456
57+ // Validación de datos
5558 $ validated = $ request ->validate ([
5659 'cliente_id ' => 'required|numeric|exists:bl_clientes,id ' ,
5760 'fecha_acordada ' => 'required|date ' ,
@@ -64,7 +67,7 @@ public function store(Request $request)
6467 DB ::beginTransaction ();
6568
6669 try {
67- // Crear el pedido principal
70+ // Crear pedido principal
6871 $ pedido = BLPedido::create ([
6972 'cliente_id ' => $ validated ['cliente_id ' ],
7073 'fecha_pedido ' => $ validated ['fecha_acordada ' ],
@@ -73,46 +76,77 @@ public function store(Request $request)
7376 'usuario_id ' => $ user ->id ,
7477 ]);
7578
79+ logger ()->info ('Pedido principal creado ' , ['pedido_id ' => $ pedido ->id ]);
80+
81+ // Procesar cada producto
7682 foreach ($ validated ['productos ' ] as $ producto ) {
83+ $ productoId = $ producto ['producto_id ' ];
7784 $ cantidadSolicitada = $ producto ['cantidad ' ];
7885
79- // Buscar empaques disponibles para ese producto (ordenados por fecha ascendente)
80- $ empaquesDisponibles = BLEmpaque::where ('producto_id ' , $ producto ['producto_id ' ])
81- ->where ('estado ' , 'disponible ' )
82- ->orderBy ('created_at ' )
83- ->get ();
86+ $ estadoBuscado = 'disponible ' ;
87+ $ query = BLEmpaque::where ('producto_id ' , $ productoId )
88+ ->whereRaw ('LOWER(estado) = ? ' , [$ estadoBuscado ])
89+ ->orderBy ('created_at ' );
90+
91+ if (DB ::getDriverName () !== 'sqlite ' ) {
92+ $ query ->lockForUpdate ();
93+ }
94+
95+ $ empaquesDisponibles = $ query ->get ();
96+
97+ logger ()->info ('Empaques disponibles ' , [
98+ 'producto_id ' => $ productoId ,
99+ 'count ' => $ empaquesDisponibles ->count (),
100+ 'ids ' => $ empaquesDisponibles ->pluck ('id ' )
101+ ]);
84102
85103 $ itemsPedido = [];
86104 $ cantidadAsignada = 0 ;
87105
88106 foreach ($ empaquesDisponibles as $ empaque ) {
89- if ($ cantidadAsignada >= $ cantidadSolicitada ) {
90- break ;
91- }
107+ if ($ cantidadAsignada >= $ cantidadSolicitada ) break ;
108+
109+ $ cantidadPorEmpaque = $ empaque ->cantidad_por_empaque ?? $ empaque ->cantidad ?? 0 ;
110+ $ cantidadRestante = $ cantidadSolicitada - $ cantidadAsignada ;
111+
112+ // Por defecto se toma el empaque completo
113+ $ cantidadParaEsteItem = $ cantidadPorEmpaque ;
114+ $ notaItem = null ;
92115
93- $ cantidadAsignada += $ empaque ->cantidad ;
116+ // Si solo necesitamos una parte de este empaque
117+ if ($ cantidadRestante < $ cantidadPorEmpaque ) {
118+ $ cantidadParaEsteItem = $ cantidadRestante ;
119+ $ notaItem = "Bolsa de {$ cantidadPorEmpaque }, se toman {$ cantidadRestante }, sobran " . ($ cantidadPorEmpaque - $ cantidadRestante );
120+ }
94121
95122 $ itemsPedido [] = [
96- 'pedido_id ' => $ pedido ->id ,
97- 'cantidad_empaques ' => $ empaque ->cantidad ,
123+ 'cantidad_empaques ' => $ cantidadParaEsteItem ,
98124 'empaque_id ' => $ empaque ->id ,
99- 'nota ' => null ,
125+ 'nota ' => $ notaItem ,
100126 ];
101127
102- // Marcar empaque como "asignado"
128+ $ cantidadAsignada += $ cantidadParaEsteItem ;
129+
130+ // Marcar empaque como asignado
103131 $ empaque ->estado = 'asignado ' ;
104132 $ empaque ->save ();
105- }
106133
107- // Si no se alcanzó la cantidad, se anota en el último ítem
108- if ($ cantidadAsignada < $ cantidadSolicitada && count ($ itemsPedido ) > 0 ) {
109- $ faltante = $ cantidadSolicitada - $ cantidadAsignada ;
110- $ itemsPedido [count ($ itemsPedido ) - 1 ]['nota ' ] = "Faltan $ faltante unidades para completar este pedido " ;
134+ logger ()->info ('Empaque asignado ' , [
135+ 'empaque_id ' => $ empaque ->id ,
136+ 'cantidad_asignada ' => $ cantidadParaEsteItem ,
137+ 'nota ' => $ notaItem
138+ ]);
111139 }
112140
113- // Insertar ítems del producto (si hay alguno)
114- if (count ($ itemsPedido ) > 0 ) {
115- BLPedidoItem::create ($ itemsPedido );
141+ // Si no hay empaques asignados
142+ if (empty ($ itemsPedido )) {
143+ logger ()->warning ('No se asignaron empaques ' , ['producto_id ' => $ productoId ]);
144+ } else {
145+ $ pedido ->items ()->createMany ($ itemsPedido );
146+ logger ()->info ('Items creados ' , [
147+ 'producto_id ' => $ productoId ,
148+ 'count ' => count ($ itemsPedido )
149+ ]);
116150 }
117151 }
118152
@@ -126,6 +160,10 @@ public function store(Request $request)
126160
127161 } catch (\Exception $ e ) {
128162 DB ::rollBack ();
163+ logger ()->error ('Error al crear pedido ' , [
164+ 'error ' => $ e ->getMessage (),
165+ 'trace ' => $ e ->getTraceAsString ()
166+ ]);
129167
130168 return response ()->json ([
131169 'success ' => false ,
@@ -137,4 +175,7 @@ public function store(Request $request)
137175
138176
139177
178+
179+
180+
140181}
0 commit comments