def get_rechnung(rechnungsnr): """Liefert ein Tupel aus Rechnungskopf und den Positionen""" if str(rechnungsnr).startswith('RG'): rechnungsnr = str(rechnungsnr)[2:] kopf = get_connection().query(['AFK00'], condition="FKRGNR = %s" % sql_escape(rechnungsnr)) if len(kopf) < 1: raise RuntimeError('inkonsistente Kopfdaten in AFK00: %r' % kopf) if len(kopf) > 1: print 'warning: inkonsistente Kopfdaten in AFK00: FKRGNR = %s' % rechnungsnr print kopf kopf = kopf[0] # TODO: der code schient nciht zu klappen, wenn gar keine Auftragstexte vorhanden sind. postmp = get_connection().query(['AFU00', 'AAT00'], condition="FURGNR=%s AND FUAUFN=ATAUFN AND FUAUPO=ATAUPO AND ATTART=8" % sql_escape(rechnungsnr)) # wenn eine Rechnungsposition mehr als einen Rechnungstext hat, ist sie jetzt mehrfach in positionen # dedupen und spezial felder auseinanderklamuesern positionen = {} texte = {} for line in postmp: positionen.setdefault(line['auftragsposition'], {}).update(line) text = line['text'].strip() if not text.startswith('#:'): texte.setdefault(line['auftragsposition'], []).append(line['text']) if text.startswith('#:guid:'): positionen[line['auftragsposition']]['guid'] = text[7:] for posnr, textlines in texte.items(): positionen[posnr]['text'] = ' '.join(textlines) return kopf, positionen.values()
def get_bestellung(bestellnr): """Liefert alle Positionen zu einer bestellnr. >>> bestellungen(43123) [{kopfdaten}, [{'artnr': u'64114', 'bestellmenge': 300, 'bestellnr': 43042, 'created_by': 62, 'dateifuehrungsschluessel': u'', 'geliefert_kz': 0, 'gelieferte_menge': 0, 'lager': 16, 'liefer_date': datetime.date(2009, 12, 24), 'lieferant': u'90088', 'menge_offen': 300, 'position': 11, 'status': u'', 'streckengeschaeft': 0, 'termin1_date': datetime.date(2009, 12, 24), 'termin2_date': datetime.date(2009, 12, 24), 'updated_by': 62, 'wunsch2_date': datetime.date(2009, 12, 24), 'wunsch_date': None, 'zugang_date': None}, ...] ] """ kopf = get_connection('bestellungen.get_bestellung').query('EBL00', ordering=['BLBSTN DESC'], condition="BLSTAT<>'X' AND BLBSTN=%s" % sql_escape(bestellnr)) if len(kopf) != 1: raise RuntimeError('inkonsistente Kopfdaten in EBL00') kopf = kursfaktorkorrektur(kopf)[0] # leer? WTF? # print get_connection().query('ESL00', condition="SLBSTN=%s" % sql_escape(ponr)) # BZT00 - zusatztexte # positionen = get_connection().query(['EBP00', 'EWZ00'], ordering=['BPBSTN DESC', 'BPDTLT'], # condition="WZBSTN=BPBSTN AND WZBSTP=BPBSTP AND BPSTAT<>'X' AND BPBSTN=%s" % sql_escape(ponr)) positionen = get_connection().query(['EBP00'], ordering=['BPBSTN DESC', 'BPDTLT'], condition="BPSTAT<>'X' AND BPBSTN=%s" % sql_escape(bestellnr)) # detailierte Informationen über den Zugang gibts in EWZ00 # AND BPKZAK=0 to get only the open ones # Buchungsdaten: SELECT * FROM SMKDIFP/BBU00 WHERE BUBELN = 900003977 # Lagerveraenderung: SELECT * FROM SMKDIFP/XLB00 WHERE LBBSTN = '43072' # ?: SELECT * FROM EWZ00 WHERE WZBSTN = 43072 return kopf, positionen
def get_auftrag(auftragsnr): """Auftrag mit Auftragsnummer auftragsnr ermitteln""" warnings.warn("husoftm.auftraege is deprecated, use husoftm2.auftraege instead", DeprecationWarning, stacklevel=2) rows = get_connection().query('AAK00', condition="AKSTAT<>'X' AND AKAUFN=%s" % sql_escape(auftragsnr)) if len(rows) != 1: raise RuntimeError('inkonsistente Kopfdaten in AAK00 für Auftragsnr %s' % auftragsnr) kopf = rows[0] positionen = get_connection().query(['AAP00'], ordering=['APAUFN DESC', 'APDTLT'], condition="APSTAT<>'X' AND APAUFN=%s" % sql_escape(auftragsnr)) return kopf, positionen
def get_bestellungen_artnr(artnr): """Liefert alle Warenzugaenge einer Artikelnummer.""" # BZT00 - zusatztexte positionen = query(['EBP00', 'EBL00'], ordering=['BPDTLT'], condition="BLBSTN=BPBSTN AND BLSTAT<>'X' AND BPSTAT<>'X' AND BPARTN=%s" % sql_quote(artnr)) ret = [] for position in positionen: position['_zugaenge'] = [x for x in get_zugaenge_bestellnr(position['bestellnr']) if x['artnr'] == artnr] for zugang in position['_zugaenge']: # Buchungsdaten buchungen = query('BBU00', condition='BUBELN=%s' % sql_escape(zugang['rechnungsnr'])) zugang['_fibubuchungen'] = kursfaktorkorrektur(buchungen, umdrehen=False) position['_lager_stapelschnittstelle'] = query( 'ESL00', condition="SLBSTN=%s AND SLBSTP=%s AND SLARTN=%s" % (sql_escape(position['bestellnr']), sql_escape(position['bestellpos']), sql_escape(artnr))) ret.append(position) # ?: SELECT * FROM EWZ00 WHERE WZBSTN = 43072 return kursfaktorkorrektur(ret)
def _get_zugaenge_helper(rows): """Sammelt daten zu einer Bestellung aus verschiedenen Tabellen.""" rows = kursfaktorkorrektur(rows, 'kurs_zugang', 'kursfaktor_zugang') ret = [] for row in rows: lagerbuchungen = [] if row['lagerbewegung_rechnung']: buchung = get_connection('_get_zugaenge_helper').query('XLB00', condition="LBSANR=%s" % sql_escape(row['lagerbewegung_rechnung'])) if len(buchung) > 1: raise RuntimeError('mehr als einen XLB Satz zu einem EWZ Satz: %r' % buchung) buchung = kursfaktorkorrektur(buchung)[0] lagerbuchungen.append(buchung) if row['lagerbewegung_zugang'] and row['lagerbewegung_zugang'] != row['lagerbewegung_rechnung']: buchung = get_connection('_get_zugaenge_helper').query('XLB00', condition="LBSANR=%s" % sql_escape(row['lagerbewegung_zugang'])) if len(buchung) > 1: raise RuntimeError('mehr als einen XLB Satz zu einem EWZ Satz: %r' % buchung) lagerbuchungen.append(kursfaktorkorrektur(buchung)[0]) row['_lagerbuchungen'] = lagerbuchungen ret.append(row) return ret
def verfuegbare_menge(artnr, lager=0): """Gibt die aktuell verfügbare Menge eines Artikels an einem Lager zurück oder (lager=0) für alle Lager Achtung! Die verfügbare Menge ist nicht die "freie Menge". >>> verfuegbare_menge('12345') 3456 """ rows = get_connection().query('XLF00', fields=['LFMGLP', 'LFMGK4'], condition="LFLGNR=%s AND LFARTN=%s AND LFMGLP<>0 AND LFSTAT<>'X'" % ( sql_escape(lager), sql_quote(artnr))) if rows: (menge, lfmgk4) = rows[0] return as400_2_int(menge) - as400_2_int(lfmgk4) else: return 0
def softm_to_invoice(rechnungsnr): """Erzeugt daten nach dem very simple invoice Protocol""" from pprint import pprint if str(rechnungsnr).startswith('RG'): rechnungsnr = str(rechnungsnr)[2:] rg, orderlines = get_rechnung('RG833645') hint = {} for attr in 'skontobetrag'.split(): hint[attr] = rg[attr] out = {'hint': hint} for attr in '''kundenauftragsnr auftragsnr versandkosten rechnung_steuranteil rechnungsnr zu_zahlen'''.split(): out[attr] = rg[attr] out['leistungsdatum'] = rg['versand_date'] out['kundennr'] = rg['kundennr_rechnungsempfaenger'] out['erfasst_von'] = rg['sachbearbeiternr'] out['abschlag_prozent'] = rg['auftragsrabatt1p'] + rg['auftragsrabatt2p'] out['auftragsrabatt'] = rg['auftragsrabatt'] out['rechungsdatum'] = rg['druck_date'] rabatttext = ' und '.join([x for x in [rg['rabatttext1'].strip(), rg['rabatttext2'].strip()] if x]) rabatttext = "" if rabatttext: rabatttext = "%s: %f" % (rabatttext, out['abschlag_prozent']) elif out['abschlag_prozent']: rabatttext = u"Ab/Zuschläge: %f" % (out['abschlag_prozent']) out['infotext_kunde'] = '\n'.join([rabatttext]) out['orderlines'] = [] for ol in get_connection().query(['AFU00'], condition="FURGNR=%s" % sql_escape(rechnungsnr)): pprint(ol) outol = {} for attr in '''menge artnr abschlag rechungsbetrag warenwert'''.split(): # zu_zahlen outol[attr] = ol[attr] out['orderlines'].append(outol)
def verfuegbare_mengen(lager=0): """Gibt die aktuell verfügbaren Mengen aller Artikel eines Lagers zurück. Siehe auch besteande(). >>> verfuegbare_mengen(34) {'10106': 6, '12551': 2854, ... '83165': 598} """ rows = get_connection().query('XLF00', grouping=['LFARTN'], querymappings={}, fields=['LFARTN', 'SUM(LFMGLP)', 'SUM(LFMGK4)', 'SUM(LFMGLP-LFMGK4)'], condition="LFLGNR=%s AND LFMGLP<>0 AND LFSTAT<>'X'" % sql_escape(lager)) return dict([(str(artnr), as400_2_int(menge) - as400_2_int(lfmgk4)) for (artnr, menge, lfmgk4, dummy) in rows])
def get_zugaenge_bestellnr(bestellnr): """Liefert alle Warenzugaenge einer Bestellnummer""" rows = get_connection('bestellungen.get_zugaenge_bestellnr').query('EWZ00', # ordering=['WZDTWZ'], condition="WZBSTN=%s" % sql_escape(bestellnr)) return _get_zugaenge_helper(rows)
def get_zugaenge_artnr(artnr): """Liefert alle Warenzugaenge eines Artikels""" rows = get_connection('bestellungen.get_zugaenge_artnr').query('EWZ00', ordering=['WZDTWZ'], condition="WZARTN='%s'" % sql_escape(artnr)) return _get_zugaenge_helper(rows)
def get_zugaenge_artnr(artnr): """Liefert alle Warenzugaenge eines Artikels""" rows = query('EWZ00', ordering=['WZDTWZ'], condition="WZSTAT<>'X' AND WZARTN='%s'" % sql_escape(artnr)) return _get_zugaenge_helper(rows)