Guest User

Untitled

a guest
Jun 20th, 2017
1,041
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 138.95 KB | None | 0 0
  1. #!/var/beacon/clr/bin/python
  2. # coding: utf-8
  3. #############################################################################################################################################################################################
  4. #                                                                                                                                                                                           #
  5. #                         RATATOSKR WEB SERVICES 1.01                                                                                                                                       #
  6. #                                                                                                                                                                                           #
  7. #############################################################################################################################################################################################
  8. ###################################################################t##########################################################################################################################
  9. #                                                                                                                                                                                           #
  10. #                         BLOCK OF LIBRARIES                                                                                                                                             #
  11. #                                                                                                                                                                                           #
  12. #############################################################################################################################################################################################
  13.  
  14. from flask import Flask, jsonify, abort,make_response,request,json
  15. from celery import Celery
  16. from celery.result import ResultBase, AsyncResult
  17. from time import gmtime, strftime,strptime
  18. from ctasks import rabbitmq_add,mysql_select,mssql_select,call_rtdm,call_service,transgen,post,facetztask
  19. from datetime import timedelta,datetime
  20. from flask import make_response, request, current_app
  21. from functools import update_wrapper
  22. from random import randint,choice
  23. from celery.task.control import revoke
  24. import copy
  25. import datetime
  26. import time
  27. import pika
  28. import requests
  29. import MySQLdb
  30. import pymssql
  31. import psycopg2
  32. import urllib
  33. import re
  34. import base64
  35. import zmq
  36.  
  37.  
  38. ########################__CYRILLIC SYMBOLS SUPPORT__##########
  39. import sys
  40. reload(sys)
  41. sys.setdefaultencoding('utf-8')
  42. ##############################################################
  43. ########################__DURABLE STORE__#####################
  44. import redis
  45. import pickle
  46. dur = redis.StrictRedis(host='localhost',port=6379,db=0)
  47. ##############################################################
  48.  
  49.  
  50. #############################################################################################################################################################################################
  51. #                                                                                                                                                                                           #
  52. #                         BLOCK OF GLOBAL VARIABLES                                                                                                                                         #
  53. #                                                                                                                                                                                           #
  54. ############################################################################################################################################################################################
  55. server_ip = '10.20.1.21'
  56.  
  57. app_server = "10.20.1.30:7980"
  58. web_server = "labinfo.sas-mic.local"
  59. soa_server = "10.20.1.21:5000"
  60.  
  61. sync = 1
  62. freq_in = 15
  63. freq_out = 10
  64. freq_sync = 20
  65.  
  66. rtdmpath = '10.20.1.30:7980'
  67. mssqlpath = '10.20.1.192'
  68. mysqlpath = '10.20.1.20'
  69. lunapath= '10.20.1.22'
  70.  
  71. #############################################################################################################################################################################################
  72. #                                                                                                                                                                                           #
  73. #                         BLOCK OF COMMON FUNCTIONS                                                                                                                                         #
  74. #                                                                                                                                                                                           #
  75. #############################################################################################################################################################################################
  76.  
  77. tvoffer = {'Title': 'ZoomZoom', 'Forename': 'ZoomZoom', 'Surname': 'ZoomZoom', 'OfferName': 'ZoomZoom', 'OfferDesc': 'ZoomZoom'}
  78. red_tvoffer_def = dur.set('tvoffer_tmp_def',json.dumps(tvoffer))
  79. red_tvflag = dur.set('tvflagpar',json.dumps(0))
  80. #Head decorator
  81. def crossdomain(origin=None, methods=None, headers=None,max_age=21600, attach_to_all=True,automatic_options=True, content=None):
  82.     if methods is not None:
  83.         methods = ', '.join(sorted(x.upper() for x in methods))
  84.     if headers is not None and not isinstance(headers, basestring):
  85.         headers = ', '.join(x.upper() for x in headers)
  86.     if not isinstance(origin, basestring):
  87.         origin = ', '.join(origin)
  88.     if isinstance(max_age, timedelta):
  89.         max_age = max_age.total_seconds()
  90.  
  91.     def get_methods():
  92.         if methods is not None:
  93.             return methods
  94.  
  95.         options_resp = current_app.make_default_options_response()
  96.         return options_resp.headers['allow']
  97.  
  98.     def decorator(f):
  99.         def wrapped_function(*args, **kwargs):
  100.             if automatic_options and request.method == 'OPTIONS':
  101.                 resp = current_app.make_default_options_response()
  102.             else:
  103.                 resp = make_response(f(*args, **kwargs))
  104.             if not attach_to_all and request.method != 'OPTIONS':
  105.                 return resp
  106.  
  107.             h = resp.headers
  108.  
  109.             h['Content-Type'] = content
  110.  
  111.             h['Access-Control-Allow-Origin'] = origin
  112.             h['Access-Control-Allow-Headers'] = headers
  113.             h['Access-Control-Allow-Methods'] = get_methods()
  114.             h['Access-Control-Max-Age'] = str(max_age)
  115.             if headers is not None:
  116.                 h['Access-Control-Allow-Headers'] = headers
  117.             return resp
  118.  
  119.         f.provide_automatic_options = False
  120.         return update_wrapper(wrapped_function, f)
  121.     return decorator
  122.  
  123.  
  124. #Celery initiator
  125. def make_celery(app):
  126.     celery = Celery(app.import_name)
  127.     celery.config_from_object('celeryconfig')
  128.     TaskBase = celery.Task
  129.     class ContextTask(TaskBase):
  130.         abstract = True
  131.         def __call__(self, *args, **kwargs):
  132.             with app.app_context():
  133.                 return TaskBase.__call__(self, *args, **kwargs)
  134.     celery.Task = ContextTask
  135.     return celery
  136.  
  137. #Get client information
  138. def get_client(cid):
  139.     db = MySQLdb.connect(host=mysqlpath, port = 3306, user="rusrat",passwd="Orion123", db="thebankfront",use_unicode = True,charset='UTF8')
  140.     cur = db.cursor()
  141.     query = "SELECT * FROM customers where CID="+str(cid)
  142.     cur.execute(query)
  143.     photoid = 0
  144.     for row in cur.fetchall():
  145.         output = row
  146.     return output
  147.  
  148.  
  149.  
  150.  
  151. #Get client info by photoID
  152. def get_cid_byphotoid(photoid):
  153.     db = MySQLdb.connect(host=mysqlpath, port = 3306, user="rusrat",passwd="Orion123", db="thebankfront")
  154.     cur = db.cursor()
  155.     query = "SELECT * FROM customers where PhotoID="+str(photoid)
  156.     cur.execute(query)
  157.     cid = 0
  158.     for row in cur.fetchall():
  159.         cid = row[0]
  160.    
  161.     return cid
  162.  
  163.    
  164. #Get all clients info
  165. def get_all_clients():
  166.     db = MySQLdb.connect(host=mysqlpath, port = 3306, user="rusrat",passwd="Orion123", db="thebankfront")
  167.     cur = db.cursor()
  168.     query = "SELECT * FROM customers where PhotoId > 0"
  169.     cur.execute(query)
  170.     list_of_images = []
  171.     for row in cur.fetchall():
  172.         list_of_images.append(int(row[26]))
  173.     return list_of_images
  174.  
  175. #Get latest event in PostreSQL
  176. def get_max_eventid_luna():
  177.     db = psycopg2.connect(host=lunapath, port = 5432, user="testuser",password="password", dbname="FaceStreamRecognizer")
  178.     cur = db.cursor()
  179.     query2 = "SELECT MAX(event_id) FROM event"
  180.     cur.execute(query2)
  181.     data = cur.fetchone()
  182.     max_eventid = data[0]
  183.     return max_eventid
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190. #Server start
  191. app = Flask(__name__)
  192. app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
  193. app.config['CELERY_TASK_SERIALIZER'] = 'pickle'
  194. app.config['CELERY_ACCEPT_CONTENT'] = 'pickle'
  195.  
  196. app.config.update(
  197.     #BROKER_URL='amqp://guest:guest@localhost:5672//'
  198.     BROKER_URL='redis://localhost:6379/0'
  199.  )
  200.  
  201. celery = make_celery(app)
  202.  
  203.  
  204. @app.route('/dbtest', methods=['POST','GET','OPTIONS'])
  205. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  206. def get_clientu2():
  207.     a = get_client(150001)
  208.     return make_response(jsonify({a}),201)
  209.  
  210.  
  211.  
  212.  
  213. #############################################################################################################################################################################################
  214. #                                                                                                                                                                                           #
  215. #                         BLOCK OF WEATHER                                                                                                                                                  #
  216. #                                                                                                                                                                                           #
  217. #############################################################################################################################################################################################
  218. @app.route('/get_weather', methods=['POST','GET','OPTIONS'])
  219. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  220. def get_weather_req():
  221.    
  222.     path = "http://api.openweathermap.org/data/2.5/weather?id=524901&appid=09cda0bdfa4c642423f71855fe933cfa&units=metric"
  223.     bool_tmp = dur.set('req_path',path)
  224.     try:
  225.         r = requests.get(dur.get('req_path'))
  226.         answer = r.content
  227.         json_ans = json.loads(answer)
  228.         weather = json_ans["weather"][0]["main"]
  229.         temp = json_ans["main"]["temp"]
  230.     except:
  231.         return make_response(jsonify({'Ratatoskr':'connection error'}),404)  
  232.     return make_response(jsonify({'weather':weather,'temp':temp}),200)
  233.  
  234. #############################################################################################################################################################################################
  235. #                                                                                                                                                                                           #
  236. #                         BLOCK OF SAS_Activity_echo_string                                                                                                                                                 #
  237. #                                                                                                                                                                                           #
  238. #############################################################################################################################################################################################
  239. @app.route('/SAS_Activity_echo_string', methods=['POST','GET','OPTIONS'])
  240. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  241. def SAS_Activity_echo_string():
  242.    
  243.     try:
  244.         in_string = request.json['in_string']
  245.     except:
  246.         return make_response(jsonify({'ContactPolicy':'Incorrect input'}),418)
  247.     inputs={"in_string":in_string}
  248.     dns = "10.20.1.30:7980"
  249.     event = "SAS_Activity_echo_string"
  250.     rtdm_addr = "http://"+dns+"/RTDM/rest/runtime/decisions/"+event
  251.     payload = {"clientTimeZone":"Europe/Moscow","version":1,"inputs":inputs}    
  252.     try:
  253.         r = requests.post(rtdm_addr,json = payload)
  254.         resp = str(r)
  255.     except Exception as e:
  256.         return make_response(jsonify({'ContactPolicy':e}),400)
  257.     return make_response(jsonify(r.json()),201)    
  258.    
  259. #############################################################################################################################################################################################
  260. #                                                                                                                                                                                           #
  261. #                         BLOCK OF SERVICES                                                                                                                                                 #
  262. #                                                                                                                                                                                           #
  263. #source /var/beacon/clr/bin/activate                                                                                                                                                        #
  264. #cd /var/beacon/clr/scripts                                                                                                                                                                 #
  265. #############################################################################################################################################################################################
  266.  
  267.  
  268. @app.route('/zmqs', methods=['POST','GET','OPTIONS'])
  269. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  270. def zmqs():
  271.     context = zmq.Context()
  272.     reciever = context.socket(zmq.PULL)
  273.     reciever.connect("tcp://10.20.1.24:80")
  274.     res = reciever.recv_json()
  275.     return make_response(jsonify({"Ratatoskr":'ok'}),201)
  276.  
  277.  
  278. @app.route('/nbo', methods=['POST','GET','OPTIONS'])
  279. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  280. def get_nbo_req():
  281.    
  282.     cid = request.json["cid"]
  283.     channel = request.json["channel"]
  284.     context = request.json["context"]
  285.     device = request.json["device"]
  286.     regtime = request.json["regtime"]
  287.     reqtime = request.json["reqtime"]
  288.     timezone = request.json["timezone"]
  289.     param1 = request.json["param1"]
  290.     param2 = request.json["param2"]
  291.     param3 = request.json["param3"]
  292.     param4 = request.json["param4"]
  293.     param5 = request.json["param5"]
  294.     param6 = request.json["param6"]
  295.     param7 = request.json["param7"]
  296.    
  297.     inputs = {"cid":cid,"channel":channel,"context":context,"device":device,"regtime":regtime,"reqtime":reqtime,"timezone":timezone,"param1":param1,
  298. "param2":param2,"param3":param3,"param4":param4,"param5":param5,"param6":param6,"param7":param7}
  299.    
  300.  
  301.     event = "nboevent"
  302.     rtdm_addr = "http://"+rtdmpath+"/RTDM/rest/runtime/decisions/"+event
  303.     payload = {"clientTimeZone":"Europe/Moscow","version":1,"inputs":inputs}
  304.     r = requests.post(rtdm_addr,json = payload)
  305.     resp = str(r)
  306.     return make_response(jsonify({"Ratatoskr":r.json()}),201)
  307.  
  308.  
  309.  
  310.  
  311.  
  312. @app.route('/geotrigger', methods=['POST','GET','OPTIONS'])
  313. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  314. def geotrigger():
  315.     try:
  316.         cid =  request.json["cid"]
  317.         scenario = request.json["scenario"]
  318.         beaconid =  request.json["beaconid"]
  319.         trigger = request.json["trigger"]  
  320.         spotid =  request.json["spotid"]
  321.         spotname =  request.json["spotname"]
  322.         time =  request.json["time"]
  323.         Geo = {
  324.         'cid' :  int(cid) ,
  325.         'scenario' : scenario,
  326.         'beaconid' :  beaconid ,
  327.         'spotid' :  int(spotid),
  328.         'spotname' : spotname,
  329.         'time' :  datetime.datetime.strptime(time,"%d.%m.%Y %H:%M:%S").isoformat(sep='T'),
  330.         'trigger':trigger}
  331.     except Exception as e:
  332.         return make_response(jsonify({'Ratatoskr':'Incorrect input.Details:'+str(e)}),415)    
  333.     try:
  334.         result_mysql_custdet = mysql_select('thebankfront','FirstName,MiddleName,LastName,CAST(DateOfBirth AS CHAR) ','customers',"CID="+str(cid))
  335.     except Exception as e:
  336.         return make_response(jsonify({'Ratatoskr':'SQL request seems to be incorrect. Here are details:'+str(e)}),416)
  337.     if spotname == "The Bank":
  338.         area = "bank"
  339.     elif spotname == "The Store":
  340.         area = "retail"
  341.     else:
  342.         area = "sasrussia"
  343.     if trigger != 'Luna':
  344.         for row in result_mysql_custdet:
  345.             payload = {"name":row[0],"surname":row[2],"middlename":row[1],"dob":str(row[3]),"id":cid,"status":"processing","reason":600,"location":spotname,"area":area}
  346.         try:
  347.             result = call_service.apply_async(("active_queue",payload),retry=True)    
  348.         except Exception as e:
  349.             return make_response(jsonify({'Ratatoskr':'Some problems with python queue service.Further details: '+str(e)}),417)  
  350.     try:
  351.         rtdm = call_rtdm.apply_async((rtdmpath,"geomainevent",Geo),retry=True)      
  352.     except Exception as e:
  353.         return make_response(jsonify({'Ratatoskr':'Some problems with RTDM request.Further details: '+str(e)}),418)    
  354.     return make_response(jsonify({'Ratatoskr':str(rtdm)}),200)
  355.  
  356.  
  357.  
  358. #############################################################################################################################################################################################
  359. #                                                                                                                                                                                           #
  360. #                         BLOCK OF /EMAIL                                                                                                                                            #
  361. #                                                                                                                                                                                           #
  362. #####################################################################################################################################################
  363. @app.route('/email', methods=['POST','GET','OPTIONS'])
  364. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  365. def email():
  366.     try:
  367.         apikey =  request.args.get("apikey")
  368.         subject = request.args.get("subject")
  369.         fromw = request.args.get("from")
  370.         from_name = request.args.get("from_name")
  371.         tow = request.args.get("to")
  372.         charset = request.args.get("charset")
  373.         template = request.args.get("template")
  374.         merge_title =  request.args.get("merge_title")
  375.         merge_firstname = request.args.get("merge_firstname")
  376.         merge_lastname = request.args.get("merge_lastname")
  377.         merge_websiteurl = json.loads(request.args.get("merge_websiteurl"))
  378.         if 'Credit_Card' in template:
  379.             OfferImg = merge_websiteurl["offerimg"]
  380.             MainTxt = merge_websiteurl["maintxt"]
  381.             DescTxt = merge_websiteurl["desctxt"]
  382.             FName = merge_websiteurl["name"]
  383.             LName = merge_websiteurl["lname"]
  384.             MName = merge_websiteurl["mname"]
  385.             ID = merge_websiteurl["id"]
  386.             LangCode = merge_websiteurl["lang"]        
  387.             url = "http://thebank.sas-mic.local/CreditScoring/creditcard.php%3Fofferimg="+OfferImg+"%26maintxt="+MainTxt+"%26desctxt="+DescTxt+"%26lname="+LName+"%26name="+FName+"%26mname="+MName+"%26id="+ID+"%26lang="+LangCode
  388.         if 'iPhone7_' in template:
  389.             Route = merge_websiteurl["route"]
  390.             Path = merge_websiteurl["path"]
  391.             Product = merge_websiteurl["product"]
  392.             url = "http://thestore.sas-mic.ru/index.php%3F"+Route+"%26"+Path+"%26"+Product
  393.         if 'Travel_Insurance' in template:
  394.             ID = merge_websiteurl["id"]
  395.             Title = merge_websiteurl["Title"]
  396.             FName = merge_websiteurl["name"]
  397.             LName = merge_websiteurl["lname"]
  398.             MName = merge_websiteurl["mname"]
  399.             LangCode = merge_websiteurl["lang"]
  400.             db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  401.             cur = db.cursor()
  402.             cur.execute("SELECT OfferID FROM [DataMart].[OFFER] WHERE IndivID="+str(ID)+" AND ProdID='5'")
  403.             offerid = cur.fetchone()[0]
  404.             url = "http://thebank.sas-mic.local/insurance.php%3Ftitle="+Title+"%26fname="+FName+"%26lname="+LName+"%26mname="+MName+"%26id="+ID+"%26lang="+LangCode+"%26offerid="+str(offerid)
  405.         print url
  406.     except Exception  as e:
  407.         return make_response(jsonify({'Ratatoskr':e}),415)
  408.     path = "https://api.elasticemail.com/v2/email/send?apikey="+apikey+"&subject="+subject+"&from="+fromw+"&from_name="+from_name+"&to="+tow+"&charset="+charset+"&template="+template+"&merge_title="+merge_title+"&merge_firstname="+merge_firstname+"&merge_lastname="+merge_lastname+"&merge_websiteurl="+url
  409.     bool_tmp = dur.set('req_path',path)
  410.     try:
  411.         r = requests.get(dur.get('req_path'))
  412.         answer = r.content
  413.     except:
  414.         return make_response(jsonify({'Ratatoskr':'connection error'}),404)  
  415.     return make_response(jsonify({'Ratatoskr':answer}),200)
  416.  
  417.  
  418. ###########################################################################
  419. #                                                                         #
  420. #                         BLOCK OF /Cameracheck                           #
  421. #                                                                         #
  422. ###########################################################################
  423.  
  424. bool_tmp = dur.set('lunapar',json.dumps(0))
  425. #Start LUNA with OFF status. It should be switched ON in front office services menu.
  426.  
  427. @app.route('/cameracheck', methods=['POST','GET','OPTIONS'])
  428. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  429. def camparam():
  430.      param = request.args.get('param')
  431.      if param == 'True':
  432.          bool_tmp = dur.set('lunapar',json.dumps(1))
  433.          maxid = get_max_eventid_luna()
  434.          resultcam = post.apply_async([maxid])  
  435.      else:
  436.          bool_tmp = dur.set('lunapar',json.dumps(0))
  437.      return make_response(jsonify({'Cameracheck':json.loads(dur.get('lunapar'))}),200)
  438.  
  439.  
  440. #############################################################################################################################################################################################
  441. #                                                                                                                                                                                           #
  442. #                         BLOCK OF /Color Scheme                                                                                                                                     #
  443. #                                                                                                                                                                                           #
  444. #####################################################################################################################################################
  445.  
  446. bool_tmp = dur.set('SchemeColor',json.dumps({"Front":"rgb(91, 155, 213)","Retail":"rgb(251, 164, 78)"}))
  447.  
  448. @app.route('/color', methods=['POST','GET','OPTIONS'])
  449. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  450. def color():
  451.     if request.method == 'GET':
  452.         return make_response(jsonify({'Color':json.loads(dur.get('SchemeColor'))}),200)
  453.     if request.method == 'POST':
  454.         try:
  455.             context = request.json['context']
  456.             color = request.json['color']
  457.         except:
  458.             return make_response(jsonify({'Color':'Invalid color input'}),400)
  459.         dur_tmp = json.loads(dur.get('SchemeColor'))
  460.         dur_tmp[context] = color
  461.         bool_tmp = dur.set('SchemeColor',json.dumps(dur_tmp))
  462.         return make_response(jsonify({'Color':'Color was successfully changed'}),200)
  463.  
  464.  
  465. #############################################################################################################################################################################################
  466. #                                                                                                                                                                                           #
  467. #                         BLOCK OF /CredCardApp                                                                                                                                  #
  468. #                                                                                                                                                                                           #
  469. #####################################################################################################################################################
  470. @app.route('/CredCardApp', methods=['POST','GET','OPTIONS'])
  471. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  472. def CredCardApp():
  473.     try:
  474.         cost = request.json["cost"]
  475.         limitpoints = request.json["limitpoints"]
  476.         mycat = request.json["mycat"]
  477.         country = request.json["country"]
  478.         table = request.json["table"]
  479.     except:
  480.         return make_response(jsonify({'CredCardApp':'Incorrect input'}),400)
  481.     url = "http://10.20.1.190/SASBIWS/services/CreditCardApp_WebService"
  482.     headers = {'content-type':'text/xml'}
  483.     body = """
  484.           <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cred="http://tempuri.org/CreditCardApp_WebService">
  485.           <soapenv:Header/>
  486.           <soapenv:Body>
  487.           <cred:creditCardApp_StoredProcces>
  488.           <cred:parameters>
  489.               <!--Optional:-->
  490.               <cred:cost>"""+str(cost)+"""</cred:cost>
  491.               <!--Optional:-->
  492.               <cred:limitpoints>"""+str(limitpoints)+"""</cred:limitpoints>
  493.               <!--Optional:-->
  494.               <cred:mycat>"""+mycat+"""</cred:mycat>
  495.               <!--Optional:-->
  496.               <cred:country>"""+country+"""</cred:country>
  497.               <!--Optional:-->
  498.               <cred:table>"""+table+"""</cred:table>
  499.           </cred:parameters>
  500.           </cred:creditCardApp_StoredProcces>
  501.           </soapenv:Body>
  502.           </soapenv:Envelope>
  503.           """
  504.     try:
  505.         response = requests.post(url,data=body,headers=headers)
  506.     except Exception as e:
  507.         return make_response(jsonify({'CredCardApp':e}),400)
  508.     Miles = {}
  509.     Points = {}
  510.     Cashback = {}
  511.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  512.     cur = db.cursor()
  513.     cur.execute("SELECT Id,Maintenance,Miles,Cash,Cashback,Points from [RTData].[CardSetId] WHERE Type = 'M'")
  514.     data = cur.fetchone()
  515.     if data is not None:
  516.         Miles = {"Id":data[0],"Maintenance":data[1],"Miles":data[2],"Cash":data[3]}
  517.     cur.execute("SELECT Id,Maintenance,Miles,Cash,Cashback,Points from [RTData].[CardSetId] WHERE Type = 'P'")
  518.     data = cur.fetchone()
  519.     if data is not None:
  520.         Points = {"Id":data[0],"Maintenance":data[1],"Points":data[5]}
  521.     cur.execute("SELECT Id,Maintenance,Miles,Cash,Cashback,Points from [RTData].[CardSetId] WHERE Type = 'C'")
  522.     data = cur.fetchone()
  523.     if data is not None:
  524.         Cashback = {"Id":data[0],"Maintenance":data[1],"Cashback":data[4]}
  525.     Output = {"Miles":Miles,"Points":Points,"Cashback":Cashback}
  526.     return make_response(jsonify({'CredCardApp':Output}),200)
  527. #############################################################################################################################################################################################
  528. #                                                                                                                                                                                           #
  529. #                         BLOCK OF /ESP UPDATE                                                                                                                                    #
  530. #                                                                                                                                                                                           #
  531. #####################################################################################################################################################
  532. @app.route('/updateesp', methods=['POST','GET','OPTIONS'])
  533. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  534. def espupdt():
  535.     try:
  536.         CardID = request.args.get('CardID')
  537.         CardNumber = request.args.get('CardNumber')
  538.         AccountID = request.args.get('AccountID')
  539.         IndivID = request.args.get('IndivID')
  540.         CardPin = request.args.get('CardPin')
  541.         CardCVC = request.args.get('CardCVC')
  542.         CardType = request.args.get('CardType')
  543.         CardType2 = request.args.get('CardType2')
  544.         CardValidFrom = "2019-08-21 21:00:00.00000000"
  545.         CardValidTo = "2019-08-21 21:00:00.00000000"
  546.         CardStatus = request.args.get('CardStatus')
  547.         CardCashLimit = request.args.get('CardCashLImit')
  548.         CardParam1 = request.args.get('CardParam1')
  549.         CardParam2 = request.args.get('CardParam2')
  550.         CardParam3 = request.args.get('CardParam3')
  551.         CardParam4 = request.args.get('CardParam4')
  552.  
  553.         AccountValidFrom = "2019-08-21 21:00:00.00000000"
  554.         AccountValidTo = "2019-08-21 21:00:00.00000000"
  555.         AccountBalance = request.args.get('AccountBalance')
  556.         AccountPrice = request.args.get('AccountPrice')
  557.         ProdDetID = request.args.get('ProdDetID')
  558.         AccountType = request.args.get('AccountType')
  559.         AccountStatus = request.args.get('AccountStatus')
  560.         AccountAmount = request.args.get('AccountAmount')
  561.         AccountPayment = request.args.get('AccountPayment')
  562.         AccountParam1 = request.args.get('AccountParam1')
  563.         AccountParam2 = request.args.get('AccountParam2')
  564.         AccountParam3 = request.args.get('AccountParam3')
  565.         AccountParam4 = request.args.get('AccountParam4')
  566.         HHoldID = request.args.get('HHoldID')
  567.         Title = request.args.get('Title')
  568.         Forename = request.args.get('Forename')
  569.         Surname = request.args.get('Surename')
  570.         Phone = request.args.get('Phone')
  571.         Mobile = request.args.get('Mobile')
  572.         Fax = request.args.get('Fax')
  573.         Email = request.args.get('Email')
  574.         CustomerSince = "2019-08-21 21:00:00.00000000"
  575.         STATUS = request.args.get('STATUS')
  576.         Birthdate = "2019-08-21 21:00:00.00000000"
  577.         Agent = request.args.get('Agent')
  578.         MarketingSegment = request.args.get('MarketingSegment')
  579.         Random = request.args.get('Random')
  580.         Middlename = request.args.get('Middlename')
  581.         PhotoID = request.args.get('PhotoID')
  582.         VipFlag = request.args.get('VipFlag')
  583.         IndivParam1 = request.args.get('IndivParam1')
  584.         IndivParam2 = request.args.get('IndivParam2')
  585.         IndivParam3 = request.args.get('IndivParam3')
  586.         IndivParam4 = request.args.get('IndivParam4')
  587.         ProdDetName = request.args.get('ProdDetName')
  588.         ProdID = request.args.get('ProdID')
  589.         ProdDetDesc = request.args.get('ProdDetDesc')
  590.         ProdDetImgID = request.args.get('ProdDetImgID')
  591.         ProdDetPrice = request.args.get('ProdDetPrice')
  592.         ProdDetStatus= request.args.get('ProdDetStatus')
  593.         ProdDetRate= request.args.get('ProdDetRate')
  594.         ProdDetAmount= request.args.get('ProdDetAmount')
  595.         ProdDetPayment= request.args.get('ProdDetPayment')
  596.         ProdDetBalance= request.args.get('ProdDetBalance')
  597.         ProdDetLimit= request.args.get('ProdDetLimit')
  598.         ProdDetPeriod= request.args.get('ProdDetPeriod')
  599.         CashBackRate= request.args.get('CashBackRate')
  600.         ProdDetValidFrom= "2019-08-21 21:00:00.00000000"
  601.         ProdDetValidTo= "2019-08-21 21:00:00.00000000"
  602.         ProdDetParam1= request.args.get('ProdDetParam1')
  603.         ProdDetParam2= request.args.get('ProdDetParam2')
  604.         ProdDetParam3= request.args.get('ProdDetParam3')
  605.         ProdDetParam4= request.args.get('ProdDetParam4')
  606.         ProdType= request.args.get('ProdType')
  607.         ProdPrice= request.args.get('ProdPrice')
  608.         ProdParam1= request.args.get('ProdParam1')
  609.         ProdParam2= request.args.get('ProdParam2')
  610.         ProdParam3= request.args.get('ProdParam3')
  611.         ProdParam4= request.args.get('ProdParam4')
  612.         ProdName= request.args.get('ProdName')
  613.         ProdImgID= request.args.get('ProdImgID')
  614.         ProdDesc= request.args.get('ProdDesc')
  615.         ProdBrief= request.args.get('ProdBrief')
  616.         Age= request.args.get('Age')
  617.         AgeGroupID= request.args.get('AgeGroupID')
  618.         Income= request.args.get('Income')
  619.         IncomeGroupID= request.args.get('IncomeGroupID')
  620.         Gender= request.args.get('Gender')
  621.         JobID= request.args.get('JobID')
  622.         LanguageID= request.args.get('LanguageID')
  623.         MartialStatus= request.args.get('MartialStatus')
  624.         EducationID= request.args.get('EducationID')
  625.         ReligionID= request.args.get('ReligionID')
  626.         JobStartDate= "2019-08-21 21:00:00.00000000"
  627.         Children= request.args.get('Children')
  628.         DriverLicense= request.args.get('DriverLicense')
  629.         CarOwner= request.args.get('CarOwner')
  630.         Username= request.args.get('Username')
  631.         Password= request.args.get('Password')
  632.         AccountCreated= "2019-08-21 21:00:00.00000000"
  633.         LastLogin= "2019-08-21 21:00:00.00000000"
  634.         DemogrParam1= request.args.get('DemogrParam1')
  635.         DemogrParam2= request.args.get('DemogrParam2')
  636.         DemogrParam3= request.args.get('DemogrParam3')
  637.         DemogrParam4= request.args.get('DemogrParam4')
  638.     except:
  639.         return make_response(jsonify({'EspUpdate':'Input data is incorrect. Good luck!'}),418)  
  640.     esp_url="http://ruscilabcomp:44445/SASESP/windows/CILAB_ver5_0/Continuous_Query_1/CARD/state?value=injected"
  641.     esp_headers= {'content-type':'text/csv'}
  642.     esp_event = "I,N,"+str(CardID)+","+str(CardNumber)+","+str(AccountID)+","+str(IndivID)+","+str(CardPin)+","+str(CardCVC)+","+str(CardType)+","+str(CardType2)+","+str(CardValidFrom)+","+str(CardValidTo)+","+str(CardStatus)+","+str(CardCashLimit)+","+str(CardParam1)+","+str(CardParam2)+","+str(CardParam3)+","+str(CardParam4)
  643.     bin_esp_event = esp_event.encode()
  644.     print esp_event
  645.  
  646.     esp_url2="http://ruscilabcomp:44445/SASESP/windows/CILAB_ver5_0/Continuous_Query_1/AccountDetailedView/state?value=injected"
  647.     esp_event2 = "I,N,"+str(AccountID)+","+str(AccountValidFrom)+","+str(AccountValidTo)+","+str(IndivID)+","+str(AccountBalance)+","+str(AccountPrice)+","+str(ProdDetID)+","+str(AccountType)+","+str(AccountStatus)+","+str(AccountAmount)+","+str(AccountPayment)+","+str(AccountParam1)+","+str(AccountParam2)+","+str(AccountParam3)+","+str(AccountParam4)+","+str(HHoldID)+","+str(Title)+","+str(Forename)+","+str(Surname)+","+str(Phone)+","+str(Mobile)+","+str(Fax)+","+str(Email)+","+str(CustomerSince)+","+str(STATUS)+","+str(Birthdate)+","+str(Agent)+","+str(MarketingSegment)+","+str(Random)+","+str(Middlename)+","+str(PhotoID)+","+str(VipFlag)+","+str(IndivParam1)+","+str(IndivParam2)+","+str(IndivParam3)+","+str(IndivParam4)+","+str(ProdDetName)+","+str(ProdID)+","+str(ProdDetDesc)+","+str(ProdDetImgID)+","+str(ProdDetPrice)+","+str(ProdDetStatus)+","+str(ProdDetRate)+","+str(ProdDetAmount)+","+str(ProdDetPayment)+","+str(ProdDetBalance)+","+str(ProdDetLimit)+","+str(ProdDetPeriod)+","+str(CashBackRate)+","+str(ProdDetValidFrom)+","+str(ProdDetValidTo)+","+str(ProdDetParam1)+","+str(ProdDetParam2)+","+str(ProdDetParam3)+","+str(ProdDetParam4)+","+str(ProdType)+","+str(ProdPrice)+","+str(ProdParam1)+","+str(ProdParam2)+","+str(ProdParam3)+","+str(ProdParam4)+","+str(ProdName)+","+str(ProdImgID)+","+str(ProdDesc)+","+str(ProdBrief)+","+str(Age)+","+str(AgeGroupID)+","+str(Income)+","+str(IncomeGroupID)+","+str(Gender)+","+str(JobID)+","+str(LanguageID)+","+str(MartialStatus)+","+str(EducationID)+","+str(ReligionID)+","+str(JobStartDate)+","+str(Children)+","+str(DriverLicense)+","+str(CarOwner)+","+str(Username)+","+str(Password)+","+str(AccountCreated)+","+str(LastLogin)+","+str(DemogrParam1)+","+str(DemogrParam2)+","+str(DemogrParam3)+","+str(DemogrParam4)
  648.     bin_esp_event2 = esp_event2.encode()
  649.     print esp_event2
  650.  
  651.     esp_url3="http://ruscilabcomp:44445/SASESP/windows/CILAB_ver5_0/Continuous_Query_1/Accounts/state?value=injected"
  652.     esp_event3 = "I,N,"+str(AccountID)+","+str(AccountValidFrom)+","+str(AccountValidTo)+","+str(IndivID)+","+str(AccountBalance)+","+str(AccountPrice)+","+str(ProdDetID)+","+str(AccountType)+","+str(AccountStatus)+","+str(AccountAmount)+","+str(AccountPayment)+","+'python'+","+str(AccountParam2)+","+str(AccountParam3)+","+str(AccountParam4)
  653.     bin_esp_event3 = esp_event3.encode()
  654.     print esp_event3
  655.  
  656.     try:      
  657.         r = requests.put(esp_url3,data = bin_esp_event3,headers=esp_headers)
  658.         r = requests.put(esp_url2,data = bin_esp_event2,headers=esp_headers)  
  659.         r = requests.put(esp_url,data = bin_esp_event,headers=esp_headers)    
  660.     except Exception as e:
  661.         return make_response(jsonify({'EspUpdate':e}),400)
  662.     return make_response(jsonify({'EspUpdate':bin_esp_event2}),200)  
  663.    
  664.  
  665.  
  666.  
  667. #############################################################################################################################################################################################
  668. #                                                                                                                                                                                           #
  669. #                         BLOCK OF /ServicesStatus                                                                                                                                  #
  670. #                                                                                                                                                                                           #
  671. ####################################################################################################################################################
  672.  
  673. @app.route('/ServicesStatus', methods=['GET'])
  674. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  675. def ServicesStatusGET():
  676.      Services = {"atm":json.loads(dur.get('atm_status')),"transgen":json.loads(dur.get('transgenpar')),"facetz":json.loads(dur.get('facetzpar')),"luna":json.loads(dur.get('lunapar'))}
  677.      return make_response(jsonify({'Ratatoskr':Services}),200)  
  678.  
  679.  
  680. #############################################################################################################################################################################################
  681. #                                                                                                                                                                                           #
  682. #                         BLOCK OF /LoyaltyScore                                                                                                                               #
  683. #                                                                                                                                                                                           #c
  684. ####################################################################################################################################################
  685.  
  686. @app.route('/loyalty', methods=['GET','POST','OPTIONS'])
  687. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  688. def loyalty():
  689.     try:
  690.         cid = request.json['cid']
  691.     except:
  692.         return make_response(jsonify({'Loyalty':'input data is corrupt'}),418)
  693.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  694.     cur = db.cursor()
  695.     cur.execute('SELECT Max(LoyaltyScore) FROM [DataMart].[CARD] WHERE IndivID = '+str(cid))
  696.     loyalty = cur.fetchone()
  697.     return make_response(jsonify({'Loyalty':loyalty[0]}),200)
  698.  
  699.  
  700.  
  701. #############################################################################################################################################################################################
  702. #                                                                                                                                                                                           #
  703. #                         BLOCK OF /SERVICE LIST                                                                                                    #
  704. #                                                                                                                                                                                           #
  705. ##################################################################################################################################################
  706.  
  707. bool_tmp = dur.set('ServiceList',json.dumps({"Offurl":'ruscilab.sas-mic.local',"Mesurl":'10.20.1.21:5000',"Infurl":'labinfo.sas-mic.local'}))
  708.  
  709. @app.route('/service_list',  methods=['POST','OPTIONS'])
  710. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  711. def service_list_post():
  712.     try:
  713.         offurl = request.json['offurl']
  714.         mesurl = request.json['mesurl']
  715.         infurl = request.json['infurl']
  716.     except:
  717.         return make_response(jsonify({'Ratatoskr':'Input error'}),415)  
  718.     dur_tmp = json.loads(dur.get('ServiceList'))
  719.     if offurl != "":
  720.          dur_tmp['Offurl'] = offurl
  721.     if mesurl != "":
  722.          dur_tmp['Mesurl'] = mesurl
  723.     if infurl != "":
  724.          dur_tmp['Infurl'] = infurl
  725.     bool_tmp = dur.set('ServiceList',json.dumps(dur_tmp))
  726.     return make_response(jsonify({'Ratatoskr':'Service list has been successfully updated'}),200)  
  727.  
  728. @app.route('/service_list',  methods=['GET'])
  729. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  730. def service_list_get():
  731.     return make_response(jsonify({'Ratatoskr':json.loads(dur.get('ServiceList'))}),200)  
  732. #############################################################################################################################################################################################
  733. #                                                                                                                                                                                           #
  734. #                         BLOCK OF /Contact Policy                                                                                                                                              #
  735. #                                                                                                                                                                                           #
  736. #####################################################################################################################################################
  737. @app.route('/contactpol', methods=['POST','OPTIONS'])
  738. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  739. def contactpol():
  740.     try:
  741.         #link = request.json['link']
  742.         #login = request.json['login']
  743.         #psw = request.json['psw']
  744.         individ = request.json['IndivID']
  745.         phones = request.json['Phones']
  746.         mes = request.json['Message']
  747.         channel = request.json['Channel']
  748.         sender = request.json['Sender']
  749.         param1 = request.json['param1']
  750.         param2 = request.json['param2']
  751.         param3 = request.json['param3']
  752.         param4 = request.json['param4']
  753.     except:
  754.         return make_response(jsonify({'ContactPolicy':'Incorrect input'}),418)
  755.     inputs={"IndivID":individ,"Channel":channel,"Phones":phones,"Message":mes,"Sender":sender,"param1":param1,"param2":param2,"param3":param3,"param4":param4}
  756.     dns = "10.20.1.30:7980"
  757.     event = "SendMessage"
  758.     rtdm_addr = "http://"+dns+"/RTDM/rest/runtime/decisions/"+event
  759.     payload = {"clientTimeZone":"Europe/Moscow","version":1,"inputs":inputs}    
  760.     try:
  761.         result = call_rtdm.apply_async((dns,"SendMessage",inputs),retry=True)  
  762.     except Exception as e:
  763.         return make_response(jsonify({'ContactPolicy':e}),400)
  764.     return make_response(jsonify({'ContactPolicy':'Success'}),200)  
  765. #############################################################################################################################################################################################
  766. #                                                                                                                                                                                           #
  767. #                         BLOCK OF /SMS                                                                                                                                              #
  768. #                                                                                                                                                                                           #
  769. #####################################################################################################################################################
  770. @app.route('/sms', methods=['POST','GET','OPTIONS'])
  771. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  772. def sms():
  773.     try:
  774.         login =  request.args.get("login")
  775.         psw = request.args.get("psw")
  776.         phones = request.args.get("phones")
  777.         mes = request.args.get("mes")
  778.         sender = request.args.get("sender")
  779.     except Exception:
  780.         return make_response(jsonify({'Ratatoskr':'input data is corrupted'}),415)    
  781.     bool_tmp = dur.set('req_path',"https://smsc.ru/sys/send.php?charset=utf-8&login="+login+"&psw="+psw+"&phones="+phones+"&mes="+mes+"&sender="+sender )
  782.     try:
  783.         r = requests.get(dur.get('req_path'))
  784.         answer = r.content
  785.     except requests.exceptions.RequestException as e:
  786.         return make_response(jsonify({'Ratatoskr':'connection error'}),404)  
  787.     return make_response(jsonify({'Ratatoskr':'Success!'}),200)
  788.  
  789.  
  790. ### TVBESTOFFER ###
  791. #This function is waiting for incomming GET request from RTDM to parse it and store in REDIS (in JSON)
  792. @app.route('/tvbestoffer', methods=['GET', 'OPTIONS'])
  793. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  794. def tvbestoffer():
  795.     try:
  796.         title = request.args.get("Title")
  797.         forename = request.args.get("Forename")
  798.         surname = request.args.get("Surname")
  799.         offername = request.args.get("OfferName")
  800.         offerdesc = request.args.get("OfferDesc")
  801.     except Exception:
  802.         return make_response(jsonify({'Ratatoskr':'Input data is incorrect'},415))
  803.     tvoffer = {'Title': title, 'Forename': forename, 'Surname': surname, 'OfferName': offername, 'OfferDesc': offerdesc}
  804.     red_tvoffer = dur.set('tvoffer_tmp',json.dumps(tvoffer))#1st changed string
  805.     red_tvflag = dur.set('tvflagpar',json.dumps(1))
  806.     return make_response(jsonify({'Ratatoskr':str(tvoffer)}),200)
  807.  
  808. ##################
  809.  
  810. ### TVSTATUS ###
  811.  
  812. @app.route('/tvstatus', methods=['GET', 'OPTIONS'])
  813. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  814. def tvstatus():
  815.     red_tvflag = dur.get('tvflagpar')
  816.     tvoffer = dur.get('tvoffer_tmp')
  817.     #print ("Current TVFLAG Value is: " + str(red_tvflag))
  818.     try:
  819.         reset = request.args.get("reset")
  820.         if reset is not None:
  821.             red_tvflag = dur.set('tvflagpar',json.dumps(0))
  822.     except Exception as e:
  823.         return make_response(jsonify({'Ratatoskr':str(e)+str(reset)}),400)
  824.     try:
  825.         if int(red_tvflag) == 0:
  826.             #tvoffer_def = dur.get('tvoffer_tmp_def')
  827.             return make_response(jsonify({'Ratatoskr':json.loads(dur.get('tvoffer_tmp_def'))}),200)
  828.         else:
  829.             return make_response(jsonify({'Ratatoskr':json.loads(dur.get('tvoffer_tmp'))}),200)
  830.     except Exception:
  831.         return "Something Goes Wrong" #make_response(jsonify({'Ratatoskr': 'NoData'}),415)
  832.  
  833. ################
  834.  
  835.  
  836.  
  837. #############################################################################################################################################################################################
  838. #                                                                                                                                                                                           #
  839. #                         BLOCK OF /
  840. #FasetZ                                                                                                                     #
  841. #                                                                                                                                                                                           #
  842. ####################################################################################################################################################
  843. #Initialization of active sessions list
  844. #bool_tmp = dur.set('Sesslist',json.dumps([]))
  845. if dur.get('Sesslist') == None:
  846.     bool_tmp = dur.set('Sesslist',json.dumps([]))
  847.  
  848. @app.route('/facetz2', methods=['GET','OPTIONS'])
  849. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  850. def facetz2():
  851.     cid =  request.args.get("cid")
  852.     url = "https://api.facetz.net/v2/facts/user.json?key=51af6192-c812-423d-ae25-43a036804632&query={%22user%22:{%22id%22:%22"+cid+"%22},%22ext%22:{%22exchangename%22:%22sas_demo%22}}"
  853.     Formatted = []
  854.     try:
  855.         r = requests.get(url)
  856.         Formatted.append({"id":r.json()['id']})
  857.     except Exception as e:
  858.         return make_response(jsonify({'Ratatoskr':'Facetz is not responding'}),404)  
  859.     i=1
  860.     try:
  861.         for el in r.json()['visits']:
  862.             formatted_el = {}
  863.             formatted_el['number'] = i
  864.             formatted_el['ts'] = datetime.datetime.strftime(datetime.datetime.fromtimestamp(el['ts']/1000),"%Y-%m-%d %H:%M:%S")
  865.             if 'www.' in urllib.unquote(el['url']):
  866.                 editurl=urllib.unquote(el['url']).replace('www.','')
  867.             else:
  868.                 editurl=urllib.unquote(el['url'])
  869.             if 'http' not in editurl:
  870.                 editurl=''.join(('http://',editurl))
  871.             else:
  872.                 editurl = editurl
  873.             if not editurl.endswith('/'):
  874.                 editurl=''.join((editurl,'/'))
  875.             formatted_el['url'] = editurl
  876.             Formatted.append(formatted_el)
  877.             i+=1
  878.         return make_response(jsonify({'Ratatoskr':Formatted}),200)
  879.     except Exception as e:
  880.         return make_response(jsonify({'Ratatoskr':'Other error'}),404)  
  881.  
  882.  
  883.  
  884.  
  885. bool_tmp = dur.set('facetzpar',json.dumps(0))
  886. #Start Facetz service with OFF status. It should be switched ON in front services office menu.
  887.  
  888. @app.route('/facetzmanage', methods=['GET','OPTIONS'])
  889. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  890. def facetzmanage():
  891.     param = request.args.get("param")
  892.     if param == "True":
  893.         try:
  894.             bool_tmp = dur.set('facetzpar',json.dumps(1))
  895.             resultface = facetztask.apply_async()  
  896.         except Exception as e:
  897.             return make_response(jsonify({'Ratatoskr':'facetztask is not invoking'}),404)  
  898.     else:
  899.         bool_tmp = dur.set('facetzpar',json.dumps(0))
  900.         dur_tmp = json.loads(dur.get('Sesslist'))
  901.         dur_tmp = []
  902.         bool_tmp = dur.set('Sesslist',json.dumps(dur_tmp))
  903.     return make_response(jsonify({'Facetzmanage':json.loads(dur.get('facetzpar'))}),200)
  904.    
  905.    
  906. @app.route('/facetzshit', methods=['GET','OPTIONS'])
  907. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  908. def facetzshit():
  909.    
  910.     while json.loads(dur.get('facetzpar')) == 1:
  911.         dur_tmp = json.loads(dur.get('Sesslist'))
  912.         for sessid in dur_tmp:
  913.             try:
  914.                 url = "https://api.facetz.net/v2/facts/user.json?key=51af6192-c812-423d-ae25-43a036804632&query={%22user%22:{%22id%22:%22"+sessid+"%22},%22ext%22:{%22exchangename%22:%22sas_demo%22}}"
  915.                 print(url)
  916.                 Formatted = []
  917.                 r = requests.get(url)
  918.                 print(r.status_code)
  919.                 print(r.text)
  920.                 return make_response(jsonify({'Facetzmanage':str(r)}),510)
  921.                 i=1
  922.                 print("current --> working with visits!!!")
  923.                 for el in r.json()['visits']:
  924.                     print(el)
  925.                     formatted_el = {}
  926.                     formatted_el['number'] = i
  927.                     formatted_el['ts'] = datetime.strftime(datetime.fromtimestamp(el['ts']/1000),"%Y-%m-%d %H:%M:%S")
  928.                     if 'www.' in urllib.unquote(el['url']):
  929.                         editurl=urllib.unquote(el['url']).replace('www.','')
  930.                     else:
  931.                         editurl=urllib.unquote(el['url'])
  932.                     if 'http' not in editurl:
  933.                         editurl=''.join(('http://',editurl))
  934.                     else:
  935.                         editurl = editurl
  936.                     if not editurl.endswith('/'):
  937.                         editurl=''.join((editurl,'/'))
  938.                     formatted_el['url'] = editurl
  939.                     Formatted.append(formatted_el)
  940.                     i+=1
  941.             except Exception as e:
  942.                 print(str(e))
  943.                 return make_response(jsonify({'Facetzmanage':str(e)}),500)
  944.             try:
  945.                 if dur_tmp != []:
  946.                     Result = {"sys":{"id":r.json()['id']},"site":Formatted}
  947.                     que_result = rabbitmq_add('facetz_mq','f_mq',json.dumps(Result,ensure_ascii=False),'application/json','facetz_mq')
  948.                     return make_response(jsonify({'Facetzshit':'queue'}),418)
  949.             except Exception as e:
  950.                 return make_response(jsonify({'Facetzmanage':'Error lev 2'}),500)
  951.     #print ("djiodqwlkjqwdlkjqwdlkj")
  952.     return make_response(jsonify({'Facetzshit':json.loads(dur.get('facetzpar'))}),200)
  953.    
  954.  
  955.  
  956. @app.route('/facetz', methods=['GET','OPTIONS'])
  957. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  958. def facetz():
  959.     visitid = request.args.get("visitid")
  960.     #dur_tmp = json.loads(dur.get('Sesslist'))
  961.     dur_tmp = ["No Data"]
  962.     if visitid is None:
  963.         return make_response(jsonify({'Ratatoskr':json.loads(dur.get('Sesslist'))}),201)
  964.     if visitid not in dur_tmp and json.loads(dur.get('facetzpar')) == 1:
  965.         dur_tmp.append(visitid)
  966.         bool_tmp = dur.set('Sesslist',json.dumps(dur_tmp))
  967.         return make_response(jsonify({'Ratatoskr':'VisitID has been added to Lesslist'}),200)
  968.     else:
  969.         return make_response(jsonify({'Ratatoskr':'This visitid is already exists'}),200)
  970.  
  971.      
  972.  
  973.        
  974.  
  975. #############################################################################################################################################################################################
  976. #                                                                                                                                                                                           #
  977. #                         BLOCK OF /
  978. #Online Bank Login                                                                                                                   #
  979. #                                                                                                                                                                                           #
  980. ##################################################################################################################################################
  981. @app.route('/obank', methods=['POST','GET','OPTIONS'])
  982. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  983. def obank():
  984.     try:
  985.         sessid = request.json['sessid']
  986.     except:
  987.         sessid = "NULL"
  988.     try:    
  989.         login = request.json['login']
  990.     except:
  991.         login = "NULL"
  992.     try:
  993.         phone = request.json['phone']
  994.     except:
  995.         phone = "NULL"
  996.     try:
  997.         email = request.json['email']
  998.     except:
  999.         email = "NULL"
  1000.     fields = "(SessionID,"
  1001.     vals = "('"+sessid+"',"
  1002.     if login != "":
  1003.         fields += 'Login,'
  1004.         vals += "'"+login+"',"
  1005.     if phone != "":
  1006.         fields += 'Phone,'
  1007.         vals += "'"+phone+"',"
  1008.     if email != "":
  1009.         fields += 'Email,'
  1010.         vals += "'"+email+"',"
  1011.     fields += "Timestamp)"
  1012.     vals += str(int(time.time()))+")"
  1013.     conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  1014.     cursor = conn.cursor()
  1015.     if phone != "" or email != "" or login != "":
  1016.         cursor.execute("INSERT INTO [DataMart].[FACETZ] "+fields+" VALUES "+vals)
  1017.         conn.commit()
  1018.     esp_url="http://ruscilabcomp:44445/SASESP/windows/CI_Facetz/Continuous_Query_1/Facetz/state?value=injected"
  1019.     esp_headers= {'content-type':'text/csv'}
  1020.     esp_event = "I,N,"+sessid+","+email+","+phone+","+login+","+str(int(time.time()))
  1021.     bin_esp_event = esp_event.encode()
  1022.     try:
  1023.         r = requests.put(esp_url,data = bin_esp_event,headers=esp_headers)
  1024.     except Exception as e:
  1025.         return make_response(jsonify({'OnlineBank':str(e)}),418)
  1026.         #return make_response(jsonify({'OnlineBank':e}),418)
  1027.     return make_response(jsonify({'OnlineBank':r.content}),200)
  1028.  
  1029. #############################################################################################################################################################################################
  1030. #                                                                                                                                                                                           #
  1031. #                         BLOCK OF /
  1032. #DPI                                                                                                                        #
  1033. #                                                                                                                                                                                           #
  1034. ####################################################################################################################################################
  1035. @app.route('/dpi', methods=['POST','OPTIONS'])
  1036. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1037. def dpi():
  1038.     try:
  1039.         timestamp = request.json['timestamp']
  1040.         ip = request.json['ip']
  1041.         hash_ = request.json['hash']
  1042.         ua = request.json['ua']
  1043.         domain = request.json['domain']
  1044.         uri = request.json['uri']
  1045.         cookie = request.json['cookie']
  1046.         referer = request.json['referer']
  1047.     except:
  1048.         return make_response(jsonify({'DpiService':'Input is incorrect'}),418)
  1049.     return make_response(jsonify({'DpiService':'Success'}),200)
  1050. #############################################################################################################################################################################################
  1051. #                                                                                                                                                                                           #
  1052. #                         BLOCK OF /
  1053. #Save in MSSQL_SERVER                                                                                                                         #
  1054. #                                                                                                                                                                                           #
  1055. ####################################################################################################################################################
  1056. @app.route('/mssqlsave', methods=['POST','GET','OPTIONS'])
  1057. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1058. def mssqlsave():
  1059.     try:
  1060.         CID = request.json["CID"]
  1061.         FirstName = request.args.get("FirstName").encode('utf-8')
  1062.         LastName = request.args.get("LastName").encode('utf-8')
  1063.         MiddleName = request.args.get("MiddleName").encode('utf-8')
  1064.         Passport = request.json["Passport"]
  1065.         MobileNumber = request.json["MobileNumber"]
  1066.         Gender = request.json["Gender"]
  1067.         Age = request.json["Age"]
  1068.         AgeGroup = request.json["AgeGroup"]
  1069.         DateOfBirth = request.json["DateOfBirth"]
  1070.         MaritalStatus = request.json["MaritalStatus"]
  1071.         Children = request.json["Children"]
  1072.         Education = request.json["Education"]
  1073.         Occupation = request.json["Occupation"]
  1074.         Income = request.json["Income"]
  1075.         Email = request.json["Email"]
  1076.         PhoneNumber = request.json["PhoneNumber"]
  1077.         Vkontakte = request.json["Vkontakte"]
  1078.         Facebook = request.json["Facebook"]
  1079.         Country = request.args.get("Country").encode('utf-8')
  1080.         City = request.args.get("City").encode('utf-8')
  1081.         PhotoID = request.json["PhotoID"]  
  1082.         LanguageID = request.args.get("LanguageID")
  1083.         Password = request.args.get("Password")
  1084.         Title = request.args.get("Title")
  1085.         Street = request.args.get("Street").encode('utf-8')
  1086.         Telegram = request.args.get("Telegram").encode('utf-8')
  1087.     except:
  1088.         return make_response(jsonify({'Ratatoskr':'Input is incorrect'}),400)    
  1089.     try:
  1090.         conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  1091.         cursor = conn.cursor()
  1092.     except:
  1093.         return make_response(jsonify({'Ratatoskr':'Connection failed'}),400)  
  1094.     cursor.execute("SELECT COUNT(IndivID) FROM [DataMart].[INDIVIDUAL] WHERE IndivID="+str(CID))
  1095.     data = cursor.fetchone()
  1096.     count = data[0]
  1097.     if count == 0:
  1098.         query1=(
  1099.         "INSERT INTO [DataMart].[INDIVIDUAL] (IndivID) VALUES ("+str(CID)+")"
  1100.         "INSERT INTO [DataMart].[INDIVIDUAL_DEMOGRAPHIC] (IndivID) VALUES ("+str(CID)+")"
  1101.         "INSERT INTO [DataMart].[INDIVIDUAL_SOCIAL] (IndivID) VALUES ("+str(CID)+")"
  1102.         "INSERT INTO [DataMart].[INDIVIDUAL_PASSPORT] (IndivID) VALUES ("+str(CID)+")"
  1103.         )
  1104.         cursor.execute(query1)
  1105.  
  1106.     sql1="UPDATE [DataMart].[INDIVIDUAL] SET Forename ='"+str(FirstName)+"',Surname='"+str(LastName)+"',Middlename='"+str(MiddleName)+"',Mobile='"+str(MobileNumber)+"',Birthdate='"+str(DateOfBirth)+"',Email='"+str(Email)+"',Phone='"+str(PhoneNumber)+"',"
  1107.     if Title != 'undefined':
  1108.         sql1 += "Title='"+str(Title)+"',"
  1109.     sql1 += "PhotoID='"+str(PhotoID)+"' WHERE IndivID="+str(CID)+""
  1110.     print sql1
  1111.  
  1112.     sql2 = "UPDATE [DataMart].[INDIVIDUAL_DEMOGRAPHIC] SET Gender = '"+str(Gender)+"',Age='"+str(Age)+"',AgeGroupID='"+str(AgeGroup)+"',MartialStatus='"+str(MaritalStatus)+"',Children='"+str(Children)+"',EducationID='"+str(Education)+"',JobID='"+str(Occupation)+"',"
  1113.     if LanguageID != 'undefined':
  1114.         sql2 += "LanguageID='"+str(LanguageID)+"',"
  1115.     if Password != 'undefined':
  1116.         sql2 += "Password='"+str(Password)+"',"
  1117.     sql2 += "Income='"+str(Income)+"' WHERE IndivID="+str(CID)+""
  1118.     print sql2
  1119.  
  1120.  
  1121.     sql3 = (
  1122.     "UPDATE [DataMart].[INDIVIDUAL_PASSPORT] SET "
  1123.     "PassportNumber = '"+str(Passport)+"',"
  1124.     "PassportCountry='"+str(Country)+"',"
  1125.     "PassportCity='"+str(City)+"',"
  1126.     #"PassportState='"+str(State)+"',"
  1127.     "PassportStreet='"+str(Street)+"' "
  1128.     "WHERE IndivID="+str(CID)+"")
  1129.     sql4 = (
  1130.     "UPDATE [DataMart].[INDIVIDUAL_SOCIAL] SET "
  1131.     "VkName = '"+str(Vkontakte)+"',"
  1132.     "FacebookName='"+str(Facebook)+"',"
  1133.     "TelegramChatID='"+str(Telegram)+"'"
  1134.     "WHERE IndivID="+str(CID)+" COMMIT ")
  1135.     try:
  1136.         cursor.execute(sql1)
  1137.     except Exception as e:
  1138.         return make_response(jsonify({'Ratatoskr':'Update INDIVIDUAL table failed'}),400)  
  1139.     try:
  1140.         cursor.execute(sql2)
  1141.     except Exception as e:
  1142.         return make_response(jsonify({'Ratatoskr':'Update INDIVIDUAL_DEMOGRAPHIC table failed'}),400)  
  1143.     try:
  1144.         cursor.execute(sql3)
  1145.     except Exception as e:
  1146.         return make_response(jsonify({'Ratatoskr':'Update INDIVIDUAL_PASSPORT table failed'}),400)  
  1147.     try:
  1148.         cursor.execute(sql4)
  1149.     except Exception as e:
  1150.         return make_response(jsonify({'Ratatoskr':'Update INDIVIDUAL_SOCIAL table failed'}),400)
  1151.     return make_response(jsonify({'Ratatoskr':'ok'}),200)    
  1152.  
  1153.  
  1154. #############################################################################################################################################################################################
  1155. #                                                                                                                                                                                           #
  1156. #                         BLOCK OF /MOBILE_GET                                                                                                                                              #
  1157. #                                                                                                                                                                                           #
  1158. #############################################################################################################################################################################################
  1159. @app.route('/mobile_get', methods=['GET'])
  1160.  
  1161. def mobile_get_all():
  1162.     print('begin')
  1163.     cid = request.args.get('client_id')
  1164.     context = 600
  1165.     channel = "mobile"
  1166.     device = "mobile"
  1167.     regtime = "2012-04-23T18:25:43.511Z"
  1168.     reqtime = "2012-04-23T18:25:43.511Z"
  1169.     timezone = "1"
  1170.     param1 ="1"
  1171.     param2 = "1"
  1172.     param3 = 1
  1173.     param4 = 1
  1174.     param5 = ["1"]
  1175.     param6 = [1]
  1176.     param7 = True
  1177.     resp = None
  1178.     Clients =[]
  1179.     Offers = []
  1180.     Products = []
  1181.     Transactions = []
  1182.     WIFI = []
  1183.     GPS = []
  1184.     Beacon = []
  1185.     bool_tmp = dur.set('LastMobileGet',json.dumps({"LastRequestTime":strftime("%d.%m.%Y %H:%M:%S",gmtime()),"cid":cid}))
  1186.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1187.     cur = db.cursor()
  1188. #CID IS NOT SPECIFIED
  1189.     if cid is None:
  1190.         query_customers = "Login is not null ORDER BY CID DESC"
  1191.         query_tranz = ''
  1192.         query_offers = None
  1193.         query_prods = "WHERE IndivID > 0"
  1194.         query_prods_det = None
  1195.         query_beacon = None
  1196.         query_wifi = None
  1197.         query_gps = None
  1198.         try:
  1199.             result_mssql_offers = mssql_select('CIDB','DataMart',None,'OFFER',query_offers)
  1200.             result_mssql_offimg = mssql_select('CIDB','DataMart','ProdImg','PRODIMG',query_offers)
  1201.             query = (" SELECT t2.ProdType,t3.ProdImg from [CIDB].[DataMart].[OFFER] as t1 inner join [CIDB].[DataMart].[PRODUCT] as t2 on t1.ProdID = t2.ProdID inner join [CIDB].[DataMart].[ProdImg]  as t3 on t2.ProdID = t3.ProdID")
  1202.             cur.execute(query)
  1203.             prodtype = cur.fetchall()
  1204.             query = ("Select a1.IndivID,LScore from ((select * from [DataMart].[INDIVIDUAL_DEMOGRAPHIC] where Password <> '0' and IndivID > '150000') as a1 left join (select IndivID,CAST(MAX(LoyaltyScore)as INT) as LScore from [DataMart].[CARD] GROUP BY IndivID) as a2 on a1.IndivID = a2.IndivID) ORDER BY IndivID DESC")
  1205.             cur.execute(query)
  1206.             loyalty = cur.fetchall()            
  1207.             #GET OFFERS
  1208.             """
  1209.            i = 0
  1210.            for row in result_mssql_offers:
  1211.                offer = {}
  1212.                offer["clientid"] = row[23]
  1213.                offer["offerid"] = row[20]
  1214.                offer["name"] = row[0]
  1215.                offer["duration"] = 12
  1216.                offer["type"] = prodtype[i][0]
  1217.                offer["description"] = row[19]
  1218.                offer["sum"] = row[3]
  1219.                #offer["image"] = prodtype[i][1]
  1220.                offer["image"] = ''
  1221.                offer["rate"] = row[2]
  1222.                offer["payment"] = row[4]
  1223.                offer["secret"] = ''
  1224.                offer["visibility"] = 1
  1225.                offer["priority"] = row[22]
  1226.                offer["generated_dttm"] = int(round(time.time()*1))
  1227.                offer["recieved_dttm"] = int(round(time.time()*1))
  1228.                offer["termination_dttm"] = int(round(time.time()*1))
  1229.                offer["sent_dttm"] = int(round(time.time()*1))
  1230.                Offers.append(offer)
  1231.                i+=1"""
  1232.         except Exception as e:
  1233.             response = {"Ratatoskr":e}
  1234.             print str(response)
  1235.             return make_response(jsonify(response),500)
  1236.  
  1237. #CID IS SPECIFIED
  1238.     else:
  1239.         try:
  1240.             inputs = {"cid":int(cid),"channel":channel,"context":context,"device":device,"regtime":regtime,"reqtime":reqtime,"timezone":timezone,"param1":param1,
  1241. "param2":param2,"param3":param3,"param4":param4,"param5":param5,"param6":param6,"param7":param7}      
  1242.             event = "nboevent"
  1243.             rtdm_addr = "http://"+rtdmpath+"/RTDM/rest/runtime/decisions/"+event
  1244.             payload = {"clientTimeZone":"Europe/Moscow","version":1,"inputs":inputs}
  1245.             r = requests.post(rtdm_addr,json = payload)
  1246.             resp = r.json()
  1247.         except Exception as e:
  1248.             response = {"Ratatoskr":"R1:"+str(e)}
  1249.         try:
  1250.             #request for offer images
  1251.             temp_table =("CREATE TABLE #TEMP (offercode int,ord int)")
  1252.             cur.execute(temp_table)
  1253.             print(str(resp))
  1254.             try:    
  1255.                 for k in range(len(resp['outputs']['offercode'])):
  1256.                    
  1257.                     insert_order = "INSERT INTO #TEMP(offercode,ord) VALUES("+str(resp['outputs']['offercode'][k])+","+str(k)+")"
  1258.                     cur.execute(insert_order)
  1259.                     print('inserted_')
  1260.             except Exception as e:
  1261.                 response = {"Ratatoskr":"R4:"+str(e)}
  1262.  
  1263.             query = (
  1264.             " WITH TEMP as (SELECT ProdID,offercode,ord,IndivID from [CIDB].[DataMart].[OFFER] as t1 INNER JOIN #TEMP as t2 on t1.OfferID =    t2.offercode)"
  1265.             " SELECT t3.ProdImg FROM TEMP as t1 inner join [CIDB].[DataMart].[OFFER] as t2 on t1.ProdID = t2.ProdID and t1.IndivID = t2.IndivID inner join [CIDB].[DataMart].[PRODIMG] as t3 on t1.ProdID = t3.ProdID ORDER BY ord")
  1266.             print('with select')
  1267.             cur.execute(query)
  1268.             off_imgs = cur.fetchall()
  1269. #            cur.execute("DROP TABLE #TEMP")  
  1270.         except Exception as e:
  1271.             response = {"Ratatoskr":"R2:"+str(e)}
  1272.         try:
  1273.             if len(off_imgs) < 3:
  1274.                 for l in range(3-len(off_imgs)):
  1275.                     off_imgs.append(" ");
  1276.             i = 0
  1277.             for row in resp["outputs"]["offercode"]:
  1278.                 offer = {'clientid': str(int(resp["outputs"]["cid"])), 'description':resp["outputs"]["advdetails"][i], 'generated_dttm':int(round(time.time()*1)),'image':off_imgs[i][0],'name':resp["outputs"]["offername"][i],'offerid':int(resp["outputs"]["offercode"][i]),'payment':resp["outputs"]["payment"][i],'priorigty':int(resp["outputs"]["prio"][i]),'rate':resp["outputs"]["rate"][i],'duration':12,'recieved_dttm':int(round(time.time()*1)),'secret':'','sent_dttm':int(round(time.time()*1)),'sum':resp["outputs"]["amount"][i],'termination_dttm':int(round(time.time()*1)),'type':resp["outputs"]["offertype"][i],'visibility':1}
  1279.                 Offers.append(offer)
  1280.                 i += 1
  1281.         except Exception as e:
  1282.             response = {"Ratatoskr":"R3:"+str(e)}
  1283.             return make_response(jsonify(response),500)      
  1284.         try:
  1285.             resp = r.json()
  1286.             response = {"Ratatoskr":"Try was OK calling NBO:"+str(resp)+str(rtdmpath)}
  1287.         except Exception:
  1288.             response = {"Ratatoskr":"Error calling NBO:"+str(Exception)+str(rtdmpath)}
  1289.             return make_response(jsonify(response),500)
  1290.         query_customers = "Login is not null AND CID ="+cid
  1291.         query_tranz = " WHERE t2.AccountID IN (SELECT AccountID from [DataMart].[Account] WHERE IndivID= "+cid+")"
  1292.         query_offers = 'IndivID ='+cid
  1293.         query_prods = "WHERE IndivID ="+cid
  1294.         query_beacon = None
  1295.         query_wifi = None
  1296.         query_gps = None
  1297.         query = ("Select IndivID,CAST(MAX(LoyaltyScore) as INT) as LScore from [DataMart].[CARD] WHERE IndivID="+cid+" GROUP BY IndivID")  
  1298.         cur.execute(query)  
  1299.         loyalty = cur.fetchall()
  1300.         if loyalty == []:
  1301.              loyalty = [(0,0)]
  1302.         print loyalty
  1303.     try:
  1304.         result_mysql_sel = mysql_select('thebankfront',None,'customers',query_customers)
  1305.         result_mssql_offers = mssql_select('CIDB','DataMart',None,'OFFER',query_offers)
  1306.         result_mysql_beacon = mysql_select('ratatoskr',None, 'BEACONS',query_beacon)
  1307.         result_mysql_wifi = mysql_select('ratatoskr',None, 'WIFI',query_wifi)
  1308.         result_mysql_gps = mysql_select('ratatoskr',None, 'GPS',query_gps)
  1309.         query = (
  1310.         " SELECT ProdDetRate,ProdDetAmount,ProdDetPayment,ProdDetPeriod,ProdDetName,t1.ProdDetID,t1.ProdID,t1.ProdDetDesc,t2.ProdName,t2.ProdType,t3.IndivId,t1.ProdDetValidFrom,t1.ProdDetValidTo,t2.ProdType,t4.ProdImg "
  1311.         " FROM [CIDB].[DataMart].[PRODUCTDETAILS] as t1 inner join [CIDB].[DataMart].[PRODUCT] as t2 on t1.ProdID = t2.ProdID inner join [CIDB].[DataMart].[ACCOUNT] as t3 on t3.ProdDetID = t1.ProdDetID inner join [CIDB].[DataMart].[PRODIMG] as t4 on t1.ProdID = t4.ProdID"
  1312.         " WHERE t1.ProdDetID IN (SELECT ProdDetID FROM [CIDB].[DataMart].[ACCOUNT]"+query_prods+")")
  1313.         cur.execute(query)
  1314.         prodqres = cur.fetchall()  
  1315.         transq = ("SELECT t1.TermID,t1.TransSum,t1.TransDate,t1.TransID,t2.IndivID FROM [CIDB].[TRANSData].[TRANSACTION] as t1 inner join [CIDB].[DataMart].[ACCOUNT] as t2 on t1.AccountID = t2.AccountID " + query_tranz)
  1316.         cur.execute(transq)
  1317.         transqres = cur.fetchall()
  1318.     except Exception as e:
  1319.         response = {"Ratatoskr":e}
  1320.         return make_response(jsonify(response),500)
  1321.  
  1322.  
  1323. #GET CLIENTS
  1324.     lcnt = 0
  1325.     for row in result_mysql_sel:
  1326.         client = {}
  1327.         client["clientid"] = row[0]
  1328.         client["clientimage"]=row[25].replace(" ","+")
  1329.         #client["clientimage"]=(row[25].replace(" ","+"),'')[cid == None]
  1330.         client["name"] = row[1]
  1331.         client["surname"] = row[3]
  1332.         client["email"] = row[16]
  1333.         client["phone"] = row[5]
  1334.         client["login"] = row[27]
  1335.         client["password"] = row[28]
  1336.         #client["loyaltyscore"] = (loyalty[lcnt][1],0)[loyalty[lcnt][1] == None]
  1337.         client["loyaltyscore"] = 0
  1338.         Clients.append(client)
  1339.         lcnt += 1
  1340. #GET PRODUCTS
  1341.     for row in prodqres:
  1342.         product = {}
  1343.         product["clientid"] = int(row[10])
  1344.         product["sum"] = row[1]
  1345.         product["duration"] = row[3]
  1346.         product["image"] = (row[14],'')[cid == None]
  1347.         product["rate"] = row[0]
  1348.         product["payment"] = row[2]
  1349.         product["productid"] = row[5]
  1350.         product["purchased_dttm"] = row[11]
  1351.         product["exparation_dttm"] = row[12]
  1352.         product["name"] = row[4]    
  1353.         product["type"] = row[13]
  1354.         product["description"] = row[7]
  1355.         Products.append(product)
  1356. #GET SETTINGS
  1357.     Settings = []
  1358.     setting =    {
  1359.     "app_server" : app_server,
  1360.     "web_server" : web_server,
  1361.     "soa_server" : soa_server,
  1362.     "sync" : sync,
  1363.     "freq_in" : freq_in,
  1364.     "freq_out" : freq_out,
  1365.     "freq_sync" : freq_sync}
  1366.     Settings.append(setting)
  1367. #GET TRANSACTIONS
  1368.     for row in transqres:
  1369.         tranz = {}
  1370.         tranz["tranid"] = row[3]
  1371.         tranz["agent"] = row[0]
  1372.         tranz["sum"] = row[1]
  1373.         tranz["tran_dttm"] =str(int(time.mktime(row[2].timetuple())))
  1374.         tranz["clientid"] =  str(row[4])
  1375.         Transactions.append(tranz)
  1376. #GET WIFI
  1377.     for row in result_mysql_wifi:
  1378.         wifi = {}
  1379.         wifi["id"] = row[0]
  1380.         wifi["ssid"] = row[1]
  1381.         wifi["level"] = row[3]
  1382.         WIFI.append(wifi)
  1383. #GET BEACONS
  1384.     for row in result_mysql_beacon:
  1385.         beacon = {}
  1386.         beacon["uuid"] = row[0]
  1387.         beacon["major"] = row[1]
  1388.         beacon["minor"] = row[2]
  1389.         beacon["rssi"] = row[7]
  1390.         Beacon.append(beacon)
  1391. #GET GPS
  1392.     for row in result_mysql_gps:
  1393.         gps = {}
  1394.         gps["id"] = row[0]
  1395.         gps["latitude"] = row[1]
  1396.         gps["longitude"] = row[2]
  1397.         GPS.append(gps)
  1398.  
  1399.    
  1400.     response = {"Clients":Clients,"Products":Products,"Offers":Offers,"Transactions":Transactions,"Settings":Settings,"GPS":GPS,"WIFI":WIFI,"BEACONS":Beacon}
  1401.  
  1402.     return make_response(jsonify({"Ratatoskr":response}),200)
  1403.  
  1404. #############################################################################################################################################################################################
  1405. #                                                                                                                                                                                           #
  1406. #                         BLOCK OF /GETRESPONSEHISTORY                                                                                                                                             #
  1407. #                                                                                                                                                                                           #
  1408. #############################################################################################################################################################################################
  1409. @app.route('/getresponsehistory', methods=['GET','POST', 'OPTIONS'])
  1410. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1411. def getresponsehistory():
  1412.     cid = request.args.get('cid')
  1413.     conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  1414.     cursor = conn.cursor()
  1415.     cursor.execute('SELECT * FROM RTData.RESPONSE_HISTORY where CID='+str(cid)+' order by resptime desc')
  1416.     data = cursor.fetchall()
  1417.     Response = []
  1418.     for row in data:
  1419.         response = {'cid':row[0],'channel':row[1],'context':row[2],'device':row[3],'offerid':row[4],'resptype':row[5],'respname':row[6],'respid':row[7],'resptime':row[8],'resptimestr':row[9],'param1':row[10],'param2':row[11],'param3':row[12],'param4':row[13],'param5':row[14],'param6':row[15],'param7':row[16]}
  1420.         Response.append(response)
  1421.     return make_response(jsonify({'Ratatoskr':Response}),200)
  1422.  
  1423.  
  1424. #############################################################################################################################################################################################
  1425. #                                                                                                                                                                                           #
  1426. #                         BLOCK OF /mtsukanov                                                                                                                                             #
  1427. #                                                                                                                                                                                           #
  1428. #############################################################################################################################################################################################
  1429.  
  1430. #bool_tmp = dur.set('HistArr',json.dumps([]))
  1431.  
  1432. if dur.get('HistArr') == None:
  1433.     bool_tmp = dur.set('HistArr',json.dumps([]))
  1434.  
  1435.  
  1436. @app.route('/mobile_post', methods=['POST','GET','OPTIONS'])
  1437. def mobile_post_all():
  1438.     dur_tmp =json.loads(dur.get('HistArr'))
  1439.     dur_tmp.append({strftime("%d.%m.%Y %H:%M:%S",gmtime()):json.loads(request.data)})
  1440.     dur.set('HistArr',json.dumps(dur_tmp))
  1441.     try:
  1442.         sys = request.json['sys']
  1443.         wifi = request.json['wifi']
  1444.         beacon = request.json['beacon']
  1445. #        for a in beacon:
  1446. #            for n in a:
  1447.         gps = request.json['gps']
  1448.         trigger =  request.json['trigger']
  1449.         bool_tmp = dur.set('LastMobile',json.dumps({"LastRequestTime":strftime("%d.%m.%Y %H:%M:%S",gmtime()),"sys":sys,"wifi":wifi,"gps":gps,"beacon":beacon, "trigger": trigger,"opcode": "i"}))
  1450.     except Exception as e:
  1451.         return make_response(jsonify({'Ratatoskr':'input data is corrupted'}),415)
  1452.     if sys["clientid"]>150000:
  1453.         message = {"sys":sys,"wifi":wifi,"gps":gps,"beacon":beacon, "trigger": trigger,"opcode": "i"}
  1454.         result_mq = rabbitmq_add.delay('geo_mq','g_mq',json.dumps(message, ensure_ascii=False),'application/json','geo_mq')
  1455.         return make_response(jsonify({'Ratatoskr':'request processed'}),201)
  1456.     else:
  1457.         return make_response(jsonify({'Ratatoskr':'incorrect request data'}),418)
  1458.  
  1459.  
  1460.  
  1461. @app.route('/hist', methods=['GET'])
  1462. def hist():
  1463.     return make_response(jsonify({"Ratatoskr":json.loads(dur.get('HistArr'))}),200)
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469. #############################################################################################################################################################################################
  1470. #                                                                                                                                                                                           #
  1471. #                         BLOCK OF /GET LAST RESULTS                                                                                                                                           #
  1472. #                                                                                                                                                                                           #
  1473. #############################################################################################################################################################################################
  1474. @app.route('/getlast', methods=['GET'])
  1475. def lastrequest():
  1476.     if dur.get('LastLaunch') == None:
  1477.         bool_tmp = dur.set('LastLaunch',json.dumps([]))
  1478.     if dur.get('LastOffer') == None:
  1479.         bool_tmp = dur.set('LastOffer',json.dumps([]))
  1480.     if dur.get('LastMobile') == None:
  1481.         bool_tmp = dur.set('LastMobile',json.dumps([]))
  1482.     if dur.get('LastSync') == None:
  1483.         bool_tmp = dur.set('LastSync',json.dumps([]))
  1484.     if dur.get('LastMobileGet') == None:
  1485.         bool_tmp = dur.set('LastMobileGet',json.dumps([]))
  1486.     try:
  1487.         return make_response(jsonify({'launch':json.loads(dur.get('LastLaunch')),'offer_accept':json.loads(dur.get('LastOffer')),'mobile_post':json.loads(dur.get('LastMobile')),'sync_updt':json.loads(dur.get('LastSync')),'mobile_get':json.loads(dur.get('LastMobileGet'))}),200)
  1488.     except Exception as e:
  1489.         return make_response(jsonify({'Ratatoskr':e}),415)
  1490.  
  1491. #############################################################################################################################################################################################
  1492. #                                                                                                                                                                                           #
  1493. #                         BLOCK OF /GET ANALYTICS DATA                                                                                                                                         #
  1494. #                                                                                                                                                                                           #
  1495. #############################################################################################################################################################################################
  1496. @app.route('/get_analytics', methods=['POST','OPTIONS','GET'])
  1497. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1498. def get_analytics():
  1499.     try:
  1500.         cid = request.json['cid']
  1501.     except Exception:
  1502.         return make_response(jsonify({'Ratatoskr':'input data is corrupted'}),415)
  1503.     tr = []
  1504.     aggr = []
  1505.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1506.     mssql_accid = ("SELECT AccountID FROM [DataMart].[ACCOUNT] WHERE IndivID="+cid)
  1507.     cur = db.cursor()
  1508.     cur.execute(mssql_accid)  
  1509.     for row in cur.fetchall():
  1510.         msssql_trans_query = "AccountID = "+ str(int(row[0]))+"AND TransStatus = 'ok'"
  1511.         mssql_trans = mssql_select('CIDB','[TRANSData]','TransDate,TransSum,TransType,TermID','[TRANSACTION]', msssql_trans_query)
  1512.         for row2 in mssql_trans:
  1513.              trans = {}
  1514.              trans['TransData'] = row2[0]
  1515.              trans['Sum'] = row2[1]
  1516.              trans['Type'] = row2[2]
  1517.              trans['TermID'] = row2[3]
  1518.              trans['MCC'] = int(mssql_select('CIDB','[TRANSData]','MCC','[Terminal]','TermID = '+str(trans['TermID']))[0][0])
  1519.              trans['Category'] = mssql_select('CIDB','[TRANSData]','MCCName','[MCC]','MCC = '+str(int(trans['MCC'])))[0][0]
  1520.              trans['Lat'] = mssql_select('CIDB','[TRANSData]','TermLatitude','[Terminal]','TermID = '+str(trans['TermID']))[0][0]
  1521.              trans['Lon'] = mssql_select('CIDB','[TRANSData]','TermLongitude','[Terminal]','TermID = '+str(trans['TermID']))[0][0]
  1522.              trans['Account'] = int(row[0])
  1523.              tr.append(trans)    
  1524.     query = ("SELECT DISTINCT CAST(t3.MCC AS int) FROM [TRANSData].[TRANSACTION] as t1 inner join [TRANSData].[TERMINAL] as t2 on t1.TermID = t2.TermID inner join [TRANSData].[MCC] as t3 on t2.MCC = t3.MCC WHERE TransStatus='ok' AND TransSum>0 AND TransType = 1 AND AccountID IN (SELECT AccountID FROM [DataMart].[ACCOUNT] WHERE IndivID="+cid+")")
  1525.     cur = db.cursor()
  1526.     cur.execute(query)
  1527.     mcc = cur.fetchall()
  1528.     query3 = ("SELECT SUM(TransSum) FROM [TRANSData].[TRANSACTION] as t1 inner join [TRANSData].[TERMINAL] as t2 on t1.TermID = t2.TermID inner join [TRANSData].[MCC] as t3 on t2.MCC = t3.MCC WHERE TransStatus='ok' AND TransSum>0 AND TransType = 1 AND AccountID IN (SELECT AccountID FROM [DataMart].[ACCOUNT] WHERE IndivID="+cid+")")
  1529.     cur.execute(query3)
  1530.     transsum = cur.fetchone()[0]
  1531.     MCC = []
  1532.     Result = []
  1533.     for row in mcc:
  1534.         MCC.append(row[0])
  1535.     for row in MCC:
  1536.         query2 = ("SELECT  SUM(TransSum) FROM [TRANSData].[TRANSACTION] as t1 inner join [TRANSData].[TERMINAL] as t2 on t1.TermID = t2.TermID inner join [TRANSData].[MCC] as t3 on t2.MCC = t3.MCC WHERE t3.MCC = "+str(row)+" AND TransStatus='ok'AND TransType = 1 AND AccountID IN (SELECT AccountID FROM [DataMart].[ACCOUNT] WHERE IndivID="+cid+")")
  1537.         query4 = ("SELECT  t3.MCCName FROM [TRANSData].[TRANSACTION] as t1 inner join [TRANSData].[TERMINAL] as t2 on t1.TermID = t2.TermID inner join [TRANSData].[MCC] as t3 on t2.MCC = t3.MCC WHERE t3.MCC = "+str(row)+" AND TransStatus='ok'AND TransSum>0 AND TransType = 1 AND AccountID IN (SELECT AccountID FROM [DataMart].[ACCOUNT] WHERE IndivID="+cid+")")
  1538.         cur.execute(query2)
  1539.         mccsum = cur.fetchone()[0]
  1540.         cur.execute(query4)
  1541.         mcccat = cur.fetchone()[0]
  1542.         percent = (mccsum/transsum)*100
  1543.         MCCSUM = {"Category":mcccat,"Sum":mccsum,"Percent":percent}
  1544.         Result.append(MCCSUM)
  1545.     return make_response(jsonify({'Transaction_list':tr,'Aggregate':Result}),200)
  1546.  
  1547.  
  1548. #############################################################################################################################################################################################
  1549. #                                                                                                                                                                                           #
  1550. #                         BLOCK OF /NEW PRODUCTS                                                                                                                                    #
  1551. #                                                                                                                                                                                           #
  1552. #############################################################################################################################################################################################
  1553. @app.route('/new_products', methods=['POST','OPTIONS','GET'])
  1554. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1555. def new_products():
  1556.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1557.     cid = request.args.get('cid')
  1558.     proddetid = request.args.get('proddetid')
  1559.     if (proddetid is not None):
  1560.         cur = db.cursor()
  1561.         query = (
  1562.         " SELECT ProdImg FROM [CIDB].[DataMart].[PRODIMG] WHERE ProdID IN (SELECT ProdID FROM [CIDB].[DataMart].[PRODUCTDETAILS] WHERE ProdDetId = "+proddetid+")")
  1563.         cur.execute(query)
  1564.         details = cur.fetchone()
  1565.         proddet = {}
  1566.         proddet['ProdImg'] = details[0]
  1567.         return make_response(jsonify({'ProductsDetails':proddet}),200)
  1568.     if (cid is not None):
  1569.         Products=[]        
  1570.         cur = db.cursor()
  1571.         query = (
  1572.                 " SELECT ProdDetRate,ProdDetAmount,ProdDetPayment,ProdDetPeriod,ProdDetName,t1.ProdDetID,t1.ProdID,t1.ProdDetDesc,t2.ProdName,t2.ProdType,t1.ProdDetValidFrom,t1.ProdDetValidTo"
  1573.         " FROM [CIDB].[DataMart].[PRODUCTDETAILS] as t1 inner join [CIDB].[DataMart].[PRODUCT] as t2 on t1.ProdID = t2.ProdID inner join [CIDB].[DataMart].[ACCOUNT] as t3 on t3.ProdDetID = t1.ProdDetID"
  1574.         " WHERE t1.ProdDetID IN (SELECT ProdDetID FROM [CIDB].[DataMart].[ACCOUNT] WHERE IndivID='"+cid+"')")
  1575.         cur.execute(query)
  1576.         for row in cur.fetchall():
  1577.             prods = {}
  1578.             prods['Rate'] = row[0]
  1579.             prods['Amount'] = row[1]
  1580.             prods['Payment'] = row[2]
  1581.             prods['Duration'] = row[3]
  1582.             prods['Name'] = row[4]
  1583.             prods['ProductID'] = row[5]
  1584.             prods['Description'] = row[7]
  1585.             prods['FromDate'] = row[10]
  1586.             prods['ToDate'] = row[11]
  1587.             Products.append(prods)
  1588.         return make_response(jsonify({'Products':Products}),200)
  1589.  
  1590.  
  1591.  
  1592. #############################################################################################################################################################################################
  1593. #                                                                                                                                                                                           #
  1594. #                         BLOCK OF /BUY PRODS                                                                                                    #
  1595. #                                                                                                                                                                                           #
  1596. ########################################################################################################################################################
  1597. @app.route('/buyprod', methods=['POST','OPTIONS'])
  1598. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1599. def buyprod():
  1600.     try:
  1601.         prodname = request.args.get('prodname')
  1602.         amount = request.json['amount']
  1603.         cid = request.json['cid']
  1604.         purdate = request.json['purdate']
  1605.     except:
  1606.         return make_response(jsonify({'BuyProdService':'incorrect input'}),400)
  1607.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1608.     cur = db.cursor()
  1609.     cur.execute("INSERT INTO [CIDB].[DataMart].[BUYPROD] VALUES ("+str(cid)+",'"+prodname+"',"+str(amount)+",'"+str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))+"')")
  1610.     db.commit()
  1611.     return make_response(jsonify({'BuyProdService':'ok'}),200)
  1612.  
  1613. @app.route('/buyprod', methods=['GET'])
  1614. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1615. def getbuyprod():
  1616.     try:
  1617.         cid = request.args.get('cid')
  1618.     except:  
  1619.         return make_response(jsonify({'BuyProdService':'incorrect input'}),400)
  1620.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1621.     cur = db.cursor()
  1622.     cur.execute("SELECT * FROM [CIDB].[DataMart].[BUYPROD] WHERE cid = "+cid)    
  1623.     prods = cur.fetchall()
  1624.     Result = []
  1625.     for row in prods:
  1626.          prod={}
  1627.          prod['cid'] = row[0]
  1628.          prod['prodname'] = row[1]
  1629.          prod['amount'] = row[2]
  1630.          prod['date'] = row[3]
  1631.          Result.append(prod)
  1632.     return make_response(jsonify({'BuyProdService':Result}),200)
  1633. #############################################################################################################################################################################################
  1634. #                                                                                                                                                                                           #
  1635. #                         BLOCK OF /GET OFFER IMAGES                                                                                                                                    #
  1636. #                                                                                                                                                                                           #
  1637. ##############################################################################################################################################################
  1638. @app.route('/offer_img',  methods=['POST','OPTIONS','GET'])
  1639. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1640. def offer_img():
  1641.     db = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1642.     cur = db.cursor()
  1643.     offerid = request.json['offerid']
  1644.     if offerid != 0:
  1645.         offcodes = re.findall("\d+",offerid)
  1646.         temp_table =("CREATE TABLE #TEMP (offercode int,ord int)")
  1647.         cur.execute(temp_table)
  1648.         for i in range(len(offcodes)):
  1649.             insert_order = "INSERT INTO #TEMP(offercode,ord) VALUES("+str(offcodes[i])+","+str(i)+")"
  1650.             cur.execute(insert_order)
  1651.         query = (
  1652.         " WITH TEMP as (SELECT ProdID,offercode,ord,IndivID from [CIDB].[DataMart].[OFFER] as t1 INNER JOIN #TEMP as t2 on t1.OfferID = t2.offercode)"
  1653.         " SELECT t3.ProdImg FROM TEMP as t1 inner join [CIDB].[DataMart].[OFFER] as t2 on t1.ProdID = t2.ProdID and t1.IndivID = t2.IndivID inner join [CIDB].[DataMart].[PRODIMG] as t3 on t1.ProdID = t3.ProdID ORDER BY ord")
  1654.         cur.execute(query)
  1655.         tst = cur.fetchall()
  1656.         cur.execute("DROP TABLE #TEMP")      
  1657.         return make_response(jsonify({'OfferImages':tst}),200)
  1658.     else:
  1659.         return make_response(jsonify({"OfferImages":"OfferID shouldn't be equal to 0"}),418)
  1660.  
  1661.  
  1662.  
  1663.  
  1664. #############################################################################################################################################################################################
  1665. #                                                                                                                                                                                           #
  1666. #                         BLOCK OF /NEW CUSTOMER OFFERS                                                                                                    #
  1667. #                                                                                                                                                                                           #
  1668. ###################################################################################################################################################
  1669. @app.route('/newcustoffers',  methods=['POST','OPTIONS','GET'])
  1670. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1671. def freshmeatprods():
  1672.     try:
  1673.         cid = request.json['cid']
  1674.         langid = request.json['langid']
  1675.     except:
  1676.         return make_response(jsonify({"Ratatoskr":"It seems like no cid was send "}),400)
  1677.     try:
  1678.         is_newcust= mssql_select('CIDB','DataMart',None,'OFFER','IndivID ='+str(cid))
  1679.     except:
  1680.         return make_response(jsonify({"Ratatoskr":"Some problems with SQL request.First of all, check sql connection"}),400)
  1681.     if is_newcust == []:
  1682.         try:
  1683.             conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset="UTF-8")
  1684.             cursor = conn.cursor()
  1685.             select_max_offer = ("Select MAX(OfferID) FROM [DataMart].[OFFER]")
  1686.             cursor.execute(select_max_offer)
  1687.             maxoffer = cursor.fetchone()[0]
  1688.             select_offer_temp = ("Select * from [DataMart].[OFFER_TEMPLATE] WHERE LanguageID="+str(langid))
  1689.             cursor.execute(select_offer_temp)  
  1690.             templates = cursor.fetchall()  
  1691.             i = maxoffer+1
  1692.             for row in templates:  
  1693.                 print i    
  1694.                 insert_queue = (
  1695.                 "INSERT INTO [DataMart].[OFFER](OfferName,OfferStatus,OfferRate,OfferAmount,OfferPayment,OfferPrice,OfferBalance,OfferLimit,OfferPeriod,CashBackRate,OfferDetValidFrom,OfferDetValidTo,OfferValidFrom,OfferValidTo,OfferParam1,OfferParam2,OfferParam3,OfferParam4,OfferLoyaltyScore,OfferDesc,OfferImgID,OfferPrio,ProdID,IndivID,OfferID) VALUES ( '"+row[0]+"' ,'"+row[1]+"' ,'"+str(row[2])+"' ,'"+str(row[3])+"' ,'"+str(row[4])+"' ,'"+str(row[5])+"' ,'"+str(row[6])+"' ,'"+str(row[7])+"' ,'"+str(row[8])+"' ,'"+str(row[9])+"' ,'"+str(row[10])+"' ,'"+str(row[11])+"' ,'"+str(row[12])+"' ,'"+str(row[13])+"' ,'"+row[14]+"' ,'"+row[15]+"' ,'"+str(row[16])+"' ,'"+str(row[17])+"' ,'"+str(row[18])+"' ,'"+row[19].encode("utf-8","ignore")+"' ,'"+str(row[20])+"' ,'"+str(row[21])+"' ,'"+str(row[22])+"' ,'"+str(cid)+"','"+str(i)+"')")
  1696.                 i+=1
  1697.                 cursor.execute(insert_queue)
  1698.             conn.commit()
  1699.             return make_response(jsonify({"Ratatoskr":"Offers for newcommer were succesfully created"}),200)
  1700.         except Exception as e:
  1701.             return make_response(jsonify({"Ratatoskr":"Some problems with inserting offers for new customer occured"}),400)
  1702.     else:
  1703.         return make_response(jsonify({"Ratatoskr":"Offers for this client are already exist"}),201)
  1704.  
  1705. #############################################################################################################################################################################################
  1706. #                                                                                                                                                                                           #
  1707. #                         BLOCK OF /CONTACTS UPDATE                                                          #
  1708. #                                                                                                                                                                                           #
  1709. ###################################################################################################################################################
  1710. @app.route('/contactupd',  methods=['POST','OPTIONS','GET'])
  1711. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1712. def contactupd():
  1713.     try:
  1714.         cid = request.json['cid']
  1715.     except:
  1716.        return make_response(jsonify({"ContactUpdate":"Incorrect input"}),400)
  1717.     ms = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB',charset='UTF8')
  1718.     my = MySQLdb.connect(host=mysqlpath, port = 3306, user="rusrat",passwd="Orion123", db='thebankfront',use_unicode = True,charset='UTF8')
  1719.     cur = ms.cursor()
  1720.     try:
  1721.         cur.execute("UPDATE [DataMart].[INDIVIDUAL] SET Mobile = '79104117361', Email = 'sasdemo@sasbap.demo.com' WHERE IndivID <>" + str(cid))
  1722.         ms.commit()
  1723.     except:
  1724.         return make_response(jsonify({"ContactUpdate":"Some error occurred while updating MSSQL DB"}),418)
  1725.     cur = my.cursor()
  1726.     try:
  1727.         cur.execute("UPDATE `customers` set `MobileNumber`='79104117361',`Email`='sasdemo@sasbap.demo.com' where `CID` <>"+str(cid))
  1728.         my.commit()
  1729.     except Exception as e:
  1730.         return make_response(jsonify({"ContactUpdate":"Some error occured while updating MySQL DB"}),418)
  1731.     return make_response(jsonify({"ContactUpdate":"All customers have been updated"}),200)
  1732. #############################################################################################################################################################################################
  1733. #                                                                                                                                                                                           #
  1734. #                         BLOCK OF /SYNC_UPDT                                                                                                                                            #
  1735. #                                                                                                                                                                                           #
  1736. #############################################################################################################################################################################################
  1737. @app.route('/sync_updt', methods=['POST'])
  1738. def sync_updt():
  1739.     try:
  1740.         app_server = request.json['app_server']
  1741.         web_server = request.json['web_server']
  1742.         soa_server = request.json['soa_server']
  1743.         sync = request.json['sync']
  1744.         freq_in = request.json['freq_in']
  1745.         freq_out = request.json['freq_out']
  1746.         freq_sync = request.json['freq_sync']
  1747.         bool_tmp = dur.set('Settings',json.dumps({"app_server" : app_server,"web_server" : web_server,"soa_server" : soa_server,"sync" : sync,"freq_in" : freq_in,"freq_out" : freq_out,"freq_sync" : freq_sync}))
  1748.         bool_tmp = dur.set('LastSync',json.dumps({"LastRequestTime":strftime("%d.%m.%Y %H:%M:%S",gmtime()),"app_server":app_server,"web_server":web_server,"soa_server":soa_server,"sync":sync,"freq_in":freq_in,"freq_out":freq_out,"freq_sync":freq_sync}))
  1749.         return make_response(jsonify({'Ratatoskr':'request processed'}),201)
  1750.     except Exception:
  1751.         return make_response(jsonify({'Ratatoskr':'input data is corrupted'}),415)
  1752.  
  1753. @app.route('/sync_updt', methods=['GET'])
  1754. def sync_updt2():
  1755.     return make_response(jsonify(json.loads(dur.get('Settings'))),200)
  1756.  
  1757. #############################################################################################################################################################################################
  1758. #                                                                                                                                                                                           #
  1759. #                         BLOCK OF /OFFER_ACCEPT                                                                                                                                            #
  1760. #                                                                                                                                                                                           #
  1761. #############################################################################################################################################################################################
  1762.  
  1763.  
  1764.  
  1765. @app.route('/offer_accept', methods=['POST','GET','OPTIONS'])
  1766. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1767. def offer_accept():
  1768.  
  1769.     try:
  1770.         visibility = request.json['visibility']
  1771.         option = 0
  1772.     except:
  1773.         option = 1
  1774.     if option == 0:    
  1775.         try:
  1776.             context = request.json['type']
  1777.             visibility = request.json['visibility']
  1778.             priority = request.json['priority']
  1779.             accepted_dttm = request.json['accepted_dttm']
  1780.             cid = request.json['clientid']
  1781.             offerid = request.json['offerid']
  1782.             bool_tmp = dur.set('LastOffer',request.data)
  1783.             channel = 'mobile'
  1784.             resptype = 'direct'
  1785.             device = 'in future releases'
  1786.                    
  1787.             if (priority == 1):
  1788.                 #respname = "Accepted"
  1789.                 respname = "Like"
  1790.                 respid = 1
  1791.             elif (visibility == 0 and priority == 0):
  1792.                 #respname = "Denied"
  1793.                 respname = "Unlike"
  1794.                 respid = 2
  1795.             else:
  1796.                 respname = "undefined"
  1797.                 respid = None
  1798.             #.isoformat(sep='T')
  1799.             inputs = {"cid":cid,"channel": channel,"context" : context,"device" : device,"offerid" : offerid,"resptype" : resptype,"respname" : respname,"respid" : respid,"resptime" : datetime.datetime.now().isoformat(sep='T'),"resptimestr" : str(accepted_dttm),"param1" : None,"param2" : None,"param3" : None,"param4" : None,"param5" : None,"param6" : None,"param7" : None}
  1800.         except Exception as e:
  1801.             return make_response(jsonify({'Ratatoskr':e}),415)      
  1802.     else:
  1803.         try:
  1804.             cid = request.json['cid']
  1805.  
  1806.             channel = request.json['channel']
  1807.             context = request.json['context']
  1808.             device = request.json['device']
  1809.  
  1810.             offerid = request.json['offerid']
  1811.             resptype = request.json['resptype']
  1812.             respname = request.json['respname']
  1813.             respid = request.json['respid']
  1814.  
  1815.             resptime = request.json['resptime']
  1816.             param1 = request.json['param1']
  1817.             param2 = request.json['param2']
  1818.             param3 = request.json['param3']
  1819.             param4 = request.json['param4']
  1820.             param5 = request.json['param5']
  1821.             param6 = request.json['param6']
  1822.             param7 = request.json['param7']
  1823.         except Exception as e:
  1824.             return make_response(jsonify({'Ratatoskr':'input data is corrupted','e':str(e)}),406)
  1825.         try:
  1826.             inputs = {"cid":cid,"channel": channel,"context" : context,"device" : device,"offerid" : offerid,"resptype" : resptype,"respname" : respname,"respid" : respid,"resptime" : resptime,"resptimestr" : resptime,"param1" : param1,"param2" : param2,"param3" : param3,"param4" : param4,"param5" : param5,"param6" : param6,"param7" : param7}
  1827.            
  1828.         except Exception:
  1829.             return make_response(jsonify({'Ratatoskr':'error processing site'}),418)  
  1830.     try:
  1831.         result = call_rtdm.apply_async((rtdmpath,"responsehistoryevent",inputs),retry=True)    
  1832.         return make_response(jsonify({'Ratatoskr':str(result)}),201)
  1833.     except Exception as e:
  1834.         return make_response(jsonify({'Ratatoskr':e}),418)  
  1835.  
  1836.  
  1837. #############################################################################################################################################################################################
  1838. #                                                                                                                                                                                           #
  1839. #                         BLOCK OF /LAUNCH                                                                                                                                            #
  1840. #                                                                                                                                                                                           #
  1841. #############################################################################################################################################################################################
  1842. @app.route('/launch', methods=['POST'])
  1843. def launch():
  1844.  
  1845.     try:
  1846.         clientid = request.json['clientid']
  1847.         login = request.json['login']
  1848.         password = request.json['password']
  1849.         scenario = request.json['scenario']
  1850.         Status = {'clientid':clientid,'login':login,'password':password,'scenario':scenario}
  1851.         bool_tmp = dur.set('LastLaunch',json.dumps({"LastRequestTime":strftime("%d.%m.%Y %H:%M:%S",gmtime()),"clientid":clientid,"login":login,"password":password,"scenario":scenario}))
  1852.         print json.loads(dur.get('LastLaunch'))
  1853.         print json.loads(dur.get('LastOffer'))
  1854.         return make_response(jsonify({'Ratatoskr':'request processed'}),201)
  1855.     except Exception:
  1856.  
  1857.         return make_response(jsonify({'Ratatoskr':'input data is corrupted'}),415)
  1858.  
  1859.  
  1860. #############################################################################################################################################################################################
  1861. #                                                                                                                                                                                           #
  1862. #                         BLOCK OF /TRANSACTION GENERATOR                                                                                                                                        #
  1863. #                                                                                                                                                                                           #
  1864. #############################################################################################################################################################################################
  1865.  
  1866. bool_tmp = dur.set('transgenpar',json.dumps(0))
  1867. @app.route('/transgenerate', methods=['GET','POST','OPTIONS'])
  1868. @crossdomain(origin='*',content = 'application/json',headers = 'Content-Type')
  1869. def transgenerate():
  1870.     try:
  1871.         param = request.json['param']
  1872.         if param == 'True':
  1873.             dur.set('transgenpar',json.dumps(1))
  1874.             taskid=transgen.delay()
  1875.             return make_response(jsonify({'Ratatoskr':'Transactions generator is actve'}),200)
  1876.         else:
  1877.             dur.set('transgenpar',json.dumps(0))
  1878.             return make_response(jsonify({'Ratatoskr':'Transactions generator is inactve'}),200)
  1879.     except Exception as e:
  1880.         return make_response(jsonify({'Ratatoskr':e}),415)
  1881.  
  1882.  
  1883. #############################################################################################################################################################################################
  1884. #                                                                                                                                                                                           #
  1885. #                         BLOCK OF /ACTIVE_QUEUE                                                                                                                                     #
  1886. #                                                                                                                                                                                           #
  1887. ########################################################################################################################################################
  1888.  
  1889.  
  1890. #Redis variables initialization. Uncomment if Redis database being cleared
  1891.  
  1892. #bool_tmp = dur.set('Client_list',json.dumps([]))
  1893. #bool_tmp = dur.set('Terminal',json.dumps([]))
  1894.  
  1895. if dur.get('Client_list') == None:
  1896.     bool_tmp = dur.set('Client_list',json.dumps([]))
  1897.  
  1898. if dur.get('Terminal') == None:
  1899.     bool_tmp = dur.set('Terminal',json.dumps([]))
  1900.  
  1901. bool_tmp = dur.set('client_cnt',json.dumps(1))
  1902. bool_tmp = dur.set('updated',json.dumps(0))
  1903. bool_tmp = dur.set('upd',json.dumps(0))
  1904.  
  1905.  
  1906.  
  1907. @app.route('/active_queue', methods=['POST','OPTIONS'])
  1908. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1909. def active_queue():  
  1910.     try:
  1911.         client_fname = request.json['name']
  1912.         client_lname = request.json['surname']
  1913.         client_mname = request.json['middlename']
  1914.         client_dob = request.json['dob']
  1915.         client_id = request.json['id']
  1916.         client_status = request.json['status']
  1917.         client_reason = request.json['reason']
  1918.         client_location = request.json['location']
  1919.         client_area = request.json['area']
  1920.     except:
  1921.         return make_response(jsonify({'Ratatoskr':'Incorrect input'}),415)
  1922.     if json.loads(dur.get('Client_list')) == []:
  1923.         Client_profile = {'client_num':str(json.loads(dur.get('client_cnt'))),'time':strftime("%d.%m.%Y %H:%M:%S",gmtime()),'id':client_id,'name':client_fname,'last_name':client_lname,'middle_name':client_mname,'dob':client_dob,'status':client_status,'reason':client_reason,'location':client_location,"area":client_area}
  1924.         dur_tmp = json.loads(dur.get('Client_list'))
  1925.         dur_tmp.append(Client_profile)
  1926.         bool_tmp = dur.set('Client_list',json.dumps(dur_tmp))
  1927.         dur_tmp = json.loads(dur.get('client_cnt'))
  1928.         dur_tmp +=1
  1929.         bool_tmp = dur.set('client_cnt',json.dumps(dur_tmp))
  1930.  
  1931.     else:
  1932.         bool_tmp = dur.set('updated',json.dumps(0))
  1933.         dur_tmp = json.loads(dur.get('Client_list'))
  1934.         for obj in dur_tmp:
  1935.             if obj['id'] == client_id:
  1936.                 obj['location'] = client_location
  1937.                 obj['reason'] = client_reason
  1938.                 obj['area'] = client_area
  1939.                 obj['time'] = strftime("%d.%m.%Y %H:%M:%S",gmtime())
  1940.                 dur.set('Client_list',json.dumps(dur_tmp))
  1941.                 bool_tmp = dur.set('updated',json.dumps(1))
  1942.         if json.loads(dur.get('updated')) == 0:
  1943.             Client_profile = {'client_num':str(json.loads(dur.get('client_cnt'))),'time':strftime("%d.%m.%Y %H:%M:%S",gmtime()),'id':client_id,'name':client_fname,'last_name':client_lname,'middle_name':client_mname,'dob':client_dob,'status':client_status,'reason':client_reason,'location':client_location,"area":client_area}
  1944.             dur_tmp = json.loads(dur.get('Client_list'))
  1945.             dur_tmp.append(Client_profile)
  1946.             bool_tmp = dur.set('Client_list',json.dumps(dur_tmp))
  1947.             dur_tmp = json.loads(dur.get('client_cnt'))
  1948.             dur_tmp +=1
  1949.             bool_tmp = dur.set('client_cnt',json.dumps(dur_tmp))    
  1950.     return make_response(jsonify({'Ratatoskr':'good','TEST': json.loads(dur.get('Client_list'))}),200)
  1951.  
  1952.  
  1953.  
  1954. @app.route('/active_queue', methods=['GET'])
  1955. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1956. def CList():
  1957.     currdate = strftime("%d.%m.%Y %H:%M:%S",gmtime())
  1958.     Newcommers = []
  1959.     Full = []
  1960.     opt = request.args.get('option')
  1961.     if (opt is not None):
  1962.         if (opt == "new"):
  1963.             dur_tmp = json.loads(dur.get('Client_list'))
  1964.             for obj in dur_tmp:
  1965.                 if datetime.datetime.strptime(currdate,'%d.%m.%Y %H:%M:%S') - datetime.datetime.strptime(obj['time'],'%d.%m.%Y %H:%M:%S') < datetime.timedelta(0,10) and (obj['location'] == 'terminal' or obj['location'] == 'camera' or obj['location'] == 'ATM' or obj['location'] == 'The Store' or obj['location'] == 'The Bank'):
  1966.                     Newcommer_profile = {'client_num':obj['client_num'],'time':obj['time'],'id':obj['id'],'name':obj['name'],'last_name':obj['last_name'],'middle_name':obj['middle_name'],'dob':obj['dob'],'status':obj['status'],'reason':obj['reason'],'location':obj['location'],'area':obj['area'],'photo':get_client(obj['id'])[25].replace(" ","+")}
  1967.                     Newcommers.append(Newcommer_profile)
  1968.             return make_response(jsonify({'Ratatoskr':Newcommers}),200)
  1969.         if (opt == "full"):
  1970.             dur_tmp = json.loads(dur.get('Client_list'))
  1971.             for obj in dur_tmp:
  1972.                 Full_profile = {'client_num':obj['client_num'],'time':obj['time'],'id':obj['id'],'name':obj['name'],'last_name':obj['last_name'],'middle_name':obj['middle_name'],'dob':obj['dob'],'status':obj['status'],'reason':obj['reason'],'location':obj['location'],'area':obj['area'],'photo':get_client(obj['id'])[25].replace(" ","+")}
  1973.                 Full.append(Full_profile)
  1974.                 #Full.append(obj['id'])
  1975.             return make_response(jsonify({'Ratatoskr':Full}),200)
  1976.         if (opt == "terminal"):
  1977.             return make_response(jsonify({'Ratatoskr':json.loads(dur.get('Terminal'))}),200)
  1978.     else:
  1979.         if json.loads(dur.get('Client_list')) != []:
  1980.             return make_response(jsonify({'Ratatoskr':json.loads(dur.get('Client_list'))}),200)
  1981.         else:
  1982.             return make_response(jsonify({'Ratatoskr':'There are no clients in queue'}),200)
  1983.  
  1984.  
  1985. @app.route('/active_queue', methods=['PUT'])
  1986. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  1987. def dltclt():
  1988.     opt = request.args.get('option')
  1989.     if (opt is not None):
  1990.         if (opt == "terminal"):
  1991.             try:
  1992.                 client_id = request.json['id']
  1993.                 client_image = request.json['image']
  1994.             except:
  1995.                 return make_response(jsonify({'Ratatoskr':'Incorrect input'}),415)
  1996.             if json.loads(dur.get('Terminal')) == []:
  1997.                 dur_tmp = json.loads(dur.get('Terminal'))
  1998.                 Terminal_profile = {'client_id':client_id,'client_image':client_image}
  1999.                 dur_tmp.append(Terminal_profile)
  2000.                 bool_tmp = dur.set('Terminal',json.dumps(dur_tmp))
  2001.             else:
  2002.                 bool_tmp = dur.set('upd',json.dumps(0))
  2003.                 dur_tmp = json.loads(dur.get('Terminal'))
  2004.                 for obj in dur_tmp:
  2005.                     if obj['client_id'] == client_id:
  2006.                         obj['client_image'] = client_image
  2007.                         dur.set('Terminal',json.dumps(dur_tmp))
  2008.                         bool_tmp = dur.set('upd',json.dumps(1))
  2009.                 if json.loads(dur.get('upd')) == 0:
  2010.                     Terminal_profile = {'client_id':client_id,'client_image':client_image}
  2011.                     dur_tmp.append(Terminal_profile)
  2012.                     dur.set('Terminal',json.dumps(dur_tmp))
  2013.             return make_response(jsonify({'Ratatoskr':'Success'}),200)
  2014.     else:
  2015.         try:
  2016.             cid = request.json['id']
  2017.         except:
  2018.             return make_response(jsonify({'Ratatoskr':'No correct id'}),415)
  2019.         dur_tmp = json.loads(dur.get('Client_list'))
  2020.         for i in reversed(range(len(dur_tmp))):
  2021.             if dur_tmp[i].get('id') == cid:
  2022.                 dur_tmp.pop(i)
  2023.         bool_tmp = dur.set('Client_list',json.dumps(dur_tmp))
  2024.         return make_response(jsonify({'Ratatoskr':json.loads(dur.get('Client_list'))}),200)
  2025.            
  2026.            
  2027.  
  2028. #############################################################################################################################################################################################
  2029. #                                                                                                                                                                                           #
  2030. #                         BLOCK OF /ATM                                                                                                                                                     #
  2031. #                                                                                                                                                                                           #
  2032. #############################################################################################################################################################################################
  2033. bool_tmp = dur.set('atm_status',json.dumps(True))
  2034. @app.route('/atm_status', methods=['GET'])
  2035. @crossdomain(origin='*')
  2036. def get_atm_status():
  2037.     global atm_status
  2038.    
  2039.     change = request.args.get('change')
  2040.    
  2041.     if (change is not None):
  2042.         if (change == "true"):
  2043.             bool_tmp = dur.set('atm_status',json.dumps(True))
  2044.         else:
  2045.             bool_tmp = dur.set('atm_status',json.dumps(False))
  2046.     return make_response(jsonify({'status':json.loads(dur.get('atm_status'))}),200)
  2047.  
  2048.  
  2049. @app.route('/atm_status', methods=['POST'])
  2050. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  2051. def set_atm_status():
  2052.     try:
  2053.         TID= request.json["TID"]
  2054.         Status = request.json["Status"]
  2055.     except:
  2056.         return make_response(jsonify({'Ratatoskr':'TID is incorrect'}),400)
  2057.     conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  2058.     cursor = conn.cursor()
  2059.     sql=(
  2060.        
  2061.         "UPDATE [TRANSData].[TERMINAL] SET TermStatus='"+Status+"' WHERE TermID="+str(TID)+""
  2062.         "COMMIT")
  2063.     cursor.execute(sql)    
  2064.     return make_response(jsonify({'Ratatoskr':'Terminal status has been updated'}),200)
  2065.  
  2066.  
  2067. #############################################################################################################################################################################################
  2068. #                                                                                                                                                                                           #
  2069. #                         BLOCK OF /BANNER                                                                                                                                                 #
  2070. #                                                                                                                                                                                           #
  2071. #############################################################################################################################################################################################
  2072.  
  2073. @app.route('/banner', methods=['POST','OPTIONS'])
  2074. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  2075. def banner():
  2076.     try:
  2077.         UID = request.json["uid"]
  2078.         placement = request.json["placement"]
  2079.         banner_id = request.json["banner_id"]
  2080.         if banner_id == 'cabinet':
  2081.             banner_code = '<div style="height:270px;width:825px;background:linear-gradient(to right,#DDDCD9,white 600px)"><div style="height:270px;width:230px;float:left"><img id="label_img" src="http://www.evro-almaz.by/images/app/label_2.png" style="width:307px;height:200px;position:relative;right:25%;transform:rotate(25deg)"></img></div><div style="heigth:270px;width:315px;float:left"><h2 style="text-align:center;position:relative;margin-top:70px;color:blue">New Collection.<br>Try it now.</h2></div><div style="height:270px;width:275px;float:left"><img id="prod_img" src="http://www.evro-almaz.by/images/app/girl_jeans_1.png" style="height:100%;float:right"></img></div></div>'
  2082.         elif banner_id == 'slider':
  2083.             banner_code = '<div style="height:400px;width:760px;background-image:url(http://www.evro-almaz.by/images/app/slider_1.png);background-size:cover"></div>'
  2084.         elif banner_id == 'right':
  2085.             banner_code = '<div style="height:400px;width:350px;background-image:url(http://www.evro-almaz.by/images/app/right_finalsale_1.png);background-size:cover"></div>'  
  2086.         elif banner_id == 'leftdown':
  2087.             banner_code = '<div style="height:400px;width:250px;background-image:url(http://www.evro-almaz.by/images/app/leftdown_1.png);background-size:cover"><div style="background-color:white;opacity:0.5;border-radius:14px;position:relative;text-align:center;top:80%"><h3>Do not miss</h3></div></div>'  
  2088.         elif banner_id == 'left':
  2089.             banner_code = '<div style="height:170px;width:255px;background-image:url(http://www.evro-almaz.by/images/app/deleft_1.png);background-size:cover"></div>'  
  2090.         else:
  2091.             banner_code = 'no banner with specified banner_id'
  2092.         time.sleep(1)
  2093.         return banner_code
  2094.     except Exception as e:
  2095.         return make_response(jsonify({'Ratatoskr':e}),400)
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103. #############################################################################################################################################################################################
  2104. #                                                                                                                                                                                           #
  2105. #                         BLOCK OF /CreditCard                                                                                                                                                #
  2106. #                                                                                                                                                                                           #
  2107. #############################################################################################################################################################################################
  2108.  
  2109. @app.route('/ccard', methods=['POST','GET','OPTIONS'])
  2110. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  2111. def card():
  2112.    
  2113.     IndivID = request.json["IndivID"]
  2114.     AppForename = request.json["AppForename"]
  2115.     AppSurname = request.json["AppSurname"]
  2116.     AppMiddlename = request.json["AppMiddlename"]
  2117.     AppEducation = request.json["AppEducation"]
  2118.     AppAge = request.json["AppAge"]
  2119.     AppPassportNumber = request.json["AppPassportNumber"]
  2120.     AppFamilySize = request.json["AppFamilySize"]
  2121.     AppCarOwner = request.json["AppCarOwner"]
  2122.     AppMobile = request.json["AppMobile"]
  2123.     AppEmail = request.json["AppEmail"]
  2124.     AppJobPos = request.json["AppJobPos"]
  2125.     AppIncome = request.json["AppIncome"]
  2126.     AppJobExp = request.json["AppJobExp"]
  2127.    
  2128.     inputs = {"IndivID":IndivID,"AppForename":AppForename,"AppSurname":AppSurname,"AppMiddlename":AppMiddlename,"AppEducation":AppEducation,"AppAge":AppAge,"AppPassportNumber":AppPassportNumber,"AppFamilySize":AppFamilySize,
  2129. "AppCarOwner":AppCarOwner,"AppMobile":AppMobile,"AppEmail":AppEmail,"AppJobPos":AppJobPos,"AppIncome":AppIncome,"AppJobExp":AppJobExp}
  2130.    
  2131.     try:
  2132.         dns = "10.20.1.30:7980"
  2133.         event = "OnlineCCScoring"
  2134.         rtdm_addr = "http://"+dns+"/RTDM/rest/runtime/decisions/"+event
  2135.         payload = {"clientTimeZone":"Europe/Moscow","version":1,"inputs":inputs}
  2136.         result = call_rtdm.apply_async((dns,"OnlineCCScoring",inputs),retry=True)
  2137.         print ("Call OnlineCCScoring" + " " + str(result))
  2138.         return make_response(jsonify({'Ratatoskr':'ok'}),201)
  2139.     except:
  2140.         return make_response(jsonify({'Ratatoskr':'error'}),418)
  2141.        
  2142.  
  2143.  
  2144.    
  2145.  
  2146. #############################################################################################################################################################################################
  2147. #                                                                                                                                                                                           #
  2148. #                         BLOCK OF /LimitControl                                                                                                                                            #
  2149. #                                                                                                                                                                                           #
  2150. #############################################################################################################################################################################################
  2151. @app.route('/limit', methods=['POST','OPTIONS'])
  2152. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  2153. def limit():
  2154.     try:
  2155.         Limit = request.json["Limit"]
  2156.         CID = request.json["CID"]
  2157.         TID = request.json["TID"]
  2158.         Type = request.json["Type"]
  2159.     except:
  2160.         return make_response(jsonify({"Ratatoskr":'input values are corrupt'}),400)
  2161.     conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  2162.     cursor = conn.cursor()
  2163.     cursor.execute('SELECT AccountBalance FROM [DataMart].[ACCOUNT] WHERE IndivID ='+str(CID))
  2164.     data = cursor.fetchone()
  2165.     if data == None:
  2166.         return make_response(jsonify({"Ratatoskr":'There is no client with specified id in database'}),204)
  2167.     curlimit = int(data[0])
  2168.     cursor.execute('SELECT TermStatus FROM [TRANSData].[TERMINAL] WHERE TermID ='+str(TID))
  2169.     data = cursor.fetchone()
  2170.     termstatus = data[0]
  2171.     cursor.execute("SELECT MAX(AccountID),MIN(AccountID) FROM [DataMart].[ACCOUNT] WHERE IndivID ="+str(CID)+" AND AccountType='card'")
  2172.     data = cursor.fetchone()
  2173.     maxacc = data[0]
  2174.     minacc = data[1]
  2175.     cursor.execute('SELECT CardID FROM [DataMart].[Card] WHERE IndivID ='+str(CID))
  2176.     data = cursor.fetchall()
  2177.     cardid = [int(i[0]) for i in data]
  2178.     if termstatus == "nocash":
  2179.         trans={'TransID':randint(1,10000),'CardID':choice(cardid),'AccountID':randint(minacc,maxacc),'TermID':TID,
  2180. 'TransStatus':'error','TransDate':strftime("%d.%m.%Y %H:%M:%S",gmtime()),'TransSum':Limit,'TransCurrency':'rub','TransType':Type,
  2181. 'TransInfo':"atmerror",'TransParam1':'','TransParam2':'','TransParam3':'','TransParam4':''}
  2182.         que_result = rabbitmq_add('trans_mq','t_mq',json.dumps(trans,ensure_ascii=False),'application/json','trans_mq')
  2183.         payload = {"name":"","surname":"","middlename":"","dob":"","id":int(CID),"status":"processing","reason":600,"location":"ATM","area":"bank"}
  2184.         try:
  2185.             resultATM = call_service.apply_async(("active_queue",payload),retry=True)
  2186.         except:
  2187.              return make_response(jsonify({"Ratatoskr":'Some problems with client queue update. Check if payload is correct'}),400)
  2188.         return make_response(jsonify({"Ratatoskr":'ATM has no money'}),202)
  2189.     elif termstatus == "work":
  2190.         if curlimit-Limit >= 0:
  2191.             trans={'TransID':randint(1,10000),'CardID':choice(cardid),'AccountID':randint(minacc,maxacc),'TermID':TID,
  2192. 'TransStatus':'ok','TransDate':strftime("%d.%m.%Y %H:%M:%S",gmtime()),'TransSum':Limit,'TransCurrency':'rub','TransType':Type,
  2193. 'TransInfo':"",'TransParam1':'','TransParam2':'','TransParam3':'','TransParam4':''}
  2194.             que_result = rabbitmq_add('trans_mq','t_mq',json.dumps(trans,ensure_ascii=False),'application/json','trans_mq')
  2195.             print trans
  2196.  
  2197.             # code changed begin
  2198.             curlimit -= Limit
  2199.             cursor.execute('UPDATE [DataMart].[ACCOUNT] SET AccountBalance = ' + curlimit + ' WHERE IndivID = '+str(CID))
  2200.  
  2201.             inputs = {
  2202.                 'IndivID': str(CID),
  2203.                 'Channel': '', 'Phones': '',
  2204.                 'Message': 'Your transaction well done',
  2205.                 'Sender': '',
  2206.                 'param1': '',
  2207.                 'param2': '',
  2208.                 'param3': '',
  2209.                 'param4': ''
  2210.             }
  2211.  
  2212.             dns = '10.20.1.30:7980'
  2213.             try:
  2214.                 call_rtdm.apply_async((dns, 'SendMessage', inputs), retry=True)
  2215.             except Exception as e:
  2216.                 return make_response(jsonify({'ContactPolicy': e}), 400)
  2217.             # code changed end
  2218.  
  2219.             return make_response(jsonify({"Ratatoskr":'Transaction has been generated'}),200)
  2220.         else:
  2221.             trans={'TransID':randint(1,10000),'CardID':choice(cardid),'AccountID':randint(minacc,maxacc),'TermID':TID,
  2222. 'TransStatus':'refusal','TransDate':strftime("%d.%m.%Y %H:%M:%S",gmtime()),'TransSum':Limit,'TransCurrency':'rub','TransType':Type,
  2223. 'TransInfo':"proddetlimit",'TransParam1':'','TransParam2':'','TransParam3':'','TransParam4':''}
  2224.             que_result = rabbitmq_add('trans_mq','t_mq',json.dumps(trans,ensure_ascii=False),'application/json','trans_mq')
  2225.  
  2226.             # code changed begin
  2227.             inputs = {
  2228.                 'IndivID': str(CID),
  2229.                 'Channel': '', 'Phones': '',
  2230.                 'Message': 'Sorry, your current limit is exceeded. Transaction was rejected.',
  2231.                 'Sender': '',
  2232.                 'param1': '',
  2233.                 'param2': '',
  2234.                 'param3': '',
  2235.                 'param4': ''
  2236.             }
  2237.  
  2238.             dns = "10.20.1.30:7980"
  2239.             try:
  2240.                 call_rtdm.apply_async((dns, 'SendMessage', inputs), retry=True)
  2241.             except Exception as e:
  2242.                 return make_response(jsonify({'ContactPolicy': e}), 400)
  2243.             # code changed end
  2244.  
  2245.             return make_response(jsonify({"Ratatoskr":'Limit is exceeded'}),201)
  2246.     else:
  2247.         return make_response(jsonify({"Ratatoskr":'ATM is out of servce'}),203)
  2248.  
  2249.  
  2250. @app.route('/limit', methods=['GET'])
  2251. @crossdomain(origin='*', content = 'application/json',headers = 'Content-Type')
  2252. def getlimit():
  2253.     try:
  2254.         cid = request.args.get('cid')
  2255.     except:
  2256.         return make_response(jsonify({"Ratatoskr":'Icorrect unput'}),400)
  2257.     conn = pymssql.connect(server = mssqlpath,user = 'rtdm',password = 'Orion123',database='CIDB')
  2258.     cursor = conn.cursor()
  2259.     cursor.execute('SELECT AccountBalance FROM [DataMart].[ACCOUNT] WHERE IndivID ='+str(cid))
  2260.     data = cursor.fetchone()
  2261.     if data != None:
  2262.         curlimit = int(data[0])  
  2263.     else:
  2264.         return make_response(jsonify({"Ratatoskr":'There is no account with specified client id in database'}),201)
  2265.     return make_response(jsonify({"Ratatoskr":curlimit}),200)
  2266.    
  2267.  
  2268.  
  2269. #############################################################################################################################################################################################
  2270. #                                                                                                                                                                                           #
  2271. #                         BLOCK OF /LUNA                                                                                                                                                    #
  2272. #                                                                                                                                                                                           #
  2273. #############################################################################################################################################################################################
  2274. @app.route('/luna', methods=['GET'])
  2275. @crossdomain(origin='*')
  2276. def result_luna():
  2277.     if dur.get('lunaresp') == None:
  2278.         dur.set('lunaresp','never used')
  2279.     if dur.get('lunaans') == None:
  2280.         dur.set('lunaans','never used')
  2281.     if dur.get('req_image') == None:
  2282.         dur.set('req_image','')
  2283.     if dur.get('rid') == None:
  2284.         dur.set('rid',0)
  2285.     return make_response(jsonify({'Ratatoskr':dur.get('lunaresp'),'Luna':dur.get('lunaans'), 'image':dur.get('req_image'), 'rid':json.loads(dur.get('rid'))}))
  2286.    
  2287. @app.route('/luna', methods=['OPTIONS'])
  2288. @crossdomain(origin='*',headers = 'Content-Type')
  2289. def send_options():
  2290.     return make_response(jsonify({'Ratatoskr':'PUT, GET'}))
  2291.  
  2292. @app.route('/luna', methods=['PUT'])
  2293. @crossdomain(origin='*',headers = 'Content-Type', content = 'application/json')
  2294. def call_luna():
  2295.     image = ''
  2296.     try:
  2297.         image = request.json["data"]
  2298.     except Exception:
  2299.         return make_response(jsonify({'Ratatoskr':'Missing attribute data (image)'}),422)
  2300.     if (image == ""):
  2301.         return make_response(jsonify({'Ratatoskr':'Empty attribute data (image)'}),422)
  2302.     bool_tmp = dur.set('req_image',image)
  2303.     #rid - applicant image , cid - client ID , bare - write to DB (True - no, False - yes)    
  2304.     try:
  2305.         rid = request.json["rid"]
  2306.         bool_tmp = dur.set('rid',json.dumps(rid))
  2307.     except Exception:
  2308.         bool_tmp = dur.set('rid',json.dumps(500000))
  2309.     if json.loads(dur.get('rid'))<500000:
  2310.         dur_tmp = json.loads(dur.get('rid'))
  2311.         dur_tmp += 500000
  2312.         bool_tmp = dur.set('rid',json.dumps(dur_tmp))
  2313.     try:
  2314.         cid = request.json["cid"]
  2315.     except Exception:
  2316.         cid = ''
  2317.     try:
  2318.         bare = request.json["bare"]
  2319.     except Exception:
  2320.         bare = True
  2321.     try:
  2322.         match_flg = request.json["match"]
  2323.     except Exception:
  2324.         match_flg = False
  2325.  
  2326.     url = "http://"+lunapath+":8083/5/templates"
  2327.    
  2328.     payload = {"image":image, "bare":bare}
  2329.     try:
  2330.         r = requests.post(url,json = payload)
  2331.         bool_tmp = dur.set('lunaans',r.json())
  2332.         status = str(r)
  2333.     except Exception:
  2334.         bool_tmp = dur.set('lunaresp','Luna service is unreachable or unavailable')
  2335.         bool_tmp = dur.set('lunaans','Luna service is unreachable or unavailable')
  2336.         return make_response(jsonify({'Ratatoskr':dur.get('lunaresp')}),  415)  
  2337.  
  2338.      
  2339.     if ((("200") in status)  and (match_flg == False)):
  2340.         bool_tmp = dur.set('lunaresp','Luna has processed the image')
  2341.         return make_response(jsonify({'Ratatoskr': dur.get('lunaresp'),'Luna':str(r.json()),'score':r.json()["score"]}),  200)
  2342.  
  2343.     elif ((("201") in status)  and (match_flg == False)):  
  2344.         bool_tmp = dur.set('lunaresp','Luna has processed and saved the image')
  2345.         bool_tmp = dur.set('rid',r.json()["id"])
  2346.         return make_response(jsonify({'Ratatoskr': dur.get('lunaresp'),'Luna':str(r.json()),'score':r.json()["score"],'rid':json.loads(dur.get('rid'))}),  201)
  2347.  
  2348.     elif ((("201") in status)  and (match_flg == True)):
  2349.         if cid != '':
  2350.             try:
  2351.                 candidates = str(get_client(cid)[26])
  2352.             except Exception:
  2353.                bool_tmp = dur.set('lunaresp','Client not found')
  2354.                return make_response(jsonify({'Ratatoskr': dur.get('lunaresp')}), 500)
  2355.         else:
  2356.             candidates = str(get_all_clients())[1:-1]
  2357.          
  2358.  
  2359.         bool_tmp = dur.set('rid',r.json()["id"])
  2360.         url_get = "http://"+lunapath+":8083/5/similar_templates?id="+str(json.loads(dur.get('rid')))+"&candidates="+candidates
  2361.         g = requests.get(url_get)
  2362.        
  2363.         try:
  2364.            v = []
  2365.            for item in g.json().iteritems():
  2366.                v.append(item)
  2367.            score = v[0][1][0]["similarity"]
  2368.            photoid = v[0][1][0]["id"]
  2369.            clientid = get_cid_byphotoid(photoid)
  2370.            clientinfo = get_client(clientid)
  2371.         except Exception:
  2372.             bool_tmp = dur.set('lunaresp','Client photo not found in Luna. Check cid or photoid')
  2373.             return make_response(jsonify({'Ratatoskr': dur.get('lunaresp'),'url':url_get,'rid':json.loads(dur.get('rid')),'photoid':photoid}), 500)
  2374.  
  2375.         bool_tmp = dur.set('lunaresp','Luna has saved and matched the image')
  2376.         name = clientinfo[1]
  2377.         surname = clientinfo[3]
  2378.         middlename = clientinfo[2]
  2379.         gender = clientinfo[6]
  2380.         mobile = clientinfo[5]
  2381.         dob = str(clientinfo[9])
  2382.        
  2383.  
  2384.         return make_response(jsonify({'Ratatoskr':dur.get('lunaresp'),'score':score, 'client':clientid,
  2385. 'name':name,'surname':surname, 'middlename':middlename, 'gender':gender, 'mobile':mobile, 'dob':dob,'Luna':g.text, 'url':url_get,'rid':json.loads(dur.get('rid'))}), 201)
  2386.  
  2387.     elif ((("200") in status)  and (match_flg == True)):
  2388.         bool_tmp = dur.set('lunaresp','That will not work. Maybe \'bare\' should be \'false\' or there is an ambiguous \'match\' option?')
  2389.         return make_response(jsonify({'Ratatoskr': dur.get('lunaresp')}), 422)
  2390.  
  2391.     elif ("500" in status):
  2392.         bool_tmp = dur.set('lunaresp','Luna failed on upload')
  2393.         return make_response(jsonify({'Ratatoskr': dur.get('lunaresp')}), 451)      
  2394.     else:
  2395.         bool_tmp = dur.set('lunaresp','Ooops... something unexpected happened')
  2396.         return make_response(jsonify({'Ratatoskr': dur.get('lunaresp')+' Response code is '+status}), 418)
  2397.  
  2398.  
  2399. #Error handler
  2400. @app.errorhandler(404)
  2401. def not_found(error):
  2402.     return make_response(jsonify({'Ratatoskr': 'Service not found'}), 404)
  2403.  
  2404. if __name__ == '__main__':
  2405.     app.run(host=server_ip,debug=True,threaded = True )
  2406. #threaded = True processes = 4
Add Comment
Please, Sign In to add comment