-
-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add helper to finalise interrupted validations #136
Comments
Buenas! Cómo te imaginabas la implementación de esto? Una que se me ocurre es agregarle un tercer "estado"
Luego la app al arrancar busca todos los Otra opción más barata podría ser un write ahead log. Te ahorras las llamadas extra a la DB, pero es más laburo de implementación y probablemente requiera persistent storage. PD: excelente laburo este proyecto |
Ah, estuve mirando más en detalle el código y veo que sería más simple, por las garantías que ya da la implementación actual: buscar los |
Creo que esto podría funcionar: for receipt in Receipt.objects.filter(
receipt_number__isnull=False,
validation__isnull=True,
):
receipt.revalidate() |
Corrección: ese ejemplo saltearía comprobantes con alguna validación fallida. |
Capaz así? for receipt in Receipt.objects.filter(
receipt_number__isnull=False,
).exclude(
validation__result=ReceiptValidation.RESULT_APPROVED,
):
receipt.revalidate() |
Suena bien 👍 . Salvo que me esté perdiendo algo, el código actual nunca crea un django-afip/django_afip/models.py Lines 956 to 985 in 7d08ed4
En ese caso, tu versión anterior también debería funcionar. Pero no sé si en algún momento se usó el |
Tema relacionado: que opinás de que el django-afip/django_afip/models.py Line 981 in 7d08ed4
Si un Receipt no validado queda con Edit: y ahora que lo pienso, no setearlo en None hace que se intente revalidar para siempre. |
Puede que valga la pena eliminar
Puede haber problemas de concurrencia:
Es poco probable pero posible. Creo que habría que lockear las fila durante la validación para evitar este problema. |
Buen catch. Estuve pensando en esto de setear el Opcion 1: Lockear las filasTe dejo el walltext oculto, pero TLDR: creo que se pueden lockear para asegurar la integridad de datos, pero me surgen algunos caveats que hacen medio mala la UX. walltextEstuve viendo de cambiar def validate(...):
...
qs = self.filter(validation__isnull=True).check_groupable()
# Return early if queryset is empty:
first = qs.first()
if first is None:
return []
qs.order_by("issued_date", "id")._assign_numbers()
with transaction.atomic():
qs = qs.filter(receipt_number__isnull=False).select_for_update()
...
check_response(response)
errs = []
for cae_data in response.FeDetResp.FECAEDetResponse:
validation = ReceiptValidation.objects.create(
...
# Remove the number from ones that failed to validate:
qs.filter(validation__isnull=True).update(receipt_number=None) De yapa, esto debería hacer al def revalidate(self) -> ReceiptValidation | None:
...
if receipt_data.Resultado == ReceiptValidation.RESULT_APPROVED:
...
return validation
# Update atomically, skip if it was just validated
Receipt.objects.filter(pk=self.pk, validation__isnull=True).update(
receipt_number=None,
)
return None Tendría que pensar un poco más para ver si me estoy periendo algún caso, pero hay algo de esto que no me gusta: si bien (creo) que esto hace que la race condition de tu ejemplo no pierda el Una que se me ocurre es, luego del Otra opción es empezar a jugar con locks con timeouts. Opcion 2: comparar con último comprobanteEsta se me ocurrió después, mucho más simple: que el Si no fue usado y se lo deja seteado, todavía podría haber problemas: podría asignarsele el mismo PD: tal vez esté dandole mucha vuelta a un caso bastante anómalo 😅 . La verdad es que la implementación actual no tiene ningún problema de integridad de datos. Para clarificar, lo que estoy queriendo resolver sería: (1) que no se apilen los |
Me parece que la opción 1 va bien 👍 |
Acá hay un primer draft con la opción 1: #217 |
Find receipts that seem to have failed a previous submission and call
revalidate
for them.The text was updated successfully, but these errors were encountered: