/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.directory.checkuptype;
import beans.directory.checkuptype.entity.CheckupTypeDetails;
import framework.beans.directory.DirectoryBean;
import framework.beans.directory.DirectoryItemDetails;
import beans.directory.checkuptype.entity.CheckupType;
import beans.directory.service.entity.Service;
import beans.laboratory.Laboratory;
import beans.doctor.checkup.Checkup;
import java.util.Iterator;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import framework.generic.EMoveToTrash;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.Query;
import beans.UserRightsSet;
import beans.directory.simple.entities.Speciality;
import beans.directory.checkuptype.entity.SpecialityCheckupType;
import beans.directory.checkuptype.entity.SpecialityCheckupTypePK;
import framework.security.UserRight;
/**
* Security - Ok.
* @author axe
*/
@Stateful(mappedName="clips-beans/DirectoryCheckupTypeBean")
public class DirectoryCheckupTypeBean extends DirectoryBean<CheckupType, CheckupTypeDetails>
implements DirectoryCheckupTypeBeanRemote {
public DirectoryCheckupTypeBean() {
super(CheckupType.class, "тип осмотра");
}
@Override
protected UserRight getRightForCreateDirectoryItem() {
return UserRightsSet.WRITE_REGION_ADMIN_DIRECTORY;
}
@Override
protected UserRight getRightForWriteToDirectory() {
return UserRightsSet.WRITE_REGION_ADMIN_DIRECTORY;
}
@Override
protected void set(CheckupType entity, CheckupTypeDetails details) {
CheckupType checkupType = entity;
CheckupTypeDetails d = details;
checkupType.setTitle(d.title);
//checkupType.setDirty(details.dirty);
checkupType.setMetadata(d.metadata);
checkupType.setDescription(d.description);
checkupType.setIsanalyse(d.isAnalyse);
checkupType.setTrash(d.hidden);
}
@Override
protected void onAppend(CheckupTypeDetails details) throws ClipsServerException {
check(details);
}
@Override
protected void onRemove(CheckupType entity) throws ClipsServerException {
CheckupType checkupType = entity;
Field f[] = { new Field("checkupType", checkupType) };
//проверяем, если ли связанные услуги
List serviceList = findEntityList(Service.class, f);
if(serviceList.size() > 0) {
String s = "";
for (int i = 0; i < serviceList.size(); i++) {
Service service = (Service)serviceList.get(i);
s += "\n" + service.getCodeAndTitle();
}
throw new EDataIntegrity("Удаление невозможно, с данным анализом связаны следующие услуги" + s);
}
//проверяем, есть ли связанные осмотры
Field f2[] = { new Field("checkupType", checkupType) };
if(getEntityCount(Checkup.class, f2) > 0) {
throw new EMoveToTrash("Существуют анализы и осмотры данного типа, удаление невозможно");
}
//удаляем связи с лабораториями
try {
String sql = "Select a FROM " + Laboratory.class.getSimpleName() + " a" +
", IN (a.checkupTypes) as ch WHERE ch.id = :checkupType";
Query query = manager.createQuery(sql);
query.setParameter("checkupType", checkupType.getId());
Iterator i = query.getResultList().iterator();
while(i.hasNext()) {
Laboratory lab = (Laboratory) i.next();
lab.getCheckupTypes().remove(checkupType);
manager.merge(lab);
}
} catch (Exception ex) {
throw new ClipsServerException("Попытка удаления лабораторий не удалась: ", ex);
}
}
@Override
protected void onUpdate(CheckupType entity, CheckupTypeDetails details) throws ClipsServerException {
check(details);
}
/**
* проверка полей на валидность
* @param details
* @throws generic.ClipsServerException
*/
private void check(DirectoryItemDetails details) throws ClipsServerException {
CheckupTypeDetails d = (CheckupTypeDetails) details;
if(d.metadata == null || d.metadata.trim().isEmpty()) {
throw new EDataIntegrity("Не задана форма данных");
}
checkXML(d.metadata);
}
/**
* Имеются ли чекапы данного типа
* Если чекапов нет, то можно изменять метадату как угодно
* @param id
* @return
* @throws generic.ClipsServerException
*/
@Override
public boolean isNotUsedInCheckup(int id) throws ClipsServerException {
Field field[] = {
new Field("checkupType.id", id)
};
return getEntityCount(Checkup.class, field) == 0;
}
@Override
public void addItemToFilter(DirectoryItemDetails filter, CheckupTypeDetails item) throws ClipsServerException {
removeItemFromFilter(filter, item);
SpecialityCheckupType sct = new SpecialityCheckupType(new SpecialityCheckupTypePK(filter.id, item.id));
manager.persist(sct);
}
@Override
public CheckupTypeDetails[] getItemDetailsByFilter(DirectoryItemDetails filter) {
List<SpecialityCheckupType> list = findEntityList(SpecialityCheckupType.class, "key.speciality", filter.id);
CheckupTypeDetails[] res = new CheckupTypeDetails[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i).getCheckupType().getDetails(this);
}
return res;
}
@Override
public void removeItemFromFilter(DirectoryItemDetails filter, CheckupTypeDetails item) throws ClipsServerException {
findEntity(Speciality.class, filter.getId());
findEntity(CheckupType.class, item.id);
Field f[] = {
new Field("key.speciality", filter.getId()),
new Field("key.checkupType", item.id),
};
deleteEntityList(SpecialityCheckupType.class, f);
}
}