0.0.1
This commit is contained in:
153
app.py
153
app.py
@@ -1,153 +0,0 @@
|
|||||||
import os
|
|
||||||
import json
|
|
||||||
import sqlite3
|
|
||||||
import time
|
|
||||||
import requests
|
|
||||||
import sys
|
|
||||||
from dateutil import parser
|
|
||||||
import schedule
|
|
||||||
# from dotenv import load_dotenv
|
|
||||||
|
|
||||||
# load_dotenv()
|
|
||||||
|
|
||||||
def post(url, params):
|
|
||||||
response = requests.post(url, params=params)
|
|
||||||
if response.status_code == 201:
|
|
||||||
return sys.stdout.write("Успешно добавлено\n")
|
|
||||||
elif response.status_code == 200:
|
|
||||||
return response.text
|
|
||||||
elif response.status_code == 500:
|
|
||||||
sys.stderr.write("Ошибка подключения: " + str.strip(response.text) + '\n')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def create_table(type):
|
|
||||||
#Создаём пустую таблицу
|
|
||||||
db_path = os.getenv("BDPATH")
|
|
||||||
db_file = "fiscals.db"
|
|
||||||
table_name = type
|
|
||||||
conn = sqlite3.connect(db_path + db_file)
|
|
||||||
c = conn.cursor()
|
|
||||||
c.execute("""
|
|
||||||
CREATE TABLE IF NOT EXISTS %s (
|
|
||||||
serialNumber TEXT PRIMARY KEY,
|
|
||||||
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.close()
|
|
||||||
|
|
||||||
|
|
||||||
def importFromJSON(file_path):
|
|
||||||
with open(file_path, 'r', encoding='utf-8') as json_file:
|
|
||||||
data = json.load(json_file)
|
|
||||||
path = os.getenv("BDPATH") + 'fiscals.db'
|
|
||||||
conn = sqlite3.connect(path)
|
|
||||||
c = conn.cursor()
|
|
||||||
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,
|
|
||||||
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, INN)
|
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
|
||||||
(data['modelName'], data['serialNumber'], data['RNM'], data['organizationName'],
|
|
||||||
data['fn_serial'], data['datetime_reg'], data['dateTime_end'], data['ofdName'],
|
|
||||||
data['bootVersion'], data['ffdVersion'], data['fnExecution'], data['INN']))
|
|
||||||
conn.commit()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
def process_json_files(directory):
|
|
||||||
for filename in os.listdir(directory):
|
|
||||||
if filename.endswith('.json'):
|
|
||||||
importFromJSON(os.path.join(directory, filename))
|
|
||||||
|
|
||||||
|
|
||||||
def importFromServiceDesk(sd_data):
|
|
||||||
conn = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
|
||||||
parsed=json.loads(sd_data)
|
|
||||||
c = conn.cursor()
|
|
||||||
for data in parsed:
|
|
||||||
owner_uuid = data['owner']['UUID'] if data.get('owner') and data['owner'].get('UUID') else None
|
|
||||||
modelName = data['ModelKKT']['title']
|
|
||||||
ofdName = data['OFDName']['title'] if data.get('OFDName') else None
|
|
||||||
ffdVersion = data['FFD']['title'] if data.get('FFD') else None
|
|
||||||
|
|
||||||
c.execute('''INSERT OR REPLACE INTO sd_fiscals
|
|
||||||
(modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
|
||||||
dateTime_end, ofdName, bootVersion, ffdVersion, owner_uuid, UUID)
|
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
|
|
||||||
(modelName, data['FRSerialNumber'], data['RNKKT'], data['LegalName'],
|
|
||||||
data['FNNumber'], data['KKTRegDate'], data['FNExpireDate'], ofdName,
|
|
||||||
data['FRDownloader'], ffdVersion, owner_uuid, data['UUID']))
|
|
||||||
conn.commit()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
|
|
||||||
def update_sd_table():
|
|
||||||
url = 'https://myhoreca.itsm365.com/sd/services/rest/find/objectBase$FR'
|
|
||||||
params = {'accessKey': os.getenv('SDKEY'), 'attrs': 'UUID,FRSerialNumber,RNKKT,KKTRegDate,FNExpireDate,FNNumber,owner,FRDownloader,LegalName,OFDName,ModelKKT,FFD'}
|
|
||||||
response = post(url, params)
|
|
||||||
if response:
|
|
||||||
importFromServiceDesk(response)
|
|
||||||
|
|
||||||
|
|
||||||
def compare_and_update():
|
|
||||||
conn_sd = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
|
||||||
conn_pos = sqlite3.connect(os.getenv("BDPATH") + 'fiscals.db')
|
|
||||||
c_pos = conn_pos.cursor()
|
|
||||||
c_sd = conn_sd.cursor()
|
|
||||||
|
|
||||||
c_sd.execute('''SELECT modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
|
||||||
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, owner_uuid, UUID
|
|
||||||
FROM sd_fiscals''')
|
|
||||||
sd_data = c_sd.fetchall()
|
|
||||||
|
|
||||||
c_pos.execute('''SELECT modelName, serialNumber, RNM, organizationName, fn_serial, datetime_reg,
|
|
||||||
dateTime_end, ofdName, bootVersion, ffdVersion, fnExecution, INN
|
|
||||||
FROM pos_fiscals''')
|
|
||||||
pos_data = c_pos.fetchall()
|
|
||||||
|
|
||||||
for sd_entry in sd_data:
|
|
||||||
for pos_entry in pos_data:
|
|
||||||
if sd_entry[1] == pos_entry[1]:
|
|
||||||
sd_date = parser.parse(sd_entry[6])
|
|
||||||
pos_date = parser.parse(pos_entry[6])
|
|
||||||
|
|
||||||
if sd_date != pos_date:
|
|
||||||
sys.stdout.write(f"Объект с UUID {sd_entry[12]} будет изменен.\n")
|
|
||||||
formatted_date = pos_date.strftime('%Y.%m.%d %H:%M:%S')
|
|
||||||
if 'ИНН:' not in pos_entry[3]:
|
|
||||||
legalName = pos_entry[3] + ' ' + 'ИНН:' + pos_entry[11]
|
|
||||||
else:
|
|
||||||
legalName = pos_entry[3]
|
|
||||||
edit_url = f'https://myhoreca.itsm365.com/sd/services/rest/edit/{sd_entry[12]}'
|
|
||||||
params = {'accessKey': os.getenv('SDKEY'), 'FNNumber': pos_entry[4], 'FNExpireDate': formatted_date, 'LegalName': legalName, 'RNKKT': pos_entry[2], 'FRDownloader': pos_entry[8]}
|
|
||||||
post(edit_url, params)
|
|
||||||
|
|
||||||
conn_pos.close()
|
|
||||||
conn_sd.close()
|
|
||||||
|
|
||||||
def run_tasks():
|
|
||||||
schedule.every(30).minutes.do(update_sd_table)
|
|
||||||
schedule.every(30).minutes.do(compare_and_update)
|
|
||||||
schedule.every(30).minutes.do(process_json_files, os.getenv('JSONPATH'))
|
|
||||||
|
|
||||||
while True:
|
|
||||||
schedule.run_pending()
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
create_table('pos_fiscals')
|
|
||||||
create_table('sd_fiscals')
|
|
||||||
run_tasks()
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
fnrefresher:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: dockerfile
|
|
||||||
volumes:
|
|
||||||
- "/opt/ftp/files:/opt/app/files"
|
|
||||||
environment:
|
|
||||||
- JSONPATH=/opt/app/files
|
|
||||||
- BDPATH=/opt/app/files
|
|
||||||
- SDKEY='23a910df-77e0-4417-a23e-3617b6a0f0ef'
|
|
||||||
|
|
||||||
ftpserver:
|
|
||||||
image: stilliard/pure-ftpd
|
|
||||||
container_name: ftpserver
|
|
||||||
ports:
|
|
||||||
- "21:21"
|
|
||||||
- "30000-30005:30000-30005"
|
|
||||||
volumes:
|
|
||||||
- "/opt/ftp/files:/home/ftpuser"
|
|
||||||
# uncomment for ssl/tls, see https://github.com/stilliard/docker-pure-ftpd#tls
|
|
||||||
# - "/etc/letsencrypt/live/<your_server>/cert.pem:/etc/ssl/private/pure-ftpd-cert.pem"
|
|
||||||
# - "/etc/letsencrypt/live/<your_server>/privkey.pem:/etc/ssl/private/pure-ftpd-key.pem"
|
|
||||||
environment:
|
|
||||||
# PUBLICHOST:
|
|
||||||
FTP_USER_NAME: ftpuser
|
|
||||||
FTP_USER_PASS: 11
|
|
||||||
FTP_USER_HOME: /home/ftpuser
|
|
||||||
# for ssl/tls
|
|
||||||
# ADDED_FLAGS: '--tls=2'
|
|
||||||
restart: always
|
|
||||||
depends_on:
|
|
||||||
- fnrefresher
|
|
||||||
18
dockerfile
18
dockerfile
@@ -1,18 +0,0 @@
|
|||||||
FROM python:3.11.9-slim
|
|
||||||
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
git \
|
|
||||||
tzdata \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
WORKDIR /opt/app
|
|
||||||
|
|
||||||
RUN git clone https://github.com/serty2005/MHservice.git .
|
|
||||||
|
|
||||||
ENV TZ="Europe/Moscow"
|
|
||||||
|
|
||||||
RUN pip install -r requirements.txt
|
|
||||||
|
|
||||||
CMD ["python", "/opt/app/app.py"]
|
|
||||||
BIN
files/fiscals.db
BIN
files/fiscals.db
Binary file not shown.
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
Reference in New Issue
Block a user