package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import java.math.BigDecimal; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class EvaluationCriteriaDao { @Autowired private EvaluationCriteriaRepository evaluationCriteriaRepository; @Autowired private CallService callService; @Autowired private LookUpDataService lookUpDataService; @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; @Autowired private LoggingUtil loggingUtil; @Autowired private HttpServletRequest request; public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) { EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.INSERT, null); return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); } private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest, VersionActionTypeEnum actionType, EvaluationCriteriaEntity evaluationCriteriaEntity) { EvaluationCriteriaEntity entity; if (evaluationCriteriaEntity != null && evaluationCriteriaEntity.getId() != null) { entity = evaluationCriteriaEntity; } else { entity = new EvaluationCriteriaEntity(); } //cloned for old data EvaluationCriteriaEntity oldEvaluationCriteriaData = Utils.getClonedEntityForData(entity); CallEntity callEntity = callService.validateCall(evaluationCriteriaRequest.getCallId()); LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(evaluationCriteriaRequest, LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA); entity.setCall(callEntity); entity.setLookupData(lookupDataEntity); entity.setScore(BigDecimal.ZERO); if (evaluationCriteriaRequest.getScore() != null) { entity.setScore(evaluationCriteriaRequest.getScore()); } entity = evaluationCriteriaRepository.save(entity); /** This code is responsible for adding a version history log for the "updating or creating evaluation criteria" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldEvaluationCriteriaData).newData(entity).build()); return entity; } public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { return evaluationCriteriaRepository.findById(id).map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { return evaluationCriteriaRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) { EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.UPDATE, entity); return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); } public void deleteEvaluationCriteria(Long id) { // evaluationCriteriaRepository.deleteById(id); // Not needed if setting isDeleted TRUE in the next line after fetching evaluation criteria EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); // Clone the evaluation criteria entity for old data EvaluationCriteriaEntity oldEvaluationCriteriaData = Utils.getClonedEntityForData(evaluationCriteriaEntity); List oldList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream() .map(Utils::getClonedEntityForData).toList(); evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); evaluationCriteriaEntity = evaluationCriteriaRepository.save(evaluationCriteriaEntity); /** This code is responsible for adding a version history log for the "updating evaluation criteria" operation. **/ loggingUtil.addVersionHistory( VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldEvaluationCriteriaData).newData(evaluationCriteriaEntity) .build()); List updatedList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream() .peek(data -> data.setIsDeleted(Boolean.TRUE)).toList(); List softDeletingSavedList = criteriaFormFieldRepository.saveAll(updatedList); softDeletingSavedList.forEach(data -> { CriteriaFormFieldEntity oldFieldData = oldList.stream().filter(old -> old.getId().equals(data.getId())).findFirst().orElse(null); /** This code is responsible for adding a version history log for the "Soft deleting criteria form field" operation. **/ loggingUtil.addVersionHistory( VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFieldData).newData(data).build()); }); } private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(EvaluationCriteriaEntity entity) { EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); response.setId(entity.getId()); response.setScore(entity.getScore()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); response.setLookUpDataId(entity.getLookupData().getId()); response.setTitle(entity.getLookupData().getTitle()); response.setValue(entity.getLookupData().getValue()); return response; } }