Initial commit

This commit is contained in:
Marcus Lindvall 2017-10-18 16:35:10 +02:00
commit 351d98c523
36 changed files with 1836 additions and 0 deletions

151
pyjeeves/jvsquery.py Normal file
View file

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
"""
pyjeeves.jvsquery
~~~~~~~~~~~~~~~~~~~~~~
Jeeves data queries
"""
import pymssql
import datetime
import logging
class JvsQuery():
"""docstring for JvsQuery"""
def __init__(self, settings):
super(JvsQuery, self).__init__()
self.settings = settings
self.logger = logging.getLogger("PyJeeves.jvsquery")
def _execute(self, query="", params=(), iterator=True):
with pymssql.connect(**self.settings) as conn:
with conn.cursor(as_dict=True) as cursor:
cursor.execute(query, params)
if iterator:
for row in cursor:
if cursor.rownumber % 1000 == 0 and cursor.rownumber != 0:
self.logger.debug("Cursor is at pos %d" % cursor.rownumber)
yield row
else:
return cursor.fetchall()
def _ft(self, updated_dt='2000-01-01 00:00:00.000',
created_dt='2000-01-01 00:00:00.000', limit=None):
query = (
"""SELECT FaktNr, FaktRadnr, ForetagKod, FtgNr, OrderNr, OrdTyp, Saljare,
KundKategoriKod, ArtNr, EnhetsKod, VaruGruppKod, Redovisnar, Period, FaktTB,
FaktTG, FaktLevAnt, FaktLevAntAltEnh, FPris, FaktRadSumma, ValKod, ValKurs,
RowCreatedDt, RowUpdatedDt, RowUpdatedBy, FaktDat
FROM ft
WHERE ft.ForetagKod = 1
AND (ft.RowCreatedDt > %(created_dt)s
OR ft.RowUpdatedDt > %(updated_dt)s)""")
params = {'created_dt': created_dt, 'updated_dt': updated_dt}
return self._execute(query, params)
def _orp(self, updated_dt='2000-01-01 00:00:00.000',
created_dt='2000-01-01 00:00:00.000', limit=None):
query = (
"""SELECT orp.OrderNr, OrdRadnr, OrdRadNrStrPos, orp.OrdRestNr, orp.ForetagKod,
ArtNr, orp.FtgNr, vb_pris,
OrdAntal, OrdAntalAltEnh, AltEnhetKod, OrdLevAntal, OrdLevAntalAltEnh,
orp.FaktNr, orp.OrdDatum, orp.OrdBerLevDat, orp.OrdBerednDat, orp.OrdLevDat,
orp.RowUpdatedBy, orp.RowUpdatedDt, orp.RowCreatedBy, orp.RowCreatedDt,
salj.Saljare, salj.SaljareNamn,
xs.OrdRadSt, xs.OrdRStatBeskr, x6.OrdTyp, x6.OrdTypBeskr
FROM orp
LEFT OUTER JOIN oh ON oh.OrderNr = orp.OrderNr
AND oh.ForetagKod = orp.ForetagKod
LEFT OUTER JOIN salj ON salj.Saljare = orp.Saljare
AND salj.ForetagKod = orp.ForetagKod
LEFT OUTER JOIN xs ON xs.OrdRadSt = orp.OrdRadSt
AND xs.ForetagKod = orp.ForetagKod
LEFT OUTER JOIN x6 ON x6.OrdTyp = orp.OrdTyp
AND x6.ForetagKod = orp.ForetagKod
WHERE orp.ForetagKod = 1
AND (oh.RowCreatedDt > %(created_dt)s
OR oh.RowUpdatedDt > %(updated_dt)s
OR salj.RowCreatedDt > %(created_dt)s
OR salj.RowUpdatedDt > %(updated_dt)s
OR xs.RowCreatedDt > %(created_dt)s
OR xs.RowUpdatedDt > %(updated_dt)s
OR x6.RowCreatedDt > %(created_dt)s
OR x6.RowUpdatedDt > %(updated_dt)s)""")
params = {'created_dt': created_dt, 'updated_dt': updated_dt}
return self._execute(query, params)
def _ar(self, limit=None):
query = (
"""SELECT ArtNr, ar.VaruGruppKod, VaruGruppBeskr, ArtBeskr, ArtBeskr2, ArtBeskrSpec,
ar.ArtProdKlass, ArtProdklBeskr, ar.ArtProdKonto, ArtProdKontoBeskr, ar.ArtKod,
ArtTypBeskr, LagTyp, EnhetsKod, LevNr, ItemStatusCode, LagSaldoArtikel,
ar.RowUpdatedBy, ar.RowUpdatedDt, ar.RowCreatedBy, ar.RowCreatedDt, ar.ForetagKod
FROM ar
LEFT OUTER JOIN arpk ON ar.ArtProdKonto = arpk.ArtprodKonto
AND ar.ForetagKod = arpk.ForetagKod
LEFT OUTER JOIN vg ON ar.VaruGruppKod = vg.VaruGruppKod
AND ar.ForetagKod = vg.ForetagKod
AND vg.SprakKod = 0
LEFT OUTER JOIN xp ON ar.ArtProdKlass = xp.ArtProdKlass
AND ar.ForetagKod = xp.ForetagKod
LEFT OUTER JOIN xm ON ar.ArtKod = xm.ArtKod
AND ar.ForetagKod = xm.ForetagKod
WHERE ar.ForetagKod = 1""")
return self._execute(query)
def _kus(self, updated_dt='2000-01-01 00:00:00.000',
created_dt='2000-01-01 00:00:00.000', limit=None):
query = (
"""SELECT kus.FtgNr, BetKod, kus.kundbetalarenr, kus.RowUpdatedBy, kus.RowUpdatedDt,
kus.RowCreatedBy, kus.RowCreatedDt, kus.ForetagKod, kus.MakDateTime, kus.Makulerad,
x1k.KundKategoriKod, x1k.KundKatBeskr,
x1kk.Kundklass, x1kk.KundKlassBeskr,
salj.Saljare, salj.SaljareNamn,
OrgNr, FtgNamn, FtgPostAdr1, FtgPostAdr2, FtgPostAdr3,
FtgPostadr4, FtgPostadr5, FtgPostnr, fr.LandsKod, FtgPostLevAdr3, FtgLevPostNr
FROM kus
LEFT OUTER JOIN fr ON fr.FtgNr = kus.FtgNr
AND fr.ForetagKod = kus.ForetagKod
LEFT OUTER JOIN x1k ON x1k.KundKategoriKod = kus.kundkategorikod
AND x1k.ForetagKod = kus.ForetagKod
LEFT OUTER JOIN x1kk ON x1kk.Kundklass = kus.kundklass
AND x1kk.ForetagKod = kus.ForetagKod
LEFT OUTER JOIN salj ON salj.Saljare = kus.Saljare
AND salj.ForetagKod = kus.ForetagKod
WHERE kus.ForetagKod = 1
AND (kus.RowCreatedDt > %(created_dt)s
OR kus.RowUpdatedDt > %(updated_dt)s
OR fr.RowCreatedDt > %(created_dt)s
OR fr.RowUpdatedDt > %(updated_dt)s
OR x1k.RowCreatedDt > %(created_dt)s
OR x1k.RowUpdatedDt > %(updated_dt)s
OR x1kk.RowCreatedDt > %(created_dt)s
OR x1kk.RowUpdatedDt > %(updated_dt)s
OR salj.RowCreatedDt > %(created_dt)s
OR salj.RowUpdatedDt > %(updated_dt)s)""")
params = {'created_dt': created_dt, 'updated_dt': updated_dt}
return self._execute(query, params)
def get(self, jvs_tbl, updated_dt, created_dt):
if not updated_dt:
updated_dt = datetime.date(2000, 1, 1)
if not created_dt:
created_dt = datetime.date(2000, 1, 1)
updated_dt = updated_dt.strftime("%Y-%m-%d %H:%M:%S")
created_dt = created_dt.strftime("%Y-%m-%d %H:%M:%S")
if jvs_tbl == 'Articles':
return self._ar()
elif jvs_tbl == 'Customers':
return self._kus(updated_dt, created_dt)
elif jvs_tbl == 'InvoiceRows':
return self._ft(updated_dt, created_dt)
elif jvs_tbl == 'OrderRows':
return self._orp(updated_dt, created_dt)
else:
self.logger.warning("%s table has no get query" % jvs_tbl)