diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/PortfolioAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/PortfolioAccountReadPlatformServiceImpl.java index 1c7c0d19a..28ccc9a53 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/PortfolioAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/PortfolioAccountReadPlatformServiceImpl.java @@ -298,17 +298,17 @@ public class PortfolioAccountReadPlatformServiceImpl implements PortfolioAccount PortfolioLoanAccountRefundByTransferMapper() { final StringBuilder amountQueryString = new StringBuilder(400); - amountQueryString.append("(select (SUM(ifnull(mr.principal_completed_derived, 0)) +"); - amountQueryString.append("SUM(ifnull(mr.interest_completed_derived, 0)) + "); - amountQueryString.append("SUM(ifnull(mr.fee_charges_completed_derived, 0)) + "); - amountQueryString.append(" SUM(ifnull(mr.penalty_charges_completed_derived, 0))) as total_in_advance_derived"); + amountQueryString.append("(select (SUM(COALESCE(mr.principal_completed_derived, 0)) +"); + amountQueryString.append("SUM(COALESCE(mr.interest_completed_derived, 0)) + "); + amountQueryString.append("SUM(COALESCE(mr.fee_charges_completed_derived, 0)) + "); + amountQueryString.append(" SUM(COALESCE(mr.penalty_charges_completed_derived, 0))) as total_in_advance_derived"); amountQueryString.append(" from m_loan ml INNER JOIN m_loan_repayment_schedule mr on mr.loan_id = ml.id"); amountQueryString.append(" where ml.id=? and ml.loan_status_id = 300"); amountQueryString.append(" and mr.duedate >= CURDATE() group by ml.id having"); - amountQueryString.append(" (SUM(ifnull(mr.principal_completed_derived, 0)) + "); - amountQueryString.append(" SUM(ifnull(mr.interest_completed_derived, 0)) + "); - amountQueryString.append("SUM(ifnull(mr.fee_charges_completed_derived, 0)) + "); - amountQueryString.append("SUM(ifnull(mr.penalty_charges_completed_derived, 0))) > 0) as totalOverpaid "); + amountQueryString.append(" (SUM(COALESCE(mr.principal_completed_derived, 0)) + "); + amountQueryString.append(" SUM(COALESCE(mr.interest_completed_derived, 0)) + "); + amountQueryString.append("SUM(COALESCE(mr.fee_charges_completed_derived, 0)) + "); + amountQueryString.append("SUM(COALESCE(mr.penalty_charges_completed_derived, 0))) > 0) as totalOverpaid "); final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("la.id as id, la.account_no as accountNo, la.external_id as externalId, "); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java index 137c654c0..16919cfcc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionWritePlatformServiceImpl.java @@ -261,7 +261,7 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst boolean transferCompleted = true; StringBuilder errorLog = new StringBuilder(); StringBuilder updateQuery = new StringBuilder( - "INSERT INTO `m_account_transfer_standing_instructions_history` (`standing_instruction_id`, `status`, `amount`,`execution_time`, `error_log`) VALUES ("); + "INSERT INTO m_account_transfer_standing_instructions_history (standing_instruction_id, `status`, amount,execution_time, error_log) VALUES ("); try { this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); } catch (final PlatformApiDataValidationException e) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java index 57d5199b4..4cad313a4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java @@ -81,7 +81,7 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou // currently handles loans of exisiting types. final String savingswhereClause = " where sa.client_id = ? order by sa.status_enum ASC, sa.account_no ASC"; - final String guarantorWhereClause = " where g.entity_id = ? and g.is_active = 1 order by l.account_no ASC"; + final String guarantorWhereClause = " where g.entity_id = ? and g.is_active = true order by l.account_no ASC"; final List glimAccounts = retrieveLoanAccountDetails(glimLoanClause, new Object[] { clientId }); final List loanAccounts = retrieveLoanAccountDetails(loanwhereClause, new Object[] { clientId }); @@ -102,8 +102,8 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou final String savingswhereClauseForGroup = " where sa.group_id = ? and sa.client_id is null order by sa.status_enum ASC, sa.account_no ASC"; final String savingswhereClauseForMembers = " where sa.group_id = ? and sa.client_id is not null order by sa.status_enum ASC, sa.account_no ASC"; - final String guarantorWhereClauseForGroup = " where l.group_id = ? and l.client_id is null and g.is_active = 1 order by l.account_no ASC"; - final String guarantorWhereClauseForMembers = " where l.group_id = ? and l.client_id is not null and g.is_active = 1 order by l.account_no ASC"; + final String guarantorWhereClauseForGroup = " where l.group_id = ? and l.client_id is null and g.is_active = true order by l.account_no ASC"; + final String guarantorWhereClauseForMembers = " where l.group_id = ? and l.client_id is not null and g.is_active = true order by l.account_no ASC"; final List glimAccounts = retrieveLoanAccountDetails(loanWhereClauseForGroupAndLoanType, new Object[] { groupId }); @@ -345,9 +345,9 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou accountsSummary.append("avbu.firstname as activatedByFirstname, avbu.lastname as activatedByLastname,"); accountsSummary.append("sa.sub_status_enum as subStatusEnum, "); - accountsSummary.append("(select IFNULL(max(sat.transaction_date),sa.activatedon_date) "); + accountsSummary.append("(select coalesce(max(sat.transaction_date),sa.activatedon_date) "); accountsSummary.append("from m_savings_account_transaction as sat "); - accountsSummary.append("where sat.is_reversed = 0 "); + accountsSummary.append("where sat.is_reversed = false "); accountsSummary.append("and sat.transaction_type_enum in (1,2) "); accountsSummary.append("and sat.savings_account_id = sa.id) as lastActiveTransactionDate, "); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java index cf9ab4e5a..116987fcd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java @@ -425,7 +425,8 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService public Collection retrieveSavingsProductCharges(final Long savingsProductId) { final ChargeMapper rm = new ChargeMapper(); - String sql = "select " + rm.savingsProductChargeSchema() + " where c.is_deleted=0 and c.is_active=1 and spc.savings_product_id=? "; + String sql = "select " + rm.savingsProductChargeSchema() + + " where c.is_deleted=false and c.is_active=true and spc.savings_product_id=? "; sql += addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled(); return this.jdbcTemplate.query(sql, rm, new Object[] { savingsProductId }); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java index e11d44a72..29fcdefdf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java @@ -273,29 +273,25 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP } private boolean isAnyLoansAssociateWithThisCharge(final Long chargeId) { - - final String sql = "select if((exists (select 1 from m_loan_charge lc where lc.charge_id = ? and lc.is_active = 1)) = 1, 'true', 'false')"; + final String sql = "select (CASE WHEN exists (select 1 from m_loan_charge lc where lc.charge_id = ? and lc.is_active = true) THEN 'true' ELSE 'false' END)"; final String isLoansUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); return Boolean.valueOf(isLoansUsingCharge); } private boolean isAnySavingsAssociateWithThisCharge(final Long chargeId) { - - final String sql = "select if((exists (select 1 from m_savings_account_charge sc where sc.charge_id = ? and sc.is_active = 1)) = 1, 'true', 'false')"; + final String sql = "select (CASE WHEN exists (select 1 from m_savings_account_charge sc where sc.charge_id = ? and sc.is_active = true) THEN 'true' ELSE 'false' END)"; final String isSavingsUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); return Boolean.valueOf(isSavingsUsingCharge); } private boolean isAnyLoanProductsAssociateWithThisCharge(final Long chargeId) { - - final String sql = "select if((exists (select 1 from m_product_loan_charge lc where lc.charge_id = ?)) = 1, 'true', 'false')"; + final String sql = "select (CASE WHEN exists (select 1 from m_product_loan_charge lc where lc.charge_id = ?) THEN 'true' ELSE 'false' END)"; final String isLoansUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); return Boolean.valueOf(isLoansUsingCharge); } private boolean isAnySavingsProductsAssociateWithThisCharge(final Long chargeId) { - - final String sql = "select if((exists (select 1 from m_savings_product_charge sc where sc.charge_id = ?)) = 1, 'true', 'false')"; + final String sql = "select (CASE WHEN (exists (select 1 from m_savings_product_charge sc where sc.charge_id = ?)) = 1 THEN 'true' ELSE 'false' END)"; final String isSavingsUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); return Boolean.valueOf(isSavingsUsingCharge); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/exception/ClientMustBePendingToBeDeletedException.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/exception/ClientMustBePendingToBeDeletedException.java index e453f5289..811372700 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/exception/ClientMustBePendingToBeDeletedException.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/exception/ClientMustBePendingToBeDeletedException.java @@ -26,7 +26,7 @@ import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainR public class ClientMustBePendingToBeDeletedException extends AbstractPlatformDomainRuleException { public ClientMustBePendingToBeDeletedException(final Long id) { - super("error.msg.clients.cannot.be.deleted", "Client with identifier " + id + " cannot be deleted as it is not in `Pending` state.", + super("error.msg.clients.cannot.be.deleted", "Client with identifier " + id + " cannot be deleted as it is not in Pending state.", id); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeReadPlatformServiceImpl.java index 16a772bc5..abd069aed 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeReadPlatformServiceImpl.java @@ -154,6 +154,7 @@ public class ClientChargeReadPlatformServiceImpl implements ClientChargeReadPlat sqlBuilder.append(" order by cc.charge_time_enum ASC, cc.charge_due_date DESC, cc.is_penalty ASC "); // apply limit and offsets + if (searchParameters.isLimited()) { sqlBuilder.append(" limit ").append(searchParameters.getLimit()); if (searchParameters.isOffset()) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTReadPlatformServiceImpl.java index fd9b8c762..dc8e44e73 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/self/account/service/SelfBeneficiariesTPTReadPlatformServiceImpl.java @@ -184,7 +184,7 @@ public class SelfBeneficiariesTPTReadPlatformServiceImpl implements SelfBenefici sqlBuilder.append(" where b.app_user_id = ? "); sqlBuilder.append(" and b.account_id = ? "); sqlBuilder.append(" and b.account_type = ? "); - sqlBuilder.append(" and b.is_active = 1; "); + sqlBuilder.append(" and b.is_active = true; "); return this.jdbcTemplate.queryForObject(sqlBuilder.toString(), Long.class, appUserId, accountId, accountType); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java index 434a9b8f2..0ffec88cf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/scheduledjobs/service/ScheduledJobRunnerServiceImpl.java @@ -38,6 +38,7 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.RoutingDataSourceServiceFactory; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; +import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetail; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetailRepository; @@ -82,6 +83,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService private final JobRegisterService jobRegisterService; private final ScheduledJobDetailRepository scheduledJobDetailsRepository; private final FineractProperties fineractProperties; + private final DatabaseTypeResolver databaseTypeResolver; @Autowired public ScheduledJobRunnerServiceImpl(final RoutingDataSourceServiceFactory dataSourceServiceFactory, @@ -92,7 +94,8 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService final ShareAccountDividendReadPlatformService shareAccountDividendReadPlatformService, final ShareAccountSchedularService shareAccountSchedularService, final TrialBalanceRepositoryWrapper trialBalanceRepositoryWrapper, @Lazy final JobRegisterService jobRegisterService, - final ScheduledJobDetailRepository scheduledJobDetailsRepository, final FineractProperties fineractProperties) { + final ScheduledJobDetailRepository scheduledJobDetailsRepository, final FineractProperties fineractProperties, + DatabaseTypeResolver databaseTypeResolver) { this.dataSourceServiceFactory = dataSourceServiceFactory; this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; this.savingsAccountChargeReadPlatformService = savingsAccountChargeReadPlatformService; @@ -104,6 +107,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService this.jobRegisterService = jobRegisterService; this.scheduledJobDetailsRepository = scheduledJobDetailsRepository; this.fineractProperties = fineractProperties; + this.databaseTypeResolver = databaseTypeResolver; } @Transactional @@ -113,77 +117,80 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService final JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSourceServiceFactory.determineDataSourceService().retrieveDataSource()); - final StringBuilder updateSqlBuilder = new StringBuilder(900); - updateSqlBuilder.append("update m_loan "); - updateSqlBuilder.append("join ("); - updateSqlBuilder.append("SELECT ml.id AS loanId,"); - updateSqlBuilder.append("SUM(mr.principal_amount) as principal_disbursed_derived, "); - updateSqlBuilder.append("SUM(IFNULL(mr.principal_completed_derived,0)) as principal_repaid_derived, "); - updateSqlBuilder.append("SUM(IFNULL(mr.principal_writtenoff_derived,0)) as principal_writtenoff_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.interest_amount,0)) as interest_charged_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.interest_completed_derived,0)) as interest_repaid_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.interest_waived_derived,0)) as interest_waived_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.interest_writtenoff_derived,0)) as interest_writtenoff_derived,"); - updateSqlBuilder.append( - "SUM(IFNULL(mr.fee_charges_amount,0)) + IFNULL((select SUM(lc.amount) from m_loan_charge lc where lc.loan_id=ml.id and lc.is_active=1 and lc.charge_time_enum=1),0) as fee_charges_charged_derived,"); - updateSqlBuilder.append( - "SUM(IFNULL(mr.fee_charges_completed_derived,0)) + IFNULL((select SUM(lc.amount_paid_derived) from m_loan_charge lc where lc.loan_id=ml.id and lc.is_active=1 and lc.charge_time_enum=1),0) as fee_charges_repaid_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_waived_derived,0)) as fee_charges_waived_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.fee_charges_writtenoff_derived,0)) as fee_charges_writtenoff_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.penalty_charges_amount,0)) as penalty_charges_charged_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.penalty_charges_completed_derived,0)) as penalty_charges_repaid_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.penalty_charges_waived_derived,0)) as penalty_charges_waived_derived,"); - updateSqlBuilder.append("SUM(IFNULL(mr.penalty_charges_writtenoff_derived,0)) as penalty_charges_writtenoff_derived "); - updateSqlBuilder.append(" FROM m_loan ml "); - updateSqlBuilder.append("INNER JOIN m_loan_repayment_schedule mr on mr.loan_id = ml.id "); - updateSqlBuilder.append("WHERE ml.disbursedon_date is not null "); - updateSqlBuilder.append("GROUP BY ml.id "); - updateSqlBuilder.append(") x on x.loanId = m_loan.id "); + boolean isMySQL = databaseTypeResolver.isMySQL(); - updateSqlBuilder.append("SET m_loan.principal_disbursed_derived = x.principal_disbursed_derived,"); - updateSqlBuilder.append("m_loan.principal_repaid_derived = x.principal_repaid_derived,"); - updateSqlBuilder.append("m_loan.principal_writtenoff_derived = x.principal_writtenoff_derived,"); - updateSqlBuilder.append( - "m_loan.principal_outstanding_derived = (x.principal_disbursed_derived - (x.principal_repaid_derived + x.principal_writtenoff_derived)),"); - updateSqlBuilder.append("m_loan.interest_charged_derived = x.interest_charged_derived,"); - updateSqlBuilder.append("m_loan.interest_repaid_derived = x.interest_repaid_derived,"); - updateSqlBuilder.append("m_loan.interest_waived_derived = x.interest_waived_derived,"); - updateSqlBuilder.append("m_loan.interest_writtenoff_derived = x.interest_writtenoff_derived,"); - updateSqlBuilder.append( - "m_loan.interest_outstanding_derived = (x.interest_charged_derived - (x.interest_repaid_derived + x.interest_waived_derived + x.interest_writtenoff_derived)),"); - updateSqlBuilder.append("m_loan.fee_charges_charged_derived = x.fee_charges_charged_derived,"); - updateSqlBuilder.append("m_loan.fee_charges_repaid_derived = x.fee_charges_repaid_derived,"); - updateSqlBuilder.append("m_loan.fee_charges_waived_derived = x.fee_charges_waived_derived,"); - updateSqlBuilder.append("m_loan.fee_charges_writtenoff_derived = x.fee_charges_writtenoff_derived,"); - updateSqlBuilder.append( - "m_loan.fee_charges_outstanding_derived = (x.fee_charges_charged_derived - (x.fee_charges_repaid_derived + x.fee_charges_waived_derived + x.fee_charges_writtenoff_derived)),"); - updateSqlBuilder.append("m_loan.penalty_charges_charged_derived = x.penalty_charges_charged_derived,"); - updateSqlBuilder.append("m_loan.penalty_charges_repaid_derived = x.penalty_charges_repaid_derived,"); - updateSqlBuilder.append("m_loan.penalty_charges_waived_derived = x.penalty_charges_waived_derived,"); - updateSqlBuilder.append("m_loan.penalty_charges_writtenoff_derived = x.penalty_charges_writtenoff_derived,"); - updateSqlBuilder.append( - "m_loan.penalty_charges_outstanding_derived = (x.penalty_charges_charged_derived - (x.penalty_charges_repaid_derived + x.penalty_charges_waived_derived + x.penalty_charges_writtenoff_derived)),"); - updateSqlBuilder.append( - "m_loan.total_expected_repayment_derived = (x.principal_disbursed_derived + x.interest_charged_derived + x.fee_charges_charged_derived + x.penalty_charges_charged_derived),"); - updateSqlBuilder.append( - "m_loan.total_repayment_derived = (x.principal_repaid_derived + x.interest_repaid_derived + x.fee_charges_repaid_derived + x.penalty_charges_repaid_derived),"); - updateSqlBuilder.append( - "m_loan.total_expected_costofloan_derived = (x.interest_charged_derived + x.fee_charges_charged_derived + x.penalty_charges_charged_derived),"); - updateSqlBuilder.append( - "m_loan.total_costofloan_derived = (x.interest_repaid_derived + x.fee_charges_repaid_derived + x.penalty_charges_repaid_derived),"); - updateSqlBuilder.append( - "m_loan.total_waived_derived = (x.interest_waived_derived + x.fee_charges_waived_derived + x.penalty_charges_waived_derived),"); - updateSqlBuilder.append( - "m_loan.total_writtenoff_derived = (x.interest_writtenoff_derived + x.fee_charges_writtenoff_derived + x.penalty_charges_writtenoff_derived),"); - updateSqlBuilder.append("m_loan.total_outstanding_derived="); - updateSqlBuilder.append(" (x.principal_disbursed_derived - (x.principal_repaid_derived + x.principal_writtenoff_derived)) + "); - updateSqlBuilder.append( - " (x.interest_charged_derived - (x.interest_repaid_derived + x.interest_waived_derived + x.interest_writtenoff_derived)) +"); - updateSqlBuilder.append( - " (x.fee_charges_charged_derived - (x.fee_charges_repaid_derived + x.fee_charges_waived_derived + x.fee_charges_writtenoff_derived)) +"); - updateSqlBuilder.append( - " (x.penalty_charges_charged_derived - (x.penalty_charges_repaid_derived + x.penalty_charges_waived_derived + x.penalty_charges_writtenoff_derived))"); + String alias = isMySQL ? "l." : ""; + final String selectPart = new StringBuilder().append(" (SELECT ml.id AS loan_id, ") + .append("SUM(mr.principal_amount) as principal_disbursed_derived, ") + .append("SUM(COALESCE(mr.principal_completed_derived,0)) as principal_repaid_derived, ") + .append("SUM(COALESCE(mr.principal_writtenoff_derived,0)) as principal_writtenoff_derived, ") + .append("SUM(COALESCE(mr.interest_amount,0)) as interest_charged_derived, ") + .append("SUM(COALESCE(mr.interest_completed_derived,0)) as interest_repaid_derived, ") + .append("SUM(COALESCE(mr.interest_waived_derived,0)) as interest_waived_derived, ") + .append("SUM(COALESCE(mr.interest_writtenoff_derived,0)) as interest_writtenoff_derived, ") + .append("SUM(COALESCE(mr.fee_charges_amount,0)) + ") + .append("COALESCE((select SUM(lc.amount) from m_loan_charge lc where lc.loan_id = ml.id and lc.is_active = true") + .append(" and lc.charge_time_enum=1),0) as fee_charges_charged_derived, ") + .append("SUM(COALESCE(mr.fee_charges_completed_derived,0)) + ") + .append("COALESCE((select SUM(lc.amount_paid_derived) from m_loan_charge lc where lc.loan_id = ml.id and lc.is_active = true") + .append(" and lc.charge_time_enum = 1), 0) as fee_charges_repaid_derived, ") + .append("SUM(COALESCE(mr.fee_charges_waived_derived,0)) as fee_charges_waived_derived, ") + .append("SUM(COALESCE(mr.fee_charges_writtenoff_derived,0)) as fee_charges_writtenoff_derived, ") + .append("SUM(COALESCE(mr.penalty_charges_amount,0)) as penalty_charges_charged_derived, ") + .append("SUM(COALESCE(mr.penalty_charges_completed_derived,0)) as penalty_charges_repaid_derived, ") + .append("SUM(COALESCE(mr.penalty_charges_waived_derived,0)) as penalty_charges_waived_derived, ") + .append("SUM(COALESCE(mr.penalty_charges_writtenoff_derived,0)) as penalty_charges_writtenoff_derived ") + .append("FROM m_loan ml ").append("INNER JOIN m_loan_repayment_schedule mr on mr.loan_id = ml.id ") + .append("WHERE ml.disbursedon_date is not null ").append("GROUP BY ml.id").append(") x").toString(); + final String setPart = new StringBuilder().append(" SET ").append(alias) + .append("principal_disbursed_derived = x.principal_disbursed_derived, ").append(alias) + .append("principal_repaid_derived = x.principal_repaid_derived, ").append(alias) + .append("principal_writtenoff_derived = x.principal_writtenoff_derived, ").append(alias) + .append("principal_outstanding_derived = (x.principal_disbursed_derived - (x.principal_repaid_derived + x.principal_writtenoff_derived)), ") + .append(alias).append("interest_charged_derived = x.interest_charged_derived, ").append(alias) + .append("interest_repaid_derived = x.interest_repaid_derived, ").append(alias) + .append("interest_waived_derived = x.interest_waived_derived, ").append(alias) + .append("interest_writtenoff_derived = x.interest_writtenoff_derived, ").append(alias) + .append("interest_outstanding_derived = (x.interest_charged_derived - (x.interest_repaid_derived + x.interest_waived_derived + x.interest_writtenoff_derived)), ") + .append(alias).append("fee_charges_charged_derived = x.fee_charges_charged_derived, ").append(alias) + .append("fee_charges_repaid_derived = x.fee_charges_repaid_derived, ").append(alias) + .append("fee_charges_waived_derived = x.fee_charges_waived_derived, ").append(alias) + .append("fee_charges_writtenoff_derived = x.fee_charges_writtenoff_derived, ").append(alias) + .append("fee_charges_outstanding_derived = (x.fee_charges_charged_derived - (x.fee_charges_repaid_derived + x.fee_charges_waived_derived + x.fee_charges_writtenoff_derived)), ") + .append(alias).append("penalty_charges_charged_derived = x.penalty_charges_charged_derived, ").append(alias) + .append("penalty_charges_repaid_derived = x.penalty_charges_repaid_derived, ").append(alias) + .append("penalty_charges_waived_derived = x.penalty_charges_waived_derived, ").append(alias) + .append("penalty_charges_writtenoff_derived = x.penalty_charges_writtenoff_derived, ").append(alias) + .append("penalty_charges_outstanding_derived = (x.penalty_charges_charged_derived - (x.penalty_charges_repaid_derived + x.penalty_charges_waived_derived + x.penalty_charges_writtenoff_derived)), ") + .append(alias) + .append("total_expected_repayment_derived = (x.principal_disbursed_derived + x.interest_charged_derived + x.fee_charges_charged_derived + x.penalty_charges_charged_derived), ") + .append(alias) + .append("total_repayment_derived = (x.principal_repaid_derived + x.interest_repaid_derived + x.fee_charges_repaid_derived + x.penalty_charges_repaid_derived), ") + .append(alias) + .append("total_expected_costofloan_derived = (x.interest_charged_derived + x.fee_charges_charged_derived + x.penalty_charges_charged_derived), ") + .append(alias) + .append("total_costofloan_derived = (x.interest_repaid_derived + x.fee_charges_repaid_derived + x.penalty_charges_repaid_derived), ") + .append(alias) + .append("total_waived_derived = (x.interest_waived_derived + x.fee_charges_waived_derived + x.penalty_charges_waived_derived), ") + .append(alias) + .append("total_writtenoff_derived = (x.interest_writtenoff_derived + x.fee_charges_writtenoff_derived + x.penalty_charges_writtenoff_derived), ") + .append(alias) + .append("total_outstanding_derived = (x.principal_disbursed_derived - (x.principal_repaid_derived + x.principal_writtenoff_derived)) + ") + .append("(x.interest_charged_derived - (x.interest_repaid_derived + x.interest_waived_derived + x.interest_writtenoff_derived)) + ") + .append("(x.fee_charges_charged_derived - (x.fee_charges_repaid_derived + x.fee_charges_waived_derived + x.fee_charges_writtenoff_derived)) + ") + .append("(x.penalty_charges_charged_derived - (x.penalty_charges_repaid_derived + x.penalty_charges_waived_derived + x.penalty_charges_writtenoff_derived))") + .toString(); + + String wherePart = " x.loan_id = l.id"; + + final StringBuilder updateSqlBuilder = new StringBuilder(); + updateSqlBuilder.append("UPDATE m_loan l"); + if (isMySQL) { + updateSqlBuilder.append(" JOIN").append(selectPart).append(" ON").append(wherePart).append(' ').append(setPart); + } else { + updateSqlBuilder.append(setPart).append(" FROM").append(selectPart).append(" WHERE").append(wherePart); + } final int result = jdbcTemplate.update(updateSqlBuilder.toString()); LOG.info("{}: Records affected by updateLoanSummaryDetails: {}", ThreadLocalContextUtil.getTenant().getName(), result); @@ -203,21 +210,21 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService updateSqlBuilder.append( "INSERT INTO m_loan_paid_in_advance(loan_id, principal_in_advance_derived, interest_in_advance_derived, fee_charges_in_advance_derived, penalty_charges_in_advance_derived, total_in_advance_derived)"); updateSqlBuilder.append(" select ml.id as loanId,"); - updateSqlBuilder.append(" SUM(ifnull(mr.principal_completed_derived, 0)) as principal_in_advance_derived,"); - updateSqlBuilder.append(" SUM(ifnull(mr.interest_completed_derived, 0)) as interest_in_advance_derived,"); - updateSqlBuilder.append(" SUM(ifnull(mr.fee_charges_completed_derived, 0)) as fee_charges_in_advance_derived,"); - updateSqlBuilder.append(" SUM(ifnull(mr.penalty_charges_completed_derived, 0)) as penalty_charges_in_advance_derived,"); + updateSqlBuilder.append(" SUM(coalesce(mr.principal_completed_derived, 0)) as principal_in_advance_derived,"); + updateSqlBuilder.append(" SUM(coalesce(mr.interest_completed_derived, 0)) as interest_in_advance_derived,"); + updateSqlBuilder.append(" SUM(coalesce(mr.fee_charges_completed_derived, 0)) as fee_charges_in_advance_derived,"); + updateSqlBuilder.append(" SUM(coalesce(mr.penalty_charges_completed_derived, 0)) as penalty_charges_in_advance_derived,"); updateSqlBuilder.append( - " (SUM(ifnull(mr.principal_completed_derived, 0)) + SUM(ifnull(mr.interest_completed_derived, 0)) + SUM(ifnull(mr.fee_charges_completed_derived, 0)) + SUM(ifnull(mr.penalty_charges_completed_derived, 0))) as total_in_advance_derived"); + " (SUM(coalesce(mr.principal_completed_derived, 0)) + SUM(coalesce(mr.interest_completed_derived, 0)) + SUM(coalesce(mr.fee_charges_completed_derived, 0)) + SUM(coalesce(mr.penalty_charges_completed_derived, 0))) as total_in_advance_derived"); updateSqlBuilder.append(" FROM m_loan ml "); updateSqlBuilder.append(" INNER JOIN m_loan_repayment_schedule mr on mr.loan_id = ml.id "); updateSqlBuilder.append(" WHERE ml.loan_status_id = 300 "); updateSqlBuilder.append(" and mr.duedate >= CURDATE() "); updateSqlBuilder.append(" GROUP BY ml.id"); updateSqlBuilder - .append(" HAVING (SUM(ifnull(mr.principal_completed_derived, 0)) + SUM(ifnull(mr.interest_completed_derived, 0)) +"); - updateSqlBuilder - .append(" SUM(ifnull(mr.fee_charges_completed_derived, 0)) + SUM(ifnull(mr.penalty_charges_completed_derived, 0))) > 0.0"); + .append(" HAVING (SUM(coalesce(mr.principal_completed_derived, 0)) + SUM(coalesce(mr.interest_completed_derived, 0)) +"); + updateSqlBuilder.append( + " SUM(coalesce(mr.fee_charges_completed_derived, 0)) + SUM(coalesce(mr.penalty_charges_completed_derived, 0))) > 0.0"); final int result = jdbcTemplate.update(updateSqlBuilder.toString()); @@ -285,28 +292,35 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService final JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSourceServiceFactory.determineDataSourceService().retrieveDataSource()); - final StringBuilder resetNPASqlBuilder = new StringBuilder(900); + final StringBuilder resetNPASqlBuilder = new StringBuilder(); resetNPASqlBuilder.append("update m_loan loan "); - resetNPASqlBuilder.append("left join m_loan_arrears_aging laa on laa.loan_id = loan.id "); - resetNPASqlBuilder.append("inner join m_product_loan mpl on mpl.id = loan.product_id and mpl.overdue_days_for_npa is not null "); - resetNPASqlBuilder.append("set loan.is_npa = 0 "); - resetNPASqlBuilder.append("where loan.loan_status_id = 300 and mpl.account_moves_out_of_npa_only_on_arrears_completion = 0 "); - resetNPASqlBuilder - .append("or (mpl.account_moves_out_of_npa_only_on_arrears_completion = 1 and laa.overdue_since_date_derived is null)"); + String fromPart = " (SELECT loan2.* FROM m_loan loan2 left join m_loan_arrears_aging laa on laa.loan_id = loan2.id " + + "inner join m_product_loan mpl on mpl.id = loan2.product_id and mpl.overdue_days_for_npa is not null " + + "WHERE loan2.loan_status_id = 300 and mpl.account_moves_out_of_npa_only_on_arrears_completion = false" + + " or (mpl.account_moves_out_of_npa_only_on_arrears_completion = true" + + " and laa.overdue_since_date_derived is null)) sl"; + String wherePart = " where loan.id = sl.id "; + if (databaseTypeResolver.isMySQL()) { + resetNPASqlBuilder.append(", ").append(fromPart).append(" set loan.is_npa = false").append(wherePart); + } else { + resetNPASqlBuilder.append("set is_npa = false").append(" FROM ").append(fromPart).append(wherePart); + } jdbcTemplate.update(resetNPASqlBuilder.toString()); final StringBuilder updateSqlBuilder = new StringBuilder(900); - updateSqlBuilder.append("UPDATE m_loan as ml,"); - updateSqlBuilder.append(" (select loan.id "); - updateSqlBuilder.append("from m_loan_arrears_aging laa"); - updateSqlBuilder.append(" INNER JOIN m_loan loan on laa.loan_id = loan.id "); - updateSqlBuilder.append(" INNER JOIN m_product_loan mpl on mpl.id = loan.product_id AND mpl.overdue_days_for_npa is not null "); - updateSqlBuilder.append("WHERE loan.loan_status_id = 300 and "); - updateSqlBuilder.append("laa.overdue_since_date_derived < SUBDATE(CURDATE(),INTERVAL ifnull(mpl.overdue_days_for_npa,0) day) "); - updateSqlBuilder.append("group by loan.id) as sl "); - updateSqlBuilder.append("SET ml.is_npa=1 where ml.id=sl.id "); + fromPart = " (select loan.id " + " FROM m_loan_arrears_aging laa" + " INNER JOIN m_loan loan on laa.loan_id = loan.id " + + " INNER JOIN m_product_loan mpl on mpl.id = loan.product_id AND mpl.overdue_days_for_npa is not null " + + "WHERE loan.loan_status_id = 300 and " + "laa.overdue_since_date_derived < " + + "SUBDATE(CURDATE(),INTERVAL COALESCE(mpl.overdue_days_for_npa, 0) day)" + " group by loan.id) as sl "; + wherePart = " where ml.id=sl.id "; + updateSqlBuilder.append("UPDATE m_loan as ml "); + if (databaseTypeResolver.isMySQL()) { + updateSqlBuilder.append(", ").append(fromPart).append(" SET ml.is_npa = true").append(wherePart); + } else { + updateSqlBuilder.append(" SET is_npa = true").append(" FROM ").append(fromPart).append(wherePart); + } final int result = jdbcTemplate.update(updateSqlBuilder.toString()); @@ -343,7 +357,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService public void generateRDSchedule() { final JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSourceServiceFactory.determineDataSourceService().retrieveDataSource()); final Collection> scheduleDetails = this.depositAccountReadPlatformService.retriveDataForRDScheduleCreation(); - String insertSql = "INSERT INTO `m_mandatory_savings_schedule` (`savings_account_id`, `duedate`, `installment`, `deposit_amount`, `completed_derived`, `created_date`, `lastmodified_date`) VALUES "; + String insertSql = "INSERT INTO m_mandatory_savings_schedule (savings_account_id, duedate, installment, deposit_amount, completed_derived, created_date, lastmodified_date) VALUES "; StringBuilder sb = new StringBuilder(); String currentDate = formatterWithTime.format(DateUtils.getLocalDateTimeOfTenant()); int iterations = 0; @@ -437,7 +451,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService final JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSourceServiceFactory.determineDataSourceService().retrieveDataSource()); final StringBuilder tbGapSqlBuilder = new StringBuilder(500); tbGapSqlBuilder.append("select distinct(je.transaction_date) ").append("from acc_gl_journal_entry je ") - .append("where je.transaction_date > (select IFNULL(MAX(created_date),'2010-01-01') from m_trial_balance)"); + .append("where je.transaction_date > (select coalesce(MAX(created_date),'2010-01-01') from m_trial_balance)"); final List tbGaps = jdbcTemplate.queryForList(tbGapSqlBuilder.toString(), Date.class); @@ -450,7 +464,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService final String formattedDate = new SimpleDateFormat("yyyy-MM-dd").format(tbGap); final StringBuilder sqlBuilder = new StringBuilder(600); sqlBuilder.append("Insert Into m_trial_balance(office_id, account_id, Amount, entry_date, created_date,closing_balance) ") - .append("Select je.office_id, je.account_id, sum(if(je.type_enum=1, (-1) * je.amount, je.amount)) ") + .append("Select je.office_id, je.account_id, SUM(CASE WHEN je.type_enum=1 THEN (-1) * je.amount ELSE je.amount END) ") .append("as Amount, Date(je.entry_date) as 'Entry_Date', je.transaction_date as 'Created_Date',sum(je.amount) as closing_balance ") .append("from acc_gl_journal_entry je WHERE je.transaction_date = ? ") .append("group by je.account_id, je.office_id, je.transaction_date, Date(je.entry_date)");