#
# CRM Customer GET and GETLIST model
#
import base64
from datetime import datetime
from model import RfcModel, EnhancedRfcModel
from fields import Char, Date, Struct, Many, NumC, Decimal, String, Boolean, Time, Exception_, Single
class ETReturn(RfcModel):
"""Error Messages"""
id_ = Char(20, name="ID" ) # Message Class
type_ = Char(1, name="TYPE" ) # Message type: S Success, E Error, W Warning, I Info, A Abort
number = NumC(3, name="NUMBER" ) # Message Number
system = Char(10, name="SYSTEM" ) # Logical system from which message originates
parameter = Char(32, name="PARAMETER" ) # Parameter Name
field = Char(30, name="FIELD" ) # Field in parameter
message = Char(220, name="MESSAGE" ) # Message Text
message_v1 = Char(50, name="MESSAGE_V1") # Message Variable
message_v2 = Char(50, name="MESSAGE_V2") # Message Variable
message_v3 = Char(50, name="MESSAGE_V3") # Message Variable
message_v4 = Char(50, name="MESSAGE_V4") # Message Variable
log_no = Char(20, name="LOG_NO" ) # Application log: log number
log_msg_no = NumC(6, name="LOG_MSG_NO") # Application log: Internal message serial number
row = NumC(4, name="ROW" ) # Lines in parameter
def __str__(self):
return "{message} (Msg {number})".format(**self.__dict__)
class CustomerDetail(RfcModel):
"""Customer Account details"""
id = Char(10, name="KUNNR" ) # Customer Number
name = Char(35, name="NAME1" ) # Name 1
city = Char(35, name="ORT01" ) # City
zip = Char(10, name="PSTLZ" ) # Postal Code
street = Char(35, name="STRAS" ) # House number and street
email = Char(241, name="SMTP_ADDR") # E-Mail Address
card_id = Char(25, name="CARD_ID" ) # External Card ID
def __repr__(self):
return "<CustomerDetail> " + str(self.__dict__)
class CustomerDetails(RfcModel):
"""Customer Account details"""
id = Char(10, name="KUNNR" ) # Customer Number
name = Char(35, name="NAME1" ) # Name 1
city = Char(35, name="ORT01" ) # City
zip = Char(10, name="PSTLZ" ) # Postal Code
street = Char(35, name="STRAS" ) # House number and street
email = Char(241, name="SMTP_ADDR") # E-Mail Address
card_id = Char(25, name="CARD_ID" ) # External Card ID
def __repr__(self):
return "<CustomerDetails> " + str(self.__dict__)
class CustomerLoyalty(RfcModel):
"""Customer loyalty program"""
name = Char (40, name="PROGRAM" ) # Text, 40 Characters Long
tires = Char (40, name="TIRES" ) # Text, 40 Characters Long
status = Char (40, name="STATUS" ) # Text, 40 Characters Long
start_date = Date ( name="START_DATE") # Date
end_date = Date ( name="END_DATE" ) # Date
balance = Decimal(6, name="POINT_BAL" ) # Number of Points
description = Char (40, name="PROG_DESCR") # Language-Dependent Short Text
def __repr__(self):
return "<CustomerLoyalty> " + str(self.__dict__)
class Customer(EnhancedRfcModel):
"""ZFRS_CUSTOMER_GET Model """
id = Char(10, name="IV_CUSTOMER" ) # Business Partner ID
card_id = Char(25, name="IV_CARD_ID", optional=True) # External Card ID
firstname = Char(40, name="IV_NAME_FIRST" ) # First Name of Business Partner (Person)
lastname = Char(40, name="IV_NAME_LAST" ) # Last Name of Business Partner (Person)
raw_image = String(0, name="EV_FOTO", optional=True) # Foto
url = Char (452, name="EV_URI", optional=True) # SAP URL
details = Struct(CustomerDetail, name="ES_CUSTOMER_DETAIL", optional=True) # Account data
search_results = Many (CustomerDetails, name="ET_CUSTOMER_DATA", optional=True)
loyalties = Many (CustomerLoyalty, name="ET_LOY_DATA", optional=True) # Loyalty data
es_return = Struct(ETReturn, name="ES_RETURN" ) # Return Parameter
def __json__(self):
"""One customer details as JSON (Customer GET)"""
# not found or another error
if self.es_return.type_ in ['A','E']:
result={}
for key in ('id_', 'type_', 'number', 'message'):
result[key] = getattr(self.es_return, key)
return result
# customer account found
result = {
'image': len(self.image) if self.image else None,
'image_type': 'image/jpeg' if self.image else None,
'url': self.url
}
# customer details
for key in ('id', 'name', 'city', 'zip', 'street', 'email', 'card_id'):
result[key] = getattr(self.details, key)
# loyalty infos
level = ''
if self.loyalties:
level = self.loyalties[0].tires # TODO, for now just take the first level found
result['loyalty'] = {
'points': 0,
'level': level,
'sets': []
}
for loy in self.loyalties:
loyalty = {
'start_date': datetime.strftime(loy.start_date, '%d.%m.%Y'),
'end_date': datetime.strftime(loy.end_date, '%d.%m.%Y'),
}
for key in ('name', 'description', 'tires', 'status', 'balance'):
loyalty[key] = getattr(loy, key)
result['loyalty']['sets'].append(loyalty)
if loy.balance:
result['loyalty']['points'] += loy.balance
return result
def __json_list__(self):
"""Customer list search result as JSON (Customer GETLIST)"""
# error check
if self.es_return.type_ in ['A','E']:
result={}
for key in ('id_', 'type_', 'number', 'message'):
result[key] = getattr(self.es_return, key)
return result
result = []
for customer in self.search_results:
result.append(
{key: getattr(customer, key) for key in (
'id', 'name', 'city', 'zip', 'street', 'email', 'card_id')})
return {'customers': result}
@classmethod
def get(cls, conn, id='', card_id='', firstname='', lastname='', **params):
result = conn.call("ZFRS_CUSTOMER_GET",
**cls.rfc_fields(id=id,
card_id=card_id,
firstname=firstname,
lastname=lastname,
**params))
return cls.init_from_rfc(result)
@classmethod
def search(cls, conn, id='', firstname='', lastname='', **params):
result = conn.call("ZFRS_CUSTOMER_GETLIST",
**cls.rfc_fields(id=id,
firstname=firstname,
lastname=lastname,
**params))
return cls.init_from_rfc(result)
@property
def image(self):
return base64.b64encode(self.raw_image.rstrip("\x00"))
app.py
from sapnwrfc2 import Connection
import customermodel
# Connect to SAP CRM
params = {'user' : 'sb-test',
'passwd' : 'sb-test',
'ashost' : '10.117.24.153',
'saprouter' : '/H/203.13.155.17/W/xjkb3d/H/172.19.137.194/H/',
'sysnr' : '00',
'client' : '765',
'lang' : 'EN'}
print 'Connecting ...', params['ashost']
conn = Connection(config={'return_import_params': True}, **params)
# Serve web app
print 'Serve ...'
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def index():
response = """
<HTML><HEAD><TITLE>Customer</TITLE></HEAD>
<BODY>
<h1>Usage examples</h1>
<p></p>
<p>/customer/710160</p>
<p></p>
<p>/customerlist?lastname=Crimson</p>
</BODY></HTML>
"""
return response
@app.route("/customer/<id>")
def get(id=None):
customer_by_id = Customer.get(conn, id=id)
response = str(customer_by_id.__json__())
return response
@app.route("/customerlist")
def getlist(lastname=None):
for header in request.headers:
print header
id = request.args.get('id')
if id == None:
id = ''
lastname = request.args.get('lastname')
if lastname == None:
lastname = ''
firstname = request.args.get('firstname')
if firstname == None:
firstname = ''
customerlist = Customer.search(conn, id=id, firstname=firstname, lastname=lastname)
response = str(customerlist.__json_list__())
return response
if __name__ == "__main__":
app.run(debug=True, port=5000)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
3 | |
3 | |
2 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 |