Beispiel #1
0
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()
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
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)
Beispiel #8
0
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])
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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)