Stored procedure helpers. Order repo and model. More SQLService updates.
* A generic stored procedure helper added, and support for calling them. * Order and OrderItem tables added, including helpers and calls to SP for creation and updates. * Minor updates to other repositories.
This commit is contained in:
parent
b77a7069ce
commit
0af38e286e
9 changed files with 730 additions and 138 deletions
|
|
@ -1,4 +1,5 @@
|
|||
from .location import Location
|
||||
from .article import Article, ArticleCategory
|
||||
from .company import Company
|
||||
from .pricelist import PriceList
|
||||
from .pricelist import PriceList
|
||||
from .order import Order
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pyjeeves.models.raw import Article as ArticleModel, ProductClass, ArticleClass, CommodityGroup
|
||||
from pyjeeves.models import db
|
||||
from sqlalchemy.sql.expression import and_
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
|
|
@ -10,14 +11,14 @@ logger = logging.getLogger("PyJeeves." + __name__)
|
|||
|
||||
# Relocate Jeeves modules to separate folder and let a "master" module handle imports, and setup.
|
||||
class Article():
|
||||
"""Handles articles in Jeeves"""
|
||||
"""Handles articles in Jeeves, currently filters out all articles with class = 2"""
|
||||
|
||||
@staticmethod
|
||||
def get(art_no):
|
||||
""" Query an article by number """
|
||||
try:
|
||||
return ArticleModel.query.filter_by(
|
||||
ArtNr=art_no
|
||||
return db.raw.query(ArticleModel).filter_by(
|
||||
ArtNr=str(art_no)
|
||||
).one()
|
||||
except NoResultFound:
|
||||
raise KeyError
|
||||
|
|
@ -25,7 +26,29 @@ class Article():
|
|||
@staticmethod
|
||||
def get_all(filter_=and_(ArticleModel.ItemStatusCode == 0, ArticleModel.ArtKod != 2)):
|
||||
# .filter_by(ItemStatusCode=0, ArtKod=2)
|
||||
return ArticleModel.query.filter(filter_).all()
|
||||
return db.raw.query(ArticleModel).filter(filter_).all()
|
||||
|
||||
@staticmethod
|
||||
def is_salable(art_no_list=[]):
|
||||
""" Returns true if all articles are salable,
|
||||
else false with error information """
|
||||
articles = db.raw.query(ArticleModel).filter(
|
||||
and_(ArticleModel.ArtNr.in_(art_no_list))).all()
|
||||
|
||||
blocked_articles = [article.ArtNr for article in articles
|
||||
if article.ArtKod == 2 or article.ItemStatusCode != 0]
|
||||
unknown_articles = [x for x in art_no_list
|
||||
if x not in set([article.ArtNr for article in articles])]
|
||||
|
||||
if blocked_articles or unknown_articles:
|
||||
errors = {}
|
||||
if blocked_articles:
|
||||
errors['blocked_articles'] = blocked_articles
|
||||
if unknown_articles:
|
||||
errors['unknown_articles'] = unknown_articles
|
||||
return False, errors
|
||||
|
||||
return True, {}
|
||||
|
||||
|
||||
class ArticleCategory():
|
||||
|
|
@ -34,9 +57,9 @@ class ArticleCategory():
|
|||
@staticmethod
|
||||
def get_all():
|
||||
# .filter_by(ItemStatusCode=0, ArtKod=2)
|
||||
prod_classes = ProductClass.query.all()
|
||||
art_classes = ArticleClass.query.all()
|
||||
com_groups = CommodityGroup.query.all()
|
||||
prod_classes = db.raw.query(ProductClass).all()
|
||||
art_classes = db.raw.query(ArticleClass).all()
|
||||
com_groups = db.raw.query(CommodityGroup).all()
|
||||
|
||||
return {'ProductClasses': prod_classes,
|
||||
'ArticleClasses': art_classes, 'CommodityGroups': com_groups}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pyjeeves.models.raw import Company as CompanyModel, Customer as CustomerModel
|
||||
from pyjeeves.models import db
|
||||
from sqlalchemy.sql.expression import and_
|
||||
|
||||
from pyjeeves import logging
|
||||
|
|
@ -14,18 +15,18 @@ class Company():
|
|||
@staticmethod
|
||||
def get(ftg_nr):
|
||||
""" Query an article by number """
|
||||
return CompanyModel.query.filter_by(
|
||||
return db.raw.query(CompanyModel).filter_by(
|
||||
FtgNr=ftg_nr
|
||||
).one()
|
||||
|
||||
@staticmethod
|
||||
def get_all_active_customers():
|
||||
cust = CustomerModel.query.filter(and_(CustomerModel.Makulerad == 0)).all()
|
||||
cust = db.raw.query(CustomerModel).filter(and_(CustomerModel.Makulerad == 0)).all()
|
||||
return [c.CompanyModel for c in cust]
|
||||
|
||||
@staticmethod
|
||||
def get_list(ftg_nr=[]):
|
||||
return CompanyModel.query.filter(
|
||||
return db.raw.query(CompanyModel).filter(
|
||||
CompanyModel.FtgNr.in_(ftg_nr)
|
||||
).all()
|
||||
|
||||
|
|
|
|||
166
pyjeeves/repositories/order.py
Normal file
166
pyjeeves/repositories/order.py
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pyjeeves.models.raw import Order as OrderModel, OrderItem as OrderItemModel
|
||||
from pyjeeves.models import db
|
||||
|
||||
from sqlalchemy.sql.expression import and_
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
from pyjeeves import logging
|
||||
logger = logging.getLogger("PyJeeves." + __name__)
|
||||
|
||||
|
||||
# Relocate Jeeves modules to separate folder and let a "master" module handle imports, and setup.
|
||||
class Order():
|
||||
"""Handles orders in Jeeves"""
|
||||
|
||||
@staticmethod
|
||||
def get(order_no):
|
||||
""" Query an order by number """
|
||||
try:
|
||||
return db.raw.query(OrderModel).filter_by(
|
||||
OrderNr=order_no
|
||||
).one()
|
||||
except NoResultFound:
|
||||
raise KeyError
|
||||
|
||||
@staticmethod
|
||||
def get_all_unregistered_order():
|
||||
order = OrderModel.query.filter(and_(OrderModel.OrderStatusCode == 00)).all()
|
||||
return order
|
||||
|
||||
@staticmethod
|
||||
def get_list(order_no=[]):
|
||||
return db.raw.query(OrderModel).filter(
|
||||
OrderModel.OrderNr.in_(order_no)
|
||||
).all()
|
||||
|
||||
@staticmethod
|
||||
def get_all_by_company(ftg_nr=None):
|
||||
if not ftg_nr:
|
||||
raise KeyError
|
||||
return db.raw.query(OrderModel).filter(
|
||||
OrderModel.FtgNr == str(ftg_nr)
|
||||
).all()
|
||||
|
||||
@staticmethod
|
||||
def create(customer_no, head={}, items=[], web_user_name=None):
|
||||
head['CompanyNumber'] = str(customer_no)
|
||||
|
||||
# Create order from head dict to get an order number
|
||||
order, invoice_possible = OrderModel(head).create(web_user_name)
|
||||
if not order['OrderNr']:
|
||||
raise
|
||||
|
||||
# Go through order items, if any, and save them to DB.
|
||||
order['OrderItems'] = Order.create_rows(order['FtgNr'], order['OrderNr'], items)
|
||||
|
||||
# Save the information in the order object
|
||||
# Boolean argument deceides if order has contact person, and should be set 'registered'
|
||||
order.save(invoice_possible)
|
||||
|
||||
return order
|
||||
|
||||
@staticmethod
|
||||
def create_rows(company_no, order_no, items=[]):
|
||||
rv = []
|
||||
|
||||
for item in items:
|
||||
if not isinstance(item, OrderItemModel):
|
||||
item = OrderItemModel(item)
|
||||
item['OrderNr'] = order_no
|
||||
item['FtgNr'] = company_no
|
||||
rv.append(item.save())
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
logger.info("Starting TEST")
|
||||
logger.info("Testing getting an order")
|
||||
|
||||
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
|
||||
|
||||
# import os
|
||||
# os.environ['TDSDUMP'] = 'stdout'
|
||||
|
||||
# Jeeves_Esales_CreateOrder
|
||||
|
||||
# All "Jeeves_Esales_" procedures may perhaps be used?
|
||||
|
||||
# select *
|
||||
# from LKTest.information_schema.routines
|
||||
# where routine_type = 'PROCEDURE'
|
||||
# AND SPECIFIC_NAME LIKE '%Jeeves_Esales_%';
|
||||
# data = {
|
||||
# 'OrderNr': 500500,
|
||||
# 'OrdDatum': datetime.now(),
|
||||
# 'OrdTyp': 1,
|
||||
# 'FtgNr': customer_no,
|
||||
# 'OrdBerLevDat': datetime(2019, 7, 10),
|
||||
# 'ValKod': 'SEK',
|
||||
# 'OrderItems': [
|
||||
# {'ArtNr': '2005',
|
||||
# 'OrdAntal': 5.4}
|
||||
# ],
|
||||
# 'Saljare': '500',
|
||||
# 'PersSign': 'marlin',
|
||||
# 'MomsKod': 2,
|
||||
# 'BetKod': '10',
|
||||
# 'LevVillkKod': 3,
|
||||
# 'LevSattKod': 2,
|
||||
# 'LagStalle': 0,
|
||||
# 'ForetagKod': 1
|
||||
# }
|
||||
order_head = {
|
||||
'AddrCO': '',
|
||||
'AddrCity': 'Uppsala',
|
||||
'AddrCountry': 'SE',
|
||||
'AddrName': 'Lindvalls Kaffe',
|
||||
'AddrPostalCode': '751 82',
|
||||
'AddrStreet': 'Kungsgatan 60',
|
||||
'CompanyName': 'Lindvalls Kaffe AB (övrigt)',
|
||||
'CompanyNumber': '179580',
|
||||
'CustomerContact': 'Test beställning',
|
||||
'CustomerReference': 'no po number',
|
||||
'InternalInfo': 'Test order',
|
||||
'OrderNumber': 419040,
|
||||
'OrderStatusCode': 13,
|
||||
'ShippingEmail': 'order@lindvallskaffe.se',
|
||||
'ShippingInfo': 'Lev till godsmottagning',
|
||||
'ShippingPhone': '018-480 20 00',
|
||||
'ShippingSMS': '0703 25 25 02',
|
||||
'ShippingTypeCode': 4}
|
||||
order_items = [
|
||||
{'AltEnhetKod': 'Bricka5,4',
|
||||
'ArticleName': 'Lindvalls Mellanrost',
|
||||
'ArticleNumber': '2003',
|
||||
'OrdAntalAltEnh': '1.00',
|
||||
'OrderRowNumber': 10,
|
||||
'UnitAmount': '5.40',
|
||||
'UnitPrice': '92.00'},
|
||||
{'AltEnhetKod': 'Bricka5,4',
|
||||
'ArticleName': 'Lindvalls Mellanrost',
|
||||
'ArticleNumber': '2003',
|
||||
'OrdAntalAltEnh': 1.666666667,
|
||||
'OrderRowNumber': 20,
|
||||
'UnitAmount': '9.00',
|
||||
'UnitPrice': '92.00'},
|
||||
{'AltEnhetKod': 'Bricka5,4',
|
||||
'ArticleName': 'Lindvalls Mellanrost',
|
||||
'ArticleNumber': '2003',
|
||||
'OrdAntalAltEnh': '5.00',
|
||||
'OrderRowNumber': 30,
|
||||
'UnitAmount': '27.00',
|
||||
'UnitPrice': '92.00'}]
|
||||
|
||||
# print(Order.get_list(['406569', '179580', '2440070', '179584']))
|
||||
from pprint import pprint
|
||||
# pprint(Order.get(7000028).to_dict())
|
||||
pprint(Order.create('179584', order_head, order_items).to_dict())
|
||||
# pprint(Order.get('419033').to_dict())
|
||||
|
||||
# c1 = CompanyModel.query.filter_by(FtgNr="406569").first()
|
||||
# print(c1)
|
||||
# logger.info(c1.json)
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pyjeeves.models.raw import PriceList as PriceListModel
|
||||
from pyjeeves.models import db
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
from pyjeeves import logging
|
||||
|
|
@ -15,7 +16,7 @@ class PriceList():
|
|||
def get(price_list_no):
|
||||
""" Query a price list by number """
|
||||
try:
|
||||
return PriceListModel.query.filter_by(
|
||||
return db.raw.query(PriceListModel).filter_by(
|
||||
PrisLista=price_list_no
|
||||
).one()
|
||||
except NoResultFound:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue