Esempio n. 1
0
def do_genera_fatture_provvigioni(tipo_data, data_da, data_a, data_doc, progress=None):
    '''
    '''

    # definisco gli articoli da escludere
    articoli_esclusi = r"(.*)(sacchi|trasporto|contributo energetico|riempimento|commissioni|cappucci|europalette|big bag|commissione quantit)(.*)"

    documenti = []

    if tipo_data == TIPO_DATA_DOC:
        documenti = TestataDocumento().select(complexFilter=(and_(TestataDocumento.operazione=='DDT vendita diretto',
                TestataDocumento.data_documento.between(data_da, data_a))),
            batchSize=None,
            orderBy=TestataDocumento.id_fornitore)
    if tipo_data == TIPO_DATA_SPED:
        documenti = TestataDocumento().select(complexFilter=(and_(TestataDocumento.operazione=='DDT vendita diretto',
                TestataDocumento.fine_trasporto.between(data_da, data_a))),
            batchSize=None,
            orderBy=TestataDocumento.id_fornitore)

    if not documenti:
        messageInfo(msg="Non sono stati trovati documenti utili a completare l'operazione.")
    else:
        forn_totaledoc_dict = {}
        forn_provv_file = file(os.path.join(tempDir, 'riepilogo_provv.csv'), 'w')
        forn_provv_file.write('docNum;fornitore;cliente;articolo;totaleRiga;qta;tipo_provv;valore_provv;provv_articolo\n')
        for doc in documenti:
            if progress:
                pbar(progress, parziale=documenti.index(doc), totale=len(documenti), text="Elaborazione documenti...", noeta=False)
            totaleProvvDoc = Decimal(0)
            for riga in doc.righe:
                if riga.id_articolo is None or leggiArticolo(riga.id_articolo)['denominazione'] == '':
                    continue
                if re.match(articoli_esclusi, leggiArticolo(riga.id_articolo)['denominazione'], flags=re.IGNORECASE):
                    continue
                if Decimal(riga.totaleRiga) == Decimal(0) or Decimal(riga.quantita) == Decimal(0):
                    continue
                p = ProvvPgAzArt().select(id_persona_giuridica_to=doc.id_fornitore,
                                          id_persona_giuridica_from=doc.id_cliente,
                                          id_articolo=riga.id_articolo, batchSize=None)
                if p:
                    if p[0].provv.tipo_provv == "%":
                        provv_row = riga.totaleRiga * p[0].provv.valore_provv / 100
                    else:
                        provv_row = riga.quantita * p[0].provv.valore_provv
                    forn_provv_file.write("%s;%s;%s;%s;%s;%s;%s;%s;%s\n" % (doc.numero,
                        leggiFornitore(doc.id_fornitore)['ragioneSociale'],
                        leggiCliente(doc.id_cliente)['ragioneSociale'],
                        leggiArticolo(riga.id_articolo)['denominazione'],
                        mN(riga.totaleRiga, 2),
                        riga.quantita,
                        p[0].provv.tipo_provv,
                        mN(p[0].provv.valore_provv, 2),
                        mN(provv_row, 2)))
                    if doc.id_fornitore not in forn_totaledoc_dict:
                        forn_totaledoc_dict[doc.id_fornitore] = provv_row
                    else:
                        forn_totaledoc_dict[doc.id_fornitore] += provv_row
                else:
                    q = ProvvPgAzArt().select(id_persona_giuridica_to=doc.id_fornitore,
                                              id_persona_giuridica_from=doc.id_cliente,
                                              id_articolo=None, batchSize=None)
                    if q:
                        if q[0].provv.tipo_provv == "%":
                            provv_row = riga.totaleRiga * q[0].provv.valore_provv / 100
                        else:
                            provv_row = riga.quantita * q[0].provv.valore_provv
                        forn_provv_file.write("%s;%s;%s;%s;%s;%s;%s;%s;%s\n" % (doc.numero,
                            leggiFornitore(doc.id_fornitore)['ragioneSociale'],
                            leggiCliente(doc.id_cliente)['ragioneSociale'],
                            leggiArticolo(riga.id_articolo)['denominazione'],
                            mN(riga.totaleRiga, 2),
                            riga.quantita,
                            q[0].provv.tipo_provv,
                            mN(q[0].provv.valore_provv, 2),
                            mN(provv_row, 2)))
                        if doc.id_fornitore not in forn_totaledoc_dict:
                            forn_totaledoc_dict[doc.id_fornitore] = provv_row
                        else:
                            forn_totaledoc_dict[doc.id_fornitore] += provv_row

        forn_provv_file.close()

        operazione = "Fattura vendita"

        DESCR_RIGA = """Come convenuto Vi addebitiamo per nostre provvigioni su Vostre
forniture effettuate nel mese di %s l'importo di



FUORI CAMPO IVA ARTICOLO 7 ter D.P.R. 633/72""" % data_da.strftime('%B %Y')

        i = 0
        flag = False
        for k in forn_totaledoc_dict:

            if pbar:
                pbar(progress, parziale=i, totale=len(forn_totaledoc_dict), text="Creazione fatture...", noeta=False)

            forn = Fornitore().getRecord(id=k)
            if forn.ragione_sociale:
                cli = Cliente().select(ragioneSociale=forn.ragione_sociale, batchSize=None)

            if not cli and forn.cognome and forn.nome:
                cli = Cliente().select(cognomeNome=forn.cognome + ' ' + forn.nome, batchSize=None)

            if not cli:
                flag = True
                continue

            td = TestataDocumento()
            td.data_documento = data_doc
            td.operazione = operazione
            td.id_cliente = cli[0].id
            daoRiga = RigaDocumento()
            daoRiga.posizione = 0
            daoRiga.descrizione = DESCR_RIGA
            daoRiga.quantita = 1.0
            daoRiga.percentuale_iva = 0
            daoRiga.valore_unitario_lordo = forn_totaledoc_dict[k]
            daoRiga.moltiplicatore = 1
            daoRiga.valore_unitario_netto = forn_totaledoc_dict[k]
            daoRiga.scontiRigaDocumento = []
            td.righeDocumento = [daoRiga]
            td.persist()

            i += 1

        if progress:
            pbar(progress, stop=True)
        if flag:
            messageWarning(msg="Non è stato possibile creare alcune fatture!")
        messageInfo(msg="Operazione completata, sono state create %d nuove fatture." % i)
    def on_importa_json_button_clicked(self, button):
        a = """{"data":"2013-11-18 17:54:52",
        "promogest_id":590,
        "utente":"RUDOLF DISTRIBUZIONE CAGLIARI",
        "email":"*****@*****.**",
         "prodotti":{"RUDSYLVIASan4645":{"qty":"5","price":"7.50"},
         "RUDSYLVIASan81045":{"qty":"5","price":"7.50"},
         "RUDSYLVIASan121445":{"qty":"5","price":"7.50"},
         "RUDPAQUITABLO8-1045":{"qty":"3","price":"9.50"}}
         }"""
        text_buffer = self.importa_json_textview.get_buffer()
        note = text_buffer.get_text(text_buffer.get_start_iter(),
                                            text_buffer.get_end_iter(), True)
        print "NOTE", note
        try:
            dati = json.JSONDecoder(object_pairs_hook=OrderedDict).decode(note)
        except:
            print "ERRORE DATI DELLA TEXTVIEW NON JSON"
            messageError("ERRORE DATI NELLA TEXTVIEW NON JSON")
            return
        print type(dati["prodotti"]), dati["utente"]
        #data_ordine = dati["data"] # datetime.datetime.now()'Jun 1 2005  1:33PM'
        data_ordine = datetime.strptime(dati["data"], '%Y-%m-%d %H:%M:%S')
        daoCliente = Cliente().getRecord(id=int(dati["promogest_id"]))

        pricelist = Listino().select(id=daoCliente.id_listino)
        newDao = TestataDocumento()
        newDao.data_documento = data_ordine
        newDao.data_inserimento = data_ordine
        newDao.operazione = "Ordine da cliente"
        newDao.id_cliente = daoCliente.id
        newDao.id_fornitore = None
        if daoCliente.dm:
            newDao.id_destinazione_merce = daoCliente.dm[0].id
        else:
            newDao.id_destinazione_merce = None
        #if tipoPagamento != "checked": #contrassegno
            #newDao.id_pagamento = 4
        #else:
            #newDao.id_pagamento = 5
        newDao.id_banca = None
        newDao.id_aliquota_iva_esenzione = None
        newDao.protocollo = ""
        newDao.causale_trasporto = ""
        newDao.aspetto_esteriore_beni = ""
        newDao.inizio_trasporto = None
        newDao.fine_trasporto = None
        newDao.id_vettore = None
        newDao.incaricato_trasporto = None
        newDao.totale_colli = None
        newDao.totale_peso = None
        newDao.note_interne = "Ordine da WEB"
        newDao.note_pie_pagina = ""
        newDao.applicazione_sconti = "scalare"
        righeDocumento=[]
        totale = 0
        #print " LORO ORDINE", OrderedDict(dati["prodotti"]).items()
        for k,v in OrderedDict(dati["prodotti"]).items():
            #print " ERRREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", k,v,int(dati["prodotti"].items().index((k,v)))+1
            quantita = int(v["qty"])
            prezzo = float(v["price"])
            art = Articolo().select(codiceEM=k)
            if art:
                idArticolo = art[0].id
            else:
                raise "non trovo l'articolo nel db"
            #prezzo = leggiListino(pricelist[0].id, idArticolo, tiny=True)["prezzoIngrosso"]
            articolo = leggiArticolo(idArticolo)
            daoRiga = RigaDocumento()
            daoRiga.id_testata_documento = newDao.id
            daoRiga.id_articolo = idArticolo
            daoRiga.id_magazzino = 3
            daoRiga.descrizione = articolo["denominazione"]
            daoRiga.id_iva = articolo["idAliquotaIva"]
            daoRiga.id_listino = pricelist[0].id
            daoRiga.valore_unitario_lordo = prezzo
            daoRiga.valore_unitario_netto = prezzo
            daoRiga.percentuale_iva = articolo["percentualeAliquotaIva"]
            daoRiga.applicazione_sconti = []
            daoRiga.quantita = quantita
            daoRiga.id_multiplo = None
            daoRiga.moltiplicatore = 1
            daoRiga.posizione =  int(dati["prodotti"].items().index((k,v)))+1
            daoRiga.scontiRigaDocumento = []
            righeDocumento.append(daoRiga)
            parziale = float(quantita) * float(leggiListino(pricelist[0].id, idArticolo, tiny=True)["prezzoDettaglio"])
            totale += parziale
        newDao.righeDocumento = righeDocumento
        newDao.totale_pagato = None
        newDao.totale_sospeso = None
        newDao.documento_saldato = False
        newDao.id_primo_riferimento = None
        newDao.id_secondo_riferimento = None
        tipo = "Ordine da cliente"
        valori = numeroRegistroGet(tipo=tipo, date=data_ordine)
        newDao.numero = valori[0]
        newDao.registro_numerazione= valori[1]
        if len(righeDocumento) > 0:
            newDao.persist()
            messageInfo(msg="ORDINE INSERITO")
            self.destroy()