예제 #1
0
    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()
예제 #2
0
 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
예제 #3
0
    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
예제 #4
0
    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()
예제 #5
0
    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()
예제 #6
0
    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))