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''
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
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)
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
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()
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)
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
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)
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)
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
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)
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)
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
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
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
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
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
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)
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
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
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
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()
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
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
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
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
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
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
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