def saveDao(self, tipo=None):
        denominazione = self.denominazione_banca_entry.get_text()
        if not denominazione:
            obligatoryField(self.anagrafica.getTopLevel(),
                    self.denominazione_banca_entry)
            return
        self.dao.denominazione = denominazione
        self.dao.agenzia = self.agenzia_entry.get_text()
        self.dao.bic_swift = self.bic_swift_entry.get_text()
        self.dao.abi = self.abi_entry.get_text()
        self.dao.cab = self.cab_entry.get_text()

        iban = self.iban_entry.get_text() or ''
        if iban:
            try:
                cc, cs, cin, abi, cab, conto = dividi_iban(iban)
            except:
                messageError(msg="Il codice IBAN inserito non è corretto.",
                                   transient=self.getTopLevel())
                return
            else:
                self.dao.abi = abi
                self.dao.cab = cab
                self.dao.iban = iban
        else:
            self.dao.iban = ''

        self.dao.persist()
Пример #2
0
    def drawImage(self,group=None, tabpro=None):
        """ Drawing an image """
        pfile = tabpro['pfile']
        celle = tabpro["cells"]
        (imgPath, imgFile) = os.path.split(pfile)
        #innerIterator = self.iterator
        width = [float(x.get("WIDTH")) for x in celle][0]
        height = [float(x.get("HEIGHT")) for x in celle][0]
        xPos = [float(x.get("XPOS")) for x in celle][0]
        yPos = [float(x.get("YPOS")) for x in celle][0]
#        print "IMAGE Path ", pfile
        img = None
        try:
            if os.path.exists(Environment.imagesDir + imgFile):
                img = utils.ImageReader(Environment.imagesDir + imgFile)
        except:
            if not imgPath:
                imgPath = os.path.expanduser('~') + os.sep
            else:
                imgPath = os.path.expanduser('~') + os.sep+imgPath +"/"
            if os.path.exists(imgPath +imgFile):
                img = utils.ImageReader(imgPath +imgFile)
        if img:
            self.canvas.drawImage(img,
                                xPos - self.pageProperties[self.pdfPage][9],
                                self.pageProperties[0][7] - yPos - height + self.pageProperties[self.pdfPage][10],
                                width=width,
                                height=height)
            self.canvas.saveState()
        else:
            from promogest.lib.utils import messageError
            messageError(msg="ATTENZIONE!!!\n L'immagine scelta come logo in dati azienda\n NON è stata trovata!")
Пример #3
0
    def simpleSanitize(self ):
        """ Ripulisce lo sla da caratteri spuri
        """
        if self.slafile :
            #self.slaFileName = self.slafile
            self.doc = ElementTree.parse(self.slafile)
        else:
            f = file(self.slaFileName, 'rb')
            text = f.read()
            text = text.replace('', '\\n')
            f.close()
            tempFile = self.pdfFolder+"_temp"
            try:
                f = file(tempFile, 'wb')
                f.write(text)
                f.close()
                self.doc = ElementTree.parse(tempFile)

            except IOError:
                from promogest.lib.utils import messageError
                messageError(msg="PERCORSO NON TROVATO,\n Spostato per caso la cartella promogest2? ,\n controllare l'impostazione in opzioni")
                return
        if self.doc:
            self.root = self.doc.getroot()
            self.document = self.root.findall('DOCUMENT')[0]
Пример #4
0
    def commit(self):
        """ Salva i dati nel DB"""
        if not params["session"].deleted and not self.ckdd(self):
            return
        try:
            params["session"].commit()
            return 1
        except Exception,e:
            from promogest.lib.utils import messageError
            msg = """ATTENZIONE ERRORE NEL SALVATAGGIO
    Qui sotto viene riportato l'errore di sistema:

    ( normalmente il campo in errore è tra "virgolette")

    %s

    L'errore può venire causato da un campo fondamentale
    mancante, da un codice già presente, si invita a
    rincontrollare i campi e riprovare
    Grazie!
    """ %e
            try:
                messageError(msg=msg)
                pg2log.info("ERRORE IN DAO COMMIT  "+str(e))
            except:
                print("ERRORE in dao commit", str(e))
            params["session"].rollback()
            return 0
Пример #5
0
def hook(et, ev, eb):
    import traceback

    if "Operation aborted" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print("\n  ".join(list(traceback.format_exception(et, ev, eb))))
        return
    if "ATTENZIONE, TENTATIVO DI SALVATAGGIO SENZA RIGHE?????" in ev:
        return
    if "Bad file descriptor" in ev:
        return
    if "ProgrammingError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print("\n  ".join(list(traceback.format_exception(et, ev, eb))))
        __sendmail()
        delete_pickle()
        return
    if "OperationalError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print("\n  ".join(list(traceback.format_exception(et, ev, eb))))
        __sendmail()
        delete_pickle()
        return
    if "ArgumentError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print("\n  ".join(list(traceback.format_exception(et, ev, eb))))
        __sendmail()
        delete_pickle()
        return
    if "'MetaData' object has no attribute 'naming_convention'" in str(ev):
        delete_pickle()
    if "Handler" in str(ev):
        print(str(ev))
        return
    if (
        "InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush"
        in str(ev)
    ):
        from promogest.lib.utils import messageError

        messageError(msg="Si consiglia di riavviare il software, l'errore è stato segnalato")
    if "is already defined for this MetaData instance" in str(ev):
        delete_pickle()
    if "cannot import" in str(ev) or "No module" in str(ev):
        from promogest.lib.utils import messageError

        messageError(
            msg="C'è una libreria mancante il cui nome è qui sotto:\n"
            + str(ev)
            + "\nDevo chiudere il programma, contattare assistenza"
        )
        sys.exit()

    try:
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
    except:
        pass
    print("\n  ".join(list(traceback.format_exception(et, ev, eb))))
    __sendmail()
Пример #6
0
def dati_file_conad_terron(testata):
    """
    """
    from promogest.dao.TestataDocumento import TestataDocumento
    from promogest.dao.InformazioniFatturazioneDocumento import InformazioniFatturazioneDocumento
    from promogest.dao.Azienda import Azienda
    if testata:
        #Scriviamo la testata della fattura
        dati_differita = InformazioniFatturazioneDocumento().select(id_fattura=testata.id, batchSize=None)
        azienda = Azienda().getRecord(id=Environment.azienda)
        if not azienda:
            messageError('Inserire le informazioni sull\' azienda in Dati azienda')
            return None

        if azienda.ragione_sociale == '':
            messageError('Inserire la ragione sociale dell\'azienda in Dati azienda')
            return None

        dati2 = []

        if dati_differita:

            for ddtt in dati_differita:
                ddt = TestataDocumento().getRecord(id=ddtt.id_ddt)

                codice = ''
                if ddt.DM is not None:
                    codice = ddt.DM.codice or ''

                dati = {'testata': {
                    'numero_progressivo': '0',
                    'codice_cliente': str(codice),
                    'data_bolla':  ddt.data_documento,
                    'numero_bolla': str(ddt.numero),
                    'data_fattura': testata.data_documento,
                    'numero_fattura': str(testata.numero),
                },
                'dettaglio': []
                }
                for riga in ddt.righe:
                    if riga.id_articolo:
                        art = leggiArticolo(riga.id_articolo)
                        unitaBase = 'NR' if str(art["unitaBase"]).upper() == 'N' else str(art["unitaBase"]).upper()
                        dati['dettaglio'].append(
                            {
                                'numero_progressivo':'0',
                                'codice_articolo': str(art["codice"]),
                                'descrizione': str(art["denominazione"].replace("à", "a")),
                                'unita_misura': unitaBase,
                                'qta_fatturata': str(mN(Decimal(riga.quantita * (riga.moltiplicatore or 1)), 2)),
                                'prezzo_unitario': str(mN(Decimal(riga.valore_unitario_netto), 3)),
                                'aliquota_iva': str(mN(riga.percentuale_iva,0))
                            })
                dati2.append(dati)
            return dati2
Пример #7
0
def hook(et, ev, eb):
    import traceback
    if "Operation aborted" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
        return
    if "ATTENZIONE, TENTATIVO DI SALVATAGGIO SENZA RIGHE?????" in ev:
        return
    if "[Errno 9] Bad file descriptor" in ev:
        return
    #if "Handler" in str(ev):
        #print "ATTENZIONE!!! MANCA L'HANDLER", ev
        #pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        #print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
        #delete_pickle()
        #return
    if "ProgrammingError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
        __sendmail()
        delete_pickle()
        return
    if "OperationalError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
        __sendmail()
        delete_pickle()
        return
    if "ArgumentError" in str(ev):
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
        print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
        __sendmail()
        delete_pickle()
        return
    if "InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush" in str(ev):
        from promogest.lib.utils import messageError
        messageError(msg="Si consiglia di riavviare il software, l'errore è stato segnalato")
    if "is already defined for this MetaData instance" in str(ev):
        delete_pickle()
    if "AttributeError: 'MetaData' object has no attribute 'naming_convention'" in str(ev):
        delete_pickle()

    try:
        pg2log.info("\n  ".join(["Error occurred: traceback follows"] + list(traceback.format_exception(et, ev, eb))))
    except:
        pass
    print "\n  ".join(list(traceback.format_exception(et, ev, eb)))
    __sendmail()
Пример #8
0
    def __init__(self, parent):
        '''
        Constructor
        '''
        GladeWidget.__init__(self, root='riba_window',
                             path='Riba/gui/riba_window.glade',
                             isModule=True)
        self.__parent = parent
        self.placeWindow(self.getTopLevel())
        self.__setup_webview()
        self.draw()

        try:
            self.__creditore = leggiCreditore()
        except RuntimeError as e:
            messageError(msg=str(e))
        self.show_all()
Пример #9
0
    def commit(self):
        """ Salva i dati nel DB"""
        try:
            params["session"].commit()
            return True
        except Exception, e:
            msg = (
                """ATTENZIONE ERRORE
Qui sotto viene riportato l'errore di sistema:
%s
( normalmente il campo in errore è tra "virgolette")
"""
                % e
            )
            messageError(msg=msg, transient=None)
            print "ERRORE", e
            params["session"].rollback()
            return False
Пример #10
0
    def on_genera_report_button_clicked(self, button):
        self.generatore = PGRiBa(self, self.__creditore)
        self.generatore.bind(self.progressbar1)
        data_inizio = stringToDate(self.data_inizio_entry.get_text())
        data_fine = stringToDate(self.data_fine_entry.get_text())

        pageData = {
            'file': 'riba_export.html',
            'creditore': self.__creditore,
            'data_inizio': data_inizio,
            'data_fine': data_fine,
        }
        res = 0
        try:
            res = self.generatore.analizza(data_inizio, data_fine, pageData=pageData)
        except RuntimeError as e:
            messageError(msg=str(e))
        if res != 0:
            self.salva_file_button.set_sensitive(True)
            renderHTML(self.view, renderTemplate(pageData))
Пример #11
0
def leggiCreditore():
    '''
    Ritorna le informazioni sul creditore

    @return: creditore
    '''
    # inizializziamo i dati del creditore
    creditore = Creditore()
    azienda = Azienda().getRecord(id=Environment.azienda)
    if azienda:
        creditore.codice_fiscale = azienda.codice_fiscale
        if not creditore.codice_fiscale:
            messageError('Inserire il codice fiscale nei Dati azienda.')
            return

        # provare con le banche azienda prima

        if azienda.iban:
            try:
                cc, cs, cin, creditore.abi, creditore.cab, creditore.numero_conto = dividi_iban(azienda.iban)
            except:
                pass
        elif azienda.abi and azienda.cab:
            creditore.abi = azienda.abi
            creditore.cab = azienda.cab
            if azienda.numero_conto:
                creditore.numero_conto = azienda.numero_conto
            else:
                messageError('Inserire il numero di conto nei Dati azienda.')
                return
        else:
            messageError('Inserire il codice IBAN nei Dati azienda.')
            return

        if azienda.codice_rea:
            creditore.codice_sia = str(azienda.codice_rea or ' ')
        else:
            messageError('Inserire il codice SIA in Dati azienda.')
            return

    creditore.descrizione[0] = azienda.ragione_sociale
    creditore.descrizione[1] = azienda.sede_operativa_indirizzo
    creditore.descrizione[2] = azienda.sede_operativa_localita
    creditore.descrizione[3] = azienda.codice_fiscale

    creditore.denominazione_breve = azienda.ragione_sociale

    return creditore
Пример #12
0
def ckd(dao):
    classe = dao.__class__.__name__

    stopp = False
    if classe not in ["TestataScontrino",
    "Articolo", "ArticoloTagliaColore", "TestataDocumento"]:
        return True
    records = Environment.session.query(dao.__class__).count()
    #print "CLASSE", classe, records,Environment.modulesList, "BASIC" in Environment.modulesList
    if "BASIC" in Environment.modulesList:
        if Environment.tipodb == "sqlite":
            if "TestataScontrino" in classe:
                if records > 16:
                    stopp = True
            if "TestataDocumento" in classe:
                if records > 48:
                    stopp = True
            if "Articolo" in classe:
                if records > 400:
                    stopp = True
            if "ArticoloTagliaColore" in classe:
                if records > 600:
                    stopp = True
            if "TestataCommessa" in classe:
                if records > 5:
                    stopp = True
    elif "STANDARD" in Environment.modulesList:
        if "+S" not in Environment.modulesList:
            if "TestataScontrino" in classe:
                if records > 16:
                    stopp = True
        if "+W" not in Environment.modulesList:
            if "ArticoloTagliaColore" in classe:
                if records > 600:
                    stopp = True
        if "TestataCommessa" in classe:
            if records > 5:
                stopp = True

    elif "FULL" in Environment.modulesList:
        if "+S" not in Environment.modulesList:
            if "TestataScontrino" in classe:
                if records > 16:
                    stopp = True
        if "+W" not in Environment.modulesList:
            if "ArticoloTagliaColore" in classe:
                if records > 600:
                    stopp = True
    if stopp:
        msg = """ATTENZIONE!
Hai raggiunto il limite massimo di inserimenti consentito
dalla versione del programma da te in uso
Acquista la versione "STANDARD" O "FULL" per attivarei moduli semplici
Oppure il modulo SHOP e/o WEAR per vendere al dettaglio
e/o la gestiore taglie e colori.

    GRAZIE"""
        from promogest.lib.utils import messageError
        messageError(msg=msg)
        Environment.params["session"].rollback()
        return False
    return True
Пример #13
0
    def analizza(self, data_inizio=None, data_fine=None, pageData=None):
        if not data_inizio:
            messageError(msg='Inserire una data d\'inizio periodo.')
            return 0
        if not data_fine:
            data_inizio_, data_fine = dataInizioFineMese(data_inizio)

        documenti = TestataDocumento().select(complexFilter=(and_(or_(TestataDocumento.operazione=='Fattura differita vendita', TestataDocumento.operazione=='Fattura accompagnatoria'), TestataDocumento.data_documento.between(data_inizio, data_fine))), batchSize=None)

        if not documenti:
            messageInfo(msg="Nessun risultato.")
            return 0

        righe = []

        buff = self.recordIB()

        i = 0
        totale_importi = Decimal(0)

        for documento in documenti:

            if self.progressbar:
                pbar(self.progressbar, parziale=i, totale=len(documenti))

            ope = leggiOperazione(documento.operazione)
            if ope:
                if ope['tipoPersonaGiuridica'] != 'cliente':
                    continue

            banca = None
            if documento.id_banca:
                banca = leggiBanca(documento.id_banca)
            else:
                continue

            cli = leggiCliente(documento.id_cliente)
            cli_ente = Cliente().getRecord(id=documento.id_cliente)
            cod_fisc_piva = ''
            if cli_ente:
                cod_fisc_piva = cli_ente.codice_fiscale or cli_ente.partita_iva
            else:
                cod_fisc_piva = documento.codice_fiscale_cliente
            debitore = Debitore(cod_fisc_piva, banca['abi'], banca['cab'])
            debitore.descrizione[0] = ''
            if cli['ragioneSociale']:
                debitore.descrizione[0] = cli['ragioneSociale']
            else:
                debitore.descrizione[0] = cli['cognome'] + ' ' + cli['nome']
            debitore.indirizzo = documento.indirizzo_cliente
            debitore.CAP = documento.cap_cliente
            debitore.provincia = documento.provincia_cliente
            debitore.comune = documento.localita_cliente

            for scadenza in documento.scadenze:
                if pagamentoLookup(scadenza.pagamento):

                    row = "%s N. %s a %s del %s \nImporto: %s data scadenza: %s" % (documento.operazione,
                                                     documento.numero,
                                                     documento.intestatario,
                                                     dateToString(documento.data_documento),
                                                     # scadenza.pagamento,
                                                     mN(scadenza.importo, 2),
                                                     dateToString(scadenza.data)
                                                     )

                    progressivo = i + 1
                    totale_importi += scadenza.importo
                    buff += self.record14(progressivo, scadenza.data, scadenza.importo, debitore)
                    buff += self.record20(progressivo)
                    buff += self.record30(progressivo, debitore)
                    buff += self.record40(progressivo, debitore)
                    buff += self.record50(progressivo, debitore, row.replace('\n', ''))
                    buff += self.record51(progressivo, progressivo)
                    buff += self.record70(progressivo)

                    riga = {
                        'destinatario': debitore.descrizione[0],
                        'indirizzo': debitore.indirizzo,
                        'CAP': debitore.CAP,
                        'comune': debitore.comune,
                        'provincia': debitore.provincia,
                        'cod_fisc_piva': cod_fisc_piva,
                        'banca_abi': banca['abi'],
                        'banca_cab': banca['cab'],
                        'importo': scadenza.importo,
                        'data_scadenza': scadenza.data,
                        'rif_debito': row
                    }
                    righe.append(riga)

                    i = i + 1

        buff += self.recordEF(i, totale_importi)

        pageData['righe'] = righe
        pageData['totale_importi'] = totale_importi
        pageData['disposizioni'] = i

        if self.progressbar:
            pbar(self.progressbar, stop=True)

        self._buffer = buff
Пример #14
0
def dati_file_buffetti(testata):
    """
    """
    #from promogest.dao.TestataDocumento import TestataDocumento
    from promogest.dao.Azienda import Azienda
    if testata:
        azienda = Azienda().getRecord(id=Environment.azienda)
        if not azienda:
            messageError('nessuna informazione azienda')
            return None

        if azienda.ragione_sociale == '':
            messageError('nessuna ragione sociale impostata')
            return None

        scadenze = testata.scadenze
        dati_generazione_scadenze = 'S'
        if len(scadenze) == 0:
            dati_generazione_scadenze = 'N'

        if testata.operazione == 'Fattura Accompagnatoria':
            tipo_documento = 'A'
        elif 'Fattura Differita' in testata.operazione:
            tipo_documento = 'D'
        elif 'Fattura' in testata.operazione:
            tipo_documento = 'F'

        tipo_registro = 'F'

        totale_fattura = mN(testata._totaleScontato + testata._totaleSpese, 2)

        if testata.id_fornitore is not None:
            tipo_nominativo = 'F'
            cognome_cli_for = testata.cognome_fornitore or ''
            nome_cli_for = testata.nome_fornitore or ''
            codice_fiscale_cli_for = testata.codice_fiscale_fornitore
            partita_iva_cli_for = testata.partita_iva_fornitore
            indirizzo_cli_for = testata.indirizzo_fornitore
            localita_cli_for = testata.localita_fornitore
            cap_cli_for = testata.cap_fornitore
            provincia_cli_for = testata.provincia_fornitore
            codice_cli_for = testata.codice_fornitore
        elif testata.id_cliente is not None:
            tipo_nominativo = 'C'
            cognome_cli_for = testata.cognome_cliente or ''
            nome_cli_for = testata.nome_cliente or ''
            codice_fiscale_cli_for = testata.codice_fiscale_cliente
            partita_iva_cli_for = testata.partita_iva_cliente
            indirizzo_cli_for = testata.indirizzo_cliente
            localita_cli_for = testata.localita_cliente
            cap_cli_for = testata.cap_cliente
            provincia_cli_for = testata.provincia_cliente
            codice_cli_for = testata.codice_cliente

        dati = [{
            'testata': {
                'ragione_sociale_ditta': azienda.ragione_sociale,
                'cod_fisc_piva_ditta': azienda.codice_fiscale or azienda.partita_iva,
                'dati_generazione_scadenze': dati_generazione_scadenze,
                'tipo_piano': '2',
                'da_data': testata.data_documento,
                'a_data': testata.data_documento,
                'no_data': ''
            },
            'scadenze':{},
            'testata_pagamento': [{
                'codice': '0', #inseire il codice con cui identifichiamo il tipo di pagamento (es. ID RIba 30 gg)
                'numero_rate': str(len(scadenze)),
                'descrizione': testata.pagamento,
                'tipo': '1',
                'determinazione_tipo': '31',
                'numero_rate': '1',
                'giorni_prima': '30' # recuperare il numero di giorni dal pagamento
            }],
            'fine_scadenza': {},
            'record0': [{
                'tipo_nominativo': tipo_nominativo,
                'cognome': cognome_cli_for,
                'nome': nome_cli_for,
                'codice_fiscale': codice_fiscale_cli_for,
                'partita_iva': partita_iva_cli_for,
                'indirizzo': indirizzo_cli_for,
                'localita': localita_cli_for,
                'cap': cap_cli_for,
                'provincia': provincia_cli_for,
                'incluso_elenchi_bl': 'N'
            }],
            'record1': [{
                'tipo_documento': tipo_documento,
                'totale_fattura': str(totale_fattura),
                'cf_piva': codice_fiscale_cli_for or partita_iva_cli_for,
                'codice': codice_cli_for,
                'tipo_registro': tipo_registro,
                'data_doc': testata.data_documento
            }],
            'record2': [{
                'imponibile_iva': str(mN(testata._totaleImponibileScontato)),
                'importo_iva': str(mN(testata._totaleImpostaScontata)),
            }],
            'recordB': [{
                'posizione': 'A' # controllare scadenze.data_pagamento se None mettere A, altrimenti P (pagato)
            }],
        }]

        # for scadenza in testata.scadenze:
            # dati['dettaglio_rate'].append({
                # 'numero_rata': testata.scadenze.index(scadenza) + 1
            # })

        return dati
Пример #15
0
def to_fatturapa(dao, progressivo, anag=None):
    #if anag:
    #    anag.pbar_anag_complessa.show()
    #progressivo = 1
    #for dao in daos:
    #if anag:
    #    utils.pbar(anag.pbar_anag_complessa,parziale=daos.index(dao), totale=len(daos), text="GEN FatturePA MULTIPLE", noeta=False)
    if dao.__class__.__name__ == 'TestataDocumento':
        dao.totali
        azienda = Azienda().getRecord(id=Environment.azienda)
        indirizzi_email = AccountEmail().select(idAzienda=Environment.azienda,
                                                preferito=True,
                                                batchSize=None)

        if indirizzi_email:
            indirizzo_email_preferito = indirizzi_email[0].indirizzo
        else:
            indirizzo_email_preferito = ''


        # Riempiamo la fattura elettronica
        pageData = {}
        pageData['dao'] = dao
        pageData['trasmittente'] = {
            'cf': azienda.codice_fiscale,
            'piva': azienda.partita_iva,
            'telefono': azienda.telefono,
            'email': indirizzo_email_preferito,
        }
        # campi di trasmissione
        pageData['trasmissione'] = {
            'progressivo': azienda.progressivo_fatturapa,
            'formato_trasmissione': 'SDI11',
            'codice_destinatario': dao.CLI.codice
        }
        pageData['cedente'] = {
            'partita_iva': azienda.partita_iva,
            'denominazione': azienda.denominazione,
            'nome': '',
            'cognome': '',
            'regime_fiscale': 'RF01',
            'sede_indirizzo': azienda.sede_operativa_indirizzo,
            'sede_numero_civico': azienda.sede_operativa_numero,
            'sede_cap': azienda.sede_operativa_cap,
            'sede_comune': azienda.sede_operativa_localita,
            'sede_provincia': azienda.sede_operativa_provincia.upper(),
            'sede_nazione': 'IT',
            'stabile_indirizzo': '',
            'stabile_numero_civico': '',
            'stabile_cap': '',
            'stabile_comune': '',
            'stabile_provincia': '',
            'stabile_nazione': '',
            'iscrizioneREA_numeroREA': '', #azienda.codice_rea,
            'iscrizioneREA_ufficio': '',
            'capitale_sociale': '',
            'socio_unico': '',
            'liquidazione': ''
        }

        pageData['committente'] = {
            'partita_iva': dao.CLI.partita_iva,
            'codice_fiscale': dao.CLI.codice_fiscale,
            'denominazione': dao.CLI.ragione_sociale,
            'nome':  dao.CLI.nome,
            'cognome':  dao.CLI.cognome,
            'sede_indirizzo': dao.CLI.sede_legale_indirizzo,
            'sede_numero_civico': '',
            'sede_cap': dao.CLI.sede_legale_cap,
            'sede_comune': dao.CLI.sede_legale_localita,
            'sede_provincia': dao.CLI.sede_legale_provincia.upper(),
            'sede_nazione': 'IT',
        }

        pageData['modalita_pagamento'] = dao.pagamento_codice

        pageData['soggetto_emittente'] = 'CC'

        pageData['trasporto'] = None
        pageData['contratto'] = None
        pageData['convenzione'] = None
        pageData['ricezione'] = None

        # Controlli di validità dei dati

        if dao.CLI.sede_legale_indirizzo == '':
            utils.messageError("Inserire le informazioni sulla sede legale del committente.")
            return

        if dao.codice_cig == '' or dao.codice_cig == '':
            utils.messageError("Inserire il codice CUP e CIG associati al documento")
            return

        for riga in dao.righe:
            if len(riga.descrizione) > 100:
                utils.messageError("La descrizione per un riga del documento supera la lunghezza massima di 100 caratteri. Abbreviarla e riprovare.")
                return

        if len(dao.scadenze) == 1:
            pageData['condizioni_pagamento'] = 'TP02' # pagamento completo
            for scadenza in dao.scadenze:
                if scadenza.numero_scadenza == 0:
                    pageData['condizioni_pagamento'] = 'TP03' # anticipo
                    break
        if len(dao.scadenze) >= 2:
            pageData['condizioni_pagamento'] = 'TP01' #pagamento a rate

        return renderFatturaPA(pageData)