Диплом: Автоматизация учета предоставленных услуг в комплексном центре социального обслуживания населения и анализа данных на примере СПБ ГБУСОН "КЦСОН Адмиралтейского района Санкт-Петербурга"

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
141
INSERT INTO `kcson`.`category` (`id`, `category`, `archive`, `prim`, `total`, `subof`) VALUES (14, ' ', NULL, NULL,
NULL, 1);
INSERT INTO `kcson`.`category` (`id`, `category`, `archive`, `prim`, `total`, `subof`) VALUES (1, '', 0, '
 (,,,, )', NULL, NULL);
INSERT INTO `kcson`.`category` (`id`, `category`, `archive`, `prim`, `total`, `subof`) VALUES (2, '', 0, '
 (,,)', NULL, 1);
INSERT INTO `kcson`.`category` (`id`, `category`, `archive`, `prim`, `total`, `subof`) VALUES (11, '', NULL, NULL, NULL, 2);
INSERT INTO `kcson`.`category` (`id`, `category`, `archive`, `prim`, `total`, `subof`) VALUES (12, '', NULL, NULL, NULL, 2);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`job`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (DEFAULT, '  ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (2, ' ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (3, ' ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (4, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (5, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (6, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (7, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (8, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (9, '  ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (10, ' ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (11, ' ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (12, '   ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (13, '', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (14, '  ', '');
INSERT INTO `kcson`.`job` (`id`, `job`, `prim`) VALUES (15, ' ', NULL);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`dep_has_worker`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
INSERT INTO `kcson`.`dep_has_worker` (`id`, `worker_id`, `dep_id`, `job_id`, `name`, `prim`, `archive`, `from`, `till`) VALUES
(1, 1, 1, 1, ' ', NULL, 0, NULL, NULL);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`setting`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
INSERT INTO `kcson`.`setting` (`id`, `archive`, `setting`, `value`, `prim`, `sdate`) VALUES (DEFAULT, 0, '', '
 \"   -\"', NULL, DEFAULT);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`jobGroup`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
INSERT INTO `kcson`.`jobGroup` (`id`, `jobGroup`, `prim`) VALUES (1, '   ', NULL);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`dep_has_ripso`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
INSERT INTO `kcson`.`dep_has_ripso` (`dep_id`, `ripso_id`) VALUES (1, 1);
COMMIT;
-- -----------------------------------------------------
-- Data for table `kcson`.`live_min`
-- -----------------------------------------------------
START TRANSACTION;
USE `kcson`;
142
INSERT INTO `kcson`.`live_min` (`id`, `lmdate`, `live_min_p`, `live_min_w`, `live_min_c`, `post`, `post_date`) VALUES (1,
'18.06.2019', 11074.1, 12472.1, 9221.7, NULL, NULL);
COMMIT;
ПРИЛОЖЕНИЕ Б ТЕКСТ ОСНОВНОГО ПРОГРАММНОГО
МОДУЛЕЙ КЛИЕНТА АИС ТРИУСОН
#!/usr/bin/python3
# -------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
# Name: AIS 3USON Main QT Frontend
# Purpose:
#
# Author: Alex Savin
# Created: 2019
# Copyright: Alex Savin
# Licence: LGPL 3
# This software is licensed under the "LGPLv3" License as described in the "LICENSE" file,
# which should be included with this package. The terms are also available at
# http://www.gnu.org/licenses/lgpl-3.0.html
# -------------------------------------------------------------------------------
SQL_DATE_FORMAT = "yyyy-MM-dd"
VERSION = 1
import configparser
import sys
from typing import NoReturn
from logging import handlers
#############################
# For money
# ---------------------------
import decimal
decimal.getcontext().prec = 2
#############################
# switch QT binding
# ---------------------------
# import os
# os.environ['QT_API'] = "pyside2"
# os.environ['QT_API'] = "pyqt5"
#############################
# QT Libraries
# ---------------------------
from qtpy import QtGui, uic
from qtpy.QtCore import *
from custumQWidgets import *
# from mainWindow_pysides2 import *
# from login_dialog_pyside2 import *
modules = list(sys.modules.keys()) # TODO: filter
if "PyQt5" in modules:
debug("loading PyQt5")
from mainWindow_pyqt5 import Ui_MainWindow
elif "PySide2" in modules:
143
debug("loading PySides2")
from mainWindow_pyside2 import Ui_MainWindow
else:
debug("really? Qt not found: %s ", modules)
try:
# if Q_OS_LINUX:
import subprocess
subprocess.run('uic.sh', shell=True)
# vcredist_x86.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
# msiexec /i c:\path\to\package.msi /quiet /qn /norestart /log c:\path\to\install.log PROPERTY1=value1
PROPERTY2=value2
except:
pass
#############################
# setup logger
# ---------------------------
def LoggerSet():
"""Return: debug, info, warning, error, critical - functions of new logger"""
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create file handler
fh = logging.FileHandler('3uson.log')
fh.setLevel(logging.INFO)
# create console handler
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(lineno)-4s - %(levelname)s - %(message)s')
formatter1 = logging.Formatter('%(lineno)-4s-%(levelname).1s-%(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter1)
# rotate logs
logrotate = handlers.RotatingFileHandler(
fh.baseFilename, maxBytes=500000, backupCount=5)
# add the handlers to logger
logger.addHandler(logrotate)
logger.addHandler(fh)
logger.addHandler(ch)
logger.info("logget set")
# make logger static var
LoggerSet.l = logger
l = logger
return l.debug, l.info, l.warning, l.error, l.critical
debug, info, warning, error, critical = LoggerSet()
class allEventFilter(QObject):
def __init__(self, parent):
self.parent = parent
super().__init__(parent)
def eventFilter(self, qobj, event):
ui = self.parent.ui
parent = self.parent
if event.type() == QEvent.MouseButtonRelease:
144
if qobj is ui.menu_settings:
if isinstance(qobj, QtWidgets.QMenu):
if qobj.activeAction():
aName = qobj.activeAction().objectName()
if aName == "qaFontSmaller" or aName == "qaFontBigger":
qobj.activeAction().trigger()
return True
return super().eventFilter(qobj, event)
class MyApp(QtWidgets.QMainWindow): # , Ui_MainWindow
parent: QWidget
def __init__(self, parent=None):
# QtWidgets.QMainWindow.__init__(self)
super(MyApp, self).__init__(parent)
self._dirty = False
self.data = TsonData()
self.qsettings = QSettings("AIS 3USON", "MyApp")
# self.config = self.data.config
self.login_done = False
data = self.data
self.tablesRTModel = {}
self.tableList = {}
#############################
# load QSettins
# ---------------------------
self.font_size = self.font().pointSize()
self.readQSetting()
#############################
# loading UI files
# ---------------------------
self.ui: Ui_MainWindow = uic.loadUi("MainWindow.ui", self)
self.dlg = uic.loadUi("login_dialog.ui")
ui = self.ui
dlg = self.dlg
dlg.user.setText(data.user)
dlg.password.setText(data.password)
#############################
# ui setups
# ---------------------------
# self.FontG = QtWidgets.QActionGroup(self)
# fg = self.FontG
ui = self.ui
#############################
# setup Icons TODO: add resources
# ---------------------------
ui.action_undo.setIcon(
QtGui.QIcon.fromTheme("edit-undo",
self.style().standardIcon(QtWidgets.QStyle.SP_ArrowBack)))
ui.action_redo.setIcon(
QtGui.QIcon.fromTheme("edit-redo",
self.style().standardIcon(QtWidgets.QStyle.SP_ArrowRight)))
ui.action_discard.setIcon(
QtGui.QIcon.fromTheme("document-revert",
self.style().standardIcon(QtWidgets.QStyle.SP_DialogDiscardButton)))
ui.action_save.setIcon(
QtGui.QIcon.fromTheme("document-save",
self.style().standardIcon(QtWidgets.QStyle.SP_DialogSaveButton)))
145
#############################
# action default state
# ---------------------------
ui.action_undo.setEnabled(False)
ui.action_redo.setEnabled(False)
ui.action_discard.setEnabled(False)
ui.action_save.setEnabled(False)
#############################
# connect signals and slots
# ---------------------------
self.make_connections()
# QMetaObject.connectSlotsByName(self)
ef = allEventFilter(self)
ui.menu_settings.installEventFilter(ef)
#############################
# Inner state
# ---------------------------
def isDirty(self):
return self._dirty
def setDirty(self, dirty=True):
self._dirty = dirty
ui = self.ui
ui.action_discard.setEnabled(dirty)
ui.action_save.setEnabled(dirty)
# TODO:activate edit options here
@Slot(str)
def on_qle_fio_filter_textChanged(self, text: str):
ui = self.ui
tr = self.tr
if text:
ui.label_fio_filter.setText(tr(" :"))
mdl = self.data.setFilterCol(ui.table_dep_has_ufio, "ufio")
mdl.setFilterFixedString(text)
else:
ui.label_fio_filter.setText(tr(" :"))
try:
ui.table_dep_has_ufio.model().setFilterFixedString("")
except:
warning("not filtered model for table_dep_has_ufio")
#############################
# toolBar and menu
# ---------------------------
@Slot()
def on_action_QT_triggered(self):
debug("TEST CODE")
try:
# self.ui.table_serv.
r = self.data.models['serv'].record()
for fi in range(0, r.count()):
debug(" %s %s", r.fieldName(fi), r.field(fi).type())
except:
pass
QMessageBox.aboutQt(self)
146
@Slot()
def on_action_save_triggered(self):
"""save all tables in active tab
"""
ui = self.ui
d = self.data
debug("on_action_save_triggered")
if self.isDirty():
for key, obj in self.tableList.items():
try:
if obj.isDirty():
name = key[6:]
d.models[name].submitAll()
debug("saving %s ", key)
except:
pass
@Slot()
def on_action_update_tables_triggered(self):
"""
"""
ui = self.ui
d = self.data
for name, mdl in d.models.items():
mdl.select()
debug("updated model %s ", name)
debug("models updated")
@Slot()
def on_action_discard_triggered(self):
"""discard all tables in active tab
"""
ui = self.ui
d = self.data
debug("on_discard_save_triggered")
if self.isDirty():
for key, obj in self.tableList.items():
try:
if obj.isDirty():
name = key[6:]
d.models[name].select()
d.models[name].setDirty.emit(False)
debug("discard %s ", key)
except:
pass
@Slot()
def on_qaFontSmaller_triggered(self):
self.set_current_font(-1)
self.ui.qaFontSmaller.setChecked(False)
@Slot()
def on_qaFontBigger_triggered(self):
self.set_current_font(+1)
self.ui.qaFontBigger.setChecked(False)
def set_current_font(self, fsize):
qfont: QFont = self.font()
147
fsize = qfont.pointSize() + fsize
if fsize > 4:
self.qsettings.setValue("font_size", fsize)
qfont.setPointSize(fsize)
QtWidgets.QApplication.instance().setFont(qfont)
#############################
# check sql queries - for debug
# ---------------------------
@Slot()
def on_btn_check_sql_clicked(self):
"""
"""
ui = self.ui
qry = QSqlQuery()
qry.exec_(ui.txt_sql.toPlainText())
res = ""
while qry.next():
for i in range(qry.record().count()):
res = res + str(qry.record().value(i))
res = res + "\n"
ui.txt_sql2.setPlainText(res + qry.lastError().text())
#############################
# Add services tab
# ---------------------------
@Slot(bool)
def on_tab_add_serv_widgetVisibilityChanged(self, state):
"""
"""
ui = self.ui
models = self.data.models
self.data.addModel("dep_has_serv")
models["dep_has_ufio"].select()
#############################
# second tab - calendar
# ---------------------------
if ui.qle_date.date() == QDate(2000, 1, 1): # TODO rework it
ui.comboFIO2.setCurrentIndex(-1)
ui.comboServ2.setCurrentIndex(-1)
ui.comboW2.setCurrentIndex(-1)
ui.qleAmount2.setValue(0)
ui.comboFIO2.setModel(models["dep_has_ufio"])
ui.comboFIO2.setModelColumn(1)
ui.comboW2.setModel(models["dep_has_worker"])
ui.comboW2.setModelColumn(1)
# TODO: on change fio replace this list
# TODO subclass combo - bold for total and don't select it
ui.comboServ2.setModel(models["dep_has_serv"])
ui.comboServ2.setModelColumn(2)
#############################
# first tab - 1 serv
# ---------------------------
if ui.qle_date.date() == QDate(2000, 1, 1): # TODO rework it
ui.qle_date.setDate(QDate.currentDate())
ui.comboFIO.setCurrentIndex(-1)
ui.comboServ.setCurrentIndex(-1)
ui.comboW.setCurrentIndex(-1)
148
ui.qleAmount.setValue(0)
ui.comboFIO.setModel(models["dep_has_ufio"])
ui.comboFIO.setModelColumn(1)
ui.comboW.setModel(models["dep_has_worker"])
ui.comboW.setModelColumn(3)
# TODO: on change fio replace this list
ui.comboServ.setModel(models["dep_has_serv"])
ui.comboServ.setModelColumn(2)
@Slot(int)
def on_comboServ_currentIndexChanged(self, ind):
self.set_qle_serv_left()
@Slot(int)
def on_comboFIO_currentIndexChanged(self, ind):
self.set_qle_serv_left()
def set_qle_serv_left(self):
ui=self.ui
d=self.data
tr=self.tr
try:
tmr=self.set_qle_serv_left_tmr
if tmr.isActive():
return
tmr.singleShot(500, self._set_qle_serv_left)

except AttributeError:
self.set_qle_serv_left_tmr = QTimer()
@Slot()
def _set_qle_serv_left(self):
ui=self.ui
d=self.data
tr=self.tr
ufio = self.getComboBox0(ui.comboFIO)
serv = self.getComboBox0(ui.comboServ)
if not (ufio and ui.comboFIO.currentText()):
ui.qle_serv_left.setText(tr("  "))
return
if not (serv and ui.comboServ.currentText()):
ui.qle_serv_left.setText(tr(" "))
return
vdate = ui.qle_date.date().toString("yyyy-MM-dd")
contr=d.get_contract(ufio, vdate)
if contr > 0 :
qry = QSqlQuery()
qry.prepare("""select planned, filled, prim
from contracts_has_serv
where contracts_id = ? and serv_id = ? """)
qry.addBindValue(contr)
qry.addBindValue(serv)
ret = qry.exec_()
try:
if qry.next():
res = qry.value(0) - qry.value(1)
149
res = str(res) + " " + str(qry.value(3))
ui.qle_serv_left.setText(str(res))
else:
ui.qle_serv_left.setText(tr("    !"))
except:
- 
else:

@Slot("QDate")
def on_qle_date_dateChanged(self, ndate):
ui = self.ui
d = self.data
s = self.data.si
dbeg = s.dbeg
dend = s.dend
vdate = ui.qle_date.date()
self.set_qle_serv_left()
# TODO: move most of it into self.data.si
if (s.model_dep_has_main_by_day and dbeg
and vdate > dbeg and vdate < dend):
#############################
# update 1st filter model
# ---------------------------
vdate = vdate.toString(SQL_DATE_FORMAT)
debug(vdate)
mdl = d.setFilterCol(ui.table_dep_has_main_by_day, "vdate")
mdl.setFilterFixedString(vdate)
# print_model_data(mdl)
#############################
# update 2nd filter model
# ---------------------------
worker = ui.comboW.currentText()
mdl = d.setFilterCol(ui.table_dep_has_main_by_day_by_worker, "worker_id")
mdl.setFilterFixedString(worker)
else:
#############################
# (re)init filters
# ---------------------------
# get qry for +-32 days
dbeg = ui.qle_date.date().addDays(-32)
dend = ui.qle_date.date().addDays(32)
s.dbeg = dbeg
s.dend = dend
debug("start setup model_dep_has_main_by_day")
where = " vdate between '%s' and '%s' "
where = where % (dbeg.toString(SQL_DATE_FORMAT), dend.toString(SQL_DATE_FORMAT))
mdl = d.addModel("dep_has_main_by_day", "", "main_nz", where)
s.model_dep_has_main_by_day = mdl
#############################
# init first filter for table_dep_has_main_by_day
# ---------------------------
sfm = QSortFilterProxyModel()
sfm.setSourceModel(mdl)
s.model_dep_has_main_by_day = sfm
tv_bd = ui.table_dep_has_main_by_day
tv_bd.setModel(sfm)
150
tv_bd.setItemDelegate(myItemDelegate(tv_bd))
#############################
# init 2nd filter for table_dep_has_main_by_day_by_worker
# ---------------------------
sfm1 = QSortFilterProxyModel()
sfm1.setSourceModel(sfm)
s.model_dep_has_main_by_day_by_worker = sfm1
tv_bdbw = ui.table_dep_has_main_by_day_by_worker
tv_bdbw.setModel(sfm1)
tv_bdbw.setItemDelegate(myItemDelegate(tv_bdbw))
#############################
# and now update filters
# ---------------------------
self.on_qle_date_dateChanged(ndate)
@Slot(QDate)
def on_cldr_date_clicked(self, qdate: QDate):
"""
"""
ui = self.ui
d = self.data
#############################
# get data for insert
# ---------------------------
ufio = self.getComboBox0(ui.comboFIO2)
vdate = qdate.toString("yyyy-MM-dd")
dep = self.data.dep
if ui.qleAmount2.value() <= 0: # TODO: more checks
return
debug(self.data.get_contract(ufio, vdate, dep), )
qry_data = [
self.data.get_contract(ufio, vdate, dep),
dep,
ufio,
self.getComboBox0(ui.comboServ2),
vdate,
ui.qleAmount.value(),
self.getComboBox0(ui.comboW2),
ui.qleNote.text()
]
self.ins_main(qry_data)
@Slot()
def on_btn_qle_date_1_clicked(self):
qle_date: QtWidgets.QDateEdit = self.ui.qle_date
qle_date.setDate(qle_date.date().addDays(-1))
@Slot()
def on_btn_qle_date_p1_clicked(self):
qle_date: QtWidgets.QDateEdit = self.ui.qle_date
qle_date.setDate(qle_date.date().addDays(1))
@Slot()
def on_btn_serv_bydayQ_clicked(self):
self.pre_ins_main(self.ui.comboFIO)
def getComboBox0(self, cmb: QComboBox, col=0):
row = cmb.currentIndex()
ind = cmb.model().index(row, col)

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)