Package beans.profcheckup

Source Code of beans.profcheckup.ProfcheckupItemBean

/*
* 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();
    }
   
            
}
TOP

Related Classes of beans.profcheckup.ProfcheckupItemBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.