Ejemplo n.º 1
0
def getPersonInfo(personId):
    if personId is None:
        return u'', u'', u''

    db = QtGui.qApp.db
    Person = db.table('Person')
    Post = db.table('rbPost')
    Speciality = db.table('rbSpeciality')

    queryTable = Person.leftJoin(Post, Post['id'].eq(Person['post_id']))
    queryTable = queryTable.leftJoin(
        Speciality, Speciality['id'].eq(Person['speciality_id']))
    cols = [
        Person['lastName'].alias('lastName'),
        Person['firstName'].alias('firstName'),
        Person['patrName'].alias('patrName'), Post['name'].alias('post'),
        Speciality['name'].alias('speciality')
    ]
    cond = [Person['id'].eq(personId)]

    personRecord = db.getRecordEx(queryTable, cols, cond)

    if not personRecord is None:
        lastName = forceString(personRecord.value('lastName'))
        firstName = forceString(personRecord.value('firstName'))
        patrName = forceString(personRecord.value('patrName'))
        post = forceString(personRecord.value('post'))
        speciality = forceString(personRecord.value('speciality'))

        return formatName(lastName, firstName, patrName), post, speciality

    return u'', u'', u''
Ejemplo n.º 2
0
        def processQuery(query):
            while query.next():
                record = query.record()
                refuseTypeId = forceRef(record.value('refuseType_id'))
                refuseTypeCode = forceString(record.value('refuseTypeCode'))
                refuseTypeName = forceString(record.value('refuseTypeName'))
                personId = forceRef(record.value('person_id'))
                specialityName = forceString(record.value('specialityName'))
                specialityId = forceInt(record.value('speciality_id'))
                lastName = forceString(record.value('lastName'))
                firstName = forceString(record.value('firstName'))
                patrName = forceString(record.value('patrName'))
                code = forceString(record.value('code'))

                itemCount = forceInt(record.value('itemCount'))
                amount = forceDouble(record.value('amount'))
                uet = forceDouble(record.value('uet'))
                sum = forceDouble(record.value('sum'))
                name = formatName(lastName, firstName, patrName)
                key = (
                    specialityName
                    if specialityName else u'Без указания специальности',
                    name if name else u'Без указания врача',
                    code,
                    #                       personId,
                    refuseTypeCode,
                    refuseTypeName,
                    #                       refuseTypeId
                )

                reportLine = reportData.setdefault(key, [0] * reportRowSize)
                reportLine[0] += itemCount
                reportLine[1] += amount
                reportLine[2] += uet
                reportLine[3] += sum
Ejemplo n.º 3
0
 def setReduced(self, value):
     self.txtClientInfoBrowser.setVisible(not value)
     if self.clientInfo is None:
         self.clientInfo = getClientInfo(self.clientId)
     name = formatName(self.clientInfo.lastName, self.clientInfo.firstName, self.clientInfo.patrName)
     self.setWindowTitle(self.windowTitle() + ' : ' + name)
     self.setVisibleBtnCloseWidgets(value)
Ejemplo n.º 4
0
 def format(self, values):
     val = values[0]
     clientId = forceRef(val)
     clientRecord = QtGui.qApp.db.getRecord('Client', '*', clientId)
     if clientRecord:
         name = formatName(clientRecord.value('lastName'),
                           clientRecord.value('firstName'),
                           clientRecord.value('patrName'))
         return toVariant(name)
     return CCol.invalid
Ejemplo n.º 5
0
    def onExportToFile(self):
        from library import xlwt

        filename = forceString(
            QtGui.QFileDialog.getSaveFileName(self, u'Выберите имя файла',
                                              QtCore.QDir.homePath(),
                                              u'XLS файл (*.xls)'))
        if filename:
            if not filename.endswith(u'.xls'):
                filename += u'.xls'
        else:
            return

        progressBar = self.getProgressBar()
        ProgressMsg = u'Сохранение... %p%'

        try:
            progressBar.show()
            QtGui.qApp.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))

            self.updateProgressBar(progressBar, 0, 1, u'Запрос к БД ...')
            idList = self.tblClientExaminationPlan.model().idList()
            itemCount = len(idList)

            wb = xlwt.Workbook(encoding='utf-8')
            sh = wb.add_sheet('List1')
            for col, name in enumerate(
                (u'Код пациента', u'ФИО пациента', u'Дата рождения',
                 u'Вид проф. мероприятия', u'Год прохождения', u'Месяц',
                 u'Ошибка')):
                sh.write(0, col, name)

            self.updateProgressBar(progressBar, 0, itemCount, ProgressMsg)
            for row, rec in enumerate(self.data.toExportData(idList), start=1):
                progressBar.setValue(row)
                for col, value in enumerate(
                    (forceInt(rec.value('clientId')),
                     formatName(rec.value('lastName'), rec.value('firstName'),
                                rec.value('patrName')),
                     forceString(
                         forceDate(
                             rec.value('birthDate')).toString('dd.MM.yyyy')),
                     ExamKind.getName(forceRef(rec.value('kind'))),
                     forceInt(rec.value('year')),
                     Month.getName(forceRef(rec.value('month'))),
                     forceString(rec.value('error')))):
                    sh.write(row, col, value)

            wb.save(filename)

        finally:
            progressBar.hide()
            QtGui.qApp.restoreOverrideCursor()
Ejemplo n.º 6
0
 def parseQueryInfo(self, query):
     self.a = 0
     recordList = self.makeNeedfulDicts(query)
     for record in recordList:
         personId = forceInt(record.value('id'))
         name = formatName(record.value('lastName'),
                           record.value('firstName'),
                           record.value('patrName'))
         key = name + '%d' % personId
         #            afore = self.doctorsDict.get(personId, None)
         afore = self.doctorsDict.get(key, None)
         if afore:
             self.addInfo(record, key)
         else:
             self.doctorsDict[key] = [name] + ([0] * 16)
             self.addInfo(record, key)
Ejemplo n.º 7
0
    def build(self, params):

        tableColumns = [
            ('5%', [u'№'],       CReportBase.AlignRight),
            ('5%', [u'№ спр.'],  CReportBase.AlignRight),
            ('25%',[u'ФИО'],     CReportBase.AlignLeft),
            ('25%',[u'Адрес,\nЗанятость'],      CReportBase.AlignLeft),
            ('10%',[u'дата смерти и\nвозраст'], CReportBase.AlignLeft),
            ('15%',[u'предварительный\nи заключительный\nдиагноз'], CReportBase.AlignLeft),
            ('15%',[u'вскрытие,\nрезультат'],  CReportBase.AlignLeft),
            ]

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        table = createTable(cursor, tableColumns)

        n = 0
        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))
        while query.next() :
            n += 1
            i = table.addRow()
            record   = query.record()

            autopsy  = forceBool(record.value('autopsy'))
            table.setText(i, 0, n)
            table.setText(i, 1, forceString(record.value('number')))
            table.setText(i, 2, formatName(record.value('lastName'),
                                           record.value('firstName'),
                                           record.value('patrName')))
            work = ', '.join(filter(None, [forceString(record.value('workName')), forceString(record.value('workPost'))]))
            table.setText(i, 3, forceString(record.value('address'))+'\n'+work)
            birthDate = forceDate(record.value('birthDate'))
            date  = forceDate(record.value('date'))
            age   = calcAge(birthDate, date)
            table.setText(i, 4, u'%s\n%s' % (forceString(date), age))
            table.setText(i, 5, u'%s\n%s' % (forceString(record.value('PMKB')),
                                             forceString(record.value('FMKB'))))
            table.setText(i, 6, u'%s\n%s' % (u'проводилось' if autopsy else u'не проводилось',
                                             forceString(record.value('result'))))
        return doc
Ejemplo n.º 8
0
 def setClientInfo(self, clientId, eventDate):
     db = QtGui.qApp.db
     table  = db.table('Client')
     record = db.getRecord(table, 'lastName, firstName, patrName, sex, birthDate', clientId)
     if record:
         lastName  = record.value('lastName')
         firstName = record.value('firstName')
         partName  = record.value('patrName')
         self.__clientName      = formatName(lastName, firstName, partName)
         self.__clientSex       = forceInt(record.value('sex'))
         self.__clientBirthDate = forceDate(record.value('birthDate'))
         self.__clientAge       = calcAgeTuple(self.__clientBirthDate, eventDate)
         if not self.__clientAge:
             self.__clientAge = (0, 0, 0, 0)
         
         self.setClientWorkHurtCodeList(clientId)
         self.setClientWorkHurtFactorCodeList(clientId)
Ejemplo n.º 9
0
    def processRecord(self, record):
        externalId = forceString(record.value('externalId'))
        lastName = forceString(record.value('lastName'))
        firstName = forceString(record.value('firstName'))
        patrName = forceString(record.value('patrName'))
        eventSetDate = forceDate(record.value('eventSetDate'))
        clientBirthDate = forceDate(record.value('clientBirthDate'))
        age = calcAge(clientBirthDate, eventSetDate)
        eventTypeId = forceInt(record.value('eventType_id'))

        eventEntry = self.data.setdefault(
            externalId,
            smartDict(externalId=externalId,
                      name=formatName(lastName, firstName, patrName),
                      age=age))
        actionId = forceRef(record.value('actionId'))
        actionBegDate = forceDate(record.value('actionBegDate'))
        actionBegTime = forceTime(record.value('actionBegDate'))
        actionEndDate = forceDate(record.value('actionEndDate'))
        actionEndTime = forceTime(record.value('actionEndDate'))
        fromId = forceRef(record.value('FromId'))
        toId = forceRef(record.value('ToId'))
        currId = forceRef(record.value('CurrId'))

        fromName = forceString(record.value('FromName'))
        toName = forceString(record.value('ToName'))
        currName = forceString(record.value('CurrName'))
        actionTypeId = forceRef(record.value('actionTypeId'))
        isMoving = self.actionTypesMap[actionTypeId] == u'moving'
        HBProfile = forceString(record.value('HBProfileName'))
        patronage = forceString(record.value('patronage'))
        actionsEntry = eventEntry.setdefault('actions', {})
        actionsEntry[(actionId, isMoving)] = smartDict(fromName=fromName,
                                                       toName=toName,
                                                       currName=currName,
                                                       fromId=fromId,
                                                       toId=toId,
                                                       currId=currId,
                                                       HBProfile=HBProfile,
                                                       patronage=patronage,
                                                       begDate=actionBegDate,
                                                       begTime=actionBegTime,
                                                       endDate=actionEndDate,
                                                       endTime=actionEndTime,
                                                       eventTypeId=eventTypeId)
Ejemplo n.º 10
0
 def build(self, params):
     orgStructureId = getVal(params, 'orgStructureId', None)
     orgStructureIndex = self.reportVisitByQueueDialog.cmbOrgStructureVisitBeforeRecordClient._model.index(
         self.reportVisitByQueueDialog.
         cmbOrgStructureVisitBeforeRecordClient.currentIndex(), 0,
         self.reportVisitByQueueDialog.
         cmbOrgStructureVisitBeforeRecordClient.rootModelIndex())
     orgStructureIdList = self.getOrgStructureIdList(orgStructureIndex)
     doc = QtGui.QTextDocument()
     cursor = QtGui.QTextCursor(doc)
     cursor.setCharFormat(CReportBase.ReportTitle)
     cursor.insertText(u'Отчет следующая явка не выполнена')
     cursor.insertBlock()
     self.dumpParams(cursor, params)
     cursor.setCharFormat(CReportBase.ReportBody)
     cursor.insertBlock()
     cols = [('5%', [u'№ п/п'], CReportBase.AlignLeft),
             ('19%', [u'Идентификатор пациента'], CReportBase.AlignLeft),
             ('19%', [u'ФИО'], CReportBase.AlignLeft),
             ('19%', [u'Д/р и возраст'], CReportBase.AlignLeft),
             ('19%', [u'Дата явки'], CReportBase.AlignLeft),
             ('19%', [u'Телефон'], CReportBase.AlignLeft)]
     table = createTable(cursor, cols)
     records = getDataVisitByQueueNext(params, orgStructureIdList)
     cnt = 0
     for record in records:
         i = table.addRow()
         cnt += 1
         table.setText(i, 0, cnt)
         table.setText(i, 1, forceRef(record.value('clientId')))
         table.setText(
             i, 2,
             formatName(record.value('lastName'), record.value('firstName'),
                        record.value('patrName')))
         table.setText(
             i, 3,
             forceString(forceDate(record.value('birthDate'))) + u'(' +
             forceString((forceInt(record.value('ageClient')))) + u')')
         table.setText(
             i, 4,
             forceDate(record.value('visitDate')).toString('dd.MM.yyyy'))
         table.setText(i, 5, forceString(record.value('telefone')))
     return doc
Ejemplo n.º 11
0
    def parseQueryInfo(self, query, writtenFromZhos):
        recordList = self.makeNeedfulDicts(query)
        for record in recordList:
            actionNote = forceString(record.value('actionNote'))
            personId = forceInt(record.value('id'))
            fromZhos = forceRef(record.value('zhos'))
            name = None
            if not personId:
                name = self.getincognitoName(actionNote, writtenFromZhos,
                                             fromZhos)
                personId = 0
            if not name:
                name = formatName(record.value('lastName'),
                                  record.value('firstName'),
                                  record.value('patrName'))
            setPersonId = forceRef(record.value('setPerson_id'))
            key = name + '%d' % personId

            afore = self.doctorsDict.get(key, None)
            if afore:
                self.addInfo(record, key)
            else:
                self.doctorsDict[key] = [name] + ([0] * 6)
                self.addInfo(record, key)
Ejemplo n.º 12
0
    def build_R2(self, cursor, query):
        tableColumns = [('35%', [u'Источник информации'],
                         CReportBase.AlignLeft),
                        ('10%', [u'Код пациента'], CReportBase.AlignRight),
                        ('35%', [u'ФИО'], CReportBase.AlignLeft),
                        ('20%', [u'Примечание'], CReportBase.AlignLeft)]
        table = createTable(cursor, tableColumns)
        from library.vm_collections import OrderedDict
        virtTable = OrderedDict()
        #virtTable structure:
        #{ sourceID : {
        #    'sourceName' : sourceName,
        #    'cnt' : cnt,
        #    'clients' : [
        #        {'Id': id, 'FIO': lastName + firstName + patrName},
        #        {}, ...
        #     ]
        # }, sourceID : {}, ... }
        total_cnt = 0
        while query.next():
            record = query.record()
            sourceID = forceRef(record.value('sourceID'))
            sourceName = forceString(record.value('sourceName'))
            Id = forceString(record.value('id'))
            lastName = forceString(record.value('lastName'))
            firstName = forceString(record.value('firstName'))
            patrName = forceString(record.value('patrName'))
            total_cnt += 1
            sourceName = sourceName if sourceID else u'<не указан источник информации>'
            sourceDict = virtTable.setdefault(sourceID, {
                'sourceName': sourceName,
                'cnt': 0,
                'clients': []
            })
            sourceDict.get('clients').append({
                'Id':
                Id,
                'FIO':
                formatName(lastName, firstName, patrName)
            })
            cnt = sourceDict.get('cnt')
            cnt += 1
            sourceDict['cnt'] = cnt

        charFormat = QtGui.QTextCharFormat()
        charFormat.setFontItalic(True)
        for sourceID, sourceDict in virtTable.items():
            i = table.addRow()
            sourceName = sourceDict.get('sourceName')
            clients = sourceDict.get('clients')
            cl = clients.pop(0)
            table.setText(i, 0, sourceName)
            table.setText(i, 1, cl.get('Id'))
            table.setText(i, 2, cl.get('FIO'))
            for cl in clients:
                j = table.addRow()
                table.setText(j, 1, cl.get('Id'))
                table.setText(j, 2, cl.get('FIO'))
            cnt = sourceDict.get('cnt')
            rate = float(cnt) / float(total_cnt) * 100.0
            table.mergeCells(i, 0, cnt, 1)
            i = table.addRow()
            table.setText(i, 0, u'Итого: ' + '%i (%.2f %%)' % (cnt, rate),
                          charFormat)
            table.mergeCells(i, 0, 1, 4)
        i = table.addRow()
        charFormat.setFontWeight(QtGui.QFont.Bold)
        table.setText(i, 0, u'Итоговое итого: ' + str(total_cnt), charFormat)
        table.mergeCells(i, 0, 1, 4)
Ejemplo n.º 13
0
    def build(self, params):
        begDate             = getVal(params, 'begDate', QtCore.QDate())
        endDate             = getVal(params, 'endDate', QtCore.QDate())
        eventTypeId         = getVal(params, 'eventTypeId', None)
        sex                 = params.get('sex', 0)
        ageFrom             = params.get('ageFrom', 0)
        ageTo               = params.get('ageTo', 150)
        actionTypeClass     = params.get('actionTypeClass', None)
        actionTypeId        = params.get('actionTypeId', None)
        onlyPermanentAttach = params.get('onlyPermanentAttach', None)
        MKBFilter           = params.get('MKBFilter', 0)
        MKBFrom             = params.get('MKBFrom', '')
        MKBTo               = params.get('MKBTo', '')
        onlyPayedEvents     = params.get('onlyPayedEvents', False)
        begPayDate          = params.get('begPayDate', QtCore.QDate())
        endPayDate          = params.get('endPayDate', QtCore.QDate())
        detailPerson        = params.get('detailPerson', False)
        personId            = params.get('personId', None)
        specialityId        = params.get('specialityId', None)
        orgStructureId      = params.get('orgStructureId', None)
        insurerId           = params.get('insurerId', None)
        condFinanceId       = params.get('financeId', None)
        condFinanceCode     = params.get('financeCode', '0')

        query = selectData(begDate, endDate, eventTypeId, sex, ageFrom, ageTo, actionTypeClass, actionTypeId, onlyPermanentAttach, MKBFilter, MKBFrom, MKBTo, onlyPayedEvents, begPayDate, endPayDate, detailPerson, personId, specialityId, orgStructureId, insurerId)

        reportData = {}
        mapOrgStructureToFullName = {}
        origActionIdList = []
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            record = query.record()
            actionId               = forceRef(record.value('actionId'))
            if actionId in origActionIdList:
                continue
            origActionIdList.append(actionId)
            orgStructureId         = forceString(record.value('orgStructureId'))
            financeId              = forceRef(record.value('finance_id'))
            actionPayStatus        = forceInt(record.value('actionPayStatus'))
            eventPayStatus         = forceInt(record.value('eventPayStatus'))
            actionTypeCode         = forceString(record.value('actionTypeCode'))
            actionTypeName         = forceString(record.value('actionTypeName'))
            serviceCode            = forceString(record.value('serviceCode'))
            amount                 = forceInt(record.value('actionAmount'))
            uetDoctor              = forceDouble(record.value('uetDoctor'))
            uetAverageMedWorker    = forceDouble(record.value('uetAverageMedWorker'))
            personName             = formatName(record.value('personLastName'),
                                                record.value('personFirstName'),
                                                record.value('personPatrName'))
            specialityName         = forceString(record.value('specialityName'))

            if condFinanceId:
                if financeId:
                    if condFinanceId != financeId:
                        continue
                else:
                    payStatus = actionPayStatus if actionPayStatus else eventPayStatus
                    if not payStatusCheck(payStatus, forceInt(condFinanceCode)):
                        continue

            if specialityName:
                personName = personName + ' | ' + specialityName

            orgStructureName = mapOrgStructureToFullName.get(orgStructureId, None)
            if not orgStructureName:
                orgStructureName = getOrgStructureFullName(orgStructureId)
                mapOrgStructureToFullName[orgStructureId] = orgStructureName

            if not orgStructureName:
                continue

            existsData = reportData.get(orgStructureName, None)

            if detailPerson:
                if not existsData:
                    existsData = {}
                    personData = {}
                    actionAmount = 1
                    personData[(actionTypeName, actionTypeCode, serviceCode)] =  [actionAmount, amount, amount*uetDoctor, uetAverageMedWorker*amount]
                    existsData[personName] = personData
                    reportData[orgStructureName] = existsData
                else:
                    personData = existsData.get(personName, None)
                    if not personData:
                        personData = {}
                        actionAmount = 1
                        personData[(actionTypeName, actionTypeCode, serviceCode)] =  [actionAmount, amount, amount*uetDoctor, uetAverageMedWorker*amount]
                        existsData[personName] = personData
                    else:
                        existsValue = personData.get((actionTypeName, actionTypeCode, serviceCode), None)
                        if not existsValue:
                            actionAmount = 1
                            personData[(actionTypeName, actionTypeCode, serviceCode)] =  [actionAmount, amount, amount*uetDoctor, uetAverageMedWorker*amount]
                            existsData[personName] = personData
                        else:
                            existsValue[0] += 1
                            existsValue[1] += amount
                            existsValue[2] += uetDoctor*amount
                            existsValue[3] += uetAverageMedWorker*amount
                            personData[(actionTypeName, actionTypeCode, serviceCode)] = existsValue
                            existsData[personName] = personData
                    reportData[orgStructureName] = existsData
            else:
                if not existsData:
                    existsData = {}
                    actionAmount = 1
                    existsData[(actionTypeName, actionTypeCode, serviceCode)] =  [actionAmount, amount, amount*uetDoctor, uetAverageMedWorker*amount]
                    reportData[orgStructureName] = existsData
                else:
                    existsValue = existsData.get((actionTypeName, actionTypeCode, serviceCode), None)
                    if not existsValue:
                        actionAmount = 1
                        existsData[(actionTypeName, actionTypeCode, serviceCode)] = [actionAmount, amount, amount*uetDoctor, amount*uetAverageMedWorker]
                    else:
                        existsValue[0] += 1
                        existsValue[1] += amount
                        existsValue[2] += uetDoctor*amount
                        existsValue[3] += uetAverageMedWorker*amount
                        existsData[(actionTypeName, actionTypeCode, serviceCode)] = existsValue
                    reportData[orgStructureName] = existsData

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ( '6%', [u'№ п/п'], CReportBase.AlignRight),
            ( '25%', [u'Наименование типа действия'], CReportBase.AlignLeft),
            ( '13%', [u'Код типа действия'], CReportBase.AlignLeft),
            ( '13%', [u'Код профиля'], CReportBase.AlignLeft),
            ( '10%', [u'Количество действий'], CReportBase.AlignRight),
            ( '10%', [u'Количество'], CReportBase.AlignRight),
            ( '10%', [u'УЕТ врача'], CReportBase.AlignRight),
            ( '13%', [u'УЕТ ср.мед.персонала'], CReportBase.AlignRight)
        ]

        table = createTable(cursor, tableColumns)

        headerCount = 0
        headerList  = []


        if detailPerson:
            orgStructureList = reportData.keys()
            orgStructureList.sort()
            resume = [0, 0, 0, 0]
            for orgStructure in orgStructureList:
                orgStructureResult = [0, 0, 0, 0]
                i = table.addRow()
                currentOrgStructureRow = i
                table.setText(i, 1, orgStructure)
                headerList.append(i)
                headerCount += 1
                persons = reportData.get(orgStructure, {})
                personsKeys = persons.keys()
                personsKeys.sort()
                for personKey in personsKeys:
                    personResult = [0, 0, 0, 0]
                    i = table.addRow()
                    currentPersonRow = i
                    table.setText(i, 1, personKey)
                    headerList.append(i)
                    headerCount += 1
                    existsData = persons.get(personKey, {})
                    existsDataKeys = existsData.keys()
                    existsDataKeys.sort()
                    for existsDataKey in existsDataKeys:
                        i = table.addRow()
                        table.setText(i, 0, i-headerCount)
                        column = 1
                        for key in existsDataKey:
                            table.setText(i, column, key)
                            column += 1
                        values = existsData.get(existsDataKey)
                        for value in values:
                            orgStructureResult[column-4] += value
                            personResult[column-4] += value
                            resume[column-4] += value
                            table.setText(i, column, value)
                            column += 1
                    for column, val in enumerate(personResult):
                        table.setText(currentPersonRow, column+4, val)
                for column, val in enumerate(orgStructureResult):
                    table.setText(currentOrgStructureRow, column+4, val)
            for headerRow in headerList:
                table.mergeCells(headerRow, 0, 1, 3)
        else:
            orgStructureList = reportData.keys()
            orgStructureList.sort()
            resume = [0, 0, 0, 0]
            for orgStructure in orgStructureList:
                orgStructureResult = [0, 0, 0, 0]
                i = table.addRow()
                currentOrgStructureRow = i
                table.setText(i, 1, orgStructure)
                headerList.append(i)
                headerCount += 1
                existsData = reportData.get(orgStructure, {})
                existsDataKeys = existsData.keys()
                existsDataKeys.sort()
                for existsDataKey in existsDataKeys:
                    i = table.addRow()
                    table.setText(i, 0, i-headerCount)
                    column = 1
                    for key in existsDataKey:
                        table.setText(i, column, key)
                        column += 1
                    values = existsData.get(existsDataKey)
                    for value in values:
                        orgStructureResult[column-4] += value
                        resume[column-4] += value
                        table.setText(i, column, value)
                        column += 1
                for column, val in enumerate(orgStructureResult):
                    table.setText(currentOrgStructureRow, column+4, val)
            for headerRow in headerList:
                table.mergeCells(headerRow, 0, 1, 3)
        i = table.addRow()
        table.setText(i, 1, u'Итого')
        for column, val in enumerate(resume):
            table.setText(i, column+4, val)
        return doc
Ejemplo n.º 14
0
    def processClientData(self, client):
        """
            Добавление/изменение данных о пациенте в БД.
        """
        clientId, hasLocalIdentifier = self.isClientExisting(client)
        db = self.db
        updatePersonalData = True
        isNew = not clientId
        if clientId:
            modifyDatetime = QtCore.QDateTime.fromString(
                forceString(
                    db.translate(self.tableClient, 'id', clientId, 'notes')),
                QtCore.Qt.ISODate)
            newModifyDatetime = QtCore.QDateTime.fromString(
                client.ModifyDatetime, QtCore.Qt.ISODate)
            if modifyDatetime >= newModifyDatetime:
                updatePersonalData = False
            else:
                clientRecord = db.getRecordEx(
                    'Client',
                    'lastName, firstName, patrName, birthDate, birthPlace, sex, SNILS, notes',
                    where=[self.tableClient['id'].eq(clientId)])
        else:
            clientRecord = self.tableClient.newRecord()

        db.transaction()
        try:
            if self._updateRegData or not clientId:
                if updatePersonalData:
                    clientRecord.setValue('lastName',
                                          toVariant(client.LastName))
                    clientRecord.setValue('firstName',
                                          toVariant(client.FirstName))
                    clientRecord.setValue('patrName',
                                          toVariant(client.PatrName))
                    clientRecord.setValue('birthDate',
                                          toVariant(client.BirthDate))
                    clientRecord.setValue('birthPlace',
                                          toVariant(client.BirthPlace))
                    clientRecord.setValue('sex', toVariant(client.Sex))
                    clientRecord.setValue('SNILS', toVariant(client.SNILS))
                    clientRecord.setValue('notes',
                                          toVariant(client.ModifyDatetime))
                    clientId = db.insertOrUpdate(self.tableClient,
                                                 clientRecord)
                    if not hasLocalIdentifier:
                        tableClientIdentification = db.table(
                            'ClientIdentification')
                        clientIdentificationRecord = tableClientIdentification.newRecord(
                        )
                        accSystemId = db.translate(
                            'rbAccountingSystem', 'code', '67VM',
                            'id')  #FIXME: вынести в атрибуты класса
                        clientIdentificationRecord.setValue(
                            'client_id', toVariant(clientId))
                        clientIdentificationRecord.setValue(
                            'accountingSystem_id', accSystemId)
                        clientIdentificationRecord.setValue(
                            'identifier',
                            toVariant('.'.join([
                                self.exporterOrgCode,
                                forceString(client.ClientId)
                            ])))
                        db.insertRecord(tableClientIdentification,
                                        clientIdentificationRecord)

                    self.processPolicy(isNew, clientId, client.Policy)
                    self.processDocument(isNew, clientId, client.Document)

                    self.processAddress(isNew, clientId, 0, client.RegAddress)
                    self.processAddress(isNew, clientId, 1, client.LocAddress)

                    # self.currentClientData.isUpdated = True
                else:
                    self.err2log(
                        CErrorLevel.info,
                        u'В базе содержатся актуальные персональные данные пациента %s, пропускаем.'
                        % formatName(client.LastName, client.FirstName,
                                     client.PatrName),
                    )

            if not self._updateRegData:
                for event in client.Event:
                    db.transaction()
                    try:
                        self.processEvent(isNew, clientId, event)
                        self.processedEvents.append(event.ExternalId)
                        db.commit()
                    except library.exception.CDatabaseException as e:
                        db.rollback()
                        self.err2log(CErrorLevel.error,
                                     'Database error: %s' % e, 'Event',
                                     event.ExternalId)
                    except Exception as e:
                        db.rollback()
                        self.err2log(
                            CErrorLevel.error,
                            'Unexpected error: %s at line %s' %
                            (e, sys.exc_info()[2].tb_lineno), 'Event',
                            event.ExternalId)
            db.commit()
        except library.exception.CDatabaseException as e:
            db.rollback()
            self.err2log(CErrorLevel.error, 'Database error: %s' % e, 'Client',
                         client.ClientId)
            raise e
        except Exception as e:
            db.rollback()
            self.err2log(
                CErrorLevel.error, 'Unexpected error: %s at line %s' %
                (e, sys.exc_info()[2].tb_lineno))
            raise e
Ejemplo n.º 15
0
    def build(self, params):
        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))
        groupByClients = params.get('groupByClients', None)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
                        ('?2', [u'№ п/п'], CReportBase.AlignRight),
                        ('?5', [u'Ф.И.О. пациента'], CReportBase.AlignCenter),
                        ('?5', [u'Номер услуги'], CReportBase.AlignCenter),
                        ('%5', [u'Название услуги'], CReportBase.AlignLeft),
                        ('%5', [u'Дата выполнения услуги'], CReportBase.AlignCenter),
                        ('%5', [u'Дата оплаты услуги'], CReportBase.AlignCenter),
                        ('%5', [u'Исполнитель услуги'], CReportBase.AlignLeft),
                        ]

        table = createTable(cursor, tableColumns)

        boldChars = QtGui.QTextCharFormat()
        boldChars.setFontWeight(QtGui.QFont.Bold)
        
        prevClientId = None
        rowIndex = 1
        clientRepetitionNumber = 1
        while query.next():
            record = query.record()
            
            i = table.addRow()

            clientId = forceRef(record.value('clientId'))
            clientName = formatName(
                                    record.value('clientLastName'),
                                    record.value('clientFirstName'),
                                    record.value('clientPatrName')
                                   )
            actionName = forceString(record.value('actionName'))
            execDate = forceDate(record.value('actionEndDate')).toString('dd.MM.yyyy')
            payDate = forceDate(record.value('actionPayDate')).toString('dd.MM.yyyy')
            isRefused = forceBool(record.value('isRefused'))
            payConfirmationNumber = forceString(record.value('payConfirmationNumber'))
            personName = formatName(
                                    record.value('personLastName'),
                                    record.value('personFirstName'),
                                    record.value('personPatrName')
                                   )
            payDateText = payDate if (payDate and not isRefused and payConfirmationNumber) \
                                    else (u'Отказано' if payDate and isRefused else u'Выставлено')
            
            if not groupByClients or clientId != prevClientId :
                table.setText(i, 0, rowIndex)
                table.setText(i, 1, u'%s; %s' % (clientName, clientId), charFormat = CReportBase.TableBody)
                rowIndex += 1
                if clientRepetitionNumber > 1:
                    clientRepetitionNumber -= 1
                    table.mergeCells(i - clientRepetitionNumber, 0, clientRepetitionNumber, 1)
                    table.mergeCells(i - clientRepetitionNumber, 1, clientRepetitionNumber, 1)
                clientRepetitionNumber = 1
            table.setText(i, 2, i, charFormat = CReportBase.TableBody)
            table.setText(i, 3, actionName, charFormat = CReportBase.TableBody)
            table.setText(i, 4, execDate, charFormat = CReportBase.TableBody)
            table.setText(i, 5, payDateText, charFormat = CReportBase.TableBody)
            table.setText(i, 6, personName, charFormat = CReportBase.TableBody)            
            prevClientId = clientId
            clientRepetitionNumber += 1
        return doc
Ejemplo n.º 16
0
    def build(self, params):
        db = QtGui.qApp.db
        accountId = params.get('accountId', None)
        accountName = getAccountName(accountId)
        query = selectData(params)

        isLocRegistry = params.get('isLocRegistry', True)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        format = QtGui.QTextCharFormat()

        cursor.insertBlock(CReportBase.AlignCenter)
        format.setFontPointSize(14)
        if isLocRegistry:
            cursor.insertText(u'РЕЕСТР СЧЕТОВ', format)
        else:
            cursor.insertText(u'РЕЕСТР СЧЕТА № %s' % accountName, format)

        cursor.insertBlock(CReportBase.AlignCenter)
        format.setFontPointSize(10)
        currentOrgInfo = getOrganisationInfo(QtGui.qApp.currentOrgId())
        cursor.insertText(u'%(fullName)s; ОГРН: %(OGRN)s' % currentOrgInfo,
                          format)

        cursor.insertBlock(CReportBase.AlignCenter)
        dateInterval = {
            'begDate': forceString(params.get('begDate', QtCore.QDate())),
            'endDate': forceString(params.get('endDate', QtCore.QDate()))
        }
        cursor.insertText(
            u'за период с %(begDate)s по %(endDate)s' % dateInterval, format)

        cursor.insertBlock(CReportBase.AlignCenter)
        if isLocRegistry:
            orgInsurerId = params.get('orgInsurerId', None)
            if orgInsurerId:
                insurerOrgInfo = getOrganisationInfo(orgInsurerId)
            else:
                insurerOrgInfo = {
                    'fullName': '______________________________________'
                }
            cursor.insertText(
                u'на оплату медицинской помощи, оказанной застрахованным лицам, в %(fullName)s'
                % insurerOrgInfo, format)
            format.setFontPointSize(7)
        else:
            cursor.insertText(
                u'на оплату медицинской помощи, оказанной застрахованным лицам за пределами субъекта Российской Федерации, на территории которого выдан полис обязательного медицинского страхования',
                format)
            format.setFontPointSize(8)

        cursor.insertBlock()
        cursor.insertBlock()

        tableColumns = []
        tableColumns.append(('10?', [u'№ позиции реестра',
                                     str(1)], CReportBase.AlignCenter))
        tableColumns.append(
            ('26?', [u'Фамилия,\nимя,\nотчество\n(при\nналичии)',
                     str(2)], CReportBase.AlignCenter))
        tableColumns.append(('6?', [u'Пол', str(3)], CReportBase.AlignCenter))
        tableColumns.append(('7?', [u'Дата\nрождения',
                                    str(4)], CReportBase.AlignCenter))
        tableColumns.append(('7?', [u'Место\nрождения',
                                    str(5)], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Данные\nдоку-\nмента,\nудосто-\nверяю-\nщего\nличность',
            str(6)
        ], CReportBase.AlignCenter))
        colOffset = 0
        if isLocRegistry:
            tableColumns.append(('7?', [u'Место\nжитель-\nства',
                                        str(7)], CReportBase.AlignCenter))
            tableColumns.append(('7?', [u'Место\nрегист-\nрации',
                                        str(8)], CReportBase.AlignCenter))
            colOffset = 2
        tableColumns.append(
            ('7?', [u'СНИЛС\n(при\nналичии)',
                    str(7 + colOffset)], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'№ полиса\nобяза-\nтельного\nмеди-\nцинского\nстрахо-\nвания',
            str(8 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Вид\nоказан-\nной\nмедицин-\nской\nпомощи\n(код)',
            str(9 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(
            ('7?',
             [u'Диагноз\nв соот-\nветствии\nс МКБ-10',
              str(10 + colOffset)], CReportBase.AlignCenter))
        if isLocRegistry:
            tableColumns.append(('7?', [
                u'Дата\nначала\nи дата\nокон-\nчания\nлечения',
                str(11 + colOffset)
            ], CReportBase.AlignCenter))
            colOffset -= 1
        else:
            tableColumns.append(
                ('7?', [u'Дата\nначала\nлечения',
                        str(11 + colOffset)], CReportBase.AlignCenter))
            tableColumns.append(
                ('7?', [u'Дата\nоконча-\nния\nлечения',
                        str(12 + colOffset)], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Объемы\nоказанной\nмедицин-\nской\nпомощи',
            str(13 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Профиль\nоказанной\nмедицин-\nской\nпомощи\n(код)',
            str(14 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Специ-\nальность\nмедицин-\nского\nработника,\nоказав-\nшего\nмедицин-\nскую\nпомощь\n(код)',
            str(15 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Тариф\nна оплату\nмедицин-\nской\nпомощи,\nоказанной\nзастрахо-\nванному\nлицу',
            str(16 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Стоимость\nоказанной\nмедицин-\nской\nпомощи',
            str(17 + colOffset)
        ], CReportBase.AlignCenter))
        tableColumns.append(('7?', [
            u'Результат\nобращения\nза меди-\nцинской\nпомощью\n(код)',
            str(18 + colOffset)
        ], CReportBase.AlignCenter))

        table = createTable(cursor, tableColumns, charFormat=format)
        count = 0
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            record = query.record()
            row = table.addRow()
            count += 1
            sum = forceDouble(record.value('sum'))
            federalSum = forceDouble(record.value('federalSum'))
            price = forceDouble(record.value('price'))
            federalPrice = forceDouble(record.value('federalPrice'))
            table.setText(row, 0, forceString(count), charFormat=format)
            table.setText(row,
                          1,
                          formatName(record.value('lastName'),
                                     record.value('firstName'),
                                     record.value('patrName')),
                          charFormat=format)
            table.setText(row,
                          2,
                          formatSex(record.value('sex')).upper(),
                          charFormat=format)
            table.setText(row,
                          3,
                          forceString(record.value('birthDate')),
                          charFormat=format)
            table.setText(row,
                          4,
                          forceString(record.value('birthPlace')),
                          charFormat=format)
            table.setText(row,
                          5,
                          forceString(record.value('document')),
                          charFormat=format)
            colOffset = 0
            if isLocRegistry:
                table.setText(row,
                              6,
                              forceString(record.value('residentAddress')),
                              charFormat=format)
                table.setText(row,
                              7,
                              forceString(record.value('registerAddress')),
                              charFormat=format)
                colOffset = 2
            table.setText(row,
                          6 + colOffset,
                          forceString(record.value('SNILS')),
                          charFormat=format)
            table.setText(row,
                          7 + colOffset,
                          forceString(record.value('policy')),
                          charFormat=format)
            table.setText(row,
                          8 + colOffset,
                          forceString(record.value('medicalKindCode')),
                          charFormat=format)
            table.setText(row,
                          9 + colOffset,
                          forceString(record.value('MKB')),
                          charFormat=format)
            if isLocRegistry:
                date = '%s - %s' % (forceString(record.value('begDate')),
                                    forceString(record.value('endDate')))
                table.setText(row, 10 + colOffset, date, charFormat=format)
                colOffset -= 1
            else:
                table.setText(row,
                              10 + colOffset,
                              forceString(record.value('begDate')),
                              charFormat=format)
                table.setText(row,
                              11 + colOffset,
                              forceString(record.value('endDate')),
                              charFormat=format)
            table.setText(row,
                          12 + colOffset,
                          forceString(record.value('amount')),
                          charFormat=format)
            table.setText(row,
                          13 + colOffset,
                          forceString(record.value('medicalProfile')),
                          charFormat=format)
            table.setText(row,
                          14 + colOffset,
                          forceString(record.value('specialityCode')),
                          charFormat=format)
            table.setText(row,
                          15 + colOffset,
                          QtCore.QString.number(price - federalPrice, 'g', 9),
                          charFormat=format)
            table.setText(row,
                          16 + colOffset,
                          QtCore.QString.number(sum - federalSum, 'g', 9),
                          charFormat=format)
            table.setText(row,
                          17 + colOffset,
                          forceString(record.value('resultCode')),
                          charFormat=format)

        cursor.movePosition(cursor.End)
        cursor.insertBlock(CReportBase.AlignLeft)
        titles = []
        names = []
        orgMainStaff = getOrganisationMainStaff(QtGui.qApp.currentOrgId())
        colCount = 1
        sealOverTitle = 1
        if not isLocRegistry:
            titles = [u'Руководитель медицинской\nорганизации']
            names = [orgMainStaff[0]]
            colCount = 2
            sealOverTitle = 2
        titles.append(u'Главный бухгалтер')
        names.append(orgMainStaff[1])
        titles.append(u'Исполнитель')
        names.append(None)
        cursor.movePosition(cursor.End)

        cursor.insertBlock(CReportBase.AlignLeft)
        createAutographField(cursor,
                             titles,
                             names,
                             sealOverTitle=sealOverTitle,
                             colCount=colCount,
                             signLabel=u'(подпись)',
                             transcriptLabel=u'(расшифровка подписи)',
                             charFormat=format)

        cursor.movePosition(cursor.End)

        cursor.insertBlock(CReportBase.AlignLeft)
        cursor.insertText(u'Дата  ______________________', format)
        return doc
Ejemplo n.º 17
0
    def build(self, params):
        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        byPeriod = params.get('byPeriod', False)
        doctype = params.get('doctype', 0)
        tempInvalidReason = params.get('tempInvalidReason', None)
        onlyClosed = params.get('onlyClosed', True)
        orgStructureId = params.get('orgStructureId', None)
        personId = params.get('personId', None)
        durationFrom = params.get('durationFrom', 0)
        durationTo = params.get('durationTo', 0)
        sex = params.get('sex', 0)
        ageFrom = params.get('ageFrom', 0)
        ageTo = params.get('ageTo', 150)
        socStatusClassId = params.get('socStatusClassId', None)
        socStatusTypeId = params.get('socStatusTypeId', None)
        MKBFilter = params.get('MKBFilter', 0)
        MKBFrom = params.get('MKBFrom', '')
        MKBTo = params.get('MKBTo', '')
        insuranceOfficeMark = params.get('insuranceOfficeMark', 0)

        db = QtGui.qApp.db
        tbl = db.table('TempInvalid')
        tblDiag = db.table('Diagnosis')
        tblReas = db.table('rbTempInvalidReason')

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.name)
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('5%', [u'№'], CReportBase.AlignRight),
            ('5%', [u'код'], CReportBase.AlignLeft),
            ('20%', [u'ФИО,\nдата рождения (возраст),\nпол'], CReportBase.AlignLeft),
            ('25%', [u'Адрес,\nтелефон'], CReportBase.AlignLeft),
            ('10%', [u'Паспортные данные,\nсерия - номер'], CReportBase.AlignLeft),
            ('10%', [u'СНИЛС,\nполис'], CReportBase.AlignLeft),
            ('5%', [u'Шифр МКБ\nТип'], CReportBase.AlignLeft),
            ('5%', [u'Период'], CReportBase.AlignLeft),
            ('5%', [u'Дней'], CReportBase.AlignRight),
            ('5%', [u'Серия\nНомер'], CReportBase.AlignLeft),
            ('5%', [u'Место работы'], CReportBase.AlignLeft),
        ]

        table = createTable(cursor, tableColumns)
        n = 0
        query = selectData(
            begDate, endDate, byPeriod, doctype, tempInvalidReason, onlyClosed, orgStructureId, personId,
            durationFrom, durationTo, sex, ageFrom, ageTo, socStatusClassId, socStatusTypeId, MKBFilter, MKBFrom,
            MKBTo, insuranceOfficeMark
        )
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            n += 1
            sumDuration = 0
            record = query.record()
            clientId = forceRef(record.value('client_id'))
            serial = forceString(record.value('serial'))
            number = forceString(record.value('number'))
            caseBegDate = forceDate(record.value('caseBegDate'))
            #            begDate = forceDate(record.value('begDate'))
            endDate = forceDate(record.value('endDate'))
            duration = forceInt(record.value('duration'))
            MKB = forceString(record.value('MKB'))
            work = forceString(record.value('work'))
            document = forceString(record.value('doc'))
            reasonCode = forceString(record.value('code'))
            prev_id = forceInt(record.value('prev_id'))

            info = getClientInfo(clientId)
            name = formatName(info['lastName'], info['firstName'], info['patrName'])
            nameBDateAndSex = '\n'.join([
                name, '%s (%s)' % (formatDate(info['birthDate']), calcAge(info['birthDate'], begDate)),
                formatSex(info['sexCode'])
            ])
            regAddress = getVal(info, 'regAddress', u'не указан')
            locAddress = getVal(info, 'locAddress', u'не указан')
            phones = getClientPhonesEx(clientId)
            addressAndPhone = regAddress if regAddress else ''
            addressAndPhone += '\n' + locAddress if locAddress else ''
            addressAndPhone += '\n' + phones if phones else ''
            SNILSAndPolicy = '\n'.join([formatSNILS(info['SNILS']), getVal(info, 'policy', u'нет')])
            MKBandType = '\n'.join([MKB, reasonCode])
            period = '\n'.join([forceString(caseBegDate), forceString(endDate)])
            serialAndNumber = '\n'.join([serial, number])

            i = table.addRow()
            table.setText(i, 0, n)
            table.setText(i, 1, clientId)
            table.setText(i, 2, nameBDateAndSex)
            table.setText(i, 3, addressAndPhone)
            table.setText(i, 4, document)
            table.setText(i, 5, SNILSAndPolicy)
            table.setText(i, 6, MKBandType)
            table.setText(i, 7, period)
            table.setText(i, 8, duration)
            table.setText(i, 9, serialAndNumber)
            table.setText(i, 10, work)

            if prev_id and onlyClosed:
                sumDuration += duration
                extraRows = 0
                while prev_id:
                    prev_record = db.getRecordEx(
                        tbl,
                        [
                            tbl['begDate'], tbl['endDate'], tbl['duration'], tbl['serial'], tbl['number'],
                            tbl['prev_id'], tbl['diagnosis_id'], tbl['tempInvalidReason_id']
                        ],
                        [tbl['id'].eq(prev_id), tbl['deleted'].eq(0)]
                    )
                    if prev_record:
                        i = table.addRow()
                        extraRows += 1
                        begDate = forceDate(prev_record.value('begDate'))
                        endDate = forceDate(prev_record.value('endDate'))
                        duration = forceInt(prev_record.value('duration'))
                        serial = forceString(prev_record.value('serial'))
                        number = forceString(prev_record.value('number'))
                        prev_id = forceInt(prev_record.value('prev_id'))
                        diagnosis_id = forceInt(prev_record.value('diagnosis_id'))
                        reason_id = forceInt(prev_record.value('tempInvalidReason_id'))
                        MKB = forceString(db.translate(tblDiag, tblDiag['id'], diagnosis_id, tblDiag['MKB']))
                        reason = forceString(db.translate(tblReas, tblReas['id'], reason_id, tblReas['code']))
                        period = '\n'.join([forceString(begDate), forceString(endDate)])
                        serialAndNumber = '\n'.join([serial, number])
                        table.setText(i, 6, MKB + '\n' + reason)
                        table.setText(i, 7, period)
                        table.setText(i, 8, duration)
                        table.setText(i, 9, serialAndNumber)
                        sumDuration += duration
                i = table.addRow()
                extraRows += 1
                table.setText(i, 7, u'')
                table.setText(i, 8, u'Всего дней: ' + unicode(sumDuration))
                table.mergeCells(i - extraRows, 0, extraRows + 1, 1)
                table.mergeCells(i - extraRows, 1, extraRows + 1, 1)
                table.mergeCells(i - extraRows, 2, extraRows + 1, 1)
                table.mergeCells(i - extraRows, 3, extraRows + 1, 1)
                table.mergeCells(i - extraRows, 4, extraRows + 1, 1)
                table.mergeCells(i - extraRows, 5, extraRows + 1, 1)
                table.mergeCells(i, 6, 1, 2)

        return doc
Ejemplo n.º 18
0
    def build(self, params):
        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)

        org_id = QtGui.qApp.currentOrgId()
        org_info = getOrganisationInfo(org_id)

        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(org_info.get('fullName'))
        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(self.title())

        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('4%',
             [u'№ по журналу, Отделение, № телефонограммы, № истории болезни'
              ], CReportBase.AlignCenter),
            ('6%', [u'Дата поступления,\nВремя'], CReportBase.AlignCenter),
            ('13%', [u'Кем направлен\nКем доставлен'],
             CReportBase.AlignCenter),
            ('13%', [u'Диагноз приемного отделения / тяж.сост.'],
             CReportBase.AlignCenter),
            ('10%', [u'Фамилия Имя Отчество'], CReportBase.AlignCenter),
            ('5%', [u'Возраст, Дата рождения'], CReportBase.AlignCenter),
            ('15%', [u'Домашний адрес; Место работы, должность'],
             CReportBase.AlignCenter),
            ('10%', [u'Телефонограмма'], CReportBase.AlignCenter),
            ('7%', [u'ФИО врача'], CReportBase.AlignCenter),
            ('7%', [u'Кто передал, Куда передавал'], CReportBase.AlignCenter),
            ('10%', [u'Кто принял; Дата, время передачи'],
             CReportBase.AlignCenter)
        ]
        table = createTable(cursor, tableColumns)
        total = 0
        while query.next():
            record = query.record()

            counterValue = forceString(record.value('counterValue'))
            externalId = forceString(record.value('externalId'))
            date_received = forceString(record.value('date_received'))
            date_give = forceString(record.value('date_give'))

            cl_lastName = record.value('cl_lastName')
            cl_firstName = record.value('cl_firstName')
            cl_patrName = record.value('cl_patrName')
            cl_birthDate = record.value('cl_birthDate')

            person_giver = forceString(record.value('person_giver'))
            person_doctor = forceString(record.value('person_doctor'))
            org_structure = forceString(record.value('org_structure'))
            organisation = forceString(record.value('organisation'))
            courier = forceString(record.value('courier'))
            diagnosis = forceString(record.value('diagnosis'))
            state = forceString(record.value('state'))
            client_address = forceString(record.value('client_address'))
            client_work = forceString(record.value('client_work'))
            n_tele = forceString(record.value('n_tele'))
            militia = forceString(record.value('militia'))
            who_took = forceString(record.value('who_took'))
            telefonogramma = forceString(record.value('telefonogramma'))
            view_telefono = forceString(record.value('view_telefono'))

            i = table.addRow()

            table.setText(
                i, 0, u'Жур.№%s\nОтд: %s\n№%s\nиб: %s' %
                (counterValue, org_structure, n_tele, externalId))
            table.setText(i, 1, '%s' % date_received)
            table.setText(i, 2, '%s\n%s' % (organisation, courier))
            table.setText(i, 3, '%s\n/%s' % (diagnosis, state))
            table.setText(i, 4,
                          formatName(cl_lastName, cl_firstName, cl_patrName))
            table.setText(
                i, 5,
                '%s\n%s' % (calcAge(cl_birthDate), forceString(cl_birthDate)))
            table.setText(i, 6, '%s\n%s' % (client_address, client_work))
            table.setText(i, 7, '%s\n(%s)' % (telefonogramma, view_telefono))
            table.setText(i, 8, '%s' % person_doctor)
            table.setText(i, 9, '%s\n%s' % (person_giver, militia))
            table.setText(i, 10, '%s\n%s' % (who_took, date_give))
            total += 1
        i = table.addRow()
        table.setText(i, 0, u'Итого: %d' % total, CReport.TableTotal,
                      CReport.AlignLeft)
        table.mergeCells(i, 0, 1, 11)
        return doc
    def makeStruct(self, query):
        #        print query.size()
        while query.next():
            record = query.record()

            clientId = forceRef(record.value('clientId'))
            fio = formatName(record.value('lastName'),
                             record.value('firstName'),
                             record.value('patrName'))
            eventId = forceRef(record.value('eventId'))
            clientAddress = forceString(record.value('clientAddress'))
            KLADRCode = forceString(record.value('KLADRCode'))
            mkb = forceString(record.value('MKB'))
            financeType = forceString(record.value('financeType'))
            orgStructureId = forceRef(record.value('orgStructureId'))
            medicalHistory = forceString(record.value('medicalHistory'))
            ambCard = forceString(record.value('ambCard'))
            medicalAidTypeCode = forceString(
                record.value('medicalAidTypeCode'))
            eventSetDate = forceDate(record.value('eventSetDate'))
            eventExecDate = forceDate(record.value('eventExecDate'))
            quotaTypeCode = forceString(record.value('quotaTypeCode'))
            needDateForReport = forceString(record.value('needDateForReport'))

            if eventExecDate.isValid():
                if eventExecDate > QtCore.QDate.currentDate():
                    topDate = QtCore.QDate.currentDate()
                else:
                    topDate = eventExecDate
            else:
                topDate = QtCore.QDate.currentDate()

            dCount = eventSetDate.daysTo(topDate)
            if medicalAidTypeCode in ['1', '2', '3']:
                if dCount == 0:
                    dCount = 1
            else:
                dCount += 1

            if (clientId, eventId) in self._existEventClients:
                continue
            self._existEventClients.append((clientId, eventId))
            fullOrgStructureName = self._orgStructureIdToFullName.get(
                orgStructureId, None)
            if not fullOrgStructureName:
                if not orgStructureId:
                    fullOrgStructureName = u'Подразделение не определено'
                else:
                    fullOrgStructureName = getOrgStructureFullName(
                        orgStructureId)
                self._orgStructureIdToFullName[
                    orgStructureId] = fullOrgStructureName
            key = (orgStructureId, fullOrgStructureName)
            orgStructureValueList = self._mapOrgStructureToClientValues.setdefault(
                key, [])
            orgStructureValue = [
                clientId, ambCard, fio, medicalHistory,
                KLADRCode + ', ' + clientAddress, mkb, quotaTypeCode,
                financeType, needDateForReport, dCount
            ]
            orgStructureValueList.append(orgStructureValue)
Ejemplo n.º 20
0
    def build(self, eventId, clientId):
        db = QtGui.qApp.db
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.insertBlock()
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.setBlockFormat(CReportBase.AlignCenter)
        cursor.insertText(u'Справка\n')
        cursor.setCharFormat(CReportBase.ReportSubTitle)
        cursor.insertText(
            u'о стоимости медицинской помощи, оказанной застрахованному лицу в рамках программ обязательного медицинского страхования\n'
        )
        cursor.insertHtml(u'<hl/><hr/>')
        f = CReportBase.ReportBody
        f.setFontItalic(True)
        cursor.insertBlock()
        cursor.insertText(
            forceString(
                db.translate('Organisation', 'id', QtGui.qApp.currentOrgId(),
                             'shortName')))
        cursor.insertBlock()
        cursor.setCharFormat(f)
        cursor.insertText(
            u'\n(штамп с наименованием и адресом учреждения выдавшего справку)\n'
        )

        cursor.insertBlock()
        cursor.setBlockFormat(CReportBase.AlignRight)
        fb = CReportBase.ReportBody
        fb.setFontWeight(QtGui.QFont.Bold)
        cursor.setCharFormat(fb)
        cursor.insertText(u'от %s\n' %
                          QtCore.QDate.currentDate().toString('dd.MM.yyyy'))

        cursor.insertBlock()
        cursor.setBlockFormat(CReportBase.AlignLeft)
        cursor.setCharFormat(CReportBase.ReportBody)
        cursor.insertText(u'(Ф.И.О.) ')
        # fu = CReportBase.ReportBody
        # fu.setFontUnderline(True)
        # cursor.setCharFormat(fu)
        clientRecord = db.getRecord('Client',
                                    ['lastName', 'firstName', 'patrName'],
                                    clientId)
        cursor.insertText(u'%s\n' % formatName(clientRecord.value('lastName'),
                                               clientRecord.value('firstName'),
                                               clientRecord.value('patrName')))
        eventRecord = db.getRecord('Event', ['setDate', 'execDate'], eventId)
        cursor.insertText(
            u'в период с %sг. по %sг.\n' %
            (forceDate(eventRecord.value('setDate')).toString('dd.MM.yyyy'),
             forceDate(eventRecord.value('execDate')).toString('dd.MM.yyyy')))

        cursor.insertText(u'оказаны медицинские услуги:\n')

        columns = [('80%', [u'наименование медицинской услуги'],
                    CReportBase.AlignLeft),
                   ('20%', [u'стоимость (руб.)'], CReportBase.AlignRight)]

        table = createTable(cursor, columns)
        self.fillTable(table, eventId)
        cursor.movePosition(QtGui.QTextCursor.End)

        cursor.insertText(
            u'\n\nВнимание! Настоящая справка носит уведомительный характер, оплате за счет личных средств не '
            u'подлежит. При несоответствии фактически оказанных услуг приведенным в настоящей справке '
            u'необходимо обратиться в свою страховую медицинскую организацию или в территориальный фонд '
            u'обязательного медицинского страхования.')

        return doc
Ejemplo n.º 21
0
        def processQuery(query,
                         isByDoctorReport=True,
                         groupBy=CFinanceSummarySetupDialog.groupBySpeciality):
            self.addQueryText(forceString(query.lastQuery()))
            i = 0
            while query.next():
                record = query.record()
                groupByName = forceString(
                    record.value('specialityName')
                ) if groupBy == CFinanceSummarySetupDialog.groupBySpeciality else forceString(
                    record.value('orgStructureName'))
                lastName = forceString(
                    record.value('lastName')
                ) if isByDoctorReport and not groupAssistant else forceString(
                    record.value('assistantLastName'))
                firstName = forceString(
                    record.value('firstName')
                ) if isByDoctorReport and not groupAssistant else forceString(
                    record.value('assistantFirstName'))
                patrName = forceString(
                    record.value('patrName')
                ) if isByDoctorReport and not groupAssistant else forceString(
                    record.value('assistantPatrName'))
                doctorCode = forceString(
                    record.value('code')
                ) if isByDoctorReport and not groupAssistant else forceString(
                    record.value('assistantCode'))
                clientName = forceString(record.value('clientName'))
                serviceId = forceRef(record.value('serviceId'))
                serviceName = forceString(record.value('serviceName'))
                serviceCode = forceString(record.value('serviceCode'))
                sumDivider = forceInt(record.value('sumDivider'))

                amount = forceDouble(record.value('amount')) / sumDivider
                if amount == int(amount):
                    amount = int(amount)
                sum = forceDouble(record.value('sum')) / sumDivider
                isWithoutModernisation = params.get('withoutModernisation',
                                                    False)
                if isWithoutModernisation:
                    federalSum = forceDouble(
                        record.value('federalSum')) / sumDivider
                    sum = sum - federalSum
                uet = forceDouble(record.value('uet')) / sumDivider
                exposed = forceBool(record.value('exposed'))
                refused = forceBool(record.value('refused'))

                doctorGroup = groupByName if groupByName else (
                    u'Без указания %s' %
                    (u'специальности' if groupBy == CFinanceSummarySetupDialog.
                     groupBySpeciality else u'отделения'))
                name = formatName(lastName, firstName, patrName)
                doctorName = name if name else u'Без указания врача/ассистента'
                serviceType = forceInt(record.value(
                    'serviceType')) if detailServiceTypes else None
                serviceKey = (serviceId, serviceCode, serviceName
                              if serviceId else u'Услуга не указана', i)
                # if detailService else None
                reportLine = reportData.setdefault(doctorGroup, {}).setdefault(
                    (doctorName, doctorCode),
                    {}).setdefault(clientName,
                                   {}).setdefault(serviceType, {}).setdefault(
                                       serviceKey, [0] * reportRowSize)

                reportLine[0] += amount
                reportLine[1] += uet
                reportLine[2] += sum
                if exposed:
                    reportLine[3] += amount
                    reportLine[4] += uet
                    reportLine[5] += sum
                if refused:
                    reportLine[6] += amount
                    reportLine[7] += uet
                    reportLine[8] += sum

                i += 1
Ejemplo n.º 22
0
    def build(self, params):
        curDate = params.get('curDate', QtCore.QDate.currentDate())
        begDateTime = QtCore.QDateTime(curDate.addDays(-1), self.YesterdayBeginTime)
        endDateTime = QtCore.QDateTime(curDate, self.TodayBeginTime)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.movePosition(QtGui.QTextCursor.End)

        cursor.insertBlock()
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        cursor.setCharFormat(QtGui.QTextCharFormat())
        headerTable, mainTable = self.createTable(params, cursor)

        receptionRVC_Id = 119 # Приемное отделение РСЦ
        RVC_Id = 34           # Региональный сосудистый центр
        RVCDescendants = getOrgStructureDescendants(RVC_Id)
        EVDT_Id = 92          # Отделение рентгенэндоваскулярной диагностики и лечения

        orgStructuresRVC = [
            # (id, наименование, номер строки в таблице)
            (27, u'ОАР для больных с ОНМК', 2),
            (28, u'ОАР для больных с ОИМ', 3),
            (36, u'1-е неврологическое отделение', 4),
            (39, u'Отделение сосудистой хирургии', 5),
            (37, u'2-е кардиологическое отделение', 6),
            (38, u'2-е нейрохирургическое отделение (сосудистое)', 7),
            (118, u'Кардиологическое отделение для больных с ОИМ (ОНК)', 8)
        ]
        TherapeuticOS3 = (106, u'3-е терапевтическое отделение', 10)

        orgStructureIdsRVC = [id for id, name, row in orgStructuresRVC]
        # orgStructureIdList = [org[0] for org in orgStructuresRVC + [TherapeuticOS3]]

        query = selectData(begDateTime, endDateTime)
        self.setQueryText(forceString(query.lastQuery()))

        hospitalizationInfo = {}
        reportRows = {}
        orgStructureEvents = {}
        orgStructureCode = {}

        while query.next():
            record = query.record()
            id = forceRef(record.value('osId'))
            code = forceString(record.value('osCode'))
            # totalBeds = forceInt(record.value('totalBeds'))
            permanentBeds = forceInt(record.value('permanentBeds'))
            # involuteBed = forceInt(record.value('involuteBed'))
            menBed = forceInt(record.value('menBed'))
            womenBed = forceInt(record.value('womenBed'))
            men = forceInt(record.value('men'))
            women = forceInt(record.value('women'))
            received = forceInt(record.value('received'))
            byHimself = forceInt(record.value('byHimself'))
            refused = forceInt(record.value('refused'))
            moving = forceInt(record.value('moving'))
            movingInto = forceInt(record.value('movingInto'))
            movingFrom = forceInt(record.value('movingFrom'))
            leaved = forceInt(record.value('leaved'))
            dead = forceInt(record.value('dead'))
            eventsDMS = forceString(record.value('eventsDMS'))
            eventsPMU = forceString(record.value('eventsPMU'))
            eventsDeath = forceString(record.value('eventsDeath'))

            orgStructureCode[id] = code

            orgStructureEvents.setdefault(id, {'DMS': [], 'PMU': [], 'Death': []})
            if eventsDMS:
                orgStructureEvents[id]['DMS'].extend(map(int, eventsDMS.split(',')))
            if eventsPMU:
                orgStructureEvents[id]['PMU'].extend(map(int, eventsPMU.split(',')))
            if eventsDeath:
                orgStructureEvents[id]['Death'].extend(map(int, eventsDeath.split(',')))

            hospitalizationInfo[id] = {
                'byHimself': byHimself,
                'refused': refused
            }

            usedBeds = moving + received + movingInto - movingFrom - leaved - dead
            freeBeds = permanentBeds - usedBeds
            freeMenBeds = menBed - men
            freeWomenBeds = womenBed - women

            reportRows[id] = [
                permanentBeds,
                moving,
                received,
                movingInto,
                movingFrom,
                leaved,
                dead,
                usedBeds,
                freeBeds if freeBeds > 0 else 0,
                freeMenBeds if freeMenBeds > 0 else 0,
                freeWomenBeds if freeWomenBeds > 0 else 0
            ]

        totalRVC = [sum(data) for data in zip(*[reportRows[os[0]] for os in orgStructuresRVC])]
        totalB36 = [sum(data) for data in zip(*reportRows.itervalues())]

        hospitalizationTotal = totalB36[2]
        hospitalizationRVC = totalRVC[2]
        hospitalizationT3 = reportRows[TherapeuticOS3[0]][2]
        hospitalizationOther = hospitalizationTotal - hospitalizationRVC - hospitalizationT3

        hospitalizationByHimself = sum(hospitalizationInfo[osId]['byHimself'] for osId in hospitalizationInfo.iterkeys())
        hospitalizationRefused = sum(hospitalizationInfo[osId]['refused'] for osId in hospitalizationInfo.iterkeys())

        operationTotal, operationUrgent, coronaryTotal, coronaryUrgent = getOperations(begDateTime, endDateTime, EVDT_Id)

        headerTable.setText(0, 0, u'Обратилось в приемное отделение РСЦ')
        headerTable.setText(0, 1, countEventsByOrgStructure(begDateTime, endDateTime, receptionRVC_Id))
        headerTable.setText(1, 0, u'Госпитализировано')
        headerTable.setText(1, 1, hospitalizationTotal)
        headerTable.setText(1, 2, u'в РСЦ - {hospRVC}'.format(hospRVC=hospitalizationRVC), fontBold=True)
        headerTable.setText(1, 3, u'в 3 т/о - {hospT3}'.format(hospT3=hospitalizationT3), fontBold=True)
        headerTable.setText(1, 4, u'др. отд. - {hospOther}'.format(hospOther=hospitalizationOther), fontBold=True)
        headerTable.setText(2, 0, u'Отказ от госпитализации')
        headerTable.setText(2, 1, hospitalizationRefused)
        headerTable.setText(3, 0, u'Обратилось "Самотеком"')
        headerTable.setText(3, 1, hospitalizationByHimself)
        headerTable.setText(4, 0, u'Выполнено коронарографий')
        headerTable.setText(4, 1, coronaryTotal)
        headerTable.setText(4, 2, u'плановых - {count}'.format(count=coronaryTotal - coronaryUrgent))
        headerTable.setText(4, 3, u'экстренных - {count}'.format(count=coronaryUrgent))
        headerTable.setText(5, 0, u'Другие операции в ОРДЛ')
        headerTable.setText(5, 1, operationTotal)
        headerTable.setText(5, 2, u'плановых - {count}'.format(count=operationTotal - operationUrgent))
        headerTable.setText(5, 3, u'экстренных - {count}'.format(count=operationUrgent))

        for osId, osName, tableRow in orgStructuresRVC + [TherapeuticOS3]:
            mainTable.setText(tableRow, 0, osName, fontBold=(osId==TherapeuticOS3[0]))
            for col, cnt in enumerate(reportRows[osId]):
                mainTable.setText(tableRow, col + 1, cnt)

        mainTable.setText(9, 0, u'Итого по РСЦ:', fontBold=True)
        for col, cnt in enumerate(totalRVC):
            mainTable.setText(9, col + 1, cnt)

        mainTable.setText(11, 0, u'Госпитализировано в другие отделения ГКБ №36')
        mainTable.setText(11, 3, hospitalizationOther)

        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()
        cursor.insertBlock()

        # 3

        cursor.setCharFormat(CReportBase.ReportSubTitle)
        cursor.insertText(u'Пациенты госпитализированные по каналу ПМУ/ДМС')
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()

        DMS_PMU_columns = [
            ('50?', [u'Ф.И.О. пациента'], CReportBase.AlignLeft),
            ('5?', [u'Канал (ПМУ или ДМС)'], CReportBase.AlignLeft),
            ('20?', [u'Отделение'], CReportBase.AlignLeft),
            ('25?', [u'Страх. компания'], CReportBase.AlignLeft),
        ]
        DMS_PMU_table = createTable(cursor, DMS_PMU_columns)

        receivedEvents = []
        deathEvents = []
        financeMap = {}
        receivedEventsMap = {}
        deathEventsMap = {}

        receivedClients = []
        deathClients = []

        for orgStructureId, eventsMap in orgStructureEvents.iteritems():
            if orgStructureId in orgStructureIdsRVC:
                receivedEvents.extend(eventsMap['DMS'])
                receivedEvents.extend(eventsMap['PMU'])
                deathEvents.extend(eventsMap['Death'])
                for eventId in eventsMap['DMS']:
                    financeMap[eventId] = 'DMS'
                    receivedEventsMap[eventId] = orgStructureId
                for eventId in eventsMap['PMU']:
                    financeMap[eventId] = 'PMU'
                    receivedEventsMap[eventId] = orgStructureId
                for eventId in eventsMap['Death']:
                    deathEventsMap[eventId] = orgStructureId


        if receivedClients:
            queryReceived = selectReceivedClients(receivedEvents)
            self.addQueryText(forceString(queryReceived.lastQuery()))
            while queryReceived.next():
                record = queryReceived.record()
                orgStructure = forceRef(record.value('orgStructure'))
                lastName = forceString(record.value('lastName'))
                firstName = forceString(record.value('firstName'))
                patrName = forceString(record.value('patrName'))
                insurer = forceString(record.value('insurer'))
                channel = forceString(record.value('channel'))

                name = formatName(lastName, firstName, patrName)

                receivedClients.append((name, channel, orgStructure, insurer))

        receivedClients = sorted(receivedClients, cmp=lambda x,y: cmp(x[0], y[0]))
        for row in receivedClients:
            i = DMS_PMU_table.addRow()
            DMS_PMU_table.setText(i, 0, row[0])
            DMS_PMU_table.setText(i, 1, row[1])
            DMS_PMU_table.setText(i, 2, row[2])
            DMS_PMU_table.setText(i, 3, row[3])

        cursor.insertBlock()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()
        cursor.insertBlock()

        # 4
        if deathEvents:
            queryDead = selectDeadClients(deathEvents)
            self.addQueryText(forceString(queryDead.lastQuery()))
            while queryDead.next():
                record = queryDead.record()
                orgStructure = forceString(record.value('orgStructure'))
                lastName = forceString(record.value('lastName'))
                firstName = forceString(record.value('firstName'))
                patrName = forceString(record.value('patrName'))
                age = forceInt(record.value('age'))
                externalId = forceString(record.value('externalId'))
                deathTime = forceDateTime(record.value('deathTime'))

                name = formatName(lastName, firstName, patrName)

                deathClients.append((name, age, externalId, orgStructure, deathTime))

        cursor.setCharFormat(CReportBase.ReportSubTitle)
        cursor.insertText(u'Умерло пациентов всего: {0}'.format(len(deathClients)))
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()

        deathClientsColumns = [
            ('50?', [u'Ф.И.О. пациента'], CReportBase.AlignLeft),
            ('5?', [u'Возраст'], CReportBase.AlignLeft),
            ('5?', [u'№ истории болезни'], CReportBase.AlignLeft),
            ('30?', [u'Отделение'], CReportBase.AlignLeft),
            ('10?', [u'Дата и время смерти'], CReportBase.AlignLeft),
        ]
        deathClientsTable = createTable(cursor, deathClientsColumns)

        deathClients = sorted(deathClients, cmp=lambda x,y: cmp(x[0], y[0]))
        for row in deathClients:
            i = deathClientsTable.addRow()
            deathClientsTable.setText(i, 0, row[0])
            deathClientsTable.setText(i, 1, row[1])
            deathClientsTable.setText(i, 2, row[2])
            deathClientsTable.setText(i, 3, row[3])
            deathClientsTable.setText(i, 4, row[4].toString('dd.MM.yyyy hh:mm'))

        return doc
Ejemplo n.º 23
0
    def makeStructAction(self, query, params):
        # chkAllOrgStructure:: если True - при структурировании по подразделениям к которым относится действие,
        # действие может относится ко многим подразделениям, а если False мы учитываем только первое.
        chkAllOrgStructure = params.get('chkAllOrgStructure', False)
        chkPatientInfo = params.get('chkPatientInfo', False)
        chkOrgStructure = params.get('chkOrgStructure', False)
        chkPerson = params.get('chkPerson', False)
        detailServiceTypes = params.get('detailServiceTypes', False)
        strongOrgStructureId = params.get('orgStructureId', None)
        enterPost = params.get('enterPost', False)
        existsOrgStructureActions = []
        while query.next():
            record = query.record()

            modifyDatetime = forceDate(record.value('modifyDatetime'))
            endDate = forceDate(record.value('endDate'))
            actionId = forceRef(record.value('id'))
            actionTypeCode = forceString(record.value('code'))
            actionTypeName = forceString(record.value('name'))
            amount = forceInt(record.value('amount'))
            orgStructureId = forceRef(record.value('orgStructureId'))
            #            orgStructureName = forceString(record.value('orgStructureName'))
            price = forceDouble(record.value('price'))

            if chkAllOrgStructure:
                if (orgStructureId, actionId) in existsOrgStructureActions:
                    continue
                existsOrgStructureActions.append((orgStructureId, actionId))
            else:
                if actionId in existsOrgStructureActions:
                    continue
                existsOrgStructureActions.append(actionId)

            result, orgStructureId = self.orgStructureFilterByParams(
                chkOrgStructure, strongOrgStructureId, orgStructureId)
            if not result:
                continue

            fullOrgStructureName = self._mapOrgStructureIdToFullName.get(
                orgStructureId, None)
            if not fullOrgStructureName:
                if not orgStructureId:
                    if chkOrgStructure:
                        fullOrgStructureName = u'Головное подразделение'
                    else:
                        fullOrgStructureName = u'Подразделение не определено'
                else:
                    fullOrgStructureName = getOrgStructureFullName(
                        orgStructureId)
                self._mapOrgStructureIdToFullName[
                    orgStructureId] = fullOrgStructureName

            actionValues = smartDict()
            actionValues.actionId = actionId
            actionValues.orgStructureId = orgStructureId
            actionValues.number = 0
            values = [actionTypeCode, actionTypeName, amount, price * amount]

            if chkPatientInfo:
                clientName = formatName(record.value('lastName'),
                                        record.value('firstName'),
                                        record.value('patrName'))
                clientId = forceRef(record.value('clientId'))
                actionMKB = forceString(record.value('actionMKB'))
                endDate = endDate if endDate.isValid() else modifyDatetime

                values.insert(2, actionMKB)
                values.insert(2, clientName)
                values.insert(0, forceString(endDate))

            if chkPerson:
                personName = forceString(record.value('personName'))
                personId = forceString(record.value('personId'))
                self._mapPersonIdToName[personId] = personName
                if enterPost:
                    personPost = forceString(record.value('personPost'))
                    self._mapPersonIdToName[personId] = {}
                    self._mapPersonIdToName[personId]['name'] = personName
                    self._mapPersonIdToName[personId]['post'] = personPost

            if detailServiceTypes:
                serviceType = forceInt(record.value('serviceType'))

            actionValues.values = values

            orgStructureDict = self._mapRowValues.setdefault(
                orgStructureId, {})
            personDict = orgStructureDict.setdefault(
                personId if chkPerson else None, {})
            serviceTypeDict = personDict.setdefault(
                serviceType if detailServiceTypes else None, {})
            clientDict = serviceTypeDict.setdefault(
                clientId if chkPatientInfo else None, {})
            existActionValues = clientDict.setdefault(
                (actionTypeCode, actionTypeName), actionValues)

            if existActionValues != actionValues:
                existActionValues.values[-2] += actionValues.values[-2]
                existActionValues.values[-1] += actionValues.values[-1]

        # set numbers within each orgStructure unit
        self.fillOrgStructureRows()
Ejemplo n.º 24
0
    def build(self, params):
        query = selectData(params)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        onlyDiscountPayment = params.get('onlyDiscountPayment', False)
        onlyStaffRelative = params.get('onlyStaffRelative', False)
        chkRefused = params.get('chkRefused', False)
        chkGroupByPatient = params.get('chkGroupByPatient', False)
        chkOutputByOrgStructure = params.get('chkOutputByOrgStructure', False)

        if chkOutputByOrgStructure:
            tableColumns = [('%20', [u'Свойство номенклатуры/Номенклатура'],
                             CReportBase.AlignLeft),
                            ('%2', [u'Ед.'], CReportBase.AlignLeft),
                            ('%5', [u'Количество'], CReportBase.AlignLeft),
                            ('%8', [u'Продажи'], CReportBase.AlignLeft)]
            resume = [0] * 4
            resumeColumns = [2]

        elif onlyDiscountPayment and chkGroupByPatient:
            tableColumns = [('%2', [u'№'], CReportBase.AlignRight),
                            ('%5', [u'ФИО'], CReportBase.AlignLeft),
                            ('%5', [u'Количество'], CReportBase.AlignLeft),
                            ('%5', [u'стоимость'], CReportBase.AlignLeft),
                            ('%5', [u'скидка(%)'], CReportBase.AlignLeft),
                            ('%5', [u'сумма скидки'], CReportBase.AlignLeft),
                            ('%5', [u'Примечание ("связь")'],
                             CReportBase.AlignLeft)]
            resume = [0] * 5
            resumeColumns = [1, 2, 3, 4]

        else:
            tableColumns = [('%2', [u'№'], CReportBase.AlignRight),
                            ('%5', [u'Код пациента'], CReportBase.AlignLeft),
                            ('%5', [u'Имя пациента'], CReportBase.AlignLeft),
                            ('%5', [u'Количество'], CReportBase.AlignLeft),
                            ('%5', [u'Цена'], CReportBase.AlignLeft)]
            if not chkGroupByPatient:
                tableColumns.insert(
                    1, ('%5', [u'Дата и время'], CReportBase.AlignLeft))
                tableColumns.insert(
                    4, ('%5', [u'№ обращения'], CReportBase.AlignLeft))
                tableColumns.insert(
                    5, ('%5', [u'Код действия'], CReportBase.AlignLeft))
                tableColumns.insert(
                    6,
                    ('%5', [u'Наименование действия'], CReportBase.AlignLeft))
                tableColumns.insert(
                    7, ('%5', [u'Оператор'], CReportBase.AlignLeft))
                resume = [0] * 9
                resumeColumns = [7, 8]
            else:
                resume = [0] * 4
                resumeColumns = [2, 3]
        table = createTable(cursor, tableColumns)

        boldChars = QtGui.QTextCharFormat()
        boldChars.setFontWeight(QtGui.QFont.Bold)

        boldItalicChars = QtGui.QTextCharFormat()
        boldItalicChars.setFontWeight(QtGui.QFont.DemiBold)
        boldItalicChars.setFontItalic(True)

        byOrgStruct = {}
        byClient = {}
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            isShow = True
            record = query.record()
            clientId = forceRef(record.value('clientId'))
            clientName = formatName(record.value('lastName'),
                                    record.value('firstName'),
                                    record.value('patrName'))
            #Вывод данных, если включен фильтр, исключающий отмененные услуги
            if chkRefused:
                if getStatusRefused(forceInt(record.value('payStatus'))):
                    isShow = False
            if chkGroupByPatient:
                if not chkOutputByOrgStructure:
                    actionsCount = forceInt(record.value('actionsCount'))
                    priceSum = forceDouble(record.value('priceSum'))
                    if onlyDiscountPayment:
                        realSum = forceDouble(record.value('realSum'))
                        discountInfo = getClientDiscountInfo(clientId)
                        discount = int(discountInfo[0] * 100)
                        #Не выводить данные, если нет скидки или если включена опция "Родственники сотрудников" и при этом пациент является причиной скидки
                        if discount <= 0 or (onlyStaffRelative
                                             and discountInfo[1] == clientId):
                            isShow = False
                        else:
                            discountNote = discountInfo[2]
                            values = [
                                clientName, actionsCount, realSum, discount,
                                priceSum - realSum, discountNote
                            ]
                    else:
                        values = [clientId, clientName, actionsCount, priceSum]
                else:
                    isShow = False
                    orgStructureName = forceString(
                        record.value('orgStructureName'))
                    actionTypeName = forceString(
                        record.value('actionTypeName'))
                    actionsCount = forceInt(record.value('actionsCount'))
                    priceSum = forceDouble(record.value('priceSum'))
                    values = [actionTypeName, u'шт.', actionsCount, priceSum]
                    byClient.setdefault(clientName,
                                        {}).setdefault(orgStructureName,
                                                       []).append(values)
            elif chkOutputByOrgStructure:
                isShow = False
                record = query.record()
                orgStructureName = forceString(
                    record.value('orgStructureName'))
                actionTypeName = forceString(record.value('actionTypeName'))
                actionsCount = forceInt(record.value('actionsCount'))
                priceSum = forceDouble(record.value('priceSum'))
                values = [actionTypeName, u'шт.', actionsCount, priceSum]
                byOrgStruct.setdefault(orgStructureName, []).append(values)
            else:
                date = forceString(record.value('modifyDatetime'))
                externalId = forceString(record.value('externalId'))
                actionTypeCode = forceString(record.value('actionTypeCode'))
                actionTypeName = forceString(record.value('actionTypeName'))
                amount = forceDouble(record.value('amount'))
                price = forceDouble(record.value('price'))
                personName = forceString(record.value('personName'))
                values = [
                    date, clientId, clientName, externalId, actionTypeCode,
                    actionTypeName, personName, amount, price * amount
                ]

            #Вывод данных, если отключена опция выводить только оплаченные, либо (если только оплаченных), если скидка больше 0
            if isShow:
                i = table.addRow()
                table.setText(i, 0, i)
                for valueIdx, value in enumerate(values):
                    table.setText(i, valueIdx + 1, value)
                    if valueIdx in resumeColumns:
                        resume[valueIdx] += value

        if chkOutputByOrgStructure:
            if chkGroupByPatient:
                byClientKeys = byClient.keys()
                byClientKeys.sort()
                for client in byClientKeys:
                    i = table.addRow()
                    table.mergeCells(i, 0, 1, 3)
                    tmpClientSum = 0
                    for orgStruct in byClient[client].keys():
                        j = table.addRow()
                        table.mergeCells(j, 0, 1, 3)
                        tmpOrgSum = 0
                        for values in byClient[client][orgStruct]:
                            k = table.addRow()
                            for valueIdx, value in enumerate(values):
                                table.setText(k, valueIdx, value)
                                if valueIdx == 3:
                                    tmpOrgSum += value
                        table.setText(j,
                                      0,
                                      orgStruct,
                                      charFormat=boldItalicChars)
                        table.setText(j,
                                      3,
                                      tmpOrgSum,
                                      charFormat=boldItalicChars)
                        tmpClientSum += tmpOrgSum
                    table.setText(i, 0, client, charFormat=boldItalicChars)
                    table.setText(i,
                                  3,
                                  tmpClientSum,
                                  charFormat=boldItalicChars)
                    resume[2] += tmpClientSum
            else:
                for orgStruct in byOrgStruct.keys():
                    i = table.addRow()
                    table.mergeCells(i, 0, 1, 3)
                    tmpSum = 0
                    for values in byOrgStruct[orgStruct]:
                        j = table.addRow()
                        for valueIdx, value in enumerate(values):
                            table.setText(j, valueIdx, value)
                            if valueIdx == 3:
                                tmpSum += value
                    table.setText(i, 0, orgStruct, charFormat=boldItalicChars)
                    table.setText(i, 3, tmpSum, charFormat=boldItalicChars)
                    resume[2] += tmpSum

        i = table.addRow()
        table.mergeCells(i, 0, 1, 2)
        table.setText(i, 0, u'Всего', charFormat=boldChars)
        for column in resumeColumns:
            table.setText(i, column + 1, resume[column], charFormat=boldChars)

        return doc
Ejemplo n.º 25
0
    def build(self, params):
        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        workOrgId = params.get('workOrgId', None)
        sex = params.get('sex', 0)
        ageFrom = params.get('ageFrom', 0)
        ageTo = params.get('ageTo', 150)
        areaIdEnabled = params.get('areaIdEnabled', False)
        areaId = params.get('areaId', None)
        MKBFilter = params.get('MKBFilter', 0)
        MKBFrom = params.get('MKBFrom', 'A00')
        MKBTo = params.get('MKBTo', 'Z99.9')
        MKBExFilter = params.get('MKBExFilter', 0)
        MKBExFrom = params.get('MKBExFrom', 'A00')
        MKBExTo = params.get('MKBExTo', 'Z99.9')
        personId = params.get('personId', None)
        specialityId = params.get('specialityId', None)
        rowGrouping = params.get('rowGrouping', 0)
        orgStructureAttachTypeId = params.get('orgStructureAttachTypeId', None)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('2%', [u'№'], CReportBase.AlignLeft),
            ('11%', [u'ФИО'], CReportBase.AlignLeft),
            ('2%', [u'пол'], CReportBase.AlignCenter),
            ('6%', [u'д.р.'], CReportBase.AlignLeft),
            ('5%', [u'СНИЛС'], CReportBase.AlignLeft),
            ('8%', [u'Полис'], CReportBase.AlignLeft),
            ('8%', [u'Документ'], CReportBase.AlignLeft),
            ('17%', [u'Адрес'], CReportBase.AlignLeft),
            ('7%', [u'Контакты'], CReportBase.AlignLeft),
            ('9%', [u'Занятость'], CReportBase.AlignLeft),
            ('8%', [u'Льгота'], CReportBase.AlignLeft),
            ('5%', [u'Дата взятия на учет'], CReportBase.AlignLeft),
            ('5%', [u'Дата последнего Д - осмотра'], CReportBase.AlignLeft),
            ('8%', [u'Врач'], CReportBase.AlignLeft),
            ('7%', [u'МКБ'], CReportBase.AlignRight),
            ('10%', [u'Примечание'], CReportBase.AlignLeft)
        ]

        table = createTable(cursor, tableColumns)

        query = selectData(begDate, endDate, workOrgId, sex, ageFrom, ageTo,
                           areaIdEnabled, areaId, MKBFilter, MKBFrom, MKBTo,
                           MKBExFilter, MKBExFrom, MKBExTo, personId,
                           specialityId, rowGrouping, self.forChildren,
                           orgStructureAttachTypeId)

        if rowGrouping == 3:  # by personId
            forceKeyVal = forceRef
            keyValToString = lambda personId: forceString(
                QtGui.qApp.db.translate('vrbPersonWithSpeciality', 'id',
                                        personId, 'name'))
        elif rowGrouping == 2:  # by speciality_id
            forceKeyVal = forceRef
            keyValToString = lambda specialityId: forceString(
                QtGui.qApp.db.translate('rbSpeciality', 'id', specialityId,
                                        'name'))
        elif rowGrouping == 1:  # by orgStructureId
            forceKeyVal = forceRef
            keyValToString = lambda orgStructureId: forceString(
                QtGui.qApp.db.translate('OrgStructure', 'id', orgStructureId,
                                        'name'))
        prevRowKey = ''
        count = 0
        n = 0
        countViewClient = 1

        self.setQueryText(forceString(query.lastQuery()))
        currentClient = None
        while query.next():
            record = query.record()
            clientId = forceInt(record.value('id'))
            name = formatName(record.value('lastName'),
                              record.value('firstName'),
                              record.value('patrName'))
            birthDate = forceString(record.value('birthDate'))
            sex = formatSex(forceInt(record.value('sex')))
            SNILS = formatSNILS(record.value('SNILS'))
            policy = ' '.join([
                forceString(record.value('policySerial')),
                forceString(record.value('policyNumber')),
                forceString(record.value('insurer'))
            ])
            document = ' '.join([
                forceString(record.value('documentSerial')),
                forceString(record.value('documentNumber'))
            ])
            regAddress = forceString(record.value('regAddress'))
            locAddress = forceString(record.value('locAddress'))
            MKB = forceString(record.value('MKB'))
            #            endDate = forceDate(record.value('endDate'))
            contacts = forceString(record.value('contact'))
            socStatus = forceString(record.value('socStatus'))
            dateAccount = forceDate(
                record.value('dateAccount')).toString('dd.MM.yyyy')
            dateView = forceDate(
                record.value('dateView')).toString('dd.MM.yyyy')
            person = forceString(record.value('person'))
            work = ' '.join([
                forceString(record.value('workName')),
                forceString(record.value('workPost'))
            ])
            firstInPeriod = forceString(record.value('firstInPeriod'))
            if rowGrouping:
                rowKey = forceKeyVal(record.value('rowKey'))
                if prevRowKey and rowKey != prevRowKey:
                    i = table.addRow()
                    if not rowKey:
                        table.setText(i, 1, u'всего по ' + '-',
                                      CReportBase.TableTotal)
                    else:
                        table.setText(
                            i, 1, u'всего по ' + keyValToString(prevRowKey),
                            CReportBase.TableTotal)
                    table.setText(i, 2, n, CReportBase.TableTotal)
                    table.mergeCells(i, 2, 1, 15)
                    n = 0
                if rowKey != prevRowKey:
                    i = table.addRow()
                    table.mergeCells(i, 0, 1, 15)
                    i = table.addRow()
                    if not rowKey:
                        table.setText(i, 0, '-', CReportBase.TableTotal)
                    else:
                        table.setText(i, 0, keyValToString(rowKey),
                                      CReportBase.TableTotal)
                    table.mergeCells(i, 0, 1, 15)
                    prevRowKey = rowKey
            i = table.addRow()
            if not self.forChildren:
                currentClient = None
            if currentClient != clientId:
                currentDateAccount = None
                if self.forChildren:
                    for column in xrange(15):
                        if column not in (14, 13, 12, 11):
                            table.mergeCells(i - countViewClient, column,
                                             countViewClient, 1)
                n += 1
                table.setText(i, 0, n)
                table.setText(i, 1, name)
                table.setText(i, 2, sex)
                table.setText(i, 3, birthDate)
                table.setText(i, 4, SNILS)
                table.setText(i, 5, policy)
                table.setText(i, 6, document)
                table.setText(i, 7, regAddress + '\n' + locAddress)
                table.setText(i, 8, contacts)
                table.setText(i, 9, work)
                table.setText(i, 10, socStatus)
                table.setText(i, 11, dateAccount)
                table.setText(i, 12, dateView)
                table.setText(i, 13, person)
                table.setText(i, 14, MKB)
                if self.forChildren:
                    table.setText(i, 15, firstInPeriod)
                count += 1
                countViewClient = 1
                currentClient = clientId
                countDateAccount = 1
            else:
                countViewClient += 1
                if dateAccount != currentDateAccount:
                    table.mergeCells(i - countDateAccount, 11,
                                     countDateAccount, 1)
                    table.setText(i, 11, dateAccount)
                    currentDateAccount = dateAccount
                    countDateAccount = 0
                table.setText(i, 12, dateView)
                table.setText(i, 13, person)
                table.setText(i, 14, MKB)
                if self.forChildren:
                    table.setText(i, 15, firstInPeriod)
                countDateAccount += 1

        if rowGrouping:
            i = table.addRow()
            table.setText(i, 1, u'всего по ' + keyValToString(rowKey),
                          CReportBase.TableTotal)
            table.setText(i, 2, n)
            table.mergeCells(i, 2, 1, 15)
            i = table.addRow()
            table.setText(i, 1, u'ВСЕГО', CReportBase.TableTotal)
            table.setText(i, 2, count, CReportBase.TableTotal)
            table.mergeCells(i, 2, 1, 15)
        if self.forChildren:
            sex = params.get('sex', 0)
            query = selectResultData(begDate, endDate, workOrgId, sex, ageFrom,
                                     ageTo, areaIdEnabled, areaId, MKBFilter,
                                     MKBFrom, MKBTo, MKBExFilter, MKBExFrom,
                                     MKBExTo, personId, self.forChildren,
                                     orgStructureAttachTypeId)
            self.setQueryText(forceString(query.lastQuery()))
            if query.first():
                record = query.record()
                count = forceInt(record.value('count'))
                countInFirst = forceInt(record.value('countInFirst'))
                i = table.addRow()
                table.mergeCells(i, 0, 1, 2)
                table.mergeCells(i, 2, 1, 14)
                table.setText(i, 0, u'Всего состоит: ')
                table.setText(i, 2, count)
                i = table.addRow()
                table.mergeCells(i, 0, 1, 2)
                table.mergeCells(i, 2, 1, 14)
                table.setText(i, 0, u'Всего взято впервые: ')
                table.setText(i, 2, countInFirst)
        return doc
Ejemplo n.º 26
0
        def formatRow(record, n, amount, price, sum):
            name = formatName(record.value('lastName'),
                              record.value('firstName'),
                              record.value('patrName'))
            service = forceString(record.value('service'))
            serviceCode = forceString(record.value('serviceCode'))
            person = forceString(record.value('person'))
            dateassign = forceDate(record.value('actionbegDate'))
            if dateassign.isNull():
                dateassign = forceDate(record.value('visitDate'))
            if dateassign.isNull():
                dateassign = forceDate(record.value('eventsetDate'))
            date = forceDate(record.value('actionDate'))

            if date.isNull():
                date = forceDate(record.value('visitDate'))
            if date.isNull():
                date = forceDate(record.value('eventDate'))

            if self.report:
                vat = sum * forceDouble(record.value('vat'))
                result = [
                    n,
                    forceString(record.value('number')),
                    forceDate(
                        record.value('settleDate')).toString('dd.MM.yyyy'),
                    name,
                    forceString(record.value('externalId')), serviceCode,
                    service,
                    forceString(dateassign),
                    forceString(date),
                    forceString(record.value('createPerson')),
                    forceDate(
                        record.value('modifyDateTime')).toString('dd.MM.yyyy')
                    + '/' + forceString(record.value('modifyPerson')), price,
                    amount, sum, vat, sum - vat,
                    forceString(record.value('execOrgStructure')), person,
                    forceString(record.value('setOrgStructure')),
                    forceString(record.value('setPerson')),
                    forceString(record.value('coordOrg')),
                    forceString(record.value('coordInspector')),
                    forceString(record.value('coordAgent')),
                    forceDate(record.value('coordDate')).toString('dd.MM.yyyy')
                ]
            else:
                diagAccompMKB = forceString(record.value('diagAccompMKB'))
                result = [
                    n, name,
                    forceString(record.value('birthDate')), ' '.join([
                        forceString(record.value('policySerial')),
                        forceString(record.value('policyNumber')),
                        forceString(record.value('policyInsurer'))
                    ]), ', '.join([
                        forceString(record.value('MKB')), diagAccompMKB
                    ]) if diagAccompMKB else forceString(record.value('MKB')),
                    serviceCode, service, person,
                    forceString(dateassign),
                    forceString(date),
                    forceString(record.value('createPerson')),
                    forceDate(
                        record.value('modifyDateTime')).toString('dd.MM.yyyy')
                    + '/' + forceString(record.value('modifyPerson')), price,
                    amount, sum
                ]
                if chkAssistant:
                    result.insert(8, forceString(record.value('assistant')))
            return result
Ejemplo n.º 27
0
    def build(self, params):
        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)

        org_id = QtGui.qApp.currentOrgId()
        org_info = getOrganisationInfo(org_id)

        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(org_info.get('fullName'))
        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(self.title())

        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('4%',   [u'№ п/п'],                        CReportBase.AlignCenter),
            ('16%',  [u'Отделение,\n№ ИБ'],             CReportBase.AlignCenter),
            ('5%',   [u'Дата актирования'],             CReportBase.AlignCenter),
            ('15%',  [u'Фамилия Имя Отчество'],         CReportBase.AlignCenter),
            ('5%',   [u'Возраст,\nДата рождения'],      CReportBase.AlignCenter),
            ('20%',  [u'Кем направлен, доставлен'],     CReportBase.AlignCenter),
            ('15%',  [u'Наличие предметов подлежащих актированию'], CReportBase.AlignCenter),
            ('10%',  [u'Сдал'],                         CReportBase.AlignCenter),
            ('10%',  [u'Принял'],                       CReportBase.AlignCenter)]
        table = createTable(cursor, tableColumns)
        total = 0
        total_passport = 0
        total_policy = 0
        while query.next():
            record = query.record()
            counterValue = forceString(record.value('counterValue'))
            externalId = forceString(record.value('externalId'))
            structure = forceString(record.value('structure'))
            date = forceString(record.value('endDate'))
            cl_lastName = record.value('cl_lastName')
            cl_firstName = record.value('cl_firstName')
            cl_patrName = record.value('cl_patrName')
            cl_birthDate = record.value('cl_birthDate')
            organisation = forceString(record.value('organisation'))
            delivered_by = forceString(record.value('delivered_by'))

            passport = u'Сдан паспорт' if forceInt(record.value('passport')) else u''
            policy = u'Сдан полис' if forceInt(record.value('policy')) else u''
            amb = u'АМБ' if forceInt(record.value('amb')) else u''
            total_passport += 1 if passport else 0
            total_policy += 1 if policy else 0

            worth = forceString(record.value('worth'))
            money = forceString(record.value('money'))
            person_name = forceString(record.value('person_name'))
            i = table.addRow()
            FIO = formatName(cl_lastName, cl_firstName, cl_patrName)
            table.setText(i, 0, counterValue)
            table.setText(i, 1, u'%s,\nиб: %s' % (structure, externalId))
            table.setText(i, 2, date)
            table.setText(i, 3, FIO)
            table.setText(i, 4, '%s\n%s' % (calcAge(cl_birthDate), forceString(cl_birthDate)))
            table.setText(i, 5, '%s\n%s' % (organisation, delivered_by))
            table.setText(i, 6, '\n'.join(filter(None, (passport,
                                                        policy,
                                                        amb,
                                                        u'Кв. ценностей № %s' % worth if worth else u'',
                                                        u'Кв. денежная № %s' % money if money else u''))))
            table.setText(i, 7, FIO)
            table.setText(i, 8, person_name)
            total += 1
        i = table.addRow()
        table.setText(i, 0, u'Итого: %d' % total, CReport.TableTotal, CReport.AlignLeft)
        table.setText(i, 6, u'Сдано паспортов: %d\nСдано полисов: %d' % (total_passport, total_policy), CReport.TableTotal, CReport.AlignLeft)
        table.mergeCells(i, 0, 1, 6)
        table.mergeCells(i, 6, 1, 3)
        return doc
Ejemplo n.º 28
0
    def build(self, description, params):
        def getAddressRecord(record, type=0):
            if type == 0:
                prefix = 'reg'
            else:
                prefix = 'loc'
            address = smartDict()
            address.KLADRCode = forceString(record.value(prefix + 'KLADRCode'))
            address.KLADRStreetCode = forceString(
                record.value(prefix + 'KLADRStreetCode'))
            address.number = forceString(record.value(prefix + 'Number'))
            address.corpus = forceString(record.value(prefix + 'Corpus'))
            address.flat = forceString(record.value(prefix + 'Flat'))
            address.freeInput = forceString(record.value(prefix + 'FreeInput'))
            return address

        accountItemIdList = params.get('accountItemIdList', None)
        currentFinanceId = params.get('currentFinanceId', None)
        showLocAddr = params.get('showLocAddr', False)
        query = selectData(accountItemIdList, currentFinanceId, showLocAddr)

        # now text
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        cursor.setCharFormat(CReportBase.ReportBody)
        cursor.insertText(description)
        cursor.insertBlock()

        if showLocAddr:
            tableColumns = [
                ('3%', [u'№'], CReportBase.AlignRight),
                ('5%', [u'Номер карты'], CReportBase.AlignCenter),
                ('10%', [u'СНИЛС'], CReportBase.AlignLeft),
                ('20%', [u'ФИО'], CReportBase.AlignLeft),
                ('8%', [u'Дата рождения'], CReportBase.AlignLeft),
                ('3%', [u'Пол'], CReportBase.AlignCenter),
                ('12%', [u'Полис'], CReportBase.AlignCenter),
                ('10%', [u'Документ'], CReportBase.AlignCenter),
                ('15%', [u'Адрес регистрации'], CReportBase.AlignLeft),
                ('15%', [u'Адрес проживания'], CReportBase.AlignLeft),
            ]
        else:
            tableColumns = [('3%', [u'№'], CReportBase.AlignRight),
                            ('10%', [u'СНИЛС'], CReportBase.AlignLeft),
                            ('20%', [u'ФИО'], CReportBase.AlignLeft),
                            ('10%', [u'Дата рождения'], CReportBase.AlignLeft),
                            ('3%', [u'Пол'], CReportBase.AlignCenter),
                            ('15%', [u'Полис'], CReportBase.AlignCenter),
                            ('15%', [u'Документ'], CReportBase.AlignCenter),
                            ('20%', [u'Адрес'], CReportBase.AlignLeft)]

        table = createTable(cursor, tableColumns)
        n = 0
        offset = 1 if showLocAddr else 0
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            n += 1
            record = query.record()
            externalId = forceString(record.value('numberCardCall'))
            if not externalId:
                externalId = forceString(record.value('externalId'))
            name = formatName(record.value('lastName'),
                              record.value('firstName'),
                              record.value('patrName'))
            birthDate = forceString(record.value('birthDate'))
            sex = formatSex(forceInt(record.value('sex')))
            SNILS = formatSNILS(record.value('SNILS'))
            policyInfoList = [
                forceString(record.value('policySerial')),
                forceString(record.value('policyNumber')),
                forceString(record.value('policyInsurer'))
            ]
            if showLocAddr:
                policyInfoList.append(
                    forceString(record.value('policyInsurerName')))

            policy = ' '.join(policyInfoList)
            policyName = forceString(record.value('policyName'))
            if policyName:
                policy += '\n' + policyName
            document = ' '.join([
                forceString(record.value('documentSerial')),
                forceString(record.value('documentNumber'))
            ])
            i = table.addRow()
            table.setText(i, 0, n)
            if showLocAddr:
                table.setText(i, 1, externalId)
            table.setText(i, 1 + offset, SNILS)
            table.setText(i, 2 + offset, name)
            table.setText(i, 3 + offset, birthDate)
            table.setText(i, 4 + offset, sex)
            table.setText(i, 5 + offset, policy)
            table.setText(i, 6 + offset, document)

            if showLocAddr:
                from Registry.Utils import formatAddressInt
                regAddress = formatAddressInt(getAddressRecord(record))
                locAddress = formatAddressInt(getAddressRecord(record, 1))
                table.setText(i, 7 + offset, regAddress)
                table.setText(i, 8 + offset, locAddress)
            else:
                table.setText(i, 7 + offset,
                              forceString(record.value('address')))
        return doc
Ejemplo n.º 29
0
    def build(self, description, params):
        db = QtGui.qApp.db
        financeId = params.get('currentFinanceId', None)
        accountItemIdList = params.get('accountItemIdList', None)
        if not accountItemIdList:
            accountItemIdList = params.get('accountIdList', None)
        orgInsurerId = params.get('orgInsurerId', None)
        chkAssistant = params.get('assistant', False)
        if orgInsurerId:
            query = selectData(accountItemIdList,
                               financeId,
                               orgInsurerId,
                               isFranchise=False)
        else:
            query = selectData(accountItemIdList, financeId, isFranchise=False)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        format = QtGui.QTextCharFormat()

        format.setFontPointSize(7)
        cursor.setCharFormat(format)

        smo = ""
        if forceInt(orgInsurerId):
            recordInsurerOrg = db.getRecord(db.table('Organisation'),
                                            ['fullName'],
                                            forceInt(orgInsurerId))
            if recordInsurerOrg:
                smo = forceString(recordInsurerOrg.value('fullName'))
        if smo:
            cursor.insertText(u'В страховую компанию ' + smo)
            cursor.insertBlock()
            contractNumber, contractDate = selectContractNumber(orgInsurerId)
            if contractNumber:
                contract = u'Приложение к договору ' + contractNumber
                if contractDate:
                    contract += u' от ' + contractDate
                cursor.insertBlock(CReportBase.AlignRight)
                cursor.insertText(contract)

        cursor.insertBlock(CReportBase.AlignLeft)
        format.setFontWeight(QtGui.QFont.Bold)
        format.setFontPointSize(8)
        cursor.setCharFormat(format)
        cursor.insertText(u'РАСЧЕТ СТОИМОСТИ МЕДИЦИНСКОГО ОБСЛУЖИВАНИЯ')

        cursor.insertBlock(CReportBase.AlignLeft)
        format.setFontWeight(QtGui.QFont.Normal)
        format.setFontPointSize(7)
        cursor.setCharFormat(format)
        cursor.insertText(u'Приложение к счёту ')

        orgId = forceInt(getVal(QtGui.qApp.preferences.appPrefs, 'orgId',
                                None))
        if orgId:
            recordOrg = db.getRecord(db.table('Organisation'), ['fullName'],
                                     forceInt(orgId))
            if recordOrg:
                cursor.insertBlock(CReportBase.AlignLeft)
                format.setFontWeight(QtGui.QFont.Bold)
                format.setFontPointSize(8)
                cursor.setCharFormat(format)
                cursor.insertText(u'Медицинское учреждение - "' +
                                  forceString(recordOrg.value('fullName')))

        format.setFontWeight(QtGui.QFont.Normal)
        cursor.setCharFormat(format)
        cursor.insertBlock(CReportBase.AlignLeft)
        cursor.insertBlock()

        tableColumns = [
            ('3%', [u'№ п/п', u''], CReportBase.AlignRight),
            ('15%', [u'ФИО', u''], CReportBase.AlignLeft),
            ('10%', [u'Полис', u''], CReportBase.AlignCenter),
            ('5%', [u'Дата начато', u''], CReportBase.AlignLeft),
            ('5%', [u'Дата выполнено', u''], CReportBase.AlignLeft),
            ('10%', [u'Диагноз', u''], CReportBase.AlignLeft),
            ('7%', [u'Оказанная мед. услуга', u'Код'], CReportBase.AlignLeft),
            ('15%', [u'', u'Наименование'], CReportBase.AlignLeft),
            ('15%', [u'ФИО специалиста', u''], CReportBase.AlignLeft),
            ('5%', [u'Кол-во', u''], CReportBase.AlignRight),
            ('5%', [u'Стоимость ед. услуги', u''], CReportBase.AlignRight),
            ('5%', [u'Сумма к оплате', u''], CReportBase.AlignRight)
        ]

        format.setFontWeight(QtGui.QFont.Bold)
        table = createTable(cursor, tableColumns, charFormat=format)
        format.setFontWeight(QtGui.QFont.Normal)

        table.mergeCells(0, 0, 2, 1)
        table.mergeCells(0, 1, 2, 1)
        table.mergeCells(0, 2, 2, 1)
        table.mergeCells(0, 3, 2, 1)
        table.mergeCells(0, 4, 2, 1)
        table.mergeCells(0, 5, 2, 1)
        table.mergeCells(0, 6, 1, 2)
        table.mergeCells(0, 8, 2, 1)
        table.mergeCells(0, 9, 2, 1)
        table.mergeCells(0, 10, 2, 1)
        table.mergeCells(0, 11, 2, 1)

        totalAmount = 0

        totalSum = 0.0
        rowBegNumber = 1
        prevClientId = -1
        totalClientSum = 0.0
        totalClientAmount = 0
        self.setQueryText(forceString(query.lastQuery()))
        oldName = ''
        i = 1
        clientNumber = 1
        while query.next():
            record = query.record()

            clientId = forceRef(record.value('id'))
            name = formatName(record.value('lastName'),
                              record.value('firstName'),
                              record.value('patrName'))
            policy = ' '.join([
                forceString(record.value('policySerial')),
                forceString(record.value('policyNumber')),
                forceString(record.value('policyInsurer'))
            ])
            diagMKB = forceString(record.value('diagMKB'))
            diagExMKB = forceString(record.value('diagExMKB'))
            diagAccompMKB = forceString(record.value('diagAccompMKB'))
            actMKB = forceString(record.value('actMKB'))
            service = forceString(record.value('service'))
            serviceCode = forceString(record.value('serviceCode'))
            person = forceString(
                QtGui.qApp.db.translate('vrbPersonWithSpeciality', 'id',
                                        forceRef(record.value('person')),
                                        'name'))
            assistant = forceString(
                QtGui.qApp.db.translate('vrbPersonWithSpeciality', 'id',
                                        forceRef(record.value('assistant')),
                                        'name'))
            amount = forceInt(record.value('amount'))
            price = forceDouble(record.value('price'))
            sum = price * amount
            begDate = forceDate(record.value('begDate')).toString('dd.MM.yy')
            endDate = forceDate(record.value('endDate')).toString('dd.MM.yy')

            if clientId == prevClientId or prevClientId == -1:
                totalClientAmount += amount
                totalClientSum += sum
            elif prevClientId != -1:
                i = table.addRow()
                table.mergeCells(i, 0, 1, 9)
                format.setFontWeight(QtGui.QFont.Bold)
                table.setText(i, 1, u'Итого по клиенту:', format,
                              CReportBase.AlignLeft)
                table.setText(i, 9, totalClientAmount, format)
                table.setText(i, 11,
                              QtCore.QString.number(totalClientSum, 'g', 9),
                              format)
                format.setFontWeight(QtGui.QFont.Normal)
                totalClientAmount = amount
                totalClientSum = sum
            prevClientId = clientId

            i = table.addRow()
            if oldName != name:
                table.setText(i, 0, clientNumber)
                table.setText(i, 1, name, format)
                if i - rowBegNumber > 2:
                    table.mergeCells(rowBegNumber, 0, i - rowBegNumber - 1, 1)
                    table.mergeCells(rowBegNumber, 1, i - rowBegNumber - 1, 1)
                oldName = name
                rowBegNumber = i
                clientNumber += 1
            table.setText(i, 2, policy, format)
            mkb = ''
            if actMKB:
                mkb = actMKB
            else:
                mkb += diagMKB
                mkb += ', ' if mkb and diagExMKB else ''
                mkb += diagExMKB
            if diagAccompMKB:
                mkb = ', '.join([mkb, diagAccompMKB])
            table.setText(i, 3, begDate, format)
            table.setText(i, 4, endDate, format)
            table.setText(i, 5, mkb, format)
            table.setText(i, 6, serviceCode, format)
            table.setText(i, 7, service, format)
            if not chkAssistant or not assistant:
                table.setText(i, 8, person, format)
            else:
                table.setText(i, 8, person + ' / ' + assistant, format)
            table.setText(i, 9, amount, format)
            table.setText(i, 10, QtCore.QString.number(price, 'g', 9), format)
            table.setText(i, 11, QtCore.QString.number(sum, 'g', 9), format)

            totalAmount += amount
            totalSum += sum

        if i - rowBegNumber > 0:
            table.mergeCells(rowBegNumber, 0, i - rowBegNumber + 1, 1)
            table.mergeCells(rowBegNumber, 1, i - rowBegNumber + 1, 1)

        i = table.addRow()
        table.mergeCells(i, 0, 1, 9)
        format.setFontWeight(QtGui.QFont.Bold)
        table.setText(i, 1, u'Итого по клиенту:', format,
                      CReportBase.AlignLeft)
        table.setText(i, 9, totalClientAmount, format)
        table.setText(i, 11, QtCore.QString.number(totalClientSum, 'g', 9),
                      format)
        format.setFontWeight(0)

        i = table.addRow()

        table.mergeCells(i, 0, 1, 9)
        format.setFontWeight(QtGui.QFont.Bold)
        table.setText(i, 1, u'Итого:', format, CReportBase.AlignLeft)
        table.setText(i, 9, totalAmount, format)
        table.setText(i, 11, QtCore.QString.number(totalSum, 'g', 9), format)
        format.setFontWeight(QtGui.QFont.Normal)
        cursor.movePosition(cursor.End)
        cursor.insertBlock(CReportBase.AlignLeft)
        cursor.insertBlock()

        cursor.insertText(u'Сумма к оплате: ' + amountToWords(totalSum))
        cursor.insertBlock()

        orgPhoneNumber = "-"
        if orgId:
            recordChief = db.getRecord(db.table('Organisation'),
                                       ['chief', 'phone'], orgId)
            if forceString(recordChief.value('chief')):
                if forceStringEx(
                        QtGui.qApp.db.translate('Organisation', 'id',
                                                QtGui.qApp.currentOrgId(),
                                                'infisCode')) == u'мсч3':
                    cursor.insertText(
                        u'Начальник \"Медико-санитарной части №3\"' +
                        forceString(recordChief.value('chief')))
                else:
                    cursor.insertText(u'Начальник отдела ' +
                                      forceString(recordChief.value('chief')))
                cursor.insertBlock()
                cursor.insertBlock()
                cursor.insertBlock()
            if forceString(recordChief.value('phone')):
                orgPhoneNumber = forceString(recordChief.value('phone'))

        cursor.insertText(u'Исполнитель ' +
                          forceString(QtGui.qApp.userInfo.name()))
        cursor.insertBlock()
        cursor.insertBlock()
        cursor.insertBlock()
        cursor.insertText(u'тел. ' + orgPhoneNumber)
        cursor.insertBlock()

        return doc
Ejemplo n.º 30
0
    def build(self, params):
        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        eventTypeId = params.get('eventTypeId', None)
        sex = params.get('sex', 0)
        ageFrom = params.get('ageFrom', 0)
        ageTo = params.get('ageTo', 150)
        actionTypeClass = params.get('actionTypeClass', None)
        actionTypeId = params.get('actionTypeId', None)
        onlyPermanentAttach = params.get('onlyPermanentAttach', None)
        MKBFilter = params.get('MKBFilter', 0)
        MKBFrom = params.get('MKBFrom', '')
        MKBTo = params.get('MKBTo', '')
        onlyPayedEvents = params.get('onlyPayedEvents', False)
        begPayDate = params.get('begPayDate', QtCore.QDate())
        endPayDate = params.get('endPayDate', QtCore.QDate())

        db = QtGui.qApp.db

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('5%', [u'№ п/п'], CReportBase.AlignRight),
            ('15%', [u'ФИО'], CReportBase.AlignLeft),
            ('5%', [u'д/р'], CReportBase.AlignLeft),
            ('5%', [u'возраст'], CReportBase.AlignLeft),
            ('25%', [u'Адрес'], CReportBase.AlignLeft),
            ('7%', [u'Полис'], CReportBase.AlignCenter),
            ('9%', [u'паспорт'], CReportBase.AlignCenter),
            ('10%', [u'СНИЛС'], CReportBase.AlignLeft),
            ('5%', [u'кабинет'], CReportBase.AlignLeft),
            ('15%', [u'примечение'], CReportBase.AlignLeft),
        ]

        table = createTable(cursor, tableColumns)

        query = selectData(begDate, endDate, eventTypeId, sex, ageFrom, ageTo,
                           actionTypeClass, actionTypeId, onlyPermanentAttach,
                           MKBFilter, MKBFrom, MKBTo, onlyPayedEvents,
                           begPayDate, endPayDate)

        num = 0
        prevActionTypeId = None
        self.setQueryText(forceString(query.lastQuery()))
        while query.next():
            record = query.record()
            fio = formatName(record.value('lastName'),
                             record.value('firstName'),
                             record.value('patrName'))
            birthDate = forceDate(record.value('birthDate'))
            date = forceDate(record.value('date'))
            age = calcAge(birthDate, date)
            address = forceString(record.value('address'))
            policy = ' '.join([
                forceString(record.value('policySerial')),
                forceString(record.value('policyNumber'))
            ])
            document = ' '.join([
                forceString(record.value('documentSerial')),
                forceString(record.value('documentNumber'))
            ])
            SNILS = formatSNILS(record.value('SNILS'))
            office = forceString(record.value('office'))
            note = forceString(record.value('note'))
            row = [
                fio,
                birthDate.toString('dd.MM.yyyy'), age, address, policy,
                document, SNILS, office, note
            ]
            actionTypeId = forceInt(record.value('actionType_id'))
            actionTypeName = forceString(record.value('actionTypeName'))
            if actionTypeId != prevActionTypeId:
                num = 0
                i = table.addRow()
                prevActionTypeId = actionTypeId
                table.mergeCells(i, 0, 1, 10)
                table.setText(i, 0, actionTypeName, CReportBase.ReportSubTitle,
                              CReportBase.AlignLeft)
            i = table.addRow()
            num += 1
            table.setText(i, 0, num)
            for j, val in enumerate(row):
                table.setText(i, j + 1, val)
        return doc