/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.profcheckup;
import beans.UserRightsSet;
import beans.service.create.ServiceCheckupChunk;
import beans.service.medexam.MedSerrenResultDetails;
import framework.beans.EntityDetails;
import framework.beans.FacadeBean;
import beans.profcheckup.chunks.ProfcheckupItemChunk;
import framework.beans.security.BeanRights;
import beans.service.ServiceRenderBeanLocal;
import beans.service.create.NewServicesChunk;
import beans.contract.entity.Polis;
import beans.contract.entity.PolisDetails;
import beans.profcheckup.entity.Profcheckup;
import beans.doctor.emc.Emc;
import beans.doctor.disease.Disease;
import beans.profcheckup.entity.ProfcheckupItem;
import beans.profcheckup.entity.ProfcheckupItemDetails;
import beans.directory.danger.entity.Danger;
import beans.directory.danger.entity.DangerService;
import beans.directory.simple.entities.ProfChekupResult;
import beans.profcheckup.entity.TransportData;
import beans.service.ServiceRender;
import beans.service.create.CreateServiceBeanLocal;
import beans.service.medexam.MedSerrenResult;
import beans.user.collaborator.entities.Collaborator;
import framework.audit.AuditDetails;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import framework.security.RightChecker;
import framework.security.UserRight;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ejb.EJBException;
import javax.ejb.Stateful;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import javax.ejb.EJB;
/**
* Security - Ok.
* Integrity - TODO: При удалении удаляются все услуги по заболеванию данного итема, затем
* заболевание, если это не возможно, то удалить итем не возможно.
* Навесть на бин заболевания проверку, что его нельзя удалять, если он прикреплён к ПровчекапИтему
* @author axe
*/
@Stateful(mappedName="clips-beans/ProfcheckupItemBean")
public class ProfcheckupItemBean extends FacadeBean<ProfcheckupItem>
implements ProfcheckupItemBeanRemote {
public static final UserRight RIGHT_CREATION = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY;
public static int COMMAND_READ_CONTRACT_MEMBER = 4;
@EJB
ServiceRenderBeanLocal srbl;
@EJB
CreateServiceBeanLocal csbl;
public ProfcheckupItemBean() {
super(ProfcheckupItem.class);
}
@Override
protected void initBeanRights() {
int [] r = new int[5];
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_PROFCHECKUP_ITEM.id);
int cmr = RightPresence(UserRightsSet.MODIFY_PROFCHECKUPITEMS.id);
r[COMMAND_CREATE] = cmr;
r[COMMAND_MODIFY] = cmr;
r[COMMAND_REMOVE] = cmr;
r[COMMAND_READ_CONTRACT_MEMBER] = RightPresence(UserRightsSet.READ_CONTRACT.id);
rights = new BeanRights(r);
}
/**
* Обновляет данные сущности.
* @param details новые детали сущности
* @throws EJBException в случае если обновление отвергнуто системой
* безопастности либо произошла ошибка
* @return идентификатор сущности
*/
@Override
protected void onUpdate(ProfcheckupItem entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList) throws ClipsServerException{
ProfcheckupItemDetails d = (ProfcheckupItemDetails) details;
if (d.dangerId != entity.getDanger().getId()){
throw new EDataIntegrity("Запрещено менять назначенный опасный фактор!");
}
if (d.diseaseID != entity.getDisease().getId()){
throw new EDataIntegrity("Запрещено подменять заболевание!");
}
if (d.profcheckupID != entity.getProfcheckup().getId()){
throw new EDataIntegrity("Запрещено подменять профосмотр!");
}
if (d.polisID != entity.getPolis().getId()){
throw new EDataIntegrity("Запрещено подменять члена договора!");
}
//Если профосмотр не оказан, то остальные данные писать нельзя
entity.setPassed(d.passed);
// entity.setPolis(findEntity(ContractMemeber.class, d.polisID));
if (d.passed){
entity.setLightworktill(d.lightWorkTill);
// entity.setProfcheckup(findEntity(Profcheckup.class, d.profcheckupID));
entity.setResults(d.resultID == 0 ? null : findEntity(ProfChekupResult.class, d.resultID));
entity.setResultsExtra(d.resultExtra);
}else{
entity.setLightworktill(null);
// entity.setProfcheckup(findEntity(Profcheckup.class, d.profcheckupID));
entity.setResults(null);
entity.setResultsExtra("");
}
}
/**
* Возвращает информацию о договоре
* @return договор
*/
@Override
public PolisDetails getPolis() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ_CONTRACT_MEMBER);
ProfcheckupItem entity = getExistentEntity();
return entity.getPolis().getDetails((RightChecker) this);
}
@Override
protected void onRemove(ProfcheckupItem entity, List<AuditDoc> audit) throws ClipsServerException {
if (entity.getResults() != null){
throw new EDataIntegrity("Нельзя удалить профосмотр с установленным результатом");
}
}
@Override
public ModificationInfo remove() throws ClipsServerException {
ProfcheckupItem entity = getExistentEntity();//Не трогать! Финт ушами!
super.remove();//первую и вторую строки местами не менять иначе хер удалишь!
// DiseaseBeanRemote sbr = (DiseaseBeanRemote)
// getBean(DiseaseBeanRemote.class.getName());
Iterator it = findEntityList(ProfcheckupItem.class, "disease", entity.getDisease()).iterator();
//другие итемы ссылающиеся на заболевание
int overItemsCount = 0;
//услуги других итемов
Set<Integer> notDelete = new HashSet<Integer>();
Set<Integer> overDangers = new HashSet<Integer>();
while (it.hasNext()) {
ProfcheckupItem pi = (ProfcheckupItem)it.next();
if (pi.getId() != entity.getId()){
overItemsCount++;
overDangers.add(pi.getDanger().getId());
}
}
if (overDangers != null && !overDangers.isEmpty()){
Iterator list = findEntityList(DangerService.class, new Field[]{new Field("danger.id", overDangers, Field.OPERATOR_IN)}).iterator();
while(list.hasNext()) {
int servId = ((DangerService) list.next()).getService().getId();
notDelete.add(servId);
}
}
//Удаляем из заболевания услуги ид которых не входят в имеющийся сет
Field[] f = null;
if (notDelete != null && !notDelete.isEmpty()){
f = new Field[]{new Field("disease", entity.getDisease()),
new Field("service.id", notDelete, Field.OPERATOR_NOT_IN)};
}else{
f = new Field[]{new Field("disease", entity.getDisease())};
}
Iterator ii = findEntityList(ServiceRender.class, f).iterator();
while (ii.hasNext()) {//шуршим по всем услугам в заболевании
ServiceRender serviceRender = (ServiceRender) ii.next();
srbl.initByID(serviceRender.getId(), getSessionId());//скормим бину сущность
//TODO вернуть список аудита
srbl.removeAndBreakPacket();//и удаляем
}
if (overItemsCount == 0){//если других итемов нет - удалим заболевание
removeEntity(entity.getDisease());
}
// sbr.initByID(entity.getDisease().getId(), getSessionId());//скормим бину сущность
// entity.setDisease(null);
// entity = manager.merge(entity);
// sbr.remove();//и удалим
//TODO проверить есть ли другие профчекапитемы, ссылающиеся на это заболевание,
//если нет - удалить его
//TODO вернуть список аудита
return new ModificationInfo(entity.getId(), new LinkedList<AuditDetails>());
}
//TODO прикрутить аудит
@Override
public TransportData createItem(ProfcheckupItemChunk itemChunk) throws ClipsServerException {
/**кеш эмк ид клиента - эмк*/
Map<Integer, Emc> emcMap = new HashMap<Integer, Emc>();
//создадим и заполним итемы
ProfcheckupItem pchItem = new ProfcheckupItem();//сюда приходят только новые итемы
Disease disease = null;
Field[] fs = new Field[]{
new Field("polis.id", itemChunk.polisID),
new Field("profcheckup.id", itemChunk.profcheckupId)
};
List list = findEntityList(ProfcheckupItem.class, fs);
if (list != null && !list.isEmpty()) {//если в профчекапе уже есть итемы
disease = ((ProfcheckupItem) list.get(0)).getDisease();
//Вполне возможно наличие в заболевании услуг, нет необходимости их назначать заново
//поэтому выбросим их из списка необходимых услуг
//и хер с ней оказана она или нет
Field[] f = new Field[]{new Field("disease", disease)};
Iterator iterator = findEntityList(ServiceRender.class, f).iterator();
while (iterator.hasNext()) {
ServiceRender sr = (ServiceRender)iterator.next();
Iterator<ServiceCheckupChunk> servIter = itemChunk.serviceList.iterator();
while (servIter.hasNext()) {
ServiceCheckupChunk chunk = servIter.next();
if (chunk.serviceID == sr.getService().getId()){
servIter.remove();//выкидываем услугу
}
}
}
} else {
// pchItem = new ProfcheckupItem();
disease = new Disease();//сделаем заболевание
Date current = new Date();
disease.setCreated(current);//дата по первому созданию
disease.setDateReg(current);
}
Polis polis = findEntity(Polis.class, itemChunk.polisID);
Integer clientID = polis.getClient().getId();
Field[] f = {new Field("client.id", clientID)};
Iterator it = findEntityList(Emc.class, f).iterator();
if (emcMap.get(clientID) == null) {//проверим в кеше
Emc emc;
if (it.hasNext()) {
emc = (Emc) it.next();
} else {
throw new EDataIntegrity("у пациента " + polis.getClient().getSurname() + " " +
polis.getClient().getName() + " " + polis.getClient().getPathronymic() +
" нет медицинской карты");
}
emcMap.put(clientID, emc);
}
disease.setEmc(emcMap.get(clientID));
disease.setCollaborator(findEntity(Collaborator.class, getCollaboratorId()));
if (disease.getId() == 0) {
manager.persist(disease);//теперь есть заболевание, мона его юзать(или нет?)
} else {
disease = manager.merge(disease);
}
manager.flush();
manager.refresh(disease);
//заполним профчекапитем
pchItem.setPolis(polis);
pchItem.setPassed(false);
pchItem.setDanger(findEntity(Danger.class, itemChunk.dangerId));
pchItem.setProfcheckup(findEntity(Profcheckup.class, itemChunk.profcheckupId));
pchItem.setDisease(disease);
manager.persist(pchItem);//теперь есть профчекапитем, мона его юзать
manager.flush();
manager.refresh(pchItem);
//Пометим список услуг что они с дангерами
for (int i = 0; i < itemChunk.serviceList.size(); i++) {
ServiceCheckupChunk scc = itemChunk.serviceList.get(i);
scc.dangerID = itemChunk.dangerId;
}
//создадим услугу
NewServicesChunk chunk = new NewServicesChunk(disease.getId(),
0,
polis.getDetails(this),
0,
itemChunk.serviceList,
new HashMap<Integer, Integer>());
csbl.setSession(getSessionId());
List<AuditDetails> auditDetailsList = csbl.createNewServices(chunk).getAudit();
for (AuditDetails ad : auditDetailsList) {
if (!ad.entityClass.equals(ServiceRender.class.getSimpleName())) {
continue;
}
ServiceRender render = findEntity(ServiceRender.class, ad.getEntityId);
if (render.getService().getCheckupType() == null){
MedSerrenResult result = new MedSerrenResult();
result.setSerren(render);
manager.persist(result);
}
}
return new TransportData(pchItem.getDetails(this), auditDetailsList);
}
@Override
public List<MedSerrenResultDetails> getSerrenResults() throws ClipsServerException {
List<MedSerrenResult> entityList
= findEntityList(MedSerrenResult.class,
new Field[]{new Field("serren.disease", getExistentEntity().getDisease())});
List<MedSerrenResultDetails> res = new ArrayList<MedSerrenResultDetails>();
for (int i = 0; i < entityList.size(); i++) {
MedSerrenResult msr = entityList.get(i);
res.add(msr.getDetails(this));
}
return res;
}
@Override
public int setMedSerrenResult(MedSerrenResultDetails details) throws ClipsServerException {
MedSerrenResult entity = findEntity(MedSerrenResult.class, details.id);
//Проверка полей - ничо менять нельзя
if (entity.getSerren().getId() != details.serrenID) {
throw new EDataIntegrity("Попытка подмены результатов медосмотра");
}
//Проверка безопасности - выставлять результаты может только оказавший услугу, либо суперюзер
if (entity.getSerren().getFunctions() == null
|| entity.getSerren().getFunctions().getCollaborator().getId() != getCollaboratorId()) {
throwNeedAdminSecurityException("Выставить результат может только сотрудник, оказавший услугу");
}
entity.setResults(details.resultID == 0 ? null : findEntity(ProfChekupResult.class, details.resultID));
manager.persist(entity);
return entity.getId();
}
}