Files
fattureCCSR/fatture_ccsr/downloader.py
2021-01-09 00:48:26 +01:00

123 lines
5.5 KiB
Python

"""ask for an input file (.xlsx) and an output file (.pdf) and downloads and unite every invoice"""
import shutil
import tempfile
import openpyxl
import PyPDF2
import wx
def download_input_file(parent):
"""download input file"""
start_date = parent.start_date_picker.GetValue().Format("%d/%m/%Y")
end_date = parent.end_date_picker.GetValue().Format("%d/%m/%Y")
input_file_url = 'https://report.casadicurasanrossore.it:8443/reportserver?/STAT_FATTURATO_CTERZI&dataI='+start_date+'&dataF='+end_date+'&rs:Format=EXCELOPENXML'
downloaded_input_file = parent.session.get(input_file_url)
if downloaded_input_file.status_code != 200:
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.RED, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("ERRORE: impossibile scaricare il file di input.\nControllare la connessione ad internet e l'operatività del portale CCSR. Code %d\n" % downloaded_input_file.status_code)
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
return
input_file_descriptor, parent.input_file_path = tempfile.mkstemp(suffix='.xlsx')
parent.input_files.append(parent.input_file_path)
with open(input_file_descriptor, 'wb') as input_file:
input_file.write(downloaded_input_file.content)
def get_invoices_info(input_file_path: str) -> tuple:
"""extract invoices IDs and URLs from xlsx input file"""
xlsx_file = openpyxl.load_workbook(input_file_path)
sheet = xlsx_file.active
invoices = dict()
owner_name = '_'.join(sheet["B1"].value.split()[2:])
for i in range(1, sheet.max_row+1):
invoice_id = sheet["I"+str(i)].value
if invoice_id is not None and "CCSR" in invoice_id:
invoice_id = invoice_id.replace("/", "-")
invoice_url = sheet["BG"+str(i)].hyperlink.target
invoice = {
"id": invoice_id,
"url": invoice_url,
"path": None,
"good": None,
}
invoices[invoice_id] = invoice
invoices_info = (owner_name, invoices)
return invoices_info
def download_invoices(parent):
"""download invoices from CCSR"""
output_file_path = None
parent.log_dialog.log_text.AppendText("Download file input\n")
wx.Yield()
download_input_file(parent)
invoices_info = get_invoices_info(parent.input_file_path)
invoices = invoices_info[1]
parent.log_dialog.log_text.AppendText("Inizio download fatture dal portale CCSR\n")
wx.Yield()
tmp_dir = tempfile.mkdtemp()
invoices_count = len(invoices)
downloaded_count = 0
for invoice_id, invoice in invoices.items():
resp = parent.session.get(invoice["url"])
if resp.status_code == 200:
with open(tmp_dir+"/"+invoice_id+".pdf", "wb") as output_file:
output_file.write(resp.content)
invoice["path"] = output_file.name
try:
PyPDF2.PdfFileReader(open(invoice["path"], "rb"))
except (PyPDF2.utils.PdfReadError, OSError):
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.RED, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("Errore: fattura %s corrotta!\n" % invoice_id)
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
invoice["good"] = False
else:
downloaded_count += 1
parent.log_dialog.log_text.AppendText("%d/%d scaricata fattura %s in %s\n" % (downloaded_count, invoices_count, invoice_id, invoice["path"]))
wx.Yield()
invoice["good"] = True
else:
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.RED, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("Errore: impossibile scaricare fattura %s: %d\n" % (invoice_id, resp.status_code))
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
invoice["good"] = False
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.BLACK, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("Download terminato.\n")
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
parent.output_pdf_dialog.SetFilename("fatture_%s.pdf" % invoices_info[0])
if parent.output_pdf_dialog.ShowModal() == wx.ID_OK:
output_file_path = parent.output_pdf_dialog.GetPath()
merger = PyPDF2.PdfFileMerger()
for invoice in invoices.values():
if invoice["good"]:
merger.append(PyPDF2.PdfFileReader(open(invoice["path"], "rb")))
merger.write(output_file_path)
shutil.rmtree(tmp_dir, ignore_errors=True)
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.BLACK, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("Il pdf contenente le fatture si trova in %s\n" % output_file_path)
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
parent.log_dialog.open_file_btn.Enable()
else:
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr(wx.RED, font=wx.Font(wx.FontInfo(8).Bold())))
parent.log_dialog.log_text.AppendText("Non è stata eseguita l'unione delle fatture in un singolo pdf.\nLe singole fatture si trovano in %s\n" % tmp_dir)
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()