/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.doctor.checkup.shedule;
import beans.directory.checkuptype.entity.CheckupType;
import framework.beans.FacadeBean;
import framework.beans.security.BeanRights;
import framework.beans.EntityDetails;
import beans.doctor.checkup.Checkup;
import beans.doctor.checkup.CheckupDetails;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.ejb.Stateful;
import beans.UserRightsSet;
import beans.user.collaborator.entities.CollaboratorFunctions;
import framework.audit.AuditDetails;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
import java.util.ArrayList;
/**
* Бин шедули анализов
* @security
* @author petr
*/
@Stateful(mappedName="clips-beans/CheckupSheduleBean")
public class CheckupSheduleBean extends FacadeBean<CheckupShedule>
implements CheckupSheduleBeanRemote {
public CheckupSheduleBean() {
super(CheckupShedule.class);
}
@Override
protected void initBeanRights() {
int[] r = new int[4];
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_CHECKUP_SHEDULE.id);
int cmr = RightPresence(UserRightsSet.MODIFY_CHECKUP_SHEDULE.id);
r[COMMAND_CREATE] = cmr;
r[COMMAND_MODIFY] = cmr;
r[COMMAND_REMOVE] = cmr;
rights = new BeanRights(r);
}
@Override
protected void onUpdate(CheckupShedule entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList) throws ClipsServerException {
CheckupSheduleDetails d = (CheckupSheduleDetails) details;
checkCommandAccessibility(COMMAND_MODIFY);
if(entity.getId() != 0) {
checkIsNotInThePast(entity.getDate());
}
checkIsNotInThePast(d.date);
entity.setDate(d.date);
entity.setType(findEntity(CheckupType.class, d.checkupTypeId));
}
@Override
protected void onRemove(CheckupShedule entity, List<AuditDoc> audit) throws ClipsServerException {
checkCommandAccessibility(COMMAND_REMOVE);
Field f[] = { new Field("checkupShedule", entity) };
if(getEntityCount(Checkup.class, f) > 0) {
throw new EDataIntegrity("Нельзя удалять запись в расписании анализа, без самого анализа");
}
}
@Override
public Set<CheckupDetails> getCheckupList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Set<CheckupDetails> res = new HashSet<CheckupDetails>();
CheckupShedule entity = getExistentEntity();
Field fields[] = {
new Field("checkupShedule", entity),
new Field("serviceRender.renderedDate", "", Field.OPERATOR_IS_NULL),
new Field("serviceRender.functions", "", Field.OPERATOR_IS_NULL),
};
List list = findEntityList(Checkup.class, fields);
Iterator i = list.iterator();
while (i.hasNext()) {
CheckupDetails d = ((Checkup) i.next()).getDetails(this);
res.add(d);
}
return res;
}
@Override
public ModificationInfo setCheckupList(Set<Integer> checkupSet) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
CheckupShedule entity = getExistentEntity();
Iterator<CheckupDetails> oi = getCheckupList().iterator();
Set<Integer> old = new HashSet<Integer>();
while (oi.hasNext()) {
old.add(oi.next().getId());
}
old.removeAll(checkupSet);
checkupSet.removeAll(old);
Iterator<Checkup> newI = null;
Iterator<Checkup> oldI = null;
Field[] fo = {new Field("id", old, Field.OPERATOR_IN)};
Field[] fn = {new Field("id", checkupSet, Field.OPERATOR_IN)};
if (!old.isEmpty()) {
oldI = findEntityList(Checkup.class, fo).iterator();
}
if (!checkupSet.isEmpty()) {
newI = findEntityList(Checkup.class, fn).iterator();
}
ArrayList<AuditDetails> auditDetailsList = new ArrayList<AuditDetails>();
if (oldI != null) {
while (oldI.hasNext()) {
Checkup checkup = oldI.next();
AuditDoc<Checkup> auditDoc = new AuditDoc<Checkup>(checkup, getCollaborator());
checkup.setCheckupShedule(null);
saveEntity(checkup);
auditDoc.check(checkup);
auditDetailsList.add(persistAudit(auditDoc));
}
}
if (newI != null) {
while (newI.hasNext()) {
Checkup checkup = newI.next();
AuditDoc<Checkup> auditDoc = new AuditDoc<Checkup>(checkup, getCollaborator());
checkup.setCheckupShedule(entity);
saveEntity(checkup);
auditDoc.check(checkup);
auditDetailsList.add(persistAudit(auditDoc));
}
}
return new ModificationInfo(entity.getId(), auditDetailsList);
}
@Override
public ModificationInfo finishRenderingServices() throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
CheckupShedule entity = getExistentEntity();
//сначала найдём все анализы из расписния
Field fields[] = {
new Field("checkupShedule", entity),
new Field("serviceRender.renderedDate", "", Field.OPERATOR_IS_NULL),
new Field("serviceRender.functions", "", Field.OPERATOR_IS_NULL),
};
List list = findEntityList(Checkup.class, fields);
Iterator it = list.iterator();
List<CollaboratorFunctions> list1
= findEntityList(CollaboratorFunctions.class,
new Field[]{new Field("collaborator.id", getCollaboratorId())});
if (list1.size() < 1){
throwNeedAdminSecurityException("Текущий сотрудник не может оказывать услуги");
}
CollaboratorFunctions collFunc = list1.get(0);
ArrayList<AuditDetails> auditDetailsList = new ArrayList<AuditDetails>();
while (it.hasNext()) {//шуршим по всем анализам
Checkup checkup = (Checkup) it.next();
AuditDoc<Checkup> auditCheckup = new AuditDoc<Checkup>(checkup, getCollaborator());
checkup.setCheckupShedule(null);//удаляем из расписания
saveEntity(checkup);
auditCheckup.check(checkup);
auditDetailsList.add(persistAudit(auditCheckup));
//теперь услуга к которой он привязан
//так сделано из предположения одна услуга - один анализ
ServiceRender serren = checkup.getServiceRender();
AuditDoc<ServiceRender> auditSerren = new AuditDoc<ServiceRender>(serren, getCollaborator());
if (serren.isRendered()) {
serren.setRepeat(serren.getRepeat() + 1);
}
serren.setFunctions(collFunc);
serren.setRenderedDate(new Date());
saveEntity(serren);
auditSerren.check(serren);
auditDetailsList.add(persistAudit(auditSerren));
}
AuditDoc<CheckupShedule> auditShedule = new AuditDoc<CheckupShedule>(entity, getCollaborator());
removeEntity(entity);
auditShedule.check(null);
auditDetailsList.add(persistAudit(auditShedule));
return new ModificationInfo(0, auditDetailsList);
}
}