Пример #1
0
 def createDbf(self):
     dbfName = os.path.join(self.parent.getTmpDir(),
                            'Fap_' + self.getDbfName() + '.dbf')
     dbf = Dbf(dbfName, new=True, encoding='cp866')
     dbf.addField(
         ('SMO_CODE', 'C',
          4),  # код СМО плательщика (п.1 примечаний); обязательное; SPR02
         (
             'CODE_MO', 'C', 5
         ),  # код структурноего подразделения медицинской организации в системе ОМС(ФАП) (п.7 примечаний); обязательное; SPR01
         (
             'SPV', 'N', 1
         ),  # тип документа, подтверждающего факт страхования по ОМС; обязательное
         (
             'SPS', 'C', 12
         ),  # серия документа, подтверждающего факт страхования по ОМС; обязательное для документов ОМС, имеющих серию
         (
             'SPN', 'C', 20
         ),  # номер документа, подтверждающего факт страхования по ОМС (п.3 примечаний); обязательное
         ('FIO', 'C', 40),  # фамилия (п.4 примечаний); обязательное
         ('IMA', 'C', 40),  # имя (п.4 примечаний); обязательное
         ('OTCH', 'C', 40),  # отчество (п.4 примечаний)
         ('DATR', 'D'),  # дата рождения (п.5 примечаний); обязательное
         (
             'RESULT', 'N', 1
         ),  # результат сверки (п.6 примечаний); обязательное, заполняется СМО по результатам проведенной сверки
     )
     return dbf
Пример #2
0
 def createSpr22Dbf(self):
     dbf = Dbf(self.wizard().getFullDbfFileName('SPR22'),
               new=True,
               encoding='cp866')
     dbf.addField(
         ('CODE_MO', 'C', 5),  # Код МО
         ('KUSL', 'C', 15),  # Код услуги
         ('DATN', 'D', 30),  # Дата начала действия тарифа
         ('DATO', 'D', 30),  # Дата окончания тарифа
         ('TARIF', 'N', 10, 2),  # Стоимость услуги
         # ('TARIF_B',     'N', 10, 2), # Базовая часть стоимости услуги
         # ('TARIF_DM',    'N', 10, 2), # что-то
         # ('TARIF_D',     'N', 10, 2), # Сумма примененных коэффициентов
         # ('TARIF_UC',    'N', 10, 2), # Цена "коэффициента участковости"
         # ('CENA_KD',     'N', 10, 2), # Цена койко-дня
         # ('LEVEL',       'C',  5), # Уровень оказания МП
     )
     return dbf
Пример #3
0
    def openFile(self, fileName):

        archive, nameFiles = getFilesZipArchive(fileName)
        if archive:
            for name in nameFiles:
                if not unicode(name.lower()).endswith('spr20.dbf'):
                    continue
                self.importDBF = getDBFFileFromZipArchive(archive, name)
                break
        else:
            if unicode(fileName.lower()).endswith('spr20.dbf'):
                self.importDBF = Dbf(fileName, encoding='cp866')
        if not self.importDBF:
            self.logBrowser.append(u'В архиве нет spr20.dbf файла.' if archive
                                   else u'Необходимо выбрать файл spr20.dbf.')
            self.logBrowser.update()
            return
        self.btnImport.setEnabled(True)
Пример #4
0
 def openDBF(self):
     dbf = None
     fileName = forceStringEx(self.edtFileName.text())
     result = os.path.isfile(fileName)
     if result:
         dbf = Dbf(fileName, readOnly=True, encoding='cp866')
         fieldsList = ['CODE', 'NAME', 'ORG', 'ISPAY', 'DATN', 'DATO']
         if not dbfCheckNames(dbf, fieldsList):
             raise CException(u'файл %s\nне содержит одного из полей:\n%s' % (fileName, ', '.join(fieldsList)))
         self.labelNum.setText(u'всего записей в источнике: '+str(dbf.recordCount))
     return dbf
Пример #5
0
 def openDBF(self, fileName, fieldsList):
     dbf = None
     result = os.path.isfile(fileName)
     if result:
         dbf = Dbf(fileName, readOnly=True, encoding='cp866')
         if not dbfCheckNames(dbf, fieldsList):
             raise CException(u'файл %s\nне содержит одного из полей:\n%s' %
                              (fileName, ', '.join(fieldsList)))
         self.totalRecordCount += dbf.recordCount
         self.labelNum.setText(u'всего записей в источниках: ' +
                               str(self.totalRecordCount))
     return dbf
Пример #6
0
 def update(self):
     self.clear()
     labels = self._labels.copy()
     isRollback = False
     dbfFile = None
     self._db.transaction()
     try:
         for fileName in self._fileNames:
             if fileName[:1] in labels.keys():
                 try:
                     dbfFile = Dbf(os.path.join(self._dirName, fileName), readOnly=True, encoding='cp866')
                     if dbfFile.recordCount:
                         if not self._callbackUpdate(fileName, 0, dbfFile.recordCount):
                             isRollback = True
                             return
                         insertRowCount = 0
                         rbTable = self._db.table('rbCheckAccounts' + fileName[:1])
                         for dbfRow in dbfFile:
                             newRecord = rbTable.newRecord()
                             for fieldName, fieldValue in dbfRow.asDict().items():
                                 fieldValue = forceStringEx(fieldValue)
                                 if fieldValue:
                                     newRecord.setValue(forceString(fieldName), toVariant(fieldValue))
                             self._db.insertRecord(rbTable, newRecord)
                             insertRowCount += 1
                             if not self._callbackUpdate(fileName, insertRowCount, dbfFile.recordCount):
                                 isRollback = True
                                 return
                         del labels[fileName[:1]]
                     dbfFile.close()
                     dbfFile = None
                 except Exception as e:
                     isRollback = True
                     raise self.InsertError(fileName, e)
         requiredFiles = [label for label, required in labels.items() if required]
         if requiredFiles:
             isRollback = True
             raise self.RequiredFilesNotFoundError(requiredFiles)
         self._db.commit()
     finally:
         if isRollback:
             self._db.rollback()
         if dbfFile:
             dbfFile.close()
         QtGui.qApp.removeTmpDir(self._dirName)
Пример #7
0
    def createDbf(self):
        u"""Создает структуру для паспортной части реестра счетов."""
        dbfName = os.path.join(self.parent.getTmpDir(), self.getDbfBaseName())
        dbf = Dbf(dbfName, new=True, encoding='cp866')
        dbf.addField(
            ('NS', 'N', 5,
             0),  # номер реестра счетов (п. 1 примечаний) обязательное
            ('VS', 'C',
             1),  # тип реестра счетов (п. 2;4 примечаний) обязательное SPR21
            (
                'DATS', 'D'
            ),  # дата формирования реестра счетов (п. 3 примечаний) обязательное
            ('SN', 'N', 12, 0),  # номер персонального счета	обязательное
            ('DATPS',
             'D'),  # дата формирования персонального счета обязательное
            ('CODE_MO', 'C',
             5),  # код МО, оказавшей медицинскую помощь обязательное SPR01
            ('PL_OGRN', 'C', 15),  # ОГРН плательщика
            ('FIO', 'C', 30),  # фамилия (п. 5 примечаний) обязательное
            ('IMA', 'C', 20),  # имя (п. 5 примечаний) обязательное
            ('OTCH', 'C', 30),  # отчество (п. 5 примечаний)
            ('POL', 'C',
             1),  # символьное (1)	пол (М/Ж) (п. 6 примечаний) обязательное
            ('DATR', 'D'),  # дата рождения (п. 7 примечаний) обязательное
            ('SNILS', 'C', 14),  # СНИЛС
            (
                'OKATO_OMS', 'C', 5
            ),  # код ОКАТО территории страхования по ОМС обязательное для инокраевых SPR39
            ('SPV', 'N', 1),  # вид полиса
            ('SPS', 'C', 10),  # серия полиса ОМС обязательное
            ('SPN', 'C', 20),  # номер полиса ОМС обязательное
            # ('STAT_P', 'C', 1),     # статус представителя пациента обязательное SPR41
            (
                'Q_G', 'C', 10
            ),  # признак "Особый случай" при регистрации обращения за медицинской помощью (п. 8 примечаний) SPR42
            # ('NOVOR', 'C', 9),      # признак новорожденного (п. 18 примечаний)
            (
                'FAMP', 'C', 30
            ),  # фамилия родителя (представителя) пациента (п. 5 примечаний) обязательное
            (
                'IMP', 'C', 20
            ),  # имя родителя (представителя) пациента (п. 5 примечаний) обязательное
            ('OTP', 'C', 30
             ),  # отчество родителя (представителя) пациента (п. 5 примечаний)
            (
                'POLP', 'C', 1
            ),  # пол представителя пациента (М/Ж) (п. 6 примечаний) Да (при STAT_P <> “0”)
            (
                'DATRP', 'D'
            ),  # дата рождения представителя пациента (п. 7 примечаний) Да (при STAT_P <> “0”)
            (
                'C_DOC', 'N', 2, 0
            ),  # код типа документа, удостоверяющего личность пациента (представителя) (п. 10 примечаний) SPR43
            (
                'S_DOC', 'C', 10
            ),  # серия документа, удостоверяющего личность пациента (представителя) (п. 10 примечаний)
            (
                'N_DOC', 'C', 15
            ),  # номер документа, удостоверяющего личность пациента (представителя) (п. 10 примечаний)
            ('DATN', 'D'),  # дата начала лечения обязательное
            ('DATO', 'D'),  # дата окончания лечения обязательное
        )

        return dbf
Пример #8
0
def getDataFromDbfFile(parentWidget, fileName):
    from library.dbfpy.dbf import Dbf

    reportDataByNumbers = {}

    dbf = Dbf(fileName,
              readOnly=True,
              encoding='cp866',
              enableFieldNameDups=True)

    unexistsFields = []
    for needField in [
            'NREESTR', 'NSVOD', 'KODLPU', 'KSPEC', 'NSCHT', 'STOIM', 'ZPL',
            'DOPL', 'MED', 'M_INV', 'NAKL'
    ]:
        if needField not in dbf.fieldNames:
            unexistsFields.append(needField)
    if unexistsFields:
        QtGui.QMessageBox.warning(
            parentWidget,
            u'Ошибка',
            u'В указанном файле исходных данных отчета\n отсутсвтуют поля:\n%s'
            % ('\n'.join(unexistsFields)),
            buttons=QtGui.QMessageBox.Ok,
            defaultButton=QtGui.QMessageBox.NoButton)
        return reportDataByNumbers, '_____________________________________________'

    rows = dbf.recordCount
    row = 0

    nr = u'%05d' % forceInt(dbf[row]['NREESTR'])
    table = QtGui.qApp.db.table('Organisation')
    platrec = QtGui.qApp.db.getRecordEx(
        table, 'shortName',
        'infisCode LIKE \'61%%%s\' and deleted = 0' % nr[:2])
    plat = forceString(platrec.value('shortName'))

    specialityNameCashe = {}
    while row < rows:
        dbfRecord = dbf[row]

        nsvod = forceString(dbfRecord['NSVOD'])

        reportData = reportDataByNumbers.setdefault(nsvod, {})
        orgStructureCode = forceStringEx(dbfRecord['KODLPU'])

        serviceCode = forceString(dbfRecord['KSPEC'])
        if not specialityNameCashe.has_key(serviceCode):
            rbSpecialityTable = QtGui.qApp.db.table('rbSpeciality')
            specialityNameCashe[serviceCode] = forceString(
                QtGui.qApp.db.translate(rbSpecialityTable,
                                        rbSpecialityTable['federalCode'],
                                        serviceCode,
                                        rbSpecialityTable['OKSOName']))
        specialityName = specialityNameCashe[serviceCode]

        visitCount = 1

        nscht = forceInt(dbfRecord['NSCHT'])

        tariffPrice = forceDouble(dbfRecord['STOIM'])

        sum = visitCount * tariffPrice

        wages = forceDouble(dbfRecord['ZPL'])  #1

        additionalPayments = forceDouble(dbfRecord['DOPL'])  #5

        drugs = forceDouble(dbfRecord['MED'])  #2

        softInventory = forceDouble(dbfRecord['M_INV'])  #3

        overhead = forceDouble(dbfRecord['NAKL'])  #4

        orgStructureData = reportData.setdefault(serviceCode, {})
        serviceData = orgStructureData.setdefault(
            serviceCode, {
                'orgStructureCode': orgStructureCode,
                'serviceCode': serviceCode,
                'specialityName': specialityName,
                'visitCount': 0,
                'eventCount': 0,
                'sum': 0.0,
                'wages': 0.0,
                'additionalPayments': 0.0,
                'drugs': 0.0,
                'softInventory': 0.0,
                'overhead': 0.0,
                'nschtValueSet': []
            })
        serviceData['visitCount'] += visitCount
        if nscht not in serviceData['nschtValueSet']:
            serviceData['nschtValueSet'].append(nscht)
            serviceData['eventCount'] += 1
        serviceData['sum'] += sum
        serviceData['wages'] += wages
        serviceData['additionalPayments'] += additionalPayments
        serviceData['drugs'] += drugs
        serviceData['softInventory'] += softInventory
        serviceData['overhead'] += overhead
        row += 1

    dbf.close()
    return reportDataByNumbers, plat
Пример #9
0
 def update(self):
     isRollback = False
     dbfFile = Dbf(os.path.join(self._dirName, self._fileName),
                   readOnly=True,
                   encoding='cp866')
     try:
         if not self._callbackUpdate(0, dbfFile.recordCount):
             return
         fileHash = forceString(
             hashlib.md5(dbfFile.stream.read()).hexdigest())
         if not self._rbTable or fileHash != forceString(self._metaData.value('hash')) or \
                 self._db.getCount(self._rbTable, countCol='id') != dbfFile.recordCount:
             self._drop()
             rbTableFields = [
                 trim(field) for field in forceString(
                     self._metaData.value('fields')).split(',')
             ]
             fieldsStatement = ''
             fieldsStatementCount = 0
             for dbfField in dbfFile.fieldDefs:
                 if forceString(dbfField.name) in rbTableFields:
                     fieldsStatement += u'`%s` %s DEFAULT NULL COMMENT \'Поле %s\', ' % (
                         forceString(
                             dbfField.name), self._getType(dbfField),
                         forceString(dbfField.name))
                     fieldsStatementCount += 1
             if len(rbTableFields) != fieldsStatementCount:
                 raise self.MetadataMappingError()
             rbTableIndexes = [
                 index for index in map(
                     trim,
                     forceString(self._metaData.value('indexes')).split(
                         ',')) if index
             ]
             indexesStatement = ''
             for index in rbTableIndexes:
                 indexesStatement += u', INDEX `%s` (`%s`)' % (index, index)
             createStatement = u"""
             CREATE TABLE `%s` (
                 `id` int(11) NOT NULL AUTO_INCREMENT,
                 `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Отметка удаления записи',
                 %s
                 PRIMARY KEY (`id`)
                 %s
             ) ENGINE = InnoDB DEFAULT charset = utf8 COMMENT = '%s';""" % (
                 forceString(self._metaData.value('tableName')),
                 fieldsStatement, indexesStatement,
                 forceString(self._metaData.value('name')))
             try:
                 self._db.query(createStatement)
                 self._db.transaction()
                 try:
                     insertRowCount = 0
                     self._rbTable = self._db.table(
                         forceString(self._metaData.value('tableName')))
                     for dbfRow in dbfFile:
                         newRecord = self._rbTable.newRecord()
                         for field in rbTableFields:
                             fieldValue = forceStringEx(dbfRow[field])
                             if fieldValue:
                                 newRecord.setValue(field,
                                                    toVariant(fieldValue))
                         self._db.insertRecord(self._rbTable, newRecord)
                         insertRowCount += 1
                         if not self._callbackUpdate(
                                 insertRowCount, dbfFile.recordCount):
                             isRollback = True
                             return
                     self._metaData.setValue('hash', toVariant(fileHash))
                     self._db.updateRecord(self._additionalRBs,
                                           self._metaData)
                     self._db.commit()
                 except:
                     isRollback = True
                     raise
             except Exception as e:
                 raise self.CreateError(e)
         else:
             self._callbackUpdate(dbfFile.recordCount, dbfFile.recordCount)
     finally:
         if isRollback:
             self._db.rollback()
             self._drop()
         dbfFile.close()
Пример #10
0
class CImportMKB(QtGui.QDialog, Ui_ImportMKB):
    def __init__(self, parent):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(1)
        self.progressBar.setValue(0)
        self.btnImport.setEnabled(False)
        self.importDBF = None

    def openFile(self, fileName):

        archive, nameFiles = getFilesZipArchive(fileName)
        if archive:
            for name in nameFiles:
                if not unicode(name.lower()).endswith('spr20.dbf'):
                    continue
                self.importDBF = getDBFFileFromZipArchive(archive, name)
                break
        else:
            if unicode(fileName.lower()).endswith('spr20.dbf'):
                self.importDBF = Dbf(fileName, encoding='cp866')
        if not self.importDBF:
            self.logBrowser.append(u'В архиве нет spr20.dbf файла.' if archive
                                   else u'Необходимо выбрать файл spr20.dbf.')
            self.logBrowser.update()
            return
        self.btnImport.setEnabled(True)

    def updateMKB(self, mapMKB):
        db = QtGui.qApp.db
        self.progressBar.setRange(0, len(mapMKB))
        self.logBrowser.append(u'Конструирование запроса')
        dateLeft = dateLeftInfinity.toString('yyyy-MM-dd')
        dateRight = dateRightInfinity.toString('yyyy-MM-dd')
        stmt = u'UPDATE MKB_Tree SET begDate=\'%s\', endDate=\'%s\', OMS=\'1\' WHERE parent_code IS NULL;\n' % (
            dateLeft, dateRight)
        for i, code in enumerate(mapMKB):
            stmt += u'UPDATE MKB SET OMS=\'{OMS}\', begDate=\'{begDate}\', endDate=\'{endDate}\', DiagName=\'{name}\' WHERE DiagID=\'{code}\';\n' \
                    u'UPDATE MKB_Tree SET OMS=\'{OMS}\', begDate=\'{begDate}\', endDate=\'{endDate}\', DiagName=\'{name}\' WHERE DiagID=\'{code}\';\n'.format(
                        OMS=mapMKB[code][0],
                        begDate=mapMKB[code][1] or dateLeft,
                        endDate=mapMKB[code][2] or dateRight,
                        code=code,
                        name=mapMKB[code][3]
                    )
            self.progressBar.setValue(i)
            if not i % 30:
                db.query(stmt)
                stmt = ''
        db.query(stmt)

    def insertMKB(self, mapMKB):
        self.progressBar.setRange(0, 0)
        mapMKB = mapMKB.copy()
        db = QtGui.qApp.db
        self.logBrowser.append(u'Конструирование запроса')
        tbl_tree = db.table('MKB_Tree')
        view_tree = db.table('vMKBTree')
        tbl = view_tree.leftJoin(tbl_tree,
                                 view_tree['BlockID'].eq(tbl_tree['DiagID']))
        blocks = dict((forceString(rec.value(1)),
                       forceString(rec.value(0)).strip('()').split('-'))
                      for rec in db.getRecordList(
                          tbl, 'DISTINCT vMKBTree.BlockID, MKB_Tree.id'))
        exist = (forceString(rec.value(0))
                 for rec in db.getRecordList(tbl_tree, 'DiagID'))
        for diag in exist:
            if diag in mapMKB:
                del mapMKB[diag]

        def get_block(code):
            for tree_id, mkb_range in blocks.iteritems():
                if (len(mkb_range) == 1 and mkb_range[0]
                        == code) or (len(mkb_range) == 2
                                     and mkb_range[0] <= code <= mkb_range[1]):
                    return tree_id
            return None

        values = []

        dateLeft = dateLeftInfinity.toString('yyyy-MM-dd')
        dateRight = dateRightInfinity.toString('yyyy-MM-dd')

        self.progressBar.setRange(0, len(mapMKB))
        for k, v in mapMKB.iteritems():
            if len(k) == 3:
                parent = get_block(k)
                if not parent:
                    continue
            elif len(k) == 5:
                parent = k[:3]
            elif len(k) == 6:
                parent = k[:5]
            else:
                continue
            values.append(
                '(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)'
                % (
                    k,  # DiagID
                    v[3],  # DiagName
                    parent,
                    v[0],  # OMS
                    v[1] or dateLeft,  # begDate
                    v[2] or dateRight  # endDate
                ))
            self.progressBar.step()
        if values:
            stmt = u'INSERT INTO MKB_Tree (DiagID, DiagName, parent_code, OMS, begDate, endDate, Prim, sex, age, characters, duration, USL_OK1, USL_OK2, USL_OK3, USL_OK4, SELF) ' \
                   u'VALUES ' + ', '.join(values)
            db.query(stmt)

    @QtCore.pyqtSlot()
    def on_btnImport_clicked(self):
        db = QtGui.qApp.db
        mapMKB = {}
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(len(self.importDBF))
        self.progressBar.setValue(0)
        self.logBrowser.append(
            u'Импорт начат: %s' %
            (QtCore.QTime.currentTime().toString('hh:mm:ss')))
        self.logBrowser.update()
        insertValues = []
        self.progressBar.setText(u'Считывание данных из файла')
        for recordDBF in self.importDBF:
            self.progressBar.step()
            try:
                code = forceString(recordDBF['CODE'])
                mapMKB[code] = (forceString(recordDBF['IS_OMS']),
                                forceString(recordDBF['DATN']),
                                forceString(recordDBF['DATO']),
                                forceString(recordDBF['NAME']))
            except KeyError:
                self.logBrowser.append(
                    u'Неправильный формат файла\nИмпорт прерван: %s' %
                    (QtCore.QTime.currentTime().toString('hh:mm:ss')))
                self.logBrowser.update()
                self.importDBF.close()
                return
        self.importDBF.close()
        db.transaction()
        try:
            self.progressBar.setText(u'Обновление записей')
            self.updateMKB(mapMKB)
            self.progressBar.setText(u'Вставка записей')
            self.insertMKB(mapMKB)
            self.logBrowser.append(
                u'Импорт окончен: %s' %
                (QtCore.QTime.currentTime().toString('hh:mm:ss')))
            self.logBrowser.update()
            db.commit()
        except:
            self.logBrowser.append(
                u'Ошибка импорта: %s' %
                (QtCore.QTime.currentTime().toString('hh:mm:ss')))
            db.rollback()
            QtGui.qApp.logCurrentException()
        self.progressBar.setRange(0, 1)
        self.progressBar.setValue(1)

    @QtCore.pyqtSlot()
    def on_btnSelectFile_clicked(self):
        fileName = QtGui.QFileDialog.getOpenFileName(
            self, u'Укажите файл с данными', self.edtFileName.text(),
            u'Файлы DBF, ZIP (*.dbf *.zip)')
        if fileName:
            self.edtFileName.setText(QtCore.QDir.toNativeSeparators(fileName))
            self.openFile(unicode(fileName))
Пример #11
0
    def importSMP(self):
        self.personId = self.cmbPerson.getValue()
        self.i = 0
        self.visits = 0
        self.events = 0
        self.clients = 0
        self.specialityId = QtGui.qApp.db.translateEx('Person', 'id',
                                                      self.personId,
                                                      'speciality_id')
        try:
            self.btnImport.setEnabled(False)
            fileName = forceStringEx(self.edtFileName.text())
            if not fileName:
                self.logBrowser.append(u'Необходимо выбрать файл!')
                self.logBrowser.update()
                return
            dbf = Dbf(fileName, readOnly=True, encoding='cp866')
            self.progressBar.setMinimum(0)
            self.progressBar.setMaximum(dbf.recordCount)
            self.progressBar.setValue(0)

            self.logBrowser.append(
                u'Иморт начат: %s' %
                (QtCore.QTime.currentTime().toString('hh:mm:ss')))
            self.logBrowser.update()
            self.progressBar.setText(u'Считывание данных из файла')
            mapSMP = defaultdict(dict)
            accItemId = 0
            for recordDBF in dbf:
                self.progressBar.step()
                # accItemId = recordDBF['ACCITEM_ID'] В предоставленном файле не было
                accItemId += 1
                mapSMP[accItemId]['lastName'] = recordDBF['SURNAME']
                mapSMP[accItemId]['firstName'] = recordDBF['NAME1']
                mapSMP[accItemId]['patrName'] = recordDBF['NAME2']
                mapSMP[accItemId]['birthDate'] = recordDBF['BIRTHDAY']
                mapSMP[accItemId]['sex'] = recordDBF['SEX']

                mapSMP[accItemId]['policySerial'] = recordDBF[
                    'POLIS_S'] if recordDBF['POLIS_S'] != '-' else ''
                mapSMP[accItemId]['policyNumber'] = recordDBF[
                    'POLIS_N'] if recordDBF['POLIS_N'] != '-' else ''
                # mapSMP[accItemId]['policyInsurer'] = recordDBF['POLIS_W'] В предоставленном файле не было
                mapSMP[accItemId]['policyInsurer'] = recordDBF['PAYER']
                mapSMP[accItemId]['documentType'] = recordDBF['TYPEDOC']
                mapSMP[accItemId]['docSeries1'] = recordDBF[
                    'SER1'] if recordDBF['SER1'] != '-' else ''
                mapSMP[accItemId]['docSeries2'] = recordDBF[
                    'SER2'] if recordDBF['SER2'] != '-' else ''
                mapSMP[accItemId]['documentNumber'] = recordDBF[
                    'NPASP'] if recordDBF['NPASP'] != '-' else ''
                # mapSMP[accItemId]['snils'] = recordDBF['SNILS'] В предоставленном файле не было
                mapSMP[accItemId]['tariffType'] = recordDBF['SERV_ID']
                mapSMP[accItemId]['emergStreet'] = recordDBF['STREET']
                mapSMP[accItemId]['emergStreetType'] = recordDBF['STREETYPE']
                mapSMP[accItemId]['emergArea'] = recordDBF['AREA']
                mapSMP[accItemId]['emergHouse'] = recordDBF['HOUSE']
                mapSMP[accItemId]['emergBuild'] = recordDBF['KORP']
                mapSMP[accItemId]['emergFlat'] = recordDBF['FLAT']
                # mapSMP[accItemId]['emergLongAddr'] = recordDBF['LONGADDR'] В предоставленном файле не было
                mapSMP[accItemId]['serviceInfisCode'] = recordDBF['PROFILE']
                mapSMP[accItemId]['begDate'] = recordDBF['DATEIN']
                mapSMP[accItemId]['endDate'] = recordDBF['DATEOUT']
                #TODO:Зависит от isHospitalization
                #TODO:Где, isHospitalization
                mapSMP[accItemId]['amount'] = recordDBF['AMOUNT']
                mapSMP[accItemId]['diagnosis'] = recordDBF['DIAGNOSIS']
                #rbSpeciality Person
                mapSMP[accItemId]['specialityCode'] = recordDBF['ID_PRVS']
                #TODO:rbDiagnosticResult.regionalCode нужен Diagnostic нужен Event
                mapSMP[accItemId]['idExitus'] = recordDBF['ID_EXITUS']
                mapSMP[accItemId]['externalId'] = recordDBF['ILLHISTORY']
                # mapSMP[accItemId]['aidProfileCode'] = recordDBF['ID_PRMP']
                # mapSMP[accItemId]['eventAidProfileCode'] = recordDBF['ID_PRMP_C']
                mapSMP[accItemId]['mkb_pc'] = recordDBF['DIAG_C']
                mapSMP[accItemId]['eventResultCode'] = recordDBF['QRESULT']
                mapSMP[accItemId]['eventSpecialityCode'] = recordDBF[
                    'ID_PRVS_C']
                # mapSMP[accItemId]['tmpAmount'] = recordDBF['ID_ED_PAY'] #Уже есть amount
                # mapSMP[accItemId]['aidKindCode'] = recordDBF['ID_VMP']
                mapSMP[accItemId]['personId'] = self.getPersonId(
                    recordDBF['ID_DOC'])
                #OrgStructure.infisCode от person_id
                mapSMP[accItemId]['personFormat'] = recordDBF['ID_DEPT']

                mapSMP[accItemId]['eisLpuId_C'] = recordDBF['ID_DOC_C']
                mapSMP[accItemId]['personFormat_C'] = recordDBF['ID_DEPT_C']
                # mapSMP[accItemId]['accountId'] = recordDBF['ACC_ID'] В предоставленном файле не было
                # mapSMP[accItemId]['clientId'] = recordDBF['CLIENT_ID'] В предоставленном файле не было

                mapSMP[accItemId]['goal'] = recordDBF['ID_GOAL_C']
                mapSMP[accItemId]['currentOrgMiac'] = recordDBF['ID_LPU']
                mapSMP[accItemId]['nborn'] = recordDBF['N_BORN']

                mapSMP[accItemId]['series'] = mapSMP[accItemId][
                    'docSeries1'] + ' ' + mapSMP[accItemId]['docSeries2']
        except ValueError:
            self.logBrowser.append(u'<b><font color=red>ОШИБКА:</b>'
                                   u' неверное значение строки "%d" в DBF.' % \
                                   self.progressBar.value())
            self.logBrowser.update()
            self.btnImport.setEnabled(True)
            raise
        except Exception as ex:
            self.logBrowser.append(u'<b><font color=red>ОШИБКА:</b> ' +
                                   ex.message)
            self.logBrowser.update()
            self.btnImport.setEnabled(True)
            raise

        self.progressBar.setText(u'Занесение данных в базу')
        self.logBrowser.append(u'Занесение данных в базу')
        self.logBrowser.update()

        QtGui.qApp.db.transaction()
        for rec in mapSMP.itervalues():
            QtGui.qApp.processEvents()
            self.addVisit(rec)
            self.i += 1
        # QtGui.qApp.db.rollback()
        QtGui.qApp.db.commit()

        self.progressBar.setText(u'Импорт завершен!')
        self.logBrowser.append(u'Импорт завершен!')
        self.logBrowser.append(
            u'Количество занесённых полей Visit: {0:d}\nКоличество занесённых полей Event: {1:d}\nКоличество занесённых полей Client: {2:d}'
            .format(self.visits, self.events, self.clients))
        self.logBrowser.update()
        self.btnImport.setEnabled(True)