blob: 48bb96846e12d6f447e7563003bd615125dac1c3 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.infrastructure.campaigns.sms.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.infrastructure.campaigns.constants.CampaignType;
import org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType;
import org.apache.fineract.infrastructure.campaigns.sms.data.SmsBusinessRulesData;
import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignData;
import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignTimeLine;
import org.apache.fineract.infrastructure.campaigns.sms.data.SmsProviderData;
import org.apache.fineract.infrastructure.campaigns.sms.domain.SmsCampaignStatusEnumerations;
import org.apache.fineract.infrastructure.campaigns.sms.exception.SmsCampaignNotFound;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.service.Page;
import org.apache.fineract.infrastructure.core.service.PaginationHelper;
import org.apache.fineract.infrastructure.core.service.SearchParameters;
import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
import org.apache.fineract.portfolio.calendar.service.CalendarDropdownReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
@Service
public class SmsCampaignReadPlatformServiceImpl implements SmsCampaignReadPlatformService {
private final BusinessRuleMapper businessRuleMapper;
private final JdbcTemplate jdbcTemplate;
private final DatabaseSpecificSQLGenerator sqlGenerator;
private final SmsCampaignDropdownReadPlatformService smsCampaignDropdownReadPlatformService;
private final SmsCampaignMapper smsCampaignMapper;
private final CalendarDropdownReadPlatformService calendarDropdownReadPlatformService;
private final PaginationHelper paginationHelper;
@Autowired
public SmsCampaignReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate,
SmsCampaignDropdownReadPlatformService smsCampaignDropdownReadPlatformService,
final CalendarDropdownReadPlatformService calendarDropdownReadPlatformService, DatabaseSpecificSQLGenerator sqlGenerator,
PaginationHelper paginationHelper) {
this.jdbcTemplate = jdbcTemplate;
this.sqlGenerator = sqlGenerator;
this.businessRuleMapper = new BusinessRuleMapper(sqlGenerator);
this.smsCampaignDropdownReadPlatformService = smsCampaignDropdownReadPlatformService;
this.smsCampaignMapper = new SmsCampaignMapper();
this.calendarDropdownReadPlatformService = calendarDropdownReadPlatformService;
this.paginationHelper = paginationHelper;
}
@Override
public SmsCampaignData retrieveOne(Long campaignId) {
final boolean isVisible = true;
try {
final String sql = "select " + this.smsCampaignMapper.schema + " where sc.id = ? and sc.is_visible = ?";
return this.jdbcTemplate.queryForObject(sql, this.smsCampaignMapper, campaignId, isVisible); // NOSONAR
} catch (final EmptyResultDataAccessException e) {
throw new SmsCampaignNotFound(campaignId, e);
}
}
@Override
public Page<SmsCampaignData> retrieveAll(final SearchParameters searchParameters) {
final boolean visible = true;
final StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select " + sqlGenerator.calcFoundRows() + " ");
sqlBuilder.append(this.smsCampaignMapper.schema() + " where sc.is_visible = ? ");
if (searchParameters.hasLimit()) {
sqlBuilder.append(" ");
if (searchParameters.hasOffset()) {
sqlBuilder.append(sqlGenerator.limit(searchParameters.getLimit(), searchParameters.getOffset()));
} else {
sqlBuilder.append(sqlGenerator.limit(searchParameters.getLimit()));
}
}
return this.paginationHelper.fetchPage(jdbcTemplate, sqlBuilder.toString(), new Object[] { visible }, this.smsCampaignMapper);
}
@Override
public SmsCampaignData retrieveTemplate(final String reportType) {
String sql = "select " + this.businessRuleMapper.schema();
if (!StringUtils.isEmpty(reportType)) {
sql = sql + " where sr.report_type = ?";
}
final Collection<SmsBusinessRulesData> businessRulesOptions = this.jdbcTemplate.query(sql, this.businessRuleMapper, // NOSONAR
reportType);
final Collection<SmsProviderData> smsProviderOptions = this.smsCampaignDropdownReadPlatformService.retrieveSmsProviders();
final Collection<EnumOptionData> campaignTypeOptions = this.smsCampaignDropdownReadPlatformService.retrieveCampaignTypes();
final Collection<EnumOptionData> campaignTriggerTypeOptions = this.smsCampaignDropdownReadPlatformService
.retrieveCampaignTriggerTypes();
final Collection<EnumOptionData> months = this.smsCampaignDropdownReadPlatformService.retrieveMonths();
final Collection<EnumOptionData> weekDays = this.smsCampaignDropdownReadPlatformService.retrieveWeeks();
final Collection<EnumOptionData> frequencyTypeOptions = this.calendarDropdownReadPlatformService
.retrieveCalendarFrequencyTypeOptions();
final Collection<EnumOptionData> periodFrequencyOptions = this.smsCampaignDropdownReadPlatformService.retrivePeriodFrequencyTypes();
// final Collection<TriggerTypeWithSubTypesData>
// triggerTypeSubTypeOptions =
// this.smsCampaignDropdownReadPlatformService.getTriggerTypeAndSubTypes();
return SmsCampaignData.template(smsProviderOptions, campaignTypeOptions, businessRulesOptions, campaignTriggerTypeOptions, months,
weekDays, frequencyTypeOptions, periodFrequencyOptions);
}
@Override
public Collection<SmsCampaignData> retrieveAllScheduleActiveCampaign() {
return null;
}
private static final class BusinessRuleMapper implements ResultSetExtractor<List<SmsBusinessRulesData>> {
final String schema;
private BusinessRuleMapper(DatabaseSpecificSQLGenerator sqlGenerator) {
final StringBuilder sql = new StringBuilder(300);
sql.append("sr.id as id, ");
sql.append("sr.report_name as reportName, ");
sql.append("sr.report_type as reportType, ");
sql.append("sr.report_subtype as reportSubType, ");
sql.append("sr.description as description, ");
sql.append("sp.parameter_variable as params, ");
sql.append("sp." + sqlGenerator.escape("parameter_FormatType") + " as paramType, ");
sql.append("sp.parameter_label as paramLabel, ");
sql.append("sp.parameter_name as paramName ");
sql.append("from stretchy_report sr ");
sql.append("left join stretchy_report_parameter as srp on srp.report_id = sr.id ");
sql.append("left join stretchy_parameter as sp on sp.id = srp.parameter_id ");
this.schema = sql.toString();
}
public String schema() {
return this.schema;
}
@Override
public List<SmsBusinessRulesData> extractData(ResultSet rs) throws SQLException, DataAccessException {
List<SmsBusinessRulesData> smsBusinessRulesDataList = new ArrayList<SmsBusinessRulesData>();
SmsBusinessRulesData smsBusinessRulesData = null;
Map<Long, SmsBusinessRulesData> mapOfSameObjects = new HashMap<Long, SmsBusinessRulesData>();
while (rs.next()) {
final Long id = rs.getLong("id");
smsBusinessRulesData = mapOfSameObjects.get(id);
if (smsBusinessRulesData == null) {
final String reportName = rs.getString("reportName");
final String reportType = rs.getString("reportType");
final String reportSubType = rs.getString("reportSubType");
final String paramName = rs.getString("paramName");
final String paramLabel = rs.getString("paramLabel");
final String description = rs.getString("description");
Map<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put(paramLabel, paramName);
smsBusinessRulesData = SmsBusinessRulesData.instance(id, reportName, reportType, reportSubType, hashMap, description);
mapOfSameObjects.put(id, smsBusinessRulesData);
// add to the list
smsBusinessRulesDataList.add(smsBusinessRulesData);
}
// add new paramType to the existing object
Map<String, Object> hashMap = new HashMap<String, Object>();
final String paramName = rs.getString("paramName");
final String paramLabel = rs.getString("paramLabel");
hashMap.put(paramLabel, paramName);
// get existing map and add new items to it
smsBusinessRulesData.getReportParamName().putAll(hashMap);
}
return smsBusinessRulesDataList;
}
}
private static final class SmsCampaignMapper implements RowMapper<SmsCampaignData> {
final String schema;
private SmsCampaignMapper() {
final StringBuilder sql = new StringBuilder(400);
sql.append("sc.id as id, ");
sql.append("sc.campaign_name as campaignName, ");
sql.append("sc.campaign_type as campaignType, ");
sql.append("sc.campaign_trigger_type as triggerType, ");
sql.append("sc.report_id as runReportId, ");
sql.append("sc.message as message, ");
sql.append("sc.param_value as paramValue, ");
sql.append("sc.status_enum as status, ");
sql.append("sc.recurrence as recurrence, ");
sql.append("sc.recurrence_start_date as recurrenceStartDate, ");
sql.append("sc.next_trigger_date as nextTriggerDate, ");
sql.append("sc.last_trigger_date as lastTriggerDate, ");
sql.append("sc.submittedon_date as submittedOnDate, ");
sql.append("sbu.username as submittedByUsername, ");
sql.append("sc.closedon_date as closedOnDate, ");
sql.append("clu.username as closedByUsername, ");
sql.append("acu.username as activatedByUsername, ");
sql.append("sc.approvedon_date as activatedOnDate, ");
sql.append("sr.report_name as reportName, ");
sql.append("provider_id as providerId, ");
sql.append("sc.is_notification as isNotification ");
sql.append("from sms_campaign sc ");
sql.append("left join m_appuser sbu on sbu.id = sc.submittedon_userid ");
sql.append("left join m_appuser acu on acu.id = sc.approvedon_userid ");
sql.append("left join m_appuser clu on clu.id = sc.closedon_userid ");
sql.append("left join stretchy_report sr on sr.id = sc.report_id ");
this.schema = sql.toString();
}
public String schema() {
return this.schema;
}
@Override
public SmsCampaignData mapRow(ResultSet rs, int rowNum) throws SQLException {
final Long id = JdbcSupport.getLong(rs, "id");
final String campaignName = rs.getString("campaignName");
final Integer campaignType = JdbcSupport.getInteger(rs, "campaignType");
final EnumOptionData campaignTypeEnum = CampaignType.campaignType(campaignType);
final Long runReportId = JdbcSupport.getLong(rs, "runReportId");
final String paramValue = rs.getString("paramValue");
final String message = rs.getString("message");
final Integer statusId = JdbcSupport.getInteger(rs, "status");
final EnumOptionData status = SmsCampaignStatusEnumerations.status(statusId);
final Integer triggerType = JdbcSupport.getInteger(rs, "triggerType");
final EnumOptionData triggerTypeEnum = SmsCampaignTriggerType.triggerType(triggerType);
final ZonedDateTime nextTriggerDate = JdbcSupport.getDateTime(rs, "nextTriggerDate");
final LocalDate lastTriggerDate = JdbcSupport.getLocalDate(rs, "lastTriggerDate");
final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, "closedOnDate");
final String closedByUsername = rs.getString("closedByUsername");
final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate");
final String submittedByUsername = rs.getString("submittedByUsername");
final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, "activatedOnDate");
final String activatedByUsername = rs.getString("activatedByUsername");
final String recurrence = rs.getString("recurrence");
final ZonedDateTime recurrenceStartDate = JdbcSupport.getDateTime(rs, "recurrenceStartDate");
final SmsCampaignTimeLine smsCampaignTimeLine = new SmsCampaignTimeLine(submittedOnDate, submittedByUsername, activatedOnDate,
activatedByUsername, closedOnDate, closedByUsername);
final String reportName = rs.getString("reportName");
final Long providerId = rs.getLong("providerId");
final Boolean isNotification = rs.getBoolean("isNotification");
return SmsCampaignData.instance(id, campaignName, campaignTypeEnum, triggerTypeEnum, runReportId, reportName, paramValue,
status, message, nextTriggerDate, lastTriggerDate, smsCampaignTimeLine, recurrenceStartDate, recurrence, providerId,
isNotification);
}
}
}