Package beans.doctor

Source Code of beans.doctor.MedicalDataBean

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package beans.doctor;

import framework.beans.FacadeBean;
import framework.beans.security.BeanRights;
import framework.beans.EntityDetails;
import framework.beans.GenericEntity;
import beans.DEC.HasSerren;
import beans.DEC.HasServiceRenderID;
import beans.service.ServiceRender;
import framework.generic.ClipsServerException;
import java.util.BitSet;
import framework.security.SecurityChecker;
import beans.UserRightsSet;
import beans.doctor.checkup.Checkup;
import beans.doctor.checkup.dicom.CheckupDicomDetails;
import beans.user.collaborator.entities.Collaborator;
import framework.audit.AuditDoc;
import framework.generic.EDataIntegrity;
import framework.utils.DateTimeUtils;
import java.util.List;

/**
*
* @author antony
*/
public abstract class MedicalDataBean<GEN extends GenericEntity>
        extends FacadeBean<GEN> {
    protected ServiceRender serviceRender;

    public MedicalDataBean(Class<GEN> cls) {
        super(cls);
    }

    private static final int getRightCreation(BitSet aRightsSet) {
        int r = SecurityChecker.RightPresence(aRightsSet, UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id);
        if (r < 0) {
            r = SecurityChecker.RightPresence(aRightsSet, UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id);
        }
        return r;
    }
   
    public static final boolean canCreateEntity(BitSet aRightsSet) {
        return getRightCreation(aRightsSet) > 0;
    }
   
    /**
     * Безопасность.
     * Установка прав для мед. данных Рецептов, рекоммендаций, направлений, противопоказаний,
     * диагнозов и осмотров. Читать можно только по 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 - позволяет редактировать любую запись, без ограничений.
     *
     * Варианты:
     * суперюзер                                                    разрешено
     * услуга не оказана
     *  - XXX_DURING_DAY                                            разрешено
     *  - XXX_ANY_TIME                                              разрешено
     * услуга оказана сегодня
     *  - XXX_DURING_DAY, сотрудник тотже                           разрешено
     *  - XXX_DURING_DAY, сотрудник другой                          запрещено
     *  - XXX_ANY_TIME, сотрудник тотже                             разрешено
     *  - XXX_ANY_TIME, сотрудник другой, из той же клиники         разрешено
     *  - XXX_ANY_TIME, сотрудник другой, из другой клиники         запрещено
     * услуга оказана не сегодня
     *  - XXX_DURING_DAY, сотрудник тотже                           запрещено
     *  - XXX_DURING_DAY, сотрудник другой                          запрещено
     *  - XXX_ANY_TIME, сотрудник тотже                             разрешено
     *  - XXX_ANY_TIME, сотрудник другой, из той же клиники         разрешено
     *  - XXX_ANY_TIME, сотрудник другой, из другой клиники         запрещено
     *
     * Варианты в другой раскладке:
     * ПРАВ НЕТ:
     *  - Суперюзер                                                         разрешено
     * XXX_DURING_DAY
     *  - услуга не оказана                                                 разрешено
     *  - услуга оказана сегодня, сотрудник тотже                           разрешено
     *  - услуга оказана сегодня, сотрудник другой                          запрещено
     *  - услуга оказана не сегодня, сотрудник любой                        запрещено
     * XXX_ANY_TIME
     *  - услуга не оказана                                                 разрешено
     *  - услуга оказана пофик когда, сотрудник тотже                       разрешено
     *  - услуга оказана пофик когда, сотрудник другой, из той же клиники   разрешено
     *  - услуга оказана пофик когда, сотрудник другой, из другой клиники   запрещено
     * @return
     */
    protected int [] getPrelimMedicalDataRights() throws ClipsServerException {
        int [] r = new int[4];
        if (serviceRender == null) {
            //при первой инициализации, когда неизвестна услуга
            r[COMMAND_READ] = RightPresence(UserRightsSet.READ_MEDICAL_DATA.id);
            r[COMMAND_CREATE] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
            r[COMMAND_MODIFY] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
            r[COMMAND_REMOVE] = UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
        } else {
            //при повторной инициализации, когда услуга известна
            r[COMMAND_READ] = RightPresence(UserRightsSet.READ_MEDICAL_DATA.id);

            int modifyRight = 0;
            if (RightPresence(UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id) > 0){
                //Начинаем проверять со слабого права
                modifyRight = serviceRender.canWriteDuringDay(
                        isSuperUser(),
                        UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY,
                        getCollaboratorId());
            }
            if (RightPresence(UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id) > 0){
                //Если есть более сильное право, то команда перезаписывается им
                modifyRight = serviceRender.canWriteAnyTime(
                        isSuperUser(),
                        UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME,
                        findEntity(Collaborator.class, getCollaboratorId()));
            }
            if (isSuperUser() && modifyRight <= 0) {
                //Если суперюзер, и прав нету или запрет то всеравно разрешаем по самому сильному праву
                modifyRight = UserRightsSet.WRITE_MEDICAL_DATA_ANY_TIME.id;
            }

            if (modifyRight == 0) {
                modifyRight = -UserRightsSet.WRITE_MEDICAL_DATA_DURING_DAY.id;
            }
            r[COMMAND_MODIFY] = modifyRight;
            r[COMMAND_REMOVE] = modifyRight;
        }
        return r;           
    }

    @Override
    protected void initBeanRights() throws ClipsServerException{
        int [] r = getPrelimMedicalDataRights();
        rights = new BeanRights(r);
    }
   
    /**
     * Проверка на возможность создания, модификации
     * @param entity
     * @param details
     * @throws generic.ClipsServerException
     */
    @Override
    protected void onUpdate(GEN entity, EntityDetails details,
            AuditDoc auditDoc, List<AuditDoc> auditDocList)
            throws ClipsServerException{
        if (details instanceof HasServiceRenderID) {
            serviceRender = findEntity(ServiceRender.class, ((HasServiceRenderID)details).getServiceRenderID());
        } else if (details instanceof CheckupDicomDetails) {
            Checkup checkup = findEntity(Checkup.class,((CheckupDicomDetails)details).checkupID);
            serviceRender = checkup.getServiceRender();
        } else {
            throw new ClipsServerException("Медицинские данные не относятся к услуге");
        }
        initBeanRights();
        if (isSuperUser()) {
            return;
        }
        if (serviceRender.getDisease().getClosed() != null
                && !DateTimeUtils.belongsToCurrentDay(serviceRender.getDisease().getClosed())) {
            throw new EDataIntegrity("Запрещено изменять медицинские данные, находящиеся в закрытом заболевании");
        }
        if (entity.getId() == 0) {
            checkCommandAccessibility(COMMAND_CREATE);
        } else {
            checkCommandAccessibility(COMMAND_MODIFY);
        }
    }

    /**
     * Проверка на возможность удаления
     * @param entity
     * @throws generic.ClipsServerException
     */
    @Override
    protected void onRemove(GEN entity, List<AuditDoc> auditDocList) throws ClipsServerException {
        if (entity instanceof HasSerren) {
            serviceRender = ((HasSerren)entity).getServiceRender();
        }
        initBeanRights();
        if (isSuperUser()) {
            return;
        }
        if (serviceRender.getDisease().getClosed() != null
                && !DateTimeUtils.belongsToCurrentDay(serviceRender.getDisease().getClosed())) {
            throw new EDataIntegrity("Запрещено удалять медицинские данные, находящиеся в закрытом заболевании");
        }
        checkCommandAccessibility(COMMAND_REMOVE);
    }

   
}
TOP

Related Classes of beans.doctor.MedicalDataBean

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.