Example #1
0
class EditShiftCellDialog(QDialog):
    def __init__(self, shiftId):
        super(EditShiftCellDialog, self).__init__()
        self.init(shiftId)
        self.loading()

    def init(self, shiftId):
        self.initUI()
        self.initSQL()
        self.initOther()
        self.initInteraction()
        self.initValue(shiftId)

    def initUI(self):
        self.ui = Ui_EditShiftCellDialog()
        self.ui.setupUi(self)

    def initSQL(self):
        self.SQLHelper = SQLHelper()

    def initOther(self):
        self.moveFlag = False

    def initValue(self, shiftId):
        self.shiftId = shiftId

    def initInteraction(self):
        self.ui.cancel.clicked.connect(self.cancelClicked)
        self.ui.dialogNavClose.clicked.connect(self.dialogNavCloseClicked)
        self.ui.comfirm.clicked.connect(self.comfirmClicked)
        self.ui.nameLineEdit.returnPressed.connect(
            self.nameLineEditReturnPressed)
        self.ui.hourLineEdit.returnPressed.connect(
            self.hourLineEditReturnPressed)
        self.ui.payHourLineEdit.returnPressed.connect(
            self.payHourLineEditReturnPressed)

    def loading(self):
        self.loadingData()
        self.loadingData()

    def loadingData(self):
        now = datetime.now()

        if not self.shiftId is None:
            shift = self.SQLHelper.getShiftById(self.shiftId)[0]

            shiftStartTime = datetime.strptime(shift[2], "%H:%M:%S")
            shiftEndTime = datetime.strptime(shift[3], "%H:%M:%S")

            self.ui.nameLineEdit.setText(shift[1])
            self.ui.hourLineEdit.setText(str(shift[4]))
            self.ui.timeStart.setTime(
                QTime(shiftStartTime.hour, shiftStartTime.minute,
                      shiftStartTime.second))
            self.ui.timeEnd.setTime(
                QTime(shiftEndTime.hour, shiftEndTime.minute,
                      shiftEndTime.second))
            self.ui.payHourLineEdit.setText(str(shift[5]))
        else:
            self.ui.timeStart.setTime(QTime(now.hour, now.minute, now.second))
            self.ui.timeEnd.setTime(QTime(now.hour, now.minute, now.second))

    def loadingFocus(self):
        self.ui.nameLineEdit.setFocus(True)

    def cancelClicked(self):
        self.SQLHelper.close()
        self.reject()

    def dialogNavCloseClicked(self):
        self.SQLHelper.close()
        self.reject()

    def comfirmClicked(self):
        startTime = self.ui.timeStart.time()
        endTime = self.ui.timeEnd.time()

        name = self.ui.nameLineEdit.text()
        start = f'{startTime.hour():02d}:{startTime.minute():02d}:{startTime.second():02d}'
        end = f'{endTime.hour():02d}:{endTime.minute():02d}:{endTime.second():02d}'
        hour = self.ui.hourLineEdit.text()
        payHour = self.ui.payHourLineEdit.text()

        if name == '' or hour == '' or payHour == '':
            dialog = MessageDialog("錯誤訊息", "請確認表單內容填寫完整")
            dialog.exec()
        else:
            if self.shiftId is None:
                dialog = MessageDialog("提示訊息", "請確認是否新增該筆班別資料")
                if dialog.exec():
                    self.SQLHelper.newShift(name, start, end, float(hour),
                                            float(payHour))
                    self.accept()

            else:
                dialog = MessageDialog("提示訊息", "請確認是否修改該筆班別資料")
                if dialog.exec():
                    self.SQLHelper.updateShiftById(self.shiftId, name, start,
                                                   end, float(hour),
                                                   float(payHour))
                    self.accept()

    def nameLineEditReturnPressed(self):
        self.ui.timeStart.setFocus(True)

    def hourLineEditReturnPressed(self):
        self.ui.payHourLineEdit.setFocus(True)

    def payHourLineEditReturnPressed(self):
        self.comfirmClicked()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.moveFlag = True
            self.movePosition = event.globalPos() - self.pos()
            self.setCursor(QCursor(Qt.OpenHandCursor))
            event.accept()

    def mouseMoveEvent(self, event):
        if Qt.LeftButton and self.moveFlag:
            self.move(event.globalPos() - self.movePosition)
            event.accept()

    def mouseReleaseEvent(self, event):
        self.moveFlag = False
        self.setCursor(Qt.ArrowCursor)
class ShiftHelper:
    def __init__(self):
        self.initSQL()

    def initSQL(self):
        self.SQLHelper = SQLHelper()

    def getShiftByTime(self, time):

        time = datetime.strptime(time, "%H:%M:%S")

        shifts = self.SQLHelper.getAllShift()

        for shift in shifts:
            start = datetime.strptime(f"{shift[2]}", "%H:%M:%S")
            end = datetime.strptime(f"{shift[3]}", "%H:%M:%S")
            if start > end:
                end += timedelta(days=1)
            if start <= time <= end:
                return shift

    def getShiftStatus(self, shiftId, date, checkIn, checkOut):

        now = datetime.now()

        try:
            checkIn = datetime.strptime(checkIn, "%Y-%m-%d %H:%M:%S")
        except:
            checkIn = None
        try:
            checkOut = datetime.strptime(checkOut, "%Y-%m-%d %H:%M:%S")
        except:
            checkOut = None

        shift = self.SQLHelper.getShiftById(shiftId)

        shouldCheckIn = datetime.strptime(f'{date} {shift[0][2]}',
                                          "%Y-%m-%d %H:%M:%S")
        shouldCheckOut = datetime.strptime(f'{date} {shift[0][3]}',
                                           "%Y-%m-%d %H:%M:%S")

        if shouldCheckIn > shouldCheckOut:
            shouldCheckOut += timedelta(days=1)

        if now < shouldCheckIn:
            if not checkIn is None and not checkOut is None:
                return "早退"
            elif not checkIn is None:
                return "執行中"
            else:
                return "未執行"
        elif shouldCheckIn <= now < shouldCheckOut:
            if checkIn is None:
                return "已遲到未執行"
            elif checkIn >= shouldCheckIn and checkOut is None:
                return "已遲到執行中"
            elif checkOut is None:
                return "執行中"
            elif checkIn >= shouldCheckIn and checkOut < shouldCheckOut:
                return "遲到早退"
            elif checkIn >= shouldCheckIn and checkOut >= shouldCheckOut:
                return "遲到"
            elif checkIn < shouldCheckIn and checkOut < shouldCheckOut:
                return "早退"
        else:
            if checkIn is None and checkOut is None:
                return "曠班"
            elif checkOut is None:
                return "未簽退"
            elif checkIn >= shouldCheckIn and checkOut < shouldCheckOut:
                return "遲到早退"
            elif checkIn >= shouldCheckIn:
                return "遲到"
            elif checkOut < shouldCheckOut:
                return "早退"
            elif checkIn < shouldCheckIn and checkOut >= shouldCheckOut:
                return "準時"