/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans.cec;
import framework.beans.EntityDetails;
import framework.beans.FacadeBean;
import framework.beans.security.BeanRights;
import beans.cec.entity.Committee;
import beans.cec.entity.CommitteeDetails;
import beans.cec.entity.CommitteeDirection;
import beans.cec.entity.CommitteeDirectionDetails;
import beans.cec.entity.CommitteeMember;
import beans.cec.entity.CommitteeMemberDetails;
import beans.cec.entity.CommitteeResolution;
import beans.cec.entity.CommitteeResolutionDetails;
import beans.cec.entity.Inability;
import beans.cec.entity.InabilityDetails;
import beans.directory.mkb10.entity.Mkb10;
import beans.directory.simple.entities.CommitteeResolutionType;
import beans.doctor.direction.Direction;
import beans.user.collaborator.entities.Collaborator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import framework.generic.ClipsServerException;
import framework.generic.EDataIntegrity;
import javax.ejb.Stateful;
import beans.UserRightsSet;
import framework.audit.AuditDoc;
import framework.beans.ModificationInfo;
import framework.security.RightChecker;
import framework.security.UserRight;
import java.util.Date;
/**
* Бин контролирующий работу КЭК
* Security - Ok.
* @author axe
*/
@Stateful(mappedName="clips-beans/CommitteeBean")
public class CommitteeBean extends FacadeBean<Committee>
implements CommitteeBeanRemote {
public static final UserRight RIGHT_CREATION = UserRightsSet.WRITE_CEC;
public CommitteeBean() {
super(Committee.class);
}
@Override
protected void initBeanRights() {
int [] r = new int [4];
r[COMMAND_READ] = RightPresence(UserRightsSet.READ_CEC.id);
r[COMMAND_CREATE] = RightPresence(RIGHT_CREATION.id);
int cmr = RightPresence(UserRightsSet.WRITE_CEC.id);
r[COMMAND_MODIFY] = cmr;
r[COMMAND_REMOVE] = cmr;
rights = new BeanRights(r);
}
/**
* Обновляет данные сущности.
* @param details новые детали сущности
* @return идентификатор сущности
* @throws ClipsServerException если делается попытка изменения "задним" числом
* @security дата в деталях не должна быть прошедшей
*/
@Override
protected void onUpdate(Committee entity, EntityDetails details,
AuditDoc auditDoc, List<AuditDoc> auditDocList) throws ClipsServerException {
CommitteeDetails d = (CommitteeDetails) details;
checkIsNotInThePast(d.date);
entity.setDate(d.date);
}
/**
* Удаляет сущность из базы данных
* @throws ClipsServerException удаление возможно только при отсутствии
* связанныхз данных по* комиссии - решений, направлений на комиссию,
* направлений на МСЭК, иначе создается исключение
*/
@Override
protected void onRemove(Committee entity, List<AuditDoc> audit) throws ClipsServerException {
Field f[] = { new Field("committee", entity) };
Field f2[] = { new Field("direction.committee", entity) };
if(getEntityCount(CommitteeMember.class, f) > 0
|| getEntityCount(CommitteeDirection.class, f) > 0
|| getEntityCount(CommitteeResolution.class, f2) > 0) {
throw new EDataIntegrity("Сначала удалите всех членов комиссии, все решения и направления "
+ "на МСЭК, сделанные в рамках данной комиссии");
}
}
/**
* Возвращает список членов комиссии
* @return список услуг договора
* @throws ClipsServerException сущность должна быть сохранена в базу
* @security требуется право READ_CEC
*/
@Override
public List<CommitteeMemberDetails> getCommitteeMemberList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
checkEntityExist();
return loadChildDetailsList(CommitteeMember.class, "committee");
}
/**
* Добавляет или обновляет члена комиссии. Если details.id = 0 сущность создается,
* иначе обновляется существующая с заданным идентификатором.
* @param details данные
* @return идентификатор сущности
* @throws ClipsServerException сущность должна быть сохранена в базу
* @security требуется право WRITE_CEC
*/
@Override
public ModificationInfo setCommitteeMember(CommitteeMemberDetails details) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
Committee entity = getExistentEntity();
Collaborator coll = findEntity(Collaborator.class, details.collaboratorID);
coll.checkNotFired();
CommitteeMember member = null;
AuditDoc<CommitteeMember> auditDoc;
if(details.id != 0) {
member = findEntity(CommitteeMember.class, details.id);
auditDoc = new AuditDoc<CommitteeMember>(member, getCollaborator());
checkTheSame(member.getCommittee());
} else {
member = new CommitteeMember();
auditDoc = new AuditDoc<CommitteeMember>(member, getCollaborator());
member.setCommittee(entity);
}
member.setCollaborator(coll);
int id = saveEntity(member);
auditDoc.check(member);
return new ModificationInfo(id, persistAudit(auditDoc));
}
/**
* Удаляет члена комиссии.
* @param id идентификатор члена
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo removeCommitteeMember(int id) throws ClipsServerException {
checkEntityExist();
checkCommandAccessibility(COMMAND_REMOVE);
CommitteeMember member = findEntity(CommitteeMember.class, id);
AuditDoc<CommitteeMember> auditDoc = new AuditDoc<CommitteeMember>(member, getCollaborator());
checkTheSame(member.getCommittee());
removeEntity(member);
auditDoc.check(null);
return new ModificationInfo(persistAudit(auditDoc));
}
/**
* Возвращает список направлений комиссии
* @return список услуг договора
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public List<CommitteeDirectionDetails> getCommitteeDirectionList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Committee entity = getExistentEntity();
Collection<CommitteeDirection> list = findEntityList(CommitteeDirection.class, "committee", entity);
List<CommitteeDirectionDetails> res = new ArrayList<CommitteeDirectionDetails>();
Iterator<CommitteeDirection> i = list.iterator();
while(i.hasNext()) {
CommitteeDirection j = i.next();
res.add(j.getDetails((RightChecker) this));
}
return res;
}
/**
* Добавляет или обновляет направление комиссии. Если details.id = 0 сущность создается,
* иначе обновляется существующая с заданным идентификатором.
* @param details данные
* @return идентификатор сущности
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo setCommitteeDirection(CommitteeDirectionDetails details) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
Committee entity = getExistentEntity();
CommitteeDirection direct = null;
AuditDoc<CommitteeDirection> auditDoc;
if(details.id != 0) {
direct = findEntity(CommitteeDirection.class, details.id);
auditDoc = new AuditDoc<CommitteeDirection>(direct, getCollaborator());
checkTheSame(direct.getCommittee());
} else {
direct = new CommitteeDirection();
auditDoc = new AuditDoc<CommitteeDirection>(direct, getCollaborator());
direct.setCommittee(entity);
}
direct.setDirection(findEntity(Direction.class, details.directionID));
int id = saveEntity(direct);
auditDoc.check(direct);
return new ModificationInfo(id, persistAudit(auditDoc));
}
/**
* Удаляет направление комиссии.
* @param id идентификатор члена
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo removeCommitteeDirection(int id) throws ClipsServerException {
checkCommandAccessibility(COMMAND_REMOVE);
checkEntityExist();
CommitteeDirection direct = findEntity(CommitteeDirection.class, id);
checkTheSame(direct.getCommittee());
ArrayList<AuditDoc> auditDocList = new ArrayList<AuditDoc>();
deleteEntityList2(Inability.class, new Field[]{
new Field("committeeResolution.direction", direct)
}, auditDocList);
deleteEntityList2(CommitteeResolution.class, new Field[]{
new Field("direction", direct)
}, auditDocList);
AuditDoc<CommitteeDirection> auditDoc = new AuditDoc<CommitteeDirection>(direct, getCollaborator());
removeEntity(direct);
auditDoc.check(null);
auditDocList.add(auditDoc);
return new ModificationInfo(id, persistAudit(auditDocList));
}
/**
* Возвращает список решений КЭК
* @return список услуг договора
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public List<CommitteeResolutionDetails> getCommitteeResolutionList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Committee entity = getExistentEntity();
Collection<CommitteeResolution> list = findEntityList(CommitteeResolution.class, "direction.committee", entity);
List<CommitteeResolutionDetails> res = new ArrayList<CommitteeResolutionDetails>();
Iterator<CommitteeResolution> i = list.iterator();
while(i.hasNext()) {
CommitteeResolution j = i.next();
res.add(j.getDetails((RightChecker) this));
}
return res;
}
/**
* Добавляет или обновляет решение КЭК. Если details.id = 0 сущность создается,
* иначе обновляется существующая с заданным идентификатором.
* @param details данные
* @return идентификатор сущности
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo setCommitteeResolution(CommitteeResolutionDetails details) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
checkEntityExist();
CommitteeResolution resolution = null;
AuditDoc<CommitteeResolution> auditDoc;
if(details.id != 0) {
resolution = findEntity(CommitteeResolution.class, details.id);
auditDoc = new AuditDoc<CommitteeResolution>(resolution, getCollaborator());
checkTheSame(resolution.getDirection().getCommittee());
} else {
resolution = new CommitteeResolution();
auditDoc = new AuditDoc<CommitteeResolution>(resolution, getCollaborator());
CommitteeDirection comDir = findEntity(CommitteeDirection.class, details.directionID);
resolution.setDirection(comDir);
}
resolution.setType(findEntity(CommitteeResolutionType.class, details.typeID));
resolution.setCollaborator(findEntity(Collaborator.class, details.collaboratorID));
resolution.setDescription(details.description);
resolution.setMkb10(details.mkb10 != 0 ? findEntity(Mkb10.class, details.mkb10) : null);
resolution.setRendered(details.rendered);
int id = saveEntity(resolution);
return new ModificationInfo(id, persistAudit(auditDoc));
}
/**
* Удаляет решение КЭК.
* @param id идентификатор члена
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo removeCommitteeResolution(int id) throws ClipsServerException {
checkCommandAccessibility(COMMAND_REMOVE);
checkEntityExist();
CommitteeResolution resolution = findEntity(CommitteeResolution.class, id);
checkTheSame(resolution.getDirection().getCommittee());
ArrayList<AuditDoc> auditDocList = new ArrayList<AuditDoc>();
deleteEntityList2(Inability.class, new Field[]{
new Field("committeeResolution", resolution)
}, auditDocList);
AuditDoc<CommitteeResolution> auditDoc = new AuditDoc<CommitteeResolution>(resolution, getCollaborator());
removeEntity(resolution);
auditDoc.check(resolution);
auditDocList.add(auditDoc);
return new ModificationInfo(id, persistAudit(auditDocList));
}
/**
* Возвращает список направлений на МСЭК
* @return список услуг договора
*/
@Override
public List<InabilityDetails> getCommitteeInabilityList() throws ClipsServerException {
checkCommandAccessibility(COMMAND_READ);
Committee entity = getExistentEntity();
List<Inability> list = findEntityList(Inability.class, "committeeResolution.direction.committee", entity);
List<InabilityDetails> res = new ArrayList<InabilityDetails>();
Iterator i = list.iterator();
while(i.hasNext()) {
Inability j = (Inability) i.next();
res.add(j.getDetails((RightChecker) this));
}
return res;
}
/**
* Добавляет или обновляет инвалидность. Если details.id = 0 сущность создается,
* иначе обновляется существующая с заданным идентификатором.
* @param details данные
* @return идентификатор сущности
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo setCommitteeInability(InabilityDetails details) throws ClipsServerException {
checkCommandAccessibility(COMMAND_MODIFY);
checkEntityExist();
Inability inability = null;
AuditDoc<Inability> auditDoc;
if(details.id != 0) {
inability = findEntity(Inability.class, details.id);
auditDoc = new AuditDoc<Inability>(inability, getCollaborator());
checkTheSame(inability.getCommitteeResolution().getDirection().getCommittee());
} else {
inability = new Inability();
auditDoc = new AuditDoc<Inability>(inability, getCollaborator());
inability.setCommitteeResolution(findEntity(CommitteeResolution.class, details.committeeResolutionID));
}
inability.setDate(details.date);
inability.setAnswerDate(details.dateAnswer);
inability.setDesc(details.desc);
inability.setLevelIn(details.levelIn);
inability.setLevelOut(details.levelOut);
int id = saveEntity(inability);
auditDoc.check(inability);
return new ModificationInfo(id, persistAudit(auditDoc));
}
/**
* Удаляет инвалидность.
* @param id идентификатор члена
* @throws ClipsServerException сущность должна быть сохранена в базу
*/
@Override
public ModificationInfo removeCommitteeInability(int id) throws ClipsServerException {
checkCommandAccessibility(COMMAND_REMOVE);
checkEntityExist();
Inability inability = findEntity(Inability.class, id);
AuditDoc<Inability> auditDoc = new AuditDoc<Inability>(inability, getCollaborator());
checkTheSame(inability.getCommitteeResolution().getDirection().getCommittee());
manager.remove(inability);
auditDoc.check(null);
return new ModificationInfo(persistAudit(auditDoc));
}
}