예제 #1
0
 def loadItems(self):
     items = []
     if self._orgStructure:
         items.append((None, u'<все>'))
         osList = getOrgStructureDescendants(self._orgStructure)
         for item in self._db.getRecordList(
                 self._tbl, (self._tbl_ah['KLADRStreetCode'], ),
                 self._tbl_osa['master_id'].inlist(osList),
                 self._tbl_ah['KLADRStreetCode'], True):
             items.append(
                 (forceString(item.value('KLADRStreetCode')),
                  getStreetName(forceString(item.value('KLADRStreetCode')))
                  or u'<пусто>'))
     return items
예제 #2
0
    def data(self, index, role=QtCore.Qt.DisplayRole):
        column = index.column()
        row = index.row()
        if row < len(self.items):
            if role == QtCore.Qt.EditRole:
                return toVariant(self.items[row][column])

            if role == QtCore.Qt.DisplayRole:
                if column == 0:
                    code = self.items[row][column]
                    return toVariant(getCityName(code) if code else None)
                if column == 1:
                    code = self.items[row][column]
                    return toVariant(getStreetName(code) if code else None)
                else:
                    return toVariant(self.items[row][column])
        elif row == len(self.items):
            if role == QtCore.Qt.EditRole:
                if column == 0:
                    return toVariant('7800000000000')
        return QtCore.QVariant()
예제 #3
0
 def loadChildren(self):
     if not self._orgStructureId:
         return []
     items = [
         CStreetItem(self, u'<все>', (None, None), self._orgStructureId)
     ]
     db = QtGui.qApp.db  # type: library.database.CMySqlDatabase
     tbl_osa = db.table('OrgStructure_Address')
     tbl_ah = db.table('AddressHouse')
     tbl = tbl_osa.innerJoin(tbl_ah, tbl_osa['house_id'].eq(tbl_ah['id']))
     for item in db.getRecordList(
             tbl, (tbl_ah['KLADRStreetCode'], ),
             tbl_osa['master_id'].inlist(
                 getOrgStructureDescendants(self._orgStructureId)),
             tbl_ah['KLADRStreetCode'], True):
         items.append(
             CStreetItem(
                 self,
                 getStreetName(forceString(item.value('KLADRStreetCode')))
                 or u'<пусто>',
                 (forceString(item.value('KLADRStreetCode')), None),
                 self._orgStructureId))
     return items
예제 #4
0
def formatAddressHL7(clientId):
    if forceRef(clientId):
        # <улица> ^ <другое указание> ^ <город> ^ <штат, провинция или другая административная единица> ^
        # <почтовый индекс> ^ <страна> ^ <тип> ^ <другие географические указания>
        parts = []
        freeInput, KLADRCode, KLADRStreetCode, number, corpus, flat = \
            getClientAddressEx(clientId)
        other = []

        if KLADRStreetCode:
            parts.append(getStreetName(KLADRStreetCode))
        if number:
            other.append(u'д. ' + number)
        if corpus:
            other.append(u'к. ' + corpus)
        if flat:
            other.append(u'кв. ' + flat)
        if other != []:
            parts.append(' ,'.join(other))
        if KLADRCode:
            parts.append(getCityName(KLADRCode))
        return '^'.join(parts)

    return ''
예제 #5
0
    def genDetalizationByHouses(self, itemID, table, params, parentRow=-1):
        endDate = params.get('endDate', QtCore.QDate())
        ageFrom = params.get('ageFrom', 0)
        ageTo = params.get('ageTo', 150)
        socStatusClassId = params.get('socStatusClassId', None)
        socStatusTypeId = params.get('socStatusTypeId', None)
        query = selectDataByHouses(endDate, ageFrom, ageTo, itemID,
                                   socStatusTypeId, socStatusClassId)
        reportData = {}
        mapAreaIdToNetId = {}
        mapNetIdToNet = {}
        while query.next():
            record = query.record()
            age = forceInt(record.value('clientAge'))
            sex = forceInt(record.value('clientSex'))
            netId = getOrgStructureNetId(itemID)
            net = CNet(netId)

            if net.applicable(sex, fakeAgeTuple(age)):
                reportRow = {
                    'street': '',
                    'num': '',
                    'total': 0,
                    'mp': 0,
                    'mnp': 0,
                    'wp': 0,
                    'wnp': 0,
                    'attached': 0,
                    'confirmed': 0
                }
                houseID = forceInt(record.value('HouseID'))
                street = forceString(record.value('street'))
                num = forceString(record.value('num'))
                build = forceString(record.value('build'))
                mp = forceBool(record.value('MenPensioner'))
                wp = forceBool(record.value('WomPensioner'))
                mnp = forceBool(record.value('MenNonPensioner'))
                wnp = forceBool(record.value('WomNonPensioner'))
                cnt = forceInt(record.value('cnt'))
                attached = forceBool(record.value('Attached'))
                confirmed = forceBool(record.value('confirmed'))

                if not houseID in reportData.keys():
                    reportRow['street'] = getStreetName(street)
                    reportRow['num'] = num
                    if build:
                        reportRow['num'] = reportRow['num'] + u' к.' + build
                    reportData[houseID] = reportRow
                if mp:
                    reportData[houseID]['mp'] += cnt
                if mnp:
                    reportData[houseID]['mnp'] += cnt
                if wp:
                    reportData[houseID]['wp'] += cnt
                if wnp:
                    reportData[houseID]['wnp'] += cnt
                if attached:
                    reportData[houseID]['attached'] += cnt
                if confirmed:
                    reportData[houseID]['confirmed'] += cnt
                reportData[houseID]['total'] += cnt

        cnt = 0
        for house in reportData.keys():
            #распихаем всё по столбикам таблицы и дело с концом
            i = table.addRow()
            table.setText(i, 0, reportData[house]['street'])
            table.setText(i, 1, reportData[house]['num'])
            table.setText(i, 2, reportData[house]['total'])
            table.setText(i, 3, reportData[house]['mnp'])
            table.setText(i, 4, reportData[house]['mp'])
            table.setText(i, 5, reportData[house]['wnp'])
            table.setText(i, 6, reportData[house]['wp'])
            table.setText(i, 7, reportData[house]['attached'])
            table.setText(i, 8, reportData[house]['confirmed'])
            cnt += reportData[house]['confirmed']
        if parentRow >= 0:
            table.setText(parentRow,
                          8,
                          cnt,
                          CReportBase.TableTotal,
                          clearBefore=True)
예제 #6
0
파일: ExportHL7.py 프로젝트: dio4/vista_1
    def writeStaffId(self, record,  eventType):
        isRetired = forceBool(record.value('retired'))
        id = forceInt(record.value('id'))
        INN = forceString(record.value('INN'))
        SNILS = forceString(record.value('SNILS'))
        document = getPersonDocument(id)
        regAddress = getPersonAddress(id,  0)
        localAddress = getPersonAddress(id,  1)
        self.writeStartElement('n:STF')
        sex = forceString(record.value('sex'))

        if INN:
            self.writeStartElement('n:STF.2')
            self.writeTextElement('n:CX.1',  INN)
            self.writeTextElement('n:CX.5',  'TAX')
            self.writeEndElement() # stf.2

        if SNILS:
            self.writeStartElement('n:STF.2')
            self.writeTextElement('n:CX.1',  SNILS)
            self.writeTextElement('n:CX.5',  'PEN')
            self.writeEndElement() # stf.2

        if forceString(record.value('federalCode')):
            self.writeStartElement('n:STF.2')
            self.writeTextElement('n:CX.1',  forceString(record.value('federalCode')))
            self.writeTextElement('n:CX.5',  'SR')
            self.writeEndElement() # stf.2

        if forceString(record.value('regionalCode')):
            self.writeStartElement('n:STF.2')
            self.writeTextElement('n:CX.1',  forceString(record.value('regionalCode')))
            self.writeTextElement('n:CX.5',  'RRI')
            self.writeEndElement() # stf.2

        if document:
            docNumber = u'%s %s' % (forceString(document.value('serial')),\
                forceString(document.value('number')))
            docDate = forceDate(document.value('date'))
            self.writeStartElement('n:STF.2')
            self.writeTextElement('n:CX.1',  docNumber)
            self.writeTextElement('n:CX.5',  'PPN')

            if document.value('origin'):
                self.writeStartElement('n:CX.6')
                self.writeTextElement('n:HD.1', forceString(document.value('origin')))
                self.writeEndElement() #cx.6

            dateStr = forceDate(document.value('date')).toString('yyyyMMdd')
            if dateStr:
                self.writeStartElement('n:CX.7')
                self.writeTextElement('n:TS.1',  dateStr)
                self.writeEndElement() # cx.7

            self.writeTextElement('n:CX.7',  'PPN')
            self.writeEndElement() # stf.2

        if sex:
            self.writeTextElement('n:STF.5',  sex)


        self.writeStartElement('n:STF.3')
        self.writeStartElement('n:XPN.1')
        self.writeTextElement('n:FN.1',  forceString(record.value('lastName')))
        self.writeEndElement() # xpn.1
        self.writeTextElement('n:XPN.2', forceString(record.value('firstName')))
        self.writeTextElement('n:XPN.3', forceString(record.value('patrName')))
        self.writeTextElement('n:XPN.7', 'L')
        self.writeEndElement() # stf.3

        dateStr = forceDate(record.value('birthDate')).toString('yyyyMMdd')
        if dateStr:
            self.writeStartElement('n:STF.6')
            self.writeTextElement('n:TS.1',  dateStr)
            self.writeEndElement() # stf.6

        self.writeTextElement('n:STF.7',  'I' if isRetired else 'A')

        if regAddress:
            regAddressId = forceRef(regAddress.value('address_id'))
            if regAddressId:
                address = getAddress(regAddressId)
                self.writeStartElement('n:STF.11')
                #self.writeTextElement('n:XAD.5', ) # zip code (index)
                self.writeTextElement('n:XAD.7', 'L')
                if address.freeInput:
                    self.writeTextElement('n:XAD.8', u'%s' % (address.freeInput))
                else:
                    self.writeTextElement('n:XAD.8',  u'%s, %s, д.%s, корпус. %s, кв. %s' % (
                        getCityName(address.KLADRCode),
                        getStreetName(address.KLADRStreetCode),
                        address.number,
                        address.corpus,
                        address.flat))
                self.writeEndElement() # stf.11

        if localAddress:
            localAddressId = forceRef(localAddress.value('address_id'))
            if localAddressId:
                address = getAddress(localAddressId)
                self.writeStartElement('n:STF.11')
                #self.writeTextElement('n:XAD.5', ) # zip code (index)
                self.writeTextElement('n:XAD.7', 'H')
                if address.freeInput:
                    self.writeTextElement('n:XAD.8', u'%s' % (address.freeInput))
                else:
                    self.writeTextElement('n:XAD.8',  u'%s, %s, д.%s, корпус. %s, кв. %s' % (
                        getCityName(address.KLADRCode),
                        getStreetName(address.KLADRStreetCode),
                        address.number,
                        address.corpus,
                        address.flat))
                self.writeEndElement() # stf.11

        if forceString(record.value('birthPlace')):
            self.writeStartElement('n:STF.11')
            #self.writeTextElement('n:XAD.5', ) # zip code (index)
            self.writeTextElement('n:XAD.3', forceString(record.value('birthPlace')))
            self.writeTextElement('n:XAD.6', 'RUS')
            self.writeTextElement('n:XAD.7', 'N')
            self.writeEndElement() # stf.11

        if eventType == 1: # прием на работу
            if forceString(record.value('org_name')):
                hireDate = getPersonHireDate(id)
                if hireDate:
                    self.writeStartElement('n:STF.12')
                    self.writeStartElement('n:DIN.1')
                    self.writeTextElement('n:TS.1',  hireDate.toString('yyyyMMdd'))
                    self.writeEndElement() # din.1
                    self.writeStartElement('n:DIN.2')
                    self.writeTextElement('n:CE.1', forceString(record.value('org_OKPO')))
                    self.writeTextElement('n:CE.2',  forceString(record.value('org_name')))
                    self.writeTextElement('n:CE.3', '1.2.643.2.40.5.0.7')
                    self.writeTextElement('n:CE.4',  forceString(record.value('org_OGRN')))
                    self.writeTextElement('n:CE.6', '1.2.643.2.40.3.1')
                    self.writeEndElement() # din.2
                    self.writeEndElement() # stf.12
                else:
                    raise CException(u'Отсутствует приказ о приеме на работу.')

        if eventType == 6: # увольнение с работы
            if forceString(record.value('org_name')):
                fireDate = getPersonFireDate(id)
                if fireDate:
                    self.writeStartElement('n:STF.12')
                    self.writeStartElement('n:DIN.1')
                    self.writeTextElement('n:TS.1',  fireDate.toString('yyyyMMdd'))
                    self.writeEndElement() # din.1
                    self.writeStartElement('n:STF.13')
                    self.writeStartElement('n:DIN.2')
                    self.writeTextElement('n:CE.1', forceString(record.value('org_OKPO')))
                    self.writeTextElement('n:CE.2',  forceString(record.value('org_name')))
                    self.writeTextElement('n:CE.3', '1.2.643.2.40.5.0.7')
                    self.writeTextElement('n:CE.4',  forceString(record.value('org_OGRN')))
                    self.writeTextElement('n:CE.6', '1.2.643.2.40.3.1')
                    self.writeEndElement() # din.2
                    self.writeEndElement() # stf.13
                else:
                    raise CException(u'Отсутствует приказ об увольнении с работы.')

        self.writeTextElement('n:STF.18',  forceString(record.value('post_name')))

        self.writeStartElement('n:STF.19')
        self.writeTextElement('n:JCC.1',  forceString(record.value('post_code')))
        self.writeTextElement('n:JCC.3',  forceString(record.value('post_name')))
        self.writeEndElement() #stf.19

        self.writeEndElement()
예제 #7
0
 def writePatientPerson(self, record):
     self.writeStartElement('patientPerson')
     self.writeStartElement('name')
     self.writeTextElement('family', forceString(record.value('lastName')))
     self.writeTextElement('given', forceString(record.value('firstName')))
     if forceString(record.value('patrName')):
         self.writeTextElement('given',
                               forceString(record.value('patrName')))
     self.writeEndElement()
     if forceString(record.value('clientContact')) and forceString(
             record.value('contactTypeCode')):
         contactType = forceInt(record.value('contactTypeCode'))
         if contactType == 4:
             type = u'mailto:'
         else:
             type = u'tel:'
         self.writeStartElement('telecom')
         self.writeAttribute(
             'value', type + forceString(record.value('clientContact')))
         self.writeEndElement()
     self.writeStartElement('administrativeGenderCode')
     self.writeAttribute('code', forceString(record.value('sex')))
     self.writeAttribute('codeSystem', u'1.2.643.5.1.13.2.1.1.156')
     self.writeEndElement()
     self.writeStartElement('birthTime')
     if forceTime(record.value('birthTime')).toString('hhmmss') != '000000':
         self.writeAttribute(
             'value',
             forceDate(record.value('birthDate')).toString('yyyyMMdd') +
             forceTime(record.value('birthTime')).toString('hhmmss'))
     else:
         self.writeAttribute(
             'value',
             forceDate(record.value('birthDate')).toString('yyyyMMdd'))
     self.writeEndElement()
     KLADRCode = forceString(record.value('KLADRCode'))
     KLADRStreetCode = forceString(record.value('KLADRStreetCode'))
     freeInput = forceString(record.value('freeInput'))
     if freeInput or KLADRCode:
         self.writeStartElement('addr')
         if forceInt(record.value('KLADRCode')) and forceInt(
                 record.value('KLADRStreetCode')):
             houseNumber = forceString(record.value('houseNumber'))
             houseCorpus = forceString(record.value('corpus'))
             flat = forceString(record.value('flat'))
             if KLADRCode:
                 self.writeTextElement('country', u'Российская Федерация')
                 region = getMainRegionName(KLADRCode)
                 city = getCityName(KLADRCode)
                 # FIXME: лучше, наверное, определять города федерального подчинения по полю STATUS в кладре.
                 if region != city:
                     self.writeTextElement('state', region)
                 self.writeTextElement('city', city)
                 self.writeTextElement('unitID', KLADRCode)
             #FIXME: если выгрузка будет медленно работать, возможно стоит заменить getStreetName на обработку полей из уже имеющегося запроса
             if KLADRStreetCode:
                 self.writeTextElement('streetName',
                                       getStreetName(KLADRStreetCode))
             if houseNumber:
                 self.writeTextElement('houseNumber', houseNumber)
             # FIXME: что делать с корпусом???
             if flat:
                 self.writeTextElement('additionalLocator', flat)
         if freeInput:
             self.writeTextElement('streetAddressLine', freeInput)
         self.writeEndElement()
     self.writeComment(u'социальный статус')
     #self.writeAsMemberSoc(record)
     self.writeComment(u'льготная категория населения')
     #self.writeAsMemberFacilities(record)
     self.writeComment(u'СНИЛС')
     if forceString(record.value('SNILS')):
         self.writeAsOtherDsSNILS(record)
     self.writeComment(u'ОМС')
     if forceString(record.value('policyNumber')) and forceString(record.value('policySerial')) and forceString(record.value('insurerName'))\
             or forceString(record.value('policyNumber')) and forceString(record.value('policySerial')):
         self.writeAsOtherDsOMS(record)
     self.writeComment(u'паспорт')
     if forceString(record.value('documentNumber')) and forceString(record.value('documentSerial')) and forceString(record.value('documentOrg'))\
             or forceString(record.value('documentNumber')) and forceString(record.value('documentSerial')):
         self.writeAsOtherDsPass(record)
     self.writeComment(u'место рождения')
     #self.writeBirthPlace(record)
     self.writeEndElement()
예제 #8
0
    def build(self, params):
        date = params['date']
        age_start = params['ageFrom']
        age_end = params['ageTo']
        soc_class = params['socStatusClassId']
        soc_type = params['socStatusTypeId']
        org_structure = params['orgStructureId']
        address_street = params['addressStreet']
        address_house = params['addressHouse']

        query = select_data(date, age_start, age_end, soc_class, soc_type,
                            org_structure, address_street, address_house)

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

        columns = (
            ('%30', [u'Улица'], CReportBase.AlignLeft),
            ('%30', [u'Дом'], CReportBase.AlignLeft),
            ('%30', [u'Квартира'], CReportBase.AlignLeft),
            ('%30', [u'Ф.И.О.'], CReportBase.AlignLeft),
            ('%30', [u'Год рождения'], CReportBase.AlignLeft),
            ('%30', [u'Дата постановки на учет'], CReportBase.AlignLeft),
            ('%30', [u'Диагноз'], CReportBase.AlignLeft),
        )

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

        table = createTable(cursor, columns)

        last = {
            'street': '',
            'street_row': 1,
            'house': '',
            'house_row': 1,
            'flat': '',
            'flat_row': 1,
        }

        def merge_flat(row):
            table.mergeCells(last['flat_row'], 2, (row - last['flat_row']), 1)

        def merge_house(row):
            table.mergeCells(last['house_row'], 1, (row - last['house_row']),
                             1)
            merge_flat(row)
            last['flat'] = ''
            last['flat_row'] = row

        def merge_street(row):
            table.mergeCells(last['street_row'], 0, (row - last['street_row']),
                             1)
            merge_house(row)
            last['house'] = ''
            last['house_row'] = row

        while query.next():
            rec = query.record()
            i = table.addRow()

            street = forceString(rec.value('street'))
            if street != last['street']:
                merge_street(i)
                table.setText(i, 0, getStreetName(street))
                last['street'] = street
                last['street_row'] = i

            house = forceString(rec.value('house'))
            if house != last['house']:
                merge_house(i)
                table.setText(i, 1, house)
                last['house'] = house
                last['house_row'] = i

            flat = forceString(rec.value('flat'))
            if flat != last['flat']:
                merge_flat(i)
                table.setText(i, 2, flat)
                last['flat'] = flat
                last['flat_row'] = i

            table.setText(i, 3, forceString(rec.value('name')))
            table.setText(i, 4, forceString(rec.value('birthYear')))
            table.setText(i, 5, forceString(rec.value('monitoringStart')))
            table.setText(i, 6, forceString(rec.value('diagnosis')))

        merge_street(table.rows())

        return doc