From fc7c1e13bce7cb64b4c9c4df5e9fc83d56b36645 Mon Sep 17 00:00:00 2001 From: Marcus Lindvall Date: Mon, 9 Sep 2019 17:13:10 +0200 Subject: [PATCH] Implement support for contact persons and web users. Also show addr info for company. --- pyjeeves/models/abc.py | 3 +- pyjeeves/models/raw.py | 99 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/pyjeeves/models/abc.py b/pyjeeves/models/abc.py index 592cc5c..334c3c7 100644 --- a/pyjeeves/models/abc.py +++ b/pyjeeves/models/abc.py @@ -26,7 +26,8 @@ meta = MetaData() try: meta.reflect(bind=db.raw.connection(), only=['ar', 'ars', 'xae', 'xare', 'fr', 'kus', 'x1k', - 'oh', 'orp', 'lp', 'vg', 'xp', 'xm', 'prh', 'prl']) + 'oh', 'orp', 'lp', 'vg', 'xp', 'xm', 'prh', 'prl', + 'kp', 'kpw', 'cr', 'X4', 'xw']) except OperationalError as e: logger.error("Failed to read Jeeves DB structure") raise e diff --git a/pyjeeves/models/raw.py b/pyjeeves/models/raw.py index 177297f..7a8ca3c 100644 --- a/pyjeeves/models/raw.py +++ b/pyjeeves/models/raw.py @@ -192,14 +192,92 @@ class Article(RawBaseModel): ) +class ContactInformationType(RawBaseModel): + __tablename__ = 'X4' + __to_dict_only__ = ('ComKod', 'ComBeskr') + + +class ContactInformation(RawBaseModel): + __tablename__ = 'cr' + __column_map__ = {'ComNr': 'Information'} + __to_dict_only__ = ('InformationType', 'ComNr') + + FtgNr = Column(String, ForeignKey('fr.FtgNr'), primary_key=True) + FtgKontaktNr = Column(Integer, ForeignKey('kp.FtgKontaktNr'), primary_key=True) + ComKod = Column(String, ForeignKey('X4.ComKod'), primary_key=True) + + ContactInformationType = relationship(ContactInformationType) + + @hybrid_property + def InformationType(self): + return self.ContactInformationType.ComBeskr if self.ContactInformationType else "" + + +class ContactPerson(RawBaseModel): + __tablename__ = 'kp' + __column_map__ = {'FtgKontaktNr': 'ContactNumber', 'FtgPerson': 'ContactName'} + __to_dict_only__ = ('FtgKontaktNr', 'FtgPerson', 'ContactInformation') + + FtgNr = Column(String, ForeignKey('fr.FtgNr'), primary_key=True) + FtgKontaktNr = Column(Integer, primary_key=True) + + ContactInformation = relationship( + "ContactInformation", lazy='joined', + foreign_keys='ContactInformation.FtgNr, ContactInformation.FtgKontaktNr', + primaryjoin="and_(ContactInformation.FtgNr==ContactPerson.FtgNr," + "ContactInformation.FtgKontaktNr==ContactPerson.FtgKontaktNr)") + + +class WebUser(RawBaseModel): + __tablename__ = 'kpw' + __to_dict_only__ = ('WebUserName', 'ValidToUse', 'ContactPersonName', 'ContactPersonNumber') + + FtgNr = Column(String, ForeignKey('fr.FtgNr'), primary_key=True) + FtgKontaktNr = Column(Integer, ForeignKey('kp.FtgKontaktNr'), primary_key=True) + + ContactPerson = relationship( + ContactPerson, uselist=False, lazy='joined', + foreign_keys='ContactPerson.FtgNr, ContactPerson.FtgKontaktNr', + primaryjoin="and_(ContactPerson.FtgNr==WebUser.FtgNr," + "ContactPerson.FtgKontaktNr==WebUser.FtgKontaktNr)") + + @hybrid_property + def ContactPersonName(self): + return self.ContactPerson.FtgPerson if self.ContactPerson else "" + + @hybrid_property + def ContactPersonNumber(self): + return self.ContactPerson.FtgKontaktNr if self.ContactPerson else "" + + +class LanguageCodes(RawBaseModel): + __tablename__ = 'xw' + + SprakKod = Column(Integer, primary_key=True) + + class Company(RawBaseModel): __tablename__ = 'fr' - __column_map__ = {'FtgNr': 'CompanyNumber', 'FtgNamn': 'CompanyName'} - __to_dict_only__ = ('FtgNr', 'FtgNamn', 'Customer') + __column_map__ = {'FtgNr': 'CompanyNumber', 'FtgNamn': 'CompanyName', + 'OrgNr': 'CompanyIdentityNumber', 'EUMomsNr': 'CompanyVATNumber', + 'FtgPostAdr1': 'AddrCO', 'FtgPostadr5': 'AddrStreet', + 'FtgLevPostNr': 'AddrPostalCode', 'FtgPostLevAdr3': 'AddrCity', + 'LandsKod': 'AddrCountry', + 'FtgPostAdr2': 'PostAddrStreet', 'FtgPostnr': 'PostAddrPostalCode', + 'FtgPostAdr3': 'PostAddrCity'} + __to_dict_only__ = ('FtgNr', 'FtgNamn', 'Customer', 'ContactPersons', 'ContactInformation', + 'FtgPostadr5', 'FtgPostAdr1', 'FtgPostLevAdr3', 'FtgLevPostNr', 'LandsKod', + 'FtgPostAdr2', 'FtgPostnr', 'FtgPostAdr3', 'OrgNr', 'EUMomsNr') FtgNr = Column(String, primary_key=True) Customer = relationship('Customer', uselist=False, back_populates='Company', lazy='joined') + ContactPersons = relationship("ContactPerson", lazy='joined') + ContactInformation = relationship( + "ContactInformation", lazy='joined', + foreign_keys='ContactInformation.FtgNr', + primaryjoin="and_(ContactInformation.FtgNr==Company.FtgNr," + "ContactInformation.FtgKontaktNr==null())") class DelivLoc(RawBaseModel): @@ -215,12 +293,16 @@ class CustomerCategory(RawBaseModel): class Customer(RawBaseModel): __tablename__ = 'kus' __column_map__ = {'FtgNr': 'CompanyNumber', 'kundkategorikod': 'CustomerCategoryCode', - 'PrisListaKundSpec': 'PriceListPrimary', 'PrisLista': 'PriceListSecondary'} + 'PrisListaKundSpec': 'PriceListPrimary', 'PrisLista': 'PriceListSecondary', + 'GodsMarke1': 'DefaultShippingInfo', 'GodsMarke2': 'InternalInfo', + 'LevSattKod': 'DefaultShippingTypeCode', 'ValKod': 'CustomerCurrency'} __to_dict_only__ = ('kundkategorikod', 'PriceList', 'PriceListCommon', 'CustomerCategory', - 'PrisLista', 'PrisListaKundSpec') + 'PrisLista', 'PrisListaKundSpec', 'WebUsers', 'GodsMarke1', + 'GodsMarke2', 'LevSattKod', 'Language', 'ValKod') FtgNr = Column(String, ForeignKey('fr.FtgNr'), primary_key=True) KundKategoriKod = Column(Integer, ForeignKey('x1k.KundKategoriKod')) + SprakKod = Column(Integer, ForeignKey('xw.SprakKod')) PrisLista = Column(Integer, ForeignKey('prh.PrisLista')) PrisListaKundSpec = Column(Integer, ForeignKey('prh.PrisLista')) @@ -233,11 +315,20 @@ class Customer(RawBaseModel): primaryjoin="Customer.PrisLista==PriceList.PrisLista") KundKategori = relationship("CustomerCategory") + LanguageCodes = relationship("LanguageCodes") + + WebUsers = relationship( + WebUser, uselist=True, lazy='joined', + foreign_keys='WebUser.FtgNr', primaryjoin="Customer.FtgNr==WebUser.FtgNr") @hybrid_property def CustomerCategory(self): return self.KundKategori.KundKatBeskr if self.KundKategori else "" + @hybrid_property + def Language(self): + return self.LanguageCodes.Sprak if self.LanguageCodes else "" + class PriceList(RawBaseModel): __tablename__ = 'prh'