/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.doctor.prescription;
import framework.beans.EntityDetails;
import beans.doctor.MedicalDataBean;
import beans.directory.simple.entities.TakeDrug;
import beans.directory.vidal.entities.Vidal;
import beans.service.ServiceRender;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import framework.generic.ClipsServerException;
import framework.generic.ESecurity;
import java.util.Date;
import javax.ejb.EJBException;
import javax.ejb.Stateful;
import framework.security.RightChecker;
import framework.utils.DateTimeUtils;
/**
* @security - Ok.
* Integrity - may be Ok.
* @author axe
*/
@Stateful(mappedName="clips-beans/PrescriptionBean")
public class PrescriptionBean extends MedicalDataBean<Prescription>
implements PrescriptionBeanRemote {
public PrescriptionBean() {
super(Prescription.class);
}
/**
* Обновляет данные сущности.
* @param details новые детали сущности
* @throws EJBException в случае если обновление отвергнуто системой
* безопастности либо произошла ошибка
* @return идентификатор сущности
* Безопасность.
* Установка прав для мед. данных Рецептов, рекоммендаций, направлений, противопоказаний,
* диагнозов и осмотров. Читать можно только по 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 - позволяет редактировать любую запись, без ограничений.
*/
@Override
protected void onUpdate(Prescription entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList)
throws ClipsServerException {
super.onUpdate(entity, details, auditDoc, auditDocList);
PrescriptionDetails d = (PrescriptionDetails) details;
if(entity.getId() != 0) {
if(entity.getServiceRender().getId() != d.serviceRenderID) {
throw new ESecurity("Cмена услуги недопустима");
}
}
if (!DateTimeUtils.belongsToCurrentDay(d.date)) {
throwNeedAdminSecurityException("Попытка подмены даты");
}
entity.setDate(d.date);
entity.setServiceRender(findEntity(ServiceRender.class, d.serviceRenderID));
}
/**
* Удаляет сущность из базы данных
*/
@Override
protected void onRemove(Prescription entity, List<AuditDoc> auditDocList) throws ClipsServerException {
super.onRemove(entity, auditDocList);
deleteEntityList2(PrescriptionItem.class, new Field [] { new Field("prescription", entity) },
auditDocList);
}
/**
* Возвращает список содержимого назначения
* @return список деталей - элементов назначения
*/
@Override
public List<PrescriptionItemDetails> getPrescriptionsList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Prescription entity = getExistentEntity();
Collection<PrescriptionItem> list = findEntityList(PrescriptionItem.class, "prescription", entity);
List<PrescriptionItemDetails> res = new ArrayList<PrescriptionItemDetails>();
Iterator<PrescriptionItem> i = list.iterator();
while(i.hasNext()) {
PrescriptionItem j = i.next();
res.add(j.getDetails((RightChecker) this));
}
return res;
}
/**
* Добавляет или обновляет элемент назначения. Если details.id = 0 сущность создается,
* иначе обновляется существующая с заданным идентификатором.
* @param details данные
* @return идентификатор сущности
* @throws EJBException в случае если обновление отвергнуто системой
* безопастности либо произошла ошибка *
*/
@Override
public ModificationInfo setPrescriptionItem(PrescriptionItemDetails details) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
Prescription entity = getExistentEntity();
PrescriptionItem prescriptionItem = null;
AuditDoc<PrescriptionItem> auditDoc;
if(details.id != 0) {
prescriptionItem = findEntity(PrescriptionItem.class, details.id);
checkTheSame(prescriptionItem.getPrescription());
auditDoc = new AuditDoc<PrescriptionItem>(prescriptionItem, getCollaborator());
} else {
auditDoc = new AuditDoc<PrescriptionItem>(null, getCollaborator());
prescriptionItem = new PrescriptionItem();
prescriptionItem.setPrescription(entity);
}
prescriptionItem.setVidal(findEntity(Vidal.class, details.vidalID));
prescriptionItem.setTakeDrug(findEntity(TakeDrug.class, details.takeDrugID));
prescriptionItem.setDescription(details.description);
int id = saveEntity(prescriptionItem);
auditDoc.check(prescriptionItem);
return new ModificationInfo(id, persistAudit(auditDoc));
}
/**
* Удаляет элемент из назначения.
* @param id идентификатор элемента
* @throws EJBException в случае если обновление отвергнуто системой
* безопастности либо произошла ошибка *
*/
@Override
public ModificationInfo removePrescriptionItem(int id) throws ClipsServerException {
checkCommandAccessibility(COMMAND_REMOVE);
checkEntityExist();
PrescriptionItem prescriptionItem = findEntity(PrescriptionItem.class, id);
checkTheSame(prescriptionItem.getPrescription());
AuditDoc<PrescriptionItem> auditDoc = new AuditDoc<PrescriptionItem>(prescriptionItem, getCollaborator());
manager.remove(prescriptionItem);
auditDoc.check(null);
return new ModificationInfo(persistAudit(auditDoc));
}
}