use of se.inera.intyg.common.support.modules.support.api.exception.ModuleException in project webcert by sklintyg.
the class UtkastServiceImpl method saveDraft.
@Override
@Transactional("jpaTransactionManager")
public SaveDraftResponse saveDraft(String intygId, long version, String draftAsJson, boolean createPdlLogEvent) {
LOG.debug("Saving and validating utkast '{}'", intygId);
Utkast utkast = utkastRepository.findOne(intygId);
if (utkast == null) {
LOG.warn("Utkast '{}' was not found", intygId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.DATA_NOT_FOUND, "The utkast could not be found");
}
// check that the draft hasn't been modified concurrently
if (utkast.getVersion() != version) {
LOG.debug("Utkast '{}' was concurrently modified", intygId);
throw new OptimisticLockException(utkast.getSenastSparadAv().getNamn());
}
// check that the draft is still a draft
if (!isTheDraftStillADraft(utkast.getStatus())) {
LOG.error("Utkast '{}' can not be updated since it is no longer in draft mode", intygId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.INVALID_STATE, "This utkast can not be updated since it is no longer in draft mode");
}
String intygType = utkast.getIntygsTyp();
// Keep persisted json for comparsion
String persistedJson = utkast.getModel();
// Update draft with user information
updateUtkastModel(utkast, draftAsJson);
// Is draft valid?
DraftValidation draftValidation = validateDraft(intygId, intygType, draftAsJson);
UtkastStatus utkastStatus = draftValidation.isDraftValid() ? UtkastStatus.DRAFT_COMPLETE : UtkastStatus.DRAFT_INCOMPLETE;
utkast.setStatus(utkastStatus);
// Save the updated draft
utkast = saveDraft(utkast);
LOG.debug("Utkast '{}' updated", utkast.getIntygsId());
if (createPdlLogEvent) {
LogRequest logRequest = LogRequestFactory.createLogRequestFromUtkast(utkast);
logService.logUpdateIntyg(logRequest);
monitoringService.logUtkastEdited(utkast.getIntygsId(), utkast.getIntygsTyp());
}
// Notify stakeholders when a draft has been changed/updated
try {
ModuleApi moduleApi = moduleRegistry.getModuleApi(intygType);
if (moduleApi.shouldNotify(persistedJson, draftAsJson)) {
LOG.debug("*** Detected changes in model, sending notification! ***");
sendNotification(utkast, Event.CHANGED);
}
} catch (ModuleException | ModuleNotFoundException e) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, e);
}
// Flush JPA changes, to make sure the version attribute is updated
utkastRepository.flush();
return new SaveDraftResponse(utkast.getVersion(), utkastStatus);
}
use of se.inera.intyg.common.support.modules.support.api.exception.ModuleException in project webcert by sklintyg.
the class UtkastServiceImpl method updatePatientOnDraft.
@Override
public void updatePatientOnDraft(UpdatePatientOnDraftRequest request) {
// diff draftPatient and request patient: if no changes, do nothing
String draftId = request.getDraftId();
LOG.debug("Checking that Patient is up-to-date on Utkast '{}'", draftId);
Utkast utkast = utkastRepository.findOne(draftId);
if (utkast == null) {
LOG.warn("Utkast '{}' was not found", draftId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.DATA_NOT_FOUND, "The utkast could not be found");
}
if (webCertUserService.getUser().getIdsOfAllVardenheter().stream().noneMatch(enhet -> enhet.equalsIgnoreCase(utkast.getEnhetsId()))) {
LOG.error("User did not have any medarbetaruppdrag for enhet '{}'", utkast.getEnhetsId());
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.AUTHORIZATION_PROBLEM, "User did not have any medarbetaruppdrag for enhet " + utkast.getEnhetsId());
}
// check that the draft hasn't been modified concurrently
if (utkast.getVersion() != request.getVersion()) {
LOG.debug("Utkast '{}' was concurrently modified", draftId);
throw new OptimisticLockException(utkast.getSenastSparadAv().getNamn());
}
// check that the draft is still a draft
if (!isTheDraftStillADraft(utkast.getStatus())) {
LOG.error("Utkast '{}' can not be updated since it is no longer in draft mode", draftId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.INVALID_STATE, "This utkast can not be updated since it is no longer in draft mode");
}
final ModuleApi moduleApi = getModuleApi(utkast.getIntygsTyp());
// INTYG-4086
Patient draftPatient = getPatientFromCurrentDraft(moduleApi, utkast.getModel());
Optional<Personnummer> optionalPnr = Optional.ofNullable(request.getPersonnummer());
Optional<Personnummer> optionalDraftPnr = Optional.ofNullable(draftPatient.getPersonId());
if (optionalDraftPnr.isPresent()) {
// Spara undan det gamla personnummret temporärt
String oldPersonId = optionalDraftPnr.get().getPersonnummer();
webCertUserService.getUser().getParameters().setBeforeAlternateSsn(oldPersonId);
}
if ((optionalPnr.isPresent() || SamordningsnummerValidator.isSamordningsNummer(optionalPnr)) && !isHashEqual(optionalPnr, optionalDraftPnr)) {
// INTYG-4086: Ta reda på om man skall kunna uppdatera annat än personnumret? Och om man uppdaterar
// personnumret -
// vilka regler gäller då för namn och adress? Samma regler som i PatientDetailsResolverImpl?
draftPatient.setPersonId(optionalPnr.get());
try {
String updatedModel = moduleApi.updateBeforeSave(utkast.getModel(), draftPatient);
updateUtkastModel(utkast, updatedModel);
saveDraft(utkast);
monitoringService.logUtkastPatientDetailsUpdated(utkast.getIntygsId(), utkast.getIntygsTyp());
sendNotification(utkast, Event.CHANGED);
} catch (ModuleException e) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, "Patient details on Utkast " + draftId + " could not be updated", e);
}
} else {
LOG.debug("Utkast '{}' patient details were already up-to-date: no update needed", draftId);
}
}
use of se.inera.intyg.common.support.modules.support.api.exception.ModuleException in project webcert by sklintyg.
the class UtkastServiceImpl method updateUtkastModel.
private void updateUtkastModel(Utkast utkast, String modelJson) {
WebCertUser user = webCertUserService.getUser();
try {
ModuleApi moduleApi = moduleRegistry.getModuleApi(utkast.getIntygsTyp());
GrundData grundData = moduleApi.getUtlatandeFromJson(modelJson).getGrundData();
Vardenhet vardenhetFromJson = grundData.getSkapadAv().getVardenhet();
HoSPersonal hosPerson = IntygConverterUtil.buildHosPersonalFromWebCertUser(user, vardenhetFromJson);
utkast.setSenastSparadAv(UpdateUserUtil.createVardpersonFromWebCertUser(user));
utkast.setPatientPersonnummer(grundData.getPatient().getPersonId());
String updatedInternal = moduleApi.updateBeforeSave(modelJson, hosPerson);
// String updatedInternalWithResolvedPatient = moduleApi.updateBeforeSave(updatedInternal,
// updatedPatientForSaving);
utkast.setModel(updatedInternal);
updatePatientNameFromModel(utkast, grundData.getPatient());
} catch (ModuleException | ModuleNotFoundException | IOException e) {
if (e.getCause() != null && e.getCause().getCause() != null) {
// This error message is helpful when debugging save problems.
LOG.debug(e.getCause().getCause().getMessage());
}
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, "Could not update with HoS personal", e);
}
}
use of se.inera.intyg.common.support.modules.support.api.exception.ModuleException in project webcert by sklintyg.
the class UtkastServiceImpl method validateDraft.
@Override
public DraftValidation validateDraft(String intygId, String intygType, String draftAsJson) {
LOG.debug("Validating Intyg '{}' with type '{}'", intygId, intygType);
try {
ModuleApi moduleApi = moduleRegistry.getModuleApi(intygType);
ValidateDraftResponse validateDraftResponse = moduleApi.validateDraft(draftAsJson);
return convertToDraftValidation(validateDraftResponse);
} catch (ModuleException | ModuleNotFoundException me) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, me);
}
}
use of se.inera.intyg.common.support.modules.support.api.exception.ModuleException in project webcert by sklintyg.
the class AbstractUtkastBuilder method populateCopyUtkastFromSignedIntyg.
/*
* (non-Javadoc)
*
* @see
* se.inera.intyg.webcert.web.service.utkast.CopyUtkastBuilder#populateCopyUtkastFromSignedIntyg(se.inera.intyg.
* webcert.web.service.utkast.dto.CreateNewDraftCopyRequest, se.inera.intyg.webcert.integration.pu.model.Person)
*/
@Override
public CopyUtkastBuilderResponse populateCopyUtkastFromSignedIntyg(T copyRequest, Person patientDetails, boolean addRelation, boolean coherentJournaling, boolean enforceEnhet) throws ModuleNotFoundException, ModuleException {
String orignalIntygsId = copyRequest.getOriginalIntygId();
String originalIntygsTyp = copyRequest.getOriginalIntygTyp();
String intygsTyp = copyRequest.getTyp();
IntygContentHolder signedIntygHolder = intygService.fetchIntygData(orignalIntygsId, originalIntygsTyp, coherentJournaling);
ModuleApi orgModuleApi = moduleRegistry.getModuleApi(originalIntygsTyp);
Utlatande orgUtlatande;
try {
orgUtlatande = orgModuleApi.getUtlatandeFromJson(signedIntygHolder.getContents());
} catch (IOException e) {
throw new ModuleException("Could not convert orignal certificate to Utlatande", e);
}
GrundData grundData = signedIntygHolder.getUtlatande().getGrundData();
se.inera.intyg.common.support.model.common.internal.Vardenhet vardenhet = grundData.getSkapadAv().getVardenhet();
if (coherentJournaling && enforceEnhet) {
verifyEnhetsAuth(vardenhet.getVardgivare().getVardgivarid(), vardenhet.getEnhetsid(), true);
}
LOG.debug("Populating copy with details from signed Intyg '{}'", orignalIntygsId);
CopyUtkastBuilderResponse builderResponse = new CopyUtkastBuilderResponse();
builderResponse.setOrginalEnhetsId(vardenhet.getEnhetsid());
builderResponse.setOrginalEnhetsNamn(vardenhet.getEnhetsnamn());
builderResponse.setOrginalVardgivarId(vardenhet.getVardgivare().getVardgivarid());
builderResponse.setOrginalVardgivarNamn(vardenhet.getVardgivare().getVardgivarnamn());
ModuleApi moduleApi = moduleRegistry.getModuleApi(intygsTyp);
// Set relation to null if not applicable
Relation relation = createRelation(copyRequest);
String newDraftCopyId = intygsIdStrategy.createId();
String draftCopyJson = getInternalModel(orgUtlatande, moduleApi, copyRequest, patientDetails, relation, newDraftCopyId);
UtkastStatus utkastStatus = validateDraft(moduleApi, draftCopyJson);
Utkast utkast = buildUtkastCopy(copyRequest, newDraftCopyId, intygsTyp, addRelation, relation, draftCopyJson, utkastStatus);
if (patientDetails != null) {
populatePatientDetailsFromPerson(utkast, patientDetails);
} else {
se.inera.intyg.common.support.model.common.internal.Patient patient = signedIntygHolder.getUtlatande().getGrundData().getPatient();
populatePatientDetailsFromPatient(utkast, patient);
}
replacePatientPersonnummerWithNew(utkast, copyRequest);
builderResponse.setUtkastCopy(utkast);
return builderResponse;
}
Aggregations