Bläddra i källkod

new working handlers

stucked_s 5 månader sedan
förälder
incheckning
3920524cd1

+ 4 - 0
handlers/BotClass.py

@@ -66,3 +66,7 @@ class JabberBot:
             #handler(args)
             handler()
             pass
+    
+    def stop(self):
+        # Disconnect from the Jabber server
+        self.client.disconnect()

+ 113 - 13
handlers/jsonAndRequest.py

@@ -60,16 +60,70 @@ https://wiki.sharix-app.org/doku.php/open/tech/dev/sharix_open_-_primery_json
 }
 '''
 #надо адаптировать класс к новому формату JSON
-class Order(object):
-    def __init__(self, order_synced, ticket, status, title, note, due_date, id_metaservice, is_global, is_visible, service, service_type, status_changed_date, time_placed, time_start=None, time_start_predicted=None, time_finish_predicted=None, time_start_real=None, time_finish_real=None, order_place_type=None, order_place_start=None, order_place_start_gps=None, order_place_start_real=None, order_place_start_real_gps=None, order_place_finish_predicted=None, order_place_finish_predicted_gps=None, order_place_finish_real=None, order_place_finish_real_gps=None, predicted_price=None, real_price=None, payment_transaction_id=None, rating_id=None, provider=None, provider_screen_name=None, receiver=None, receiver_screen_name=None, client_id=None, resource_id=None, attempts=None, asap=None):
-        self.order_synced = order_synced
+# class Order(object):
+#     def __init__(self, id,order_synced, ticket, status, title, note, due_date, id_metaservice, is_global, is_visible, service, service_type, status_changed_date,time_created, time_placed, time_start=None, time_start_predicted=None, time_finish_predicted=None, time_start_real=None, time_finish_real=None, order_place_type=None, order_place_start=None, order_place_start_gps=None, order_place_start_real=None, order_place_start_real_gps=None, order_place_finish_predicted=None, order_place_finish_predicted_gps=None, order_place_finish_real=None, order_place_finish_real_gps=None, predicted_price=None, real_price=None, payment_transaction_id=None, rating_id=None, provider=None, provider_screen_name=None, receiver=None, receiver_screen_name=None, client_id=None, resource_id=None, attempts=None, asap=None):
+#         self.order_synced = order_synced
+#         self.id = id
+#         self.ticket = ticket
+#         self.status = status
+
+#         self.title = title
+#         self.note = note
+#         self.due_date = due_date
+
+#         self.id_metaservice = id_metaservice
+#         self.is_global = is_global
+#         self.is_visible = is_visible
+#         self.service = service
+#         self.service_type = service_type
 
+#         self.status_changed_date = status_changed_date
+#         self.time_created = time_created
+#         self.time_placed = time_placed
+#         self.time_start = time_start
+#         self.time_start_predicted = time_start_predicted
+#         self.time_finish_predicted = time_finish_predicted
+#         self.time_start_real = time_start_real
+#         self.time_finish_real = time_finish_real
+
+#         self.order_place_type =order_place_type
+#         self.order_place_start = order_place_start
+#         self.order_place_start_gps = order_place_start_gps
+#         self.order_place_start_real = order_place_start_real
+#         self.order_place_start_real_gps = order_place_start_real_gps
+#         self.order_place_finish_predicted = order_place_finish_predicted
+#         self.order_place_finish_predicted_gps = order_place_finish_predicted_gps
+#         self.order_place_finish_real = order_place_finish_real
+#         self.order_place_finish_real_gps = order_place_finish_real_gps
+
+#         self.predicted_price = predicted_price
+#         self.real_price = real_price
+
+#         self.payment_transaction_id = payment_transaction_id
+#         self.rating_id = rating_id
+
+#         self.provider = provider
+#         self.provider_screen_name = provider_screen_name
+#         self.receiver = receiver
+#         self.receiver_screen_name = receiver_screen_name
+#         self.client_id = client_id
+#         self.resource_id = resource_id
+#         self.attempts = attempts
+#         self.asap = asap
+#         #доделать до конца по аналогии с закоммиченным json
+#     def __str__(self):
+#         return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32} , {33} ,{34}".format(self.order_synced, self.id, self.ticket, self.status, self.title, self.note, self.due_date, self.id_metaservice, self.is_global, self.is_visible, self.service, self.service_type, self.status_changed_date, self.time_created,self.time_placed, self.time_start, self.time_start_predicted, self.time_finish_predicted, self.time_start_real, self.time_finish_real, self.order_place_type, self.order_place_start, self.order_place_start_gps, self.order_place_start_real, self.order_place_start_real_gps, self.order_place_finish_predicted, self.order_place_finish_predicted_gps, self.order_place_finish_real, self.order_place_finish_real_gps, self.predicted_price, self.real_price, self.payment_transaction_id, self.rating_id, self.provider, self.provider_screen_name, self.receiver, self.receiver_screen_name, self.client_id, self.resource_id, self.attempts, self.asap)
+
+        #\n добавляете в местах с пустой строкой в шаблоне
+        
+class Order(object):
+    def __init__(self, id, ticket, status, title, note, id_metaservice, is_global, is_visible, service, service_type,time_created, time_placed, time_start=None, time_start_predicted=None, time_finish_predicted=None, time_start_real=None, time_finish_real=None, order_place_type=None, order_place_start=None, order_place_start_gps=None, order_place_start_real=None, order_place_start_real_gps=None, order_place_finish_predicted=None, order_place_finish_predicted_gps=None, order_place_finish_real=None, order_place_finish_real_gps=None, predicted_price=None, real_price=None, payment_transaction_id=None, rating_id=None, provider=None, provider_screen_name=None, receiver=None, receiver_screen_name=None, client_id=None, resource_id=None, attempts=None, asap=None):
+        self.id = id
         self.ticket = ticket
         self.status = status
 
         self.title = title
         self.note = note
-        self.due_date = due_date
 
         self.id_metaservice = id_metaservice
         self.is_global = is_global
@@ -77,7 +131,7 @@ class Order(object):
         self.service = service
         self.service_type = service_type
 
-        self.status_changed_date = status_changed_date
+        self.time_created = time_created
         self.time_placed = time_placed
         self.time_start = time_start
         self.time_start_predicted = time_start_predicted
@@ -111,10 +165,11 @@ class Order(object):
         self.asap = asap
         #доделать до конца по аналогии с закоммиченным json
     def __str__(self):
-        return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}".format(self.order_synced, self.ticket, self.status, self.title, self.note, self.due_date, self.id_metaservice, self.is_global, self.is_visible, self.service, self.service_type, self.status_changed_date, self.time_placed, self.time_start, self.time_start_predicted, self.time_finish_predicted, self.time_start_real, self.time_finish_real, self.order_place_type, self.order_place_start, self.order_place_start_gps, self.order_place_start_real, self.order_place_start_real_gps, self.order_place_finish_predicted, self.order_place_finish_predicted_gps, self.order_place_finish_real, self.order_place_finish_real_gps, self.predicted_price, self.real_price, self.payment_transaction_id, self.rating_id, self.provider, self.provider_screen_name, self.receiver, self.receiver_screen_name, self.client_id, self.resource_id, self.attempts, self.asap)
+        return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}".format( self.id, self.ticket, self.status, self.title, self.note, self.id_metaservice, self.is_global, self.is_visible, self.service, self.service_type, self.time_created,self.time_placed, self.time_start, self.time_start_predicted, self.time_finish_predicted, self.time_start_real, self.time_finish_real, self.order_place_type, self.order_place_start, self.order_place_start_gps, self.order_place_start_real, self.order_place_start_real_gps, self.order_place_finish_predicted, self.order_place_finish_predicted_gps, self.order_place_finish_real, self.order_place_finish_real_gps, self.predicted_price, self.real_price, self.payment_transaction_id, self.rating_id, self.provider, self.provider_screen_name, self.receiver, self.receiver_screen_name, self.client_id, self.resource_id, self.attempts, self.asap)
+
+
+
 
-        #\n добавляете в местах с пустой строкой в шаблоне
-        
 
 #ticket json example
 '''
@@ -217,10 +272,12 @@ def jsonToOrderTicket(jsonstring) -> OrderTicket:
     u = OrderTicket(**jsonObj)
     return u
 
+
+
 #Функция обращения к апи и получение токена
 def requestGetToken(login, password, url) -> str:
-    login = "11111111111"
-    password = "Sharix!"
+    login = "79999999999"
+    password = "12345"
     #url = "https://user.sharix-app.org/auth/token/login/"
     data = {
         "password":password,
@@ -254,6 +311,28 @@ def requestGetListUser():
     print(response.json())
 
 
+# def requestGetList(auth_token, url):
+#     headers = {'Authorization': f'Token {auth_token}'}
+#     response = requests.get(url, headers=headers)
+#     #response = requests.get(config.API_URL+"/dbsynce/api/orders/", headers=headers)
+#     ordertext=response.json()
+#     startlist = []
+    
+#     if not ordertext:
+#         print("Empty array")
+#     else:
+#         for i in ordertext:
+#             print (i, "PROCESSING")
+#             try:
+#                 orderticket = OrderTicket(**i)
+#                 print(i, "ORDER ", orderticket)
+#                 startlist.append(orderticket)
+#             except Exception as ex:
+#                 print(ex)
+#     print (startlist)
+#     return startlist
+
+
 def requestGetList(auth_token, url):
     headers = {'Authorization': f'Token {auth_token}'}
     response = requests.get(url, headers=headers)
@@ -267,11 +346,32 @@ def requestGetList(auth_token, url):
         for i in ordertext:
             print (i, "PROCESSING")
             try:
-                orderticket = OrderTicket(**i)
-                print(i, "ORDER ", orderticket)
-                startlist.append(orderticket)
+                order = Order(**i)
+                print(i, "ORDER ", order)
+                startlist.append(order)
             except Exception as ex:
                 print(ex)
     print (startlist)
     return startlist
 
+class answer(object):
+    def __init__(self,order_id,provider,answer):
+        self.order_id = order_id
+        self.provider = provider
+        self.answer = answer
+        
+def to_answer(jsonstring):
+    json_answer = json.loads(jsonstring)
+    print(json_answer)
+    u = answer(**json_answer)
+    return u
+
+def change_to_task(localtask,token):
+    headers = {
+        'Authorization': f'Token {token}',
+        'Content-Type': 'application/json'  # Установка заголовка Content-Type
+    }
+    data = json.dumps(localtask.__dict__)
+    print(data)
+    response = requests.patch(config.API_URL+f"/dbsynce/api/orders/{localtask.id}/", headers=headers, data=data)
+    return response

+ 69 - 70
handlers/open_servicerequest_accepted.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_accepted"
 
-operating_status=221
+operating_status='221'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -27,10 +27,10 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 print(JID, PASSWORD)
 
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_assigned@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=[botname, "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_booked@ej.sharix-app.org", "open_servicerequest_assigned@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=[botname,"open_servicerequest_process@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -40,14 +40,9 @@ def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
    
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
-
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
-            print (orderObj)
+            orderObj = jsreq.jsonToOrder(text)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
@@ -65,56 +60,59 @@ def open_servicerequest_accepted_wait(period,localtask):
 def open_servicerequest_accepted_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
     
-    order = jsreq.jsonToOrder(localtask)
-
-    if order.time_start_predicted < 100:
-        # Заглушка. Проверка может ли заказ быть переназначен
-        if True:
-            # Заглушка. Сбросить пометку предзаказа
-            # ...
-
-
-            bot.proceed_status(proceed_to[2],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[1],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    else:
-        # Заглушка. Обработана заявка на устанавление взаимоотношений?
-        if True:
-            # Заглушка. Взаимоотношения установлены ?
-            if True:
-                # Заглушка. Отобразить в предварительных заказах исполнителям.
-                send_message()
-                # Заглушка. Исполнитель откликнулся на заказ?
-                if True:
-                    # У пользователя стоит ручной выбор из нескольких исполнителей?
-                    if True:
-                        # Заглушка создать дочернюю локальную заявку с информацией от исполнителя
-                        create_ticket()
-                        # Заглушка отобразить в предварительных клиенту
-                        send_message()
-
-                        # Заглушка. Клиент выбрал конкретную заявку?
-                        if True:
-                            # Заглушка. обновление локальной копии. Замена основной
-                            pass
-                        else:
-                            bot.proceed_status(proceed_to[3],localtask)
-                            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-                    else:
-                        bot.proceed_status(proceed_to[3],localtask)
-                        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-                else:
-                    #Заглушка. Заказ ждет очередную итерацию обработки списка
-                    open_servicerequest_accepted_process(localtask)
-            else:
-                bot.proceed_status(proceed_to[1],localtask)
-                bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            #Заглушка. Заказ ждет очередную итерацию обработки списка
-            open_servicerequest_accepted_process(localtask)
-            pass
+    # order = jsreq.jsonToOrder(localtask)
+    localtask.status='231'
+    jsreq.change_to_task(localtask,token)
+    bot.proceed_status(proceed_to[1],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # if order.time_start_predicted < 100:
+    #     # Заглушка. Проверка может ли заказ быть переназначен
+    #     if True:
+    #         # Заглушка. Сбросить пометку предзаказа
+    #         # ...
+
+
+    #         bot.proceed_status(proceed_to[1],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         bot.proceed_status(proceed_to[2],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # else:
+    #     # Заглушка. Обработана заявка на устанавление взаимоотношений?
+    #     if True:
+    #         # Заглушка. Взаимоотношения установлены ?
+    #         if True:
+    #             # Заглушка. Отобразить в предварительных заказах исполнителям.
+    #             send_message()
+    #             # Заглушка. Исполнитель откликнулся на заказ?
+    #             if True:
+    #                 # У пользователя стоит ручной выбор из нескольких исполнителей?
+    #                 if True:
+    #                     # Заглушка создать дочернюю локальную заявку с информацией от исполнителя
+    #                     create_ticket()
+    #                     # Заглушка отобразить в предварительных клиенту
+    #                     send_message()
+
+    #                     # Заглушка. Клиент выбрал конкретную заявку?
+    #                     if True:
+    #                         # Заглушка. обновление локальной копии. Замена основной
+    #                         pass
+    #                     else:
+    #                         bot.proceed_status(proceed_to[3],localtask)
+    #                         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #                 else:
+    #                     bot.proceed_status(proceed_to[3],localtask)
+    #                     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #             else:
+    #                 #Заглушка. Заказ ждет очередную итерацию обработки списка
+    #                 open_servicerequest_accepted_process(localtask)
+    #         else:
+    #             bot.proceed_status(proceed_to[1],localtask)
+    #             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         #Заглушка. Заказ ждет очередную итерацию обработки списка
+    #         open_servicerequest_accepted_process(localtask)
+    #         pass
     
 
 def send_message():
@@ -130,10 +128,14 @@ def open_servicerequest_accepted():
         print("EACH TASKLIST", tasklist)
 
         if (localtask.status!=operating_status):
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
-
+        elif True:
+            t1=threading.Thread(target=open_servicerequest_accepted_process, args=([localtask]))
+            t1.start()
         # if (localtask.title!="10"):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
@@ -142,13 +144,12 @@ def open_servicerequest_accepted():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_accepted_process, args=(localtask))
-        t1.start()
+        
 
-        #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # #если никакие обработчики не подошли - отправляем обратно в очередь
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
@@ -156,11 +157,9 @@ def open_servicerequest_accepted():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
 bot = JabberBot(JID, PASSWORD, PORT)
 

+ 71 - 58
handlers/open_servicerequest_assigned.py

@@ -10,6 +10,7 @@ from datetime import datetime
 
 import time
 import threading
+import asyncio
 
 #test
 import jsonAndRequest as jsreq
@@ -18,7 +19,7 @@ global tasklist
 
 botname="open_servicerequest_assigned"
 
-operating_status=212
+operating_status='212'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,8 +27,9 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+drivers = ["799999999998@ej.sharix-app.org"]
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_booked@ej.sharix-app.org","open_servicerequest_pending@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
 proceed_to=[botname, "open_servicerequest_accepted@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
@@ -39,18 +41,15 @@ idle_value=10
 def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
-   
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
+        print('order_handler')
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
-            print (orderObj)
+            orderObj = jsreq.jsonToOrder(text)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
-
+        
+            
 def open_servicerequest_assigned_wait(period,localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
     time.sleep(period)
@@ -62,55 +61,66 @@ def open_servicerequest_assigned_wait(period,localtask):
     bot.proceed_status(proceed_to[0],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
 
+def wait_for_answer(localtask):
+    order = localtask
+    driver = drivers[0]
+    send_message(order,driver)      # Здесь можно реализовать логику выбора водителя
+    while True:
+        if len(answers) > 0:
+            answer = answers.pop(0)
+            if answer.answer == 'Accept':
+                localtask.status='221'
+                jsreq.change_to_task(localtask,token)    
+                bot.proceed_status(proceed_to[1], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[1]}\n")
+            else:
+                localtask.status='229'
+                localtask.provider=None
+                jsreq.change_to_task(localtask,token)
+                bot.proceed_status(proceed_to[2], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[2]}\n")
+            break
+        else:
+            print("Ожидание ответа...")
+            time.sleep(1)
+
 def open_servicerequest_assigned_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
+    order = localtask
+    if order.provider!=None:
+        wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))
+        wait_thread.start()
+
+
+def message_answer(conn, mess):       
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+    if (str(user).split("/")[0]) in drivers:
+        print ('answer_handler')
+        if text is not None:
+            answerObj = jsreq.to_answer(text)
+            answers.append(answerObj)
+            bot.bot_log(str(datetime.now())+" Поступивший ответ успешно добавлен в очередь обработки\n")
+            
     
-    order = jsreq.jsonToOrder(localtask)
-
-    # Заглушка проверка бронирования без подтверждения
-    if True:
-        bot.proceed_status(proceed_to[0],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    else:
-        if order.asap:
-            # Заглушка. Отображение ответственному в приложении показывается заказ
-            send_message()
-            check_order(order)
-        else:
-            # Заглушка. Отображение в предварительных заказах назначенному исполнителю
-            send_message()
-            # Заглушка
-            if order.time_start_predicted > 100:
-                bot.proceed_status(proceed_to[0],localtask)
-                bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
-                return
-            # Заглушка. Отображение ответственному в приложении показывается заказ
-            send_message()
-            check_order(order)
-
-def check_order(localtask):
-    # Заглушка. Заказ принят?
-    if localtask:
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    else:
-        bot.proceed_status(proceed_to[2],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-
-def send_message():
-    pass
+def send_message(order,driver):
+    order=json.dumps(order.__dict__)
+    bot.send_notification(driver,order)   
+
 
 def open_servicerequest_assigned():
     while (len(tasklist)):
         localtask=tasklist.pop(0)
-        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
-
         if (localtask.status!=operating_status):
+            localtask.status='239'
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
-
+        else:
+            bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
+            t1=threading.Thread(target=open_servicerequest_assigned_process, args=([localtask]))
+            t1.start()
         # if (localtask.title!="10"):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
@@ -119,27 +129,30 @@ def open_servicerequest_assigned():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_assigned_process, args=(localtask))
-        t1.start()
+        # t1=threading.Thread(target=open_servicerequest_assigned_process, args=(localtask))
+        # t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
+answers = []
 #пустой список заказов
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
-bot = JabberBot(JID, PASSWORD, PORT)
 
+bot = JabberBot(JID, PASSWORD, PORT)
 bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_assigned)
+bot.register_handler('message', message_answer)
+bot.start(open_servicerequest_assigned)
+
+
+#Добавить функцию поток для ожидания получения заказа.

+ 112 - 67
handlers/open_servicerequest_booked.py

@@ -27,10 +27,10 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 print(JID, PASSWORD)
 
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["9090@ej.sharix-app.org","test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org","799999999990@ej.sharix-app.org"]
+listen_to=["799999999990@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=["open_servicerequest_assigned@ej.sharix-app.org", "open_servicerequest_pending@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=["open_servicerequest_assigned@ej.sharix-app.org","open_servicerequest_pending@ej.sharix-app.org",  "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -42,8 +42,7 @@ def message_handler(conn, mess):
     if (str(user).split("/")[0]) in listen_to:
         # print (str(user).split("/")[0])
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
-            print (orderObj)
+            orderObj = jsreq.jsonToOrder(text)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
@@ -59,35 +58,70 @@ def open_servicerequest_booked_wait(period,localtask):
 
 def open_servicerequest_booked_process(localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ в обработчике\n")
-
-    order = jsreq.jsonToOrder(localtask)
+    # order = jsreq.jsonToOrder(localtask)
     #Пока заглушка
-    balance = get_balance(order.client_id)
-
     
-    price = order.real_price
-
-    if balance > price:
+        # balance = get_balance(order.client_id)
+        # print(balance)
+        # price = order.real_price
+        # if balance > price:
+        #     #Заказ на основного водителя?
+        #     if order.provider:
+        #         bot.proceed_status(proceed_to[1], localtask)
+        #         bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
+        #     else:
+        #         # Проверка срочности заказа
+        #         if order.asap:
+        #             #Заглушка назначение исполнителя системой
+        #             if set_provider(order.ticket, order.provider) == "success":
+        #                 bot.proceed_status(proceed_to[0], localtask)
+        #             else:
+        #                 bot.bot_log(botname+" "+str(datetime.now())+" "+"Ошибка назначения исполнителя\n")
+        #         else:
+        #             bot.proceed_status(proceed_to[1], localtask)
+        #         bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
+        # else:
+        #     # Заглушка получения оплаты от клиента
+        #     pass
+        # price = localtask.real_price
         #Заказ на основного водителя?
-        if order.provider:
-            bot.proceed_status(proceed_to[1], localtask)
-            bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
+    
+    if not localtask.provider:
+        answer,provider = set_provider(localtask.id)
+        print(answer,provider)
+        if set_provider(localtask.id):
+            print('Водитель успешно установлен')
         else:
-            # Проверка срочности заказа
-            if order.asap:
-                #Заглушка назначение исполнителя системой
-                if set_provider(order.ticket, order.provider) == "success":
-                    bot.proceed_status(proceed_to[0], localtask)
-                else:
-                    bot.bot_log(botname+" "+str(datetime.now())+" "+"Ошибка назначения исполнителя\n")
-            else:
-                bot.proceed_status(proceed_to[1], localtask)
-            
-            bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
+            print('Ошибка водитель не был установлен')
+        localtask.provider = provider
+    current_time = datetime.now()
+    
+    # if localtask.asap or (current_time - datetime.fromisoformat(localtask.time_start_predicted) < timedelta(hours=3)):
+    if localtask.asap:
+        localtask.status = '212'
+        jsreq.change_to_task(localtask,token)
+        bot.proceed_status(proceed_to[0], localtask)
+        bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан и отправлен на assigned\n")
     else:
-        # Заглушка получения оплаты от клиента
-        pass
-
+        localtask.status = '220'
+        jsreq.change_to_task(localtask,token)
+        bot.proceed_status(proceed_to[1], localtask)
+        bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан и отправлен на pending\n")
+        
+        # Проверка срочности заказа
+        # if order.asap:
+        #     #Заглушка назначение исполнителя системой
+        #     if set_provider(order.ticket, order.provider) == "success":
+        #         bot.proceed_status(proceed_to[0], localtask)
+        #     else:
+        #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Ошибка назначения исполнителя\n")
+        # else:
+        #         localtask.status = 220
+        #         bot.proceed_status(proceed_to[0], localtask)
+        #         print(localtask)
+        # bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан и отправлен на assigned\n")
+        # Проверка срочности заказа
+        
 def get_balance(client):
     headers = {'Authorization': f'Token {token}'}
     # Передаем id пользователя и получаем его баланс
@@ -104,68 +138,79 @@ def get_balance(client):
             return balance
         except Exception as ex:
             print(ex)
-
-def set_provider(ticket, provider):
+            
+#set provider?
+def choose_provider(auth_token,geo):
+    providers=requests.get(config.API_URL+"/dbsynce/api/provider/",headers=auth_token)
+    provider=providers.json()[0]['id']
+    return provider
+    
+def set_provider(localtask_id):
+    token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
     headers = {'Authorization': f'Token {token}'}
-    data = {'ticket': ticket,
-            'provider': provider}
-    response = requests.post(config.API_URL+f"/api/example/set-provider", headers=headers, data=data)
-    print(response.json())
-    ordertext=response.json()
+    provider = choose_provider(headers,'geoposition')
+    data = {'provider':int(provider)}
+    # print(data)
+    # print(str(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/"))
+    response = requests.patch(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/", headers=headers, json=data)
+    return response ,provider
+
     
-    if not ordertext:
-        print("Empty array")
-    else:
-        print(ordertext[0], "PROCESSING")
-        try:
-            message = ordertext[0].get('message')
-            return message
-        except Exception as ex:
-            print(ex)
+    # if not ordertext:
+    #     print("Empty array")
+    # else:
+    #     print(ordertext[0], "PROCESSING")
+    #     try:
+    #         message = ordertext[0].get('message')
+    #         return message
+    #     except Exception as ex:
+    #         print(ex)
 
 def open_servicerequest_booked():
     while (len(tasklist)):
         localtask=tasklist.pop(0)
-        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
-
-        # if (localtask.status!=operating_status):
-        #     bot.proceed_status(proceed_to[-1],localtask)
-        #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
-        #     continue
-
-        # if (localtask.title!="10"):
+        if (str(localtask.status)!=str(operating_status)):
+            # bot.proceed_status(proceed_to[-1],localtask) #временная проверка отправки
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
+            bot.proceed_status(proceed_to[-1],localtask)
+            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
+            continue
+        else:
+            bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
+            t1=threading.Thread(target=open_servicerequest_booked_process, args=([localtask]))
+            t1.start()
+        # elif (localtask.provider==T):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
 
         # if (localtask.title=="101"):
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
-
-        t1=threading.Thread(target=open_servicerequest_booked_process, args=(localtask))
-        t1.start()
-
+        
+        
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
 #пустой список заказов
 tasklist = []
 
-#надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/api/v1/auth/token/login/")
-#ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+# #надо инициализировать tasklist при запуске из API
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
+# #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/") ###Должна быть проверка между двумя
 
-print (len(tasklist))
+# # print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)
 
-bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_booked)
 
 
+bot.register_handler('message', message_handler)
+bot.start(open_servicerequest_booked)
 
+# print(set_provider('localtask'))

+ 118 - 0
handlers/open_servicerequest_closed.py

@@ -0,0 +1,118 @@
+import requests
+import xmpp
+from xmpp import cli
+import config
+from BotClass import JabberBot
+import json
+#раскомментировать, когда перейдем на разные пароли
+import hashlib
+from datetime import datetime
+
+import time
+import threading
+
+#test
+import jsonAndRequest as jsreq
+
+global tasklist
+
+botname="open_servicerequest_closed"
+
+operating_status=239
+JID=botname+"@"+config.JSERVER
+PORT=config.PORT
+
+PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
+
+print(JID, PASSWORD)
+
+#таким образом хранится список jid, от которых можно получать сообщения этому боту
+listen_to=["799999999990@ej.sharix-app.org"]
+
+#тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
+proceed_to=[botname, "open_strequest_new@ej.sharix-app.org", "open_servicerequest_closed@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+
+#максимальное значение попыток обработать заказ
+idle_value=10
+
+
+# обработчик входящих сообщений
+def message_handler(conn, mess):
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+   
+    print (str(user).split("/")[0])
+    if (str(user).split("/")[0]) in listen_to:
+        print(text)
+        print(mess)
+
+        if text is not None:
+            orderObj = jsreq.jsonToOrder(text)
+            print (orderObj)
+            tasklist.append(orderObj)
+            bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
+
+def open_servicerequest_closed_wait(period,localtask):
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
+    time.sleep(period)
+    
+    #ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
+    localtask.title=localtask.title+"1"
+
+    #обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
+    bot.proceed_status(proceed_to[0],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
+
+def open_servicerequest_closed_process(localtask):
+    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
+    
+    order = jsreq.jsonToOrder(localtask)
+
+    
+    bot.proceed_status(proceed_to[2],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+
+
+
+def open_servicerequest_closed():
+    while (len(tasklist)):
+        localtask=tasklist.pop(0)
+        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
+        print("EACH TASKLIST", tasklist)
+
+        if (localtask.status!=operating_status):
+            bot.proceed_status(proceed_to[-1],localtask)
+            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
+            continue
+
+        # if (localtask.title!="10"):
+        #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
+        #     t1.start()
+
+        # if (localtask.title=="101"):
+        #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
+        #     t1.start()
+
+        t1=threading.Thread(target=open_servicerequest_closed_process, args=(localtask))
+        t1.start()
+
+        #если никакие обработчики не подошли - отправляем обратно в очередь
+        bot.proceed_status(proceed_to[0],localtask)
+        print("Заказ возвращен в очередь\n")
+        print(tasklist)
+
+#Авторизация и запуск бота
+
+#пустой список заказов
+tasklist = []
+
+#надо инициализировать tasklist при запуске из API
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
+#ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+print (len(tasklist))
+
+bot = JabberBot(JID, PASSWORD, PORT)
+
+bot.register_handler('message', message_handler)
+bot.start(open_servicerequest_closed)

+ 3 - 4
handlers/open_servicerequest_declined.py

@@ -46,7 +46,7 @@ def message_handler(conn, mess):
         print(mess)
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
@@ -117,10 +117,9 @@ def open_servicerequest_declined():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 9 - 6
handlers/open_servicerequest_done.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_done"
 
-operating_status=239
+operating_status='241'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,8 +26,12 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+users = ["799999999990@ej.sharix-app.org"]
+
+drivers = ["799999999998@ej.sharix-app.org"]
+
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_process@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
 proceed_to=[botname, "open_strequest_new@ej.sharix-app.org", "open_servicerequest_closed@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
@@ -48,7 +52,7 @@ def message_handler(conn, mess):
         print(mess)
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
@@ -126,10 +130,9 @@ def open_servicerequest_done():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 1 - 1
handlers/open_servicerequest_forcemajeure.py

@@ -124,7 +124,7 @@ tasklist = []
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
 
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 31 - 26
handlers/open_servicerequest_pending.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_pending"
 
-operating_status=220
+operating_status='220'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -27,26 +27,27 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 print(JID, PASSWORD)
 
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_booked@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=[botname, "open_servicerequest_prestart@ej.sharix-app.org", "open_servicerequest_prestart@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=[botname, "open_servicerequest_assigned@ej.sharix-app.org",  "open_servicerequest_forcemajeure@ej.sharix-app.org","799999999998@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
 
 # обработчик входящих сообщений
 def message_handler(conn, mess):
+    
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
    
-    print (str(user).split("/")[0])
+    # print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
+        # print(text)
+        # print(mess)
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
@@ -69,22 +70,24 @@ def open_servicerequest_pending_process(localtask):
 
     # Заглушка. Может ли что-то пойти не так
     if True:
-        if order.time_start_predicted < 100:
+        if order.time_start_predicted < time.time():
             bot.proceed_status(proceed_to[0],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
             return
         # Заглушка активная ли стадия заказа
-        if order.status == "active":
+        else: order.status == "active":
+            localtask.status=212
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[2],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-            # Заглушка на получение ответа
-            pass
-    else:
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+        # else:
+        #     bot.proceed_status(proceed_to[2],localtask)
+        #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+        #     # Заглушка на получение ответа
+        #     pass
+    # else:
+    #     bot.proceed_status(proceed_to[1],localtask)
+    #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
 
 
 def send_message():
@@ -94,9 +97,11 @@ def open_servicerequest_pending():
     while (len(tasklist)):
         localtask=tasklist.pop(0)
         bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
+        # print("EACH TASKLIST", tasklist)
 
         if (localtask.status!=operating_status):
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
@@ -109,27 +114,27 @@ def open_servicerequest_pending():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_pending_process, args=(localtask))
+        t1=threading.Thread(target=open_servicerequest_pending_process, args=([localtask]))
         t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
         bot.proceed_status(proceed_to[0],localtask)
         print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
 #пустой список заказов
 tasklist = []
 
-#надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+# print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)
 
 bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_pending)
+bot.start(open_servicerequest_pending)
+
+#Получение сообщения от водителя

+ 71 - 37
handlers/open_servicerequest_process.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_process"
 
-operating_status=231
+operating_status='231'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,11 +26,14 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+
+drivers = ["799999999998@ej.sharix-app.org"]
+
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_accepted@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=[botname, "open_servicerequest_preforcemajeure@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=[botname,"open_servicerequest_done@ej.sharix-app.org", "open_servicerequest_preforcemajeure@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -39,18 +42,24 @@ idle_value=10
 def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
-   
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
-
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
+
+def message_answer(conn, mess):       
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+    if (str(user).split("/")[0]) in drivers:
+        print ('answer_handler')
+        if text is not None:
+            answerObj = jsreq.to_answer(text)
+            answers.append(answerObj)
+            bot.bot_log(str(datetime.now())+" Поступивший ответ успешно добавлен в очередь обработки\n")
+
 def open_servicerequest_process_wait(period,localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
     time.sleep(period)
@@ -62,27 +71,52 @@ def open_servicerequest_process_wait(period,localtask):
     bot.proceed_status(proceed_to[0],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
 
+def wait_for_answer(localtask):
+    order = localtask
+    # Здесь можно реализовать логику выбора водителя
+    while True:
+        if len(answers) > 0:
+            answer = answers.pop(0)
+            if answer.answer == 'Complete':
+                localtask.status='241'
+                jsreq.change_to_task(localtask,token)    
+                bot.proceed_status(proceed_to[1], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[1]}\n")
+            break
+        else:
+            print("Ожидание ответа...")
+            time.sleep(30)
+
+def open_servicerequest_assigned_process(localtask):
+    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
+    order = localtask
+    if order.provider!=None:
+        wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))
+        wait_thread.start()
+        
 def open_servicerequest_process_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
-    
-    order = jsreq.jsonToOrder(localtask)
+    order = localtask
+    wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))#ожидание выполнения заказа
+    wait_thread.start()
 
     # Заглушка проверка баланса
-    if check_balance() >= order.real_price:
-        # Заглушка. Расчетное время прибытия на следующую точку превышаетзапланированное на Х
-        if True:
-            bot.proceed_status(proceed_to[1],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[0],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
-    else:
-        # Оплата
-
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # if check_balance() >= order.real_price:
+    # if True:
+    #     # Заглушка. Расчетное время прибытия на следующую точку превышаетзапланированное на Х
+    #     if True:
+    #         bot.proceed_status(proceed_to[1],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         bot.proceed_status(proceed_to[0],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
+    # else:
+    #     # Оплата
+
+    #     bot.proceed_status(proceed_to[1],localtask)
+    #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
         
-        pass
+    #     pass
 
 
 def check_balance():
@@ -92,9 +126,9 @@ def open_servicerequest_process():
     while (len(tasklist)):
         localtask=tasklist.pop(0)
         bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
-
         if (localtask.status!=operating_status):
+            localtask.status='239'
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
@@ -107,27 +141,27 @@ def open_servicerequest_process():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_process_process, args=(localtask))
+        t1=threading.Thread(target=open_servicerequest_process_process, args=[localtask])
         t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
+answers = []
 #пустой список заказов
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
-bot = JabberBot(JID, PASSWORD, PORT)
 
+bot = JabberBot(JID, PASSWORD, PORT)
 bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_process_process)
+bot.register_handler('message', message_answer)
+bot.start(open_servicerequest_process)

+ 33 - 0
handlers/order_functions.py

@@ -0,0 +1,33 @@
+import requests
+import xmpp
+from xmpp import cli
+import config
+from BotClass import JabberBot
+import json
+#раскомментировать, когда перейдем на разные пароли
+import hashlib
+from datetime import datetime
+
+import time
+import threading
+
+#test
+import jsonAndRequest as jsreq
+
+global tasklist
+
+
+def send_message(order):
+    task_apply = {
+        'driver_id':None,
+        'apply':False,
+        'task_id':order.id
+    }
+    print(order.id)
+    
+    bot.proceed_status('driver_jabber',task_apply)
+    
+def find_jabber_acc():
+    pass
+#поиск пользователя в джаббер для далнейшей отправки
+    

+ 10 - 0
handlers/starter.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+
+python3 open_servicerequest_booked.py
+python3 open_servicerequest_assigned.py
+python3 open_servicerequest_pending.py
+python3 open_servicerequest_accepted.py
+python3 open_servicerequest_process.py
+python3 open_servicerequest_done.py
+
+