/*
* 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 referedSerrenID) throws 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("Внутреняя ошибка в реализации профосмотров");
}
}