PyJeeves/pyjeeves/repositories/order.py
Marcus Lindvall 0af38e286e 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.
2019-08-30 12:09:10 +02:00

166 lines
5 KiB
Python

# -*- 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)