def addRbElement(self, parentElement, rbName): rb = CXMLHelper.addElement(parentElement, 'REFBOOK') CXMLHelper.setValue(CXMLHelper.addElement(rb, 'NAME'), rbName) db = QtGui.qApp.db if rbName == 'rcField': for record in db.getRecordList('rcField', '*', 'deleted = 0'): self.addFieldElement(rb, record) elif rbName == 'rcFunction': for record in db.getRecordList('rcFunction', '*'): self.addFunctionElement(rb, record) elif rbName == 'rcConditionType': for record in db.getRecordList('rcConditionType', '*', 'deleted = 0'): self.addConditionTypeElement(rb, record) elif rbName == 'rcValueType': for record in db.getRecordList('rcValueType', '*'): self.addValueTypeElement(rb, record) elif rbName == 'rcTable': for record in db.getRecordList('rcTable', '*', 'deleted = 0'): self.addTableElement(rb, record) elif rbName == 'rcParamType': for record in db.getRecordList('rcParamType', '*'): self.addParamTypeElement(rb, record) elif rbName == 'rcParam': for record in db.getRecordList('rcParam', '*'): self.addParamElement(rb, record) elif rbName == 'rcParamValues': for record in db.getRecordList('rcParam_Value', '*'): self.addParamValueElement(rb, record) return rb
def addHeaderElement(self, rootElement): header = CXMLHelper.addElement(rootElement, 'HEADER') CXMLHelper.setValue( CXMLHelper.addElement(header, 'VERSION'), # Версия взаимодействия self.version[:5]) CXMLHelper.setValue( CXMLHelper.addElement(header, 'DATA'), # Дата QtCore.QDate.currentDate().toString(QtCore.Qt.ISODate)) return header
def addEntryElement(self, rootElement, record, entryNumber): entryElement = CXMLHelper.addElement(rootElement, 'ZAP') CXMLHelper.setValue( CXMLHelper.addElement(entryElement, 'N_ZAP'), # номер позиции записи entryNumber) patientElement = CXMLHelper.addElement( entryElement, 'PACIENT') # сведения о пациенте self.fillPacient(patientElement, record) return entryElement, patientElement
def addSankElement(self, entryElement, idCase, record): sankElement = CXMLHelper.addElement(entryElement, 'SANK') CXMLHelper.setValue( CXMLHelper.addElement(sankElement, 'S_CODE'), # идентификатор санкции idCase) CXMLHelper.addElement(sankElement, 'S_SUM') # финансовая санкция CXMLHelper.setValue( CXMLHelper.addElement(sankElement, 'S_TIP'), # тип санкции 1) # 1 - МЭК, 2 - МЭЭ, 3 - ЭКМП CXMLHelper.setValue( CXMLHelper.addElement( sankElement, 'S_OSN'), # Код причины отказа (частичной) оплаты forceStringEx(record.value('refuseTypeCode'))) CXMLHelper.setValue( CXMLHelper.addElement(sankElement, 'S_IST'), # источник 2) # 1 – ТФОМС1 к МО, # 2 – ТФОМС2 к ТФОМС1 (только в протоколе обработ-ки основной части), # 3 – уточнённые санкции ТФОМС1 к МО (только в ис-правленной части и далее), # 4 – итоговые санк-ции ТФОМС2 к ТФОМС1 (только в протоколе обработ-ки исправленной части), # где: # ТФОМС1 – ТФОМС террито-рии оказания меди-цинской помощи; # ТФОМС2 – ТФОМС террито-рии страхования; # МО – МО, оказав-шая медицинскую помощь. return sankElement
def addEventElement(self, entryElement, idCase, record): eventElement = CXMLHelper.addElement(entryElement, 'SLUCH') idCaseElement = CXMLHelper.addElement(eventElement, 'IDCASE') if idCase is not None: CXMLHelper.setValue(idCaseElement, idCase) # номер запси в случае реестров else: self.notIdCase.append(idCaseElement) externalId = forceStringEx(record.value('externalId')) partsExternalId = externalId.strip().split('#') externalId = partsExternalId[0] if len(partsExternalId) > 0 else "" CXMLHelper.setValue( CXMLHelper.addElement(eventElement, 'NHISTORY'), # номер истории болезни externalId[:50]) if forceInt(record.value('eventAidUnitCode')) > 0: CXMLHelper.setValue( CXMLHelper.addElement( eventElement, 'IDSP'), # Код способа оплаты медицинской помощи forceInt(record.value('eventAidUnitCode'))) #atronah: принято решение, что для случая кол-во всегда 1, а цена и сумма равны суммарной стоимости всех услуг CXMLHelper.setValue( CXMLHelper.addElement( eventElement, 'ED_COL'), # количество единиц оплаты медицинской помощи '%.2f' % 1.0) CXMLHelper.setValue( CXMLHelper.addElement(eventElement, 'TARIF'), # тариф '%.2f' % forceDouble(record.value('price'))) CXMLHelper.addElement(eventElement, 'SUMV') # сумма, выставленная к оплате CXMLHelper.addElement( eventElement, 'OPLATA' ) # тип оплаты # 0 - не принято решение об оплате, 1 - полная оплата, 2 - полный отказ, 3 - частичный отказ CXMLHelper.addElement(eventElement, 'SUMP') # сумма, принятая к оплате CXMLHelper.addElement(eventElement, 'SANK_IT') # сумма санкций по случаю return eventElement
def addHeaderElement(self, rootElement, destOKATO): header = CXMLHelper.addElement(rootElement, 'ZGLV') CXMLHelper.setValue( CXMLHelper.addElement(header, 'VERSION'), # Версия взаимодействия self.version[:5]) CXMLHelper.setValue( CXMLHelper.addElement(header, 'DATA'), # Дата QtCore.QDate.currentDate().toString(QtCore.Qt.ISODate)) CXMLHelper.setValue( CXMLHelper.addElement( header, 'OKATO_OMS' ), # Код ОКАТО территории страхования по ОМС (территория, в которую выставляется счет) self.formatOKATO(destOKATO)) return header
def fillPacient(self, patientElement, record): CXMLHelper.setValue( CXMLHelper.addElement(patientElement, 'VPOLIS'), # тип полиса forceInt(record.value('policyKindCode'))) policySerial = forceStringEx(record.value('policySerial')) if policySerial.lower() != u'еп' and len(policySerial) > 0: CXMLHelper.setValue( CXMLHelper.addElement(patientElement, 'SPOLIS'), # серия полиса policySerial[:10]) CXMLHelper.setValue( CXMLHelper.addElement(patientElement, 'NPOLIS'), # номер полиса forceStringEx(record.value('policyNumber'))[:20])
def addAccountElement(self, rootElement, record): account = CXMLHelper.addElement(rootElement, 'SCHET') accDate = forceDate(record.value('settleDate')) CXMLHelper.setValue( CXMLHelper.addElement(account, 'YEAR'), # отчетный год accDate.year()) CXMLHelper.setValue( CXMLHelper.addElement(account, 'MONTH'), # отчетный месяц accDate.month()) CXMLHelper.setValue( CXMLHelper.addElement(account, 'NSCHET'), # номер счета forceStringEx(record.value('number')).split(u'/п')[0][:15]) CXMLHelper.setValue( CXMLHelper.addElement(account, 'DSCHET'), # дата выставления счёта forceDate(record.value('exposeDate')).toString(QtCore.Qt.ISODate)) CXMLHelper.setValue( CXMLHelper.addElement(account, 'SUMMAV'), # сумма, выставленная на оплату '%.2f' % forceDouble(record.value('sum'))) CXMLHelper.setValue( CXMLHelper.addElement(account, 'SUMMAP'), # сумма, принятая к оплате '%.2f' % forceDouble(record.value('summap'))) CXMLHelper.setValue( CXMLHelper.addElement(account, 'SANK_MEK'), # финансовые санкции (МЭК) '%.2f' % forceDouble(record.value('sank_mek'))) CXMLHelper.setValue( CXMLHelper.addElement(account, 'SANK_MEE'), # финансовые санкции (МЭЭ) '%.2f' % 0.0) CXMLHelper.setValue( CXMLHelper.addElement(account, 'SANK_EKMP'), # финансовые санции (ЭКМП) '%.2f' % 0.0) return account
def process(self, accountId): self.isAbort = False self.phaseReset(11) db = QtGui.qApp.db tableOrganisation = self._db.table('Organisation') tableAccount = self._db.table('Account') tableContract = self._db.table('Contract') tableContractPayer = tableOrganisation.alias( 'ContractPayer') # Сторонний фонд, в который происходит выгрузка tableContractRecipient = tableOrganisation.alias( 'ContractRecipient') # Текущий фонд, откуда происходит выгрузка queryTable = tableAccount.innerJoin( tableContract, tableContract['id'].eq(tableAccount['contract_id'])) queryTable = queryTable.innerJoin( tableContractPayer, tableContractPayer['id'].eq(tableContract['payer_id'])) queryTable = queryTable.innerJoin( tableContractRecipient, tableContractRecipient['id'].eq(tableContract['recipient_id'])) cols = [ tableAccount['settleDate'], tableAccount['number'], tableAccount['exposeDate'], tableAccount['sum'], tableContractPayer['OKATO'].alias('payerOKATO'), tableContractPayer['infisCode'].alias('payerInfis'), tableContractPayer['area'].alias('payerArea'), tableContractRecipient['OKATO'].alias('recipientOKATO'), tableContractRecipient['infisCode'].alias('recipientInfis') ] self.nextPhase(3, u'Загрузка данных по счету') accountRecord = self._db.getRecordEx( queryTable, cols, where=tableAccount['id'].eq(accountId)) currentInfis = forceStringEx(accountRecord.value('recipientInfis')) insuranceArea = forceStringEx(accountRecord.value('payerArea')) insurerFundOKATO = forceStringEx(accountRecord.value('payerOKATO')) insurerFundInfis = forceStringEx(accountRecord.value('payerInfis')) tableAccount = db.table('Account') tableAccountItem = db.table('Account_Item') tablePayRefuseType = db.table('rbPayRefuseType') tableEvent = db.table('Event') tableMedicalAidUnit = db.table('rbMedicalAidUnit') tableClientPolicy = db.table('ClientPolicy') tablePolicyKind = db.table('rbPolicyKind') cols = [ # account tableAccount['settleDate'], tableAccount['number'], tableAccount['exposeDate'], tableAccount['sum'], tableAccount['payedSum'].alias('summap'), tableAccount['refusedSum'].alias('sank_mek'), # client tableClientPolicy['id'].alias('clientPolicyId'), tablePolicyKind['federalCode'].alias('policyKindCode'), tableClientPolicy['serial'].alias('policySerial'), tableClientPolicy['number'].alias('policyNumber'), # event tableEvent['id'].alias('eventId'), tableEvent['externalId'], tableMedicalAidUnit['federalCode'].alias('eventAidUnitCode'), tableAccountItem['price'], tableAccountItem['sum'].alias('sumv'), u'''IF(Account_Item.date IS NULL AND Account_Item.refuseType_id IS NULL, 0, IF(Account_Item.date IS NOT NULL AND Account_Item.refuseType_id IS NULL, 1, 2)) AS oplata''', 'if(%s IS NULL, Account_Item.sum, 0) AS sump' % tablePayRefuseType['id'], 'if(%s IS NOT NULL, Account_Item.sum, 0) AS sank_it' % tablePayRefuseType['id'], # sank tablePayRefuseType['flatCode'].alias('refuseTypeCode') ] queryTable = tableAccount.innerJoin( tableAccountItem, tableAccountItem['master_id'].eq(tableAccount['id'])) queryTable = queryTable.innerJoin( tableEvent, tableEvent['id'].eq(tableAccountItem['event_id'])) queryTable = queryTable.leftJoin(tableClientPolicy, [ tableClientPolicy['client_id'].isNotNull(), '''ClientPolicy.id = (SELECT MAX(cp.id) FROM ClientPolicy cp WHERE cp.client_id = Event.client_id AND cp.deleted = 0)''' ]) queryTable = queryTable.leftJoin( tablePolicyKind, tablePolicyKind['id'].eq(tableClientPolicy['policyKind_id'])) queryTable = queryTable.leftJoin( tableMedicalAidUnit, tableMedicalAidUnit['id'].eq(tableAccountItem['unit_id'])) queryTable = queryTable.leftJoin(tablePayRefuseType, [ tablePayRefuseType['id'].eq(tableAccountItem['refuseType_id']), tableAccountItem['date'].isNotNull() ]) cond = [ tableAccount['id'].eq(accountId), tableAccountItem['deleted'].eq(0) ] self.nextPhaseStep(u'Загрузка данных по счету') recordList = self._db.getRecordList(queryTable, cols, where=cond) self.nextPhaseStep(u'Загрузка данных завершена') self.accCodeToAccountItemId.clear() entries = {} events = {} idCaseCounter = 0 entryCounter = {} sankCounter = {} self.orgForDeferredFilling.clear() self.personSpecialityForDeferredFilling.clear() eventsTotal = {} oplataTotal = {} sankTotal = {} accountTotal = {} self.nextPhase(len(recordList), u'Обработка позиций счета') for record in recordList: if self.isAbort: self.onAborted() return False if not self.fileNames.has_key(insuranceArea): self.fileNames[insuranceArea] = (insurerFundInfis, currentInfis) if not self.documents.has_key(insuranceArea): self.documents[insuranceArea] = self.createXMLDocument( accountRecord, insurerFundOKATO) doc, accountElement = self.documents[insuranceArea] rootElement = CXMLHelper.getRootElement(doc) clientPolicyId = forceRef(record.value('clientPolicyId')) if not entries.has_key(clientPolicyId): entryCounter[insuranceArea] = entryCounter.setdefault( insuranceArea, 0) + 1 entries[clientPolicyId] = self.addEntryElement( rootElement, record, entryCounter[insuranceArea]) entryElement, _ = entries[clientPolicyId] eventId = forceStringEx(record.value('eventId')) if not events.has_key(eventId): sankTotal[eventId] = {} partsExternalId = forceStringEx( record.value('externalId')).strip().split('#') if len(partsExternalId) >= 3: idCaseCounter = max(idCaseCounter, partsExternalId[2]) events[eventId] = self.addEventElement( entryElement, partsExternalId[2] if len(partsExternalId) >= 3 else None, record) eventElement = events[eventId] refuseTypeCode = forceStringEx(record.value('refuseTypeCode')) if refuseTypeCode: if not sankTotal[eventId].has_key(refuseTypeCode): sankCounter[eventId] = sankCounter.setdefault(eventId, 0) + 1 sankTotal[eventId][refuseTypeCode] = [ self.addSankElement(eventElement, sankCounter[eventId], record=record), 0 ] sankTotal[eventId][refuseTypeCode][1] += forceDouble( record.value('sumv')) if not eventsTotal.has_key(eventId): eventsTotal[eventId] = [0] * 3 oplataTotal[eventId] = [0, 1] eventsTotal[eventId][0] += forceDouble(record.value('sumv')) eventsTotal[eventId][1] += forceDouble(record.value('sump')) eventsTotal[eventId][2] += forceDouble(record.value('sank_it')) oplataTotal[eventId][0] += 1 oplataTotal[eventId][1] *= forceInt(record.value('oplata')) self.nextPhaseStep() for elementIdCase in self.notIdCase: idCaseCounter = forceInt(idCaseCounter) + 1 CXMLHelper.setValue(elementIdCase, idCaseCounter) self.nextPhase(len(eventsTotal), u'Заполнение данных о стоимости случаев') for eventId, total in eventsTotal.iteritems(): eventElement = events[eventId] element = eventElement.firstChildElement('OPLATA') CXMLHelper.setValue( element, 0 if oplataTotal[eventId][1] == 0 else 1 if oplataTotal[eventId][1] == 1 else 2 if oplataTotal[eventId][1] % oplataTotal[eventId][0] == 0 else 3) if self.isAbort: self.onAborted() return False for index, elemName in enumerate(['SUMV', 'SUMP', 'SANK_IT']): element = eventElement.firstChildElement(elemName) CXMLHelper.setValue(element, '%.2f' % total[index]) if not accountTotal.has_key(insuranceArea): accountTotal[insuranceArea] = [0] * 3 accountTotal[insuranceArea][index] += total[index] for refuseTypeCode, total in sankTotal[eventId].iteritems(): sankElement = sankTotal[eventId][refuseTypeCode][0] element = sankElement.firstChildElement('S_SUM') CXMLHelper.setValue(element, '%.2f' % total[1]) self.nextPhaseStep() self.nextPhase(len(accountTotal), u'Заполнение данных об общей стоимости счетов') for insuranceArea, total in accountTotal.iteritems(): if self.isAbort: self.onAborted() return False _, accountElement = self.documents[insuranceArea] for index, elemName in enumerate(['SUMMAV', 'SUMMAP', 'SANK_MEK']): element = accountElement.firstChildElement(elemName) CXMLHelper.setValue(element, '%.2f' % total[index]) self.nextPhaseStep() self.logger().info(u'Завершено') if self.isAbort: self.onAborted() return False return True
def setRecordValuesToElement(self, element, record, fields): for field in fields: CXMLHelper.setValue( CXMLHelper.addElement(element, forceStringEx(field).upper()), self.getValue(record, field))