01. DATOS GENERALES
Línea de producto: | Microsiga Protheus. | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Segmento: | Servicios - Mercado Internacional. | ||||||||||||||||
Módulo: | SIGAFAT - Facturación. | ||||||||||||||||
Función: |
| ||||||||||||||||
Ticket: | 8027588 | ||||||||||||||||
Issue: | DMINA-8371 | ||||||||||||||||
Versiones: | 12.1.17 | 12.1.23 | 12.1.25 | 12.1.27 |
02. SITUACIÓN/REQUISITO
En el módulo de Facturación en la rutina de Generación de notas de créditos y débito(MATA465N), cuando se tienen los parámetros MV_CFDUSO=3 y MV_FACTAUT= "S”, y al informar la serie del documento (F1_SERIE) se detona el siguiente error log: "array out of bounds [3] of [2] on LOCXVAL(LOCXNF.PRW)".
Cuando el parámetro MV_FACTAUT = "N”, en la función LocXSx5NF () se lleva un flujo estándar para obtener el número de documento y la serie. Estos valores son guardados en el arreglo aRet: = {cNumero, cSerie, SFP->FP_CAI, SFP->FP_NRCERT}. Por lo tanto, es necesario crear una solución para poder utilizar ambos flujos ya que cuando MV_FACAUT ="S" el arreglo aRet no cuenta con los campos SFP->FP_CAI y SFP->FP_NRCERT, y por esta razón se detona el error log.
03. SOLUCIÓN
Dentro de la rutina de Documentos Fiscales(Locxnf), en la función LocXSx5NF () para el caso que MV_FACTAUT= "S" y la factura electrónica está activa, se agrega una validación para generar esos dos elementos en el arreglo con los contenidos de los campos SFP->FP_CAI y SFP->FP_NRCERT.
Para generar los elementos del arreglo se creó una función en la rutina Funciones Genéricas para notas fiscales México(Locxmex), la cual, valida, si los campos existen en la tabla de Control de formularios(SFP) se agrega su contenido a los elementos del arreglo, si los campos no existen, se crean esos 2 elementos, pero con valores vacíos.
También la modifico la función CFDChkFol() dentro de la rutina de Funciones genéricas de localizaciones(Locxfuna) , la cual valida el numero de documento y la serie que se está informando en la nota fiscal, ya que se detectó que no se actualiza de manera correcta el campo F1_DOC al informar de manera manual la serie del documento.
Parámetros
MV_CFDUSO= "2" // Indica si las facturas electrónicas se utilizaran o no, configurándose con: 0 - No utiliza Fact-E, 1-Utiliza Fact-e, 2-Indica uso de Fact-E.
MV_CFDI_TI = .T. // Indica si se va a realizar el timbrado CFDi al momento de generar el Comprobante Fiscal.
MV_FACTAUT = "S" // Determina si la serie y numero de póliza son seleccionados de forma automática (igual a S) o manual (igual a N).
Pre condiciones:
- Contar con un Cliente en la tabla SA1.
- Contar con un producto en el catálogo de Productos (SB1), el campo Prod/Serv SA debe contener un valor valido del catalogo de Productos/Servicios.
- Contar con un registro en el control de planillas para la serie A y la especie FCC
Pasos para realizar la solución:
- Ingresar al módulo SIGAFAT, a la opción "Actualizaciones | Facturación | Generac. de Notas de Credito y Debito" (MATA465N).
- Configurar el grupo de preguntas :
- ¿Formulario propio? = Si
- ¿Tipo de Factura? = Abono
- Dar clic en la opción "Incluir".
- Capturar datos del Encabezado de la NCC.
- Colocar en la sección de Ítems, los datos del producto.
- Verificar los datos de la NCC y dar clic en "Grabar".
- En la rutina "Actualizaciones | Facturación | Timbrado CFDi" (FISA800).
- Configurar grupo de preguntas para filtrar la NCC generada anteriormente.
- Seleccionar la NCC y dar clic en "Confirmar".
- Verificar el timbrado correcto de la NCC.
04. INFORMACIÓN ADICIONAL
El valor por default del parámetro MV_FACTAUT es "N" (recomendado); y cuando se tiene el parámetro MV_FACTAUT = "S", se activa el uso de los puntos de entrada M465SQNF y LOCXPE31; los cuales se utilizan para validar la serie del documento fiscal y tiene como retorno un arreglo con los siguientes elementos: 1o - Cliente / 2o-NF Cliente / 3o-Serie.
Ejemplo de punto de entrada M465SQNF:
#include 'protheus.ch'
Function U_M465SQNF()
Local aData := {}
Local cSerie := "A "
Local cResult
dbSelectArea("SX5")
dbSetOrder(1)
If (SX5 -> (DbSeek(xFilial("SX5") + "01" + cSerie )))
cResult := RTRIM(SX5->X5_DESCRI)
endif
aData := {"", cResult, cSerie}
Return aData
**Nota:
- Se puede usar el mismo ejemplo para el punto de entrada LOCXPE31.