def fornitura_table(soup=None, op=None,dao=None, row=None, all=False):
    d = None
    if soup and not all:
        record = soup.fornitura.get(loads(row.object))
    else:
        record = row
    if op =="DELETE":
        if all:
            d = Fornitura().getRecord(id=row.id)
        else:
            d = Fornitura().getRecord(id=loads(row.object))
        if d:
            d.delete()
        return True
    elif op == "INSERT":
        if all:
            d = Fornitura()
            d.id = record.id
        else:
            d = Fornitura().getRecord(id=loads(row.object))
    elif op == "UPDATE":
        if all:
            d = Fornitura().getRecord(id=row.id)
        else:
            d = Fornitura().getRecord(id=loads(row.object))

    d.codice_articolo_fornitore = record.codice_articolo_fornitore
    d.prezzo_lordo = record.prezzo_lordo
    d.prezzo_netto = record.prezzo_netto
    d.applicazione_sconti = record.applicazione_sconti
    d.scorta_minima = record.scorta_minima
    d.tempo_arrivo_merce = record.tempo_arrivo_merce
    d.fornitore_preferenziale = record.fornitore_preferenziale
    d.percentuale_iva = record.percentuale_iva
    d.data_fornitura = record.data_fornitura
    d.data_prezzo = record.data_prezzo
    d.id_fornitore = record.id_fornitore
    d.id_articolo = record.id_articolo
    d.id_multiplo = record.id_multiplo
    d.persist()
    return True
    def persist(self, cancellaRighe=True):
        """cancellazione righe associate alla testata
            conn.execStoredProcedure('RigheMovimentoDel',(self.id, ))"""
        if not self.numero:
            valori = numeroRegistroGet(tipo="Movimento", date=self.data_movimento)
            self.numero = valori[0]
            self.registro_numerazione= valori[1]
        params["session"].add(self)


        sm = posso("SM")
        if self.righeMovimento:
            if cancellaRighe:
                self.righeMovimentoDel(sm=sm)
            if self.operazione == "Carico da composizione kit":
                #print "DEVO AGGIUNGERE IN NEGATIVO LE RIGHE KIT"
                righeMov = []
                for riga in self.righeMovimento:
                    arto = Articolo().getRecord(id=riga.id_articolo)
                    #print "KIT", arto.articoli_kit
                    for art in arto.articoli_kit():
                        #print art.id_articolo_filler, art.quantita
                        a = leggiArticolo(art.id_articolo_filler)
                        r = RigaMovimento()
                        r.valore_unitario_netto = 0
                        r.valore_unitario_lordo = 0
                        r.quantita = -1*(art.quantita*riga.quantita)
                        r.moltiplicatore = 1
                        r.applicazione_sconti = riga.applicazione_sconti
                        r.sconti = []
                        r.percentuale_iva = a["percentualeAliquotaIva"]
                        r.descrizione  = a["denominazione"]
                        r.id_articolo = art.id_articolo_filler
                        r.id_magazzino = riga.id_magazzino
                        r.id_multiplo = riga.id_multiplo
                        r.id_listino = riga.id_listino
                        r.id_iva = a["idAliquotaIva"]
                        r.id_riga_padre = riga.id_riga_padre
                        r.scontiRigheMovimento = riga.scontiRigheMovimento
                        righeMov.append(r)
                self.righeMovimento = self.righeMovimento+righeMov
            if self.operazione == "Scarico Scomposizione kit":
                #print "DEVO AGGIUNGERE IN NEGATIVO LE RIGHE KIT"
                righeMov = []
                for riga in self.righeMovimento:
                    arto = Articolo().getRecord(id=riga.id_articolo)
                    #print "KIT", arto.articoli_kit
                    for art in arto.articoli_kit():
                        print art.id_articolo_filler, art.quantita
                        a = leggiArticolo(art.id_articolo_filler)
                        r = RigaMovimento()
                        r.valore_unitario_netto = 0
                        r.valore_unitario_lordo = 0
                        r.quantita = art.quantita*riga.quantita
                        r.moltiplicatore = 1
                        r.applicazione_sconti = riga.applicazione_sconti
                        r.sconti = []
                        r.percentuale_iva = a["percentualeAliquotaIva"]
                        r.descrizione  = a["denominazione"] +" $SSK$"
                        r.id_articolo = art.id_articolo_filler
                        r.id_magazzino = riga.id_magazzino
                        r.id_multiplo = riga.id_multiplo
                        r.id_listino = riga.id_listino
                        r.id_iva = a["idAliquotaIva"]
                        r.id_riga_padre = riga.id_riga_padre
                        r.scontiRigheMovimento = riga.scontiRigheMovimento
                        righeMov.append(r)
                    riga.quantita = -1*riga.quantita
                self.righeMovimento = self.righeMovimento+righeMov
            if self.operazione == "Trasferimento merce magazzino" and self.id_to_magazzino:
                righeMov = []
                for riga in self.righeMovimento:
                    r = RigaMovimento()
                    r.valore_unitario_netto = riga.valore_unitario_netto
                    r.valore_unitario_lordo = riga.valore_unitario_lordo
                    r.quantita = riga.quantita
                    r.moltiplicatore = riga.moltiplicatore
                    r.applicazione_sconti = riga.applicazione_sconti
                    r.sconti = riga.sconti
                    r.percentuale_iva = riga.percentuale_iva
                    r.descrizione  = riga.descrizione
                    r.id_articolo = riga.id_articolo
                    r.id_magazzino = self.id_to_magazzino
                    r.id_multiplo = riga.id_multiplo
                    r.id_listino = riga.id_listino
                    r.id_iva = riga.id_iva
                    r.id_riga_padre = riga.id_riga_padre
                    r.scontiRigheMovimento = riga.scontiRigheMovimento
                    righeMov.append(r)
                    riga.quantita = -1*riga.quantita
                self.righeMovimento = self.righeMovimento+righeMov
            #sm = posso("SM")
            lt = setconf("Documenti", "lotto_temp")
            gl = setconf("General", "gestione_lotti")
            for riga in self.righeMovimento:
                if "RigaDocumento" in str(riga.__module__):
                    riga.id_testata_documento = self.id_testata_documento
                    riga.persist(sm=sm)
                else:
                    #se non ho un id salvo il dao e me ne faccio dare uno
                    if not self.id:
                        params["session"].commit()
                    riga.id_testata_movimento = self.id
                    # vado a salvare le righe movimento
                    riga.persist(sm=sm)
                    datta = self.data_movimento
                    if hasattr(riga,"data_prezzo") and riga.data_prezzo is not None:
                        datta = stringToDateTime(riga.data_prezzo)
                    if self.id_fornitore and riga.id_articolo:
                        fors = Fornitura().select(idArticolo=riga.id_articolo,
                                                    idFornitore=self.id_fornitore,
                                                    dataPrezzo =  datta,
                                                    orderBy = 'data_fornitura DESC',
                                                    batchSize = None)
                        if fors:
                            daoFornitura = fors[0]
                        else:
                            daoFornitura = Fornitura()

                        if hasattr(riga,"data_prezzo") and riga.data_prezzo is not None and riga.data_prezzo != "":
                            daoFornitura.data_prezzo = stringToDateTime(riga.data_prezzo)
                        if hasattr(riga, "ordine_minimo") and riga.ordine_minimo is not None and riga.ordine_minimo != "":
                            daoFornitura.scorta_minima = int(riga.ordine_minimo)
                        if hasattr(riga, "tempo_arrivo") and riga.tempo_arrivo is not None and riga.tempo_arrivo != "":
                            daoFornitura.tempo_arrivo_merce = int(riga.tempo_arrivo)
                        if hasattr(riga,"numero_lotto"):
                            daoFornitura.numero_lotto = riga.numero_lotto or ""
                        if hasattr(riga, "data_scadenza"):
                            daoFornitura.data_scadenza = stringToDate(riga.data_scadenza) or None
                        if hasattr(riga, "data_produzione"):
                            daoFornitura.data_produzione = stringToDate(riga.data_produzione) or None

                        daoFornitura.data_fornitura = self.data_movimento
                        daoFornitura.fornitore_preferenziale = True
                        daoFornitura.id_fornitore = self.id_fornitore
                        daoFornitura.id_articolo = riga.id_articolo
                        if not daoFornitura.data_prezzo:
                            daoFornitura.data_prezzo = self.data_movimento
                        if "_RigaMovimento__codiceArticoloFornitore" in riga.__dict__:
                            daoFornitura.codice_articolo_fornitore = riga.__dict__["_RigaMovimento__codiceArticoloFornitore"]
                        daoFornitura.prezzo_lordo = riga.valore_unitario_lordo
                        daoFornitura.prezzo_netto = riga.valore_unitario_netto
                        daoFornitura.percentuale_iva = riga.percentuale_iva
                        daoFornitura.applicazione_sconti = riga.applicazione_sconti
                        sconti = []
                        for s in riga.sconti:
                            daoSconto = ScontoFornitura()
                            daoSconto.id_fornitura = daoFornitura.id
                            daoSconto.valore = s.valore
                            daoSconto.tipo_sconto = s.tipo_sconto
                            sconti.append(daoSconto)

                        daoFornitura.sconti = sconti
                        try:
                            params["session"].add(daoFornitura)
                            params["session"].commit()
                        except:
                            params["session"].rollback()

                        if gl:
                            #cambiata la logica, adesso le righe su rmf sono sempre e solo una
                            #viene gestita invece un'altra tabella di raccordo per le quantità
                            a = RigaMovimentoFornitura()
                            a.id_articolo = riga.id_articolo
                            a.id_riga_movimento_acquisto = riga.id
                            a.id_fornitura = daoFornitura.id
                            params["session"].add(a)
                            #params["session"].commit()

                    elif gl:
                        if hasattr(riga,"righe_movimento_fornitura"):
                            for g in riga.righe_movimento_fornitura:
                                a = RigaMovimentoFornitura()
                                a.id_articolo = riga.id_articolo
                                a.id_riga_movimento_vendita = riga.id
                                a.id_fornitura = g
                                params["session"].add(a)
                            #params["session"].commit()

                        if lt and hasattr(riga,"lotto_temp") and riga.lotto_temp:
                            # Salvare il lotto temporaneo
                            n = NumeroLottoTemp()
                            n.id_riga_movimento_vendita_temp = riga.id
                            n.lotto_temp = riga.lotto_temp
                            params["session"].add(n)
            params["session"].commit()
        self.init_on_load()
Example #3
0
    def fillDaos(self):
        """fillDaos method fills all Dao related to daoArticolo
        """
        if posso("PW") and self.tipoArticolo == "SON":
            self.daoArticolo.codice = self.articoloPadre.codice + self.gruppo_taglia[0:3] + self.taglia + self.colore
            self.daoArticolo.denominazione = self.articoloPadre.denominazione + ' ' + self.taglia + ' ' + self.colore
            self.codice_articolo = self.articoloPadre
        else:
            if self.codice_articolo is None or self.codice_articolo == "None":
                self.codice_articolo = promogest.dao.Articolo.getNuovoCodiceArticolo()
            self.daoArticolo.codice = str(self.codice_articolo)

            if self.denominazione_articolo:
                self.daoArticolo.denominazione = str(self.denominazione_articolo)
            else:
                if not self.daoArticolo.denominazione:
                    messageInfo(msg= "ATTENZIONE DESCRIZIONE MANCANTE\nIN INSERIMENTO NUOVO ARTICOLO %s" %str(self.codice_barre_articolo))
#                    raise NameError("ERRORE DESCRIZIONE MANCANTE")
                    return


#        print "STO PER SALVARE ", self.daoArticolo.denominazione
        #families
        id_famiglia = None
        if self.famiglia_articolo is None:
            self.famiglia_articolo_id = int(self.defaults['Famiglia'])
            self.famiglia_articolo = FamigliaArticolo().getRecord(id=self.famiglia_articolo_id)
            id_famiglia = self.famiglia_articolo.id

        else:
            self._families = FamigliaArticolo().select(batchSize=None)
            code_list = []
            for f in self._families:
                code_list.append(f.codice)
                if self.famiglia_articolo in (f.denominazione_breve,
                                            f.denominazione, f.codice, f.id):
                    id_famiglia = f.id
                    break
            if  id_famiglia is None:
                family_code = self.famiglia_articolo[:4]
                if len(self._families) > 0:
                    ind = 0
                    for code in code_list:
                        if family_code == code[:4]:
                            ind +=1
                    family_code = family_code+'/'+str(ind)

                daoFamiglia = FamigliaArticolo()
                daoFamiglia.codice = family_code
                daoFamiglia.denominazione_breve = self.famiglia_articolo[:10]
                daoFamiglia.denominazione = self.famiglia_articolo
                daoFamiglia.id_padre = None
                daoFamiglia.persist()
                id_famiglia = daoFamiglia.id
                self._families.append(daoFamiglia)
        self.daoArticolo.id_famiglia_articolo = id_famiglia
        #categories
        id_categoria = None
        if self.categoria_articolo is None:
            self.categoria_articolo_id = self.defaults['Categoria']
            self.categoria_articolo = CategoriaArticolo().getRecord(id=self.categoria_articolo_id)
            id_categoria = self.categoria_articolo.id
        else:
            self._categories = CategoriaArticolo().select(batchSize=None)
            category_list = []
            for c in self._categories:
                category_list.append(c.denominazione_breve)
                if self.categoria_articolo in (c.denominazione, c.denominazione_breve):
                    id_categoria = c.id
                    break
            if id_categoria == None:
                category_short_name = self.categoria_articolo[:7]
                if len(self._categories) > 0:
                    ind = 0
                    for category in category_list:
                        if category_short_name == category[:7]:
                            ind +=1
                    category_short_name = category_short_name+'/'+str(ind)
                daoCategoria = CategoriaArticolo()
                daoCategoria.denominazione_breve = category_short_name
                daoCategoria.denominazione = self.categoria_articolo
                daoCategoria.persist()
                id_categoria = daoCategoria.id
                self._categories.append(daoCategoria)
        self.daoArticolo.id_categoria_articolo = id_categoria
        #IVA
        id_aliquota_iva = None
        if self.aliquota_iva is None:
            self.aliquota_iva_id = self.defaults['Aliquota iva']
            self.aliquota_iva = AliquotaIva().getRecord(id=self.aliquota_iva_id)
            id_aliquota_iva = self.aliquota_iva.id
        else:
            self._vats = AliquotaIva().select(batchSize=None)
            for v in self._vats:
                if self.aliquota_iva.lower() in (v.denominazione_breve.lower(),
                                                v.denominazione.lower()) or\
                            int(str(self.aliquota_iva).replace('%', '') or 20) == int(v.percentuale):
                    id_aliquota_iva = v.id
                    break
            if id_aliquota_iva is None:
                self.aliquota_iva = str(self.aliquota_iva).replace('%', '')
                daoAliquotaIva = AliquotaIva()
                daoAliquotaIva.denominazione = 'ALIQUOTA '+ self.aliquota_iva +'%'
                daoAliquotaIva.denominazione_breve = self.aliquota_iva + '%'
                daoAliquotaIva.id_tipo = 1
                daoAliquotaIva.percentuale = Decimal(self.aliquota_iva)
                daoAliquotaIva.persist()
                id_aliquota_iva = daoAliquotaIva.id
                self._vats.append(daoAliquotaIva)
        self.daoArticolo.id_aliquota_iva = id_aliquota_iva
        #UNITA BASE
        id_unita_base = None
        if  self.unita_base is None:
            self.unita_base_id = self.defaults['Unita base']
            #FIXME: promogest2 ----proviamo
            # La storedProcedure UnitaBaseGet NON esiste e la chiamta Dao
            #qui sotto fallisce con un errore!!!
            self.unita_base = UnitaBase().getRecord(id=self.unita_base_id)
            id_unita_base = self.unita_base_id
        else:
            unis = UnitaBase().select(batchSize=None)
            for u in unis:
                if self.unita_base.lower() in (u.denominazione.lower(),
                                            u.denominazione_breve.lower()):
                    id_unita_base = u.id
                    break
            if id_unita_base is None:
                self.unita_base = UnitaBase().select(denominazione='Pezzi',
                                                            batchSize=None)[0]
                id_unita_base = self.unita_base.id
        self.daoArticolo.id_unita_base = id_unita_base
        self.daoArticolo.produttore = self.produttore or ''
        self.daoArticolo.cancellato = False
        self.daoArticolo.sospeso = False
#        print "PTIMA DEL PERSIT", self.daoArticolo.__dict__
        self.daoArticolo.persist()
        product_id = self.daoArticolo.id

        #barcode
        if self.codice_barre_articolo is not None:
            self.codice_barre_articolo = str(self.codice_barre_articolo).strip()
            try:
                oldCodeBar= CodiceABarreArticolo().select(idArticolo=product_id)
                if oldCodeBar:
                    for codes in oldCodeBar:
                        codes.primario = False
                        codes.persist()
            except:
                pass
            barCode = CodiceABarreArticolo().\
                                select(codiceEM=self.codice_barre_articolo,
                                batchSize=None)
            if len(barCode) > 0:
                daoBarCode = CodiceABarreArticolo().getRecord(id=barCode[0].id)
                daoBarCode.id_articolo = product_id
                daoBarCode.primario = True
                daoBarCode.persist()
            else:
                daoBarCode = CodiceABarreArticolo()
                daoBarCode.id_articolo = product_id
                daoBarCode.codice = self.codice_barre_articolo
                daoBarCode.primario = True
                daoBarCode.persist()

        #price-list--> product
        decimalSymbol = self.PLModel._decimalSymbol
        if (self.prezzo_vendita_non_ivato is not None or \
            self.prezzo_acquisto_non_ivato is not None or \
            self.prezzo_acquisto_ivato is not None or \
            self.prezzo_vendita_ivato is not None):
            try:
                daoPriceListProduct = ListinoArticolo().\
                                    select(idListino=self.price_list_id,
                                            idArticolo=product_id,
                                            batchSize=None)[0]
            except:
                daoPriceListProduct = ListinoArticolo()
                daoPriceListProduct.id_articolo = product_id
                daoPriceListProduct.id_listino = self.price_list_id
                daoPriceListProduct.data_listino_articolo = self.dataListino
                daoPriceListProduct.listino_attuale = True

            if self.prezzo_vendita_ivato is not None:
                prezzo = self.sanitizer(self.prezzo_vendita_ivato)
                daoPriceListProduct.prezzo_dettaglio = mN(prezzo)
            else:
                daoPriceListProduct.prezzo_dettaglio = 0

            if self.prezzo_vendita_non_ivato is not None:
                prezzo = self.sanitizer(self.prezzo_vendita_non_ivato)
                daoPriceListProduct.prezzo_ingrosso = mN(prezzo)
            else:
                daoPriceListProduct.prezzo_ingrosso = 0

            sconti_ingrosso = [ScontoVenditaIngrosso(), ]
            sconti_dettaglio = [ScontoVenditaDettaglio(), ]

            if self.sconto_vendita_ingrosso is not None \
                and str(self.sconto_vendita_ingrosso).strip() != "0" \
                and str(self.sconto_vendita_ingrosso).strip() !="":
                self.sconto_vendita_ingrosso = self.sanitizer(self.sconto_vendita_ingrosso)
                sconti_ingrosso[0].valore = mN(self.sconto_vendita_ingrosso)
                sconti_ingrosso[0].tipo_sconto = 'percentuale'
                daoPriceListProduct.sconto_vendita_ingrosso = sconti_ingrosso
            if self.sconto_vendita_dettaglio and \
                str(self.sconto_vendita_dettaglio).strip() != "0" and \
                str(self.sconto_vendita_dettaglio).strip() !="":

                self.sconto_vendita_dettaglio = self.sanitizer(self.sconto_vendita_dettaglio)
                sconti_dettaglio[0].valore = mN(self.sconto_vendita_dettaglio)
                sconti_dettaglio[0].tipo_sconto = 'percentuale'
                daoPriceListProduct.sconto_vendita_dettaglio = sconti_dettaglio

            if self.prezzo_acquisto_non_ivato is not None and \
                str(self.prezzo_acquisto_non_ivato).strip() != "0" and \
                str(self.prezzo_acquisto_non_ivato).strip() !="":
                prezzo = self.sanitizer(self.prezzo_acquisto_non_ivato)

                daoPriceListProduct.ultimo_costo = mN(prezzo)
            elif self.prezzo_acquisto_ivato is not None and \
                    str(self.prezzo_acquisto_ivato).strip() != "0" and \
                    str(self.prezzo_acquisto_ivato).strip() !="":
                prezzo = self.sanitizer(self.prezzo_acquisto_ivato)
                self.aliquota_iva.percentuale = self.sanitizer(self.aliquota_iva.percentuale)
                daoPriceListProduct.ultimo_costo = mN(calcolaPrezzoIva(mN(prezzo), -1 * (mN(self.aliquota_iva.percentuale))))
            else:
                daoPriceListProduct.ultimo_costo = 0
#            print " QUSTNO NON VA BEEN ", daoPriceListProduct.__dict__
            daoPriceListProduct.persist()

        # Fornitura
        daoFornitura = Fornitura().select(idFornitore=self.fornitore,
                                                idArticolo=self.daoArticolo.id,
                                                daDataPrezzo=self.dataListino,
                                                aDataPrezzo=self.dataListino,
                                                batchSize=None)
        if len(daoFornitura) == 0:
            daoFornitura = Fornitura()
            daoFornitura.prezzo_netto = prezzo or 0
            daoFornitura.prezzo_lordo = prezzo or 0
            daoFornitura.id_fornitore = self.fornitore
            daoFornitura.id_articolo = self.daoArticolo.id
            try:
                daoFornitura.percentuale_iva = Decimal(str(self.aliquota_iva.percentuale))
            except:
                daoFornitura.percentuale_iva = Decimal(str(self.aliquota_iva))
            daoFornitura.data_prezzo = self.dataListino
            daoFornitura.codice_articolo_fornitore = self.codice_fornitore
            daoFornitura.fornitore_preferenziale = True
            daoFornitura.persist()
        self.product = None
Example #4
0
    print "\n\nDOCUMENTI MANCANTI                            ", num - docus.index(tt)
    # Cerco il movimento collegato al documento
    t = tt.TM[0]
    # ciclo nelle righe
    for riga in t.righe:
        # verifico che la riga abbia un id_articolo ed un fornitore (potrebbe non essere necessario)
        if t.id_fornitore and riga.id_articolo:
            fors = Fornitura().select(
                idArticolo=riga.id_articolo, idFornitore=t.id_fornitore, dataFornitura=t.data_movimento, batchSize=None
            )
            daoFornitura = None
            if fors:
                daoFornitura = fors[0]
                v = "vecchia"
            else:
                daoFornitura = Fornitura()
                v = "nuova"

                daoFornitura.id_fornitore = t.id_fornitore
                daoFornitura.id_articolo = riga.id_articolo
                daoFornitura.data_fornitura = t.data_movimento
                if "_RigaMovimento__codiceArticoloFornitore" in riga.__dict__:
                    daoFornitura.codice_articolo_fornitore = riga.__dict__["_RigaMovimento__codiceArticoloFornitore"]
                daoFornitura.prezzo_lordo = riga.valore_unitario_lordo
                daoFornitura.prezzo_netto = riga.valore_unitario_netto
                daoFornitura.percentuale_iva = riga.percentuale_iva
                daoFornitura.applicazione_sconti = riga.applicazione_sconti
                sconti = []
                for s in riga.sconti:
                    daoSconto = ScontoFornitura()
                    daoSconto.id_fornitura = daoFornitura.id
Example #5
0
 def setDao(self, dao):
     self.dao = dao
     if dao is None:
         self.dao = Fornitura()
     self._refresh()
     return self.dao
Example #6
0
class AnagraficaFornitureEdit(AnagraficaEdit):
    """ Modifica un record dell'anagrafica delle forniture """

    def __init__(self, anagrafica):
        AnagraficaEdit.__init__(self,
            anagrafica,
            'Dati fornitura',
            root='anagrafica_forniture_detail_table',
            path='_anagrafica_fornitura_articoli_elements.glade')
        self._widgetFirstFocus = self.codice_articolo_fornitore_entry
        self._percentualeIva = 0
        self.taglia_colore_table.hide()
        self.taglia_colore_table.set_no_show_all(True)
        self.number_format = '%-14.'+ str(setconf("Numbers", "decimals")) +'f'

    def draw(self,cplx=False):
        #self.id_articolo_customcombobox.setSingleValue()
        #self.id_articolo_customcombobox.setOnChangedCall(self.on_id_articolo_customcombobox_changed)
        #self.id_fornitore_customcombobox.setSingleValue()

        self.sconti_widget.button.connect('toggled',
                                        self.on_sconti_widget_button_toggled)

        if self._anagrafica._articoloFissato:
            self.id_articolo_customcombobox.setId(self._anagrafica._idArticolo)
            self.id_articolo_customcombobox.set_sensitive(False)
            res = self.id_articolo_customcombobox.getData()
            self.descrizione_breve_aliquota_iva_label.set_text(res["denominazioneBreveAliquotaIva"])
            self._percentualeIva = res["percentualeAliquotaIva"]
            self.percentuale_aliquota_iva_label.set_text(str(mN(self._percentualeIva,0)) + ' %')
        if self._anagrafica._fornitoreFissato:
            self.id_fornitore_customcombobox.setId(self._anagrafica._idFornitore)
            self.id_fornitore_customcombobox.set_sensitive(False)

        #fillComboboxMultipli(self.id_multiplo_customcombobox.combobox, self.id_articolo_customcombobox.getId())
        #self.id_multiplo_customcombobox.connect('clicked',
                                                #self.on_id_multiplo_customcombobox_button_clicked)

        self.prezzo_lordo_entry.connect('focus_out_event', self._calcolaPrezzoNetto)


    def on_id_multiplo_customcombobox_button_clicked(self, widget, button):
        on_id_multiplo_customcombobox_clicked(widget, button, self.id_articolo_customcombobox.getId())


    def on_id_articolo_customcombobox_changed(self):
        res = self.id_articolo_customcombobox.getData()
        if res:
            self.descrizione_breve_aliquota_iva_label.set_text(res["denominazioneBreveAliquotaIva"])
            self._percentualeIva = res["percentualeAliquotaIva"]
            self.percentuale_aliquota_iva_label.set_text('%5.2f' % self._percentualeIva + ' %')
            #fillComboboxMultipli(self.id_multiplo_customcombobox.combobox, self.id_articolo_customcombobox.getId())
            if posso("PW"):
                self._refreshTagliaColore(res["id"])

    def setDao(self, dao):
        self.dao = dao
        if dao is None:
            self.dao = Fornitura()
        self._refresh()
        return self.dao

    def _refresh(self):
        self.clear()
        #self.id_articolo_customcombobox.refresh(clear=True, filter=False)
        self.id_articolo_customcombobox.set_sensitive(True)
        if self.dao.id_articolo is None:
            if self._anagrafica._articoloFissato:
                self.dao.id_articolo = self._anagrafica._idArticolo
                self.id_articolo_customcombobox.set_sensitive(False)
        else:
            self.id_articolo_customcombobox.set_sensitive(False)
        self.id_articolo_customcombobox.setId(self.dao.id_articolo)
        res = self.id_articolo_customcombobox.getData()
        self.descrizione_breve_aliquota_iva_label.set_text(res["denominazioneBreveAliquotaIva"])
        self._percentualeIva = res["percentualeAliquotaIva"]
        self.percentuale_aliquota_iva_label.set_text('%5.2f' % self._percentualeIva + ' %')
        #self.id_fornitore_customcombobox.refresh(clear=True, filter=False)
        self.id_fornitore_customcombobox.set_sensitive(True)
        if self.dao.id_fornitore is None:
            if self._anagrafica._fornitoreFissato:
                self.dao.id_fornitore = self._anagrafica._idFornitore
                self.id_fornitore_customcombobox.set_sensitive(False)
        else:
            self.id_fornitore_customcombobox.set_sensitive(False)
        self.id_fornitore_customcombobox.setId(self.dao.id_fornitore)
        self.codice_articolo_fornitore_entry.set_text(self.dao.codice_articolo_fornitore or '')
        self.prezzo_lordo_entry.set_text(self.number_format % float(self.dao.prezzo_lordo or 0))
        self.prezzo_netto_label.set_text(self.number_format % float(self.dao.prezzo_netto or 0))
        self.scorta_minima_entry.set_text('%-6d' % int(self.dao.scorta_minima or 0))
        self.tempo_arrivo_merce_entry.set_text('%-6d' % float(self.dao.tempo_arrivo_merce or 0))
        self.fornitore_preferenziale_checkbutton.set_active(self.dao.fornitore_preferenziale or False)
        self.data_fornitura_entry.set_text(dateToString(self.dao.data_fornitura))
        self.data_prezzo_entry.set_text(dateToString(self.dao.data_prezzo))

        self.lotto_entry.set_text(self.dao.numero_lotto or '')
        #fillComboboxMultipli(self.id_multiplo_customcombobox.combobox, self.id_articolo_customcombobox.getId())
        #findComboboxRowFromId(self.id_multiplo_customcombobox.combobox,
                              #self.dao.id_multiplo)
        self.sconti_widget.setValues(self.dao.sconti, self.dao.applicazione_sconti)
        self._calcolaPrezzoNetto()
        if posso("PW"):
            self._refreshTagliaColore(self.dao.id_articolo)

    def _refreshTagliaColore(self, idArticolo):
        articoloTagliaColore = Articolo().getRecord(id=idArticolo)
        self.taglia_colore_table.hide()
        if articoloTagliaColore is not None:
            gruppoTaglia = articoloTagliaColore.denominazione_gruppo_taglia or ''
            taglia = articoloTagliaColore.denominazione_taglia or ''
            colore = articoloTagliaColore.denominazione_colore or ''
            anno = articoloTagliaColore.anno or ''
            stagione = articoloTagliaColore.stagione or ''
            genere = articoloTagliaColore.genere or ''
            self.taglia_label.set_markup('<span weight="bold">%s (%s)  %s</span>'
                                         % (taglia, gruppoTaglia, genere))
            self.colore_label.set_markup('<span weight="bold">%s</span>'
                                         % (colore))
            self.stagione_label.set_markup('<span weight="bold">%s  %s</span>'
                                           % (stagione, anno))
            self.taglia_colore_table.show()


    def _calcolaPrezzoNetto(self, widget = None, event = None):
        self.prezzo_netto_label.set_text('')
        if self.prezzo_lordo_entry.get_text() == '':
            self.prezzo_lordo_entry.set_text(self.number_format % float(0))
        prezzoLordo = prezzoNetto = float(self.prezzo_lordo_entry.get_text())
        sconti = self.sconti_widget.getSconti()
        applicazione = self.sconti_widget.getApplicazione()
        for s in sconti:
            if s["tipo"] == 'percentuale':
                if applicazione == 'scalare':
                    prezzoNetto = prezzoNetto * (1 - float(s["valore"]) / 100)
                elif applicazione == 'non scalare':
                    prezzoNetto = prezzoNetto - prezzoLordo * float(s["valore"]) / 100
            elif s["tipo"] == 'valore':
                prezzoNetto = prezzoNetto - float(s["valore"])
        self.prezzo_netto_label.set_text(self.number_format % float(prezzoNetto or 0))

    def clear(self):
        ####################self.id_articolo_customcombobox.refresh(clear=True, filter=False)
        ####################self.id_fornitore_customcombobox.refresh(clear=True, filter=False)
        self.data_prezzo_entry.set_text('')
        self.data_fornitura_entry.set_text('')
        self.codice_articolo_fornitore_entry.set_text('')
        self.prezzo_lordo_entry.set_text('')
        self.prezzo_netto_label.set_text('')
        self.scorta_minima_entry.set_text('')
        self.tempo_arrivo_merce_entry.set_text('')
        self.fornitore_preferenziale_checkbutton.set_active(False)
        self.lotto_entry.set_text('')

    def saveDao(self, tipo=None):
        if self.id_articolo_customcombobox.getId() is None:
            obligatoryField(self.dialogTopLevel, self.id_articolo_customcombobox)

        if self.id_fornitore_customcombobox.getId() is None:
            obligatoryField(self.dialogTopLevel, self.id_fornitore_customcombobox)

        if (self.prezzo_lordo_entry.get_text() == ''):
            obligatoryField(self.dialogTopLevel, self.prezzo_lordo_entry)

        if (self.prezzo_netto_label.get_text() == ''):
            obligatoryField(self.dialogTopLevel, self.prezzo_netto_label)

        self.dao.id_articolo = self.id_articolo_customcombobox.getId()
        self.dao.id_fornitore = self.id_fornitore_customcombobox.getId()
        self.dao.data_prezzo = stringToDate(self.data_prezzo_entry.get_text())
        self.dao.data_fornitura = stringToDate(self.data_fornitura_entry.get_text())
        self.dao.codice_articolo_fornitore = self.codice_articolo_fornitore_entry.get_text()
        #self.dao.id_multiplo = findIdFromCombobox(self.id_multiplo_customcombobox.combobox)
        self.dao.prezzo_lordo = float(self.prezzo_lordo_entry.get_text())
        self.dao.prezzo_netto = float(self.prezzo_netto_label.get_text())
        self.dao.scorta_minima = int(self.scorta_minima_entry.get_text() or 1)
        self.dao.tempo_arrivo_merce = int(self.tempo_arrivo_merce_entry.get_text() or 1)
        self.dao.fornitore_preferenziale = self.fornitore_preferenziale_checkbutton.get_active()
        self.dao.percentuale_iva = float(self._percentualeIva)
        self.dao.numero_lotto = self.lotto_entry.get_text()

        sconti = []
        self.dao.applicazione_sconti = self.sconti_widget.getApplicazione()
        for s in self.sconti_widget.getSconti():
            daoSconto = ScontoFornitura()
            daoSconto.id_fornitura = self.dao.id
            daoSconto.valore = s["valore"]
            daoSconto.tipo_sconto = s["tipo"]
            sconti.append(daoSconto)
        self.dao.sconti = sconti
        self.dao.persist()


    def on_sconti_widget_button_toggled(self, button):
        if not button.get_property('active'):
            self._calcolaPrezzoNetto()
def ricerca_forniture_lotti(fornitore, daData, aData, progress=None):
    data = {}

    if not fornitore:
        return None

    forniture = Fornitura().select(idFornitore=fornitore.id,
        daDataFornitura=daData,
        aDataFornitura=aData,
        batchSize=None)

    tot_a = 0
    tot_v = 0
    totale_qta_acq = 0
    totale_qta_ven = 0
    for fornitura in forniture:

        righe_mf = RigaMovimentoFornitura().select(idFornitura=fornitura.id)

        mov_acq = [riga_mf.rigamovacq for riga_mf in righe_mf if riga_mf.rigamovacq]

        for riga_mov in mov_acq:
            if not riga_mov:
                continue
            id_articolo = riga_mov.rig.id_articolo
            if str(id_articolo) not in data:
                data[str(id_articolo)] = {'QTAACQ': riga_mov.rig.quantita * riga_mov.rig.moltiplicatore,
                                         'TOTACQ': riga_mov.totaleRiga,
                                         'DAO_ART': riga_mov.rig.arti,
                                         'DAO_RIGAMOV': riga_mov,
                                         'QTAVEN': 0, 'TOTVEN': 0}
            else:
                data[str(id_articolo)]['QTAACQ'] += riga_mov.rig.quantita * riga_mov.rig.moltiplicatore
                data[str(id_articolo)]['TOTACQ'] += riga_mov.totaleRiga
            tot_a += riga_mov.totaleRiga
            totale_qta_acq += riga_mov.rig.quantita * riga_mov.rig.moltiplicatore

        mov_ven = [riga_mf.rigamovven for riga_mf in righe_mf if riga_mf.rigamovven]

        for riga_mov in mov_ven:
            if not riga_mov:
                continue
            id_articolo = riga_mov.rig.id_articolo
            if str(id_articolo) not in data:
                data[str(id_articolo)] = {'QTAVEN': riga_mov.rig.quantita * riga_mov.rig.moltiplicatore,
                                         'TOTVEN': riga_mov.totaleRiga,
                                         'DAO_ART': riga_mov.rig.arti,
                                         'DAO_RIGAMOV': riga_mov,
                                         'QTAACQ': 0, 'TOTACQ': 0}
            else:
                data[str(id_articolo)]['QTAVEN'] += riga_mov.rig.quantita * riga_mov.rig.moltiplicatore
                data[str(id_articolo)]['TOTVEN'] += riga_mov.totaleRiga
            tot_v += riga_mov.totaleRiga
            totale_qta_ven += riga_mov.rig.quantita * riga_mov.rig.moltiplicatore

        if progress:
            from promogest.lib.utils import pbar
            pbar(progress, parziale=forniture.index(fornitura), totale=len(forniture),
                text="Attendere...", noeta=True)

    return data, {'totale_qta_acq': totale_qta_acq,
            'totale_qta_ven': totale_qta_ven,
            'totale_ven': tot_v,
            'totale_acq': tot_a}