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"
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()
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
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
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
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
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
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()
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)
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}