// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Reporte: Reporte de Devoluciones sobre Venta por Producto // Reporte de Devoluciones sobre Compra por Producto // Reporte de Devoluciones de Remision por Producto // Reporte de Devoluciones de Consignación por Producto // // Sistema: ADMINPAQ Versión v1.0 Windows // // Descripcion: // // Consideraciones : // Creación : Luis Palau Castañeda. 15/Agosto/2001 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 18/05/2007 JAAM N.C.147 Esquema de adicion de unidades de compra y venta // 17/07/2007 ELVS N.D.4750 No se deben mostrar los servicios que vienen de una nota de venta. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* // INCLUSION DE ARCHIVOS // ************************************************************************************************* Incluye LibAdminPaq.rpt // ************************************************************************************************* // INICIO PARAMETROS // ************************************************************************************************* Parametro pFechaInicial = '20050401' // Fecha inicial del rango Parametro pFechaFinal = '20050430' // Fecha final del rango Parametro pProductoInicial = '(Ninguno)' Parametro pProductoFinal = 'z' Parametro pUnidad = 0 // 0 = Unidad Base· 1 = Unidad No Equivalente· 2 = Seleccionar Unidad Parametro pIdUnidad = 1 // base de datos de unidades (id) Parametro pIdMoneda = 1 // 1 = ID moneda Peso mexicano Parametro pTipoReporte = 1 // 1 = Reporte de Devoluciones sobre Venta por Producto // 2 = Reporte de Devoluciones sobre Compra por Producto // 3 = Reporte de Devoluciones de Remision por Producto // 4 = Reporte de Devoluciones de Consignación por Producto // ************************************************************************************************* // INICIO APERTURA TABLAS // ************************************************************************************************* UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' // Parametros de la empresa UsaTabla tParametros = tEmpresa['mgw10000'] // Productos UsaTabla tProductos = tEmpresa['mgw10005'] tProductos.Usaindice['iCodigoTipo'] // Movimientos UsaTabla tMovimientos = tEmpresa['mgw10010'] Alias 'Movimientos' tMovimientos.Usaindice['iProductoDoctoDeAfecFecha'] // Movimientos dueños de movimientos ocultos UsaTabla tMovtoOwner = tEmpresa['MGW10010'] Alias 'MovtoOwner' tMovtoOwner.Usaindice[''] // Documentos UsaTabla tDocumentos = tEmpresa['mgw10008'] tDocumentos.Usaindice['cIdDocumento'] //unidades peso y med UsaTabla tUnidadesPM = tEmpresa['mgw10026'] tUnidadesPM.Usaindice[''] //EquivalenciasUnidades peso y med UsaTabla tEquivaleUnidadesPM = tEmpresa['mgw10027'] tEquivaleUnidadesPM.Usaindice[''] //Monedas UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] // Usa el índice primario, por cIdMoneda // TiposCambio Usatabla tTiposCambio = tEmpresa['mgw10035'] tTiposCambio.Usaindice['iMonedaFecha'] UsaTabla tClientes = tEmpresa['mgw10002'] tClientes.Usaindice[''] // ************************************************************************************************* tParametros.Busca Primero // ************************************************************************************************* //DEFINICION DE COLUMNAS // ************************************************************************************************* Columnas 20;2.4,0.15,5.7,0.15,2.4,0.15,0.45,0.15,2.4,0.15,2.4,0.15,0.45,0.15,2.4,0.15,0 UsaLetra 'Arial' Altura 9 [C0,C3].Decimales 0 [C0,C3].Blanco ' ' tMonedas.Busca[@str(pIdMoneda;0)] gDecimales = tMonedas(cDecimalesMoneda) [C4,C8,C10,C14].Coma [C4,C10].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades [C8,C14].Decimales gDecimales [C4,C8,C10,C14].Blanco '0.00' [C0..C3,C5..C7,C9,C11..C13,C15..C19].Blanco ' ' // ************************************************************************************************* //VARIABLES GLOBALES // ************************************************************************************************* gUnidad = pUnidad gIdUnidad = pIdUnidad gTotalGral = '' gTotalPaquetes = '' vDocumentoVen = 0 vDocumentoDev = 0 gNombreMoneda = tMonedas(cNombreMoneda) kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0] // ************************************************************************************************* // FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* // ************************************************************************************************* // Descripcion: Esta función recibe una fecha con formato ddmmaaaa y la convierte a formato dd/mmm/aaaa // Entradas : Fecha : contiene la fecha AAAAMMDD // Salida : regresa una cadena con la fecha en formato DD/MMM/AAAA // ************************************************************************************************* DefFunc fEditaFecha(aFecha) Local lMes Local lRegreso lMes = @INT(@SubStr(aFecha;4;2)) lRegreso[0] = @SubStr(aFecha;6;2) & '/' & @Escoge(kMeses;lMes-1) & '/' & @SubStr(aFecha;0;4) Retorna lRegreso FinFunc // ************************************************************************************************* // Descripcion: imprime los totales generales de las variables gTotalGral // Entradas : // Salida : // ************************************************************************************************* DefFunc fTotalGral() local LTotalLinea LTotalLinea = '==========================='[C0] Texto C4; @col(LTotalLinea;0) Texto C8; @col(LTotalLinea;0) Texto C10; @col(LTotalLinea;0) Texto C14; @col(LTotalLinea;0) Imprime gTotalGral = '' [C0..C3,C11] gTotalGral[2] = 'Total Productos' Imprime gTotalGral gTotalGral = '' // Impresión del Total de paquetes Si (@Col(gTotalPaquetes; 4) > 0) O (@Col(gTotalPaquetes; 10) > 0) gTotalPaquetes = ''[c0..c3,c11] gTotalPaquetes[2] = 'Total Cantidad de Paquetes' Imprime gTotalPaquetes FinSi gTotalPaquetes = '' Finfunc // ************************************************************************************************* // Descripcion: Imprime los totales del producto // Entradas : // Salida : // ************************************************************************************************* DefFunc fTotalProd(atProductos:TABLA) // Solo si la cantidad del producto es mayor a cero se imprime y se acumula Si (@Col(gTotalProd;4) > 0) O (@Col(gTotalProd;10) > 0) Imprime gTotalProd // Acumula a los Totales Si atProductos(cTipoProducto) = 2 // En caso de paquetes acumular las unidades al total de paquetes gTotalPaquetes = gTotalPaquetes + gTotalProd[C4] gTotalPaquetes = gTotalPaquetes + gTotalProd[C10] // Acumular los restantes importes gTotalGral = gTotalGral + gTotalProd[C8,C12,C14] Sino gTotalGral = gTotalGral + gTotalProd[C4,C8,C10,C14] FinSi FinSi gTotalProd = '' FinFunc // ************************************************************************************************* // Descripcion: Esta función regresa el ID del documento del movimiento owner del // movimiento oculto. La razón de ser de ésta función es que los movimientos // ocultos no heredan el campo cIdDocumento de su owner. // Entradas : atMovtoOculto = Movimiento oculto (características, componentes o traspasos) // atMovtoOwner = Movimiento owner // Salida : Id del documento del movimeinto oculto // ************************************************************************************************* DefFunc fIdDocumentoMovtoOwner(atMovtoOculto: Tabla; atMovtoOwner: Tabla) Si atMovtoOculto(cIdMovtoOwner) atMovtoOwner.Busca[@Str(atMovtoOculto(cIdMovtoOwner);0)] // Busca el movimiento owner Si atMovtoOwner->Encontro Retorna atMovtoOwner(cIdDocumento) FinSi FinSi Retorna 0 FinFunc // ************************************************************************************************* // Descripcion : Recorre los movimientos afectados o sin afectar de un producto sumándolos a los totales // Entrada : aAfecInven - Estado de los movimientos // 0 - Sin afectar // 1 - Afectado en existenciasy costos // 2 - Afectado sólo en existencias // atMovimientos - Tabla de movimientos // atMovimientosDestino - Tabla de movimientos destino del pedido, remisión... // tMovtoOwner - Movimientos dueños de los movtos ocultos // atProductos - Tabla de productos // atDocumentos - Tabla de documentos // atUnidadesPM - Tabla de unidades // atEquivaleUnidadesPM - Tabla de equivalencias de unidades // atParametros - Tabla de parámetros // ************************************************************************************************* DefFunc fRecorreMovimientos(aAfecInven; aDocumento; atMovimientos:TABLA; atMovtoOwner:TABLA; atProductos:TABLA; atDocumentos:TABLA; atUnidadesPM:TABLA; atEquivaleUnidadesPM:TABLA; atParametros:TABLA) Local lIdDocumento, lsihubocambio, lCantidad, lNeto, lDescuentos, lNetoMenDesc Local lIdMonedaCte // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte gFechaBusqueda = pFechaInicial // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente atMovimientos.Usaindice['iProductoDoctoDeAfecFecha'] atMovimientos.busca[atProductos(cIdProducto) & ':' & aDocumento & ':' & aAfecInven & ':' & gFechaBusqueda] Si !atMovimientos->ENCONTRO // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda // La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar // en FoxPro la definición del índice para descomponer los elementos de la Llave // Revisar si la llave actual corresponde al Producto / Almacén y al Rango de Fechas. Si atProductos(cIdProducto) = @Val(@SUBSTR(atMovimientos->Llave;0;11)) Si aDocumento = @Val(@SUBSTR(atMovimientos->Llave;11;11)) Si aAfecInven = @Val(@SUBSTR(atMovimientos->Llave;22;6)) Si @SUBSTR(atMovimientos->Llave;28;8) >= pFechaInicial Y @SUBSTR(atMovimientos->Llave;28;8) <= pFechaFinal // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro gFechaBusqueda = @SUBSTR(atMovimientos->Llave;28;8) atMovimientos.busca[atProductos(cIdProducto) & ':' & aDocumento & ':' & aAfecInven & ':' & gFechaBusqueda] FinSi FinSi FinSi FinSi FinSi Mientras atMovimientos->Encontro Y (atMovimientos(cFecha) <= pFechaFinal) Si pTipoReporte = 3 // Devoluciones de remision Si aDocumento = vDocumentoVen // Remisión Si atMovimientos(cAfectaExistencia) != 2 atMovimientos.BUSCA SIGUIENTE[3] Continua FinSi SiNo // Devolución de Remisión Si atMovimientos(cAfectaExistencia) != 1 atMovimientos.BUSCA SIGUIENTE[3] Continua FinSi FinSi FinSi // Busca el documento del movimiento, se debe diferenciar entre movimientos reales y ocultos lIdDocumento = atMovimientos(cIdDocumento) Si lIdDocumento = 0 // es un movimiento oculto lIdDocumento = fIdDocumentoMovtoOwner(atMovimientos; atMovtoOwner) FinSi atDocumentos.Busca[@Str(lIdDocumento;0)] // No tomar los movimientos de documentos cancelados Si atDocumentos(cCancelado) = 1 atMovimientos.BUSCA SIGUIENTE[3] Continua FinSi lIdMonedaCte = 1 tClientes.Busca[@Str(atDocumentos(cIdClienteProveedor);0)] Si tClientes->Encontro lIdMonedaCte = tClientes(cIdMoneda) FinSi fVerificaUnidad(tProductos) // Si el Producto tiene Unidad de Medida NO Equivalente "Y" pUnidad = 1 Si pUnidad = 1 y atProductos(cIdUnidadNoConvertible) != 0 lCantidad = atMovimientos(cUnidadesNC) Sino lCantidad = atMovimientos(cUnidades) Finsi lsihubocambio = 0 //Convertir Importes en la Moneda del Reporte Si pUnidad = 2 Y atProductos(cIdUnidadBase) != 0 // El Producto tiene Unidad de Medida y Peso // Unificar vCantidad de acuerdo a la unidad deseada en el reporte. atEquivaleUnidadesPM.Busca[@Str(atProductos(cIdUnidadBase);0) & ':' & @Str(pIdUnidad;0)] Si atEquivaleUnidadesPM->Encontro lCantidad = lCantidad * atEquivaleUnidadesPM(cFactorConversion) lsihubocambio =1 Finsi Finsi // Busca nombre de la unidad de medida o peso Si pUnidad = 1 y atProductos(cidUnidadNoConvertible) != 0 atUnidadesPM.busca[@str(atProductos(cidUnidadNoConvertible);0)] Sino Si pUnidad = 2 Si lsihubocambio =1 atUnidadesPM.busca[@str(@col(pIdUnidad;0);0)] Sino atUnidadesPM.busca[@str(atProductos(cIdUnidadBase);0)] Finsi Sino atUnidadesPM.busca[@str(atProductos(cIdUnidadBase);0)] Finsi Finsi Si atUnidadesPM->encontro Si aDocumento = vDocumentoVen gTotalProd = atUnidadesPM(cDespliegue)[C6] Si @col(gTotalProd;6)='(N)' gTotalProd = ''[C6] Finsi SiNo gTotalProd = atUnidadesPM(cDespliegue)[C12] Si @col(gTotalProd;12)='(N)' gTotalProd = ''[C12] Finsi FinSi Finsi lNeto = atMovimientos(cNeto) lNeto = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; lNeto; pIdMoneda; lIdMonedaCte) lDescuentos = atMovimientos(cDescuento1) + atMovimientos(cDescuento2) + atMovimientos(cDescuento3) + atMovimientos(cDescuento4) + atMovimientos(cDescuento5) lDescuentos = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; lDescuentos; pIdMoneda; lIdMonedaCte) lNetoMenDesc = lNeto - lDescuentos Si aDocumento = vDocumentoVen gTotalProd = gTotalProd + @Col(lCantidad;0)[C4] gTotalProd = gTotalProd + @Col(lNetoMenDesc;0)[C8] SiNo gTotalProd = gTotalProd + @Col(lCantidad;0)[C10] gTotalProd = gTotalProd + @Col(lNetoMenDesc;0)[C14] FinSi atMovimientos.BUSCA SIGUIENTE[3] FinMientras Finfunc // ************************************************************************************************* // ENCABEZADO // ************************************************************************************************* Encab Texto '@TC{156;0;89}@S{8}Factura Electrónica' Hoja '"@TC{0,0,0}@S{8}Página: ' Imprime Texto '@TC{0,0,0}@S{8}Moneda: '& gNombreMoneda Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre Texto '"@TC{0,0,0}@S{8}Fecha: ' & fEditaFecha(@Hoy()) Imprime Si pTipoReporte = 1 Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones sobre Venta por Producto' Sino Si pTipoReporte = 2 Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones sobre Compra por Producto' Sino Si pTipoReporte = 3 Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones de Remision por Producto' Sino Si pTipoReporte = 4 Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones de Consignación por Producto' Finsi Finsi Finsi Finsi Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora() Imprime Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & fEditaFecha(pFechaInicial) & ' al: ' & fEditaFecha(pFechaFinal) Imprime NEGRITAS TRUE Altura 10 Texto '@TC{0,0,0}@L{-1}' Imprime // V E N D I D O D E V U E L T O Columnas 20;9.6,0.15,6.15,0.15,3,0.15 Si pTipoReporte = 1 Texto C2;' V E N D I D O' Sino Si pTipoReporte = 2 Texto C2;' C O M P R A D O' Sino Si pTipoReporte = 3 Texto C2;'R E M I S I O N A D O' Sino Texto C2;' C O N S I G N A D O' Finsi Finsi Finsi Texto C4;'D E V U E L T O' Imprime //Código Nombre(Producto,Servicio,Paquete) Cantidad Total Cantidad Total Columnas 20;2.4,0.15,5.7,0.15,2.4,0.15,0.45,0.15,2.4,0.15,2.4,0.15,0.45,0.15,2.4,0.15,0 Texto C0;'Código' Texto C2;'Nombre(Producto,Servicio,Paquete)' Texto C4;'^Cantidad' Texto C8;'^Neto-Desc.' Texto C10;'^Cantidad' Texto c14;'^Neto-Desc.' Imprime Texto '@TC{0,0,0}@L{-1}' Imprime NEGRITAS FALSE Altura 10 FinEncab // ************************************************************************************************* // PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ************************************************************************************************* vDoctoNotas = 35 // FBSC POS, variables con los ID de los nuevos tipos de documentos para vDoctoDevNotas = 36 // POS Si pTipoReporte = 1 vDocumentoVen = 4 vDocumentoDev = 5 Sino Si pTipoReporte = 2 vDocumentoVen = 19 vDocumentoDev = 20 Sino Si pTipoReporte = 3 vDocumentoVen = 3 vDocumentoDev = 6 Sino vDocumentoVen = 18 vDocumentoDev = 21 Finsi Finsi Finsi gTotalGral = '' Si @str(pProductoInicial;0) = ' ' tProductos.Busca Primero Sino tProductos.Busca [@str(pProductoInicial;0) & ':'] FinSi Mientras tProductos->Encontro Si @Str(pProductoFinal;0) != ' ' Si tProductos(cCodigoProducto)> @str(pProductoFinal;0) Finciclo Finsi Finsi Si pTipoReporte = 2 o pTipoReporte = 4 Si tProductos(cTipoProducto) = 2 //si es compra y es paquete, se brinca el registro tProductos.Saltareg[1] continua Finsi Finsi //N.D.4750 Si es uno de los servicios para facturar notas de venta no incluirlo Si tProductos(cIdProducto) = tParametros(cIdProdu01) tProductos.Saltareg[1] Continua FinSi Si tProductos(cIdProducto) = tParametros(cIdProdu02) tProductos.Saltareg[1] Continua FinSi Si tProductos(cIdProducto) = tParametros(cIdProdu03) tProductos.Saltareg[1] Continua FinSi Si tProductos(cIdProducto) = tParametros(cIdProdu04) tProductos.Saltareg[1] Continua FinSi Si tProductos(cIdProducto) = tParametros(cIdProdu05) tProductos.Saltareg[1] Continua FinSi gTotalProd = '' gTotalProd = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[C0] gTotalProd = tProductos(cNombreProducto)[C2] gTotalProd = 0[C4] gTotalProd = ''[C6] gTotalProd = 0[C8] gTotalProd = 0[C10] gTotalProd = ''[C12] gTotalProd = 0[C14] // Recorrer los movimientos sin afectar en existencias y costas, afectado y afectado sólo en existencias // Se hace en tres llamados distintos porque el índice no permite hacer un sólo recorrido, además por // cada uno se hace un doble llamado para sacar lo vendido y después lo devuelto Si pTipoReporte = 1 // FBCS POS los valores se actualizan por que en cada iteración vDocumentoVen = 4 // Busca primero facturas y luego notas de venta. vDocumentoDev = 5 Finsi fRecorreMovimientos(0; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(0; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(1; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(1; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(2; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(2; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) Si pTipoReporte = 1 // Si el reporte es de ventas, recorre los documentos de notas y devolución de notas. vDocumentoVen = vDoctoNotas // FBCS POS vDocumentoDev = vDoctoDevNotas fRecorreMovimientos(0; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(0; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(1; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(1; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(2; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) fRecorreMovimientos(2; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros) Finsi fTotalProd(tProductos) tProductos.Saltareg[1] FinMientras //Imprime Totales Generales fTotalGral() // FIN REPORTE