/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.doctor;
import framework.beans.FacadeBean;
import framework.beans.security.BeanRights;
import framework.beans.EntityDetails;
import framework.beans.GenericEntity;
import beans.DEC.HasSerren;
import beans.DEC.HasServiceRenderID;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import java.util.BitSet;
import framework.security.SecurityChecker;
import beans.UserRightsSet;
import beans.doctor.checkup.Checkup;
import beans.doctor.checkup.dicom.CheckupDicomDetails;
import beans.user.collaborator.entities.Collaborator;
import framework.audit.AuditDoc;
import framework.generic.EDataIntegrity;
import framework.utils.DateTimeUtils;
import java.util.List;
/**
*
* @author antony
*/
public abstract class MedicalDataBean<GEN extends GenericEntity>
extends FacadeBean<GEN> {
protected ServiceRender serviceRender;
public MedicalDataBean(Class<GEN> cls) {
super(cls);
}
private static final int getRightCreation(BitSet aRightsSet) {
int r = SecurityChecker.RightPresence(aRightsSet, UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id);
if (r < 0) {
r = SecurityChecker.RightPresence(aRightsSet, UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id);
}
return r;
}
public static final boolean canCreateEntity(BitSet aRightsSet) {
return getRightCreation(aRightsSet) > 0;
}
/**
* Безопасность.
* Установка прав для мед. данных Рецептов, рекоммендаций, направлений, противопоказаний,
* диагнозов и осмотров. Читать можно только по READ_MEDICAL_DATA.
* Изменять и удалять по WRITE_MEDICAL_DATA_DURING_DAY и WRITE_MEDICAL_DATA_ANY_TIME.
* Для осмотров ещё два, менее мощных права WRITE_CHECKUP_DURING_DAY и WRITE_CHECKUP_ANY_TIME.
* XXX_DURING_DAY - позволяет писать данные, если услуга не выполнена или выполнена в течении
* текущего дня, изменять данные может только сотрудник, создавший запись.
* XXX_ANY_TIME - позволяет редактировать любую запись, без ограничений.
*
* Варианты:
* суперюзер разрешено
* услуга не оказана
* - XXX_DURING_DAY разрешено
* - XXX_ANY_TIME разрешено
* услуга оказана сегодня
* - XXX_DURING_DAY, сотрудник тотже разрешено
* - XXX_DURING_DAY, сотрудник другой запрещено
* - XXX_ANY_TIME, сотрудник тотже разрешено
* - XXX_ANY_TIME, сотрудник другой, из той же клиники разрешено
* - XXX_ANY_TIME, сотрудник другой, из другой клиники запрещено
* услуга оказана не сегодня
* - XXX_DURING_DAY, сотрудник тотже запрещено
* - XXX_DURING_DAY, сотрудник другой запрещено
* - XXX_ANY_TIME, сотрудник тотже разрешено
* - XXX_ANY_TIME, сотрудник другой, из той же клиники разрешено
* - XXX_ANY_TIME, сотрудник другой, из другой клиники запрещено
*
* Варианты в другой раскладке:
* ПРАВ НЕТ:
* - Суперюзер разрешено
* XXX_DURING_DAY
* - услуга не оказана разрешено
* - услуга оказана сегодня, сотрудник тотже разрешено
* - услуга оказана сегодня, сотрудник другой запрещено
* - услуга оказана не сегодня, сотрудник любой запрещено
* XXX_ANY_TIME
* - услуга не оказана разрешено
* - услуга оказана пофик когда, сотрудник тотже разрешено
* - услуга оказана пофик когда, сотрудник другой, из той же клиники разрешено
* - услуга оказана пофик когда, сотрудник другой, из другой клиники запрещено
* @return
*/
protected int [] getPrelimMedicalDataRights() throws ClipsServerException {
int [] r = new int[4];
if (serviceRender == null) {
//при первой инициализации, когда неизвестна услуга
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_MEDICAL_DATA.id);
r[COMMAND_CREATE] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
r[COMMAND_MODIFY] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
r[COMMAND_REMOVE] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
} else {
//при повторной инициализации, когда услуга известна
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_MEDICAL_DATA.id);
int modifyRight = 0;
if (RightPresence(UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id) > 0){
//Начинаем проверять со слабого права
modifyRight = serviceRender.canWriteDuringDay(
isSuperUser(),
UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY,
getCollaboratorId());
}
if (RightPresence(UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id) > 0){
//Если есть более сильное право, то команда перезаписывается им
modifyRight = serviceRender.canWriteAnyTime(
isSuperUser(),
UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME,
findEntity(Collaborator.class, getCollaboratorId()));
}
if (isSuperUser() && modifyRight <= 0) {
//Если суперюзер, и прав нету или запрет то всеравно разрешаем по самому сильному праву
modifyRight = UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id;
}
if (modifyRight == 0) {
modifyRight = -UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
}
r[COMMAND_MODIFY] = modifyRight;
r[COMMAND_REMOVE] = modifyRight;
}
return r;
}
@Override
protected void initBeanRights() throws ClipsServerException{
int [] r = getPrelimMedicalDataRights();
rights = new BeanRights(r);
}
/**
* Проверка на возможность создания, модификации
* @param entity
* @param details
* @throws generic.ClipsServerException
*/
@Override
protected void onUpdate(GEN entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList)
throws ClipsServerException{
if (details instanceof HasServiceRenderID) {
serviceRender = findEntity(ServiceRender.class, ((HasServiceRenderID)details).getServiceRenderID());
} else if (details instanceof CheckupDicomDetails) {
Checkup checkup = findEntity(Checkup.class,((CheckupDicomDetails)details).checkupID);
serviceRender = checkup.getServiceRender();
} else {
throw new ClipsServerException("Медицинские данные не относятся к услуге");
}
initBeanRights();
if (isSuperUser()) {
return;
}
if (serviceRender.getDisease().getClosed() != null
&& !DateTimeUtils.belongsToCurrentDay(serviceRender.getDisease().getClosed())) {
throw new EDataIntegrity("Запрещено изменять медицинские данные, находящиеся в закрытом заболевании");
}
if (entity.getId() == 0) {
checkCommandAccessibility(COMMAND_CREATE);
} else {
checkCommandAccessibility(COMMAND_MODIFY);
}
}
/**
* Проверка на возможность удаления
* @param entity
* @throws generic.ClipsServerException
*/
@Override
protected void onRemove(GEN entity, List<AuditDoc> auditDocList) throws ClipsServerException {
if (entity instanceof HasSerren) {
serviceRender = ((HasSerren)entity).getServiceRender();
}
initBeanRights();
if (isSuperUser()) {
return;
}
if (serviceRender.getDisease().getClosed() != null
&& !DateTimeUtils.belongsToCurrentDay(serviceRender.getDisease().getClosed())) {
throw new EDataIntegrity("Запрещено удалять медицинские данные, находящиеся в закрытом заболевании");
}
checkCommandAccessibility(COMMAND_REMOVE);
}
}