Esempio n. 1
0
class GestioneScontrini(GladeWidget):
    """ Classe per la gestione degli scontrini emessi """

    def __init__(self, idArticolo = None,
                       daData = None,
                       aData = None,
                       righe = []):
        self._idArticolo = idArticolo
        self._daData = daData
        self._aData = aData
        self._righe = righe
        self._htmlTemplate = None
        self.dao = None
        self.daoTse = None
        self.html = ""

        GladeWidget.__init__(self,
                root='scontrini_emessi',
                path="VenditaDettaglio/gui/scontrini_emessi.glade",
                isModule=True)
        self._window = self.scontrini_emessi
        self.getTopLevel().set_modal(modal=True)
        self.placeWindow(self._window)
        self.draw()

    def draw(self):

        self.filterss = FilterWidget(
                            owner=self,
                            filtersElement=GladeWidget(
                            root='scontrini_filter_table',
                            path="VenditaDettaglio/gui/_scontrini_emessi_elements.glade",
                            isModule=True),
                            #resultsElement="scontrino"
                            )
        self.filters = self.filterss.filtersElement
        self.filterTopLevel = self.filterss.getTopLevel()

        filterElement = self.filterss.filter_frame
        filterElement.unparent()
        self.filter_viewport.add(filterElement)
        self.anagrafica_hpaned.set_position(350)

        resultElement = self.filterss.filter_list_vbox
        resultElement.unparent()
        self.anagrafica_results_viewport.add(resultElement)
        self.detail = createHtmlObj(self)
        self.detail_scrolled.add(self.detail)
        self.filterss.hbox1.destroy()
        self.filterss.filter_info_hbox.show()
        self.filterss.filter_info_label.set_text("")
        self.filters.id_articolo_filter_customcombobox.setId(self._idArticolo)

        if self._daData is None:
            self.filters.da_data_filter_entry.setNow()
        else:
            self.filters.da_data_filter_entry.set_text(self_daData)
        if self._aData is None:
            self.filters.a_data_filter_entry.setNow()
        else:
            self.filters.a_data_filter_entry.set_text(self_aData)
        fillComboboxMagazzini(self.filters.id_magazzino_filter_combobox)
        fillComboboxPos(self.filters.id_pos_filter_combobox)
        if hasattr(Environment.conf, "VenditaDettaglio"):
            if hasattr(Environment.conf.VenditaDettaglio, "magazzino"):
                findComboboxRowFromStr(self.filters.id_magazzino_filter_combobox, Environment.conf.VenditaDettaglio.magazzino,2)
            if hasattr(Environment.conf.VenditaDettaglio, "puntocassa"):
                findComboboxRowFromStr(self.filters.id_pos_filter_combobox, Environment.conf.VenditaDettaglio.puntocassa,2)
        else:
            if setconf("VenditaDettaglio", "magazzino_vendita"):
                findComboboxRowFromId(self.filters.id_magazzino_filter_combobox,setconf("VenditaDettaglio", "magazzino_vendita"))
            if setconf("VenditaDettaglio", "punto_cassa"):
                findComboboxRowFromId(self.filters.id_pos_filter_combobox, setconf("VenditaDettaglio", "punto_cassa"))

        self.refreshHtml()
        self.refresh()

    def _reOrderBy(self, column):
        if column.get_name() == "data_column":
            return self.filterss._changeOrderBy(column,(None,TestataScontrino.data_inserimento))
        if column.get_name() == "totale_column":
            return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_scontrino))
        if column.get_name() == "contanti_column":
            return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_contanti))
        if column.get_name() == "assegni_column":
            return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_assegni))
        if column.get_name() == "cdicredito_column":
            return self.filterss._changeOrderBy(column,(None,TestataScontrino.totale_carta_credito))

    def clear(self):
        # Annullamento filtro
        self.filters.id_articolo_filter_customcombobox.set_active(0)
        self.filters.id_cliente_search_customcombobox.set_active(0)
        if hasattr(Environment.conf, "VenditaDettaglio"):
            if hasattr(Environment.conf.VenditaDettaglio, "magazzino"):
                findComboboxRowFromStr(self.filters.id_magazzino_filter_combobox, Environment.conf.VenditaDettaglio.magazzino,2)
            if hasattr(Environment.conf.VenditaDettaglio, "puntocassa"):
                findComboboxRowFromStr(self.filters.id_pos_filter_combobox, Environment.conf.VenditaDettaglio.puntocassa,2)
        else:
            if setconf("VenditaDettaglio", "magazzino_vendita"):
                findComboboxRowFromId(self.filters.id_magazzino_filter_combobox,setconf("VenditaDettaglio", "magazzino_vendita"))
            if setconf("VenditaDettaglio", "punto_cassa"):
                findComboboxRowFromId(self.filters.id_pos_filter_combobox, setconf("VenditaDettaglio", "punto_cassa"))

        self.filters.da_data_filter_entry.setNow()
        self.filters.a_data_filter_entry.setNow()
        self.refresh()


    def refresh(self):
        # Aggiornamento TreeView
        idArticolo = self.filters.id_articolo_filter_customcombobox.getId()
        daData = stringToDate(self.filters.da_data_filter_entry.get_text())
        aData = stringToDateBumped(self.filters.a_data_filter_entry.get_text())
        idPuntoCassa = findIdFromCombobox(self.filters.id_pos_filter_combobox)
        idMagazzino = findIdFromCombobox(self.filters.id_magazzino_filter_combobox)
        idCliente =  self.filters.id_cliente_search_customcombobox.getId()
        self.filterss.numRecords = TestataScontrino().count(idArticolo=idArticolo,
                                                                      daData=daData,
                                                                      aData=aData,
                                                                      idMagazzino = idMagazzino,
                                                                      idPuntoCassa = idPuntoCassa,
                                                                      idCliente = idCliente)
        self.filterss._refreshPageCount()

        scos = TestataScontrino().select( orderBy=self.filterss.orderBy,
                                                     idArticolo=idArticolo,
                                                     daData=daData,
                                                     aData=aData,
                                                     idMagazzino = idMagazzino,
                                                     idPuntoCassa = idPuntoCassa,
                                                     idCliente = idCliente,
                                                     offset=self.filterss.offset,
                                                     batchSize=self.filterss.batchSize)

        #self.filterss._treeViewModel.clear()
        self.rows_listore.clear()
        for s in scos:
            totale = mNLC(s.totale_scontrino,2) or 0
            contanti = mNLC(s.totale_contanti,2) or 0
            assegni = mNLC(s.totale_assegni,2) or 0
            carta = mNLC(s.totale_carta_credito,2) or 0
            self.rows_listore.append((s,
                                    dateTimeToString(s.data_inserimento).replace(" "," Ore: "),
                                    totale,
                                    contanti, assegni, carta,
                                    dateToString(s.data_movimento),
                                    str(s.numero_movimento or '')))

        scos_no_batchSize = TestataScontrino().select( orderBy=self.filterss.orderBy,
                                                     idArticolo=idArticolo,
                                                     idMagazzino = idMagazzino,
                                                     idPuntoCassa = idPuntoCassa,
                                                     daData=daData,
                                                     aData=aData,
                                                     idCliente=idCliente,
                                                     offset=None,
                                                     batchSize=None)
        self.scontrini = scos_no_batchSize
        self.calcolaTotale(scos_no_batchSize)

    def calcolasconto(self, dao):
        if dao.sconti[0].tipo_sconto=="valore":
            return dao.sconti[0].valore
        else:
            #print ((dao.totale_scontrino*100)/dao.sconti[0].valore), (dao.totale_scontrino)
            return (100 * dao.totale_scontrino) / (100 - dao.sconti[0].valore) -(dao.totale_scontrino)
            #totale_scontato = total-totale_sconto

    def calcolaTotale(self, scos_no_batchSize):
        tot=0
        totccr = 0
        totass = 0
        totnum = 0
        totcont = 0
        tot_sconti = 0
        totcont_netto = 0
        totcont_resto = 0
        for m in scos_no_batchSize:
            if m.sconti:
                tot_sconti += self.calcolasconto(m)
            tot += m.totale_scontrino # totale incassato
            totccr += m.totale_carta_credito #totale carta di credito
            totass += m.totale_assegni # totale assegni
            totcont += m.totale_contanti # totale dato in contanti
            if m.totale_carta_credito == 0 and m.totale_assegni == 0 and m.totale_contanti ==0 :
                totcont += m.totale_scontrino
            if m.totale_carta_credito == 0 and m.totale_assegni == 0:
                totcont_netto += m.totale_scontrino
            totcont_resto = totcont-totcont_netto
            totnum += 1
        #self.filterss.label1.set_text("")
        stringa = """GENERALE:<b><span foreground="black" size="20000">%s</span></b> - NUM. SCONTRINI:<b><span foreground="black" size="18000">%s</span></b> TOT CARTA:<b>%s</b> - TOT ASSEGNI:<b>%s</b> - TOT CONT.:<b>%s</b> - TOT SCONTI:<b>%s</b> - """ %(mNLC(tot,2), totnum, mNLC(totccr,2), mNLC(totass,2), mNLC(totcont,2), mNLC(tot_sconti,2) )
        self.filterss.info_label.set_markup(str(stringa))


    def on_filter_treeview_cursor_changed(self, treeview):
        sel = self.filterss.resultsElement.get_selection()
        (model, iterator) = sel.get_selected()

        if iterator is None:
            print 'on_filter_treeview_cursor_changed(): FIXME: iterator is None!'
            return

        self.dao = model.get_value(iterator, 0)
        self.refreshHtml(self.dao)

    def on_filter_treeview_row_activated(self, treeview, path, column):
        # Not used here
        pass

    def on_filter_treeview_selection_changed(self, treeSelection):
        (model, iterator) = treeSelection.get_selected()
        if iterator:
            self.crea_fattura_button.set_sensitive(True)
            self.id_cliente_emessi_customcombobox.set_sensitive(True)
            self.operazione_combobox.set_sensitive(True)
            self.daoTse = model.get_value(iterator, 0)
            if model.get_value(iterator, 0).id_cliente_testata_scontrino:
                a = model.get_value(iterator, 0).id_cliente_testata_scontrino
                self.id_cliente_emessi_customcombobox.setId(a)
            else:
                self.id_cliente_emessi_customcombobox.set_active(0)
                self.operazione_combobox.set_active(0)
                #self.crea_fattura_button.set_sensitive(False)
                #self.id_cliente_emessi_customcombobox.set_sensitive(False)
                #self.operazione_combobox.set_sensitive(False)
                #self.daoTse = None
        else:
            self.id_cliente_emessi_customcombobox.set_active(0)
            self.crea_fattura_button.set_sensitive(False)
            self.id_cliente_emessi_customcombobox.set_sensitive(False)
            self.operazione_combobox.set_sensitive(False)
            self.daoTse = None

    def refreshHtml(self, dao=None):
        pageData = {}
        self.html = '<html></html>'
        if self.dao:
            pageData = {
                    "file": "scontrino.html",
                    "dao" :self.dao,
                    "tutto":True,
                    }
            self.html = renderTemplate(pageData)
        renderHTML(self.detail,self.html)

    def on_scontrini_window_close(self, widget, event=None):
        self.destroy()
        return None

    def on_rhesus_button_clicked(self, widget):
        if self.dao is not None:
            self._righe.append(self.dao.id)
            self.on_scontrini_window_close(widget)

    def on_delete_button_clicked(self, button):
        if self.dao is not None:
            msg = """ ATTENZIONE!!!!
    Si sta per cancellare uno scontrino, L'operazione
    è irreversibile per cui dovete essere sicuri di
    quel che state facendo. VUOI CANCELLARLO?"""
            if YesNoDialog(msg=msg, transient=self.getTopLevel()):
                if self.dao.numero_movimento:
                    messageInfo(msg= """Esiste già un movimento abbinato di chiusura per scarico da cassa,
        l'operazione è comunque impossibile
        Rivolgersi all'assistenza""")
                else:
                    Environment.pg2log.info("CANCELLO UNO SCONTRINO DAL PG2 ")
                    self.dao.delete()
                self.refresh()
            else:
                return

    def on_affluenza_oraria_chart_clicked(self, button):
        if posso("STA_DETT"):
            from promogest.modules.Statistiche.ui.chart import chartViewer
            chartViewer(self._window, func="affluenzaOrariaGiornaliera",daos= self.scontrini)
        else:
            fencemsg()

    def on_affluenza_mensile_chart_clicked(self, button):
        if posso("STA_DETT"):
            from promogest.modules.Statistiche.ui.chart import chartViewer
            chartViewer(self._window, func="affluenzaGiornalieraMensile", daos= self.scontrini)
        else:
            fencemsg()

    def on_affluenza_annuale_chart_clicked(self, button):
        if posso("STA_DETT"):
            from promogest.modules.Statistiche.ui.chart import chartViewer
            chartViewer(self._window, func="affluenzaMensileAnnuale", daos= self.scontrini)
        else:
            fencemsg()

    def on_esporta_affluenza_csv_clicked(self, button):
        print "esport to csv"

    def on_aggiorna_inve_activate(self, item):
        """ Questa funzione serve a ricalibrare le giacenze di inventario con
            gli articoli venduti al dettaglio """
        return
        from promogest.dao.Inventario import Inventario
        msg = """ ATTENZIONE!!!!
            QUESTA OPERAZIONE È PERICOLOSSIMA!!!!
            è stata aggiunta per corprire una casistica specifica
            di "aggiornamento della tabella inventario
            rispetto al venduto al dettaglio vuoi farlo??"""
        if YesNoDialog(msg=msg, transient=self.getTopLevel()):
            if posso("IN"):
                idMagazzinosel = Magazzino().select(denominazione = Environment.conf.VenditaDettaglio.magazzino)
                if Environment.conf.VenditaDettaglio.jolly:
                    idArticoloGenericoSel = Articolo().select(codiceEM = Environment.conf.VenditaDettaglio.jolly)
                    if idArticoloGenericoSel:
                        idArticoloGenerico = idArticoloGenericoSel[0].id
                    else:
                        idArticoloGenerico = None
                if idMagazzinosel:
                    idMagazzino = idMagazzinosel[0].id
                else:
                    print "ERRORE NELLA DEFINIZIONE DEL MAGAZZINO"
                    return
                for scontrino in self.scontrini:
                    for riga in scontrino.righe:
                        daoInv = Inventario().select(idArticolo=riga.id_articolo, idMagazzino = idMagazzino)
                        if daoInv and idArticoloGenerico!=riga.id_articolo:
                            if daoInv[0].data_aggiornamento is None or scontrino.data_inserimento < daoInv[0].data_aggiornamento:
                                quantitaprecedente = daoInv[0].quantita or 0
                                quantitavenduta = riga.quantita
                                nuovaquantita = quantitaprecedente+quantitavenduta
                                print "OPERAZIONE DA EFFETTUARE", quantitaprecedente,quantitavenduta, nuovaquantita
                                daoInv[0].quantita= nuovaquantita
                                daoInv[0].persist()
            else:
                print "IL MODULO INVENTARIO NON e' ATTIVO "

    def on_distinta_button_clicked(self, button):
        gest = Distinta(righe = self.scontrini)
        gestWnd = gest.getTopLevel()
        showAnagraficaRichiamata(self.getTopLevel(), gestWnd, None, None)

    def on_acqmedcli_menu_activate(self, menu):
        gest = AcquistoMedioCliente(righe = self.scontrini)
        gestWnd = gest.getTopLevel()
        showAnagraficaRichiamata(self.getTopLevel(), gestWnd, None, None)


    def ricercaListino(self):
        """ check if there is a priceList like setted on configure file
        """
        if hasattr(Environment.conf, "VenditaDettaglio"):
            if hasattr(Environment.conf.VenditaDettaglio,"listino"):
                pricelist = Listino().select(denominazione = Environment.conf.VenditaDettaglio.listino,
                                        offset = None,
                                        batchSize = None)
            else:
                pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))

        else:
            pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
        if pricelist:
            id_listino = pricelist[0].id
        else:
            id_listino = None
        return id_listino

    def on_crea_fattura_button_clicked(self, button):
        """ RIGA DOCUMENTO:
            id, valore_unitario_netto, valore_unitario_lordo,
            quantita, moltiplicatore, applicazione_sconti,
            percentuale_iva, descrizione, id_articolo, id_magazzino,
            id_multiplo, id_listino, id_iva, id_riga_padre

            RIGA SCONTRINO:
            id, prezzo, prezzo_scontato, quantita,
            descrizione, id_testata_scontrino, id_articolo
            TODO: Vanno gestiti gli sconti
            """
        if not self.daoTse:
            messageInfo(msg="Nessuno scontrino selezionato")
            return
        if self.daoTse and not self.daoTse.id_cliente_testata_scontrino:
            if self.id_cliente_emessi_customcombobox.getId():
                a = TestataScontrinoCliente()
                a.id_cliente =  self.id_cliente_emessi_customcombobox.getId()
                a.id_testata_scontrino = self.daoTse.id
                a.persist()
            else:
                messageInfo(msg="Scontrino selezionato, ma nessun cliente assegnato")
            return
        if not findStrFromCombobox(self.operazione_combobox,0):
            obligatoryField(self.getTopLevel(), self.operazione_combobox, msg="SELEZIONA IL TIPO DOCUMENTO")
        one_day = datetime.timedelta(days=1)
        proviamo = datetime.datetime(self.daoTse.data_inserimento.year,self.daoTse.data_inserimento.month,
        self.daoTse.data_inserimento.day)
        listascontrini = TestataScontrino().select(daData=proviamo, aData=proviamo+one_day, batchSize=None, orderBy="data_inserimento")
        a = [i for i,x in enumerate(listascontrini) if x == self.daoTse]
        if a:
            a = a[0]
        else:
            a=0
        posizione= a + 1
        note = "Rif. Scontrino" + " n. " + str(posizione) + " del " + dateToString(self.daoTse.data_inserimento)

        newDao = TestataDocumento()
        newDao.data_documento = datetime.datetime.now()
        newDao.operazione = findStrFromCombobox(self.operazione_combobox,0)
        newDao.id_cliente = self.id_cliente_emessi_customcombobox.getId()
        newDao.note_pie_pagina = note
        #newDao.applicazione_sconti = self.dao.applicazione_sconti
        #sconti = []
        #sco = self.dao.sconti or []
        scontiRigaDocumento=[]
        scontiSuTotale=[]
        righeDocumento=[]
        #for s in sco:
            #daoSconto = ScontoTestataDocumento()
            #daoSconto.valore = s.valore
            #daoSconto.tipo_sconto = s.tipo_sconto
            #scontiSuTotale.append(daoSconto)
        newDao.scontiSuTotale = scontiSuTotale
        #righe = []
        rig = self.daoTse.righe
        for r in rig:
            daoRiga = RigaDocumento()
            daoRiga.id_testata_documento = newDao.id
            daoRiga.id_articolo = r.id_articolo
            daoRiga.id_magazzino = self.daoTse.id_magazzino
            daoRiga.descrizione = r.descrizione
            # Copia il campo iva
            arto = leggiArticolo(r.id_articolo)
            daoRiga.id_iva = arto["idAliquotaIva"]
            #ricalcola prezzi
            daoRiga.id_listino = self.ricercaListino()
            imponibile = float(r.prezzo)/(1+float(arto["percentualeAliquotaIva"])/100)
            imponibile_scontato = float(r.prezzo_scontato)/(1+float(arto["percentualeAliquotaIva"])/100)
            daoRiga.valore_unitario_lordo = imponibile or 0
            daoRiga.valore_unitario_netto =  imponibile_scontato

            daoRiga.percentuale_iva = arto["percentualeAliquotaIva"]

            #daoRiga.applicazione_sconti = r.applicazione_sconti
            daoRiga.quantita = r.quantita
            daoRiga.id_multiplo = None
            daoRiga.moltiplicatore = 1
            #sconti = []
            scontiRigaDocumento = []
            #sco = r.sconti
            #for s in sco:
                #daoSconto = ScontoRigaDocumento()
                #daoSconto.valore = s.valore
                #daoSconto.tipo_sconto = s.tipo_sconto
                #scontiRigaDocumento.append(daoSconto)
            daoRiga.scontiRigaDocumento = scontiRigaDocumento
            righeDocumento.append(daoRiga)

        newDao.righeDocumento = righeDocumento

        tipoid = findStrFromCombobox(self.operazione_combobox,0)
        #tipo = Operazione().getRecord(id=tipoid)
        #if not newDao.numero:
        valori = numeroRegistroGet(tipo=tipoid, date=self.daoTse.data_inserimento)
        newDao.numero = valori[0]
        newDao.registro_numerazione= valori[1]
        newDao.persist()

        res = TestataDocumento().getRecord(id=newDao.id)

        msg = "Documento creato da scontrino !\n\nIl nuovo documento e' il n. " + str(res.numero) + " del " + dateToString(res.data_documento) + " (" + newDao.operazione + ")\n" + "Lo vuoi modificare?"
        if YesNoDialog(msg=msg, transient=self.getTopLevel()):
            from promogest.ui.anagDocumenti.AnagraficaDocumenti import AnagraficaDocumenti
            anag = AnagraficaDocumenti()
            anagWindow = anag.getTopLevel()
            anagWindow.show_all()
            anag.editElement.setVisible(True)
            anag.editElement.setDao(newDao)
            anag.editElement.id_persona_giuridica_customcombobox.set_sensitive(True)
            anag.editElement.setFocus()
        self.destroy()


    def on_stampa_button_clicked(self, button):
        from  xhtml2pdf import pisa
        if self.dao:
            f = str(self.html)
    #        f = "Hello <strong>World</strong>"
            filename =Environment.tempDir + "ristampa.pdf"
            g = file(filename, "wb")
            pdf = pisa.CreatePDF(f,g)
            g .close()
            anag = PrintDialogHandler(self,"SCONTRINO", tempFile=Environment.tempDir + "ristampa.pdf")
            anagWindow = anag.getTopLevel()
            returnWindow = self.getTopLevel().get_toplevel()
            anagWindow.set_transient_for(returnWindow)
            anagWindow.show_all()
        else:
            messageInfo(msg="Selezionare uno scontrino da stampare")
class AnagraficaPrintPreview(GladeWidget):
    """ Print preview """
    # FIXME: a lot of duplicated code from AnagraficaFilter here!

    def __init__(self, anagrafica, windowTitle, previewTemplate, veter=False):
        GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade")
        self.windowTitle = windowTitle
        self.visualizzatore_html.set_title(windowTitle)
        self._anagrafica = anagrafica
        self._veter = veter

        self.bodyWidget = FilterWidget(owner=self, resultsElement='html')
        self.bodyWidget.filter_navigation_hbox.destroy()
        self.bodyWidget.info_label.set_markup("INSERT INFO")
        self.html_scrolledwindow.add_with_viewport(
                                            self.bodyWidget.getTopLevel())

        self.print_on_screen_html = self.bodyWidget.resultsElement
        self._gtkHtmlDocuments = None
        self._previewTemplate = previewTemplate
        self.html = createHtmlObj(self)
        #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati
        # di ordinamento e di batchSize
        self._changeOrderBy = self.bodyWidget._changeOrderBy
        self.orderBy = self.bodyWidget.orderBy
        self.batchSize = self.bodyWidget.batchSize
        self.offset = self.bodyWidget.offset
        self.numRecords = self.bodyWidget.numRecords
        self._filterClosure = self._anagrafica.filter._filterClosure
        self._filterCountClosure = self._anagrafica.filter._filterCountClosure
        self.placeWindow(self.visualizzatore_html)
        self.bodyWidget.generic_button.set_property('visible', False)
        def test():
            self.html_code = "<html><body></body></html>"
            #self.html.load_html_string(self.html_code, "file:///"+sys.path[0]+os.sep)
            #self.html.show()
            #renderHTML(self.print_on_screen_html, self.html_code)
        #generaButton = self.bodyWidget.generic_button
        #generaButton.connect('clicked', self.on_generic_button_clicked )
        #generaButton.set_label("Genera Pdf Anteprima Html")
        #if Environment.pg3:
            #glib.idle_add(test)
        #else:
            #gobject.idle_add(test)
        if Environment.pg3:
            glib.idle_add(self.refresh)
        else:
            gobject.idle_add(self.refresh)
        #self.refresh()

    def on_pdf_button_clicked(self, button):
        from PrintDialog import PrintDialogHandler
        from xhtml2pdf import pisa
        f = self.html_code.replace("€","&#8364;")
        g = file(Environment.tempDir + ".temp.pdf", "wb")
        pbar(self.pbar, pulse=True, text="GENERAZIONE STAMPA ATTENDERE")
        pisa.CreatePDF(str(f), g)
        g .close()
        pbar(self.pbar, stop=True)
        anag = PrintDialogHandler(self, self.windowTitle)
        anagWindow = anag.getTopLevel()
        returnWindow = self.bodyWidget.getTopLevel().get_toplevel()
        anagWindow.set_transient_for(returnWindow)
        anagWindow.show_all()

    def on_csv_button_clicked(self, button):
        messageInfo(msg="NON ANCORA IMPLEMENTATO")

    def on_generic_combobox_changed(self, combobox):
        if self.codBar_combo.get_active() == 0:
            from PrintDialog import PrintDialogHandler
            from  xhtml2pdf import pisa
            f = self.html_code
            g = file(Environment.tempDir + ".temp.pdf", "wb")
            pisa.CreatePDF(str(f), g)
            g .close()
            anag = PrintDialogHandler(self, self.windowTitle)
            anagWindow = anag.getTopLevel()
            returnWindow = self.bodyWidget.getTopLevel().get_toplevel()
            anagWindow.set_transient_for(returnWindow)
            anagWindow.show_all()
            #self.codBar_combo.set_active(0)
        elif self.codBar_combo.get_active() == 1:
            print "ANTEPRIMA CSV"
        else:
            self.codBar_combo.set_active(-1)

    def _refreshPageCount(self):
        """ Aggiorna la paginazione """
        self.bodyWidget.numRecords = self.numRecords
        self.bodyWidget._refreshPageCount()

    @timeit
    def refresh(self):
        """ show the html page in the custom widget"""
        self.bodyWidget.orderBy = self.orderBy
        self.bodyWidget.veter = self._veter
        #self.pbar_dialog.run()
        #self.pbar_dialog.destroy()
        daos = self.bodyWidget.runFilter(offset=None,
                                        batchSize=None,
                                        filterClosure=self._filterClosure,
                                        )
        #pbar(self.pbar_report,parziale=daos.index(ragsoc), totale=len(nomi), text=ragsoc, noeta=False)
        #pbar(self.pbar_report,parziale=1, totale=4)
        if hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "cliforn":
            if self._anagrafica.aa < 0:
                daos.sort(key=lambda x: x.intestatario.strip().upper())
            else:
                daos.sort(key=lambda x: x.intestatario.strip().upper(),reverse=True)
        elif hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "impo":
            for t in daos:
                try:
                    t._totaleImponibileScontato
                except:
                    t.totali
            if self._anagrafica.aa < 0:
                daos.sort(key=lambda x: x._totaleImponibileScontato)
            else:
                daos.sort(key=lambda x: x._totaleImponibileScontato,reverse=True)
        self.numRecords = self.bodyWidget.countFilterResults(
                                        self._filterCountClosure,
                                        )
#        self._refreshPageCount()
        #pbar(self.pbar_report,parziale=2, totale=4)
        pageData = {}
        self.html_code = "<html><body></body></html>"
        if self._veter:
            daos = daos[:]
            da = []
            for d in daos:
                c = []
                for a in d.righe:
                    if "TRIPLICE" in a.rig.arti.denominazione_famiglia:
                        c.append(a)
                if len(c)>0:
                    da.append(d)
            daos = da
        #pbar(self.pbar_report,parziale=2.5, totale=4)
        if daos:
            pageData = {
                    "file": self._previewTemplate[1],
                    #"dao":daos,
                    "objects": daos
                    }
            self.html_code = renderTemplate(pageData)
        #pbar(self.pbar_report,parziale=3.75, totale=4)
        #pbar(self.pbar_report,stop=True)
        #self.pbar_dialog.hide()
        renderHTML(self.print_on_screen_html, self.html_code)

    def on_print_on_screen_dialog_response(self, dialog, responseId):
        if responseId == GTK_RESPONSE_CLOSE:
            self.on_print_on_screen_dialog_delete_event()

    def on_print_on_screen_dialog_delete_event(self, dialog=None, event=None):
        self.destroy()
class AnagraficaPrintPreview(GladeWidget):
    """ Print preview """
    # FIXME: a lot of duplicated code from AnagraficaFilter here!

    def __init__(self, anagrafica, windowTitle, previewTemplate, tipo=None):
        GladeWidget.__init__(self, root='htmlviewer', path="htmlviewer.glade")
        self.windowTitle = windowTitle
        self.visualizzatore_html.set_title(windowTitle)
        self._anagrafica = anagrafica
        self._tipo = tipo

        self.bodyWidget = FilterWidget(owner=self, resultsElement='html')
        self.bodyWidget.filter_navigation_hbox.destroy()
        self.bodyWidget.info_label.set_markup("INSERT INFO")
        self.html_scrolledwindow.add_with_viewport(
                                            self.bodyWidget.getTopLevel())

        self.print_on_screen_html = self.bodyWidget.resultsElement
        self._gtkHtmlDocuments = None
        self._previewTemplate = previewTemplate
        self.html = createHtmlObj(self)
        #Prendo tutti i dati dalla finestra di filtraggio, compresi i dati
        # di ordinamento e di batchSize
        self._changeOrderBy = self.bodyWidget._changeOrderBy
        self.orderBy = self.bodyWidget.orderBy
        self.batchSize = self.bodyWidget.batchSize
        self.offset = self.bodyWidget.offset
        self.numRecords = self.bodyWidget.numRecords
        self._filterClosure = self._anagrafica.filter._filterClosure
        self._filterCountClosure = self._anagrafica.filter._filterCountClosure
        self.placeWindow(self.visualizzatore_html)
        self.bodyWidget.generic_button.set_property('visible', False)
        def test():
            self.html_code = "<html><body></body></html>"
        glib.idle_add(self.refresh)

    def on_csv_button_clicked(self, button):
        messageInfo(msg="NON ANCORA IMPLEMENTATO")

    def on_generic_combobox_changed(self, combobox):
        if self.codBar_combo.get_active() == 0:
            from PrintDialog import PrintDialogHandler
            from  xhtml2pdf import pisa
            f = self.html_code
            g = file(Environment.tempDir + ".temp.pdf", "wb")
            pisa.CreatePDF(str(f), g)
            g .close()
            anag = PrintDialogHandler(self, self.windowTitle)
            anagWindow = anag.getTopLevel()
            returnWindow = self.bodyWidget.getTopLevel().get_toplevel()
            anagWindow.set_transient_for(returnWindow)
            anagWindow.show_all()
            #self.codBar_combo.set_active(0)
        elif self.codBar_combo.get_active() == 1:
            print "ANTEPRIMA CSV"
        else:
            self.codBar_combo.set_active(-1)

    def _refreshPageCount(self):
        """ Aggiorna la paginazione """
        self.bodyWidget.numRecords = self.numRecords
        self.bodyWidget._refreshPageCount()

    @timeit
    def refresh(self):
        """ show the html page in the custom widget"""
        self.bodyWidget.orderBy = self.orderBy
        self.bodyWidget.tipo = self._tipo
        # self.pbar_dialog.run()
        # self.pbar_dialog.destroy()
        daos = self.bodyWidget.runFilter(offset=None,
                                         batchSize=None,
                                         filterClosure=self._filterClosure,
                                         )
        azienda = Azienda().getRecord(id=Environment.azienda)
        # pbar(self.pbar_report,parziale=daos.index(ragsoc), totale=len(nomi), text=ragsoc, noeta=False)
        #pbar(self.pbar_report,parziale=1, totale=4)
        if hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "cliforn":
            if self._anagrafica.aa < 0:
                daos.sort(key=lambda x: x.intestatario.strip().upper())
            else:
                daos.sort(key=lambda x: x.intestatario.strip().upper(),reverse=True)
        elif hasattr(self._anagrafica,"funzione_ordinamento") and self._anagrafica.funzione_ordinamento == "impo":
            for t in daos:
                try:
                    t._totaleImponibileScontato
                except:
                    t.totali
            if self._anagrafica.aa < 0:
                daos.sort(key=lambda x: x._totaleImponibileScontato)
            else:
                daos.sort(key=lambda x: x._totaleImponibileScontato,reverse=True)
        self.numRecords = self.bodyWidget.countFilterResults(
                                        self._filterCountClosure,
                                        )
#        self._refreshPageCount()
        #pbar(self.pbar_report,parziale=2, totale=4)
        pageData = {}
        self.html_code = "<html><body></body></html>"
        if self._tipo == "veter":
            daos = daos[:]
            da = []
            for d in daos:
                c = []
                for a in d.righe:
                    if "TRIPLICE" in a.rig.arti.denominazione_famiglia:
                        c.append(a)
                if len(c)>0:
                    da.append(d)
            daos = da
        elif self._tipo == "massa":
            daos=daos[:]
            articoli_dict = {}
            if daos:
                cliente = daos[0].CLI
            else:
                cliente = None
            for d in daos:
                for x in d.righe:
                    if x.id_articolo:
                        if x.rig.arti.APADR and (x.rig.arti.APADR.percentuale_carbonio or
                            x.rig.arti.APADR.percentuale_cov or
                            x.rig.arti.APADR.percentuale_secco):
                            a_adr = x.rig.arti
                            # print(a_adr)
                            if a_adr in articoli_dict:
                                articoli_dict[a_adr] += ( x.quantita*x.moltiplicatore )
                            else:
                                articoli_dict[a_adr] = (
                                    x.quantita * x.moltiplicatore )
            print(self._anagrafica.filter)
            daData = self._anagrafica.filter.daData
            aData =  self._anagrafica.filter.aData
            pageData = {
                "file" : "report_massa.html",
                "rows": articoli_dict,
                "azienda":azienda,
                "cliente":cliente,
                "daData":daData,
                "aData":aData,
                "daos":daos,

            }
            self.html_code = renderTemplate(pageData)
            try:
                renderHTML(self.print_on_screen_html, str(self.html_code))
            except:
                renderHTML(self.print_on_screen_html, self.html_code)
            return

        #pbar(self.pbar_report,parziale=2.5, totale=4)
        if daos:
            pageData = {
                    "file": self._previewTemplate[1],
                    #"dao":daos,
                    "objects": daos,
                    "azienda" : azienda,
                    }
            self.html_code = renderTemplate(pageData)
        #pbar(self.pbar_report,parziale=3.75, totale=4)
        #pbar(self.pbar_report,stop=True)
        #self.pbar_dialog.hide()
        try:
            renderHTML(self.print_on_screen_html, str(self.html_code))
        except:
            renderHTML(self.print_on_screen_html, self.html_code)

    def on_print_on_screen_dialog_response(self, dialog, responseId):
        if responseId == GTK_RESPONSE_CLOSE:
            self.on_print_on_screen_dialog_delete_event()

    def on_print_on_screen_dialog_delete_event(self, dialog=None, event=None):
        self.destroy()


    def on_pdf_button_clicked(self, button):
        from PrintDialog import PrintDialogHandler

        operation = Gtk.PrintOperation()
        setting = Gtk.PageSetup()
        ps = Gtk.PaperSize.new_custom("cc", "cc", 210, 297, gtk.Unit.MM)
        st = Gtk.PrintSettings()
        s = Gtk.PageSetup()
        s.set_paper_size(ps)
        margine_fondo = float(setconf("Stampa", "report_margine_basso") or 4.3)
        s.set_bottom_margin(margine_fondo, gtk.Unit.MM)
        margine_sinistro = float(
            setconf("Stampa", "report_margine_sinistro") or 4.3)
        s.set_left_margin(margine_sinistro, gtk.Unit.MM)
        margine_destro = float(
            setconf("Stampa", "report_margine_destro") or 4.3)
        s.set_right_margin(margine_destro, gtk.Unit.MM)
        margine_alto = float(setconf("Stampa", "report_margine_alto") or 4.3)
        s.set_top_margin(margine_alto, gtk.Unit.MM)
        orientamento = str(setconf("Stampa", "report_ori"))
        if not orientamento or orientamento == "orizzontale":
            s.set_orientation(Gtk.PageOrientation.LANDSCAPE)
        operation.set_default_page_setup(s)
        operation.set_export_filename(Environment.tempDir + ".temp.pdf")
        #import xhtml2pdf.pisa as pisa
        #import cStringIO
        #data=  self.print_on_screen_html.get_main_frame().get_data_source().get_data().str
        #g = open(Environment.tempDir + "ciccio.html", "w")
        # pdf = pisa.CreatePDF(
        #     cStringIO.StringIO(data),
        #     g
        # )
        #g.write(data)
        #g.close()
        p = self.print_on_screen_html.get_main_frame().print_full(operation,
                                                      gtk.PrintOperationAction.EXPORT)
        pbar(self.pbar, pulse=True, text="GENERAZIONE STAMPA ATTENDERE")
        pbar(self.pbar, stop=True)
        anag = PrintDialogHandler(self, self.windowTitle, tipo="report")
        anagWindow = anag.getTopLevel()
        returnWindow = self.bodyWidget.getTopLevel().get_toplevel()
        anagWindow.set_transient_for(returnWindow)
        anagWindow.show_all()
class Anagrafica(GladeWidget):
    """ Classe base per le anagrafiche semplici """

    def __init__(self, windowTitle, recordMenuLabel,
                 filterElement, detailElement, path=None, url_help="http://www.promogest.me/promoGest/faq"):
        if not path:
            path='anagrafica_semplice_window.glade'
        GladeWidget.__init__(self, root='anagrafica_semplice_window',
                            path=path)
        Environment.windowGroup.append(self.anagrafica_semplice_window)
        self.anagrafica_semplice_window.set_title(windowTitle)
        self.record_menu.set_label(recordMenuLabel)

        self.bodyWidget = FilterWidget(owner=self, filtersElement=filterElement)
        #self.anagrafica_scrolledwindow.add(self.bodyWidget.getTopLevel())
        self.anagrafica_viewport.add(self.bodyWidget.getTopLevel())
        self.bodyWidget.filter_body_label.set_no_show_all(True)
        self.bodyWidget.filter_body_label.set_property('visible', False)
        self.bodyWidget.generic_button.set_no_show_all(True)
        self.bodyWidget.generic_button.set_property('visible', False)

        self.filter = self.bodyWidget.filtersElement
        self.url_help = url_help
        self.filterTopLevel = self.filter.getTopLevel()
        self.filterTopLevel.set_sensitive(True)

        self.detail = detailElement

        self.anagrafica_treeview = self.bodyWidget.resultsElement
        self._treeViewModel = None
        self._rowEditingPath = None
        self._tabPressed = False

        # mapping fields and methods from bodyWidget to this class
        self.anagrafica_filter_navigation_hbox = self.bodyWidget.filter_navigation_hbox
        self.anagrafica_filter_frame = self.bodyWidget.filter_frame
        self._widgetFirstFocus = self.bodyWidget._firstFocusWidget
        self._changeOrderBy = self.bodyWidget._changeOrderBy
        self.orderBy = self.bodyWidget.orderBy = None
        self.batchSize = self.bodyWidget.batchSize = int(setconf("Numbers", "batch_size"))
        self.offset = self.bodyWidget.offset = 0
        self.numRecords = self.bodyWidget.numRecords = 0
        self._filterClosure = None

        self.placeWindow(self.anagrafica_semplice_window)
        self.draw()
        self.setFocus()


    def draw(self):
        """ Facoltativo ma suggerito per indicare la lunghezza
        massima della cella di testo
        """
        self._treeViewModel = self.filter.filter_listore
        self.refresh()

    def show_all(self):
        """ Visualizza/aggiorna tutta la struttura dell'anagrafica """
        self.anagrafica_semplice_window.show_all()

    def on_credits_menu_activate(self, widget):
        creditsDialog = GladeWidget(root='credits_dialog',path='credits_dialog.glade', callbacks_proxy=self)
        creditsDialog.getTopLevel().set_transient_for(self.getTopLevel())
        creditsDialog.getTopLevel().show_all()
        response = creditsDialog.credits_dialog.run()
        if response == GTK_RESPONSE_OK:
            creditsDialog.credits_dialog.destroy()

    def on_send_Email_activate(self, widget):
        sendemail = SendEmail()

    def on_help_activated(self, widget):
        webbrowser.open_new_tab(self.url_help)

    def on_licenza_menu_activate(self, widget):
        licenzaDialog = GladeWidget(root='licenza_dialog',path="licenza_dialog.glade",  callbacks_proxy=self)
        licenzaDialog.getTopLevel().set_transient_for(self.getTopLevel())
        licenseText = ''
        try:
            lines = open('./LICENSE').readlines()
            for l in lines:
                licenseText += l
        except:
            licenseText = 'Lavori in corso ....'
            print 'License file not found (LICENSE).'
        textBuffer = licenzaDialog.licenza_textview.get_buffer()
        textBuffer.set_text(licenseText)
        licenzaDialog.licenza_textview.set_buffer(textBuffer)
        licenzaDialog.getTopLevel().show_all()
        response = licenzaDialog.licenza_dialog.run()
        if response == GTK_RESPONSE_OK:
            licenzaDialog.licenza_dialog.destroy()

    def on_record_new_activate(self, widget,codice=None):
        """ Nuovo record """
        if codice:
            self.detail.setDao(None, codice=codice)
        else:
            self.detail.setDao(None)
        if self._windowName == 'AnagraficaBanche':
            from AnagraficaBancheEdit import AnagraficaBancheEdit
            anag = AnagraficaBancheEdit(self, codice=codice)
            return
        self.filterTopLevel.set_sensitive(False)
        self.anagrafica_filter_navigation_hbox.set_sensitive(False)
        self.anagrafica_filter_frame.set_sensitive(False)
        self.anagrafica_treeview_set_edit(True)
        self.anagrafica_treeview.set_headers_clickable(False)
        self.anagrafica_treeview.set_enable_search(False)

        self.record_new_button.set_sensitive(False)
        self.record_new_menu.set_sensitive(False)

        self.record_save_button.set_sensitive(True)
        self.record_save_menu.set_sensitive(True)

        self.record_cancel_button.set_sensitive(True)
        self.record_cancel_menu.set_sensitive(True)

        self.record_undo_button.set_sensitive(False)
        self.record_undo_menu.set_sensitive(False)

        self.record_delete_button.set_sensitive(False)
        self.record_delete_menu.set_sensitive(False)

    def on_record_delete_activate(self, widget):
        """ Eliminazione record """
        if not YesNoDialog(msg='Confermi l\'eliminazione ?', transient=None):
            self.anagrafica_treeview.grab_focus()
            return
        self.detail.deleteDao()
        self.refresh()

        self.filterTopLevel.set_sensitive(True)
        self.anagrafica_filter_navigation_hbox.set_sensitive(True)
        self.anagrafica_filter_frame.set_sensitive(True)
        self.anagrafica_treeview_set_edit(False)
        self.anagrafica_treeview.set_headers_clickable(True)
        self.anagrafica_treeview.set_enable_search(True)

        self.record_new_button.set_sensitive(True)
        self.record_new_menu.set_sensitive(True)

        self.record_save_button.set_sensitive(False)
        self.record_save_menu.set_sensitive(False)

        self.record_cancel_button.set_sensitive(False)
        self.record_cancel_menu.set_sensitive(False)

        self.record_undo_button.set_sensitive(False)
        self.record_undo_menu.set_sensitive(False)

        self.record_delete_button.set_sensitive(False)
        self.record_delete_menu.set_sensitive(False)

        self.setFocus()

    def on_record_save_activate(self, widget, path=None, column=None):
        """ Salvataggio record """
        self.anagrafica_treeview.grab_focus()
        try:
            self.detail.saveDao()
        except Exception:
            self.anagrafica_treeview_set_edit(True)
            return

        self.filterTopLevel.set_sensitive(True)
        self.anagrafica_filter_navigation_hbox.set_sensitive(True)
        self.anagrafica_filter_frame.set_sensitive(True)
        self.anagrafica_treeview_set_edit(False)
        self.anagrafica_treeview.set_headers_clickable(True)
        self.anagrafica_treeview.set_enable_search(True)

        self.refresh()

        self.record_new_button.set_sensitive(True)
        self.record_new_menu.set_sensitive(True)

        self.record_save_button.set_sensitive(False)
        self.record_save_menu.set_sensitive(False)

        self.record_cancel_button.set_sensitive(False)
        self.record_cancel_menu.set_sensitive(False)

        self.record_undo_button.set_sensitive(False)
        self.record_undo_menu.set_sensitive(False)

        self.record_delete_button.set_sensitive(False)
        self.record_delete_menu.set_sensitive(False)

        self.setFocus()

    def on_record_cancel_activate(self, widget):
        """ Annullamento modifiche record """

        if self._rowEditingPath is None:
            return
        dialog = gtk.MessageDialog(self.getTopLevel(),
                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                   GTK_DIALOG_MESSAGE_QUESTION,
                                   GTK_BUTTON_YES_NO,
                                   'Abbandonare le modifiche ?')

        response = dialog.run()
        dialog.destroy()
        if response != GTK_RESPONSE_YES:
            self.anagrafica_treeview.grab_focus()
            return

        self.anagrafica_treeview.grab_focus()
        self.detail.updateDao()

        self.filterTopLevel.set_sensitive(True)
        self.anagrafica_filter_navigation_hbox.set_sensitive(True)
        self.anagrafica_filter_frame.set_sensitive(True)
        self.anagrafica_treeview_set_edit(False)
        self.anagrafica_treeview.set_headers_clickable(True)
        self.anagrafica_treeview.set_enable_search(True)

        self.refresh()

        self.record_new_button.set_sensitive(True)
        self.record_new_menu.set_sensitive(True)

        self.record_save_button.set_sensitive(False)
        self.record_save_menu.set_sensitive(False)

        self.record_cancel_button.set_sensitive(False)
        self.record_cancel_menu.set_sensitive(False)

        self.record_undo_button.set_sensitive(False)
        self.record_undo_menu.set_sensitive(False)

        self.record_delete_button.set_sensitive(False)
        self.record_delete_menu.set_sensitive(False)

        self.setFocus()

    def on_export_csv_button_clicked(self, button):
        dao = self.detail.setDao(None)
        from ExportCsv import ExportCsv
        anag = ExportCsv(self, dao=dao)
        dao=None
        return

    def on_record_undo_activate(self, widget):
        """ Rilettura record """
        if self._rowEditingPath is None:
            return
        dialog = gtk.MessageDialog(self.getTopLevel(),
                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                   GTK_DIALOG_MESSAGE_QUESTION,
                                   GTK_BUTTON_YES_NO,
                                   'Cancellare le modifiche ?')

        response = dialog.run()
        dialog.destroy()
        if response != GTK_RESPONSE_YES:
            self.anagrafica_treeview.grab_focus()
            self.anagrafica_treeview_set_edit(True)
            return

        self.anagrafica_treeview.grab_focus()
        self.detail.updateDao()

        self.filterTopLevel.set_sensitive(False)
        self.anagrafica_filter_navigation_hbox.set_sensitive(False)
        self.anagrafica_filter_frame.set_sensitive(False)
        self.anagrafica_treeview.set_headers_clickable(False)
        self.anagrafica_treeview.set_enable_search(False)

        self.record_new_button.set_sensitive(False)
        self.record_new_menu.set_sensitive(False)

        self.record_save_button.set_sensitive(True)
        self.record_save_menu.set_sensitive(True)

        self.record_cancel_button.set_sensitive(True)
        self.record_cancel_menu.set_sensitive(True)

        self.record_undo_button.set_sensitive(True)
        self.record_undo_menu.set_sensitive(True)

        self.record_delete_button.set_sensitive(True)
        self.record_delete_menu.set_sensitive(True)

        self.record_edit_button.set_sensitive(False)
        self.record_edit_menu.set_sensitive(False)

    def on_record_edit_activate(self, widget):
        """ Modifica record """
        self.detail.updateDao()
        if self._windowName == 'AnagraficaBanche':
            from AnagraficaBancheEdit import AnagraficaBancheEdit
            anag = AnagraficaBancheEdit(self, dao=self.detail.dao)
            return
        self.filterTopLevel.set_sensitive(False)
        self.anagrafica_filter_navigation_hbox.set_sensitive(False)
        self.anagrafica_filter_frame.set_sensitive(False)
        self.anagrafica_treeview_set_edit(True)
        self.anagrafica_treeview.set_headers_clickable(False)
        self.anagrafica_treeview.set_enable_search(False)

        self.record_new_button.set_sensitive(False)
        self.record_new_menu.set_sensitive(False)

        self.record_save_button.set_sensitive(True)
        self.record_save_menu.set_sensitive(True)

        self.record_cancel_button.set_sensitive(True)
        self.record_cancel_menu.set_sensitive(True)

        self.record_undo_button.set_sensitive(True)
        self.record_undo_menu.set_sensitive(True)

        self.record_delete_button.set_sensitive(True)
        self.record_delete_menu.set_sensitive(True)

        self.record_edit_button.set_sensitive(False)
        self.record_edit_menu.set_sensitive(False)

    def setFocus(self, widget=None):
        """ Da il fuoco al widget indicato o al primo widget """
        if widget is None:
            self.filter._widgetFirstFocus.grab_focus()
        else:
            widget.grab_focus()

    def on_filter_treeview_row_activated(self, treeview, path, column):
        """ Gestisce la conferma della riga """
        if self._rowEditingPath is None:
            self.on_record_edit_activate(self.record_edit_button)

    def on_filter_treeview_cursor_changed(self, treeview):
        """ Gestisce lo spostamento tra le righe """
        sel = self.anagrafica_treeview.get_selection()
        if not sel:
            return
        (model, iterator) = sel.get_selected()
        if self._rowEditingPath is not None:
            if iterator:
                row = model[iterator]
                if row.path != self._rowEditingPath:
                    sel.select_path(self._rowEditingPath)
                return
        else:
            if iterator is None:
                return

            dao = model.get_value(iterator, 0)

            self.detail.setDao(dao)

            self.record_edit_button.set_sensitive(True)
            self.record_edit_menu.set_sensitive(True)

    def on_filter_treeview_selection_changed(self, selection):
        pass

    def _newRow(self, modelRow):
        """ Crea una nuova riga """
        sel = self.anagrafica_treeview.get_selection()
        (model, iterator) = sel.get_selected()
        iterator = model.append(modelRow)
        sel.select_iter(iterator)


    def _getRowEditingPath(self, model, iterator):
        """ Restituisce il path relativo alla riga che e' in modifica """
        if iterator is not None:
            row = model[iterator]
            self._rowEditingPath = row.path


    def on_filter_treeview_keypress_event(self, treeview, event):
        """ Gestisce la pressione del tab su una cella """
        if event.keyval == 65289:
            self._tabPressed = True


    def on_column_edited(self, cell, path, value, treeview, editNext=True, column=None):
        """ Gestisce l'immagazzinamento dei valori nelle celle """
        model = treeview.get_model()
        iterator = model.get_iter(path)
        if column is None:
            column = cell.column
        row = model[iterator]
        if row.path == self._rowEditingPath:
            if cell.__class__ is gtk.CellRendererText:
                try:
                    length = cell.get_data('max_length')
                    model.set_value(iterator, column+1, value[:length])
                except:
                    model.set_value(iterator, column+1, value)
            elif cell.__class__ is gtk.CellRendererToggle:
                model.set_value(iterator, column+1, not cell.get_active())

        columns = treeview.get_columns()
        if column+1 <= columns:
            if self._tabPressed:
                self._tabPressed = False
            gobject.timeout_add(1,
                                treeview.set_cursor, gtk.TreePath(str(path)),
                                treeview.get_column(column+1), editNext)


    def anagrafica_treeview_set_edit(self, flag):
        """ Mette la riga corrente della treeview in stato di edit / browse """
        sel = self.anagrafica_treeview.get_selection()
        (model, iterator) = sel.get_selected()
        columns = self.anagrafica_treeview.get_columns()
        for c in columns:
            renderers = c.get_cells()
            for r in renderers:
                if r.__class__ is gtk.CellRendererText:
                    r.set_property('editable', flag)
                elif r.__class__ is gtk.CellRendererToggle:
                    r.set_property('activatable', flag)
        if flag:
            self._getRowEditingPath(model, iterator)
            row = model[iterator]
            column = self.anagrafica_treeview.get_column(0)
            self.anagrafica_treeview.grab_focus()
            self.anagrafica_treeview.set_cursor(row.path, column, True)
        else:
            self._rowEditingPath = None


    def on_anagrafica_window_close(self, widget, event=None):
        """ Gestisce la richiesta di uscita dall'anagrafica """
        if self._rowEditingPath is not None:
            dialog = gtk.MessageDialog(self.getTopLevel(),
                                       GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                       GTK_DIALOG_MESSAGE_QUESTION,
                                       GTK_BUTTON_YES_NO,
                                       'Confermi la chiusura ?')
            response = dialog.run()
            dialog.destroy()
            if response != GTK_RESPONSE_YES:
                return True

        self.destroy()


    #def draw(self):
        #"""
        #Disegna i contenuti dell'elenco dell' anagrafica. Metodo invocato
        #una sola volta, dopo la costruzione dell'oggetto
        #"""
        #raise NotImplementedError


    def refresh(self):
        """ Aggiorna il l'elenco dell'anagrafica in base ai parametri impostati """
        raise NotImplementedError


    def clear(self):
        """ Annulla i parametri impostati per la ricerca """
        self.filter.clear()


    def runFilter(self, offset='__default__', batchSize='__default__',
                  progressCB=None, progressBatchSize=0):
        """ Recupera i dati """
        self.bodyWidget.orderBy = self.orderBy
        return self.bodyWidget.runFilter(offset=offset, batchSize=batchSize,
                                         progressCB=progressCB, progressBatchSize=progressBatchSize,
                                         filterClosure=self._filterClosure)


    def _refreshPageCount(self):
        """ Aggiorna la paginazione """
        self.bodyWidget.numRecords = self.numRecords
        self.bodyWidget._refreshPageCount()