/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.delegate.doctor.certificate;
import beans.doctor.certificate.CertificateBean;
import beans.doctor.certificate.CertificateBeanRemote;
import clips.delegate.client.ClientLocal;
import beans.doctor.certificate.CertificateDetails;
import cli_fmw.delegate.AuditListener;
import clips.delegate.directory.complex.DirectoryCertificateType;
import clips.delegate.directory.complex.DirectoryCertificateTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.doctor.Iconable;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.main.ClipsException;
import cli_fmw.delegate.utils.TimeLocal;
import clips.doctor.newEMC.init.generic.DelegateNodeLeaf;
import clips.delegate.doctor.certificate.tag.ResultCertTag;
import clips.delegate.DEC.DECClient;
import clips.delegate.directory.ro.DirectoryCollaborator;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.doctor.DiseaseLocal;
import clips.delegate.doctor.Signable;
import clips.login.UserInfo;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Element;
import org.jdom.JDOMException;
import framework.utils.Converter;
import java.util.Date;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.jdom.Document;
import framework.utils.DateTimeUtils;
/**
* Делегат, предоставляющий доступ к одной строке таблицы certificate
* (справки) а также подгружающий из базы данные по типу справки из таблицы
* certificate_type (типы справки), которая содержит название, печатную форму
* а тажкже информацию о наполнении справки (матаданные)
* @author ViP
*/
public class CertificateLocal extends DelegateNodeLeaf<CertificateBeanRemote, CertificateDetails>
implements Iconable, Signable {
private DECClient client = new DECClient(this, "информацию о пациенте, которому выписана справка", getAuditListener());
private static ImageIcon icon = null;
private Boolean canBeEdit;
/**Дополнительные данные можно передать через заболевание при создании справки*/
private DiseaseLocal disease = null;
/**
* Create ne certificate with extra data
* @param c
* @param disease extra data for new certificate
* @throws ClipsException
*/
public CertificateLocal(ClientLocal c, DiseaseLocal disease) throws ClipsException {
super(c.getAuditListener());
client.initBy(c);
try{
if (disease != null && disease.getEmcLocal().getClient().getID() == c.getID()){
this.disease = disease;
}
}catch(ClipsException ex){
ex.printStackTrace();
}
getDetails().collaboratorID = UserInfo.get().getCollaborator().getID();
getDetails().date = TimeLocal.getCurrentTime().getTime();
getDetails().xml = Converter.xmlToString(new Document(new Element("Certificate")));
}
// public CertificateLocal(ClientLocal c) throws ClipsException {
// this(c, null);
// }
public CertificateLocal(CertificateDetails details, ClientLocal c, AuditListener al) throws ClipsException {
super(details, al);
client.initBy(c);
}
@Override
protected CertificateDetails getNewDetails() {
return new CertificateDetails();
}
public boolean isCanBeEdit() throws ClipsException {
if (canBeEdit == null) {
canBeEdit = DateTimeUtils.belongsToCurrentDay(getDate());
}
return canBeEdit;
}
public ClientLocal getClientLocal() throws ClipsException {
return client.get();
}
public Date getDate() throws ClipsException {
return getDetails().date;
}
//Never use client data
@Deprecated
public void setDate(Date date) throws ClipsException {
getDetails().date = date;
fireContentStateEvent();
}
/**
* Возвращает результат по тегу
* @param tagName
* @return
* @throws cli_fmw.main.ClipsException
* @throws org.jdom.JDOMException
*/
public ResultCertTag getCertTagResult(String tagName) throws ClipsException {
ResultCertTag result = new ResultCertTag();
Document doc = null;
try {
doc = Converter.stringToXml(getDetails().xml);
} catch (JDOMException ex) {
throw new ClipsException("Неверная XML справки", ex);
}
Element root = doc.getRootElement();
Element child = root.getChild(tagName);
if (child == null) {
result.text = "";
result.items = new ArrayList<Integer>();
return result;
} else {
result.text = child.getTextTrim();
if (result.text.startsWith("\"") && result.text.endsWith("\"")) {
result.text = result.text.substring(1, result.text.length() - 1);
}
result.items = new ArrayList<Integer>();
List children = child.getChildren("id");
for (int i = 0; i < children.size(); i++) {
Element element = (Element) children.get(i);
String text = element.getText();
int value = Integer.parseInt(text);
result.items.add(value);
}
return result;
}
}
/**
* Выставляет результат по тегу
* @param tagName
* @param certTagResult
* @throws cli_fmw.main.ClipsException
* @throws org.jdom.JDOMException
*/
public void setCertTagResult(String tagName, ResultCertTag certTagResult) throws ClipsException {
Document doc = null;
try {
doc = Converter.stringToXml(getDetails().xml);
} catch (JDOMException ex) {
throw new ClipsException("Неверная XML справки", ex);
}
Element root = doc.getRootElement();
Element child = root.getChild(tagName);
if (child == null) {
child = new Element(tagName);
root.addContent(child);
}
child.removeContent();
child.setText('"' + certTagResult.text != null ? certTagResult.text : "" + '"');
for (int i = 0; i < certTagResult.items.size(); i++) {
Integer integer = certTagResult.items.get(i);
Element id = new Element("id");
id.setText(integer.toString());
child.addContent(id);
}
getDetails().xml = Converter.xmlToString(doc);
fireContentStateEvent();
}
public DirectoryCollaboratorItem getCollaborator() throws ClipsException {
DirectoryCollaborator directory = DirectoryLocator.getDirectory(DirectoryCollaborator.class, false);
return directory.getItemFromID(getDetails().collaboratorID);
}
public DirectoryCertificateTypeItem getType() throws ClipsException {
DirectoryCertificateType certificateTypes = DirectoryLocator.getDirectory(DirectoryCertificateType.class, false);
return certificateTypes.getItemFromID(getDetails().typeID);
}
public void setType(DirectoryCertificateTypeItem type) throws ClipsException {
if(getDetails().typeID != 0 && getDetails().typeID != type.getID()) {
throw new ClipsException("Запрещено менять тип справки");
}
getDetails().typeID = type.getID();
fireContentStateEvent();
}
@Override
public Icon getIcon() {
return icon;
}
@Override
public String toString() {
String toStr;
try {
toStr = "[" + Converter.dateToString(getDate()) + "] ";
toStr += getType().getTitle();
} catch (ClipsException ex) {
//ex.printStackTrace();
toStr = "Ошибка сервера";
}
return toStr;
}
@Override
protected String getBeanName() {
return CertificateBean.class.getSimpleName();
}
@Override
public boolean isSignCorrect() throws ClipsException{
//STUB
return (getID() != -1 );
//END STUB
}
@Override
public String getSignMessage() throws ClipsException {
if (getID() == 0) {
return "Подпись отсутствует";
}
//STUB
String coll;
if (getCollaborator() != null) {
coll = getCollaborator().getTitle();
} else {
return "Подпись отсутствует";
}
String s = "Подписано " + Converter.dateToString(getDate())
+ " - " + coll;
if (isSignCorrect() ) {
return s;
} else {
return "Подпись не соответствует данным!";
}
//END STUB
}
/**
* use only for new delegate
* @return can return null
*/
public DiseaseLocal getDisease() {
return disease;
}
}