/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.delegate.doctor.sicklist;
import beans.doctor.sicklist.SicklistBean;
import beans.doctor.sicklist.SicklistBeanRemote;
import cli_fmw.delegate.cache.ExtraDataManager;
import cli_fmw.delegate.cache.SecondaryCacheManager;
import cli_fmw.delegate.client.Address;
import beans.doctor.sicklist.entity.SicklistDetails;
import cli_fmw.delegate.directory.DirectoryItemRO;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.DEC.DECSicklist;
import cli_fmw.delegate.cache.DelegateExtraDataRO;
import cli_fmw.delegate.cache.DelegateSecondaryCacheDgt;
import cli_fmw.delegate.utils.TimeLocal;
import cli_fmw.main.ClipsException;
import cli_fmw.main.DelegatePrintable;
import cli_fmw.report.CombinedReportCreator;
import cli_fmw.report.CombinedReportOptions;
import cli_fmw.report.FormReportCreator;
import cli_fmw.report.PageOptions.PageOrentation;
import cli_fmw.report.ReporterFactory;
import clips.delegate.client.ClientLocal;
import clips.delegate.directory.complex.DirectoryEnterprise;
import clips.delegate.directory.complex.DirectoryEnterpriseItem;
import clips.delegate.directory.ro.DirectoryCollaborator;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.directory.simple.disablilityType.DirectoryDisabilityType;
import clips.delegate.directory.simple.disablilityType.DirectoryDisabilityTypeItem;
import clips.delegate.doctor.diagnosis.DiagnosisLocal;
import clips.delegate.service.SerRenLocal;
import clips.doctor.newEMC.init.generic.DelegateNodeLeaf;
import clips.login.UserInfo;
import clips.main.ClipsConfig;
import beans.doctor.sicklist.entity.SickLongDetails;
import cli_fmw.delegate.AuditListener;
import framework.utils.Converter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import framework.utils.DateTimeUtils;
import java.util.Date;
import java.util.HashMap;
/**
*
* @author axe
*/
public class SicklistLocal extends DelegateNodeLeaf<SicklistBeanRemote, SicklistDetails>
implements DelegatePrintable {
public static final int CONTINUED1 = 1;
public static final int CONTINUED2 = 2;
public static final int CONTINUED3 = 3;
DECSicklist prevSicklist = new DECSicklist(this, "больничный", getAuditListener());
DirectoryCollaborator directoryCollaborator;
DECDiagnosis diagnosisOpen = new DECDiagnosis(getSCM(), SicklistBeanRemote.DiagType.open);
DECDiagnosis diagnosisClose = new DECDiagnosis(getSCM(), SicklistBeanRemote.DiagType.close);
//DECServiceRender serrenClosed = new DECServiceRender(this);
SerrenCacheList serrenCache = new SerrenCacheList(getEDM());
DelegateExtraDataRO<ClientLocal>clientCache = new DelegateExtraDataRO<ClientLocal>(getEDM()) {
@Override
protected ClientLocal init() throws Exception {
return getDiagnosisOpen().getSerrenLocal().getDiseaseLocal().getEmcLocal().getClient();
}
@Override
protected ClientLocal initNew() {
return null;
}
};
public SicklistLocal(int id, ClientLocal cl, AuditListener al) throws ClipsException {
super(id, al);
if (cl == null) {
throw new IllegalArgumentException("cl can't be null");
}
clientCache.initBy(cl);
}
public SicklistLocal(SicklistDetails details, AuditListener al) throws ClipsException {
super(details, al);
}
public SicklistLocal(SicklistDetails details, ClientLocal cl, AuditListener al) throws ClipsException {
super(details, al);
if (cl == null) {
throw new IllegalArgumentException("cl can't be null");
}
clientCache.initBy(cl);
}
public SicklistLocal(ClientLocal cl) throws ClipsException {
super(cl.getAuditListener());
if (cl == null) {
throw new IllegalArgumentException("cl can't be null");
}
clientCache.initBy(cl);
}
@Override
protected SicklistDetails getNewDetails() {
SicklistDetails sicklistDetails = new SicklistDetails();
sicklistDetails.sickLongList = new ArrayList<SickLongDetails>();
return sicklistDetails;
}
@Override
public String toString() {
return "Больничный";
}
public String dataToString() throws ClipsException {
String a = Converter.dateToString(getDateOpen().getTime()) + "-";
if (getDateToWork() != null) {
a += Converter.dateToString(getDateToWork().getTime());
}
else {
a += "...";
}
a += "(" + getDiagnosisOpen().getMkb().getDiseaseCode() + ")";
return a;
}
public DirectoryDisabilityTypeItem getDisability() throws ClipsException {
DirectoryDisabilityType directoryDisab = DirectoryLocator.getDirectory(DirectoryDisabilityType.class);
return directoryDisab.getItemFromID(getDetails().disabID);
}
public void setDisability(DirectoryDisabilityTypeItem item) throws ClipsException {
if (item == null) {
getDetails().disabID = 0;
} else {
getDetails().disabID = item.getID();
}
fireContentStateEvent();
}
/**
* Клиент, которому выписан больничный (береца через диагноз открытия, заболевание и ЕМЦ)
* @return
* @throws ClipsException
*/
public ClientLocal getClient() throws ClipsException {
return clientCache.get();
}
/**
* Серийный номер
* @return
* @throws ClipsException
*/
public String getSerial() throws ClipsException {
return getDetails().serial;
}
/**
* @param serial Серийный номер.
* @throws ClipsException
*/
public void setSerial(String serial) throws ClipsException {
if (serial == null || serial.equals("")) {
getDetails().serial = null;
} else {
getDetails().serial = serial;
}
fireContentStateEvent();
}
public boolean isSerialNotSavedYet() throws ClipsException {
if (getSerial().trim().length() == 0 ||
!getSerial().equals(getDetailsOriginal().serial)) {
return true;
}
return false;
}
/**
* Дата открытия
* @return unix local time
* @throws ClipsException
*/
public GregorianCalendar getDateOpen() throws ClipsException {
GregorianCalendar c = new GregorianCalendar();
c.setTime(getDetails().dateOpen);
return c;
}
public void setDateOpen(Calendar c) throws ClipsException {
getDetails().dateOpen = DateTimeUtils.getDateOnly(c.getTime());
fireContentStateEvent();
}
/**
* Регистратор БЛ
* @return
* @throws ClipsException
*/
public DirectoryCollaboratorItem getRegistrator() throws ClipsException {
if (directoryCollaborator == null) {
directoryCollaborator = DirectoryLocator.getDirectory(DirectoryCollaborator.class, false);
}
return directoryCollaborator.getItemFromID(getDetails().registratorID);
}
public void setRegistrator(DirectoryCollaboratorItem coll) throws ClipsException {
getDetails().registratorID = coll.getID();
fireContentStateEvent();
}
/**
* Возвращает индекс группы связанного списка БЛ.
* Численно он равен идентифкатору первого БЛ в списке, однако это детали реализации
* и на это не стоит рассчитывать.
* @return
* @throws cli_fmw.main.ClipsException
*/
public int getGroupIndex() throws ClipsException {
return getDetails().headID;
}
/**
* Альтернативный автор, заданный текстом
* @return
* @throws ClipsException
*/
public String getAltOpener() throws ClipsException {
return getDetails().altOpener;
}
/**
* Альтернативный автор, заданный текстом
* @param collaboratorAlt
* @throws ClipsException
*/
public void setAltOpener(String collaboratorAlt) throws ClipsException {
if (collaboratorAlt == null || collaboratorAlt.equals("")) {
getDetails().altOpener = null;
} else {
getDetails().altOpener = collaboratorAlt;
}
fireContentStateEvent();
}
/**
* закрыт или нет БЛ
* @return
* @throws ClipsException
*/
public boolean isClosed() throws ClipsException {
return getDetails().closerID != 0 && getDetails().dateToWork != null;
}
/**
* Кто закрыл
* @return
* @throws ClipsException
*/
public DirectoryCollaboratorItem getCloser() throws ClipsException {
if (directoryCollaborator == null) {
directoryCollaborator = DirectoryLocator.getDirectory(DirectoryCollaborator.class, false);
}
return directoryCollaborator.getItemFromID(getDetails().closerID);
}
public void setCloser(DirectoryCollaboratorItem closer) throws ClipsException {
getDetails().closerID = closer.getID();
fireContentStateEvent();
}
/**
* Название предприятия, выдавшее больничный
* @return
* @throws ClipsException
*/
public String getLpuName() throws ClipsException {
if (getDetails().openerID == 0){
return getDetails().altLpu;
}
else{
return getOpener().getLpu().toString();
}
}
public String getAltLpu() throws ClipsException {
return getDetails().altLpu;
}
/**
* Предприятие, выдавшее больничный
* @param altLpu
* @throws ClipsException
*/
public void setAltLpu(String altLpu) throws ClipsException {
getDetails().altLpu = altLpu;
fireContentStateEvent();
}
/**
* * Куда направлен
* @return
* @throws ClipsException
*/
public DirectoryEnterpriseItem getEnterprise() throws ClipsException {
DirectoryEnterprise enterprise = DirectoryLocator.getDirectory(DirectoryEnterprise.class, false);
return enterprise.getItemFromID(getDetails().entID);
}
/**
* * Куда направлен
* @param enterprise
* @throws ClipsException
*/
public void setEnterprise(DirectoryEnterpriseItem enterprise) throws ClipsException {
getDetails().entID = enterprise == null ? 0 : enterprise.getID();
fireContentStateEvent();
}
/**
*
* @return
* @throws ClipsException
*/
public String getOtherDirection() throws ClipsException {
return getDetails().otherDirection;
}
/**
*
* @param otherDirection
* @throws ClipsException
*/
public void setOtherDirection(String otherDirection) throws ClipsException {
if (otherDirection == null || otherDirection.equals("")) {
getDetails().otherDirection = null;
} else {
getDetails().otherDirection = otherDirection;
}
fireContentStateEvent();
}
/**
* Количество освобождений от работы
* @return
* @throws cli_fmw.main.ClipsException
*/
public int getProlongationCount() throws ClipsException{
return getDetails().sickLongList.size();
}
/**
* Даты продления
* @param pos - номер даты продления
* @return
* @throws ClipsException
*/
public GregorianCalendar getTill(int pos) throws ClipsException {
if (pos >= getProlongationCount()) {
throw new IllegalArgumentException("Wrong position : " + pos);
}
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
if (pos < getDetails().sickLongList.size()) {
cal.setTime(getDetails().sickLongList.get(pos).date);
return cal;
} else {
return null;
}
}
/**
* Последняя дата продления
* @return
* @throws ClipsException
*/
public GregorianCalendar getTill() throws ClipsException {
int pos = getDetails().sickLongList.size();
if (pos == 0) {
return getDateOpen();
}
pos -= 1;
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
cal.setTime(getDetails().sickLongList.get(pos).date);
return cal;
}
public DirectoryCollaboratorItem getCreator() throws ClipsException {
return getCollaborator(0, false);
}
public DirectoryCollaboratorItem getOpener() throws ClipsException {
if (directoryCollaborator == null) {
directoryCollaborator = DirectoryLocator.getDirectory(DirectoryCollaborator.class, false);
}
return getDetails().openerID == 0 ? null : directoryCollaborator.getItemFromID(getDetails().openerID);
}
/**
* Сотрудники продляющие лист
* @param pos - номер продления
* @return
* @throws ClipsException
*/
public DirectoryCollaboratorItem getCollaborator(int pos) throws ClipsException {
return getCollaborator(pos, true);
}
/**
* Сотрудники продлявшие диагноз, с возможностью отключения проверки на корректность продления
* @param pos
* @param checkNumber
* @return
* @throws cli_fmw.main.ClipsException
*/
private DirectoryCollaboratorItem getCollaborator(int pos, boolean checkNumber) throws ClipsException {
if (directoryCollaborator == null) {
directoryCollaborator = DirectoryLocator.getDirectory(DirectoryCollaborator.class, false);
}
if (pos >= getProlongationCount()) {
if (checkNumber){
throw new IllegalArgumentException("Wrong position : " + pos);
}else{
return directoryCollaborator.getNullItem();
}
}else{
return directoryCollaborator.getItemFromID(getDetails().sickLongList.get(pos).collID);
}
}
/**
* Услуги (посещения) в которых лист был продлен
* @param pos - номер продления
* @return
* @throws ClipsException
*/
public SerRenLocal getSerRen(int pos) throws ClipsException {
if (pos >= getProlongationCount()) {
throw new IllegalArgumentException("Wrong position : " + pos);
}
return serrenCache.get().get(pos);
}
public void setOpener(DirectoryItemRO coll) throws ClipsException {
getDetails().openerID = coll == null ? 0 : coll.getID();
fireContentStateEvent();
}
public SicklistLocal getPreviousSicklist() throws ClipsException {
return prevSicklist.get();
}
public void setPreviousSicklist(SicklistLocal sicklistLocal) throws ClipsException {
prevSicklist.set(sicklistLocal);
fireContentStateEvent();
}
/**
* @return
* @throws ClipsException
*/
public String getDescription() throws ClipsException {
return getDetails().comment;
}
/**
* @param description
* @throws ClipsException
*/
public void setDescription(String description) throws ClipsException {
if (description == null || description.equals("")) {
getDetails().comment = null;
} else {
getDetails().comment = description;
}
fireContentStateEvent();
}
/**
* Дата выхода на работу (не факт что совпадёт с последним продлением,
* может быть меньше, контролируется сервером)
* @return unix local time
* @throws ClipsException
*/
public Calendar getDateToWork() throws ClipsException {
Calendar cal = GregorianCalendar.getInstance();
if (getDetails().dateToWork != null) {
cal.setTime(getDetails().dateToWork);
return cal;
} else {
return null;
}
}
/**
*
* @param dateToWork
* @throws ClipsException
*/
public void setDateToWork(Calendar dateToWork) throws ClipsException {
getDetails().dateToWork = DateTimeUtils.getDateOnly(dateToWork.getTime());
fireContentStateEvent();
}
public void prolongate(Calendar dateTill, SerRenLocal serRenLocal) throws ClipsException {
SickLongDetails sld = new SickLongDetails();
sld.collID = UserInfo.get().getCollaborator().getID();
sld.date = DateTimeUtils.getDateOnly(dateTill.getTime());
sld.serrenID = serRenLocal.getID();
getDetails().sickLongList.add(sld);
serrenCache.clearCache();
fireContentStateEvent();
}
@Override
protected String getBeanName() {
return SicklistBean.class.getSimpleName();
}
public DiagnosisLocal getDiagnosisClose() throws ClipsException {
return diagnosisClose.get();
}
public void setDiagnosisClose(DiagnosisLocal diagnosisClose) throws ClipsException {
this.diagnosisClose.set(diagnosisClose);
}
public DiagnosisLocal getDiagnosisOpen() throws ClipsException {
return diagnosisOpen.get();
}
public void setDiagnosisOpen(DiagnosisLocal diagnosisOpen) throws ClipsException {
this.diagnosisOpen.set(diagnosisOpen);
}
public SerRenLocal getSerrenClosed() throws ClipsException {
return serrenClosed.get();
}
public void setSerrenClosed(SerRenLocal serredClosed) throws ClipsException {
this.serrenClosed.set(serredClosed);
fireContentStateEvent();
}
@Override
public void print(CombinedReportCreator cCreator) throws ClipsException {
FormReportCreator creater = cCreator.createFormReporter(getClass(), 2);
ClientLocal client = getClient();
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("client", client.toString());
data.put("clientSex", client.getSex().toString());
data.put("clientBD", Converter.dateToString(client.getBorn()));
data.put("clientAddress", client.getAddress().toString());
DirectoryEnterpriseItem ent = getEnterprise();
data.put("clientJob", ent == null ? "" : ent.getTitle());
data.put("diagnosis", getDiagnosisClose().getMkb().getTitle());
data.put("diseaseCode", getDiagnosisClose().getMkb().getDiseaseCode());
Date dateFrom = getDateOpen().getTime();
Date dateTill = getDateToWork().getTime();
long dur = DateTimeUtils.daysBetween(dateFrom, dateTill);
data.put("duration", String.valueOf(dur));
data.put("date", Converter.dateToString(TimeLocal.getCurrentTime().getTime()));
data.put("collab", UserInfo.get().getCollaboratorLocal().toString());
creater.createReport(null, null, data.entrySet(), null);
creater.finish();
}
private static final int SICK_LIST_PAGE_WIGHT = 413;
private static final int SICK_LIST_SUBREPORT_PAGE_WIGHT = 350;
public void printOverBlank() throws ClipsException{
CombinedReportCreator combined = ReporterFactory.createCombinedReporter(getClass(), 1);
CombinedReportOptions reportOptions = new CombinedReportOptions();
reportOptions.setPageA5();
reportOptions.setOrentation(PageOrentation.vertical);
//reportOptions.reportWidht = SICK_LIST_PAGE_WIGHT;
//reportOptions.reportHeight = 470;
reportOptions.leftMargin = ClipsConfig.getInstance().getSicklistLeftMarign();
reportOptions.fixRightMarign(SICK_LIST_SUBREPORT_PAGE_WIGHT);
reportOptions.topMargin = ClipsConfig.getInstance().getSicklistTopMarign();
reportOptions.bottomMargin = 0;
combined.setUpReport(null, reportOptions, null);
FormReportCreator creator = combined.createFormReporter(getClass(), 3);
GregorianCalendar dateFrom = getDateOpen();
ClientLocal client = getClient();
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("client", client.toString());
data.put("client_is_male", client.getSex().isMale());
if (client.getBorn() != null){
data.put("client_age", DateTimeUtils.calcAge(client.getBorn(), dateFrom.getTime()));
}
else{
data.put("client_age", null);
}
data.put("emc_code", client.getNumberEmc());
if (getProlongationCount() > 0){
Address adr = getSerRen(0).getPolisData().getAddress();
if (adr == null){
adr = client.getAddress();
}
data.put("client_address", adr == null? null: adr.toStringShort());
}
if (getOpener() == null){
data.put("collaborator", getAltOpener());
}
else{
ClientLocal clolClient = new ClientLocal(getOpener().getDetails().getClient(), null);
data.put("collaborator", clolClient.getSurname().getTitle());
}
DirectoryEnterpriseItem ent = getEnterprise();
data.put("clientJob", ent == null ? getOtherDirection() : ent.getTitle());
data.put("prev_sick_list_id", getPreviousSicklist() == null? null: getPreviousSicklist().getSerial());
data.put("day_month_open", dateFrom.get(GregorianCalendar.DAY_OF_MONTH) + " " + DateTimeUtils.monthToString(dateFrom.get(GregorianCalendar.MONTH)));
String yearOp = "" + dateFrom.get(GregorianCalendar.YEAR);
data.put("year_open", yearOp.substring(yearOp.length() - 2));
data.put("date_open", dateFrom.getTime());
data.put("dis_type", getDisability().getID());
data.put("date_close", getDateToWork() == null? null: getDateToWork().getTime());
if (getProlongationCount() > 0){
GregorianCalendar dateTill = getTill(0);
data.put("date_till_1", dateTill == null? null: dateTill.getTime());
}
else{
data.put("date_till_1", null);
}
if (getProlongationCount() > 1){
GregorianCalendar dateTill = getTill(1);
data.put("date_till_2", dateTill == null? null: dateTill.getTime());
}
else{
data.put("date_till_2", null);
}
if (getProlongationCount() > 2){
GregorianCalendar dateTill = getTill(2);
data.put("date_till_3", dateTill == null? null: dateTill.getTime());
}
else{
data.put("date_till_3", null);
}
if (getProlongationCount() > 3){
GregorianCalendar dateTill = getTill(3);
data.put("date_till_4", dateTill == null? null: dateTill.getTime());
}
else{
data.put("date_till_4", null);
}
creator.createReport(null, null, data.entrySet(), null);
creator.finish();
combined.finish();
}
class DECDiagnosis extends DelegateSecondaryCacheDgt<DiagnosisLocal>{
SicklistBeanRemote.DiagType type;
public DECDiagnosis(SecondaryCacheManager contaner, SicklistBeanRemote.DiagType type) throws ClipsException {
super(contaner, true, "дигноз");
this.type = type;
}
@Override
protected DiagnosisLocal init() throws Exception {
switch (type){
case open:
return getDetails().diagOpenID == 0? null: new DiagnosisLocal(getDetails().diagOpenID, getAuditListener());
case close:
return getDetails().diagCloseID == 0? null: new DiagnosisLocal(getDetails().diagCloseID, getAuditListener());
default:
throw new RuntimeException();
}
}
@Override
protected void setPrimary(DiagnosisLocal data) throws ClipsException {
int id = data == null? 0: data.getID();
switch (type){
case open:
getDetails().diagOpenID = id;
break;
case close:
getDetails().diagCloseID = id;
break;
default:
throw new RuntimeException();
}
}
}
private DelegateSecondaryCacheDgt<SerRenLocal> serrenClosed
= new DelegateSecondaryCacheDgt<SerRenLocal>(getSCM(), true, "услуге, в рамках которой произведено закрытие") {
@Override
protected SerRenLocal init() throws Exception {
if (getDetails().serrenCloseID != 0){
return new SerRenLocal(getDetails().serrenCloseID, getAuditListener());
}else{
return null;
}
}
@Override
protected void setPrimary(SerRenLocal type) throws ClipsException {
if (type != null){
getDetails().serrenCloseID = type.getID();
}else{
getDetails().serrenCloseID = 0;
}
}
};
private class SerrenCacheList extends DelegateExtraDataRO<ArrayList<SerRenLocal>> {
public SerrenCacheList(ExtraDataManager contaner) {
super(contaner);
}
@Override
protected ArrayList<SerRenLocal> init() throws Exception {
ArrayList<SerRenLocal> res = new ArrayList<SerRenLocal>();
for (SickLongDetails sld : getDetails().sickLongList) {
res.add(new SerRenLocal(sld.serrenID, getAuditListener()));
}
return res;
}
@Override
protected ArrayList<SerRenLocal> initNew() {
return new ArrayList<SerRenLocal>();
}
}
}