66// 2) Operaciones de cálculo: Volumen, Volumen Total, Peso Total, Tarifa, Descuentos, Monto final.
77// 3) Comunicación: Recolección, Validación, Tarifa, Descuentos, Monto final, Nueva cotización.
88
9+ /* Variables globales */
10+ let cotizacionesGuardadas = [ ] ;
11+ let contadorCotizaciones = 0 ;
12+
913/* Datos del cotizador */
1014
1115/* Recolección */
@@ -117,7 +121,7 @@ function calcularCotizacion(categoriaDimensionDescuento, categoriaPesoDescuento,
117121 totalDescuentos = descuentoDimensionAplicado ;
118122 montoTotal = tarifa - totalDescuentos ; // Si se cumple solo con descuento por Dimensión
119123 } else if ( descuentoPeso ) {
120- totalDescuentos = categoriaDimensionDescuento ;
124+ totalDescuentos = descuentoPesoAplicado ; // CORRECCIÓN: Aquí estaba categoriaDimensionDescuento
121125 montoTotal = tarifa - totalDescuentos ; // Si se cumple solo con descuento por Peso
122126 }
123127 // Mostrar los resultados
@@ -128,37 +132,39 @@ function calcularCotizacion(categoriaDimensionDescuento, categoriaPesoDescuento,
128132
129133/* Comunicación Cotización exitosa */
130134
131- function comunicarResultados ( largo , ancho , alto , peso , tarifa , totalDescuentos , montoTotal , descPeso , descDimension , descuentos ) {
135+ function comunicarResultados ( largo , ancho , alto , peso , volumen , volumenTotal , pesoTotal , pesoFacturable , tarifa , descuentoDimensionAplicado , descuentoPesoAplicado , totalDescuentos , montoTotal , descDimension , descPeso ) {
132136 const resultadosDiv = document . getElementById ( 'cotizacionDiv' ) ;
133- // Dimension
134- const claseDimension = {
135- 'grande' : 'Grande (≥30cm)' ,
136- 'medio' : 'Medio (≥20cm)' ,
137- 'pequeño' : 'Pequeño (≥10cm)' ,
138- 'muy pequeño' : 'Muy Pequeño (<10cm)'
139- } ;
140- // Peso
141- const clasePeso = {
142- 'pesado' : 'Pesado (≥10kg)' ,
143- 'liviano' : 'Liviano (≥1kg)' ,
144- 'muy liviano' : 'Muy Liviano (<1kg)'
145- } ;
146- //Aplicar Descuentos
147- let descuentosCotizacion = '' ;
148- if ( descDimension || descPeso ) {
149- descuentosCotizacion = `
150- <div class="exito">
151- <h6><b>¡Felicidades, aplicamos tus descuentos!</b></h6>
152- <p>${ descDimension ? '• Descuento por tener un tamaño muy pequeño: 5%' : '' } </p>
153- <p>${ descPeso ? '• Descuento por tener un peso muy liviano: 5%' : '' } </p>
154- <p>• Total descuentos: USD$ ${ descuentos . toFixed ( 2 ) } </p>
155- </div>` ;
137+
138+ // Evitar más de 5 cotizaciones
139+ if ( contadorCotizaciones >= 5 ) {
140+ comunicarError ( "Has alcanzado el límite de 5 cotizaciones. Puedes enviar los datos por correo, borrar y seguir cotizando." ) ;
141+ return ;
156142 }
157- /* Comunicar Resultados en el HTML */
158- resultadosDiv . innerHTML = `
159- <h5>Resumen de la Cotización:</h5>
160- ${ descuentosCotizacion }
161- <table class="resultado">
143+
144+ contadorCotizaciones ++ ;
145+
146+ /* Guardar cotización en array */
147+ const cotizacion = {
148+ id : contadorCotizaciones ,
149+ largo,
150+ ancho,
151+ alto,
152+ peso,
153+ tarifa,
154+ totalDescuentos,
155+ montoTotal,
156+ descDimension,
157+ descPeso
158+ } ;
159+ cotizacionesGuardadas . push ( cotizacion ) ;
160+
161+ // Guardar en localStorage
162+ transformarDatos ( cotizacion ) ;
163+
164+ // Crear o actualizar tabla
165+ let tableHTML = `
166+ <h5>Resumen de Cotizaciones:</h5>
167+ <table id="tabla" class="resultado">
162168 <thead>
163169 <tr>
164170 <th>Medidas</th>
@@ -168,93 +174,141 @@ function comunicarResultados(largo, ancho, alto, peso, tarifa, totalDescuentos,
168174 <th>Total a pagar</th>
169175 </tr>
170176 </thead>
171- <tbody>
177+ <tbody>` ;
178+
179+ cotizacionesGuardadas . forEach ( cot => {
180+ tableHTML += `
172181 <tr>
173- <td>${ largo } x${ ancho } x${ alto } cms</td>
174- <td>${ peso } kg</td>
175- <td>USD$ ${ tarifa . toFixed ( 2 ) } </td>
176- <td>USD$ ${ descuentos . toFixed ( 2 ) } </td>
177- <td>USD$ ${ montoTotal . toFixed ( 2 ) } </td>
178- </tr>
182+ <td>${ cot . largo } x${ cot . ancho } x${ cot . alto } cms</td>
183+ <td>${ cot . peso } kg</td>
184+ <td>USD$ ${ cot . tarifa . toFixed ( 2 ) } </td>
185+ <td>USD$ ${ cot . totalDescuentos . toFixed ( 2 ) } </td>
186+ <td>USD$ ${ cot . montoTotal . toFixed ( 2 ) } </td>
187+ </tr>` ;
188+ } ) ;
189+
190+ tableHTML += `
179191 </tbody>
180- </table>
181- <button id="guardar"> Guardar </button>
182- <button id="borrar"> Borrar </button>
183- <button id="enviar"> Enviar </button>` ;
192+ </table>` ;
193+
194+ /* Comunicar Descuentos, si aplican */
195+ let descuentosCotizacion = '' ;
196+ if ( descDimension || descPeso ) {
197+ descuentosCotizacion = `
198+ <div class="exito">
199+ <h6><b>¡Felicidades, aplicamos tus descuentos!</b></h6>
200+ <p>${ descDimension ? '• Descuento por tener un tamaño muy pequeño: 5%' : '' } </p>
201+ <p>${ descPeso ? '• Descuento por tener un peso muy liviano: 5%' : '' } </p>
202+ <p>• Total descuentos: USD$ ${ totalDescuentos . toFixed ( 2 ) } </p>
203+ </div>` ;
204+ }
205+
206+ resultadosDiv . innerHTML = descuentosCotizacion + tableHTML + `
207+ <div>
208+ <button id="enviar">Enviar</button>
209+ <button id="borrar">Borrar</button>
210+ </div>` ;
211+
184212 resultadosDiv . classList . add ( 'show' ) ;
185213 resultadosDiv . scrollIntoView ( { behavior : 'smooth' } ) ;
186- /* Crear Array */
187214
188- /* Trabajando con Librería Sweet Alert */
189- /* Guardar Array */
190- document . getElementById ( "guardar" )
191- . addEventListener ( "click" , ( ) => {
192- Swal . fire ( {
193- title : "¿Te gustaría guardar la cotización realizada?" ,
194- html : `Puedes <b>Guardar</b> hasta 5 cotizaciones` ,
195- icon : "question" ,
196- iconColor :"#4537AD" ,
197- showCancelButton : true ,
198- confirmButtonColor : "#41AD37" ,
199- cancelButtonColor : "#9B97B5" ,
200- confirmButtonText : "Guardar y cotizar" ,
201- denyButtonText : "Borrar"
202- } ) . then ( ( result ) => {
203- if ( result . isConfirmed ) {
204- Swal . fire ( {
205- title : "¡Datos Guardados!" ,
206- text : "Tus cotizaciones realizadas han sido guardadas." ,
207- icon : "success" ,
208- iconColor :"#41AD37"
209- } )
210- ;
211- }
212- } ) ;
213- } ) ;
214- /* Borrar Array */
215+ // Agregar eventos a los botones
216+ agregarEventosBotones ( ) ;
217+ }
218+
219+ /* Transformar Datos y guardar en localStorage */
220+
221+ function transformarDatos ( cotizacion ) {
222+ // Recuperar cotizaciones previas del localStorage
223+ let cotizacionesAlmacenadas = [ ] ;
224+ const datosExistentes = localStorage . getItem ( 'Cotizaciones' ) ;
225+
226+ if ( datosExistentes ) {
227+ cotizacionesAlmacenadas = JSON . parse ( datosExistentes ) ;
228+ }
229+
230+ // Agregar la nueva cotización
231+ cotizacionesAlmacenadas . push ( cotizacion ) ;
232+
233+ // Guardar en localStorage
234+ localStorage . setItem ( 'Cotizaciones' , JSON . stringify ( cotizacionesAlmacenadas ) ) ;
235+
236+ console . info ( `Cotización guardada en localStorage:` , cotizacion ) ;
237+ console . info ( `Total de cotizaciones almacenadas:` , cotizacionesAlmacenadas . length ) ;
238+ }
239+
240+ /* Agregar eventos a los botones */
241+
242+ function agregarEventosBotones ( ) {
243+ // Borrar Datos Cotizados
215244 document . getElementById ( "borrar" )
216- . addEventListener ( "click" , ( ) => {
245+ . addEventListener ( "click" , ( ) => {
217246 Swal . fire ( {
218- title : "¿Te gustaría borrar toda la información?" ,
219- html : `Vas a <b>Borrar</b> todo lo cotizado.` ,
220- icon : "warning" ,
221- iconColor :"#AD4537" ,
222- showCancelButton : true ,
223- confirmButtonColor : "#AD4537" ,
224- cancelButtonColor : "#9B97B5" ,
225- confirmButtonText : "Borrar" ,
247+ title : "¿Te gustaría borrar toda la información?" ,
248+ html : `Vas a <b>Borrar</b> todo lo cotizado.` ,
249+ icon : "warning" ,
250+ iconColor : "#AD4537" ,
251+ showCancelButton : true ,
252+ confirmButtonColor : "#AD4537" ,
253+ cancelButtonColor : "#9B97B5" ,
254+ confirmButtonText : "Borrar" ,
226255 } ) . then ( ( result ) => {
227256 if ( result . isConfirmed ) {
228- Swal . fire ( {
229- title : "¡Datos Borrados!" ,
230- text : "Tus cotizaciones realizadas han sido borradas." ,
231- icon : "warning" ,
232- iconColor :"#AD4537"
233- } ) ;
257+ Swal . fire ( {
258+ title : "¡Datos Borrados!" ,
259+ text : "Tus cotizaciones realizadas han sido borradas." ,
260+ icon : "warning" ,
261+ iconColor : "#AD4537" ,
262+ confirmButtonColor : "#4537AD"
263+ } ) ;
264+ // Lógica borrar
265+ procesoBorrado ( ) ;
234266 }
235- } ) ;
267+ } ) ;
236268 } ) ;
237- /* Enviar Array */
269+
270+ // Enviar Array
238271 document . getElementById ( "enviar" )
239272 . addEventListener ( "click" , async ( ) => {
240273 const { value : email } = await Swal . fire ( {
241- title : "¿Te gustaría enviar la cotización realizada?" ,
242- html : `Puedes <b>Enviar</b> lo cotizado hasta ahora` ,
243- icon : "info" ,
244- iconColor :"#4537AD" ,
245- input : "email" ,
246- inputLabel : "Escribe tu dirección de correo" ,
247- 248- showCancelButton : true ,
249- confirmButtonColor : "#4537AD" ,
250- cancelButtonColor : "#9B97B5" ,
251- confirmButtonText : "Enviar"
252- } ) ; if ( email ) {
253- Swal . fire ( `Entered email: ${ email } ` ) ;
274+ title : "¿Te gustaría enviar la cotización realizada?" ,
275+ html : `Puedes <b>Enviar</b> lo cotizado hasta ahora` ,
276+ icon : "info" ,
277+ iconColor : "#4537AD" ,
278+ input : "email" ,
279+ inputLabel : "Escribe tu dirección de correo" ,
280+ 281+ showCancelButton : true ,
282+ confirmButtonColor : "#4537AD" ,
283+ cancelButtonColor : "#9B97B5" ,
284+ confirmButtonText : "Enviar"
285+ } ) ;
286+
287+ if ( email ) {
288+ // Aquí iría la lógica para enviar el email
289+ // Por ahora solo confirmamos
290+ Swal . fire ( {
291+ title :`Email enviado a: ${ email } ` ,
292+ confirmButtonColor :"#4537AD"
293+ } ) ;
294+ console . log ( 'Cotizaciones a enviar:' , cotizacionesGuardadas ) ;
254295 }
255296 } ) ;
256297}
257298
299+ /* Función para borrar */
300+
301+ function procesoBorrado ( ) {
302+ const resultadosDiv = document . getElementById ( 'cotizacionDiv' ) ;
303+ resultadosDiv . innerHTML = '' ;
304+ resultadosDiv . classList . remove ( 'show' ) ;
305+ cotizacionesGuardadas = [ ] ;
306+ contadorCotizaciones = 0 ;
307+ localStorage . removeItem ( 'Cotizaciones' ) ;
308+ // Limpiar también el formulario
309+ document . getElementById ( 'cotizacionForm' ) . reset ( ) ;
310+ }
311+
258312/* Comunicación Cotización Rechazada */
259313
260314function comunicarRechazo ( dimensionMaxima , peso ) {
@@ -275,53 +329,16 @@ function comunicarRechazo(dimensionMaxima, peso) {
275329/* Comunicar Error en el HTML */
276330
277331function comunicarError ( mensaje ) {
278- const resultadosDiv = document . getElementById ( 'cotizacionDiv' ) ;
279- resultadosDiv . innerHTML = `
280- <div class="error">
281- ${ mensaje }
282- </div>` ;
283- resultadosDiv . classList . add ( 'show' ) ;
284- resultadosDiv . scrollIntoView ( { behavior : 'smooth' } ) ;
285- }
286-
287-
288-
289- // Limpiar los resultados cuando el usuario modifica un input
290- document . querySelectorAll ( 'input[type="number"]' ) . forEach ( input => {
291- input . addEventListener ( 'input' , function borrarDatos ( ) {
292- document . getElementById ( 'cotizacionDiv' ) . classList . remove ( 'show' ) ;
293- } ) ;
294- } ) ;
295-
296-
297-
298- /* Transformar Datos */
299-
300- function transformarDatos ( largo , ancho , alto , peso , montoTotal ) {
301- const procesandoDatos = {
302- medidas : [ {
303- largo : `${ largo } ` ,
304- ancho : `${ ancho } ` ,
305- alto : `${ alto } ` ,
306- peso : `${ peso } ` ,
307- peso : `${ montoTotal . toFixed ( 2 ) } `
308- } ]
309- } ;
310- // Convertimos el objeto carrito en una cadena JSON y lo almacenamos
311- localStorage . setItem ( 'Cotizacion' , JSON . stringify ( procesandoDatos ) ) ;
312-
313- // Recuperamos la cadena JSON del almacenamiento y la convertimos de nuevo a un objeto JavaScript
314- const cotizacionAlmacenada = JSON . parse ( localStorage . getItem ( 'Cotizacion' ) ) ;
315-
316- // Ahora podemos acceder y manipular los datos del carrito como un objeto JavaScript
317- console . log ( `Esta es la información almacenada:` , cotizacionAlmacenada ) ;
318-
319- console . info ( `Estamos procesando la cotización:` ) ;
320- console . info ( `Medidas: ${ largo } x ${ ancho } x ${ alto } cms` ) ;
321- console . info ( `Peso: ${ peso } kg` ) ;
332+ Swal . fire ( {
333+ icon : "error" ,
334+ iconColor : "#AD4537" ,
335+ title : "¡Llegaste al límite!" ,
336+ text : mensaje ,
337+ footer : '<p>Sigue usando nuestro cotizador</p>' ,
338+ confirmButtonColor : "#4537AD"
339+ } ) ;
322340}
323341
324-
325342/* Remoción de Nodos */
326343//elementos que aún no se incorporan al cotizador
327344
0 commit comments