Comments (7)
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:
- Cuando validás N comprobantes y hay una falla, el error aplica al primero no-validado.
- Los anteriores son validados exitosamente (y les queda el CAE y número de comprobante).
- 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.
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.
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.
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.
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.
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.
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)
- Points of sales are incorrectly saved as blocked HOT 2
- Docs for `latest` should have a banner to indicate this is an unreleased version
- Change value used to check if fetched points of sales are blocked
- AuthTicket service field (DataError: value too long for type character varying(6) ) HOT 1
- Qn: What about adding new services to the project. HOT 5
- Test certificate used in CI has expired
- Fontconfig error: Cannot load default config file HOT 7
- CAEA support HOT 3
- Tox test error HOT 5
- Tests PointOfSales.issuance_type wrong value HOT 4
- Authorization over POS in tests HOT 3
- Tutorial de renovación de certificados HOT 3
- Error en el formulario de TaxPayer en referencia a certificate HOT 6
- Validations with cae expiration `31 de diciembre de 1969 a las 21:00` HOT 1
- Factura E
- Se pueden generar: Factura de Crédito electrónica MiPyMEs (FCE) A? HOT 9
- Se subio el changelog 11.2.0? HOT 3
- Crash with urllib3 >= 2.0.0
- Error al momento de registrar una Nota de Crédito electrónica MiPyMEs (FCE) A HOT 20
- Integrate with django's custom file storage settings HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from django-afip.