Skip to content

Commit d71482d

Browse files
authored
Merge pull request #44 from chechojgb/buttonsLovers
refactor: correccion modelo guardar pedidos
2 parents 5234c86 + 42d1e1a commit d71482d

File tree

6 files changed

+70
-29
lines changed

6 files changed

+70
-29
lines changed

app/Http/Controllers/BLPedidosController.php

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Illuminate\Support\Facades\DB;
1818
use Illuminate\Support\Str;
1919
use Illuminate\Support\Facades\Auth;
20+
use Illuminate\Support\Facades\Log;
2021

2122
class 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
}

app/Http/Controllers/BlProductoController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public function store(Request $request)
148148
'cantidad_por_empaque' => $validated['cantidad_por_empaque'],
149149
'codigo_barras' => $validated['codigo_barras'],
150150
'codigo_unico' => $validated['codigo_unico'],
151-
'estado' => 'Disponible'
151+
'estado' => 'disponible'
152152
]);
153153

154154

database/migrations/2025_08_04_001906_create_bl_pedido_items.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function up(): void
1616
$table->foreignId('pedido_id')->constrained('bl_pedidos');
1717
$table->foreignId('empaque_id')->constrained('bl_empaques');
1818
$table->integer('cantidad_empaques'); // Ej: 2 empaques de 500 unidades = 1000 botones
19-
$table->decimal('precio_unitario', 10, 2); // Precio por empaque
19+
// $table->decimal('precio_unitario', 10, 2); // Precio por empaque
2020
$table->timestamps();
2121
});
2222
}

database/migrations/2025_08_06_161016_add_disponibilidad_to_bl_empaques_table.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function up(): void
2222
public function down(): void
2323
{
2424
Schema::table('bl_empaques', function (Blueprint $table) {
25-
$table->string('estado');
25+
$table->dropColumn('estado');
2626
});
2727
}
2828

database/migrations/2025_08_06_161217_add_nota_paquete_to_bl_pedido_items_table.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function up(): void
2222
public function down(): void
2323
{
2424
Schema::table('bl_pedido_items', function (Blueprint $table) {
25-
$table->string('nota');
25+
$table->dropColumn('nota');
2626
});
2727
}
2828
};

resources/js/pages/BLClientes.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,17 @@ export default function Clientes({clientes}) {
127127
setToast({
128128
show: true,
129129
success: true,
130-
message: "Producto guardado correctamente"
130+
message: "cliente guardado correctamente"
131131
});
132-
// Refrescar la lista de productos
132+
// Refrescar la lista de clientes
133133
// router.visit(route('clientes.index'));
134134
},
135135
onError: (errors) => {
136136
const primerError = Object.values(errors)[0];
137137
setToast({
138138
show: true,
139139
success: false,
140-
message: primerError || "Error al guardar el producto"
140+
message: primerError || "Error al guardar el cliente"
141141
});
142142
},
143143
onFinish: (visit) => {

0 commit comments

Comments
 (0)