workающий release 0.3.0
This commit is contained in:
184
app.py
184
app.py
@@ -3,48 +3,59 @@ import json
|
|||||||
import sqlite3
|
import sqlite3
|
||||||
import time
|
import time
|
||||||
import requests
|
import requests
|
||||||
|
import sys
|
||||||
from dateutil import parser
|
from dateutil import parser
|
||||||
import schedule
|
import schedule
|
||||||
|
|
||||||
def get(url, params):
|
|
||||||
response = requests.get(url)
|
|
||||||
if response.ok:
|
|
||||||
return json.loads(response.text)
|
|
||||||
else:
|
|
||||||
print("Ошибка при загрузке данных:", response.status_code)
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def post(url, params):
|
def post(url, params):
|
||||||
response = requests.post(url, params=params)
|
response = requests.post(url, params=params)
|
||||||
if response.ok:
|
if response.status_code == 201:
|
||||||
return json.loads(response.text)
|
return sys.stdout.write("Успешно добавлено\n")
|
||||||
|
elif response.status_code == 200:
|
||||||
|
return response.text
|
||||||
else:
|
else:
|
||||||
print("Ошибка при загрузке данных:", response.status_code)
|
sys.stderr.write("Ошибка при загрузке данных: {}\n".format(response.status_code))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def create_table(type):
|
||||||
def create_json_table():
|
#Создаём пустую таблицу
|
||||||
|
db_path = os.getenv("BDPATH")
|
||||||
path = os.getenv("BDPATH") + 'fiscal_registers_fromPOS.db'
|
db_file = "fiscals.db"
|
||||||
conn = sqlite3.connect(path)
|
table_name = type
|
||||||
|
conn = sqlite3.connect(db_path + db_file)
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS fiscal_registers
|
c.execute("""
|
||||||
(modelName TEXT, serialNumber TEXT PRIMARY KEY, RNM TEXT, organizationName TEXT,
|
CREATE TABLE IF NOT EXISTS %s (
|
||||||
fn_serial TEXT, datetime_reg TEXT, dateTime_end TEXT, ofdName TEXT,
|
serialNumber TEXT PRIMARY KEY,
|
||||||
bootVersion TEXT, ffdVersion TEXT, fnExecution TEXT, INN TEXT)''')
|
modelName TEXT,
|
||||||
|
RNM TEXT,
|
||||||
|
organizationName TEXT,
|
||||||
|
fn_serial TEXT,
|
||||||
|
datetime_reg TEXT,
|
||||||
|
dateTime_end TEXT,
|
||||||
|
ofdName TEXT,
|
||||||
|
bootVersion TEXT,
|
||||||
|
ffdVersion TEXT,
|
||||||
|
fnExecution TEXT,
|
||||||
|
INN TEXT,
|
||||||
|
UUID TEXT,
|
||||||
|
owner_uuid TEXT
|
||||||
|
)""" % table_name)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
# Функция для вставки данных из файла .json в базу данных SQLite
|
|
||||||
def importFromJSON(file_path):
|
def importFromJSON(file_path):
|
||||||
with open(file_path, 'r') as json_file:
|
with open(file_path, 'r', encoding='utf-8') as json_file:
|
||||||
data = json.load(json_file)
|
data = json.load(json_file)
|
||||||
path = os.getenv("BDPATH") + 'fiscal_registers_fromPOS.db'
|
path = os.getenv("BDPATH") + 'fiscals.db'
|
||||||
conn = sqlite3.connect(path)
|
conn = sqlite3.connect(path)
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('''INSERT OR REPLACE INTO fiscal_registers
|
table_exists = c.execute('''SELECT name FROM sqlite_master WHERE type='table' AND name='pos_fiscals' ''').fetchone()
|
||||||
|
if not table_exists:
|
||||||
|
create_table('pos_fiscals')
|
||||||
|
c.execute('''INSERT OR REPLACE INTO pos_fiscals
|
||||||
(modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
(modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
||||||
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, INN)
|
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, INN)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
||||||
@@ -54,118 +65,85 @@ def importFromJSON(file_path):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
# Функция для обхода всех файлов .json в заданной директории и чтения данных из них
|
|
||||||
def process_json_files(directory):
|
def process_json_files(directory):
|
||||||
for filename in os.listdir(directory):
|
for filename in os.listdir(directory):
|
||||||
if filename.endswith('.json'):
|
if filename.endswith('.json'):
|
||||||
file_path = os.path.join(directory, filename)
|
importFromJSON(os.path.join(directory, filename))
|
||||||
importFromJSON(file_path)
|
|
||||||
|
|
||||||
|
|
||||||
# Функция для создания таблицы в базе данных SQLite
|
|
||||||
def create_sd_table():
|
|
||||||
path = os.getenv('BDPATH') + 'fiscal_registers_fromSD.db'
|
|
||||||
conn = sqlite3.connect(path)
|
|
||||||
c = conn.cursor()
|
|
||||||
c.execute('''CREATE TABLE IF NOT EXISTS fiscal_registers
|
|
||||||
(RNKKT TEXT, FNNumber TEXT, KKTRegDate TEXT, UUID TEXT PRIMARY KEY,
|
|
||||||
FRSerialNumber TEXT, FNExpireDate TEXT)''')
|
|
||||||
conn.commit()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
|
|
||||||
# Функция для вставки данных из JSON объекта в базу данных SQLite
|
|
||||||
def importFromServiceDesk(sd_data):
|
def importFromServiceDesk(sd_data):
|
||||||
path = os.getenv("BDPATH") + 'fiscal_registers_fromSD.db'
|
conn = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
||||||
conn = sqlite3.connect(path)
|
parsed=json.loads(sd_data)
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
for entry in sd_data:
|
for data in parsed:
|
||||||
RNKKT = entry['RNKKT']
|
owner_uuid = data['owner']['UUID'] if data.get('owner') and data['owner'].get('UUID') else None
|
||||||
FNNumber = entry['FNNumber']
|
modelName = data['ModelKKT']['title']
|
||||||
KKTRegDate = entry['KKTRegDate']
|
ofdName = data['OFDName']['title'] if data.get('OFDName') else None
|
||||||
UUID = entry['UUID']
|
ffdVersion = data['FFD']['title'] if data.get('FFD') else None
|
||||||
FRSerialNumber = entry['FRSerialNumber']
|
|
||||||
FNExpireDate = entry['FNExpireDate']
|
c.execute('''INSERT OR REPLACE INTO sd_fiscals
|
||||||
c.execute('''INSERT OR REPLACE INTO fiscal_registers
|
(modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
||||||
(RNKKT, FNNumber, KKTRegDate, UUID, FRSerialNumber, FNExpireDate)
|
dateTime_end, ofdName, bootVersion, ffdVersion, owner_uuid, UUID)
|
||||||
VALUES (?, ?, ?, ?, ?, ?)''',
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
||||||
(RNKKT, FNNumber, KKTRegDate, UUID, FRSerialNumber, FNExpireDate))
|
(modelName, data['FRSerialNumber'], data['RNKKT'], data['LegalName'],
|
||||||
|
data['FNNumber'], data['KKTRegDate'], data['FNExpireDate'], ofdName,
|
||||||
|
data['FRDownloader'], ffdVersion, owner_uuid, data['UUID']))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
def update_sd_table():
|
||||||
# Функция для получения данных по указанной ручке и обновления базы данных
|
|
||||||
def update_database():
|
|
||||||
url = 'https://myhoreca.itsm365.com/sd/services/rest/find/objectBase$FR'
|
url = 'https://myhoreca.itsm365.com/sd/services/rest/find/objectBase$FR'
|
||||||
params = {'accessKey': os.getenv('SDKEY'), 'attrs': 'UUID,FRSerialNumber,RNKKT,KKTRegDate,FNExpireDate,FNNumber'}
|
params = {'accessKey': os.getenv('SDKEY'), 'attrs': 'UUID,FRSerialNumber,RNKKT,KKTRegDate,FNExpireDate,FNNumber,owner,FRDownloader,LegalName,OFDName,ModelKKT,FFD'}
|
||||||
response = post(url, params)
|
response = post(url, params)
|
||||||
if response:
|
if response:
|
||||||
create_sd_table()
|
|
||||||
importFromServiceDesk(response)
|
importFromServiceDesk(response)
|
||||||
print("База данных обновлена успешно.")
|
sys.stdout.write("База из SD обновлена успешно.\n")
|
||||||
else:
|
else:
|
||||||
print("Ошибка при получении данных:", response.status_code)
|
sys.stderr.write("Ошибка при получении данных: {}\n".format(response.status_code))
|
||||||
|
|
||||||
|
|
||||||
def compare_and_update():
|
def compare_and_update():
|
||||||
|
conn_sd = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
||||||
pathbd = os.getenv("BDPATH") + 'fiscal_registers_fromSD.db'
|
conn_pos = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
||||||
conn_sd = sqlite3.connect(pathbd)
|
c_pos = conn_pos.cursor()
|
||||||
path = os.getenv("BDPATH") + 'fiscal_registers_fromPOS.db'
|
|
||||||
conn_json = sqlite3.connect(path)
|
|
||||||
c_json = conn_json.cursor()
|
|
||||||
c_sd = conn_sd.cursor()
|
c_sd = conn_sd.cursor()
|
||||||
|
|
||||||
# Выбираем данные для сравнения из базы данных SD
|
c_sd.execute('''SELECT modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
||||||
c_sd.execute('''SELECT FRSerialNumber, FNNumber, FNExpireDate, UUID
|
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, owner_uuid, UUID
|
||||||
FROM fiscal_registers''')
|
FROM sd_fiscals''')
|
||||||
sd_data = c_sd.fetchall()
|
sd_data = c_sd.fetchall()
|
||||||
|
|
||||||
# Выбираем данные для сравнения из базы данных JSON
|
c_pos.execute('''SELECT modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
||||||
c_json.execute('''SELECT serialNumber, fn_serial, dateTime_end
|
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, INN
|
||||||
FROM fiscal_registers''')
|
FROM pos_fiscals''')
|
||||||
json_data = c_json.fetchall()
|
pos_data = c_pos.fetchall()
|
||||||
|
|
||||||
# Сравниваем данные и отправляем запросы на обновление при несоответствии
|
|
||||||
for sd_entry in sd_data:
|
for sd_entry in sd_data:
|
||||||
for json_entry in json_data:
|
for pos_entry in pos_data:
|
||||||
# Проверяем совпадение по FRSerialNumber и serialNumber
|
if sd_entry[1] == pos_entry[1]:
|
||||||
if sd_entry[0] == json_entry[0]:
|
sd_date = parser.parse(sd_entry[6])
|
||||||
# Преобразуем даты из строкового формата в объекты datetime для корректного сравнения
|
pos_date = parser.parse(pos_entry[6])
|
||||||
sd_date = parser.parse(sd_entry[2])
|
|
||||||
json_date = parser.parse(json_entry[2])
|
|
||||||
|
|
||||||
if sd_date != json_date: # Сравниваем даты
|
if sd_date != pos_date:
|
||||||
|
sys.stdout.write(f"Объект с UUID {sd_entry[12]} будет изменен.\n")
|
||||||
print(f"Объект с UUID {sd_entry[3]} будет изменен.") # Выводим UUID объекта для тестирования
|
formatted_date = pos_date.strftime('%Y.%m.%d %H:%M:%S')
|
||||||
formatted_date = json_date.strftime('%Y.%m.%d %H:%M:%S')
|
legalName = pos_entry[3] + ' ' + 'ИНН:' + pos_entry[11]
|
||||||
|
edit_url = f'https://myhoreca.itsm365.com/sd/services/rest/edit/{sd_entry[12]}'
|
||||||
# Отправляем запрос на редактирование объекта в SD
|
params = {'accessKey': os.getenv('SDKEY'), 'FNNumber': pos_entry[4], 'FNExpireDate': formatted_date, 'LegalName': legalName, 'RNKKT': pos_entry[2], 'FRDownloader': pos_entry[8]}
|
||||||
edit_url = f'https://myhoreca.itsm365.com/sd/services/rest/edit/{sd_entry[3]}/'
|
|
||||||
params = {'accessKey': os.getenv('SDKEY'), 'FNNumber': json_entry[1], 'FNExpireDate': formatted_date}
|
|
||||||
post(edit_url, params)
|
post(edit_url, params)
|
||||||
|
|
||||||
conn_json.close()
|
conn_pos.close()
|
||||||
conn_sd.close()
|
conn_sd.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def run_tasks():
|
def run_tasks():
|
||||||
# Задание для работы с папкой с JSON файлами каждый час
|
schedule.every(15).seconds.do(process_json_files, os.getenv('JSONPATH'))
|
||||||
schedule.every().hour.do(process_json_files, os.getenv('JSONPATH'))
|
schedule.every(15).seconds.do(update_sd_table)
|
||||||
|
schedule.every(15).seconds.do(compare_and_update)
|
||||||
|
|
||||||
# Задание для выгрузки данных из SD каждые 2 часа
|
|
||||||
schedule.every(2).hours.do(importFromServiceDesk)
|
|
||||||
|
|
||||||
# Задание для сравнения и обновления данных каждые 2 часа
|
|
||||||
schedule.every(2).hours.do(compare_and_update)
|
|
||||||
|
|
||||||
# Запускаем бесконечный цикл для выполнения задач с периодичностью
|
|
||||||
while True:
|
while True:
|
||||||
schedule.run_pending()
|
schedule.run_pending()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
create_table('pos_fiscals')
|
||||||
|
create_table('sd_fiscals')
|
||||||
run_tasks()
|
run_tasks()
|
||||||
@@ -8,8 +8,8 @@ RUN apt-get update && \
|
|||||||
tzdata \
|
tzdata \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN pip install -r requirements.txt
|
|
||||||
|
|
||||||
RUN git clone https://github.com/serty2005/MHservice.git .
|
RUN git clone https://github.com/serty2005/MHservice.git .
|
||||||
|
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
CMD ["python", "/opt/app/app.py"]
|
CMD ["python", "/opt/app/app.py"]
|
||||||
16
files/00108729580581.json
Normal file
16
files/00108729580581.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"modelName": "АТОЛ 27Ф",
|
||||||
|
"serialNumber": "00108729580581",
|
||||||
|
"RNM": "0007037066025713",
|
||||||
|
"organizationName": "ИП ДАВЛАТОВ МИРЗОШО РАХМАТШОЕВИЧ",
|
||||||
|
"fn_serial": "7281440500179066",
|
||||||
|
"datetime_reg": "2023-02-16 10:39:00",
|
||||||
|
"dateTime_end": "2024-05-31 00:00:00",
|
||||||
|
"ofdName": "ООО Эвотор ОФД",
|
||||||
|
"bootVersion": "5.7.13",
|
||||||
|
"ffdVersion": "105",
|
||||||
|
"INN": "670602568722",
|
||||||
|
"fnExecution": "",
|
||||||
|
"attribute_podakciz": "False",
|
||||||
|
"attribute_marked": "False"
|
||||||
|
}
|
||||||
14
files/2024-04-03 copy.json
Normal file
14
files/2024-04-03 copy.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"modelName": "АТОЛ 22 v2 Ф",
|
||||||
|
"serialNumber": "00109525422090",
|
||||||
|
"RNM": "0000000004454545",
|
||||||
|
"organizationName": "ООО \"Предприятие\"",
|
||||||
|
"fn_serial": "7380440700425457",
|
||||||
|
"datetime_reg": "2024-04-02 03:35:00",
|
||||||
|
"dateTime_end": "2079-12-31 00:00:00",
|
||||||
|
"ofdName": "ООО \"Эвотор ОФД\"",
|
||||||
|
"bootVersion": "5.8.100",
|
||||||
|
"ffdVersion": "120",
|
||||||
|
"fnExecution": "Эмулятор ФН с поддержкой ФФД 1.2 ",
|
||||||
|
"INN": "1111222233 "
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"modelName": "АТОЛ 22 v2 Ф",
|
"modelName": "АТОЛ 22 v2 Ф",
|
||||||
"serialNumber": "00109525422090",
|
"serialNumber": "00109525422090",
|
||||||
"RNM": "0000000001035518",
|
"RNM": "0000000001032218",
|
||||||
"organizationName": "ООО \"Предприятие\"",
|
"organizationName": "ООО \"Предприятие\"",
|
||||||
"fn_serial": "7380440700425457",
|
"fn_serial": "7380440700425457",
|
||||||
"datetime_reg": "2024-04-02 03:35:00",
|
"datetime_reg": "2024-04-02 03:35:00",
|
||||||
"dateTime_end": "2099-12-31 00:00:00",
|
"dateTime_end": "2057-12-31 00:00:00",
|
||||||
"ofdName": "ООО \"Эвотор ОФД\"",
|
"ofdName": "ООО \"Эвотор ОФД\"",
|
||||||
"bootVersion": "5.8.100",
|
"bootVersion": "5.8.100",
|
||||||
"ffdVersion": "120",
|
"ffdVersion": "120",
|
||||||
|
|||||||
Reference in New Issue
Block a user