diff --git a/src/main/java/com/iemr/common/controller/beneficiary/BeneficiaryRegistrationController.java b/src/main/java/com/iemr/common/controller/beneficiary/BeneficiaryRegistrationController.java index 67f57981..0fb758b0 100644 --- a/src/main/java/com/iemr/common/controller/beneficiary/BeneficiaryRegistrationController.java +++ b/src/main/java/com/iemr/common/controller/beneficiary/BeneficiaryRegistrationController.java @@ -212,6 +212,7 @@ public String createBeneficiary( OutputResponse response = new OutputResponse(); logger.info("Create beneficiary request " + beneficiaryModel); + logger.info("Common-api Call: Create bene"); try { response.setResponse(registerBenificiaryService.save(beneficiaryModel, httpRequest)); diff --git a/src/main/java/com/iemr/common/data/dynamic_from/FormField.java b/src/main/java/com/iemr/common/data/dynamic_from/FormField.java index 1b195db9..08534239 100644 --- a/src/main/java/com/iemr/common/data/dynamic_from/FormField.java +++ b/src/main/java/com/iemr/common/data/dynamic_from/FormField.java @@ -62,6 +62,9 @@ public class FormField { @Column(name = "created_at") private LocalDateTime createdAt = LocalDateTime.now(); + @Column(name = "option_key") + private String optionKey; + } diff --git a/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java b/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java new file mode 100644 index 00000000..8cfeb0de --- /dev/null +++ b/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java @@ -0,0 +1,34 @@ +package com.iemr.common.data.dynamic_from; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Table(name = "form_field_options") +@Data +public class FormFieldOption { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "option_key") + private String optionKey; + + @Column(name = "value") + private String value; + + @Column(name = "label_en") + private String labelEn; + + @Column(name = "label_hi") + private String labelHi; + + @Column(name = "label_as") + private String labelAs; + + @Column(name = "sort_order") + private Integer sortOrder; + + // getters/setters +} \ No newline at end of file diff --git a/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java b/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java index e41f8e80..dbf241ae 100644 --- a/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java +++ b/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java @@ -20,7 +20,7 @@ public class FieldResponseDTO { private Integer sequence; private Boolean isEditable; private Integer stateCode; - private List options; + public List> options; private Map validation; private Map conditional; } \ No newline at end of file diff --git a/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java b/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java new file mode 100644 index 00000000..3f258ae4 --- /dev/null +++ b/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java @@ -0,0 +1,14 @@ +package com.iemr.common.repository.dynamic_form; +import com.iemr.common.data.dynamic_from.FormFieldOption; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FormFieldOptionRepository + extends JpaRepository { + + List findByOptionKeyOrderBySortOrderAsc(String optionKey); + +} \ No newline at end of file diff --git a/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java b/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java index 82acb58f..9c6f2f96 100644 --- a/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java +++ b/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java @@ -224,9 +224,28 @@ public String save(BeneficiaryModel beneficiaryModel, HttpServletRequest servlet } else { return response.toString(); } - if(beneficiary!=null){ - if(beneficiary.getBenPhoneMaps().get(0).getPhoneNo()!=null){ - welcomeBenificarySmsService.sendWelcomeSMStoBenificiary(beneficiary.getBenPhoneMaps().get(0).getPhoneNo(),beneficiary.getFirstName()+" "+beneficiary.getLastName(),beneficiary.getBeneficiaryID()); + if (beneficiary != null && beneficiary.getBenPhoneMaps() != null && !beneficiary.getBenPhoneMaps().isEmpty()) { + String phoneNo = beneficiary.getBenPhoneMaps().get(0).getPhoneNo(); + + if (phoneNo != null && !phoneNo.trim().isEmpty()) { + String beneficiaryName = (beneficiary.getFirstName() != null ? beneficiary.getFirstName() : "") + " " + + (beneficiaryModel.getLastName() != null ? beneficiaryModel.getLastName() : ""); + + try { + logger.info("[SMS] Attempting to send welcome SMS to: " + phoneNo); + String smsResult = welcomeBenificarySmsService.sendWelcomeSMStoBenificiary( + phoneNo, + beneficiaryName.trim(), + beneficiary.getBeneficiaryID() + + ); + logger.info("[SMS]: "+ smsResult); + + } catch (Exception smsError) { + // SMS failed but beneficiary is already created - don't fail the request + logger.warn("[SMS] Failed to send SMS: " + smsError.getMessage() + + " - But beneficiary already created successfully"); + } } } diff --git a/src/main/java/com/iemr/common/service/beneficiaryOTPHandler/BeneficiaryOTPHandlerImpl.java b/src/main/java/com/iemr/common/service/beneficiaryOTPHandler/BeneficiaryOTPHandlerImpl.java index 3cc0a709..a6b03eb0 100644 --- a/src/main/java/com/iemr/common/service/beneficiaryOTPHandler/BeneficiaryOTPHandlerImpl.java +++ b/src/main/java/com/iemr/common/service/beneficiaryOTPHandler/BeneficiaryOTPHandlerImpl.java @@ -70,8 +70,7 @@ public class BeneficiaryOTPHandlerImpl implements BeneficiaryOTPHandler { @Autowired SMSTypeRepository smsTypeRepository; - @Value("${sms-template-name}") - private String smsTemplateName ; + private String smsTemplateName = "otp_consent" ; private String smsTemplate; @Value("${sms-username}") diff --git a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java index acbcb4e7..0bf1c2fe 100644 --- a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java +++ b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java @@ -1,14 +1,17 @@ package com.iemr.common.service.dynamicForm; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.iemr.common.data.dynamic_from.FormDefinition; import com.iemr.common.data.dynamic_from.FormField; +import com.iemr.common.data.dynamic_from.FormFieldOption; import com.iemr.common.data.dynamic_from.FormModule; import com.iemr.common.data.translation.Translation; import com.iemr.common.data.users.UserServiceRole; import com.iemr.common.dto.dynamicForm.*; import com.iemr.common.repository.dynamic_form.FieldRepository; +import com.iemr.common.repository.dynamic_form.FormFieldOptionRepository; import com.iemr.common.repository.dynamic_form.FormRepository; import com.iemr.common.repository.dynamic_form.ModuleRepository; import com.iemr.common.repository.translation.TranslationRepo; @@ -43,6 +46,9 @@ public class FormMasterServiceImpl implements FormMasterService { @Autowired private JwtUtil jwtUtil; + @Autowired + private FormFieldOptionRepository formFieldOptionRepo ; + @Override public FormModule createModule(ModuleDTO dto) { FormModule module = new FormModule(); @@ -135,24 +141,40 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str Integer finalStateId = stateId; List fieldDtos = fields.stream().filter(formField -> (formField.getStateCode().equals(0) || formField.getStateCode().equals(finalStateId))) .map(field -> { - String labelKey = field.getFieldId(); // field label already contains label_key + String labelKey = field.getFieldId(); + + Translation label = translationRepo.findByLabelKeyAndIsActive(labelKey, true) + .orElse(null); - Translation t = translationRepo.findByLabelKeyAndIsActive(labelKey, true) + Translation placeHolder = translationRepo.findByLabelKeyAndIsActive("placeholder_"+labelKey, true) .orElse(null); - String translatedLabel = field.getLabel(); // fallback + String translatedLabel = field.getLabel(); + String translatedPlaceHolder = field.getPlaceholder(); - if (t != null) { + if (label != null) { if ("hi".equalsIgnoreCase(lang)) { - translatedLabel = t.getHindiTranslation(); + translatedLabel = label.getHindiTranslation(); } else if ("as".equalsIgnoreCase(lang)) { - translatedLabel = t.getAssameseTranslation(); + translatedLabel = label.getAssameseTranslation(); } else if ("en".equalsIgnoreCase(lang)) { - translatedLabel = t.getEnglish(); + translatedLabel = label.getEnglish(); } } + if (placeHolder != null) { + if ("hi".equalsIgnoreCase(lang)) { + translatedPlaceHolder= placeHolder.getHindiTranslation(); + } else if ("as".equalsIgnoreCase(lang)) { + translatedPlaceHolder = placeHolder.getAssameseTranslation(); + } else if ("en".equalsIgnoreCase(lang)) { + translatedPlaceHolder = placeHolder.getEnglish(); + + } + } + + FieldResponseDTO dto = new FieldResponseDTO(); dto.setId(field.getId()); dto.setIsEditable(field.getIsEditable()); @@ -165,27 +187,32 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str dto.setType(field.getType()); dto.setIsRequired(field.getIsRequired()); dto.setDefaultValue(field.getDefaultValue()); - dto.setPlaceholder(field.getPlaceholder()); + dto.setPlaceholder(translatedPlaceHolder); dto.setSequence(field.getSequence()); + try { - // Handle options - if (field.getOptions() != null && !field.getOptions().isBlank()) { - JsonNode node = objectMapper.readTree(field.getOptions()); - List options = null; - if (node.isArray()) { - options = objectMapper.convertValue(node, new TypeReference<>() { - }); - } else if (node.has("options")) { - options = objectMapper.convertValue(node.get("options"), new TypeReference<>() { - }); - } - dto.setOptions(options == null || options.isEmpty() ? null : options); + if (field.getOptionKey() != null && !field.getOptionKey().isBlank()) { + List dbOptions = formFieldOptionRepo + .findByOptionKeyOrderBySortOrderAsc(field.getOptionKey()); + + List> translatedOptions = dbOptions.stream() + .map(opt -> { + Map map = new LinkedHashMap<>(); + map.put("id", opt.getId()); + map.put("value", opt.getValue()); + if ("hi".equalsIgnoreCase(lang)) map.put("label", opt.getLabelHi()); + else if ("as".equalsIgnoreCase(lang)) map.put("label", opt.getLabelAs()); + else map.put("label", opt.getLabelEn()); + return map; + }) + .collect(Collectors.toList()); + + dto.setOptions(translatedOptions.isEmpty() ? null : translatedOptions); + } else { dto.setOptions(null); } - - // Handle validation if (field.getValidation() != null && !field.getValidation().isBlank()) { Map validation = objectMapper.readValue(field.getValidation(), new TypeReference<>() { }); @@ -194,7 +221,6 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str dto.setValidation(null); } - // Handle conditional if (field.getConditional() != null && !field.getConditional().isBlank()) { Map conditional = objectMapper.readValue(field.getConditional(), new TypeReference<>() { }); diff --git a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java index 67b642ab..1cbb1d8c 100644 --- a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java +++ b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -46,58 +47,57 @@ public class WelcomeBenificarySmsServiceImpl implements WelcomeBenificarySmsServ private String smsTemplateName = "welcome_sms"; - private String smsTemplate; + private String smsTemplate =null; - @Override + @Async public String sendWelcomeSMStoBenificiary(String contactNo, String beneficiaryName, String beneficiaryId) { - final RestTemplate restTemplate = new RestTemplate(); - - Optional smsTemplateData = smsTemplateRepository.findBySmsTemplateName(smsTemplateName); - if (smsTemplateData.isPresent()) { - smsTemplate = smsTemplateRepository.findBySmsTemplateID(smsTemplateData.get().getSmsTemplateID()).getSmsTemplate(); - - } - - logger.info("sms template" + smsTemplate); - - - String sendSMSAPI = SMS_GATEWAY_URL; try { + String sendSMSAPI = SMS_GATEWAY_URL; - String message = smsTemplate.replace("$$BENE_NAME$$", beneficiaryName).replace("$$BEN_ID$$", beneficiaryId); - // Build payload - Map payload = new HashMap<>(); - payload.put("customerId", smsUserName); - payload.put("destinationAddress", contactNo); - payload.put("message", message); - payload.put("sourceAddress", smsSourceAddress); - payload.put("messageType", "SERVICE_IMPLICIT"); - payload.put("dltTemplateId", smsTemplateData.get().getDltTemplateId()); - payload.put("entityId", smsEntityId); - // Set headers - HttpHeaders headers = new HttpHeaders(); - String auth = smsUserName + ":" + smsPassword; - headers.add("Authorization", - "Basic " + Base64.getEncoder().encodeToString(auth.getBytes())); - - headers.setContentType(MediaType.APPLICATION_JSON); - logger.info("payload: " + payload); - HttpEntity> request = new HttpEntity<>(payload, headers); - - // Call API - ResponseEntity response = restTemplate.postForEntity(sendSMSAPI, request, String.class); - logger.info("sms-response:" + response.getBody()); - if (response.getStatusCode().value() == 200) { - return "OTP sent successfully on register mobile number"; - } else { - return "Fail"; + final RestTemplate restTemplate = new RestTemplate(); + Optional smsTemplateData = smsTemplateRepository.findBySmsTemplateName(smsTemplateName); + if (smsTemplateData.isPresent()) { + smsTemplate = smsTemplateRepository.findBySmsTemplateID(smsTemplateData.get().getSmsTemplateID()).getSmsTemplate(); } + if(smsTemplate!=null){ + String message = smsTemplate.replace("$$BENE_NAME$$", beneficiaryName).replace("$$BEN_ID$$", beneficiaryId); + // Build payload + Map payload = new HashMap<>(); + payload.put("customerId", smsUserName); + payload.put("destinationAddress", contactNo); + payload.put("message", message); + payload.put("sourceAddress", smsSourceAddress); + payload.put("messageType", "SERVICE_IMPLICIT"); + payload.put("dltTemplateId", smsTemplateData.get().getDltTemplateId()); + payload.put("entityId", smsEntityId); + // Set headers + HttpHeaders headers = new HttpHeaders(); + String auth = smsUserName + ":" + smsPassword; + headers.add("Authorization", + "Basic " + Base64.getEncoder().encodeToString(auth.getBytes())); + + headers.setContentType(MediaType.APPLICATION_JSON); + logger.info("payload: " + payload); + HttpEntity> request = new HttpEntity<>(payload, headers); + + // Call API + ResponseEntity response = restTemplate.postForEntity(sendSMSAPI, request, String.class); + logger.info("sms-response:" + response.getBody()); + if (response.getStatusCode().value() == 200) { + return "OTP sent successfully on register mobile number"; + } else { + return "Fail"; + + } + } + } catch (Exception e) { return "Error sending SMS: " + e.getMessage().toString(); } + return null; } }