Exemplo n.º 1
0
def auftragsmengen(artnr, lager=0):
    """Liefert eine Liste offener Aufträge (Warenausgänge) für einen Artikel OHNE UMLAGERUNGEN.

    >>> auftragsmengen(14865)
    {datetime.date(2009, 3, 2): 340,
     datetime.date(2009, 4, 1): 300,
     datetime.date(2009, 5, 4): 260,
     datetime.date(2009, 6, 2): 300}
    """
    conditions = [
        "APARTN=%s" % (sql_quote(artnr)),  # Artikelnummer
        "AKAUFN=APAUFN",
        "AKAUFA<>'U'",                     # kein Umlagerungsauftrag
        "APSTAT<>'X'",                     # Position nicht logisch gelöscht
        "APKZVA=0",                        # Position nicht als 'voll ausgeliefert' markiert
        "(APMNG-APMNGF) > 0",              # (noch) zu liefernde menge ist positiv
        "AKSTAT<>'X'",                     # Auftrag nicht logisch gelöscht
        "AKKZVA=0"]                        # Auftrag nicht als 'voll ausgeliefert' markiert

    if lager:
        # Achtung, hier gibt es KEIN Lager 0 in der Tabelle. D.h. APLGNR=0 gibt nix
        conditions = conditions + ["APLGNR=%d" % lager]
    rows = query(['AAP00', 'AAK00'], fields=['APDTLT', 'SUM(APMNG-APMNGF)'],
                   condition=' AND '.join(conditions),
                   ordering='APDTLT', grouping='APDTLT',
                   querymappings={'SUM(APMNG-APMNGF)': 'menge_offen', 'APDTLT': 'liefer_date'})
    return dict([(x['liefer_date'], as400_2_int(x['menge_offen'])) for x in rows if x['menge_offen'] > 0])
Exemplo n.º 2
0
def umlagermenge(artnr, anlager=100):
    """Ermittelt wieviel Umlagerungen für einen Artikel der nach anlager unterwegs sind.

    Rueckgabe:
     - Wenn eine Artikelnummer angegeben wird, dann eine Menge als int
    """

    # Das Auslieferungslager steht in AKLGN1, Das Ziellager steht in AKLGN2
    # In APLGNR steht AUCH das Auslieferungslager
    tables = ['AAP00', 'AAK00']
    conditions = [
        "APARTN=%s" % sql_quote(artnr),
        "AKLGN2=%d" % int(anlager),   # Zugangslager
        "AKAUFN=APAUFN",
        "AKAUFA='U'",                 # Umlagerungsauftrag
        "APSTAT<>'X'",                # Position nicht logisch gelöscht
        "APKZVA=0",                   # Position nicht als 'voll ausgeliefert' markiert
        #"(APMNG-APMNGF-APMNGG) > 0"  # (noch) zu liefernde menge ist positiv
        "AKSTAT<>'X'",                # Auftrag nicht logisch gelöscht
        "AKKZVA=0"]                   # Auftrag nicht als 'voll ausgeliefert' markiert

    rows = query(tables=tables, fields=['SUM(APMNG)'], querymappings={}, condition=' AND '.join(conditions))
    if rows and rows[0] and rows[0][0]:
        return as400_2_int(rows[0][0])
    return 0
Exemplo n.º 3
0
def bestellmengen(artnr, lager=0):
    """Liefert eine Liste mit allen Bestellten aber noch nicht gelieferten Wareneingängen.

    >>> bestellmengen('14865')
    {datetime.date(2009, 2, 20): 1200,
     datetime.date(2009, 5, 5): 300}
    """
    conditions = ["BPSTAT<>'X'",
                  "BPKZAK=0",
                  "BPARTN=%s" % sql_quote(artnr)]
    if lager:
        conditions += ["BPLGNR=%s" % sql_quote(lager)]

    # detailierte Informationen gibts in EWZ00
    rows = query('EBP00', fields=['BPDTLT', 'SUM(BPMNGB-BPMNGL)'], ordering='BPDTLT',
                 grouping='BPDTLT', condition=' AND '.join(conditions))
    return dict([(x['liefer_date'], as400_2_int(x['SUM(BPMNGB-BPMNGL)']))
                 for x in rows if as400_2_int(x['SUM(BPMNGB-BPMNGL)']) > 0])
Exemplo n.º 4
0
def artikel_mengenumsatz_range(artnr, startdate, enddate):
    """Liefert die FakturirtenUmsatz-MEngen für den Interval [startdate; enddata[

    >>> artikel_mengenumsatz_range('10101', datetime.date(2009, 6, 2), datetime.date(2009, 6, 5))
    {datetime.date(2009, 6, 2): 500, datetime.date(2009, 6, 4): 1000, datetime.date(2009, 6, 3): 0}
    """

    conditions = ['FUDTRI>=%s' % date2softm(startdate),
                  'FUDTRI<%s' % date2softm(enddate),
                  'FUARTN=%s' % sql_quote(artnr),
                 ]

    rows = query(tables=['AFU00'], fields=['SUM(FUMNG)', 'FUDTRI'], grouping=['FUDTRI'],
             querymappings={'FUDTRI': 'tag', 'SUM(FUMNG)': 'menge'},
             condition=' AND '.join(conditions), ua='husoftm2.umsatz', cachingtime=86400)
    ret = {}
    for row in rows:
        ret[softm2date(row['tag'])] = as400_2_int(row['menge'])
    return ret
Exemplo n.º 5
0
def auftragsmengen_alle_artikel():
    """Liefert eine Liste offener Aufträge aller Artikel furu alle Läger.

    >>> auftragsmengen_alle_artikel(34)
    {'14550': {datetime.date(2008, 11, 30): 3450,
               datetime.date(2008, 12, 1): 8,
               datetime.date(2008, 12, 15): 5056},
     '14565': {datetime.date(2009, 2, 9): 750,
               datetime.date(2009, 3, 23): 1008,
               datetime.date(2009, 4, 27): 625},
     '14566': {datetime.date(2009, 2, 2): 4000,
               datetime.date(2009, 6, 1): 400},
     '14635': {datetime.date(2008, 11, 19): 20,
               datetime.date(2008, 11, 24): 763,
               datetime.date(2008, 11, 27): 200}}
    """

    conditions = [
    "AKAUFN=APAUFN",
    "AKAUFA<>'U'",               # keine Umlagerungen
    "APSTAT<>'X'",               # Position nicht logisch gelöscht
    "APKZVA=0",                  # Position nicht als 'voll ausgeliefert' markiert
    "(APMNG-APMNGF) > 0",        # (noch) zu liefernde menge ist positiv
    "AKSTAT<>'X'",               # Auftrag nicht logisch gelöscht
    "AKKZVA=0"]                  # Auftrag nicht als 'voll ausgeliefert' markiert

    rows = query(['AAP00', 'AAK00'],
            fields=['APARTN', 'APDTLT', 'SUM(APMNG-APMNGF)', 'COUNT(*)'],
            condition=' AND '.join(conditions),
            ordering='APDTLT', grouping=['APARTN', 'APDTLT'],
            querymappings={'SUM(APMNG-APMNGF)': 'menge_offen', 'APARTN': 'artnr',
                           'COUNT(*)': 'orderlines', 'APDTLT': 'liefer_date'})
    ret = {}
    for row in rows:
        if row['menge_offen']:
            ret.setdefault(str(row['artnr']), {})[row['liefer_date']] = (as400_2_int(row['menge_offen']),
                                                                         row['orderlines'])
    return ret