/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.directory.service;
import beans.directory.service.entity.ServiceDetails;
import framework.beans.directory.DirectoryBean;
import beans.contract.entity.ServicePrice;
import beans.directory.checkuptype.entity.CheckupType;
import beans.directory.danger.entity.DangerService;
import beans.directory.packet.entity.PacketTemplateItem;
import beans.directory.service.entity.Service;
import beans.directory.service.entity.ServiceAction;
import beans.directory.service.entity.ServiceActionPK;
import beans.directory.service.entity.ServiceGroup;
import beans.directory.service.entity.ServiceToService;
import beans.directory.service.entity.ServiceToServiceDetails;
import beans.directory.service.entity.ServiceToServicePK;
import beans.directory.simple.entities.ServiceClass;
import beans.doctor.direction.Direction;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import framework.generic.EMoveToTrash;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.ejb.Stateful;
import beans.UserRightsSet;import beans.expenditure.entity.ExpenditureDefault;
import beans.directory.simple.entities.ReqType;
import beans.directory.simple.entities.VisitType;
import framework.security.RightChecker;
import framework.security.UserRight;
/**
* @security - Ok.
* @author axe
*/
@Stateful(mappedName="clips-beans/DirectoryServiceBean")
public class DirectoryServiceBean extends DirectoryBean<Service, ServiceDetails>
implements DirectoryServiceBeanRemote {
public DirectoryServiceBean() {
super(Service.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(Service service, ServiceDetails item) throws ClipsServerException {
service.setTitle(item.title);
service.setDescription(item.description);
service.setDefaultDuration(item.defaultDuration);
service.setDirty(item.dirty);
service.setTrash(item.hidden);
service.setCode(item.code);
service.setCheckupType(item.checkupType == 0 ? null : findEntity(CheckupType.class, item.checkupType));
service.setReqType(item.reqTypeID == 0 ? null : findEntity(ReqType.class, item.reqTypeID));
service.setVisitType(item.visitTypeID == 0 ? null : findEntity(VisitType.class, item.visitTypeID));
service.setServiceClass(findEntity(ServiceClass.class, item.serviceClass));
service.setServiceGroup(findEntity(ServiceGroup.class, item.serviceGroup));
}
@Override
protected void onRemove(Service entity) throws ClipsServerException {
Field f[] = { new Field("service", entity) };
if(getEntityCount(ServicePrice.class, f) > 0) {
throw new EDataIntegrity("Услуга упомянута в договорах, удаление невозможно");
}
if(getEntityCount(DangerService.class, f) >0){
throw new EDataIntegrity("Данная услуга обязательна к оказанию по вредному фактору, удаление невозможно");
}
if(getEntityCount(PacketTemplateItem.class, f) > 0) {
throw new EMoveToTrash("Услуга входит в пакеты услуг, удаление невозможно");
}
if(getEntityCount(ServiceRender.class, f) > 0) {
throw new EMoveToTrash("Данная услуга оказана, удаление невозможно");
}
if(getEntityCount(Direction.class, f) > 0) {
throw new EMoveToTrash("Существуют направления на данную услугу, удаление невозможно");
}
Field f1[] = {
new Field("key.pservice", entity.getId()),
};
deleteEntityList(ServiceToService.class, f1);
Field f2[] = {
new Field("key.service", entity.getId()),
};
deleteEntityList(ServiceAction.class, f2);
deleteEntityList(ExpenditureDefault.class, f);
}
@Override
public int getCheckupType(int serviceID) throws ClipsServerException {
Service service = findEntity(Service.class, serviceID);
return service.getCheckupType().getId();
}
@Override
public void setCheckupType(int serviceID, int checkupTypeID) throws ClipsServerException {
Service service = findEntity(Service.class, serviceID);
service.setCheckupType(findEntity(CheckupType.class, checkupTypeID));
manager.persist(service);
manager.flush();
manager.refresh(service);
}
@Override
public ArrayList<ServiceToServiceDetails> getChildServiceList(int pserviceId) throws ClipsServerException {
if(pserviceId == 0) {
throw new EDataIntegrity("Попытка получить связанные услуги у услуги с ID=0");
}
Iterator list = findEntityList(ServiceToService.class, "pservice.id", pserviceId).iterator();
ArrayList<ServiceToServiceDetails> res = new ArrayList<ServiceToServiceDetails>();
while(list.hasNext()) {
ServiceToService sts = (ServiceToService)list.next();
res.add(sts.getDetails((RightChecker) this));
}
return res;
}
@Override
public void removeChildService(ServiceToServiceDetails details, int pserviceId) throws ClipsServerException {
checkCommandAccessibility(COMMAND_WRITE);
if(pserviceId == 0) {
throw new EDataIntegrity("Попытка удалить связанную услугу у услуги с ID=0");
}
Field f[] = {
new Field("key.pservice", pserviceId),
new Field("key.cservice", details.cserviceId)
};
ServiceToService sts = (ServiceToService) findEntityList(ServiceToService.class, f).get(0);
manager.remove(sts);
}
@Override
public int addChildService(ServiceToServiceDetails details, int pserviceId) throws ClipsServerException {
checkCommandAccessibility(COMMAND_WRITE);
if(pserviceId == 0) {
throw new EDataIntegrity("Попытка назначить связанную услугу услуге с ID=0");
}
ServiceToService serviceToService = null;
if(details.pserviceId != 0) {
Field f[] = {
new Field("key.pservice", pserviceId),
new Field("key.cservice", details.cserviceId)
};
List list = findEntityList(ServiceToService.class, f);
if (!list.isEmpty()){
serviceToService = (ServiceToService) list.get(0);//Должна быть одна
serviceToService.setDescription(details.description);
serviceToService.setObligatory(details.obligatory);
}
else {
serviceToService = new ServiceToService();
serviceToService.setKey(new ServiceToServicePK(pserviceId, details.cserviceId));
serviceToService.setDescription(details.description);
serviceToService.setObligatory(details.obligatory);
serviceToService.setParentService(findEntity(Service.class, details.pserviceId));
serviceToService.setChildService(findEntity(Service.class, details.cserviceId));
}
}
return saveEntity(serviceToService);
}
@Override
public Set<Integer> getActions(int service) throws ClipsServerException {
if(service == 0) {
throw new EDataIntegrity("Попытка выбрать действия врача для типа услуги с ID=0");
}
Iterator<ServiceAction> list = findEntityList(ServiceAction.class, "key.service", service).iterator();
Set<Integer> res = new HashSet<Integer>();
while(list.hasNext()) {
ServiceAction action = (ServiceAction)list.next();
res.add(action.getKey().getAction());
}
return res;
}
@Override
public void setActions(int service, Set<Integer> actions) throws ClipsServerException {
checkCommandAccessibility(COMMAND_WRITE);
Set<Integer> backup = new HashSet<Integer>(actions);
Set<Integer> oldActions = getActions(service);
actions.removeAll(oldActions);
oldActions.removeAll(backup);
if(oldActions.size() > 0) {
@SuppressWarnings("unchecked")
Field f[] = {
new Field("key.service", service),
new Field("key.action", oldActions, Field.OPERATOR_IN)
};
deleteEntityList(ServiceAction.class, f);
}
Iterator<Integer> addNew = actions.iterator();
while(addNew.hasNext()) {
ServiceAction r = new ServiceAction();
r.setKey(new ServiceActionPK(service, addNew.next()));
System.out.println("Added new:" + r);
manager.persist(r);
}
}
}