@Override
public ModificationInfo setService(ServicePriceDetails details) throws ClipsServerException {
Contract entity = getExistentEntity();
AuditDoc<ServicePrice> auditDoc;
ServicePrice servicePrice = null;
if (details.id != 0) {
servicePrice = findEntity(ServicePrice.class, details.id);
checkTheSame(servicePrice.getContract());
if (servicePrice.getService().getId() != details.serviceID) {
throw new EDataIntegrity("Зафиксирована попытка подмены данных");
}
int rtID = servicePrice.getReceptionType() == null ? 0 : servicePrice.getReceptionType().getId();
if (rtID != details.receptionTypeID) {
throw new EDataIntegrity("Зафиксирована попытка подмены данных");
}
checkModifyServicePrice(servicePrice, details);
auditDoc = new AuditDoc<ServicePrice>(servicePrice, getCollaborator());
} else {
auditDoc = new AuditDoc<ServicePrice>(null, getCollaborator());
servicePrice = new ServicePrice();
checkModifyServicePrice(servicePrice, details);
//Проверка - для посещений нельзя указывать тип приема нулл, а также типы приемов, не имеющие кодов
// для остальных услуг тип приема должна быть нулл
Service service = findEntity(Service.class, details.serviceID);
if (service.getServiceGroup().getId() == ServiceGroup.SERVICE_GROUP_VISIT) {
if (details.receptionTypeID == 0) {
throw new EDataIntegrity("При установке цены на посещение не указан тип приема");
}
ReceptionType rt = findEntity(ReceptionType.class, details.receptionTypeID);
if (rt.getExtKey().trim().isEmpty()) {
throw new EDataIntegrity("При установке цены на посещение не указан тип приема");
}
} else {
if (details.receptionTypeID != 0) {
throw new EDataIntegrity("При установке цены на услугу тип приема не должен быть указан");
}
}
servicePrice.setService(findEntity(Service.class, details.serviceID));
servicePrice.setContract(entity);
servicePrice.setReceptionType(details.receptionTypeID == 0 ? null : findEntity(ReceptionType.class, details.receptionTypeID));
}
if (details.money > details.price) {
throw new EDataIntegrity("Нельзя указывать оплату по договору больше общей стоимости услуги");
}
servicePrice.setMoney(details.money);
servicePrice.setPrice(details.price);
int id = saveEntity(servicePrice);
auditDoc.check(servicePrice);
return new ModificationInfo(id, persistAudit(auditDoc));
}