01. DATOS GENERALES
Producto | TOTVS Backoffice | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
Línea de producto: | Línea Protheus | |||||||||
Segmento: | Backoffice | |||||||||
Módulo: | SIGAFAT - Facturación | |||||||||
Función: |
| |||||||||
País: | México | |||||||||
Ticket: | 13513153 | 14326293 | |||||||||
Requisito/Story/Issue (informe el requisito vinculado): | DMINA-14988, DMINA-15837 |
02. SITUACIÓN/REQUISITO
Al intentar generar una factura con complemento de Carta Porte desde la rutina automática MATA467N, manda log del campo de Precio Unitario (D2_PRCVEN) como inválido cuando se coloca en 0.
03. SOLUCIÓN
Modificación de rutinas para considerar Carta Porte desde ExecAuto:
LOCXNF
- Se agrega nuevo parámetro para datos de Carta Porte en las funciones MATA467N y LOCXNF, copiando el parámetro a arreglo Privado para dar alcance en todas las funciones del proceso.
- En la función GravaNfGeral, cuando es ejecución por rutina automática (ExecAuto), se hace llamada a nueva función LxCPAuto para generar la Carta Porte.
- Función CposVazio, si es factura de Traslado o con Carta Porte, se hace tratamiento correcto para permitir Precio Unitario y Valor Total en cero.
LOCXMEX
- Nueva función LxCPAuto para la generación de Carta Porte usando el modelo (MVC).
- Nueva función LxArray2Model para asignar valores a campos de las tabla de Carta Porte haciendo las validaciones correspondientes.
- Realizar un respaldo del repositorio del ambiente (archivo .rpo).
- Aplicar el parche que fue generado para la issue DMINA-14988.
- Crear una función de usuario para generar una factura de traslado con Carta Porte a través de ExecAuto de la rutina MATA467N (Ver ejemplo M467AUTO).
- Compilar la rutina y agregarla al módulo SIGAFAT, menú Actualizaciones | Facturación.
- En el módulo de Facturación (SIGAFAT) ir al menú Actualizaciones | Facturación | Factura de Traslado Automática (M467AUTO).
- Generar la factura de Traslado con Carta Porte a través de ExecAuto.
- Verificar la correcta generación de la factura y de la Carta Porte.
04. INFORMACIÓN ADICIONAL
#include "Protheus.ch" User Function M467Auto() Processa( { || GeneraNF() } , "", "Generando NF con carta porte..." ) Return Static Function GeneraNF() Local aCab := {} Local aLinha := {} Local aItens := {} Local aCartaPorte := {} Local cSerie := "A " Local cDoc := "" Local cCertFol := SuperGetMv("MV_CFDI_CS",,"") Local cProd := PadR("TST000000000037",20) Private lMsErroAuto := .F. // Consecutivo factura SX5->(DBSetOrder(1)) SX5->(MsSeek(xFilial("SX5")+"01"+cSerie)) cDoc := IIf( SX5->(Found()), PadR(Trim(X5Descri()),20) , StrZero(126,20,0) ) // Encabezado de factura AAdd( aCab, { "F2_CLIENTE", "016082" , Nil } ) AAdd( aCab, { "F2_LOJA" , "01" , Nil } ) AAdd( aCab, { "F2_SERIE" , cSerie , Nil } ) AAdd( aCab, { "F2_DOC" , cDoc , Nil } ) AAdd( aCab, { "F2_COND" , "015" , Nil } ) // AAdd( aCab, { "F2_CONUNI" , "2" , Nil } ) AAdd( aCab, { "F2_EMISSAO", dDataBase , Nil } ) AAdd( aCab, { "F2_EST" , "QRO" , Nil } ) AAdd( aCab, { "F2_TIPO" , "N" , Nil } ) AAdd( aCab, { "F2_ESPECIE", "NF " , Nil } ) AAdd( aCab, { "F2_PREFIXO", "A" , Nil } ) AAdd( aCab, { "F2_MOEDA" , 1 , Nil } ) AAdd( aCab, { "F2_TXMOEDA", 1 , Nil } ) AAdd( aCab, { "F2_FORMUL" , "S" , Nil } ) AAdd( aCab, { "F2_TIPODOC", "21" , Nil } ) AAdd( aCab, { "F2_USOCFDI", "P01" , Nil } ) AAdd( aCab, { "F2_TPCOMPL", "S" , Nil } ) AAdd( aCab, { "F2_APROFOL", "1" , Nil } ) AAdd( aCab, { "F2_CERTFOL", cCertFol , Nil } ) // Ítems de la factura aLinha := {} AAdd( aLinha, { "D2_COD" , cProd , Nil } ) AAdd( aLinha, { "D2_UM" , "UN" , Nil } ) AAdd( aLinha, { "D2_QUANT" , 1 , Nil } ) // AAdd( aLinha, { "D2_PRCVEN" , 0 , Nil } ) // En documento tipo transferencia no informar este campo, si se envía en cero será rechazado // AAdd( aLinha, { "D2_TOTAL" , 0 , Nil } ) // Aplica el mismo criterio que precio unitario AAdd( aLinha, { "D2_PESO" , 1 , Nil } ) AAdd( aLinha, { "D2_TES" , "518" , Nil } ) AAdd( aLinha, { "D2_ESPECIE", "NF " , Nil } ) AAdd( aItens, aLinha) //********** Carta porte ********** aCartaPorte := { Array(0), Array(2,0), Array(1,0), Array(1,0) } // Generales aAdd( aCartaPorte[1], {"A1X_INTERN", "N"} ) aAdd( aCartaPorte[1], {"A1X_ENTSAL", "S"} ) aAdd( aCartaPorte[1], {"A1X_TRANSP", "01"} ) aAdd( aCartaPorte[1], {"A1X_PERSCT", "TPAF02"} ) aAdd( aCartaPorte[1], {"A1X_PERMIS", "132579"} ) aAdd( aCartaPorte[1], {"A1X_ASEGUR", "ASEMEX"} ) aAdd( aCartaPorte[1], {"A1X_POLIZA", "246800"} ) aAdd( aCartaPorte[1], {"A1X_VEHIC" , "00000001"} ) // Ubicaciones aAdd( aCartaPorte[2][1], {"A1Y_TIPEST", "O"} ) aAdd( aCartaPorte[2][1], {"A1Y_RFCORI", "XAXX010101000"} ) aAdd( aCartaPorte[2][1], {"A1Y_NOMORI", "UBICACION ORIGEN"} ) aAdd( aCartaPorte[2][1], {"A1Y_FECSAL", CtoD("12/07/2022")} ) aAdd( aCartaPorte[2][1], {"A1Y_HRASAL", "12:00:00"} ) aAdd( aCartaPorte[2][1], {"A1Y_CALORI", "DIRECCION ORIGEN"} ) aAdd( aCartaPorte[2][1], {"A1Y_EXTORI", "1020"} ) aAdd( aCartaPorte[2][1], {"A1Y_EDOORI", "QUE"} ) aAdd( aCartaPorte[2][1], {"A1Y_CPORI" , "76000"} ) aAdd( aCartaPorte[2][1], {"A1Y_COLORI", "0001"} ) aAdd( aCartaPorte[2][1], {"A1Y_LOCORI", "01"} ) aAdd( aCartaPorte[2][1], {"A1Y_MUNORI", "014"} ) aAdd( aCartaPorte[2][1], {"A1Y_PAIORI", "MEX"} ) aAdd( aCartaPorte[2][2], {"A1Y_TIPEST", "D"} ) aAdd( aCartaPorte[2][2], {"A1Y_DISREC", 15} ) aAdd( aCartaPorte[2][2], {"A1Y_RFCORI", "XAXX010101000"} ) aAdd( aCartaPorte[2][2], {"A1Y_NOMORI", "UBICACION DESTINO"} ) aAdd( aCartaPorte[2][2], {"A1Y_FECSAL", CtoD("12/07/2022")} ) aAdd( aCartaPorte[2][2], {"A1Y_HRASAL", "16:00:00"} ) aAdd( aCartaPorte[2][2], {"A1Y_CALORI", "DIRECCION DESTINO"} ) aAdd( aCartaPorte[2][2], {"A1Y_EXTORI", "3004"} ) aAdd( aCartaPorte[2][2], {"A1Y_EDOORI", "QUE"} ) aAdd( aCartaPorte[2][2], {"A1Y_CPORI" , "76246"} ) aAdd( aCartaPorte[2][2], {"A1Y_COLORI", "0001"} ) aAdd( aCartaPorte[2][2], {"A1Y_MUNORI", "011"} ) aAdd( aCartaPorte[2][2], {"A1Y_PAIORI", "MEX"} ) // Operadores aAdd( aCartaPorte[3][1], {"A1Z_OPERAD", "000001"} ) // Propietarios/Arrendadores aAdd( aCartaPorte[4][1], {"AE0_TIPO" , "P"} ) aAdd( aCartaPorte[4][1], {"AE0_PARTE" , "PT01"} ) aAdd( aCartaPorte[4][1], {"AE0_TRANSP", "000001"} ) // Rutina automática MSExecAuto( { |x,y,z,w| Mata467n(x,y,z,,,,w) }, aCab, aItens, 3, aCartaPorte ) //3-Incluir, 5-Excluir e 6-Cancelar If lMsErroAuto MsgStop("Error en la grabación de la factura con carta porte.") MostraErro() Else MsgAlert("Factura incluida con éxito.") EndIf Return
Importante
Considerar los siguientes criterios sobre los datos para la factura de tipo Traslado y para la Carta Porte:
Los campos considerados en el ejemplo son los esenciales para la aceptación de la factura así como para la generación del CFDI.
Encabezado de la factura
- En el ejemplo se muestra la forma estándar de obtener el consecutivo de documento de acuerdo a la serie. El sistema realiza la actualización para el próximo consecutivo.
Ítems de la factura
- El Precio Unitario (D2_PRCVEN) y el Valor Total (D2_TOTAL), no deben ser incluidos. Si se envían en cero, se rechaza la factura.
- El Peso (D2_PESO) debe ser enviado con un valor mayor a 0.
Carta Porte
- El arreglo de datos debe tener 4 elementos principales, del 2 al 4 deben ser sub-arreglos indicando la cantidad de ítems a contener.
- Si no se requiere alguno de los elementos, por ejemplo el 4to, Propietarios/Arrendatarios, el elemento se debe definir aunque no es necesario incluir el sub-arreglo.
Todos los campos se validan con las mismas reglas que en la captura manual, incluso aquellos que no son obligatorios. Para detalles, consulte el documento técnico cuyo enlace se encuentra la sección 05. Asuntos relacionados.
Esta solución aplica para ambiente con CFDI versión 3.3 o 4.0.¡IMPORTANTE!
05. ASUNTOS RELACIONADOS
- documento_tecnico
- base_conocimiento
- protheus
- mercado_internacional
- sigafat
- facturacion
- locxnf
- locxmex
- notas_fiscales
- funciones_genericas_notas_fiscales
- 12_1_33
- 12133
- totvs_backoffice
- ticket_13513153
- 13513153
- mexico
- mex
- cfdi_3_3
- cfdi_4_0
- dmina_14988
- dmina_15837
- 14326293
- ticket_14326293
- execauto_nf_con_carta_porte
- traslado
- carta_porte
- cfdi