Package beans.service.create

Source Code of beans.service.create.CreateServiceBean

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.service.create;

import beans.directory.lpu.entity.Lpu;
import beans.discount.CalcDiscount;
import beans.directory.simple.entities.MedexamType;
import framework.audit.AuditDetails;
import framework.beans.SecuredBean;
import framework.beans.security.BeanRights;
import beans.doctor.PacketService;
import beans.user.collaborator.entities.Collaborator;
import beans.contract.entity.Contract;
import beans.contract.entity.Polis;
import beans.contract.entity.ContractPacket;
import beans.contract.entity.ServicePrice;
import beans.contract.entity.ServicePriceDetails;
import beans.directory.packet.entity.PacketTemplate;
import beans.directory.service.entity.Service;
import beans.discount.entity.DiscountCard;
import beans.directory.checkuptype.entity.CheckupType;
import beans.doctor.checkup.Checkup;
import beans.doctor.disease.Disease;
import beans.service.ServiceRender;
import beans.user.client.entity.Client;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.persistence.Query;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import java.util.HashSet;
import java.util.Set;
import beans.UserRightsSet;import beans.config.ConfigParametr;
import beans.contract.entity.ContractDetails;
import beans.contract.entity.PolisDetails;
import beans.directory.danger.entity.DangerService;
import beans.directory.service.entity.ServiceToService;
import beans.directory.simple.entities.Insurer;
import beans.directory.simple.entities.ServicingPlace;
import beans.directory.simple.entities.ReceptionType;
import beans.directory.simple.entities.RegionIdCode;
import beans.directory.simple.entities.ReqType;
import beans.directory.simple.entities.Speciality;
import beans.doctor.emc.Emc;
import beans.service.ServiceRenderDetails;
import beans.service.medexam.MedSerrenResult;
import beans.service.medexam.Medexam;
import beans.user.collaborator.entities.CollaboratorFunctions;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
import framework.beans.config.server.ConfigBeanM;
import framework.beans.config.server.ConfigBeanRemoteM;
import framework.generic.ESecurity;
import framework.security.RightChecker;
import framework.security.SecurityChecker;
import framework.utils.DateTimeUtils;
import framework.utils.Pair;
import javax.ejb.Stateful;

/**
*
* @author axe
*/
@Stateful(mappedName="clips-beans/CreateServiceBean")
public class CreateServiceBean extends SecuredBean
        implements CreateServiceBeanRemote, CreateServiceBeanLocal {

    public static final int COMMAND_CREATE = 0;
    private HashMap<Integer, Set<Integer>> uniqMap;

    @Override
    protected void initBeanRights() throws ClipsServerException {
        int[] r = new int[1];
        r[COMMAND_CREATE] = RightPresence(UserRightsSet.CREATE_SERVICE_RENDER.id);

        rights = new BeanRights(r);
    }
   

    /**
     * Внимание! вытащить IDшники услуг можно из аудит деталей,
     * только при этом надо учитывать что там находятся НЕ ТОЛЬКО детали аудита услуг
     * @param chunk
     */
    @Override
    public ModificationInfo createNewServices(NewServicesChunk chunk) throws ClipsServerException {
        ArrayList<AuditDetails> auditDetList = new ArrayList<AuditDetails>();
        checkCommandAccessibility(COMMAND_CREATE);
        DiscountCard card = null;
        Disease disease = (chunk.diseaseID == 0) ? null : findEntity(Disease.class, chunk.diseaseID);
        //Сооздаем полис если его нет
        Pair<Polis, AuditDetails> pair = getPolis(chunk.polisDetails);
        Polis polis = pair.first;
        if (pair.second != null) {
            auditDetList.add(pair.second);
        }
        Collaborator collaborator = findEntity(Collaborator.class, getCollaboratorId());

        Set<Integer> contractServIDs = new HashSet<Integer>();
        Iterator it = findEntityList(ServicePrice.class, "contract", polis.getContract()).iterator();
        while (it.hasNext()) {
            ServicePrice j = (ServicePrice) it.next();
            contractServIDs.add(j.getService().getId());
        }
               
               
        //build discounts
        HashMap<Integer, Integer> cardDiscounts = new HashMap<Integer, Integer>();
        if (chunk.discountCardID > 0) {
            card = findEntity(DiscountCard.class, chunk.discountCardID);

            for (int i = 0; i < chunk.serviceList.size(); i++) {
                ServiceCheckupChunk checkupChunk = chunk.serviceList.get(i);
                if (chunk.forceDiscountMap.get(checkupChunk.serviceID) == null) {
                    cardDiscounts.put(checkupChunk.serviceID, CalcDiscount.calculateDiscount(manager, chunk.discountCardID, checkupChunk.serviceID, chunk.packetServiceTemplateID));
                }
            }
        }

        PacketService packetService = null;
        Medexam medexam = null;
        //если присутствует пакет
        if (chunk.packetServiceTemplateID != 0) {
            packetService = new PacketService();
            PacketTemplate packetTemplate = findEntity(PacketTemplate.class, chunk.packetServiceTemplateID);
            packetService.setPacketTemplate(packetTemplate);
            saveEntity(packetService);
            MedexamType medexamType = packetTemplate.getMedexamType();
            if (medexamType != null) {
                //не просто пакет, а медосмотр
                if (chunk.diseaseID != 0) {
                    throw new EDataIntegrity("Для медосмотра необходимо создать новое заболевание");
                }
                //создаем заболевание и медосмотр
                disease = new Disease();
                List<Emc> emcList = findEntityList(Emc.class, "client", polis.getClient());
                if (emcList.size() != 1) {
                    throw new EDataIntegrity("У пациента " + emcList.size() + " ЕМК");
                }
                disease.setEmc(emcList.get(0));
                Date current = new Date();
                disease.setCreated(current);
                disease.setDateReg(current);
                disease.setCollaborator(collaborator);
                manager.persist(disease);
                manager.flush();
                manager.refresh(disease);
                chunk.diseaseID = disease.getId();

                medexam = new Medexam();
                medexam.setDisease(disease);
                medexam.setMedexamType(medexamType);
                manager.persist(medexam);
            }
        }
        uniqMap = new HashMap<Integer, Set<Integer>>();
        for (int i = 0; i < chunk.serviceList.size(); i++) {
            ServiceCheckupChunk serviceCheckupChunk = chunk.serviceList.get(i);

            //Всё, собираем детали
            ServiceRenderDetails serrenDetails = new ServiceRenderDetails();
            Integer effectiveDiscount = chunk.forceDiscountMap.get(serviceCheckupChunk.serviceID);
            if (effectiveDiscount == null) {
                effectiveDiscount = cardDiscounts.get(serviceCheckupChunk.serviceID);
            }
            if (effectiveDiscount == null) {
                effectiveDiscount = new Integer(0);
            }

            /**
             * Костыль
             * По опасному фактору сюда приходят несколько чанков, в которых проставлен
             * ID одной и той же услуги (конкретно - посещение Профилактическое первичное амбулаторное),
             * для которой в таблице DangerService существует несколько записей с разными специальностями врачей
             * Проще говоря это услуги одного типа, а обслужить должны несколько специалистов
             * т.к в чанке нет информации о специальности приходится хитрым образом обеспечивать для
             * каждой услуги уникальную специальность
             */

            //Если по опасному фактору - то присутствует специальность врача
            int specID = 0;
            if (serviceCheckupChunk.dangerID != 0) {
                Field f[] = {
                    new Field("danger.id", serviceCheckupChunk.dangerID),
                    new Field("service.id", serviceCheckupChunk.serviceID),
                };
                List<DangerService> list = findEntityList(DangerService.class, f);
                if (list.size() == 0) {
                    throw new EDataIntegrity("В приказе 90 для вредного фактора не найдена услуга");
                } else if (list.size() == 1) {
                    Speciality spec = list.get(0).getSpeciality();
                    specID = spec == null ? 0 : spec.getId();
                } else {
                    specID = findUniqSpec(serviceCheckupChunk.serviceID, list);
                }
            }

//            ServiceRender serren = createNewSerren(serrenDetails);
            serrenDetails.serviceID = serviceCheckupChunk.serviceID;
            serrenDetails.cardID = chunk.discountCardID;
            serrenDetails.discount = effectiveDiscount;
            serrenDetails.diseaseID = chunk.diseaseID;
            serrenDetails.directorID = getCollaboratorId();
            serrenDetails.polisID = polis.getId();
            serrenDetails.date = new Date();
            serrenDetails.specialityID = specID;

            //Что с этим делать?
            serrenDetails.packetServiceID = packetService != null ? packetService.getId() : 0;
            SerrenMod sm = createNewSerren(serrenDetails);
            auditDetList.addAll(sm.info.getAudit());
            //Если это медосмотр то создаем результаты медосмотра
            if (medexam != null) {
                AuditDoc<MedSerrenResult> auditmsr = new AuditDoc<MedSerrenResult>(null, getCollaborator());
                MedSerrenResult medSerrenResult = new MedSerrenResult();
                medSerrenResult.setSerren(sm.serren);
                manager.persist(medSerrenResult);
                auditmsr.check(medSerrenResult);
                AuditDetails details = persistAudit(auditmsr);
                auditDetList.add(details);
            }

            if (serviceCheckupChunk.xml != null) {
                AuditDoc<Checkup> auditCheckup = new AuditDoc<Checkup>(null, getCollaborator());
                Checkup checkup = new Checkup();
                checkup.setCheckupType(findEntity(CheckupType.class, serviceCheckupChunk.checkupTypeID));
                auditCheckup.addFieldFormat("xml", checkup.getCheckupType().getMetadata());
                checkup.setServiceRender(sm.serren);
                checkup.setXml(serviceCheckupChunk.xml);
                manager.persist(checkup);
                manager.flush();
                manager.refresh(checkup);
                auditCheckup.check(checkup);
                AuditDetails details = persistAudit(auditCheckup);
                auditDetList.add(details);
            }
        }

        return new ModificationInfo(chunk.diseaseID, auditDetList);
    }

   
   /**
     * Внимание! вытащить IDшники услуг можно из аудит деталей,
     * только при этом надо учитывать что там находятся НЕ ТОЛЬКО детали аудита услуг
     * @param chunk
     * @param referedSerrenID
     */
    @Override
    public ModificationInfo createNewServices(NewServicesChunk chunk, int referedSerrenIDthrows ClipsServerException {
        ArrayList<AuditDetails> auditDetList = new ArrayList<AuditDetails>();
        checkCommandAccessibility(COMMAND_CREATE);
       
        Disease disease = findEntity(Disease.class, chunk.diseaseID);
        //Создаем полис если его нет
        Pair<Polis, AuditDetails> pair = getPolis(chunk.polisDetails);
        Polis polis = pair.first;
        Contract contract = polis.getContract();
        if (pair.second != null) {
            auditDetList.add(pair.second);
        }
        Collaborator collaborator = findEntity(Collaborator.class, getCollaboratorId());
        if (contract.getLpu() != null && contract.getLpu().getId() != collaborator.getLpu().getId()) {
            throw new EDataIntegrity("Указанный контракт не заключен с данной клиникой");
        }

        for (int i = 0; i < chunk.serviceList.size(); i++) {
           
            ServiceCheckupChunk serviceCheckupChunk = chunk.serviceList.get(i);
            Service s = findEntity(Service.class, serviceCheckupChunk.serviceID);
            ServiceRender referedSerren = findEntity(ServiceRender.class, referedSerrenID);

            AuditDoc<ServiceRender> auditSerren = new AuditDoc<ServiceRender>(null, getCollaborator());
            ServiceRender entity = new ServiceRender();
            entity.setService(s);
            entity.setDate(new Date());
            entity.setDisease(disease);
            entity.setDirector(collaborator);
            entity.setPolis(polis);
            entity.setReferenced(referedSerren);
            entity.setUet(ServiceRender.DEFAULT_UET);
            if (entity.getPolis().getClient().getId() != disease.getEmc().getClient().getId()) {
                throw new EDataIntegrity("Ошибка в коде назначения услуги - полис не соответствует ЭМК");
            }
           
            manager.persist(entity);

            if (serviceCheckupChunk.xml != null) {
                AuditDoc<Checkup> auditCheckup = new AuditDoc<Checkup>(null, getCollaborator());
                Checkup checkup = new Checkup();
                checkup.setCheckupType(findEntity(CheckupType.class, serviceCheckupChunk.checkupTypeID));
                checkup.setServiceRender(entity);
                checkup.setXml(serviceCheckupChunk.xml);
                manager.persist(checkup);
                manager.flush();
                manager.refresh(checkup);
                auditCheckup.check(checkup);
                AuditDetails details = persistAudit(auditCheckup);
                auditDetList.add(details);
            }
            manager.flush();
            manager.refresh(entity);
            auditSerren.check(entity);
            AuditDetails details = persistAudit(auditSerren);
            auditDetList.add(details);
        }

        return new ModificationInfo(0, auditDetList);
       
    }


    /**
     * возвращает информацию о договорах ценах для заданных услуг
     * @param services список идентификаторов услуг, может быть пустым. В таком случае
     * возвращается только информация о доступных договорах
     * @param discountCardID идентификатор дискотной карты, ноль если нет дискотной карты
     * @return
     */
    @Override
    public List<ServiceContractPriceChunk> getServiceContractPriceInfo(int clientID,
            List<Integer> services, int discountCardID, int packetServiceTemplateID) throws ClipsServerException {

        /**Если присутствует пакет услуг то это список договоров, содержащих данный пакет*/
        HashSet<Contract> contractSet = null;
        if (packetServiceTemplateID != 0) {
            PacketTemplate packetTemplate = findEntity(PacketTemplate.class, packetServiceTemplateID);
            List<ContractPacket> contractPachetList = findEntityList(ContractPacket.class, "packetServiceTemplate", packetTemplate);
            contractSet = new HashSet<Contract>();
            for (int i = 0; i < contractPachetList.size(); i++) {
                Contract contract = (contractPachetList.get(i)).getContract();
                contractSet.add(contract);
            }
        }
        Collaborator collab = findEntity(Collaborator.class, getCollaboratorId());
        Lpu lpu = collab.getLpu();

        //Поиск действующих полисов для пациента
        Client client = findEntity(Client.class, clientID);
        String sql = "SELECT a FROM Polis a" + " WHERE a.client=:client" +
                " AND (a.fromDate <= :current OR a.fromDate IS NULL)" +
                " AND (a.tillDate >= :current OR a.tillDate IS NULL)" +
                " AND (a.trash = false)" +
                " AND (a.contract.begin<=:current)" +
                " AND (a.contract.end>=:current OR a.contract.end IS NULL) " +
                " AND ((a.contract.lpu is null) or (a.contract.lpu = :lpu))";
        Query query = manager.createQuery(sql);
        query.setParameter("client", client);
        query.setParameter("current", new Date());
        query.setParameter("lpu", lpu);
        //Найденные действующие полиса для пациента, которые находятся в контракте
        List<Polis> existPolisList = query.getResultList();

        String sql1 = "SELECT c FROM Contract c WHERE" +
                " c.begin<=:current" +
                " AND (c.end>=:current OR c.end IS NULL)" +
                " AND c.openForAll = true";
        Query query1 = manager.createQuery(sql1);
        query1.setParameter("current", new Date());
        /**Список контрактов, открытых для всех*/
        List<Contract> cList = query1.getResultList();
        //Виртуальные полиса, которые можно создать
        ArrayList<Polis> virtualPolisList = new ArrayList<Polis>(cList.size());
        for (Contract contract : cList) {
            Polis polis = new Polis();
            polis.setClient(client);
            polis.setContract(contract);
            virtualPolisList.add(polis);
        }

        List<ServiceContractPriceChunk> chunkList = new ArrayList<ServiceContractPriceChunk>();
        //Складываем виртуальные и существующие полиса в один массив
        for (int i = 0; i < virtualPolisList.size(); i++) {
            Polis virtPolis = virtualPolisList.get(i);
            boolean founded = false;
            for (Polis existPolis : existPolisList) {
                if (existPolis.getContract().getId() == virtPolis.getContract().getId()) {
                    founded = true;
                    break;
                }
            }
            if (!founded) {
                existPolisList.add(virtPolis);
            }
        }

        for (Polis polis : existPolisList) {
            ServiceContractPriceChunk chunk = new ServiceContractPriceChunk();

            Contract contract = polis.getContract();
            if (contractSet != null && !contractSet.contains(contract)) {
                //Если данный договор не содержит данного пакета услуг
                continue;
            }
            chunk.polisDetails = polis.getDetails((RightChecker) this);
            ContractDetails contractDetails = contract.getDetails((RightChecker) this);
            chunk.enterpriseID = contractDetails.enterpriseID;
            chunk.index = contractDetails.index;
            chunk.contractType = Contract.TYPES_ARRAY[contractDetails.type].str;

            if (services.size() > 0) {
                String set = "(";
                int param = 0;
                Iterator values = services.iterator();
                while (values.hasNext()) {
                    values.next();
                    set += ":param" + param;
                    param++;
                    if (values.hasNext()) {
                        set += ",";
                    }
                }
                set += ")";


                sql = "SELECT a FROM ServicePrice a WHERE " +
                        "a.contract=:contract " +
                        "AND a.service.id IN " + set +" ";
                Query q = manager.createQuery(sql);
                q.setParameter("contract", contract);

                values = services.iterator();
                param = 0;
                while (values.hasNext()) {
                    q.setParameter("param" + param, values.next());
                    param++;
                }

                List<ServicePrice> servicePriceList = q.getResultList();

                //Проверка уникальности и количества цен на запрошенные услуги
                HashSet<Integer> copyServices = new HashSet<Integer>(services);
                boolean dublicate = false;
                for (ServicePrice servicePrice : servicePriceList) {
                    int srID = servicePrice.getService().getId();
                    if (copyServices.contains(srID)) {
                        copyServices.remove(srID);
                    } else {
                        dublicate = true;
                    }
                }
                if (copyServices.size() == 0) {
                    //Все нормально заполняем чанки
                    for (ServicePrice servicePrice : servicePriceList) {
                        ServicePriceDetails details = servicePrice.getDetails((RightChecker) this);
                        Integer money = null;
                        Integer price = null;
                        Integer discount = null;
                        if (!dublicate){
                            money = details.money;
                            price = details.price;
                            discount = CalcDiscount.calculateDiscount(manager, discountCardID, details.serviceID, packetServiceTemplateID);
                        }
                        chunk.moneyMap.put(details.serviceID, money);
                        chunk.priceMap.put(details.serviceID, price);
                        chunk.discountMap.put(details.serviceID, discount);
                    }
                    chunkList.add(chunk);
                }
            } else {
                chunkList.add(chunk);
            }
        }
        return chunkList;
    }

    @Override
    public SerrenMod createNewSerren(ServiceRenderDetails serrenDetails) throws ClipsServerException {
        AuditDoc<ServiceRender> auditDoc = new AuditDoc<ServiceRender>(null, getCollaborator());
        Contract contract = findEntity(Polis.class, serrenDetails.polisID).getContract();
        Collaborator collaborator = findEntity(Collaborator.class, getCollaboratorId());
        if (contract.getLpu() != null && contract.getLpu().getId() != collaborator.getLpu().getId()) {
            throw new EDataIntegrity("Указанный контракт не заключен с данной клиникой");
        }
        ServiceRender serren = new ServiceRender();
        //date;           //дата назначения услуги - если нет права создавать другим числом то только сегодняшняя дата
        if (DateTimeUtils.belongsToCurrentDay(serrenDetails.date)
                || hasRight(UserRightsSet.WRITE_STATISTIC_MEDICAL_DATA)) {
            serren.setDate(serrenDetails.date);
        } else {
            throw new ESecurity(SecurityChecker.getClientHasNoRightMsg(UserRightsSet.WRITE_STATISTIC_MEDICAL_DATA.id));
        }

        //renderDate;     //дата оказания - нулл
        if (serrenDetails.renderDate != null) {
            throw new ClipsServerException("Нельзя создавать оказанную услугу");
        } else {
            serren.setRenderedDate(null);
        }

        //discount;        //Скидка в процентах - пофиг, проверка не здесь
        serren.setDiscount(serrenDetails.discount);

        //cancelled;   //флаг отменена - false
        if (serrenDetails.cancelled == true) {
            throw new ClipsServerException("Нельзя создавать отмененную услугу");
        } else {
            serren.setCancelled(serrenDetails.cancelled);
        }

        //repeat;          //повторы услуги - 0
        if (serrenDetails.repeat != 0) {
            throw new ClipsServerException("Нельзя создавать услугу, оказанную повторно");
        } else {
            serren.setRepeat(serrenDetails.repeat);
        }

        //polisID;         // - != 0
        Polis polis;
        if (serrenDetails.polisID == 0) {
            throw new ClipsServerException("Нельзя создавать услугу без указания полиса");
        } else {
            polis = findEntity(Polis.class, serrenDetails.polisID);
            serren.setPolis(polis);
        }

        //collaboratorID;  // - 0
        if (serrenDetails.functionsID != 0) {
            throw new ClipsServerException("Нельзя создавать оказанную услугу");
        } else {
            serren.setFunctions(null);
        }

        //directorID;      // - если нет права создавать от другого имени, то только текущий сотрудник
        if (getCollaboratorId() == serrenDetails.directorID
                || hasRight(UserRightsSet.WRITE_STATISTIC_MEDICAL_DATA)) {
            Collaborator director = findEntity(Collaborator.class, serrenDetails.directorID);
            serren.setDirector(director);
        } else {
            throw new ESecurity(SecurityChecker.getClientHasNoRightMsg(UserRightsSet.WRITE_STATISTIC_MEDICAL_DATA.id));
        }

        //packetServiceID; // - пофиг
        if (serrenDetails.packetServiceID == 0) {
            serren.setPacketService(null);
        } else {
            serren.setPacketService(findEntity(PacketService.class, serrenDetails.packetServiceID));
        }

        //diseaseID;       // - пока пофиг TODO проверка соответствия пациента по полису и ЭМК
        if (serrenDetails.diseaseID == 0) {
            serren.setDisease(null);
        } else {
            Disease disease = findEntity(Disease.class, serrenDetails.diseaseID);
            if (serren.getPolis().getClient().getId() != disease.getEmc().getClient().getId()) {
                throw new EDataIntegrity("Ошибка в коде назначения услуги - полис не соответствует ЕМК");
            }
            serren.setDisease(disease);
        }

        //cardID;          // - пока пофиг TODO проверка соответствия пациента по карте и ЭМК
        if (serrenDetails.cardID == 0) {
            serren.setDiscountCard(null);
        } else {
            serren.setDiscountCard(findEntity(DiscountCard.class, serrenDetails.cardID));
        }

        Service service = findEntity(Service.class, serrenDetails.serviceID);

        //servPlaceID;     // - пофиг
        //нет, не пофиг
        //а если не указан то все равно пофиг
        //голосованием (вип ильшит петр) решили что пофиг (тем более нехорошо если данные корректируются бином)
        /*if (service.getReqType() != null) {
            if (service.getReqType().getId() == ReqType.TYPE_POLYCLINIC){
                serrenDetails.servPlaceID = ServicingPlace.SP_POLYCLINIC;
            }else if (service.getReqType().getId() == ReqType.TYPE_HOME){
                serrenDetails.servPlaceID = ServicingPlace.SP_HOME;
            }
        }*/

        if (serrenDetails.servPlaceID == 0) {
            serren.setPlace(null);
        } else {
            serren.setPlace(findEntity(ServicingPlace.class,serrenDetails.servPlaceID));
        }

        //referenced;      // - проверка возможности оказания данной услуги в рамках referenced
        if (serrenDetails.referencedID != 0) {
            ServiceRender referenced = findEntity(ServiceRender.class, serrenDetails.referencedID);
            Field[] f = new Field[]{
                new Field("pservice", referenced),
                new Field("cservice", service),
            };
            if (getEntityCount(ServiceToService.class, f) > 0) {
                serren.setReferenced(referenced);
            } else {
                throw new ClipsServerException("Данную услугу нельзя оказывать в рамках указанной");
            }
        } else {
            serren.setReferenced(null);
        }

        //serviceID;       // услуга - проверка наличия в договоре (учитывая референсед)
        //functionsID      //Проверить есть ли услуга с данным типом услуги в договоре
        //делается одновременно чтоб не делать 2 запроса
        String sql;
        CollaboratorFunctions functions = null;
        ReceptionType receptionType = null;
        if (serrenDetails.referencedID == 0) {
            if (serrenDetails.functionsID == 0) {
                sql = "SELECT count(a) FROM ServicePrice a WHERE " +
                        "a.contract=:contract " +
                        "AND a.service=:service ";
            } else {
                functions = findEntity(CollaboratorFunctions.class, serrenDetails.functionsID);
                receptionType = functions.getReceptionType();
                sql = "SELECT count(a) FROM ServicePrice a WHERE " +
                        "a.contract=:contract " +
                        "AND a.service=:service " +
                        "AND (a.receptionType IS NULL OR a.receptionType=:receptionType)";
            }
            Query q = manager.createQuery(sql);
            q.setParameter("contract", polis.getContract());
            q.setParameter("service", service);
            if (receptionType != null) {
                q.setParameter("receptionType", receptionType);
            }

            long c = (Long) q.getSingleResult();
            if (c == 0) {
                if (serrenDetails.functionsID == 0) {
                    throw new ClipsServerException("Услуга отсутствует в контракте");
                } else {
                    throw new ClipsServerException("Данную услугу нельзя оказывать при данном типе приема");
                }
            }
            serren.setFunctions(functions);
            serren.setService(service);
        } else {
            //Если услуга оказывается в рамках другой услуги то ее не надо проверять на наличие в контракте
            serren.setFunctions(functions);
            serren.setService(service);
        }

        //specialityID
        if (serrenDetails.specialityID != 0) {
            Speciality spec = findEntity(Speciality.class, serrenDetails.specialityID);
            serren.setSpeciality(spec);
        }

        //uet
        serren.setUet(ServiceRender.DEFAULT_UET);

        //received
        serren.setReceived(false);

        manager.persist(serren);
        manager.flush();
        manager.refresh(serren);
        auditDoc.check(serren);
        AuditDetails auditDetails = persistAudit(auditDoc);
        ModificationInfo mi = new ModificationInfo(auditDetails);
        return new SerrenMod(serren, mi);
    }


    /**
     * Ищет полис в базе, если такого нет, то создает
     * @param d
     * @return
     */
    private Pair<Polis, AuditDetails> getPolis(PolisDetails d) throws ClipsServerException {
        if (d.id == 0) {
            ConfigBeanRemoteM conf = getBean(ConfigBeanM.class);
            int regionCode = conf.getInteger(ConfigParametr.REGION_CODE_ID);

            //TODO0 какой иншурер выбрать?
            Collaborator collab = findEntity(Collaborator.class, getCollaborator().getId());
            int insurerID = collab.getLpu().getInsurer().getId();

            AuditDoc<Polis> auditDoc = new AuditDoc<Polis>(null, getCollaborator());
            Polis polis = new Polis();
            polis.setClient(findEntity(Client.class, d.clientID));
            polis.setCollaborator(findEntity(Collaborator.class, getCollaboratorId()));
            polis.setContract(findEntity(Contract.class, d.contractID));
            polis.setRegionCode(findEntity(RegionIdCode.class, regionCode));
            polis.setInsurer(findEntity(Insurer.class, insurerID));

            //Только в общем договоре срок действия полиса не ограничен
            polis.setFromDate(null);
            polis.setTillDate(null);
            saveEntity(polis);
            auditDoc.check(polis);
            return new Pair<Polis, AuditDetails>(polis, persistAudit(auditDoc));
        } else {
            return new Pair<Polis, AuditDetails>(findEntity(Polis.class, d.id), null);
        }
    }

    /**
     * Обеспечивает уникальность каждой последующей специальности для одного и
     * того же типа услугию. Специальности берутся из списка List<DangerService> list
     * @param serviceID
     * @param list
     * @return
     * @throws EDataIntegrity
     */
    private int findUniqSpec(int serviceID, List<DangerService> list) throws EDataIntegrity {
        Set<Integer> set = uniqMap.get(serviceID);
        if (set == null) {
            set = new HashSet<Integer>();
            uniqMap.put(serviceID, set);
        }
        for (int i = 0; i < list.size(); i++) {
            DangerService ds = list.get(i);
            int specID = ds.getSpeciality().getId();
            if (!set.contains(specID)) {
                set.add(specID);
                return specID;
            }
        }
        throw new EDataIntegrity("Внутреняя ошибка в реализации профосмотров");
    }
}
TOP

Related Classes of beans.service.create.CreateServiceBean

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.