package open.dolphin.infomodel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
/**
* DocInfoModel
*
* 文書履歴のレコード及びCLAIM送信のコンテナとして使用するクラス。
*
* @author Minagawa,Kazushi. Digital Globe, Inc.
*
*/
@Embeddable
public class DocInfoModel extends InfoModel
implements Comparable,java.io.Serializable {
// = DocumentModel.id
@Transient
private long docPk;
// = 親DocumentModel.id
@Transient
private long parentPk;
// 32bit GUID (MML ouput)
@Column(nullable=false, length=32)
private String docId;
// 文書種別(Dolphin固有)
@Column(nullable=false)
private String docType;
// タイトル
@Column(nullable=false)
private String title;
// 生成目的 MML
@Column(nullable=false)
private String purpose;
// 生成目的説明 MML
@Transient
private String purposeDesc;
// 生成目的コード体系 MML
@Transient
private String purposeCodeSys;
// = DocumentModel.started(最初の確定日)
@Transient
private Date firstConfirmDate;
// 確定日
@Transient
private Date confirmDate;
// 診療科
private String department;
//--------------------------------------------------------------
// 診療科説明
// 診療科名、コード、担当医名、担当医コード、JMARIコード(カンマ連結)
private String departmentDesc;
//--------------------------------------------------------------
// 診療科コード体系
@Transient
private String departmentCodeSys;
// 健康保険
private String healthInsurance;
// 健康保険説明(名称)
private String healthInsuranceDesc;
// 健康保険コード体系
@Transient
private String healthInsuranceCodeSys;
// 健康保険GUID (ORCAからの受付受信時に設定されている)
private String healthInsuranceGUID;
// 注意フラグ
private boolean hasMark;
// イメージ(シェーマ)フラグ
private boolean hasImage;
// RPフラグ
private boolean hasRp;
// 処置フラグ
private boolean hasTreatment;
// 検体検査フラグ
private boolean hasLaboTest;
// 文書のバージョン番号(修正時++)
private String versionNumber;
// バージョン説明
@Transient
private String versionNotes;
// 親文書 32bit ID
private String parentId;
// 親文書との関係
private String parentIdRelation;
// 親文書との説明
@Transient
private String parentIdDesc;
// 親文書との関係コード体系
@Transient
private String parentIdCodeSys;
// アクセス権
@Transient
private Collection<AccessRightModel> accessRights;
// ステータス = DocumentModel.status
@Transient
private String status;
// この文書を表示するクラス(紹介状等で使用)
@Transient
private String handleClass;
//----------------------------------
// Flag and param for senders
//----------------------------------
// 検体検査オーダー番号
private String labtestOrderNumber;
// 検体検査オーダー送信フラグ
@Transient
private boolean sendLabtest;
// CLAIM送信フラグ
@Transient
private boolean sendClaim;
// MML送信フラグ
@Transient
private boolean sendMml;
// 処方せん出力
@Transient
private boolean priscriptionOutput;
//----------------------------------
// Claim Sender for JMS+MDB
//----------------------------------
// 診断に適用した健康保険
@Transient
private PVTHealthInsuranceModel pVTHealthInsuranceModel;
// 施設(病院)名
@Transient
private String facilityName;
// 医療資格
@Transient
private String createrLisence;
// 患者ID
@Transient
private String patientId;
// 患者氏名
@Transient
private String patientName;
// 患者性別
@Transient
private String patientGender;
//minagawa^ 会計上送信日を変更(予定カルテ対応)
@Temporal(value = TemporalType.TIMESTAMP)
private Date claimDate;
//minagawa$
//----------------------------------
// 処方せん出力に必要な情報
// 担当医情報: Document->creatorから検索
// 患者情報; Document->karteIdから検索
//----------------------------------
// 交付日
@Transient
private Date issuanceDate;
// 保険医療機関番号
@Transient
private String InstitutionNumber;
// 使用期間
@Transient
private Date period;
// 備考欄患者住所、氏名転記フラグ
@Transient
private boolean chkPatientInfo;
// 備考欄患者麻薬施用者転記フラグ
@Transient
private boolean chkUseDrugInfo;
// 備考欄に「在宅」を記載するかどうかのフラグ
@Transient
private boolean chkHomeMedical;
// 一般名を使用するかどうか
@Transient
private boolean useGeneralName;
//minagawa^ 入院対応
// 外来カルテ=V, 入院カルテ=A, 在宅カルテ=H
@Column(length=1)
private String admFlag;
//minagawa$
//----------------------------------
public long getDocPk() {
return docPk;
}
public void setDocPk(long docPk) {
this.docPk = docPk;
}
public long getParentPk() {
return parentPk;
}
public void setParentPk(long parentPk) {
this.parentPk = parentPk;
}
public void setDocId(String docId) {
this.docId = docId;
}
public String getDocId() {
return docId;
}
public void setDocType(String docType) {
this.docType = docType;
}
public String getDocType() {
return docType;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setPurpose(String purpose) {
this.purpose = purpose;
}
public String getPurpose() {
return purpose;
}
public void setPurposeDesc(String purposeDesc) {
this.purposeDesc = purposeDesc;
}
public String getPurposeDesc() {
return purposeDesc;
}
public void setPurposeCodeSys(String purposeCodeSys) {
this.purposeCodeSys = purposeCodeSys;
}
public String getPurposeCodeSys() {
return purposeCodeSys;
}
public void setFirstConfirmDate(Date firstConfirmDate) {
this.firstConfirmDate = firstConfirmDate;
}
public Date getFirstConfirmDate() {
return firstConfirmDate;
}
public String getFirstConfirmDateTrimTime() {
return ModelUtils.getDateAsString(getFirstConfirmDate());
}
public void setConfirmDate(Date confirmDate) {
this.confirmDate = confirmDate;
}
public Date getConfirmDate() {
return confirmDate;
}
public String getConfirmDateTrimTime() {
return ModelUtils.getDateAsString(getConfirmDate());
}
public void setDepartment(String department) {
this.department = department;
}
public String getDepartment() {
return department;
}
public void setDepartmentDesc(String departmentDesc) {
this.departmentDesc = departmentDesc;
}
public String getDepartmentDesc() {
return departmentDesc;
}
/********************************************/
public String getDepartmentName() {
String[] tokens = tokenizeDept(departmentDesc);
return tokens[0];
}
public String getDepartmentCode() {
String[] tokens = tokenizeDept(departmentDesc);
if (tokens[1] != null) {
return tokens[1];
}
return getDepartment();
}
public String getAssignedDoctorName() {
String[] tokens = tokenizeDept(departmentDesc);
return tokens[2];
}
public String getAssignedDoctorId() {
String[] tokens = tokenizeDept(departmentDesc);
return tokens[3];
}
public String getJMARICode() {
String[] tokens = tokenizeDept(departmentDesc);
return tokens[4];
}
private String[] tokenizeDept(String dept) {
// 診療科名、コード、担当医名、担当医コード、JMARI コード
// を格納する配列を生成する
String[] ret = new String[5];
Arrays.fill(ret, null);
if (dept != null) {
try {
String[] params = dept.split("\\s*,\\s*");
System.arraycopy(params, 0, ret, 0, params.length);
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
return ret;
}
/********************************************/
public void setDepartmentCodeSys(String departmentCodeSys) {
this.departmentCodeSys = departmentCodeSys;
}
public String getDepartmentCodeSys() {
return departmentCodeSys;
}
public void setHealthInsurance(String healthInsurance) {
this.healthInsurance = healthInsurance;
}
public String getHealthInsurance() {
return healthInsurance;
}
public void setHealthInsuranceDesc(String healthInsuranceDesc) {
this.healthInsuranceDesc = healthInsuranceDesc;
}
public String getHealthInsuranceDesc() {
return healthInsuranceDesc;
}
public void setHealthInsuranceCodeSys(String healthInsuranceCodeSys) {
this.healthInsuranceCodeSys = healthInsuranceCodeSys;
}
public String getHealthInsuranceCodeSys() {
return healthInsuranceCodeSys;
}
public void setHealthInsuranceGUID(String healthInsuranceGUID) {
this.healthInsuranceGUID = healthInsuranceGUID;
}
public String getHealthInsuranceGUID() {
return healthInsuranceGUID;
}
public void setHasMark(boolean hasMark) {
this.hasMark = hasMark;
}
public boolean isHasMark() {
return hasMark;
}
public Boolean isHasMarkBoolean() {
return hasMark;
}
public void setHasImage(boolean hasImage) {
this.hasImage = hasImage;
}
public boolean isHasImage() {
return hasImage;
}
public Boolean isHasImageBoolean() {
return hasImage;
}
public void setHasRp(boolean hasRp) {
this.hasRp = hasRp;
}
public boolean isHasRp() {
return hasRp;
}
public Boolean isHasRpBoolean() {
return hasRp;
}
public void setHasTreatment(boolean hasTreatment) {
this.hasTreatment = hasTreatment;
}
public boolean isHasTreatment() {
return hasTreatment;
}
public Boolean isHasTreatmentBoolean() {
return hasTreatment;
}
public void setHasLaboTest(boolean hasLaboTest) {
this.hasLaboTest = hasLaboTest;
}
public boolean isHasLaboTest() {
return hasLaboTest;
}
public Boolean isHasLaboTestBoolean() {
return hasLaboTest;
}
public void setVersionNumber(String version) {
this.versionNumber = version;
}
public String getVersionNumber() {
return versionNumber;
}
public void setVersionNotes(String versionNotes) {
this.versionNotes = versionNotes;
}
public String getVersionNotes() {
return versionNotes;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getParentId() {
return parentId;
}
public void setParentIdRelation(String parentIdRelation) {
this.parentIdRelation = parentIdRelation;
}
public String getParentIdRelation() {
return parentIdRelation;
}
public void setParentIdDesc(String relationDesc) {
this.parentIdDesc = relationDesc;
}
public String getParentIdDesc() {
return parentIdDesc;
}
public void setParentIdCodeSys(String relationCodeSys) {
this.parentIdCodeSys = relationCodeSys;
}
public String getParentIdCodeSys() {
return parentIdCodeSys;
}
public Collection<AccessRightModel> getAccessRights() {
return accessRights;
}
public void setAccessRights(Collection<AccessRightModel> ac) {
this.accessRights=ac;
}
public void addAccessRight(AccessRightModel accessRight) {
if (accessRights == null) {
setAccessRights(new ArrayList<AccessRightModel>(3));
}
accessRights.add(accessRight);
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
public String getHandleClass() {
return handleClass;
}
public void setHandleClass(String handleClass) {
this.handleClass = handleClass;
}
@Override
public int hashCode() {
return docId.hashCode() + 11;
}
@Override
public boolean equals(Object other) {
if (other != null && getClass() == other.getClass()) {
return getDocId().equals(((DocInfoModel) other).getDocId());
}
return false;
}
@Override
public int compareTo(Object other) {
if (other != null && getClass() == other.getClass()) {
Date val1 = getFirstConfirmDate();
Date val2 = ((DocInfoModel) other).getFirstConfirmDate();
int result = (val1!=null && val2!=null) ? val1.compareTo(val2) : 0;
if (result == 0) {
val1 = getConfirmDate();
val2 = ((DocInfoModel) other).getConfirmDate();
result = (val1!=null && val2!=null) ? val1.compareTo(val2) : 0;
}
return result;
}
return -1;
}
@Override
protected Object clone() throws CloneNotSupportedException {
DocInfoModel ret = new DocInfoModel();
// ret.setAccessRights(this.getAccessRights());
ret.setConfirmDate(this.getConfirmDate());
ret.setDepartment(this.getDepartment());
ret.setDepartmentCodeSys(this.getDepartmentCodeSys());
ret.setDepartmentDesc(this.getDepartmentDesc());
// ret.setDocPk(this.getDocPk());
// ret.setDocId(this.getDocId()); //
ret.setDocType(this.getDocType());
ret.setFirstConfirmDate(this.getFirstConfirmDate());
ret.setHandleClass(this.getHandleClass());
ret.setHasImage(this.isHasImage());
ret.setHasLaboTest(this.isHasLaboTest());
ret.setHasMark(this.isHasMark());
ret.setHasRp(this.isHasRp());
ret.setHasTreatment(this.isHasTreatment());
ret.setHealthInsurance(this.getHealthInsurance());
ret.setHealthInsuranceCodeSys(this.getHealthInsuranceCodeSys());
ret.setHealthInsuranceDesc(this.getHealthInsuranceDesc());
ret.setHealthInsuranceGUID(this.getHealthInsuranceGUID());
// ret.setParentId(this.getParentId());
// ret.setParentIdCodeSys(this.getParentIdCodeSys());
// ret.setParentIdDesc(this.getParentIdDesc());
// ret.setParentIdRelation(this.getParentIdRelation());
// ret.setParentPk(this.getParentPk()); //
ret.setPurpose(this.getPurpose());
ret.setPurposeCodeSys(this.getPurposeCodeSys());
ret.setPurposeDesc(this.getPurposeDesc());
ret.setStatus(this.getStatus());
ret.setTitle(this.getTitle());
ret.setVersionNotes(this.getVersionNotes());
ret.setVersionNumber(this.getVersionNumber());
return ret;
// ret.setDocPk(this.getDocPk());
// ret.setDocId(this.getDocId());
// ret.setParentPk(this.getParentPk());
}
public String getLabtestOrderNumber() {
return labtestOrderNumber;
}
public void setLabtestOrderNumber(String labtestOrderNumber) {
this.labtestOrderNumber = labtestOrderNumber;
}
public boolean isSendClaim() {
return sendClaim;
}
public void setSendClaim(boolean sendClaim) {
this.sendClaim = sendClaim;
}
public boolean isSendLabtest() {
return sendLabtest;
}
public void setSendLabtest(boolean sendLabtest) {
this.sendLabtest = sendLabtest;
}
public boolean isSendMml() {
return sendMml;
}
public void setSendMml(boolean sendMml) {
this.sendMml = sendMml;
}
public PVTHealthInsuranceModel getPVTHealthInsuranceModel() {
return getpVTHealthInsuranceModel();
}
public void setPVTHealthInsuranceModel(PVTHealthInsuranceModel selectedInsurance) {
this.setpVTHealthInsuranceModel(selectedInsurance);
}
public String getFacilityName() {
return facilityName;
}
public void setFacilityName(String facilityName) {
this.facilityName = facilityName;
}
public String getCreaterLisence() {
return createrLisence;
}
public void setCreaterLisence(String createrLisence) {
this.createrLisence = createrLisence;
}
public String getPatientId() {
return patientId;
}
public void setPatientId(String patientId) {
this.patientId = patientId;
}
public String getPatientName() {
return patientName;
}
public void setPatientName(String patientName) {
this.patientName = patientName;
}
public String getPatientGender() {
return patientGender;
}
public void setPatientGender(String patientGender) {
this.patientGender = patientGender;
}
//minagawa^ CLAIM送信 (予定カルテ対応)
public Date getClaimDate() {
return claimDate;
}
public void setClaimDate(Date date) {
claimDate = date;
}
//minagawa$
public boolean isPriscriptionOutput() {
return priscriptionOutput;
}
public void setPriscriptionOutput(boolean priscriptionOutput) {
this.priscriptionOutput = priscriptionOutput;
}
public PVTHealthInsuranceModel getpVTHealthInsuranceModel() {
return pVTHealthInsuranceModel;
}
public void setpVTHealthInsuranceModel(PVTHealthInsuranceModel pVTHealthInsuranceModel) {
this.pVTHealthInsuranceModel = pVTHealthInsuranceModel;
}
public Date getIssuanceDate() {
return issuanceDate;
}
public void setIssuanceDate(Date issuanceDate) {
this.issuanceDate = issuanceDate;
}
public String getInstitutionNumber() {
return InstitutionNumber;
}
public void setInstitutionNumber(String InstitutionNumber) {
this.InstitutionNumber = InstitutionNumber;
}
public Date getPeriod() {
return period;
}
public void setPeriod(Date period) {
this.period = period;
}
public boolean isChkPatientInfo() {
return chkPatientInfo;
}
public void setChkPatientInfo(boolean chkPatientInfo) {
this.chkPatientInfo = chkPatientInfo;
}
public boolean isChkUseDrugInfo() {
return chkUseDrugInfo;
}
public void setChkUseDrugInfo(boolean chkUseDrugInfo) {
this.chkUseDrugInfo = chkUseDrugInfo;
}
public boolean isChkHomeMedical() {
return chkHomeMedical;
}
public void setChkHomeMedical(boolean chkHomeMedical) {
this.chkHomeMedical = chkHomeMedical;
}
public boolean isUseGeneralName() {
return useGeneralName;
}
public void setUseGeneralName(boolean useGeneralName) {
this.useGeneralName = useGeneralName;
}
//minagawa^ 予定カルテ(予定カルテ対応)
public boolean isScheduled() {
boolean ret = (this.status!= null &&
this.status.equals(IInfoModel.STATUS_TMP) &&
this.getFirstConfirmDate()!= null &&
this.getConfirmDate()!=null &&
this.getFirstConfirmDate().after(this.getConfirmDate()));
return ret;
}
//minagawa$
/**
* @return the admFlag
*/
public String getAdmFlag() {
return admFlag;
}
/**
* @param admFlag the admFlag to set
*/
public void setAdmFlag(String admFlag) {
this.admFlag = admFlag;
}
}