/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.administrator.register.writer;
import beans.report.register.RegisterBean;
import beans.report.register.RegisterData;
import cli_fmw.delegate.directory.complex.DirectoryKladr;
import cli_fmw.delegate.directory.complex.DirectoryKladrItem;
import cli_fmw.delegate.directory.complex.DirectoryKladrType;
import cli_fmw.delegate.directory.complex.DirectoryKladrTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import clips.administrator.register.ErrorList;
import clips.administrator.register.InfoFields;
import clips.administrator.register.LpuFields;
import clips.delegate.directory.ro.DirectoryLpuItem;
import clips.delegate.directory.simple.clientDocumentType.DirectoryDocumentType;
import clips.delegate.directory.simple.diagnosisEncounter.DirectoryDiagnosisEncounter;
import clips.delegate.directory.simple.diagnosisEncounter.DirectoryDiagnosisEncounterItem;
import clips.delegate.directory.simple.diseaseResult.DirectoryDiseaseResult;
import clips.delegate.directory.simple.diseaseResult.DirectoryDiseaseResultItem;
import clips.delegate.directory.simple.dvr.DirectoryDvr;
import clips.delegate.directory.simple.dvr.DirectoryDvrItem;
import clips.delegate.directory.simple.insurer.DirectoryInsurer;
import clips.delegate.directory.simple.insurer.DirectoryInsurerItem;
import clips.delegate.directory.simple.medicalAidType.DirectoryMedicalAidType;
import clips.delegate.directory.simple.medicalAidType.DirectoryMedicalAidTypeItem;
import clips.delegate.directory.simple.name.DirectoryName;
import clips.delegate.directory.simple.pathron.DirectoryPathron;
import clips.delegate.directory.simple.receptionType.DirectoryReceptionType;
import clips.delegate.directory.simple.receptionType.DirectoryReceptionTypeItem;
import clips.delegate.directory.simple.regionIdCode.DirectoryRegionIdCode;
import clips.delegate.directory.simple.socialStatus.DirectorySocialStatus;
import clips.delegate.directory.simple.surname.DirectorySurname;
import clips.delegate.directory.simple.visitingPurpose.DirectoryVisitingPurpose;
import clips.delegate.directory.simple.visitingPurpose.DirectoryVisitingPurposeItem;
import clips.dicom.utils.Pair;
import clips.login.UserInfo;
import clips.main.ClipsConfig;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.regex.Pattern;
import org.xBaseJ.micro.DBF;
import org.xBaseJ.micro.fields.DateField;
import org.xBaseJ.micro.fields.Field;
import org.xBaseJ.micro.xBaseJException;
/**
*
* @author vip
*/
public abstract class WriterAbstract {
protected DBF lpuInfo;
protected DBF regLpu;
protected InfoFields inf;
protected LpuFields lf;
protected int count;
protected Integer quickCount;
protected DirectoryInsurer dirInsurer;
abstract String getDirName();
abstract boolean needWrite(RegisterData data);
abstract int getIdsmo();
abstract public String getSmoName() throws ClipsException;
abstract public String getTitle();
public void openLpuInfo(boolean delete) throws xBaseJException, IOException {
if (lpuInfo == null) {
ClipsConfig cfg = ClipsConfig.getInstance();
File dir = new File(cfg.getRegisterExportPath(), "SEND");
dir.mkdir();
dir = new File(dir, getDirName());
dir.mkdir();
File dbfFile = new File(dir, "lpu_info.dbf");
if (delete) {
lpuInfo = new DBF(dbfFile.getAbsolutePath(), true, "cp866");
} else {
lpuInfo = new DBF(dbfFile.getAbsolutePath(), "cp866");
}
}
lpuInfo.startTop();
}
public void createLpuInfo() throws xBaseJException, IOException, ClipsException {
openLpuInfo(true);
inf = new InfoFields();
try {
for (int i = 0; i < inf.getFields().length; i++) {
Field f = inf.getFields()[i];
lpuInfo.addField(f);
}
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + lpuInfo.getName(), ex);
}
}
public void closeLpuInfo() throws IOException {
lpuInfo.close();
lpuInfo = null;
}
public void fillLpuInfo(Calendar from, Calendar till) throws xBaseJException, IOException, ClipsException {
try {
DirectoryLpuItem lpu = UserInfo.get().getCollaborator().getLpu();
inf.id_smo.put(getIdsmo());
inf.id_sub_lpu.put(lpu.getLpuSubdivisionCode());
inf.type.put(RegisterBean.TYPE);
long ms = (from.getTimeInMillis() + till.getTimeInMillis()) / 2;
GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
gc.setTimeInMillis(ms);
inf.year.put(gc.get(GregorianCalendar.YEAR));
inf.month.put(till.get(GregorianCalendar.MONTH) + 1);
inf.date_beg.put(from);
inf.date_end.put(till);
lpuInfo.write();
closeLpuInfo();
} catch (IOException ex) {
closeLpuInfo();
throw ex;
} catch (ClipsException ex) {
closeLpuInfo();
throw ex;
} catch (xBaseJException ex) {
closeLpuInfo();
throw ex;
}
}
public Pair<Date, Date> getDates() throws xBaseJException, IOException {
openLpuInfo(false);
lpuInfo.read();
Date date1 = ((DateField) lpuInfo.getField(InfoFields.DATE_BEG)).getCalendar().getTime();
Date date2 = ((DateField) lpuInfo.getField(InfoFields.DATE_END)).getCalendar().getTime();
closeLpuInfo();
return new Pair<Date, Date>(date1, date2);
}
public Date getDateGenerated() {
ClipsConfig cfg = ClipsConfig.getInstance();
File dir = new File(cfg.getRegisterExportPath(), "SEND");
dir.mkdir();
dir = new File(dir, getDirName());
dir.mkdir();
File dbfFile = new File(dir, "reg_lpu.dbf");
if (dbfFile.exists()) {
Date date = new Date();
date.setTime(dbfFile.lastModified());
return date;
} else {
return null;
}
}
public void openRegLpu(boolean delete) throws xBaseJException, IOException {
if (regLpu == null) {
ClipsConfig cfg = ClipsConfig.getInstance();
File dir = new File(cfg.getRegisterExportPath(), "SEND");
dir.mkdir();
dir = new File(dir, getDirName());
dir.mkdir();
File dbfFile = new File(dir, "reg_lpu.dbf");
if (delete) {
regLpu = new DBF(dbfFile.getAbsolutePath(), true, "cp866");
} else {
regLpu = new DBF(dbfFile.getAbsolutePath(), "cp866");
}
}
regLpu.startTop();
}
public void closeRegLpu() throws IOException {
regLpu.close();
regLpu = null;
}
public void createRegLpu() throws xBaseJException, IOException, ClipsException {
openRegLpu(true);
lf = new LpuFields();
try {
for (int i = 0; i < lf.getFields().length; i++) {
Field f = lf.getFields()[i];
regLpu.addField(f);
}
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + regLpu.getName(), ex);
}
}
public ErrorList fillRegLpu(List<RegisterData> list) throws xBaseJException, IOException, ClipsException {
try {
DirectorySurname dirSurname = DirectoryLocator.getDirectory(DirectorySurname.class);
DirectoryName dirName = DirectoryLocator.getDirectory(DirectoryName.class);
DirectoryPathron dirPatron = DirectoryLocator.getDirectory(DirectoryPathron.class);
DirectoryReceptionType dirRecType = DirectoryLocator.getDirectory(DirectoryReceptionType.class);
DirectorySocialStatus dirStatus = DirectoryLocator.getDirectory(DirectorySocialStatus.class);
DirectoryDocumentType dirDocType = DirectoryLocator.getDirectory(DirectoryDocumentType.class);
DirectoryRegionIdCode dirRegCode = DirectoryLocator.getDirectory(DirectoryRegionIdCode.class);
dirInsurer = DirectoryLocator.getDirectory(DirectoryInsurer.class);
DirectoryKladr dirKladr = DirectoryLocator.getDirectory(DirectoryKladr.class);
DirectoryKladrType dirKladrType = DirectoryLocator.getDirectory(DirectoryKladrType.class);
DirectoryDiseaseResult dirDisResult = DirectoryLocator.getDirectory(DirectoryDiseaseResult.class);
DirectoryDvr dirDvr = DirectoryLocator.getDirectory(DirectoryDvr.class);
DirectoryDiagnosisEncounter dirDiagEnc = DirectoryLocator.getDirectory(DirectoryDiagnosisEncounter.class);
DirectoryMedicalAidType dirVmu = DirectoryLocator.getDirectory(DirectoryMedicalAidType.class);
DirectoryVisitingPurpose dirVisPurp = DirectoryLocator.getDirectory(DirectoryVisitingPurpose.class);
ErrorList target = new ErrorList();
count = 0;
for (RegisterData data : list) {
if (!needWrite(data)) {
continue;
}
int id = data.id;
//ID
lf.id.put(id, target, data.uuid);
//System.out.println("Запись посещения id = " + id);
//HISTORY
if (data.history.trim().isEmpty()) {
target.add(id, "Номер мед. карты не указан", ErrorList.CLIENT_ERROR);
}
lf.history.put(id, target, data.history);
//FAM
if (data.fam == 0) {
target.add(id, "Фамилия не указана", ErrorList.CLIENT_ERROR);
lf.fam.put(id, target, "");
} else {
String surname = dirSurname.getItemFromID(data.fam).getTitle();
if (surname.trim().isEmpty()) {
target.add(id, "Фамилия пустая", ErrorList.CLIENT_ERROR);
}
lf.fam.put(id, target, surname);
}
//NAM
if (data.nam == 0) {
target.add(id, "Имя не указано", ErrorList.CLIENT_ERROR);
lf.nam.put(id, target, "");
} else {
String name = dirName.getItemFromID(data.nam).getTitle();
if (name.trim().isEmpty()) {
target.add(id, "Имя пустое", ErrorList.CLIENT_ERROR);
}
lf.nam.put(id, target, name);
}
//FNAM
if (data.fnam == 0) {
target.add(id, "Отчество не указано", ErrorList.CLIENT_ERROR);
lf.fnam.put(id, target, "-");
} else {
String patron = dirPatron.getItemFromID(data.fnam).getTitle();
if (patron.trim().isEmpty()) {
target.add(id, "Отчество пустое", ErrorList.CLIENT_ERROR);
patron = "-";
}
lf.fnam.put(id, target, patron);
}
//POL_SER
lf.pol_ser.put(id, target, data.pol_ser);
//POL_NUM
if (data.pol_num.equals("0000000000000000")) {
target.add(id, "Полис фиктивный", ErrorList.CLIENT_ERROR);
}
lf.pol_num.put(id, target, data.pol_num);
//BDAY
if (data.bday == null) {
target.add(id, "Дата рождения не указана", ErrorList.CLIENT_ERROR);
lf.bday.put("");
} else {
Calendar cal = Calendar.getInstance();
cal.setTime(data.bday);
lf.bday.put(cal);
}
//SEX
if (data.sex == 0) {
target.add(id, "Пол не указан", ErrorList.CLIENT_ERROR);
}
lf.sex.put(data.sex);
//STATUS
if (data.status == 0) {
target.add(id, "Социальный статус не указан", ErrorList.CLIENT_ERROR);
lf.status.put(0);
} else {
try {
String extKey = dirStatus.getItemFromID(data.status).getExtKey();
lf.status.put(Integer.parseInt(extKey));
} catch (NumberFormatException ex) {
target.add(id, "Код социального статуса должен быть числом", ErrorList.CLIENT_ERROR);
lf.status.put(0);
}
}
//PRED
lf.pred.put(data.pred);
//P_STATUS
if (data.p_status == 0) {
lf.p_status.put("");
} else {
lf.p_status.put(data.p_status);
}
//P_FAM
if (data.p_fam == 0) {
lf.p_fam.put(id, target, "");
} else {
lf.p_fam.put(id, target, dirSurname.getItemFromID(data.p_fam).getTitle());
}
//P_NAM
if (data.p_nam == 0) {
lf.p_nam.put(id, target, "");
} else {
lf.p_nam.put(id, target, dirName.getItemFromID(data.p_nam).getTitle());
}
//P_FNAM
if (data.p_fnam == 0) {
lf.p_fnam.put(id, target, "");
} else {
lf.p_fnam.put(id, target, dirPatron.getItemFromID(data.p_fnam).getTitle());
}
//C_OKSM
if (data.c_oksm.trim().isEmpty()) {
target.add(id, "Гражданство не указано", ErrorList.CLIENT_ERROR);
}
lf.oksm.put(id, target, data.c_oksm);
//DOC_TYPE
if (data.type_doc == 0) {
lf.doc_type.put(0);
} else {
try {
String extKey = dirDocType.getItemFromID(data.type_doc).getExtKey();
lf.doc_type.put(Integer.parseInt(extKey));
} catch (NumberFormatException ex) {
target.add(id, "Код социального статуса должен быть числом", ErrorList.CLIENT_ERROR);
lf.doc_type.put(0);
}
}
//DOC_SER
lf.doc_ser.put(id, target, data.doc_ser);
//DOC_NUM
lf.doc_num.put(id, target, data.doc_num);
//INS_ID_AR
if (data.ins_id_ar == 0) {
lf.ins_id_ar.put("0");
} else {
try {
String extKey = dirRegCode.getItemFromID(data.ins_id_ar).getExtKey();
lf.ins_id_ar.put(Integer.parseInt(extKey));
} catch (NumberFormatException ex) {
target.add(id, "ИД территории страховой организации должен быть числом", ErrorList.CLIENT_ERROR);
lf.ins_id_ar.put("");
}
}
//INS_ORG
String arExtKey = dirRegCode.getItemFromID(data.ins_id_ar).getExtKey();
DirectoryInsurerItem insurer = dirInsurer.getItemFromID(data.id_ins_org);
if (!arExtKey.equals(RegisterBean.REGION_CODE) && !insurer.getExtKey().isEmpty()) {
lf.ins_org.put(id, target, "");
} else if (data.pol_num.isEmpty() && insurer.getExtKey() != null && !insurer.getExtKey().isEmpty()) {
lf.ins_org.put(id, target, "");
} else {
lf.ins_org.put(id, target, insurer.getTitle());
}
if (!arExtKey.equals(RegisterBean.REGION_CODE)
&& lf.ins_org.get().trim().isEmpty()) {
target.add(id, "Для инотерриториального больного не указан филиал ФОМС", ErrorList.CLIENT_ERROR);
}
//INS_ID
try {
String extKey = insurer.getExtKey();
if (!arExtKey.equals(RegisterBean.REGION_CODE) && !insurer.getExtKey().isEmpty()) {
lf.ins_id.put("");
} else if (data.pol_num.isEmpty() && extKey != null && !extKey.isEmpty()) {
lf.ins_id.put("0");
} else if (extKey == null || extKey.isEmpty()) {
lf.ins_id.put("");
} else {
lf.ins_id.put(Integer.parseInt(extKey));
}
} catch (NumberFormatException ex) {
target.add(id, "ИД страховой организации должен быть числом", ErrorList.CLIENT_ERROR);
lf.ins_id.put("");
}
//KLADR
lf.kladr.put(id, target, data.kladr);
//AREA
DirectoryKladrItem area = dirKladr.getItemFromID(data.area);
if (area != null) {
lf.area.put(id, target, area.getTitle());
} else {
lf.area.put(id, target, "");
}
//REGION
lf.region.put(id, target, data.region);
//REG_CITY
if (data.region.trim().toUpperCase().equals("УФА") && data.reg_city.isEmpty()) {
target.add(id, "Неполный адрес: отсутствует район г. Уфа", ErrorList.CLIENT_ERROR);
}
lf.reg_city.put(id, target, data.reg_city);
//ITEM
lf.item.put(id, target, data.item);
//TYPE_ITEM
DirectoryKladrTypeItem typeItem = dirKladrType.getItemFromID(data.type_item);
if (typeItem == null) {
lf.type_item.put("");
} else {
try {
String extKey = typeItem.getExtKey();
if (extKey == null || extKey.isEmpty()) {
lf.type_item.put("");
} else {
lf.type_item.put(Integer.parseInt(extKey));
}
} catch (NumberFormatException ex) {
target.add(id, "Код типа населенного пункта должен быть числом", ErrorList.CLIENT_ERROR);
lf.type_item.put("");
}
}
//TYPE_UL
if (data.type_ul == 0) {
lf.type_ul.put("");
} else {
lf.type_ul.put(data.type_ul);
}
//STREET
lf.street.put(id, target, data.street);
//HOUSE
try {
if (data.house.isEmpty()) {
lf.house.put("");
} else {
lf.house.put(Integer.parseInt(data.house));
}
} catch (NumberFormatException ex) {
target.add(id, "Номер дома должен быть числом", ErrorList.CLIENT_ERROR);
lf.house.put("");
}
//LITER
if (data.liter.length() > 1) {
try {
Integer.parseInt(data.liter);
} catch (NumberFormatException ex) {
target.add(id, "Буква дома имеет неправильный формат : " + data.liter, ErrorList.CLIENT_ERROR);
}
}
lf.liter.put(id, target, data.liter);
//FLAT
if (data.flat.equals("0")) {
lf.flat.put(id, target, "");
} else {
lf.flat.put(id, target, data.flat);
}
//WORK
if (data.is_ext != 0) {
lf.work.put(id, target, data.work);
} else {
lf.work.put(id, target, "");
}
//DATE_BEGIN
Calendar cal = Calendar.getInstance();
cal.setTime(data.date_begin);
lf.date_begin.put(cal);
//DATE_END
lf.date_end.put("");
//MES
if (!Pattern.matches("[0-9]{6}",data.mes)) {
target.add(id, "Неправильный код посещения");
}
lf.mes.put(id, target, data.mes);
//UKL
//Для поликлиник не заполняется
lf.ukl.put("");
//OUT
if (data.out == 0) {
target.add(id, "Не указан исход лечения");
lf.out.put("");
} else {
try {
DirectoryDiseaseResultItem item = dirDisResult.getItemFromID(data.out);
lf.out.put(Integer.parseInt(item.getExtKey()));
} catch (NumberFormatException ex) {
target.add(id, "Исход лечения должен быть числом");
lf.out.put("");
}
}
//FLAG
lf.flag.put(id, target, "");
//MKB
if (data.mkb.isEmpty()) {
target.add(id, "Отсутствует диагноз");
}
lf.mkb.put(id, target, data.mkb);
//MKB_S
lf.mkb_s.put(id, target, data.mkb_s);
//INN
lf.inn.put(id, target, data.inn);
//MU
lf.mu.put(data.c_mu);
//KMU
lf.kmu.put(data.k_mu / 100.0);
//SS
lf.ss.put(id, target, data.ss);
//SSD
lf.ssd.put(id, target, data.ssd);
//VR_SPEC
if (data.vr_spec == 0) {
target.add(id, "Не указан код специальности врача");
lf.vr_spec.put("");
} else {
try {
DirectoryReceptionTypeItem item = dirRecType.getItemFromID(data.vr_spec);
lf.vr_spec.put(Integer.parseInt(item.getExtKey()));
} catch (NumberFormatException ex) {
target.add(id, "Код специальности врача должен быть числом");
lf.vr_spec.put("");
}
}
//VR_DOL
if (data.vr_dol == 0) {
//target.add(id, "Не указан код должности врача");
lf.vr_dol.put(0);
} else {
try {
DirectoryDvrItem item = dirDvr.getItemFromID(data.vr_dol);
lf.vr_dol.put(Integer.parseInt(item.getExtKey()));
} catch (NumberFormatException ex) {
target.add(id, "Код должности врача должен быть числом");
lf.vr_dol.put("");
}
}
//QZ
if (data.qz == 0) {
target.add(id, "Не указан код характера заболевания");
lf.qz.put("0");
} else {
try {
DirectoryDiagnosisEncounterItem item = dirDiagEnc.getItemFromID(data.qz);
int qz = Integer.parseInt(item.getExtKey());
/* Не знаю почему, но у них в отчетах характер заболевания
* на 1 меньше чем в базе.
* К примеру код 1 - здоров в отчет идет как 0
* (у них это в ТАЛ2008. У АММовской проги вообще не заполняется)
*/
lf.qz.put(qz - 1);
} catch (NumberFormatException ex) {
target.add(id, "Код характера заболевания должен быть числом");
lf.qz.put("");
}
}
//VMU
if (data.vmu == 0) {
target.add(id, "Не указан вид первичной медико-санитарной помощи");
lf.vmu.put("");
} else {
try {
DirectoryMedicalAidTypeItem item = dirVmu.getItemFromID(data.vmu);
lf.vmu.put(Integer.parseInt(item.getExtKey()));
} catch (NumberFormatException ex) {
target.add(id, "Вид первичной медико-санитарной помощи должен быть числом");
lf.vmu.put("");
}
}
//D_LISTIN
if (data.d_listin == null) {
lf.d_listin.put("");
} else {
cal.setTime(data.d_listin);
lf.d_listin.put(cal);
}
//D_LISTOUT
if (data.d_listout == null) {
lf.d_listout.put("");
} else {
cal.setTime(data.d_listout);
lf.d_listout.put(cal);
}
//DF_CODES
//только для диспансеризации
lf.df_codes.put(id, target, data.df_codes);
//KOD_IF
lf.code_if.put(data.cod_if);
//RESD
//только для диспансеризации
if (data.resd == 0) {
lf.resd.put("");
} else {
lf.resd.put(data.resd);
}
//CODE_GOAL
if (data.code_goal == 0) {
//target.add(id, "Не указан вид первичной медико-санитарной помощи");
lf.code_goal.put(id, target, "");
} else {
DirectoryVisitingPurposeItem item = dirVisPurp.getItemFromID(data.code_goal);
lf.code_goal.put(id, target, item.getExtKey());
}
//OKVED
//только для диспансеризации
lf.okved.put(id, target, data.okved);
//DAT_N
if (data.dat_n == null) {
lf.dat_n.put("");
} else {
Calendar caln = Calendar.getInstance();
caln.setTime(data.dat_n);
lf.dat_n.put(caln);
}
//DAT_E
if (data.dat_e == null) {
lf.dat_e.put("");
} else {
Calendar cale = Calendar.getInstance();
cale.setTime(data.dat_e);
lf.dat_e.put(cale);
}
count ++;
regLpu.write();
}
closeRegLpu();
return target;
} catch (IOException ex) {
closeRegLpu();
throw ex;
} catch (ClipsException ex) {
closeRegLpu();
throw ex;
} catch (xBaseJException ex) {
closeRegLpu();
throw ex;
}
}
@Override
public String toString() {
if (quickCount == null) {
try {
quickCount = getRowCount();
closeRegLpu();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return getTitle() + " (" + quickCount + " записей)";
}
public int getRowCount() {
try {
openRegLpu(false);
return regLpu.getRecordCount();
} catch (xBaseJException ex) {
ex.printStackTrace();
return 0;
} catch (IOException ex) {
ex.printStackTrace();
return 0;
}
}
public DBF read(int row) throws xBaseJException, IOException {
openRegLpu(false);
if (row == 0) {
regLpu.startTop();
} else {
regLpu.gotoRecord(row);
}
regLpu.read();
return regLpu;
}
}