diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index 20851e8..e673eb9 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -14,6 +14,8 @@ import tempfile import time import unicodedata import uuid +import zipfile +from io import BytesIO from xml.etree import ElementTree as ET import uno @@ -913,3 +915,14 @@ def get_data(invoice, rfc, values): data['timbre'] = _timbre(doc, version, options) return path, data + + +def to_zip(*files): + zip_buffer = BytesIO() + + with zipfile.ZipFile(zip_buffer, 'a', zipfile.ZIP_DEFLATED, False) as zip_file: + for data, file_name in files: + zip_file.writestr(file_name, data) + + return zip_buffer.getvalue() + diff --git a/source/app/models/db.py b/source/app/models/db.py index 406880f..7488143 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -122,5 +122,8 @@ class StorageEngine(object): if type_doc == 'pdf': data, file_name = main.Facturas.get_pdf(id, rfc) content_type = 'application/pdf' + if type_doc == 'zip': + data, file_name = main.Facturas.get_zip(id, rfc) + content_type = 'application/octet-stream' return data, file_name, content_type diff --git a/source/app/models/main.py b/source/app/models/main.py index bddb1d4..5d69c8c 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -1040,6 +1040,25 @@ class Facturas(BaseModel): doc = util.to_pdf(path, data) return doc, name + @classmethod + def get_zip(cls, id, rfc): + obj = Facturas.get(Facturas.id==id) + name_zip = '{}{}_{}.zip'.format(obj.serie, obj.folio, obj.cliente.rfc) + if obj.uuid is None: + return b'', name_zip + + file_xml = cls.get_xml(id) + if not file_xml[0]: + return b'', name_zip + + file_pdf = cls.get_pdf(id, rfc) + if not file_pdf[0]: + return b'', name_zip + + file_zip = util.to_zip(file_xml, file_pdf) + + return file_zip, name_zip + @classmethod def get_(cls, values): rows = tuple(Facturas