module.exports=[492800,e=>{"use strict";var o=e.i(15270),a=e.i(952464),t=e.i(809465),i=e.i(222378);async function n(e,o,a){console.log("\n💵 [validarCambioDisponible] VALIDANDO CAMBIO:",{sessionId:e,montoVenta:o,montoPagado:a,cambioRequerido:a-o});let i=a-o,n=await (0,t.getEfectivoDisponible)(e);if(i<=0)return console.log("✅ [validarCambioDisponible] No requiere cambio"),{tieneEfectivo:!0,efectivoDisponible:n,cambioRequerido:0,mensaje:"No requiere cambio"};console.log("📊 [validarCambioDisponible] Resultado:",{efectivoDisponible:n,cambioRequerido:i,suficiente:n>=i});let r=n>=i;return{tieneEfectivo:r,efectivoDisponible:n,cambioRequerido:i,mensaje:r?"Efectivo suficiente para dar cambio":`Efectivo insuficiente. Disponible: $${n.toLocaleString("es-CO")}, Necesario: $${i.toLocaleString("es-CO")}`}}async function r(e,o,a){let t=await a.productos.findUnique({where:{id:e},select:{es_perecedero:!0,stock_actual:!0,nombre:!0}});if(console.log("🔍 DEBUG getLoteDisponibleFIFO:",{productoId:e,cantidadNecesaria:o,producto:t,stockActual:t?.stock_actual,stockNumero:t?.stock_actual?Number(t.stock_actual):null}),!t)throw Error(`Producto con ID ${e} no encontrado`);let i=Number(t.stock_actual);if(console.log("📊 Verificación stock:",{stockDisponible:i,cantidadNecesaria:o,suficiente:i>=o}),i<o)throw Error(`Stock insuficiente para ${t.nombre}. Disponible: ${i}, Necesario: ${o}`);let n=await a.lotes_productos.findMany({where:{producto_id:e,estado:"disponible",cantidad:{gt:0}},orderBy:t.es_perecedero?[{fecha_vencimiento:"asc"},{created_at:"asc"}]:[{created_at:"asc"}],select:{id:!0,codigo_lote:!0,cantidad:!0,fecha_vencimiento:!0,producto:{select:{nombre:!0}}}});if(0===n.length)throw Error(`No hay lotes disponibles para el producto ${t.nombre}`);let r=new Date,c=n.filter(e=>e.fecha_vencimiento&&new Date(e.fecha_vencimiento)<r);c.length>0&&(console.warn(`⚠️ Se encontraron ${c.length} lotes vencidos para ${t.nombre}:`,c.map(e=>e.codigo_lote)),await a.lotes_productos.updateMany({where:{id:{in:c.map(e=>e.id)}},data:{estado:"vencido"}}));let d=n.filter(e=>!e.fecha_vencimiento||new Date(e.fecha_vencimiento)>=r);if(0===d.length)throw Error(`Todos los lotes del producto ${t.nombre} est\xe1n vencidos. No se puede procesar la venta.`);return d}async function c(e,o,a){let t=[],i=o;for(let n of(await r(e,o,a))){if(i<=0)break;let o=Number(n.cantidad),r=Math.min(i,o),c=o-r,d=await a.costos_produccion.findFirst({where:{lote_id:n.id},select:{costo_unitario:!0}}),s=await a.lotes_productos.update({where:{id:n.id},data:{cantidad:c,estado:0===c?"retirado":"disponible"}});console.log(`🔄 Lote ${n.codigo_lote} actualizado:`,{cantidadAntes:o,cantidadDescontada:r,cantidadNueva:c,estado:s.estado});let l=(await a.lotes_productos.aggregate({where:{producto_id:e,estado:{in:["disponible","reservado"]}},_sum:{cantidad:!0}}))._sum.cantidad||0;await a.productos.update({where:{id:e},data:{stock_actual:l}}),console.log(`📦 Stock producto sincronizado: ${l}`),t.push({lote_id:n.id,cantidad:r,codigo_lote:n.codigo_lote,costo_unitario:d?.costo_unitario?Number(d.costo_unitario):null}),i-=r;let u=d?.costo_unitario?`(costo: $${Number(d.costo_unitario).toFixed(2)}/u)`:"(sin costo configurado)";console.log(`✅ Descontado ${r} unidades del lote ${n.codigo_lote} ${u} (quedan ${c})`)}if(i>0)throw Error(`No se pudo descontar toda la cantidad solicitada. Faltaron ${i} unidades.`);return t}async function d(e,t){try{console.log(`🛒 Iniciando creaci\xf3n de venta con ${e.items.length} items`);let n=await o.prisma.$transaction(async a=>{let n=0,r=e.items.map(e=>{let o=e.descuento_porcentaje||0,a=e.cantidad*e.precio_unitario*(1-o/100);return n+=a,{...e,subtotal:a}}),d=(e.descuento_global||0)/100*n,s=n-d,l=await (0,i.getConfigValue)("iva_porcentaje",19)/100*s,u=s+l;if(console.log(`💰 Totales calculados:`,{subtotal:n.toFixed(2),descuento:d.toFixed(2),impuesto:l.toFixed(2),total:u.toFixed(2)}),t){let a=e.pagos.filter(e=>1===e.metodo_pago_id);if(a.length>0){let e=a.reduce((e,o)=>e+o.monto,0);if(e>u){let a=await o.prisma.$queryRaw`
                SELECT 
                  COALESCE(
                    (SELECT fondo_inicial FROM sesiones_caja WHERE id = ${t}),
                    0
                  ) + 
                  COALESCE(
                    (SELECT SUM(total) FROM ventas v 
                     WHERE EXISTS (
                       SELECT 1 FROM pagos_venta pv 
                       INNER JOIN metodos_pago mp ON pv.metodo_pago_id = mp.id
                       WHERE pv.venta_id = v.id AND LOWER(mp.nombre) = 'efectivo'
                     )
                     AND v.fecha_venta >= (SELECT fecha_apertura FROM sesiones_caja WHERE id = ${t})
                    ),
                    0
                  ) +
                  COALESCE(
                    (SELECT SUM(monto) FROM movimientos_caja 
                     WHERE sesion_caja_id = ${t} 
                     AND tipo_movimiento = 'ingreso_adicional' 
                     AND metodo_pago = 'efectivo'
                    ),
                    0
                  ) -
                  COALESCE(
                    (SELECT SUM(monto) FROM retiros_caja 
                     WHERE sesion_caja_id = ${t} 
                     AND estado = 'completado'
                    ),
                    0
                  ) -
                  COALESCE(
                    (SELECT SUM(monto) FROM gastos_caja 
                     WHERE sesion_caja_id = ${t}
                    ),
                    0
                  ) -
                  COALESCE(
                    (SELECT SUM(monto) FROM movimientos_caja 
                     WHERE sesion_caja_id = ${t} 
                     AND tipo_movimiento = 'egreso_operativo' 
                     AND metodo_pago = 'efectivo'
                    ),
                    0
                  ) as efectivo_esperado
              `,i=a[0]?.efectivo_esperado||0,n=e-u;if(console.log("💵 Validación de cambio:",{efectivoDisponible:i,montoPagado:e,montoVenta:u,cambioRequerido:n,suficiente:i>=n}),i<n)throw Error(`⚠️ Efectivo insuficiente para dar cambio. Disponible en caja: $${i.toLocaleString("es-CO")}, Cambio requerido: $${n.toLocaleString("es-CO")}. Sugerencia: Use pago exacto, tarjeta o pago mixto.`);console.log("✅ Efectivo suficiente para dar cambio")}}}let _=`VTA-${Date.now()}-${Math.floor(1e3*Math.random()).toString().padStart(3,"0")}`,m=await a.ventas.create({data:{codigo_venta:_,usuario_id:e.usuario_id,turno_caja_id:e.turno_caja_id,cliente_id:e.cliente_id,cliente_nombre:e.cliente_nombre,cliente_email:e.cliente_email,cliente_telefono:e.cliente_telefono,subtotal:n,descuento:d,impuesto:l,total:u,requiere_factura:e.requiere_factura||!1,factura_generada:e.factura_generada||!1,observaciones:e.observaciones,estado:"completada"}});for(let o of(console.log(`✅ Venta creada: ${_} (ID: ${m.id})`),r)){if(o.producto_id<0){console.log(`  📦 Producto ficticio detectado (no registrado en inventario)`),await a.detalle_ventas.create({data:{venta:{connect:{id:m.id}},cantidad:o.cantidad,precio_unitario:o.precio_unitario,subtotal:o.cantidad*o.precio_unitario,costo_unitario:null,observaciones:o.observaciones||`Producto ficticio: ID ${o.producto_id}`}}),console.log(`  ✅ Item ficticio agregado: ${o.observaciones||"sin nombre"}`);continue}let t=await a.productos.findUnique({where:{id:o.producto_id},select:{stock_actual:!0,nombre:!0}}),i=Number(t.stock_actual);console.log(`  🔍 Descontando ${o.cantidad} unidades del producto ${o.producto_id}...`);let n=await c(o.producto_id,o.cantidad,a);for(let e of(console.log(`  ✅ Stock descontado de ${n.length} lote(s)`),n)){await a.detalle_ventas.create({data:{venta_id:m.id,producto_id:o.producto_id,lote_id:e.lote_id,cantidad:e.cantidad,precio_unitario:o.precio_unitario,subtotal:e.cantidad*o.precio_unitario,costo_unitario:e.costo_unitario}});let t=e.costo_unitario?`(costo: $${e.costo_unitario.toFixed(2)}/u)`:"(sin costo)";console.log(`  📦 Item creado: ${e.cantidad} unidades del lote ${e.codigo_lote} ${t}`)}console.log(`  ✅ Stock del producto ${t.nombre} ser\xe1 actualizado autom\xe1ticamente por el trigger SQL`);let r=i-o.cantidad;await a.historial_inventario.create({data:{producto_id:o.producto_id,tipo_movimiento:"venta",cantidad_anterior:i,cantidad_movimiento:o.cantidad,cantidad_nueva:r,usuario_id:e.usuario_id,referencia_id:m.id,referencia_tipo:"venta",observaciones:`Venta ${_} - ${o.cantidad} ${t.nombre}`,fecha_movimiento:new Date}}),console.log(`  📝 Historial registrado: ${t.nombre} ${i} → ${r}`)}for(let o of e.pagos)await a.pagos_venta.create({data:{venta_id:m.id,metodo_pago_id:o.metodo_pago_id,monto:o.monto,referencia:o.referencia}}),console.log(`💳 Pago registrado: $${o.monto} (m\xe9todo ID: ${o.metodo_pago_id})`);return a.ventas.findUnique({where:{id:m.id},include:{usuario:{select:{id:!0,nombre:!0,apellido:!0,email:!0}},detalle_ventas:{include:{producto:{select:{id:!0,codigo:!0,nombre:!0,unidad:!0,imagen_url:!0}},lote:{select:{id:!0,codigo_lote:!0,fecha_vencimiento:!0}}}},pagos_venta:{include:{metodo_pago:{select:{id:!0,nombre:!0,icono:!0}}}},cliente:!0}})},{maxWait:1e4,timeout:2e4});console.log(`🎉 Venta completada exitosamente: ${n?.codigo_venta}`);try{await (0,a.checkStockBajo)()}catch(e){console.error("Error al verificar alertas de stock bajo:",e)}return n}catch(e){if(console.error("❌ Error al crear venta:",e),e instanceof Error)throw e;throw Error("Error al procesar la venta")}}async function s(e){let a={deleted_at:null};(e?.fecha_desde||e?.fecha_hasta)&&(a.fecha_venta={},e.fecha_desde&&(a.fecha_venta.gte=new Date(e.fecha_desde)),e.fecha_hasta&&(a.fecha_venta.lte=new Date(e.fecha_hasta))),e?.usuario_id&&(a.usuario_id=e.usuario_id),e?.cliente_id&&(a.cliente_id=e.cliente_id),e?.estado&&(a.estado=e.estado),e?.metodo_pago&&(a.pagos_venta={some:{metodo_pago_id:e.metodo_pago}}),e?.search&&(a.OR=[{codigo_venta:{contains:e.search,mode:"insensitive"}},{cliente_nombre:{contains:e.search,mode:"insensitive"}}]);let t=e?.page||1,i=e?.limit||20;try{let[e,n]=await Promise.all([o.prisma.ventas.findMany({where:a,skip:(t-1)*i,take:i,orderBy:{fecha_venta:"desc"},include:{usuario:{select:{id:!0,nombre:!0,apellido:!0}},cliente:{select:{id:!0,nombre:!0,tipo_cliente:!0}},pagos_venta:{include:{metodo_pago:{select:{nombre:!0,icono:!0}}}},_count:{select:{detalle_ventas:!0}}}}),o.prisma.ventas.count({where:a})]);return{data:e,pagination:{page:t,limit:i,total:n,totalPages:Math.ceil(n/i),hasMore:t*i<n}}}catch(e){throw console.error("Error fetching sales:",e),Error("Error al obtener ventas")}}async function l(e){try{let a=await o.prisma.ventas.findUnique({where:{id:e},include:{usuario:{select:{id:!0,nombre:!0,apellido:!0,email:!0}},cliente:!0,detalle_ventas:{include:{producto:{select:{id:!0,codigo:!0,nombre:!0,unidad:!0,imagen_url:!0,categoria:{select:{nombre:!0,color:!0,icono:!0}}}},lote:{select:{id:!0,codigo_lote:!0,fecha_vencimiento:!0,fecha_produccion:!0}}}},pagos_venta:{include:{metodo_pago:{select:{id:!0,nombre:!0,icono:!0,descripcion:!0}}}}}});if(!a)throw Error("Venta no encontrada");return a}catch(e){if(console.error("Error fetching sale by id:",e),e instanceof Error)throw e;throw Error("Error al obtener venta")}}async function u(e,a,t=!0){try{return console.log(`🚫 Cancelando venta ID: ${e}`),await o.prisma.$transaction(async o=>{let i=await o.ventas.findUnique({where:{id:e},include:{detalle_ventas:!0}});if(!i)throw Error("Venta no encontrada");if("cancelada"===i.estado)throw Error("La venta ya está cancelada");if(i.deleted_at)throw Error("La venta ya fue eliminada");if(t)for(let e of i.detalle_ventas)e.lote_id&&await o.lotes_productos.update({where:{id:e.lote_id},data:{cantidad:{increment:Number(e.cantidad)},estado:"disponible"}}),e.producto_id&&await o.productos.update({where:{id:e.producto_id},data:{stock_actual:{increment:Number(e.cantidad)}}}),console.log(`  ↩️ Stock reintegrado: ${e.cantidad} unidades al lote ID ${e.lote_id}`);let n=await o.ventas.update({where:{id:e},data:{estado:"cancelada",deleted_at:new Date,observaciones:`${i.observaciones||""}

[CANCELADA] ${a}`.trim()},include:{usuario:!0,detalle_ventas:{include:{producto:!0,lote:!0}},pagos_venta:{include:{metodo_pago:!0}}}});return console.log(`✅ Venta ${i.codigo_venta} cancelada exitosamente`),n})}catch(e){if(console.error("Error al cancelar venta:",e),e instanceof Error)throw e;throw Error("Error al cancelar venta")}}e.s(["cancelSale",()=>u,"createSale",()=>d,"getSaleById",()=>l,"getSales",()=>s,"validarCambioDisponible",()=>n])},626633,e=>{"use strict";var o=e.i(322632);let a=o.z.object({producto_id:o.z.number().int({message:"El ID del producto debe ser un número entero"}).refine(e=>0!==e,{message:"El ID del producto no puede ser 0"}),lote_id:o.z.number().int().positive({message:"El ID del lote debe ser un número positivo"}).optional(),cantidad:o.z.number().positive({message:"La cantidad debe ser mayor a 0"}),precio_unitario:o.z.number().positive({message:"El precio unitario debe ser mayor a 0"}),descuento_porcentaje:o.z.number().min(0).max(100).optional(),observaciones:o.z.string().optional()}),t=o.z.object({metodo_pago_id:o.z.number().int().positive({message:"Debe seleccionar un método de pago válido"}),monto:o.z.number().positive({message:"El monto debe ser mayor a 0"}),referencia:o.z.string().max(100).optional()}),i=o.z.object({items:o.z.array(a).min(1,{message:"Debe agregar al menos un producto a la venta"}),pagos:o.z.array(t).min(1,{message:"Debe registrar al menos un método de pago"}),usuario_id:o.z.number().int().positive().optional(),turno_caja_id:o.z.number().int().positive().optional(),cliente_id:o.z.number().int().positive().optional(),cliente_nombre:o.z.string().max(150).optional(),cliente_documento:o.z.string().max(50).optional(),cliente_email:o.z.string().email().max(150).optional(),cliente_telefono:o.z.string().max(20).optional(),efectivo_recibido:o.z.number().min(0).optional(),descuento_global:o.z.number().min(0).max(100).optional(),requiere_factura:o.z.boolean().default(!1),factura_generada:o.z.boolean().default(!1),observaciones:o.z.string().max(500).optional()}).refine(e=>{let o=e.pagos.reduce((e,o)=>e+o.monto,0),a=e.items.reduce((e,o)=>{let a=o.descuento_porcentaje??0;return e+o.cantidad*o.precio_unitario*(1-a/100)},0)*(1-(e.descuento_global??0)/100);return o>=a-1&&o<=1.25*a+1},{message:"La suma de los pagos debe ser mayor o igual al total de la venta",path:["pagos"]}),n=o.z.object({page:o.z.number().int().positive().default(1),limit:o.z.number().int().positive().max(100).default(20),fecha_desde:o.z.string().datetime().optional(),fecha_hasta:o.z.string().datetime().optional(),usuario_id:o.z.number().int().positive().optional(),cliente_id:o.z.number().int().positive().optional(),estado:o.z.enum(["completada","cancelada","pendiente"]).optional(),metodo_pago:o.z.number().int().positive().optional(),search:o.z.string().optional()}),r=o.z.object({motivo:o.z.string().min(10,{message:"Debe especificar el motivo de la cancelación (mínimo 10 caracteres)"}).max(500),requiere_reintegro_stock:o.z.boolean().default(!0)});e.s(["cancelSaleSchema",0,r,"createSaleSchema",0,i,"salesFiltersSchema",0,n])}];

//# sourceMappingURL=lib_be540c5b._.js.map