Code Monkey home page Code Monkey logo

Comments (7)

WhyNotHugo avatar WhyNotHugo commented on July 30, 2024 1

Este es el resultado que devuelve el AFIP (convertido de XML a algo legible).

Es de un escenario donde se intentan validar tres comprobantes, pero el segundo es inválido.

{
    'FeCabResp': {
        'Cuit': 20329642330,
        'PtoVta': 1,
        'CbteTipo': 6,
        'FchProceso': '20200612165914',
        'CantReg': 3,
        'Resultado': 'P',
        'Reproceso': 'N'
    },
    'FeDetResp': {
        'FECAEDetResponse': [
            {
                'Concepto': 1,
                'DocTipo': 96,
                'DocNro': 203012345,
                'CbteDesde': 6468,
                'CbteHasta': 6468,
                'CbteFch': '20200612',
                'Resultado': 'A',
                'Observaciones': None,
                'CAE': '70240840044538',
                'CAEFchVto': '20200622'
            },
            {
                'Concepto': 1,
                'DocTipo': 80,
                'DocNro': 203012345,
                'CbteDesde': 6469,
                'CbteHasta': 6469,
                'CbteFch': '20200612',
                'Resultado': 'R',
                'Observaciones': {
                    'Obs': [
                        {
                            'Code': 10015,
                            'Msg': 'Factura B (CbteDesde igual a CbteHasta), DocTipo: 80, DocNro 203012345 no se encuentra registrado en los padrones de AFIP y no corresponde a una cuit pais.'
                        }
                    ]
                },
                'CAE': None,
                'CAEFchVto': None
            },
            {
                'Concepto': 1,
                'DocTipo': 96,
                'DocNro': 203012345,
                'CbteDesde': 6470,
                'CbteHasta': 6470,
                'CbteFch': '20200612',
                'Resultado': 'R',
                'Observaciones': None,
                'CAE': None,
                'CAEFchVto': None
            }
        ]
    },
    'Events': None,
    'Errors': None
}

En principio, AFIP intenta validarlos en order, así que:

  1. Cuando validás N comprobantes y hay una falla, el error aplica al primero no-validado.
  2. Los anteriores son validados exitosamente (y les queda el CAE y número de comprobante).
  3. Todos los no-validados no tienen ni CAE ni número de comprobante.

El parseo del resultado se hace en esta función.

Creo que sería perfectamente aceptable cambiar el resultado de una lista de errores a un dict con Receipt como clave y listas de errores como valores (Dict[Receipt, List[str]]).

El cambio es backwards-incompatible, pero master ya tiene otros cambios que también lo son, así que sería aceptable agregar esto; iría para v8.0.0.

from django-afip.

WhyNotHugo avatar WhyNotHugo commented on July 30, 2024 1

Implemente devoler un Dict[Receipt, List[str]] (la lista es una lista de errores), pero, la verdad, me parece una API pésima.

Voy a guardar en la DB los intentos fallidos junto con los errores, y tras validar, devolver simplemente todos los receipts. Se pueden reconocer los exisotos porque receipt.validation.result == RESULT_APPROVED (tal como es ahora), y el resto tendrá las observaciones que corresponda.

Esto da más libertad a como se manejan los errores -- incluyendo que una persona los audite en otro momento, etc. Además, encaja bien en el modelo actual.

from django-afip.

WhyNotHugo avatar WhyNotHugo commented on July 30, 2024

Hmmm... why you're saying makes sense. Let me double check if the response from Afip actually has this information and if can somehow map it (in case it is).

from django-afip.

gusarg81 avatar gusarg81 commented on July 30, 2024

Hola,

¿Se pudo ver algo sobre esto? Es lo único que me impide enviar por batches (lo hago en baches en mi aplicación, pero no hacia la AFIP. De esta manera si se dá un error, sé a que comprobante pertenece).

Salvo que lo pueda hacer de otra manera.

Gracias!

from django-afip.

gusarg81 avatar gusarg81 commented on July 30, 2024

Hugo,

Hoy estoy empezando a ver el tema de validar por batches (dado que de a uno veo que tarda bastante cuando son muchos).

Por ejemplo, mi duda es: es como identificar a qué receipt pertenece el error, por ejemplo, en una excepción (en este caso, que lo hice adrede):

django_afip.exceptions.AfipException: Error 10069: Campo DocNro no puede ser igual al del emisor.

Más allá de que los que no dan error se validan, acorde a lo que me explicás, me interesaría saber en el momento de la excepción específicamente el receipt que no fue validado/dió error de ser posible.

En este ejemplo, fue aplicado validate() en el queryset.

Gracias.

from django-afip.

WhyNotHugo avatar WhyNotHugo commented on July 30, 2024

Tengo curiosidad en que tipo de errores de devuelve frequentemente.

Al estar desarrollado capaz uno ve errores seguidos, pero en producción sería raro -- implica que estás mandando datos inconsitentes. Qué tipo de error te cruzás frequemente?

from django-afip.

gusarg81 avatar gusarg81 commented on July 30, 2024

En realidad no me cruzo con errores frecuentes (quizás un poco más en el entorno de testing, pero no tanto). Pero sí me gustaría tener el control exacto de que cuando valido por batches, identificar qué comprobante en cuestión dió error, dado que el error no informa el comprobante en cuestión.

from django-afip.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.