Impresiones
Originalmente django-afip no soportaba generación de PDFs o comprobantes a imprimir, dado que esto lo hacían sistemas externos.
Eventualmente esto cambió, y la generación de PDFs se integró a esta librería, pero la integración no está al 100%, por lo cual la mayoría del código para generar los PDF es opcional.
Actualmente soportamos generar PDFs para comprobantes y esto está respaldado principalmente por tres clases. Sólo necesitás usar estas clases si estás generando los PDF con esta librería, y podés ignorarlas si estás generándolos de otra forma:
ReceiptPDF
: Contiene metadatos individuales de cada comprobante. Los datos dePointOfSales
también se copian acá, dado que en caso de que cambie, por ejemplo, el domicilio del contribuyente, no debería cambiar el domicilio en comprobantes pasados.ReceiptEntry
: Representa una línea del detalle de un comprobante.
Primero deberías generar los ReceiptEntry
para tu comprobante y después
generar el ReceiptPDF
. Esto último lo podés hacer usando el helper
create_for_receipt()
.
Los archivos PDF en sí son generados la primera vez que guardes una instancia
de ReceiptPDF
(mediante un hook pre_save
). Podés regenerar el PDF
usando ReceiptPDF.save_pdf()
.
Códigos QR
Los PDF incluyen el código QR que es requerido desde Marzo 2021.
Actualmente cualquier QR redirige a la documentación del AFIP (includo lo de sus ejemplos y otra implementaciones). Esto parece ser porque AFIP nunca terminó de implementar su parte, y está fuera de nuestro control.
Exponiendo comprobantes
Vistas
Los comprobantes pueden exponerse mediante una vista. Requirre el pk del comprobante, así que la registración de la URL debería ser algo como:
path(
"receipts/pdf/<int:pk>",
views.ReceiptPDFView.as_view(),
name="receipt_view",
),
Esto usa django_renderpdf, y es una subclase de PDFView
.
Recomendamos generalmente usar una subclase de ReceiptPDFView
, que tenga
alguna forma de autenticación y autorizacion.
- class django_afip.views.ReceiptPDFView(**kwargs)[source]
- builder
Returns the pdf builder.
Returns the same in-memory instance during the whole request.
- builder_class
The PDF Builder class to use for generating PDF files.
Set this to a custom subclass if you need custom behaviour for your PDF files.
alias of
PdfBuilder
- property download_name: str
Return the filename to be used when downloading this receipt.
- static get_context_for_pk(pk: int, *args, **kwargs) dict [source]
Returns the context for a receipt.
Note that this uses
PdfBuilder
and notself.builder_class
due to legacy reasons.Deprecated since version 12.0: This method is deprecated, use
get_context()
instead.
- get_template_names() list[str] [source]
Return the templates use to render the Receipt PDF.
See
get_template_names()
for exact implementation details.
- receipt
Returns the receipt.
Returns the same in-memory instance during the whole request.
Templates
Los templates para las vistas son buscados en
templates/receipts/code_X.html
, dónde X es el código del tipo de
comprobante (ReceiptType
). Si querés overridear el predetermindo,
simplemente incluí en tu projecto un template con el mismo nombre/path, y
asegurate de que te projecte esté listado antes que django_afip
en
INSTALLED_APPS
.
También podés exponer los archivos generados
Note that you may also expose receipts as plain Django media files. The URL will be relative or absolute depending on your media files configuration.
>>> printable = ReceiptPDF.objects.last()
>>> printable.pdf_file
<FieldFile: receipts/790bc4f648e844bda7149ac517fdcf65.pdf>
>>> printable.pdf_file.url
'/media/receipts/790bc4f648e844bda7149ac517fdcf65.pdf'
Los templates provistos siguen las indicaciones de la RG1415, que regula que campos deben contener y dónde debe estar ubicado cada dato.