def fixRigaMovimentoTable(pbar_wid=None):

    a = SetConf().select(key="fix_riga_movimento", section="General")
    if a and a[0].value =="False":
        rmfall = session.query(RigaMovimentoFornitura.id_articolo, RigaMovimentoFornitura.id_fornitura, RigaMovimentoFornitura.id_riga_movimento_acquisto).distinct().all()
        #print "RMFALL", rmfall
        num = len(rmfall)
        for riga in rmfall:
            if pbar:
                pbar(pbar_wid,parziale=rmfall.index(riga), totale=num, text="MIGRAZIONE TABELLA LOTTI ACQUISTO", noeta=False)
            #print "riga", riga
            print "RESIDUI DA GESTIRE ACQ", num - rmfall.index(riga)
            rmf = RigaMovimentoFornitura().select(idArticolo=riga[0], idRigaMovimentoAcquisto=riga[2], idFornitura=riga[1], batchSize=None)
            if rmf:
                for r in rmf:
                    if r.id_riga_movimento_vendita:
                        a = RigaMovimentoFornitura()
                        a.id_articolo = r.id_articolo
                        a.id_riga_movimento_vendita = r.id_riga_movimento_vendita
                        a.id_fornitura = r.id_fornitura
                        session.add(a)
                    if rmf.index(r) == 0:
                        a = RigaMovimentoFornitura()
                        a.id_articolo = r.id_articolo
                        a.id_riga_movimento_acquisto = r.id_riga_movimento_acquisto
                        a.id_fornitura = r.id_fornitura
                        session.add(a)
                    session.delete(r)
                        #session.add(r)
        session.commit()
        print " FINITO ACQ"
        rmfall2 = session.query(RigaMovimentoFornitura.id_riga_movimento_vendita).distinct().all()
        #print rmfall2
        num2 = len(rmfall2)
        for riga2 in rmfall2:
            if pbar_wid:
                pbar(pbar_wid,parziale=rmfall2.index(riga2), totale=num2, text="MIGRAZIONE TABELLA LOTTI VENDITA", noeta=False)
            print "RESIDUI DA GESTIRE VEN", num2 - rmfall2.index(riga2)
            if riga2[0] is not None:
                rmf2 = RigaMovimentoFornitura().select(idRigaMovimentoVendita=riga2[0], batchSize=None)
                #print "RMFFFFFFFFFFFFFFFFFFF", rmf2
                for ff in rmf2[1:]:
                    if ff.id_riga_movimento_acquisto is None:
                        session.delete(ff)
                session.commit()
        if pbar_wid:
            pbar(pbar_wid,stop=True)
        c = SetConf().select(key="fix_riga_movimento", section="General")
        c[0].value = str(True)
        session.add(c[0])
        session.commit()
        if pbar_wid:
            pbar_wid.set_property("visible",False)
        print "FATTO IL FIX"
    else:
        print "NIENTE DA FIXARE"
Exemple #2
0
def add_relazione(padre_id, figlio_id):
    '''
    Aggiunge una relazione tra due documenti nello storico
    :param padre_id: ID del documento padre
    :param figlio_id: ID del documento figlio
    :return: None
    '''
    storico = None
    try:
        storico = session.query(StoricoDocumento).filter(and_(StoricoDocumento.padre==padre_id, StoricoDocumento.figlio==None)).one()
    except NoResultFound:
        pass
    # relazione documento da duplicare e duplicato: padre -> figlio
    if not storico:
        storico = StoricoDocumento()
        storico.padre = padre_id
        storico.data_creazione = datetime.date.today()
    storico.figlio = figlio_id
    storico.ultima_modifica = datetime.date.today()
    storico.persist()
    # relazione sul nuovo documento: padre -> nessuno figlio
    storico2 = StoricoDocumento()
    storico2.padre = figlio_id
    storico2.figlio = None
    storico2.data_creazione = datetime.date.today()
    storico2.ultima_modifica = datetime.date.today()
    storico2.persist()
Exemple #3
0
def getNuovoCodiceCliente():
    """
    Restituisce il codice progressivo per un nuovo cliente
    """

    lunghezzaCodice = 10
    prefissoCodice = 'CL'
    codice = ''
    listacodici= []
    try:
        n = 1
        clienti = session.query(Cliente.codice).order_by(desc(Cliente.id)).all()
        for q in clienti:
            codice = codeIncrement(q[0])
            if not codice or (codice,) in clienti:
                continue
            else:
                if (codice,) not in clienti:
                    return codice

    except:
        pass
    try:
        if not codice:
            from promogest.lib.utils import setconf
            dd = setconf("Clienti", "cliente_struttura_codice")
            codice = codeIncrement(dd)
    except Exception:
        pass
    return codice
Exemple #4
0
def getNuovoCodiceFornitore():
    """ Restituisce il codice progressivo per un nuovo fornitore """

    lunghezzaCodice = 8
    prefissoCodice = 'FO'
    codice = ''
    listacodici = []
    try:
        fornitori = session.query(Fornitore.codice).order_by(desc(Fornitore.id)).all()
        for q in fornitori:
            codice = codeIncrement(q[0])
            if not codice or (codice,) in fornitori:
                continue
            else:
                if (codice,) not in fornitori:
                    return codice

    except:
        pass
    try:
        if not codice:
            if hasattr(conf,"Fornitori") and hasattr(conf.Fornitori,"struttura_codice"):
                dd = conf.Fornitori.struttura_codice
            else:
                dd = "FO0000"
            codice = codeIncrement(dd)
    except:
        pass
    return codice
Exemple #5
0
def rimuovi_da_storico(doc_id):
    '''
    Rimuove il documento dallo storico
    :param doc_id: ID del documento che si vuole rimuovere dallo storico
    :return: None
    '''
    if doc_id:
        try:
            obj = session.query(StoricoDocumento).filter(and_(StoricoDocumento.padre==doc_id, StoricoDocumento.figlio==None)).one()
            session.delete(obj)
        except NoResultFound:
            pass
        try:
            obj = session.query(StoricoDocumento).filter(StoricoDocumento.figlio==doc_id).one()
            session.delete(obj)
        except NoResultFound:
            pass
Exemple #6
0
def get_figli(doc_id):
    '''
    Ritorna tutti i documenti figli del documento fornito
    :param doc_id: ID del documento di cui si vogliono conoscere i figli
    :return: i documenti figli
    '''
    if doc_id:
        objs = session.query(StoricoDocumento).filter(StoricoDocumento.padre==doc_id).all()
        docs = []
        for obj in objs:
            docs.append(TestataDocumento().getRecord(obj.figlio))
        return docs
Exemple #7
0
def get_padre(doc_id):
    '''
    Ritorna il documento padre del documento fornito
    :param doc_id: ID del documento di cui si vuole conoscere il padre
    :return: il padre del documento
    '''
    if doc_id:
        try:
            obj = session.query(StoricoDocumento).filter(StoricoDocumento.figlio==doc_id).one()
            return TestataDocumento().getRecord(id=obj.padre)
        except NoResultFound:
            return
def modifica_relazione(padre_id, stato=None, tipo=None):
    storico = None
    try:
        storico = session.query(StoricoDocumento).filter(StoricoDocumento.padre == padre_id).one()
    except NoResultFound:
        return
    if stato:
        storico.stato = stato
        if stato == CHIUSO:
            storico.data_chiusura = datetime.date.today()
        elif stato == APERTO:
            storico.ultima_modifica = datetime.date.today()
 def test_doc7(self):
     """controllo totali per il documento 23672 my db"""
     doc = session.query(TestataDocumento).filter_by(operazione="DDT vendita",
                                                     id=23672).one()
     doc.totali
     assert doc._totaleImponibile == Decimal('59.36')
     assert doc._totaleImposta == Decimal('4.57')
     assert doc._totaleScontato == Decimal('63.93')
     for info_iva in doc._castellettoIva:
         if info_iva['aliquota'] == Decimal(4):
             assert info_iva['imponibile'] == Decimal("22.80")
             assert info_iva['imposta'] == Decimal("0.91")
             assert info_iva['totale'] == Decimal("23.71")
         if info_iva['aliquota'] == Decimal(10):
             assert info_iva['imponibile'] == Decimal("36.56")
             assert info_iva['imposta'] == Decimal("3.66")
             assert info_iva['totale'] == Decimal("40.22")
def chiusura_ordini(progress=None):
    da_data = datetime.date(int(workingYear), 1, 1)
    ordini = session.query(TestataDocumento).filter(TestataDocumento.data_documento >= da_data,
                                                    TestataDocumento.operazione == 'Ordine da cliente',
                                                    TestataDocumento.documento_saldato == False).all()

    for doc in ordini:
        if controlla_quantita(doc):
            # controllo delle quantità tra ordine e DDT
            # quelle del DDT >= or < qta +3 quelle dell'ordine
            doc.totale_pagato = doc.totale_sospeso
            doc.totale_sospeso = 0
            doc.documento_saldato = True
            session.commit()
            self.filter.refresh()
        if progress:
            pbar(progress, parziale=ordini.index(doc), totale=len(ordini), text="Attendere...", noeta=True)

    if progress:
        pbar(progress, stop=True)
def ricerca_movimenti_spedizione(da_data, al_data, progress=None):
    tipi_ddt_figlio = ['DDT vendita', 'DDT vendita diretta']
    # Tutti i documenti (ordini) non saldati dall'inizio dell'anno
    ordini = session.query(TestataDocumento).filter(TestataDocumento.data_documento >= da_data,
                                                    TestataDocumento.operazione == 'Ordine da cliente',
                                                    TestataDocumento.documento_saldato == False).all()
    res = []

    for ordine in ordini:
        if progress:
            pbar(progress, parziale=ordini.index(ordine), totale=len(ordini),
                text="Attendere...", noeta=True)
        # ottengo tutti i figli di questo ordine
        figli = get_figli(ordine.id)
        for figlio in figli:
            if figlio.operazione in tipi_ddt_figlio:
                figlio._padre = get_padre(figlio.id)
                res.append(figlio)

    if progress:
        pbar(progress, stop=True)

    return res
Exemple #12
0
        if not codice:
            if hasattr(conf,"Fornitori") and hasattr(conf.Fornitori,"struttura_codice"):
                dd = conf.Fornitori.struttura_codice
            else:
                dd = "FO0000"
            codice = codeIncrement(dd)
    except:
        pass
    return codice

std_mapper = mapper(Fornitore, join(t_fornitore, t_persona_giuridica),
    properties={
        'id': [t_fornitore.c.id, t_persona_giuridica.c.id],
        "categoria_fornitore": relation(CategoriaFornitore, backref="fornitore")
    },
    order_by=t_fornitore.c.id)

if tipodb=="sqlite":
    from promogest.dao.Pagamento import Pagamento
    a = session.query(Pagamento.id).all()
    b = session.query(Fornitore.id_pagamento).all()
    fixit =  list(set(b)-set(a))
    print "fixt-fornitore", fixit
    for f in fixit:
        if f[0] != "None" and f[0] != None:
            aa = Fornitore().select(idPagamento=f[0], batchSize=None)
            for a in aa:
                a.id_pagamento = None
                session.add(a)
            session.commit()
Exemple #13
0
def do_send_mail(daos, anag=None, formato='pdf'):
    if anag:
        anag.pbar_anag_complessa.show()
    # recupera informazioni account posta elettronica
    try:
        account_email = session.query(AccountEmail).filter_by(id_azienda=azienda, preferito=True).one()
    except:  # NoResultFound
        raise NoAccountEmailFound("Nessun account email configurato")

    password = ''
    if keyring:
        password = keyring.get_password('promogest2', account_email.username)
    else:
        from promogest.lib.utils import inputPasswordDialog

        password = inputPasswordDialog()

    s = None
    if account_email.cripto_SSL:
        try:
            s = smtplib.SMTP_SSL(account_email.server_smtp, port=account_email.porta_smtp)
            time.sleep(1)
            s.login(account_email.username, password or '')
        except:
            raise NetworkError('Errore di connessione al server di posta in uscita.')
    else:
        try:
            s = smtplib.SMTP(account_email.server_smtp)
            time.sleep(1)
            s.starttls()
            time.sleep(1)
            s.login(account_email.username, password or '')
        except:
            raise NetworkError('Errore di connessione al server di posta in uscita.')
    del password

    progressivo = 1
    for dao in daos:
        if not dao.id_cliente:
            continue

        # recupera email destinatario
        destinatario = dao.CLI.email_pec or dao.CLI.email_principale
        if not destinatario:
            continue

        if anag:
            utils.pbar(anag.pbar_anag_complessa,
                       parziale=daos.index(dao), totale=len(daos),
                       text="INVIO EMAIL MULTIPLO", noeta=False)

        # genera il documento
        path = resolve_save_file_path(ext=formato)
        mymode = 'wb'
        if formato == 'xml':
            mymode = 'w'
        with open(path, mode=mymode) as fp:
            if formato == 'pdf':
                fp.write(_to_pdf(dao))
            elif formato == 'xml':
                fp.write(to_fatturapa(dao, progressivo=progressivo))


        # prepara il messaggio email con allegato
        outer = MIMEMultipart()
        outer.set_charset('UTF-8')
        outer['Subject'] = account_email.oggetto
        outer['To'] = formataddr((destinatario, destinatario))
        outer['From'] = formataddr((account_email.indirizzo, account_email.indirizzo))
        ctype, encoding = mimetypes.guess_type(path)
        maintype, subtype = ctype.split('/', 1)
        fp = open(path, 'rb')
        msg = MIMEBase(maintype, subtype)
        msg.set_payload(fp.read())
        fp.close()
        encoders.encode_base64(msg)
        msg.add_header('Content-Disposition', 'attachment', filename=basename(path))
        outer.attach(msg)
        text_msg = MIMEText(account_email.body + '\n' + account_email.firma)
        outer.attach(text_msg)
        try:
            s.sendmail(account_email.indirizzo, [destinatario], outer.as_string())
        except:
            raise NetworkError('Invio fattura a "{0}" non riuscito.'.format(destinatario))
        progressivo += 1
        time.sleep(5)
    if s:
        s.quit()
    if anag:
        utils.pbar(anag.pbar_anag_complessa, stop=True)
        anag.pbar_anag_complessa.set_property("visible", False)
Exemple #14
0
std_mapper = mapper(Cliente,
                    join(t_cliente, t_persona_giuridica),
                    properties={
                        'id': [t_cliente.c.id, t_persona_giuridica.c.id],
                        'cliente_categoria_cliente': relation(ClienteCategoriaCliente,cascade="all, delete",
                                                             backref='cliente_'),
                        "dm": relation(DestinazioneMerce,cascade="all, delete"),
                        'vl': relation(VariazioneListino,
                            secondary=t_cliente_variazione_listino)
                    },
                    order_by=t_cliente.c.id)

if tipodb=="sqlite":
    from promogest.dao.Pagamento import Pagamento
    a = session.query(Pagamento.id).all()
    b = session.query(Cliente.id_pagamento).all()
    fixit =  list(set(b)-set(a))
    print "fixt-cliente-pagamento", fixit
    for f in fixit:
        if f[0] != "None" and f[0] != None:
            aa = Cliente().select(idPagamento=f[0], batchSize=None)
            for a in aa:
                a.id_pagamento = None
            session.add(a)
    from promogest.dao.Banca import Banca
    c = session.query(Banca.id).all()
    d = session.query(Cliente.id_banca).all()
    fixit2 =  list(set(d)-set(c))
    print "fixt-cliente-banca", fixit2
    for f in fixit2:
def ricerca_forniture(fornitore, dataInizio, dataFine, progress=None):
    if not (fornitore or dataInizio or dataFine):
        return None

    data = {}
    totale_acq = 0
    totale_ven = 0
    totale_qta_acq = 0
    totale_qta_ven = 0

    id_articoli_forniture = session.query(Fornitura.id_articolo) \
            .distinct(Fornitura.id_articolo) \
            .filter(Fornitura.id_fornitore==fornitore.id) \
            .filter(Fornitura.data_fornitura>datetime.date(dataInizio.year,1,1)) \
            .all()
    # + datetime.timedelta(days=1)
    for id_articol in id_articoli_forniture:
        id_articolo = id_articol[0]
        res = session.query(Riga, RigaMovimento, TestataMovimento) \
                .join(RigaMovimento, TestataMovimento) \
                .filter(Riga.id_articolo==id_articolo) \
                .filter(TestataMovimento.data_movimento.between(dataInizio, dataFine)) \
                .all()

        for item in res:
            riga, rigamov, testmov = item
            if testmov.id_fornitore and testmov.id_cliente:
                continue
            elif testmov.id_fornitore:
                if str(id_articolo) not in data:
                    data[str(id_articolo)] = {'QTAACQ': riga.quantita * riga.moltiplicatore,
                                             'TOTACQ': rigamov.totaleRiga,
                                             'DAO_ART': riga.arti,
                                             'DAO_RIGAMOV': rigamov,
                                             'QTAVEN': 0, 'TOTVEN': 0}
                else:
                    data[str(id_articolo)]['QTAACQ'] += riga.quantita * riga.moltiplicatore
                    data[str(id_articolo)]['TOTACQ'] += rigamov.totaleRiga
                totale_acq += rigamov.totaleRiga
                totale_qta_acq += riga.quantita * riga.moltiplicatore

            elif testmov.id_cliente:
                if str(id_articolo) not in data:
                    data[str(id_articolo)] = {'QTAVEN': riga.quantita * riga.moltiplicatore,
                                             'TOTVEN': rigamov.totaleRiga,
                                             'DAO_ART': riga.arti,
                                             'DAO_RIGAMOV': rigamov,
                                             'QTAACQ': 0, 'TOTACQ': 0}
                else:
                    data[str(id_articolo)]['QTAVEN'] += riga.quantita * riga.moltiplicatore
                    data[str(id_articolo)]['TOTVEN'] += rigamov.totaleRiga
                totale_ven += rigamov.totaleRiga
                totale_qta_ven += riga.quantita * riga.moltiplicatore


        if progress:
            from promogest.lib.utils import pbar
            pbar(progress, parziale=id_articoli_forniture.index(id_articol),
                totale=len(id_articoli_forniture),
                text="Controllo documenti...", noeta=True)

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