def __init__(self, parent, eventId): QtCore.QObject.__init__(self, parent) db = QtGui.qApp.db self._parent = parent self._id = eventId self._record = db.getRecord('Event', '*', eventId) self.eventTypeId = forceRef(self._record.value('eventType_id')) self.eventSetDateTime = forceDateTime(self._record.value('setDate')) self.eventDate = forceDate(self._record.value('execDate')) self.personId = forceRef(self._record.value('setPerson_id')) orgId = forceRef(self._record.value('org_id')) self.orgId = orgId if orgId else QtGui.qApp.currentOrgId() self.personSpecialityId = forceRef(db.translate('Person', 'id', self.personId, 'speciality_id')) self.contractId = forceRef(self._record.value('contract_id')) if self.contractId: self.eventFinanceId = forceRef(db.translate('Contract', 'id', self.contractId, 'finance_id')) else: self.eventFinanceId = getEventFinanceId(self.eventTypeId) self.clientId = forceRef(self._record.value('client_id')) self.clientInfo = getClientInfo(self.clientId) try: clientKLADRCode = self.clientInfo.regAddressInfo.KLADRCode except: clientKLADRCode = '' if KLADRMatch(clientKLADRCode, QtGui.qApp.defaultKLADR()): self.clientType = CFakeEventEditor.ctLocal elif KLADRMatch(clientKLADRCode, QtGui.qApp.provinceKLADR()): self.clientType = CFakeEventEditor.ctProvince else: self.clientType = CFakeEventEditor.ctOther self.clientSex = self.clientInfo.sexCode self.clientBirthDate = self.clientInfo.birthDate self.clientAge = calcAgeTuple(self.clientBirthDate, self.eventDate) workRecord = getClientWork(self.clientId) self.clientWorkOrgId = forceRef(workRecord.value('org_id')) if workRecord else None self.clientPolicyInfoList = [] policyRecord = self.clientInfo.compulsoryPolicyRecord if policyRecord: self.clientPolicyInfoList.append(self.getPolicyInfo(policyRecord)) policyRecord = self.clientInfo.voluntaryPolicyRecord if policyRecord: self.clientPolicyInfoList.append(self.getPolicyInfo(policyRecord)) self.personCache = {} self.contractTariffCache = CContractTariffCache()
def getWorkRecord(self, clientId, post): organisationId = forceRef(self.workOrgId) post = forceStringEx(post) workRecord = getClientWork(clientId) if workRecord is not None: recordChanged = ( organisationId != forceRef(workRecord.value('org_id')) or post != forceString(workRecord.value('post'))) else: recordChanged = True if recordChanged: record = QtGui.qApp.db.record('ClientWork') record.setValue('client_id', toVariant(clientId)) record.setValue('org_id', toVariant(organisationId)) record.setValue('post', toVariant(post)) else: record = workRecord return record, recordChanged
def getContract(self, eventRec, clientRec=None): eventTypeId = forceRef(eventRec.value('eventType_id')) financeId = getEventFinanceId(eventTypeId) setDate = forceDate(eventRec.value('setDate')) execDate = forceDate(eventRec.value('execDate')) clientId = forceRef(eventRec.value('client_id')) clientPolicyId = forceRef(eventRec.value('clientPolicy_id')) orgId = forceRef(eventRec.value('org_id')) self.contractModel.setOrgId(orgId) self.contractModel.setCheckMaxClients(True) self.contractModel.setBegDate(setDate) self.contractModel.setEndDate(execDate) self.contractModel.setEventTypeId(eventTypeId) self.contractModel.setFinanceId(financeId) if clientId: clientSex = forceInt(clientRec.value('sex')) clientAge = calcAgeTuple(forceDate(clientRec.value('birthDate')), setDate) clientWorkRecord = getClientWork(clientId) clientWorkOrgId = forceRef( clientWorkRecord.value('org_id')) if clientWorkRecord else None policyRec = self.db.getRecord('ClientPolicy', 'insurer_id, policyType_id', clientPolicyId) insurerId, policyTypeId = ( forceRef(policyRec.value('insurer_id')), forceRef( policyRec.value('policyType_id'))) if policyRec else (None, None) clientPolicyInfoList = [(insurerId, policyTypeId)] self.contractModel.setClientInfo(clientId, clientSex, clientAge, clientWorkOrgId, clientPolicyInfoList) self.contractData.select(self.contractModel) return self.contractData.idList[0] if self.contractData.idList else None
def setType(self, type_): self.type_ = type_ filter = 'type=%d' % self.type_ self.cmbDoctype.setTable('rbTempInvalidDocument', False, filter) self.cmbReason.setTable('rbTempInvalidReason', False, filter) self.cmbExtraReason.setTable('rbTempInvalidExtraReason', True, filter) self.modelPeriods.setType(self.type_) for widget in [ self.lblOtherSex, self.cmbOtherSex, self.lblOtherAge, self.edtOtherAge ]: widget.setVisible(self.type_ == 0) if self.type_ == 0: self.cmbDoctype.setCode(QtGui.qApp.tempInvalidDoctype()) self.cmbReason.setCode(QtGui.qApp.tempInvalidReason()) if (self.clientId and not self.edtPlaceWork.text() and (self.cmbBusyness.value() in (Busyness.NotSet, Busyness.Main))): work = formatWorkTempInvalid(getClientWork(self.clientId)) if work: self.edtPlaceWork.setText(work) self.cmbBusyness.setValue(Busyness.Main) self.getBlankParams()
def process(self, dbf, record, orgInfisCode, representativeOutRule): eventId = forceInt(record.value('event_id')) externalId = forceString(record.value('externalId')) clientId = forceInt(record.value('client_id')) birthDate = forceDate(record.value('birthDate')) begDate = forceDate(record.value('begDate')) endDate = forceDate(record.value('endDate')) relegateOrgId = forceRef(record.value('relegateOrgId')) relegateOrgInfisCode = forceString( record.value('relegateOrgInfisCode')) attachInfisCode = forceString(record.value('attachInfisCode')) orgStructureInfisCode = forceString(record.value('infisCode')) sex = forceInt(record.value('sex')) age = max(0, calcAgeInYears(birthDate, endDate)) if age < 18: net = u'д' else: personId = forceRef(record.value('person_id')) net = self.getPersonNet(personId) net = u'ж' if net and net.sex == 2 else u'в' mkb = MKBwithoutSubclassification(forceString(record.value('MKB'))) if len(mkb) == 3: mkb += '.' specialityId = forceRef(record.value('speciality_id')) serviceId = forceRef(record.value('service_id')) serviceDetail = self.serviceDetailCache.get(serviceId) eventAidKindCode = forceString(record.value('medicalAidKindCode')) eventAidTypeCode = forceString(record.value('medicalAidTypeCode')) aidProfileFederalCode, serviceAidKindCode, serviceAidTypeCode = self.getAidCodes( serviceDetail, endDate, specialityId, birthDate, sex, mkb, True) aidKindCode = serviceAidKindCode or eventAidKindCode aidTypeCode = serviceAidTypeCode or eventAidTypeCode policyBegDate = forceDate(record.value('policyBegDate')) policyEndDate = forceDate(record.value('policyEndDate')) policyInsurer = forceString(record.value('policyInsurer')) policyInsurerArea = forceString(record.value('policyInsurerArea')) policyInsurerAreaIsSpb = policyInsurerArea.startswith( '78') or not policyInsurerArea docType = forceString(record.value('documentType')) documentRegionalCode = forceString( record.value('documentRegionalCode')) docSerial = forceStringEx(record.value('documentSerial')) docNumber = forceString(record.value('documentNumber')) KLADRCode = forceString(record.value('KLADRCode')) KLADRStreetCode = forceString(record.value('KLADRStreetCode')) number = forceString(record.value('number')) corpus = forceString(record.value('corpus')) flat = forceString(record.value('flat')) area, region, npunkt, street, streettype = getInfisCodes( KLADRCode, KLADRStreetCode, number, corpus) if area == u'ЛО': area = u'Ф89' # ? proftype = forceStringEx(record.value('infisDepTypeCode')) if not proftype: if aidTypeCode in ('1', '2', '3'): proftype = u'г' if begDate < endDate else u'о' else: proftype = u'у' clientWork = getClientWork(clientId) representativeInfo = ( self.getClientRepresentativeInfo(clientId) if age <= 14 and (representativeOutRule == 0 or representativeOutRule == 1 and street == '*') else None) if representativeInfo: popDocType = representativeInfo['documentTypeCode'] popDocSerial = representativeInfo['serial'] popDocNumber = representativeInfo['number'] else: popDocType = docType popDocSerial = docSerial popDocNumber = docNumber memoList = [ '\x11[DOPCARD]', 'SER_TYPE=' + self.mapDocTypeToINFISName.get( popDocType, self.mapDocTypeToINFISName[None]), 'PASPORT_S=' + popDocSerial, 'PASPORT_N=' + popDocNumber, 'WorkType=' + (u'Работ' if clientWork and age >= 18 else u'НеРаб'), 'CodeCompany=' + policyInsurer, 'Snils=' + formatSNILS(forceString(record.value('SNILS'))), 'Vpolis=' + (forceString(record.value('policyKind')) or '1') ] if representativeInfo: memoList.append('_mtrpar_=Y') memoList.append('Parstatus=' + representativeInfo['status']) memoList.append('W_p=' + formatSex(representativeInfo['sex']).lower()) memoList.append( 'Dr_p=' + unicode(representativeInfo['birthDate'].toString('dd.MM.yy'))) memoList.append('Parsurname=' + representativeInfo['lastName']) memoList.append('Parname1=' + representativeInfo['firstName']) memoList.append('Parname2=' + representativeInfo['patrName']) memoList.append('Parname=' + representativeInfo['lastName'] + ' ' + representativeInfo['firstName'] + ' ' + representativeInfo['patrName']) else: memoList.append(u'Parstatus=Отсутствует') if street == '*': aidProfileCode = self.getAidCodes(serviceDetail, endDate, specialityId, birthDate, sex, mkb, False)[0] memoList.append('_mtr_=Y') if policyBegDate: memoList.append('Pol_begin=' + unicode(policyBegDate.toString('dd.MM.yy'))) if policyEndDate: memoList.append('Pol_end=' + unicode(policyEndDate.toString('dd.MM.yy'))) memoList.append('AreaInsure=' + area) memoList.append('Company=' + forceString(record.value('policyInsurerName'))) memoList.append('Region=' + region) memoList.append('MTRegion=' + getRegionName(KLADRCode)) memoList.append('F_Placename=' + getExactCityName(KLADRCode)) if KLADRStreetCode: streetName, streetType = getStreetNameParts(KLADRStreetCode) else: streetName = streetType = '' memoList.append('F_Street=' + streetName) memoList.append('F_Streetype=' + streetType) memoList.append('F_House=' + number) memoList.append('F_Korp=' + corpus) memoList.append('F_Flat=' + flat) address = ' '.join(ai for ai in (streetType, streetName, (u'д.' + number) if number else '', (u'к.' + corpus) if corpus else '', (u'кв.' + flat) if flat else '') if ai) memoList.append('F_Address=' + address) if age <= 6: patStatus = u'Дошкольник' elif age <= 13: patStatus = u'Ребенок до 14 лет' elif age <= 17: patStatus = u'Студент/учащийся' else: patStatus = '' if clientWork: post = forceString(clientWork.value('post')).lower() if u'студ' in post or u'учащ' in post: patStatus = u'Студент/учащийся' if patStatus: memoList.append('patStatus=' + patStatus) if clientWork: memoList.append('Job=' + formatWorkPlace(clientWork)) OKSOCode = forceString(record.value('OKSOCode')) memoList.append('MedSpec=' + OKSOCode.lstrip('0')) memoList.append('MTRProf=' + aidProfileCode) memoList.append('Vidpom=' + aidKindCode) memoList.append('Rslt=' + forceString(record.value('eventResultCode'))) memoList.append('Idsp=' + forceString(record.value('unitCode'))) memoList.append('Prof79=' + aidProfileFederalCode) memoList.append('Prvs79=' + forceString(record.value('specialityFederalCode'))) memoList.append('Ishod=' + forceString(record.value('eventResultCode'))) memoList.append('MTRPOLIS_N=' + forceString(record.value('policyNumber'))) memoList.append('Pr_nov=0') serviceInfisCode = serviceDetail.infisCode memoList.append('Typecrd=%d' % ( 0 if len(serviceInfisCode) >= 2 # см. #0003973 в мантисе. and serviceInfisCode[:2].isalpha() and serviceInfisCode[0].islower( ) # а про то - русские это буквы или нет речи не шло. and serviceInfisCode[1].isupper() else 1)) memoList.append('\x1A\x1A') memo = '\r\n'.join(memoList) dbfRecord = dbf.newRecord() dbfRecord[ 'RECIEVER'] = orgStructureInfisCode or orgInfisCode # ИНФИС код подразделения # dbfRecord['RECIEVER']= forceString(record.value('infisInternalCode')) # Код подразделения dbfRecord[ 'PAYER'] = policyInsurer if policyInsurerAreaIsSpb else u'кФонд' # Код СМО, выдавшей полис dbfRecord['TMO'] = ( attachInfisCode or orgInfisCode ) if policyInsurerAreaIsSpb else u'кФонд' # ИНФИС-код организации прикрепления, если нет, то ИНФИС-код базового ЛПУ dbfRecord['SURNAME'] = nameCase(forceString( record.value('lastName'))) # Фамилия пациента dbfRecord['NAME1'] = nameCase(forceString( record.value('firstName'))) # Имя пациента dbfRecord['NAME2'] = nameCase(forceString( record.value('patrName'))) # Отчество пациента dbfRecord['SEX'] = formatSex(sex).lower() # Пол (м/ж) dbfRecord['AGE'] = age # Возраст (на какую дату?) dbfRecord['BIRTHDAY'] = pyDate(birthDate) # дата рождения dbfRecord['SNILS'] = formatSNILS(forceString( record.value('SNILS'))) # СНИЛС dbfRecord['MR'] = forceString( record.value('birthPlace')) # место рождения dbfRecord['STREET'] = street # Адрес пациента: код улицы dbfRecord[ 'STREETYPE'] = streettype if street != '*' else u'' # Адрес пациента: тип улицы dbfRecord['AREA'] = area # Адрес пациента: код районa dbfRecord[ 'HOUSE'] = number if street != '*' else u'' # Адрес пациента: номер дома dbfRecord[ 'KORP'] = corpus if street != '*' else u'' # Адрес пациента: корпус dbfRecord['FLAT'] = forceInt(record.value( 'flat')) if street != '*' else 0 # Адрес пациента: номер квартиры dbfRecord[ 'TYPEDOC'] = documentRegionalCode if documentRegionalCode else self.mapDocTypeToINFIS.get( docType, '5') # Тип документа docSeries = docSerial.split() dbfRecord['SER1'] = docSeries[0] if len( docSeries) >= 1 else '' # Серия документа, левая часть dbfRecord['SER2'] = docSeries[1] if len( docSeries) >= 2 else '' # Серия документа, правая часть dbfRecord['NPASP'] = docNumber # Номер документа dbfRecord['POLIS_S'] = forceString( record.value('policySerial')) # Серия полиса dbfRecord['POLIS_N'] = forceString( record.value('policyNumber')) # Номер полиса dbfRecord[ 'POLIS_W'] = policyInsurer if policyInsurerAreaIsSpb else u'Проч' # Код СМО, выдавшей полис dbfRecord['TYPEINS'] = self.mapPolicyTypeToINFIS.get( forceString(record.value('policyType')), '') dbfRecord['VPOLIS'] = forceString(record.value('policyKind')) or '1' dbfRecord[ 'HSNET'] = net # Тип сети профиля (в - взрослая, д - детская) dbfRecord[ 'WHO'] = relegateOrgInfisCode or orgInfisCode # ИНФИС-код организации направителя, если нет, то ИНФИС-код базового ЛПУ dbfRecord['ORDER'] = u'э' if forceInt( record.value('order') ) == 2 else u'п' # Признак экстренности случая лечения (если случай экстренный - принимает значение "э" или "Э") dbfRecord['HSOBJECT'] = forceString( record.value('infisTariffCode')) # ИНФИС-код подразделения dbfRecord['DEPART'] = forceInt( record.value('infisInternalCode')) # "внутренний код отделения" dbfRecord[ 'PROFILENET'] = net # Тип сети профиля (в - взрослая, д - детская) dbfRecord[ 'PROFILE'] = serviceDetail.infisCode # Код профиля лечения, код услуги, "ДСтац" dbfRecord['DATEIN'] = pyDate(begDate) # Дата начала услуги dbfRecord['DATEOUT'] = pyDate(endDate) # Дата окончания услуги dbfRecord['AMOUNT'] = forceDouble( record.value('amount')) # Объем лечения dbfRecord['SUM'] = forceDouble(record.value('sum')) # Сумма dbfRecord['OUTCOME'] = u'в' # "код исхода лечения" ("в") dbfRecord['DIAGNOSIS'] = mkb # Код диагноза dbfRecord['DIAGNPREV'] = mkb # Код диагноза dbfRecord['VIDPOM'] = aidKindCode dbfRecord['PROF79'] = aidProfileFederalCode dbfRecord['PRVS79'] = forceString( record.value('specialityFederalCode')) dbfRecord['RSLT'] = forceString(record.value('eventResultCode')) dbfRecord['IDSP'] = forceString(record.value('unitCode')) dbfRecord['REMARK'] = memo dbfRecord['PROFTYPE'] = proftype # "код типа отделения" ("д") dbfRecord['TGROUP'] = self.getTariffGroup( record) # Признак превышения предела количества по тарифу dbfRecord['HISTORY'] = str(eventId) # eventId dbfRecord['SEND'] = False # Флаг обработки записи dbfRecord['ERROR'] = '' # Описание ошибки # dbfRecord['ACC_ID'] = forceInt(record.value('account_id')) dbfRecord['ACCITEM_ID'] = forceInt(record.value('accountItem_id')) dbfRecord['CLIENT_ID'] = clientId dbfRecord['EVENT_ID'] = eventId dbfRecord['EXTERNALID'] = externalId #------------------------------------ dbfRecord.store()
def check(self): db = QtGui.qApp.db # my_org_id=QtGui.qApp.currentOrgId() n = 0 q = ''' select Client.id as client_id, Client.lastName, Client.firstName, Client.patrName, Client.birthDate, Client.sex, Client.SNILS from Client where 1 ''' query = db.query(q) query.setForwardOnly(True) n = 0 n_bad = 0 s = query.size() if s > 0: self.progressBar.setMaximum(s - 1) while query.next(): QtGui.qApp.processEvents() if self.abort: break self.progressBar.setValue(n) n += 1 self.item_bad = False record = query.record() def val(name): return record.value(name) client_id = forceInt(val('client_id')) self.client_id = client_id self.itemId = client_id lastName = forceString(val('lastName')) firstName = forceString(val('firstName')) patrName = forceString(val('patrName')) fio = ' '.join([lastName, firstName, patrName]) birthDate = get_date(val('birthDate')) bd_err = '' if birthDate: bd_err = ', ' + forceString(birthDate.strftime('%d.%m.%Y')) self.err_str = 'client ' + forceString( client_id) + ' (' + fio + bd_err + ') ' if not lastName or not firstName or not patrName: self.err2log(u'неполный ФИО') sex = forceInt(val('sex')) if sex not in [1, 2]: self.err2log(u'нет пола') SNILS = forceString(val('SNILS')).strip() if SNILS: if len( db.getRecordList('Client', where='SNILS=\"' + SNILS + '\"')) > 1: self.err2log(u'двойной СНИЛС ' + SNILS) else: self.err2log(u'отсутствует СНИЛС') policy = getClientPolicy(client_id) if policy: self.checkPolicy(policy) else: self.err2log(u'отсутствует полис') work = getClientWork(client_id) if work: self.checkWork(work) else: self.err2log(u'отсутствует работа') if policy and not work: self.err2log(u'указан полис неработающего гражданина') self.checkDocument(client_id) self.checkAddress(client_id) AttachRecord = getAttachRecord(client_id, 0) if not AttachRecord: self.err2log(u'отсутствует постоянное прикрепление') else: LPU_id = AttachRecord['LPU_id'] LPU = QtGui.qApp.db.getRecord('Organisation', 'title, infisCode, net_id', LPU_id) title = forceString(LPU.value('title')) infisCode = LPU.value('infisCode') net_id = LPU.value('net_id') if not infisCode: self.err2log(u'отсутствует код ИНФИС у ' + title) if not net_id: self.err2log(u'отсутствует сеть у ' + title) Event = QtGui.qApp.db.getRecordEx( 'Event', '*', 'client_id=\'' + str(client_id) + '\'') if not Event: self.err2log(u'отсутствуют event\'ы') if self.item_bad: n_bad += 1 self.label.setText(u'%d клиентов всего; %d с ошибками' % (s, n_bad))