Files
fattureCCSR/fatture_ccsr/downloader.py

162 lines
7.9 KiB
Python

"""ask for an input file (.xlsx) and an output file (.pdf) and downloads and unite every invoice"""
import os
import shutil
import tempfile
import openpyxl
import PyPDF2
import wx
import requests
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 = parent.config['REPORT_SERVER']['URL']+'/reportserver?/STAT_FATTURATO_CTERZI&dataI='+start_date+'&dataF='+end_date+'&rs:Format=EXCELOPENXML'
try:
downloaded_input_file = parent.session.get(input_file_url)
except requests.exceptions.RequestException:
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 connettersi al portale CCSR.")
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
wx.Yield()
return
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):
row = str(i)
invoice_id = sheet["I"+row].value
if invoice_id is not None and "CCSR" in invoice_id:
invoice_id = invoice_id.replace("/", "-")
invoice_type = sheet["AP"+row].value
invoice_url = sheet["BG"+row].hyperlink.target
invoice = {
"id": invoice_id,
"type": invoice_type,
"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_all_file_path = None
output_ft_file_path = None
output_nc_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():
try:
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
if parent.verbose:
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
except requests.exceptions.RequestException:
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: errore di connessione\n" % invoice_id)
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_all_file_path = parent.output_pdf_dialog.GetPath()
path, ext = os.path.splitext(output_all_file_path)
output_ft_file_path = path+"_ft"+ext
output_nc_file_path = path+"_nc"+ext
merger_ft = PyPDF2.PdfFileMerger()
merger_nc = PyPDF2.PdfFileMerger()
merger_all = PyPDF2.PdfFileMerger()
for invoice_id, invoice in invoices.items():
if invoice["good"]:
merger_all.append(PyPDF2.PdfFileReader(open(invoice["path"], "rb")))
if invoice["type"] == "Fattura":
merger_ft.append(PyPDF2.PdfFileReader(open(invoice["path"], "rb")))
elif invoice["type"] == "Nota di credito":
merger_nc.append(PyPDF2.PdfFileReader(open(invoice["path"], "rb")))
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: la fattura %s ha tipo sconosciuto %s\n" % (invoice_id, invoice["type"]))
parent.log_dialog.log_text.SetDefaultStyle(wx.TextAttr())
merger_all.write(output_all_file_path)
merger_ft.write(output_ft_file_path)
merger_nc.write(output_nc_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 tutti i documenti si trova in %s\n" % output_all_file_path)
parent.log_dialog.log_text.AppendText("Il pdf contenente tutti le fatture si trova in %s\n" % output_ft_file_path)
parent.log_dialog.log_text.AppendText("Il pdf contenente tutti le note di credito si trova in %s\n" % output_nc_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()