/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.doctor.checkup;
import beans.doctor.MedicalDataBean;
import framework.beans.security.BeanRights;
import framework.beans.EntityDetails;
import framework.beans.GenericEntity;
import beans.DEC.HasSerren;
import beans.DEC.HasServiceRenderID;
import beans.directory.checkuptype.entity.CheckupType;
import beans.doctor.checkup.dicom.CheckupDicom;
import beans.doctor.checkup.dicom.CheckupDicomDetails;
import beans.doctor.checkup.shedule.CheckupShedule;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateful;
import framework.security.RightChecker;
import beans.UserRightsSet;
import beans.user.collaborator.entities.Collaborator;
import beans.user.collaborator.entities.CollaboratorFunctions;
import framework.audit.AuditDetails;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
/**
* @security - Ok.
* Integrity - may be Ok.
* @author axe
*/
@Stateful(mappedName="clips-beans/CheckupBean")
public class CheckupBean extends MedicalDataBean<Checkup>
implements CheckupBeanRemote {
private CheckupShedule shedule;
public CheckupBean() {
super(Checkup.class);
}
@Override
protected void initBeanRights() throws ClipsServerException {
/* Для чекапов
* право на чтение расширяется правом READ_ANALYSE_LIST
* право на изменение расширяется правом WRITE_ANALYSE_DURING_DAY или правом WRITE_ANALYSE_ANY_TIME
*/
if (getId() != 0) {
serviceRender = getExistentEntity().getServiceRender();
}
int[] r = getPrelimMedicalDataRights();
if (r[COMMAND_READ] <= 0) {
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_ANALYSE_LIST.id);
}
if (r[COMMAND_MODIFY] <= 0 && serviceRender != null) {
Checkup checkup = (getId() == 0) ? null : getExistentEntity();
if (checkup != null && checkup.getCheckupType().isAnalyse()) {
int modifyRight = 0;
if (RightPresence(UserRightsSet.WRITE_ANALYSE_DURING_DAY.id) > 0){
//Начинаем проверять со слабого права
modifyRight = serviceRender.canWriteDuringDay(
isSuperUser(),
UserRightsSet.WRITE_ANALYSE_DURING_DAY,
getCollaboratorId());
}
if (RightPresence(UserRightsSet.WRITE_ANALYSE_ANY_TIME.id) > 0){
//Если есть более сильное право, то команда перезаписывается им
modifyRight = serviceRender.canWriteAnyTime(
isSuperUser(),
UserRightsSet.WRITE_ANALYSE_ANY_TIME,
findEntity(Collaborator.class, getCollaboratorId()));
}
if (isSuperUser() && modifyRight <= 0) {
//Если суперюзер, и прав нету или запрет то всеравно разрешаем по самому сильному праву
modifyRight = UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id;
}
r[COMMAND_MODIFY] = modifyRight;
r[COMMAND_REMOVE] = modifyRight;
}
}
rights = new BeanRights(r);
}
/**
* Обновляет данные сущности.
* @param details новые детали сущности
* @throws ClipsServerException
* @return идентификатор сущности
* @security
* Установка прав для мед. данных Рецептов, рекоммендаций, направлений, противопоказаний,
* диагнозов и осмотров. Читать можно только по READ_MEDICAL_DATA.
* Изменять и удалять по WRITE_MEDICAL_DATA_DURING_DAY и WRITE_MEDICAL_DATA_ANY_TIME.
* Для осмотров ещё два, менее мощных права WRITE_ANALYSE_DURING_DAY и WRITE_ANALYSE_ANY_TIME.
* XXX_DURING_DAY - позволяет писать данные, если услуга не выполнена или выполнена в течении
* текущего дня, изменять данные может только сотрудник, создавший запись.
* XXX_ANY_TIME - позволяет редактировать любую запись, без ограничений.
*/
@Override
protected void onUpdate(Checkup entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList) throws ClipsServerException {
serviceRender = findEntity(ServiceRender.class, ((HasServiceRenderID)details).getServiceRenderID());
initBeanRights();
if (entity.getId() == 0) {
checkCommandAccessibility(COMMAND_CREATE);
} else {
checkCommandAccessibility(COMMAND_MODIFY);
}
CheckupDetails d = (CheckupDetails) details;
ServiceRender sr = findEntity(ServiceRender.class, d.serviceRenderID);
CheckupShedule cs = entity.getCheckupShedule();
/*if(entity.getId() == 0) {
//never use client date +
Дата - дата взятия проб - берется с клиента
entity.setDate(new Date());
}*/
//удаление чекапа из шедули и постановка на удаление шедули если она осталась пустой
if (cs != null
&& sr.isRendered()){
shedule = cs;
entity.setCheckupShedule(null);
}
entity.setServiceRender(sr);
entity.setCheckupType(findEntity(CheckupType.class, d.typeID));
entity.setXml(d.xml);
//Дата - дата взятия проб!
entity.setDate(d.date);
auditDoc.addFieldFormat("xml", entity.getCheckupType().getMetadata());
}
@Override
protected int saveEntity(GenericEntity entity) {
int id = super.saveEntity(entity);
if (shedule != null){//удаление пустой шедули
if (findEntityList(Checkup.class, "checkupShedule", shedule).isEmpty()){
manager.remove(manager.merge(shedule));
shedule = null;
}
}
return id;
}
@Override
protected void onRemove(Checkup entity, List<AuditDoc> auditList) throws ClipsServerException {
serviceRender = ((HasSerren)entity).getServiceRender();//Checkup has serren
if (serviceRender != null && serviceRender.isRendered()){
throwNeedAdminSecurityException("У вас недостаточно прав для удаления проведённого анализа");
}
initBeanRights();
checkCommandAccessibility(COMMAND_REMOVE);
Field f[] = { new Field("checkup", entity) };
deleteEntityList2(CheckupDicom.class, f, auditList);
for (AuditDoc auditDoc : auditList) {
auditDoc.addFieldFormat(entity, "xml", entity.getCheckupType().getMetadata());
}
}
@Override
public List<CheckupDicomDetails> getDicomObjects() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Checkup entity = getExistentEntity();
List data = findEntityList(CheckupDicom.class, "checkup", entity);
List<CheckupDicomDetails> target = new ArrayList<CheckupDicomDetails>(data.size());
for (Object object : data) {
target.add(((CheckupDicom)object).getDetails((RightChecker) this));
}
return target;
}
/**
* Сохраняет результаты анализа и делает услугу оказанной.
* !Внимание: после вызова этого метода связанный с чекапом делегат
* SerrenLocal теряет актуальность, его надо обновить с базы
* @throws ClipsServerException
*/
@Override
public ModificationInfo renderAnalyse() throws ClipsServerException {
ArrayList<AuditDetails> target = new ArrayList<AuditDetails>(2);
Checkup entity = getExistentEntity();
checkCommandAccessibility(isJustCreated() ? COMMAND_CREATE : COMMAND_MODIFY);
serviceRender = entity.getServiceRender();
if (!serviceRender.isRendered()) {
AuditDoc<ServiceRender> auditSerren = new AuditDoc<ServiceRender>(serviceRender, getCollaborator());
serviceRender.setRenderedDate(new Date());
List<CollaboratorFunctions> list = findEntityList(CollaboratorFunctions.class, new Field[]{new Field("collaborator.id", getCollaboratorId())});
if (list.size() < 1){
throwNeedAdminSecurityException("Текущий сотрудник не может оказывать услуги");
}
serviceRender.setFunctions(list.get(0));
saveEntity(serviceRender);
auditSerren.check(serviceRender);
target.add(persistAudit(auditSerren));
}
AuditDoc<Checkup> auditCheckup = new AuditDoc<Checkup>(entity, getCollaborator());
entity.setCheckupShedule(null);
saveEntity(entity);
auditCheckup.check(entity);
target.add(persistAudit(auditCheckup));
return new ModificationInfo(entity.getId(), target);
}
}