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])
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
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])
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
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