/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.doctor.medexam;
import beans.doctor.PacketService;
import beans.doctor.disease.Disease;
import framework.beans.EntityDetails;
import framework.beans.FacadeBean;
import framework.beans.security.BeanRights;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import java.util.List;
import javax.ejb.Stateful;
import beans.UserRightsSet;
import beans.directory.simple.entities.ProfChekupResult;
import beans.service.ServiceRender;
import beans.service.ServiceRenderBean;
import beans.service.ServiceRenderBeanLocal;
import beans.service.medexam.MedSerrenResult;
import beans.service.medexam.MedSerrenResultDetails;
import beans.service.medexam.Medexam;
import beans.service.medexam.MedexamDetails;
import framework.audit.AuditDoc;
import java.util.ArrayList;
import javax.ejb.EJB;
/**
* @security ok
* @author axe
*/
@Stateful(mappedName="clips-beans/MedexamBean")
public class MedexamBean extends FacadeBean<Medexam> implements MedexamBeanRemote {
@EJB
ServiceRenderBeanLocal srbl;
public MedexamBean() {
super(Medexam.class);
}
@Override
protected void initBeanRights() throws ClipsServerException {
int [] r = new int[4];
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_MEDICAL_DATA.id);
r[COMMAND_MODIFY] = RightPresence(UserRightsSet.WRITE_MEDEXAM_RESULT.id);
r[COMMAND_REMOVE] = RightPresence(UserRightsSet.WRITE_MEDEXAM_RESULT.id);
rights = new BeanRights(r);
}
@Override
protected void onRemove(Medexam entity, List<AuditDoc> auditDocLsit) throws ClipsServerException {
super.onRemove(entity, auditDocLsit);
int entityCount = getEntityCount(MedSerrenResult.class,
new Field[]{new Field("results", "", Field.OPERATOR_NOT_NULL),
new Field("serren.disease", entity.getDisease())});
if (entityCount>0){
throwNeedAdminSecurityException("Недостаточно прав для удаления медосмотра, имеющего результаты");
}
List<MedSerrenResult> msrList = findEntityList(MedSerrenResult.class, "serren.disease", entity.getDisease());
for (int i = 0; i < msrList.size(); i++) {
MedSerrenResult msr = msrList.get(i);
ServiceRender serren = msr.getSerren();
List<ServiceRender> findEntityList = findEntityList(ServiceRender.class, "referenced", serren);
if (findEntityList.size() != 0) {
for (ServiceRender referenced : findEntityList) {
srbl.initByID(referenced.getId(), getSessionId());
ServiceRenderBean.breakPacket(manager, referenced, getCollaborator(), auditDocLsit);
srbl.onRemove(referenced, auditDocLsit);
ServiceRenderBean.remove(manager, referenced, getCollaborator(), auditDocLsit);
}
}
srbl.initByID(serren.getId(), getSessionId());
ServiceRenderBean.breakPacket(manager, serren, getCollaborator(), auditDocLsit);
srbl.onRemove(serren, auditDocLsit);
ServiceRenderBean.remove(manager, serren, getCollaborator(), auditDocLsit);
}
Disease disease = entity.getDisease();
manager.remove(disease);
}
/**
* Обновляет данные сущности.
* @param entity
* @param details новые детали сущности
* @throws ClipsServerException
*/
@Override
protected void onUpdate(Medexam entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList) throws ClipsServerException{
MedexamDetails d = (MedexamDetails) details;
//Разграничение по действиям
//открытие больничного
if (getId() == 0) {
throw new EDataIntegrity("Нельзя создать медосмотр данным способом");
} else {
checkCommandAccessibility(COMMAND_MODIFY);
if (entity.getDisease().getId() != d.diseaseID) {
throw new EDataIntegrity("Нельзя заменять заболевание медосмотра");
}
if (entity.getMedexamType().getId() != d.medexamTypeID) {
throw new EDataIntegrity("Нельзя менять тип у медосмотра");
}
if (entity.getId() != d.id) {
throw new EDataIntegrity("Попытка подмены ID медосмотра");
}
entity.setResult(d.resultID == 0 ? null : findEntity(ProfChekupResult.class, d.resultID));
}
}
@Override
protected void afterUpdate(Medexam entity, boolean isNewEntity,
EntityDetails details, List<AuditDoc> audit) throws ClipsServerException {
super.afterUpdate(entity, isNewEntity, details, audit);
initBeanRights();
}
/**
* Возвращает список результатов медосмотров по услугам
* @return
* @throws framework.generic.ClipsServerException
*/
@Override
public List<MedSerrenResultDetails> getMedSerrenResultList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
// List<MedSerrenResult> entityList = findEntityList(MedSerrenResult.class, "medexam", getExistentEntity());
List<MedSerrenResult> entityList
= findEntityList(MedSerrenResult.class,
new Field[]{new Field("serren.disease", getExistentEntity().getDisease())});
List<MedSerrenResultDetails> res = new ArrayList<MedSerrenResultDetails>();
for (int i = 0; i < entityList.size(); i++) {
MedSerrenResult msr = entityList.get(i);
res.add(msr.getDetails(this));
}
return res;
}
/**
* Сохранение результата по услуге
* @param details
* @throws framework.generic.ClipsServerException
*/
@Override
public int setMedSerrenResult(MedSerrenResultDetails details) throws ClipsServerException {
MedSerrenResult entity = findEntity(MedSerrenResult.class, details.id);
//Проверка полей - ничо менять нельзя
if (entity.getSerren().getId() != details.serrenID) {
throw new EDataIntegrity("Попытка подмены результатов медосмотра");
}
//Проверка безопасности - выставлять результаты может только оказавший услугу, либо суперюзер
if (entity.getSerren().getFunctions() == null
|| entity.getSerren().getFunctions().getCollaborator().getId() != getCollaboratorId()) {
throwNeedAdminSecurityException("Выставить результат может только сотрудник, оказавший услугу");
}
entity.setResults(details.resultID == 0 ? null : findEntity(ProfChekupResult.class, details.resultID));
manager.persist(entity);
return entity.getId();
}
@Override
public String getPacketTitle() throws ClipsServerException {
List<ServiceRender> list = findEntityList(ServiceRender.class, "disease", getExistentEntity().getDisease());
if (list.size() == 0) {
return "Неизвестный медосмотр";
} else {
PacketService packet = list.get(0).getPacketService();
if (packet == null) {
return "Неизвестный медосмотр";
}
return packet.getPacketTemplate().getTitle();
}
}
}