diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/serialization/AccrualAccountingDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/serialization/AccrualAccountingDataValidator.java index f527ebecf..65c527535 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/serialization/AccrualAccountingDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/serialization/AccrualAccountingDataValidator.java @@ -69,7 +69,7 @@ public final class AccrualAccountingDataValidator { .resource(PERIODIC_ACCRUAL_ACCOUNTING_RESOURCE_NAME); final LocalDate date = this.fromApiJsonHelper.extractLocalDateNamed(accrueTillParamName, element); - baseDataValidator.reset().parameter(accrueTillParamName).value(date).notNull().validateDateBefore(DateUtils.getLocalDateOfTenant()); + baseDataValidator.reset().parameter(accrueTillParamName).value(date).notNull().validateDateBefore(DateUtils.getBusinessLocalDate()); throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java index f566915a6..ee85dde8e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/service/GLClosureWritePlatformServiceJpaRepositoryImpl.java @@ -67,7 +67,7 @@ public class GLClosureWritePlatformServiceJpaRepositoryImpl implements GLClosure final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); // TODO: Get Tenant specific date // ensure closure date is not in the future - final Date todaysDate = new Date(); + final Date todaysDate = DateUtils.getBusinessDate(); final Date closureDate = command.dateValueOfParameterNamed(GLClosureJsonInputParams.CLOSING_DATE.getValue()); if (closureDate.after(todaysDate)) { throw new GLClosureInvalidException(GlClosureInvalidReason.FUTURE_DATE, closureDate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java index 68877e53e..8f416831d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java @@ -427,7 +427,7 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat } } - final LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transactionDate = DateUtils.getBusinessLocalDate(); final OfficeOpeningBalancesData officeOpeningBalancesData = OfficeOpeningBalancesData.createNew(officeId, officeData.name(), transactionDate, contraAccount, assetAccountOpeningBalances, liabityAccountOpeningBalances, incomeAccountOpeningBalances, diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java index 34f627e5e..fdebe070d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java @@ -72,6 +72,7 @@ import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper; @@ -562,7 +563,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa final LocalDate entryLocalDate = command.getTransactionDate(); final Date transactionDate = Date.from(entryLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); // shouldn't be in the future - final Date todaysDate = new Date(); + final Date todaysDate = DateUtils.getBusinessDate(); if (transactionDate.after(todaysDate)) { throw new JournalEntryInvalidException(GlJournalEntryInvalidReason.FUTURE_DATE, transactionDate, null, null); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/serialization/ProvisioningEntriesDefinitionJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/serialization/ProvisioningEntriesDefinitionJsonDeserializer.java index e2bb3b01f..dd2a8ca6d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/serialization/ProvisioningEntriesDefinitionJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/serialization/ProvisioningEntriesDefinitionJsonDeserializer.java @@ -65,7 +65,7 @@ public class ProvisioningEntriesDefinitionJsonDeserializer implements Provisioni baseDataValidator.reset().parameter(JSON_DATEFORMAT_PARAM).value(dateformat).notBlank(); LocalDate localDate = this.fromApiJsonHelper.extractLocalDateNamed(JSON_DATE_PARAM, element); baseDataValidator.reset().parameter(JSON_DATE_PARAM).value(localDate).notBlank(); - baseDataValidator.reset().parameter(JSON_DATE_PARAM).value(localDate).validateDateBeforeOrEqual(DateUtils.getLocalDateOfTenant()); + baseDataValidator.reset().parameter(JSON_DATE_PARAM).value(localDate).validateDateBeforeOrEqual(DateUtils.getBusinessLocalDate()); if (this.fromApiJsonHelper.parameterExists(JSON_CREATEJOURNALENTRIES_PARAM, element)) { Boolean bool = this.fromApiJsonHelper.extractBooleanNamed(JSON_CREATEJOURNALENTRIES_PARAM, element); baseDataValidator.reset().parameter(JSON_CREATEJOURNALENTRIES_PARAM).value(bool).validateForBooleanValue(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java index 3ccc39281..a54e80892 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/service/ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl.java @@ -135,7 +135,7 @@ public class ProvisioningEntriesWritePlatformServiceJpaRepositoryImpl implements @Override @CronTarget(jobName = JobName.GENERATE_LOANLOSS_PROVISIONING) public void generateLoanLossProvisioningAmount() { - Date currentDate = Date.from(DateUtils.getLocalDateOfTenant().atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date currentDate = DateUtils.getBusinessDate(); boolean addJournalEntries = true; try { Collection criteriaCollection = this.provisioningCriteriaReadPlatformService diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java index f2a81e238..a9e4688bf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java @@ -22,33 +22,27 @@ import java.time.LocalDate; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Collection; -import java.util.Date; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.fineract.adhocquery.data.AdHocData; import org.apache.fineract.adhocquery.domain.ReportRunFrequency; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; +import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service(value = "adHocScheduledJobRunnerService") +@RequiredArgsConstructor +@Slf4j public class AdHocScheduledJobRunnerServiceImpl implements AdHocScheduledJobRunnerService { - private static final Logger LOG = LoggerFactory.getLogger(AdHocScheduledJobRunnerServiceImpl.class); private final AdHocReadPlatformService adHocReadPlatformService; private final JdbcTemplate jdbcTemplate; - - @Autowired - public AdHocScheduledJobRunnerServiceImpl(final JdbcTemplate jdbcTemplate, final AdHocReadPlatformService adHocReadPlatformService) { - this.jdbcTemplate = jdbcTemplate; - this.adHocReadPlatformService = adHocReadPlatformService; - - } + private final DatabaseSpecificSQLGenerator sqlGenerator; @Transactional @Override @@ -99,18 +93,19 @@ public class AdHocScheduledJobRunnerServiceImpl implements AdHocScheduledJobRunn .append(adhoc.getQuery()); if (insertSqlBuilder.length() > 0) { final int result = this.jdbcTemplate.update(insertSqlBuilder.toString()); - LOG.info("{}: Records affected by generateClientSchedule: {}", ThreadLocalContextUtil.getTenant().getName(), + log.info("{}: Records affected by generateClientSchedule: {}", ThreadLocalContextUtil.getTenant().getName(), result); - this.jdbcTemplate.update("UPDATE m_adhoc SET last_run=? WHERE id=?", new Date(), adhoc.getId()); + this.jdbcTemplate.update("UPDATE m_adhoc SET last_run=? WHERE id=?", DateUtils.getLocalDateTimeOfTenant(), + adhoc.getId()); } } else { - LOG.info("{}: Skipping execution of {}, scheduled for execution on {}", + log.info("{}: Skipping execution of {}, scheduled for execution on {}", new Object[] { ThreadLocalContextUtil.getTenant().getName(), adhoc.getName(), next }); } }); } else { - LOG.info("{}: Nothing to update by generateClientSchedule", ThreadLocalContextUtil.getTenant().getName()); + log.info("{}: Nothing to update by generateClientSchedule", ThreadLocalContextUtil.getTenant().getName()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java b/fineract-provider/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java index e577653b8..016d7ac1f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/service/SynchronousCommandProcessingService.java @@ -222,15 +222,15 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer private void publishEvent(final String entityName, final String actionName, JsonCommand command, final Object result) { Gson gson = new Gson(); try { - final String authToken = ThreadLocalContextUtil.getAuthToken(); - final String tenantIdentifier = ThreadLocalContextUtil.getTenant().getTenantIdentifier(); final AppUser appUser = this.context.authenticatedUser(CommandWrapper.wrap(actionName, entityName, null, null)); final HookEventSource hookEventSource = new HookEventSource(entityName, actionName); // TODO: Add support for publishing array events if (command.json() != null && command.json().startsWith("{")) { - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() { + + }.getType(); Map myMap = gson.fromJson(command.json(), type); Map reqmap = new HashMap<>(); @@ -264,7 +264,8 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer final String serializedResult = this.toApiResultJsonSerializer.serialize(reqmap); - final HookEvent applicationEvent = new HookEvent(hookEventSource, serializedResult, tenantIdentifier, appUser, authToken); + final HookEvent applicationEvent = new HookEvent(hookEventSource, serializedResult, appUser, + ThreadLocalContextUtil.getContext()); applicationContext.publishEvent(applicationEvent); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/BulkImportEvent.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/BulkImportEvent.java index 4996dddde..95f7e9c0c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/BulkImportEvent.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/BulkImportEvent.java @@ -18,12 +18,11 @@ */ package org.apache.fineract.infrastructure.bulkimport.data; +import org.apache.fineract.infrastructure.core.domain.FineractContext; +import org.apache.fineract.infrastructure.core.domain.FineractEvent; import org.apache.poi.ss.usermodel.Workbook; -import org.springframework.context.ApplicationEvent; -public final class BulkImportEvent extends ApplicationEvent { - - private final String tenantIdentifier; +public final class BulkImportEvent extends FineractEvent { private final Workbook workbook; @@ -33,23 +32,18 @@ public final class BulkImportEvent extends ApplicationEvent { private final String dateFormat; - private BulkImportEvent(final String tenantIdentifier, final Workbook workbook, final Long importId, final String locale, - final String dateFormat) { - super(BulkImportEvent.class); - this.tenantIdentifier = tenantIdentifier; + private BulkImportEvent(final Object source, final Workbook workbook, final Long importId, final String locale, final String dateFormat, + FineractContext context) { + super(source, context); this.workbook = workbook; this.importId = importId; this.locale = locale; this.dateFormat = dateFormat; } - public static BulkImportEvent instance(final String tenantIdentifier, final Workbook workbook, final Long importId, final String locale, - final String dateFormat) { - return new BulkImportEvent(tenantIdentifier, workbook, importId, locale, dateFormat); - } - - public String getTenantIdentifier() { - return tenantIdentifier; + public static BulkImportEvent instance(final Object source, final Workbook workbook, final Long importId, final String locale, + final String dateFormat, FineractContext context) { + return new BulkImportEvent(source, workbook, importId, locale, dateFormat, context); } public Workbook getWorkbook() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java index fa9391086..3e936f38f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/chartofaccounts/ChartOfAccountsImportHandler.java @@ -21,7 +21,6 @@ package org.apache.fineract.infrastructure.bulkimport.importhandler.chartofaccou import com.google.gson.GsonBuilder; import java.math.BigDecimal; import java.time.LocalDate; -import java.time.ZoneId; import java.util.ArrayList; import java.util.List; import org.apache.fineract.accounting.glaccount.data.GLAccountData; @@ -47,6 +46,7 @@ import org.apache.fineract.infrastructure.codes.data.CodeValueData; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; +import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.IndexedColors; @@ -234,10 +234,7 @@ public class ChartOfAccountsImportHandler implements ImportHandler { // for opening balance private JournalEntryData readAddJournalEntries(Row row, String locale, String dateFormat) { - LocalDate transactionDateCheck = LocalDate.now(ZoneId.systemDefault()); - if (transactionDateCheck != null) { - transactionDate = transactionDateCheck; - } + transactionDate = DateUtils.getBusinessLocalDate(); String officeName = ImportHandlerUtils.readAsString(ChartOfAcountsConstants.OFFICE_COL, row); Long officeId = ImportHandlerUtils.readAsLong(ChartOfAcountsConstants.OFFICE_COL_ID, row); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/SharedProductsSheetPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/SharedProductsSheetPopulator.java index 166db87b0..dd53d6298 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/SharedProductsSheetPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/SharedProductsSheetPopulator.java @@ -99,7 +99,7 @@ public class SharedProductsSheetPopulator extends AbstractWorkbookPopulator { BigDecimal marketValue = shareProductData.getUnitPrice(); Collection marketDataSet = shareProductData.getMarketPrice(); if (marketDataSet != null && !marketDataSet.isEmpty()) { - Date currentDate = DateUtils.getDateOfTenant(); + Date currentDate = DateUtils.getBusinessDate(); for (ShareProductMarketPriceData data : marketDataSet) { Date futureDate = data.getStartDate(); if (currentDate.after(futureDate)) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java index 0332a503f..595834b13 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java @@ -30,7 +30,6 @@ import org.apache.fineract.infrastructure.bulkimport.data.GlobalEntityType; import org.apache.fineract.infrastructure.bulkimport.domain.ImportDocument; import org.apache.fineract.infrastructure.bulkimport.domain.ImportDocumentRepository; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; @@ -66,10 +65,7 @@ public class BulkImportEventListener implements ApplicationListener findAll(); BusinessDateData findByType(String type); + + HashMap getBusinessDates(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateReadPlatformServiceImpl.java index 455a529ca..62494a82a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateReadPlatformServiceImpl.java @@ -18,6 +18,9 @@ */ package org.apache.fineract.infrastructure.businessdate.service; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.HashMap; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -28,6 +31,8 @@ import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateReposi import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.businessdate.exception.BusinessDateNotFoundException; import org.apache.fineract.infrastructure.businessdate.mapper.BusinessDateMapper; +import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; +import org.apache.fineract.infrastructure.core.service.DateUtils; import org.springframework.stereotype.Service; @Slf4j @@ -37,6 +42,7 @@ public class BusinessDateReadPlatformServiceImpl implements BusinessDateReadPlat private final BusinessDateRepository repository; private final BusinessDateMapper mapper; + private final ConfigurationDomainService configurationDomainService; @Override public List findAll() { @@ -60,4 +66,20 @@ public class BusinessDateReadPlatformServiceImpl implements BusinessDateReadPlat } return mapper.map(businessDate.get()); } + + @Override + public HashMap getBusinessDates() { + HashMap businessDateMap = new HashMap<>(); + ZoneId zone = DateUtils.getDateTimeZoneOfTenant(); + LocalDate tenantDate = LocalDate.now(zone); + businessDateMap.put(BusinessDateType.BUSINESS_DATE, tenantDate); + if (configurationDomainService.isBusinessDateEnabled()) { + final List businessDateDataList = this.findAll(); + for (BusinessDateData businessDateData : businessDateDataList) { + businessDateMap.put(BusinessDateType.valueOf(businessDateData.getType()), businessDateData.getDate()); + } + } + + return businessDateMap; + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceImpl.java index 0a02df061..374ff3f65 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceImpl.java @@ -95,6 +95,7 @@ public class BusinessDateWritePlatformServiceImpl implements BusinessDateWritePl List exceptions = new ArrayList<>(); Map changes = new HashMap<>(); Optional businessDateEntity = repository.findByType(businessDateType); + LocalDate businessDate = businessDateEntity.map(BusinessDate::getDate).orElse(DateUtils.getLocalDateOfTenant()); businessDate = businessDate.plusDays(1); try { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailCampaign.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailCampaign.java index 5ac15dec2..495e317ca 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailCampaign.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailCampaign.java @@ -185,7 +185,7 @@ public class EmailCampaign extends AbstractPersistableCustom { } else { emailAttachmentFileFormat = ScheduledEmailAttachmentFileFormat.instance(2); } - LocalDate submittedOnDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate submittedOnDate = DateUtils.getBusinessLocalDate(); if (command.hasParameter(EmailCampaignValidator.submittedOnDateParamName)) { submittedOnDate = command.localDateValueOfParameterNamed(EmailCampaignValidator.submittedOnDateParamName); } @@ -474,7 +474,7 @@ public class EmailCampaign extends AbstractPersistableCustom { } private boolean isDateInTheFuture(final LocalDate localDate) { - return localDate.isAfter(DateUtils.getLocalDateOfTenant()); + return localDate.isAfter(DateUtils.getBusinessLocalDate()); } public Report getBusinessRuleId() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailMessage.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailMessage.java index da0652114..7a611876e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailMessage.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/domain/EmailMessage.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.campaigns.email.domain; -import java.time.LocalDate; -import java.time.ZoneId; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; @@ -109,8 +107,7 @@ public class EmailMessage extends AbstractPersistableCustom { this.emailSubject = emailSubject; this.message = message; this.campaignName = campaignName; - this.submittedOnDate = Date - .from(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()).atStartOfDay(ZoneId.systemDefault()).toInstant()); + this.submittedOnDate = DateUtils.getBusinessDate(); } public Map update(final JsonCommand command) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java index b997b536f..b2261e4e5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java @@ -170,7 +170,7 @@ public class SmsCampaign extends AbstractPersistableCustom { final String paramValue = command.jsonFragment(SmsCampaignValidator.paramValue); final String message = command.stringValueOfParameterNamed(SmsCampaignValidator.message); - LocalDate submittedOnDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate submittedOnDate = DateUtils.getBusinessLocalDate(); if (command.hasParameter(SmsCampaignValidator.submittedOnDateParamName)) { submittedOnDate = command.localDateValueOfParameterNamed(SmsCampaignValidator.submittedOnDateParamName); } @@ -484,7 +484,7 @@ public class SmsCampaign extends AbstractPersistableCustom { } private boolean isDateInTheFuture(final LocalDate localDate) { - return localDate.isAfter(DateUtils.getLocalDateOfTenant()); + return localDate.isAfter(DateUtils.getBusinessLocalDate()); } public Report getBusinessRuleId() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java new file mode 100644 index 000000000..b9a66acec --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/api/LocalDateTimeAdapter.java @@ -0,0 +1,51 @@ +/** + * 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.core.api; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.temporal.ChronoField; + +/** + * Serializer for Java Local Date Time {@link LocalDateTime} that returns the date in array format to match previous + * Jackson functionality. + */ +public class LocalDateTimeAdapter implements JsonSerializer { + + @Override + @SuppressWarnings("unused") + public JsonElement serialize(final LocalDateTime src, final Type typeOfSrc, final JsonSerializationContext context) { + JsonArray array = null; + if (src != null) { + array = new JsonArray(); + array.add(new JsonPrimitive(src.get(ChronoField.YEAR_OF_ERA))); + array.add(new JsonPrimitive(src.getMonthValue())); + array.add(new JsonPrimitive(src.getDayOfMonth())); + array.add(new JsonPrimitive(src.getHour())); + array.add(new JsonPrimitive(src.getMinute())); + array.add(new JsonPrimitive(src.getSecond())); + } + return array; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java index 5cbe6f4a8..f21048c50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java @@ -1092,7 +1092,7 @@ public class DataValidatorBuilder { final StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(this.resource).append(".") .append(this.parameter).append(".is.greater.than.date"); final StringBuilder defaultEnglishMessage = new StringBuilder("The parameter `").append(this.parameter) - .append("` must be less than or equal to the provided date").append(date); + .append("` must be less than or equal to the provided date: ").append(date); final ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), this.parameter, dateVal, date); this.dataValidationErrors.add(error); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ActionContext.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ActionContext.java new file mode 100644 index 000000000..595fd3ce2 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ActionContext.java @@ -0,0 +1,34 @@ +/** + * 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.core.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; + +@Getter +@AllArgsConstructor +public enum ActionContext { + + DEFAULT(0, "Default context", BusinessDateType.BUSINESS_DATE), COB(1, "Close of Business context", BusinessDateType.COB_DATE); + + private final int order; + private final String description; + private final BusinessDateType businessDateType; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ContextHolder.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ContextHolder.java new file mode 100644 index 000000000..27654234c --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/ContextHolder.java @@ -0,0 +1,24 @@ +/** + * 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.core.domain; + +public interface ContextHolder { + + FineractContext getContext(); +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractContext.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractContext.java new file mode 100644 index 000000000..76736fbfe --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractContext.java @@ -0,0 +1,37 @@ +/** + * 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.core.domain; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.HashMap; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; + +@AllArgsConstructor +@Getter +public class FineractContext implements Serializable { + + private final String contextHolder; + private final FineractPlatformTenant tenantContext; + private final String authTokenContext; + private final HashMap businessDateContext; + private final ActionContext actionContext; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractEvent.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractEvent.java new file mode 100644 index 000000000..41412d7ee --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractEvent.java @@ -0,0 +1,37 @@ +/** + * 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.core.domain; + +import java.io.Serializable; +import org.springframework.context.ApplicationEvent; + +public abstract class FineractEvent extends ApplicationEvent implements ContextHolder, Serializable { + + private final FineractContext context; + + public FineractEvent(Object source, FineractContext context) { + super(source); + this.context = context; + } + + @Override + public FineractContext getContext() { + return context; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenant.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenant.java index 33f089f09..06f3fbc7a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenant.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenant.java @@ -18,7 +18,9 @@ */ package org.apache.fineract.infrastructure.core.domain; -public class FineractPlatformTenant { +import java.io.Serializable; + +public class FineractPlatformTenant implements Serializable { private final Long id; private final String tenantIdentifier; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenantConnection.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenantConnection.java index 015da63cc..1a5cbaec6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenantConnection.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/FineractPlatformTenantConnection.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.infrastructure.core.domain; +import java.io.Serializable; import java.sql.Connection; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; @@ -25,7 +26,7 @@ import org.apache.commons.lang3.StringUtils; /** * Holds Tenant's DB server connection connection details. */ -public class FineractPlatformTenantConnection { +public class FineractPlatformTenantConnection implements Serializable { private final Long connectionId; private final String schemaServer; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/JdbcSupport.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/JdbcSupport.java index 4179d7e17..2d42ef9a7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/JdbcSupport.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/JdbcSupport.java @@ -25,6 +25,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; import java.util.Date; @@ -48,11 +49,11 @@ public final class JdbcSupport { return dateTime; } - public static ZonedDateTime getLocalDateTime(final ResultSet rs, final String columnName) throws SQLException { - ZonedDateTime dateTime = null; + public static LocalDateTime getLocalDateTime(final ResultSet rs, final String columnName) throws SQLException { + LocalDateTime dateTime = null; final Timestamp dateValue = rs.getTimestamp(columnName); if (dateValue != null) { - dateTime = ZonedDateTime.ofInstant(new Date(dateValue.getTime()).toInstant(), getDateTimeZoneOfTenant()); + dateTime = LocalDateTime.ofInstant(new Date(dateValue.getTime()).toInstant(), getDateTimeZoneOfTenant()); } return dateTime; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java index 6c27caaef..87825bca6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/GoogleGsonSerializerHelper.java @@ -22,6 +22,7 @@ import com.google.gson.ExclusionStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; import java.time.MonthDay; import java.time.ZonedDateTime; @@ -32,6 +33,7 @@ import org.apache.fineract.infrastructure.core.api.DateAdapter; import org.apache.fineract.infrastructure.core.api.JodaDateTimeAdapter; import org.apache.fineract.infrastructure.core.api.JodaMonthDayAdapter; import org.apache.fineract.infrastructure.core.api.LocalDateAdapter; +import org.apache.fineract.infrastructure.core.api.LocalDateTimeAdapter; import org.apache.fineract.infrastructure.core.api.LocalTimeAdapter; import org.apache.fineract.infrastructure.core.api.ParameterListExclusionStrategy; import org.apache.fineract.infrastructure.core.api.ParameterListInclusionStrategy; @@ -112,5 +114,6 @@ public final class GoogleGsonSerializerHelper { builder.registerTypeAdapter(LocalTime.class, new LocalTimeAdapter()); builder.registerTypeAdapter(ZonedDateTime.class, new JodaDateTimeAdapter()); builder.registerTypeAdapter(MonthDay.class, new JodaMonthDayAdapter()); + builder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter()); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/JsonParserHelper.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/JsonParserHelper.java index b7d30c2f9..f939b6aa3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/JsonParserHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/serialization/JsonParserHelper.java @@ -18,10 +18,6 @@ */ package org.apache.fineract.infrastructure.core.serialization; -import static java.time.temporal.ChronoField.DAY_OF_MONTH; -import static java.time.temporal.ChronoField.MONTH_OF_YEAR; -import static java.time.temporal.ChronoField.YEAR_OF_ERA; - import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -46,7 +42,6 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.springframework.format.number.NumberStyleFormatter; /** @@ -301,19 +296,14 @@ public class JsonParserHelper { final JsonObject object = element.getAsJsonObject(); if (object.has(parameterName) && object.get(parameterName).isJsonArray()) { - parametersPassedInCommand.add(parameterName); - final JsonArray dateArray = object.get(parameterName).getAsJsonArray(); + final int year = dateArray.get(0).getAsInt(); + final int month = dateArray.get(1).getAsInt(); + final int day = dateArray.get(2).getAsInt(); - final Integer year = dateArray.get(0).getAsInt(); - final Integer month = dateArray.get(1).getAsInt(); - final Integer day = dateArray.get(2).getAsInt(); - - value = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()).with(YEAR_OF_ERA, year).with(MONTH_OF_YEAR, month) - .with(DAY_OF_MONTH, day); + value = LocalDate.of(year, month, day); } - } return value; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java index e5250b0ea..ae7c28687 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java @@ -26,6 +26,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Calendar; @@ -38,8 +39,12 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati public final class DateUtils { - public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; - public static final DateTimeFormatter DEFAULT_DATETIME_FORMATER = DateTimeFormatter.ofPattern(DEFAULT_DATETIME_FORMAT); + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + public static final String DEFAULT_DATETIME_FORMAT = DEFAULT_DATE_FORMAT + " HH:mm:ss"; + public static final DateTimeFormatter DEFAULT_DATETIME_FORMATER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATETIME_FORMAT) + .toFormatter(); + public static final DateTimeFormatter DEFAULT_DATE_FORMATER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATE_FORMAT) + .toFormatter(); private DateUtils() { @@ -51,11 +56,7 @@ public final class DateUtils { public static ZoneId getDateTimeZoneOfTenant() { final FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); - ZoneId zone = ZoneId.systemDefault(); - if (tenant != null) { - zone = ZoneId.of(tenant.getTimezoneId()); - } - return zone; + return ZoneId.of(tenant.getTimezoneId()); } public static TimeZone getTimeZoneOfTenant() { @@ -71,7 +72,7 @@ public final class DateUtils { return convertLocalDateToDate(getLocalDateOfTenant()); } - public static Date convertLocalDateToDate(LocalDate localDate) { + private static Date convertLocalDateToDate(LocalDate localDate) { return createDate(localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth()); } @@ -92,14 +93,9 @@ public final class DateUtils { return LocalDate.now(zone); } - public static LocalDate getLocalDateOfTenant(final ZoneId zone) { - return LocalDate.now(zone); - } - public static LocalDateTime getLocalDateTimeOfTenant() { final ZoneId zone = getDateTimeZoneOfTenant(); - LocalDateTime today = LocalDateTime.now(zone).truncatedTo(ChronoUnit.SECONDS); - return today; + return LocalDateTime.now(zone).truncatedTo(ChronoUnit.SECONDS); } public static Date parseDate(final String stringDate, final String pattern, final ZoneId zoneId) { @@ -128,7 +124,8 @@ public final class DateUtils { } catch (final IllegalArgumentException e) { final List dataValidationErrors = new ArrayList<>(); final ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.date.pattern", - "The parameter date (" + stringDate + ") is invalid w.r.t. pattern " + pattern, "date", stringDate, pattern); + "The parameter `date` (value: " + stringDate + ") is invalid w.r.t. pattern `" + pattern + "`", "date", stringDate, + pattern); dataValidationErrors.add(error); throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors, e); @@ -142,11 +139,19 @@ public final class DateUtils { public static String formatToSqlDate(final Date date) { final DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); df.setTimeZone(getTimeZoneOfTenant()); - final String formattedSqlDate = df.format(date); - return formattedSqlDate; + return df.format(date); } public static boolean isDateInTheFuture(final LocalDate localDate) { return localDate.isAfter(getLocalDateOfTenant()); } + + public static LocalDate getBusinessLocalDate() { + return ThreadLocalContextUtil.getBusinessDate(); + } + + public static Date getBusinessDate() { + return Date.from(ThreadLocalContextUtil.getBusinessDate().atStartOfDay(ZoneId.systemDefault()).toInstant()); + } + } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/ThreadLocalContextUtil.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/ThreadLocalContextUtil.java index e00c8f831..fad559f15 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/ThreadLocalContextUtil.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/ThreadLocalContextUtil.java @@ -18,6 +18,11 @@ */ package org.apache.fineract.infrastructure.core.service; +import java.time.LocalDate; +import java.util.HashMap; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; +import org.apache.fineract.infrastructure.core.domain.ActionContext; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.springframework.util.Assert; @@ -26,29 +31,25 @@ import org.springframework.util.Assert; */ public final class ThreadLocalContextUtil { - private ThreadLocalContextUtil() { - - } - public static final String CONTEXT_TENANTS = "tenants"; - private static final ThreadLocal contextHolder = new ThreadLocal<>(); - - private static final ThreadLocal tenantcontext = new ThreadLocal<>(); - + private static final ThreadLocal tenantContext = new ThreadLocal<>(); private static final ThreadLocal authTokenContext = new ThreadLocal<>(); + private static final ThreadLocal> businessDateContext = new ThreadLocal<>(); + private static final ThreadLocal actionContext = new ThreadLocal<>(); - public static void setTenant(final FineractPlatformTenant tenant) { - Assert.notNull(tenant, "tenant cannot be null"); - tenantcontext.set(tenant); - } + private ThreadLocalContextUtil() {} public static FineractPlatformTenant getTenant() { - return tenantcontext.get(); + return tenantContext.get(); + } + + public static void setTenant(final FineractPlatformTenant tenant) { + tenantContext.set(tenant); } public static void clearTenant() { - tenantcontext.remove(); + tenantContext.remove(); } public static String getDataSourceContext() { @@ -63,12 +64,56 @@ public final class ThreadLocalContextUtil { contextHolder.remove(); } - public static void setAuthToken(final String authToken) { - authTokenContext.set(authToken); - } - public static String getAuthToken() { return authTokenContext.get(); } + public static void setAuthToken(final String authToken) { + authTokenContext.set(authToken); + } + + // Map is not serializable, but Hashmap is + public static HashMap getBusinessDates() { + Assert.notNull(businessDateContext.get(), "Business dates cannot be null!"); + return businessDateContext.get(); + } + + public static void setBusinessDates(HashMap dates) { + Assert.notNull(dates, "Business dates cannot be null!"); + businessDateContext.set(dates); + } + + public static LocalDate getBusinessDateByType(BusinessDateType businessDateType) { + Assert.notNull(businessDateType, "Business date type cannot be null!"); + LocalDate localDate = getBusinessDates().get(businessDateType); + Assert.notNull(localDate, String.format("Business date with type `%s` is not initialised!", businessDateType)); + return localDate; + } + + public static LocalDate getBusinessDate() { + BusinessDateType businessDateType = getActionContext().getBusinessDateType(); + return getBusinessDateByType(businessDateType); + } + + public static ActionContext getActionContext() { + return actionContext.get() == null ? ActionContext.DEFAULT : actionContext.get(); + } + + public static void setActionContext(ActionContext context) { + Assert.notNull(context, "context cannot be null"); + actionContext.set(context); + } + + public static FineractContext getContext() { + return new FineractContext(getDataSourceContext(), getTenant(), getAuthToken(), getBusinessDates(), getActionContext()); + } + + public static void init(final FineractContext fineractContext) { + Assert.notNull(fineractContext, "FineractContext cannot be null during synchronisation!"); + setDataSourceContext(fineractContext.getContextHolder()); + setTenant(fineractContext.getTenantContext()); + setAuthToken(fineractContext.getAuthTokenContext()); + setBusinessDates(fineractContext.getBusinessDateContext()); + setActionContext(fineractContext.getActionContext()); + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java index 707f7ef5c..a11a0b58f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/database/DatabaseSpecificSQLGenerator.java @@ -20,6 +20,7 @@ package org.apache.fineract.infrastructure.core.service.database; import static java.lang.String.format; +import org.apache.fineract.infrastructure.core.service.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -87,26 +88,36 @@ public class DatabaseSpecificSQLGenerator { return format("SELECT COUNT(*) FROM (%s) AS temp", sql); } - public String currentDate() { + public String currentBusinessDate() { if (databaseTypeResolver.isMySQL()) { - return "CURDATE()"; + return format("DATE('%s')", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATER)); } else if (databaseTypeResolver.isPostgreSQL()) { - return "CURRENT_DATE"; + return format("DATE '%s'", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATER)); } else { throw new IllegalStateException("Database type is not supported for current date " + databaseTypeResolver.databaseType()); } } - public String currentDateTime() { + public String currentTenantDate() { if (databaseTypeResolver.isMySQL()) { - return "CURRENT_TIMESTAMP()"; + return format("DATE('%s')", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATER)); } else if (databaseTypeResolver.isPostgreSQL()) { - return "CURRENT_TIMESTAMP"; + return format("DATE '%s'", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATER)); } else { throw new IllegalStateException("Database type is not supported for current date " + databaseTypeResolver.databaseType()); } } + public String currentTenantDateTime() { + if (databaseTypeResolver.isMySQL()) { + return format("TIMESTAMP('%s')", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER)); + } else if (databaseTypeResolver.isPostgreSQL()) { + return format("TIMESTAMP '%s'", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER)); + } else { + throw new IllegalStateException("Database type is not supported for current date time" + databaseTypeResolver.databaseType()); + } + } + public String subDate(String date, String multiplier, String unit) { if (databaseTypeResolver.isMySQL()) { return format("DATE_SUB(%s, INTERVAL %s %s)", date, multiplier, unit); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index 578e2901f..cbae01e23 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -79,7 +79,6 @@ import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -671,29 +670,15 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ registerDatatable(datatableName, apptableName, entitySubType); registerColumnCodeMapping(codeMappings); - } catch (final JpaSystemException | DataIntegrityViolationException e) { + } catch (final PersistenceException | DataAccessException e) { final Throwable realCause = e.getCause(); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable"); if (realCause.getMessage().toLowerCase().contains("duplicate column name")) { baseDataValidator.reset().parameter("name").failWithCode("duplicate.column.name"); - } else if (realCause.getMessage().contains("Table") && realCause.getMessage().contains("already exists")) { - baseDataValidator.reset().parameter("datatableName").value(datatableName).failWithCode("datatable.already.exists"); - } else if (realCause.getMessage().contains("Column") && realCause.getMessage().contains("big")) { - baseDataValidator.reset().parameter("column").failWithCode("length.too.big"); - } else if (realCause.getMessage().contains("Row") && realCause.getMessage().contains("large")) { - baseDataValidator.reset().parameter("row").failWithCode("size.too.large"); - } - - throwExceptionIfValidationWarningsExist(dataValidationErrors); - } catch (final PersistenceException | BadSqlGrammarException ee) { - Throwable realCause = ExceptionUtils.getRootCause(ee.getCause()); - final List dataValidationErrors = new ArrayList<>(); - final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable"); - if (realCause.getMessage().toLowerCase().contains("duplicate column name")) { - baseDataValidator.reset().parameter("name").failWithCode("duplicate.column.name"); - } else if (realCause.getMessage().contains("Table") && realCause.getMessage().contains("already exists")) { + } else if ((realCause.getMessage().contains("Table") || realCause.getMessage().contains("relation")) + && realCause.getMessage().contains("already exists")) { baseDataValidator.reset().parameter("datatableName").value(datatableName).failWithCode("datatable.already.exists"); } else if (realCause.getMessage().contains("Column") && realCause.getMessage().contains("big")) { baseDataValidator.reset().parameter("column").failWithCode("length.too.big"); @@ -1132,7 +1117,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable"); if (realCause.getMessage().toLowerCase().contains("duplicate column name")) { baseDataValidator.reset().parameter("name").failWithCode("duplicate.column.name"); - } else if (realCause.getMessage().contains("Table") && realCause.getMessage().contains("already exists")) { + } else if ((realCause.getMessage().contains("Table") || realCause.getMessage().contains("relation")) + && realCause.getMessage().contains("already exists")) { baseDataValidator.reset().parameter("datatableName").value(datatableName).failWithCode("datatable.already.exists"); } else if (realCause.getMessage().contains("Column") && realCause.getMessage().contains("big")) { baseDataValidator.reset().parameter("column").failWithCode("length.too.big"); @@ -1569,7 +1555,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ || key.equalsIgnoreCase(DataTableApiConstant.UPDATEDAT_FIELD_NAME)) { columnName = sqlGenerator.escape(key); insertColumns += ", " + columnName; - selectColumns += "," + sqlGenerator.currentDateTime() + " as " + columnName; + selectColumns += "," + sqlGenerator.currentTenantDateTime() + " as " + columnName; } } } @@ -1675,7 +1661,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ sql += sqlGenerator.escape(key) + " = " + pValueWrite; } else { if (key.equalsIgnoreCase(DataTableApiConstant.UPDATEDAT_FIELD_NAME)) { - sql += ", " + sqlGenerator.escape(key) + " = " + sqlGenerator.currentDateTime(); + sql += ", " + sqlGenerator.escape(key) + " = " + sqlGenerator.currentTenantDateTime(); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/event/HookEvent.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/event/HookEvent.java index 81282b055..a9cdaa469 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/event/HookEvent.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/event/HookEvent.java @@ -18,47 +18,21 @@ */ package org.apache.fineract.infrastructure.hooks.event; +import lombok.Getter; +import org.apache.fineract.infrastructure.core.domain.FineractContext; +import org.apache.fineract.infrastructure.core.domain.FineractEvent; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.context.ApplicationEvent; -public class HookEvent extends ApplicationEvent { +@Getter +public class HookEvent extends FineractEvent { private final String payload; - private final String tenantIdentifier; - private final AppUser appUser; - private final String authToken; - - public HookEvent(final HookEventSource source, final String payload, final String tenantIdentifier, final AppUser appUser, - final String authToken) { - super(source); + public HookEvent(final HookEventSource source, final String payload, final AppUser appUser, FineractContext fineractContext) { + super(source, fineractContext); this.payload = payload; - this.tenantIdentifier = tenantIdentifier; this.appUser = appUser; - this.authToken = authToken; } - - public String getPayload() { - return this.payload; - } - - @Override - public HookEventSource getSource() { - return (HookEventSource) super.source; - } - - public String getTenantIdentifier() { - return this.tenantIdentifier; - } - - public AppUser getAppUser() { - return this.appUser; - } - - public String getAuthToken() { - return this.authToken; - } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/listener/FineractHookListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/listener/FineractHookListener.java index 95acc3fef..90c307ae1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/listener/FineractHookListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/listener/FineractHookListener.java @@ -21,7 +21,7 @@ package org.apache.fineract.infrastructure.hooks.listener; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.event.HookEvent; @@ -29,7 +29,6 @@ import org.apache.fineract.infrastructure.hooks.event.HookEventSource; import org.apache.fineract.infrastructure.hooks.processor.HookProcessor; import org.apache.fineract.infrastructure.hooks.processor.HookProcessorProvider; import org.apache.fineract.infrastructure.hooks.service.HookReadPlatformService; -import org.apache.fineract.infrastructure.security.service.TenantDetailsService; import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.stereotype.Service; @@ -40,18 +39,15 @@ public class FineractHookListener implements HookListener { private final HookProcessorProvider hookProcessorProvider; private final HookReadPlatformService hookReadPlatformService; - private final TenantDetailsService tenantDetailsService; @Override public void onApplicationEvent(final HookEvent event) { - final String tenantIdentifier = event.getTenantIdentifier(); - final FineractPlatformTenant tenant = this.tenantDetailsService.loadTenantById(tenantIdentifier); - ThreadLocalContextUtil.setTenant(tenant); + ThreadLocalContextUtil.init(event.getContext()); final AppUser appUser = event.getAppUser(); - final String authToken = event.getAuthToken(); - final HookEventSource hookEventSource = event.getSource(); + final HookEventSource hookEventSource = (HookEventSource) event.getSource(); + final FineractContext fineractContext = event.getContext(); final String entityName = hookEventSource.getEntityName(); final String actionName = hookEventSource.getActionName(); final String payload = event.getPayload(); @@ -62,10 +58,11 @@ public class FineractHookListener implements HookListener { for (final Hook hook : hooks) { final HookProcessor processor = this.hookProcessorProvider.getProcessor(hook); try { - processor.process(hook, appUser, payload, entityName, actionName, tenantIdentifier, authToken); + processor.process(hook, payload, entityName, actionName, fineractContext); } catch (Throwable e) { log.error("Hook {} failed in HookProcessor {} for tenantIdentifier/user {}/{}, entityName: {}, actionName: {}, payload {} ", - hook.getId(), processor.getClass().getSimpleName(), tenantIdentifier, appUser, entityName, actionName, payload, e); + hook.getId(), processor.getClass().getSimpleName(), fineractContext.getTenantContext().getTenantIdentifier(), + appUser.getDisplayName(), entityName, actionName, payload, e); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/ElasticSearchHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/ElasticSearchHookProcessor.java index be5d463b5..da3553006 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/ElasticSearchHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/ElasticSearchHookProcessor.java @@ -27,9 +27,9 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.stereotype.Service; import retrofit2.Callback; @@ -40,8 +40,8 @@ public class ElasticSearchHookProcessor implements HookProcessor { private final ProcessorHelper processorHelper; @Override - public void process(final Hook hook, @SuppressWarnings("unused") final AppUser appUser, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, final String authToken) { + public void process(final Hook hook, final String payload, final String entityName, final String actionName, + final FineractContext context) { final Set config = hook.getHookConfig(); @@ -58,13 +58,13 @@ public class ElasticSearchHookProcessor implements HookProcessor { } } - sendRequest(url, contentType, payload, entityName, actionName, tenantIdentifier, authToken); + sendRequest(url, contentType, payload, entityName, actionName, context); } @SuppressWarnings("unchecked") private void sendRequest(final String url, final String contentType, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, @SuppressWarnings("unused") final String authToken) { + final String actionName, final FineractContext context) { final String fineractEndpointUrl = System.getProperty("baseUrl"); final WebHookService service = processorHelper.createWebHookService(url); @@ -74,11 +74,13 @@ public class ElasticSearchHookProcessor implements HookProcessor { if (contentType.equalsIgnoreCase("json") || contentType.contains("json")) { final JsonObject json = new Gson().fromJson(payload, JsonObject.class); - service.sendJsonRequest(entityName, actionName, tenantIdentifier, fineractEndpointUrl, json).enqueue(callback); + service.sendJsonRequest(entityName, actionName, context.getTenantContext().getTenantIdentifier(), fineractEndpointUrl, json) + .enqueue(callback); } else { Map map = new HashMap<>(); map = new Gson().fromJson(payload, map.getClass()); - service.sendFormRequest(entityName, actionName, tenantIdentifier, fineractEndpointUrl, map).enqueue(callback); + service.sendFormRequest(entityName, actionName, context.getTenantContext().getTenantIdentifier(), fineractEndpointUrl, map) + .enqueue(callback); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessor.java index 74d0d2fc7..e885a5d9b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/HookProcessor.java @@ -18,12 +18,11 @@ */ package org.apache.fineract.infrastructure.hooks.processor; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.hooks.domain.Hook; -import org.apache.fineract.useradministration.domain.AppUser; public interface HookProcessor { - void process(Hook hook, AppUser appUser, String payload, String entityName, String actionName, String tenantIdentifier, - String authToken) throws Exception; + void process(Hook hook, String payload, String entityName, String actionName, FineractContext context) throws Exception; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java index 5cd7e8bb3..62ecc3bb9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/MessageGatewayHookProcessor.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; @@ -41,7 +42,6 @@ import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.template.domain.Template; import org.apache.fineract.template.domain.TemplateRepository; import org.apache.fineract.template.service.TemplateMergeService; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.stereotype.Service; @Service @@ -57,8 +57,8 @@ public class MessageGatewayHookProcessor implements HookProcessor { private final SmsMessageScheduledJobService smsMessageScheduledJobService; @Override - public void process(final Hook hook, @SuppressWarnings("unused") final AppUser appUser, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, final String authToken) throws IOException { + public void process(final Hook hook, final String payload, final String entityName, final String actionName, + final FineractContext context) throws IOException { final Set config = hook.getHookConfig(); @@ -89,7 +89,9 @@ public class MessageGatewayHookProcessor implements HookProcessor { // 2.1 : get customer details for basic template mapping // 2.2 : cook up scope map - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() { + + }.getType(); Map reqMap = new Gson().fromJson(payload, type); if (reqMap.get("clientId") != null) { Long clientId = (Long) reqMap.get("clientId"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java index 73a6d4c43..9fca8b020 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/TwilioHookProcessor.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; import org.apache.fineract.infrastructure.hooks.domain.HookConfigurationRepository; @@ -37,7 +38,6 @@ import org.apache.fineract.infrastructure.hooks.processor.data.SmsProviderData; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.template.service.TemplateMergeService; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.stereotype.Service; import retrofit2.Callback; @@ -51,17 +51,17 @@ public class TwilioHookProcessor implements HookProcessor { private final ProcessorHelper processorHelper; @Override - public void process(final Hook hook, @SuppressWarnings("unused") final AppUser appUser, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, final String authToken) throws IOException { + public void process(final Hook hook, final String payload, final String entityName, final String actionName, + final FineractContext context) throws IOException { final SmsProviderData smsProviderData = new SmsProviderData(hook.getHookConfig()); - sendRequest(smsProviderData, payload, entityName, actionName, tenantIdentifier, authToken, hook); + sendRequest(smsProviderData, payload, entityName, actionName, hook, context); } @SuppressWarnings("unchecked") private void sendRequest(final SmsProviderData smsProviderData, final String payload, String entityName, String actionName, - final String tenantIdentifier, final String authToken, final Hook hook) throws IOException { + final Hook hook, final FineractContext context) throws IOException { final WebHookService service = processorHelper.createWebHookService(smsProviderData.getUrl()); @@ -72,8 +72,8 @@ public class TwilioHookProcessor implements HookProcessor { if (apiKey == null) { smsProviderData.setUrl(null); smsProviderData.setEndpoint(System.getProperty("baseUrl")); - smsProviderData.setTenantId(tenantIdentifier); - smsProviderData.setMifosToken(authToken); + smsProviderData.setTenantId(context.getTenantContext().getTenantIdentifier()); + smsProviderData.setMifosToken(context.getAuthTokenContext()); apiKey = service.sendSmsBridgeConfigRequest(smsProviderData).execute().body(); final HookConfiguration apiKeyEntry = HookConfiguration.createNew(hook, "string", apiKeyName, apiKey); this.hookConfigurationRepository.save(apiKeyEntry); @@ -84,14 +84,15 @@ public class TwilioHookProcessor implements HookProcessor { if (hook.getUgdTemplate() != null) { entityName = "sms"; actionName = "send"; - json = processUgdTemplate(payload, hook, authToken); + json = processUgdTemplate(payload, hook, context.getAuthTokenContext()); if (json == null) { return; } } else { json = JsonParser.parseString(payload).getAsJsonObject(); } - service.sendSmsBridgeRequest(entityName, actionName, tenantIdentifier, apiKey, json).enqueue(callback); + service.sendSmsBridgeRequest(entityName, actionName, context.getTenantContext().getTenantIdentifier(), apiKey, json) + .enqueue(callback); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/WebHookProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/WebHookProcessor.java index 47f6786fc..318243491 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/WebHookProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/WebHookProcessor.java @@ -28,9 +28,9 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.hooks.domain.Hook; import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.stereotype.Service; import retrofit2.Callback; @@ -41,8 +41,8 @@ public class WebHookProcessor implements HookProcessor { private final ProcessorHelper processorHelper; @Override - public void process(final Hook hook, @SuppressWarnings("unused") final AppUser appUser, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, final String authToken) { + public void process(final Hook hook, final String payload, final String entityName, final String actionName, + final FineractContext context) { final Set config = hook.getHookConfig(); @@ -59,12 +59,12 @@ public class WebHookProcessor implements HookProcessor { } } - sendRequest(url, contentType, payload, entityName, actionName, tenantIdentifier, authToken); + sendRequest(url, contentType, payload, entityName, actionName, context); } @SuppressWarnings("unchecked") private void sendRequest(final String url, final String contentType, final String payload, final String entityName, - final String actionName, final String tenantIdentifier, @SuppressWarnings("unused") final String authToken) { + final String actionName, final FineractContext context) { final String fineractEndpointUrl = System.getProperty("baseUrl"); final WebHookService service = processorHelper.createWebHookService(url); @@ -74,11 +74,13 @@ public class WebHookProcessor implements HookProcessor { if (contentType.equalsIgnoreCase("json") || contentType.contains("json")) { final JsonObject json = JsonParser.parseString(payload).getAsJsonObject(); - service.sendJsonRequest(entityName, actionName, tenantIdentifier, fineractEndpointUrl, json).enqueue(callback); + service.sendJsonRequest(entityName, actionName, context.getTenantContext().getTenantIdentifier(), fineractEndpointUrl, json) + .enqueue(callback); } else { Map map = new HashMap<>(); map = new Gson().fromJson(payload, map.getClass()); - service.sendFormRequest(entityName, actionName, tenantIdentifier, fineractEndpointUrl, map).enqueue(callback); + service.sendFormRequest(entityName, actionName, context.getTenantContext().getTenantIdentifier(), fineractEndpointUrl, map) + .enqueue(callback); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobListener.java index 257cf02b9..fc3bbd663 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerJobListener.java @@ -18,7 +18,12 @@ */ package org.apache.fineract.infrastructure.jobs.service; +import java.time.LocalDate; import java.util.Date; +import java.util.HashMap; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; +import org.apache.fineract.infrastructure.businessdate.service.BusinessDateReadPlatformService; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobDetail; import org.apache.fineract.infrastructure.jobs.domain.ScheduledJobRunHistory; @@ -29,7 +34,6 @@ import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.JobListener; import org.quartz.Trigger; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper; @@ -39,26 +43,17 @@ import org.springframework.stereotype.Component; /** * Global job Listener class to set Tenant details to {@link ThreadLocalContextUtil} for batch Job and stores the batch * job status to database after the execution - * */ @Component +@RequiredArgsConstructor public class SchedulerJobListener implements JobListener { - private int stackTraceLevel = 0; - private final String name = SchedulerServiceConstants.DEFAULT_LISTENER_NAME; - private final SchedularWritePlatformService schedularService; - private final AppUserRepositoryWrapper userRepository; - private final GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper(); - - @Autowired - public SchedulerJobListener(final SchedularWritePlatformService schedularService, final AppUserRepositoryWrapper userRepository) { - this.schedularService = schedularService; - this.userRepository = userRepository; - } + private final BusinessDateReadPlatformService businessDateReadPlatformService; + private int stackTraceLevel = 0; @Override public String getName() { @@ -71,6 +66,8 @@ public class SchedulerJobListener implements JobListener { UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), authoritiesMapper.mapAuthorities(user.getAuthorities())); SecurityContextHolder.getContext().setAuthentication(auth); + HashMap businessDates = businessDateReadPlatformService.getBusinessDates(); + ThreadLocalContextUtil.setBusinessDates(businessDates); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerTriggerListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerTriggerListener.java index 9183e5b33..7f1a8ee73 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerTriggerListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/SchedulerTriggerListener.java @@ -20,6 +20,11 @@ package org.apache.fineract.infrastructure.jobs.service; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.security.SecureRandom; +import java.time.LocalDate; +import java.util.HashMap; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; +import org.apache.fineract.infrastructure.businessdate.service.BusinessDateReadPlatformService; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.security.service.TenantDetailsService; @@ -30,10 +35,10 @@ import org.quartz.Trigger.CompletedExecutionInstruction; import org.quartz.TriggerListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component +@RequiredArgsConstructor public class SchedulerTriggerListener implements TriggerListener { private static final Logger LOG = LoggerFactory.getLogger(SchedulerTriggerListener.class); @@ -42,12 +47,7 @@ public class SchedulerTriggerListener implements TriggerListener { private final SchedularWritePlatformService schedularService; private final TenantDetailsService tenantDetailsService; - @Autowired - public SchedulerTriggerListener(final SchedularWritePlatformService schedularService, final TenantDetailsService tenantDetailsService) { - this.schedularService = schedularService; - this.tenantDetailsService = tenantDetailsService; - - } + private final BusinessDateReadPlatformService businessDateReadPlatformService; @Override public String getName() { @@ -66,6 +66,8 @@ public class SchedulerTriggerListener implements TriggerListener { final String tenantIdentifier = trigger.getJobDataMap().getString(SchedulerServiceConstants.TENANT_IDENTIFIER); final FineractPlatformTenant tenant = this.tenantDetailsService.loadTenantById(tenantIdentifier); ThreadLocalContextUtil.setTenant(tenant); + HashMap businessDates = businessDateReadPlatformService.getBusinessDates(); + ThreadLocalContextUtil.setBusinessDates(businessDates); final JobKey key = trigger.getJobKey(); final String jobKey = key.getName() + SchedulerServiceConstants.JOB_KEY_SEPERATOR + key.getGroup(); String triggerType = SchedulerServiceConstants.TRIGGER_TYPE_CRON; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareBasicAuthenticationFilter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareBasicAuthenticationFilter.java index c29fbdbef..e4494585b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareBasicAuthenticationFilter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareBasicAuthenticationFilter.java @@ -19,11 +19,15 @@ package org.apache.fineract.infrastructure.security.filter; import java.io.IOException; +import java.time.LocalDate; +import java.util.HashMap; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.time.StopWatch; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; +import org.apache.fineract.infrastructure.businessdate.service.BusinessDateReadPlatformService; import org.apache.fineract.infrastructure.cache.domain.CacheType; import org.apache.fineract.infrastructure.cache.service.CacheWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; @@ -80,6 +84,9 @@ public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFil @Autowired private BasicAuthTenantDetailsService basicAuthTenantDetailsService; + @Autowired + private BusinessDateReadPlatformService businessDateReadPlatformService; + private final String tenantRequestHeader = "Fineract-Platform-TenantId"; private final boolean exceptionIfHeaderMissing = true; @@ -119,8 +126,9 @@ public class TenantAwareBasicAuthenticationFilter extends BasicAuthenticationFil isReportRequest = true; } final FineractPlatformTenant tenant = this.basicAuthTenantDetailsService.loadTenantById(tenantIdentifier, isReportRequest); - ThreadLocalContextUtil.setTenant(tenant); + HashMap businessDates = this.businessDateReadPlatformService.getBusinessDates(); + ThreadLocalContextUtil.setBusinessDates(businessDates); String authToken = request.getHeader("Authorization"); if (authToken != null && authToken.startsWith("Basic ")) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareTenantIdentifierFilter.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareTenantIdentifierFilter.java index c653742ba..3ca2ebeb1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareTenantIdentifierFilter.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/filter/TenantAwareTenantIdentifierFilter.java @@ -19,13 +19,20 @@ package org.apache.fineract.infrastructure.security.filter; import java.io.IOException; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.StopWatch; +import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; +import org.apache.fineract.infrastructure.businessdate.service.BusinessDateReadPlatformService; import org.apache.fineract.infrastructure.cache.domain.CacheType; import org.apache.fineract.infrastructure.cache.service.CacheWritePlatformService; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; @@ -35,9 +42,6 @@ import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.security.data.PlatformRequestLog; import org.apache.fineract.infrastructure.security.exception.InvalidTenantIdentiferException; import org.apache.fineract.infrastructure.security.service.BasicAuthTenantDetailsService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -56,30 +60,23 @@ import org.springframework.web.filter.GenericFilterBean; */ @Service @ConditionalOnProperty("fineract.security.oauth.enabled") +@RequiredArgsConstructor +@Slf4j public class TenantAwareTenantIdentifierFilter extends GenericFilterBean { - private static boolean firstRequestProcessed = false; - private static final Logger LOG = LoggerFactory.getLogger(TenantAwareTenantIdentifierFilter.class); + private static AtomicBoolean firstRequestProcessed = new AtomicBoolean(); private final BasicAuthTenantDetailsService basicAuthTenantDetailsService; private final ToApiJsonSerializer toApiJsonSerializer; private final ConfigurationDomainService configurationDomainService; private final CacheWritePlatformService cacheWritePlatformService; + private final BusinessDateReadPlatformService businessDateReadPlatformService; + private final String tenantRequestHeader = "Fineract-Platform-TenantId"; private final boolean exceptionIfHeaderMissing = true; private final String apiUri = "/api/v1/"; - @Autowired - public TenantAwareTenantIdentifierFilter(final BasicAuthTenantDetailsService basicAuthTenantDetailsService, - final ToApiJsonSerializer toApiJsonSerializer, final ConfigurationDomainService configurationDomainService, - final CacheWritePlatformService cacheWritePlatformService) { - this.basicAuthTenantDetailsService = basicAuthTenantDetailsService; - this.toApiJsonSerializer = toApiJsonSerializer; - this.configurationDomainService = configurationDomainService; - this.cacheWritePlatformService = cacheWritePlatformService; - } - @Override public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { @@ -120,15 +117,16 @@ public class TenantAwareTenantIdentifierFilter extends GenericFilterBean { isReportRequest = true; } final FineractPlatformTenant tenant = this.basicAuthTenantDetailsService.loadTenantById(tenantIdentifier, isReportRequest); - ThreadLocalContextUtil.setTenant(tenant); + HashMap businessDates = this.businessDateReadPlatformService.getBusinessDates(); + ThreadLocalContextUtil.setBusinessDates(businessDates); String authToken = request.getHeader("Authorization"); if (authToken != null && authToken.startsWith("bearer ")) { ThreadLocalContextUtil.setAuthToken(authToken.replaceFirst("bearer ", "")); } - if (!firstRequestProcessed) { + if (!firstRequestProcessed.get()) { final String baseUrl = request.getRequestURL().toString().replace(request.getRequestURI(), request.getContextPath() + apiUri); System.setProperty("baseUrl", baseUrl); @@ -139,7 +137,7 @@ public class TenantAwareTenantIdentifierFilter extends GenericFilterBean { } else { this.cacheWritePlatformService.switchToCache(CacheType.NO_CACHE); } - TenantAwareTenantIdentifierFilter.firstRequestProcessed = true; + firstRequestProcessed.set(true); } chain.doFilter(request, response); } @@ -151,8 +149,8 @@ public class TenantAwareTenantIdentifierFilter extends GenericFilterBean { response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } finally { task.stop(); - final PlatformRequestLog log = PlatformRequestLog.from(task, request); - LOG.info("{}", this.toApiJsonSerializer.serialize(log)); + final PlatformRequestLog logRequest = PlatformRequestLog.from(task, request); + log.info("{}", this.toApiJsonSerializer.serialize(logRequest)); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java index 3b7e09fa6..34a811164 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.sms.domain; -import java.time.LocalDate; -import java.time.ZoneId; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; @@ -122,8 +120,7 @@ public class SmsMessage extends AbstractPersistableCustom { this.mobileNo = mobileNo; this.message = message; this.smsCampaign = smsCampaign; - this.submittedOnDate = Date - .from(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()).atStartOfDay(ZoneId.systemDefault()).toInstant()); + this.submittedOnDate = DateUtils.getBusinessDate(); this.isNotification = isNotification; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java index 6304e59be..0507aca10 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java @@ -28,11 +28,12 @@ import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.campaigns.helper.SmsConfigUtils; import org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignConstants; import org.apache.fineract.infrastructure.campaigns.sms.domain.SmsCampaign; import org.apache.fineract.infrastructure.campaigns.sms.exception.ConnectionFailureException; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.gcm.service.NotificationSenderService; @@ -44,8 +45,6 @@ import org.apache.fineract.infrastructure.sms.domain.SmsMessage; import org.apache.fineract.infrastructure.sms.domain.SmsMessageRepository; import org.apache.fineract.infrastructure.sms.domain.SmsMessageStatusType; import org.apache.fineract.infrastructure.sms.service.SmsReadPlatformService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; @@ -63,16 +62,16 @@ import org.springframework.web.client.RestTemplate; * Scheduled job services that send SMS messages and get delivery reports for the sent SMS messages **/ @Service +@Slf4j public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJobService { private final SmsMessageRepository smsMessageRepository; private final SmsReadPlatformService smsReadPlatformService; - private static final Logger LOG = LoggerFactory.getLogger(SmsMessageScheduledJobServiceImpl.class); private final RestTemplate restTemplate = new RestTemplate(); - private ExecutorService genericExecutorService; - private ExecutorService triggeredExecutorService; private final SmsConfigUtils smsConfigUtils; private final NotificationSenderService notificationSenderService; + private ExecutorService genericExecutorService; + private ExecutorService triggeredExecutorService; /** * SmsMessageScheduledJobServiceImpl constructor @@ -131,7 +130,7 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob if (toSaveMessages.size() > 0) { this.smsMessageRepository.saveAll(toSaveMessages); this.smsMessageRepository.flush(); - this.genericExecutorService.execute(new SmsTask(ThreadLocalContextUtil.getTenant(), apiQueueResourceDatas)); + this.genericExecutorService.execute(new SmsTask(apiQueueResourceDatas, ThreadLocalContextUtil.getContext())); } if (!toSendNotificationMessages.isEmpty()) { this.notificationSenderService.sendNotification(toSendNotificationMessages); @@ -147,40 +146,18 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob } while (page < totalRecords); } - class SmsTask implements Runnable, ApplicationListener { - - private final FineractPlatformTenant tenant; - private final Collection apiQueueResourceDatas; - - SmsTask(final FineractPlatformTenant tenant, final Collection apiQueueResourceDatas) { - this.tenant = tenant; - this.apiQueueResourceDatas = apiQueueResourceDatas; - } - - @Override - public void run() { - ThreadLocalContextUtil.setTenant(tenant); - connectAndSendToIntermediateServer(apiQueueResourceDatas); - } - - @Override - public void onApplicationEvent(ContextClosedEvent event) { - genericExecutorService.shutdown(); - LOG.info("Shutting down the ExecutorService"); - } - } - private void connectAndSendToIntermediateServer(Collection apiQueueResourceDatas) { Map hostConfig = this.smsConfigUtils.getMessageGateWayRequestURI("sms", SmsMessageApiQueueResourceData.toJsonString(apiQueueResourceDatas)); URI uri = (URI) hostConfig.get("uri"); HttpEntity entity = (HttpEntity) hostConfig.get("entity"); - ResponseEntity responseOne = restTemplate.exchange(uri, HttpMethod.POST, entity, - new ParameterizedTypeReference() {}); + ResponseEntity responseOne = restTemplate.exchange(uri, HttpMethod.POST, entity, new ParameterizedTypeReference() { + + }); if (responseOne != null) { // String smsResponse = responseOne.getBody(); if (!responseOne.getStatusCode().equals(HttpStatus.ACCEPTED)) { - LOG.debug("{}", responseOne.getStatusCode().name()); + log.debug("{}", responseOne.getStatusCode().name()); throw new ConnectionFailureException(SmsCampaignConstants.SMS); } } @@ -213,7 +190,7 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob if (toSaveMessages.size() > 0) { this.smsMessageRepository.saveAll(toSaveMessages); this.smsMessageRepository.flush(); - this.triggeredExecutorService.execute(new SmsTask(ThreadLocalContextUtil.getTenant(), apiQueueResourceDatas)); + this.triggeredExecutorService.execute(new SmsTask(apiQueueResourceDatas, ThreadLocalContextUtil.getContext())); } if (!toSendNotificationMessages.isEmpty()) { this.notificationSenderService.sendNotification(toSendNotificationMessages); @@ -222,7 +199,7 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob } } } catch (Exception e) { - LOG.error("Error occured.", e); + log.error("Error occured.", e); } } @@ -239,10 +216,10 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob } this.smsMessageRepository.saveAll(smsMessages); request.append(SmsMessageApiQueueResourceData.toJsonString(apiQueueResourceDatas)); - LOG.info("Sending triggered SMS to specific provider with request - {}", request); - this.triggeredExecutorService.execute(new SmsTask(ThreadLocalContextUtil.getTenant(), apiQueueResourceDatas)); + log.info("Sending triggered SMS to specific provider with request - {}", request); + this.triggeredExecutorService.execute(new SmsTask(apiQueueResourceDatas, ThreadLocalContextUtil.getContext())); } catch (Exception e) { - LOG.error("Error occured.", e); + log.error("Error occured.", e); } } @@ -268,7 +245,9 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob URI uri = (URI) hostConfig.get("uri"); HttpEntity entity = (HttpEntity) hostConfig.get("entity"); ResponseEntity> responseOne = restTemplate.exchange(uri, HttpMethod.POST, - entity, new ParameterizedTypeReference>() {}); + entity, new ParameterizedTypeReference>() { + + }); Collection smsMessageDeliveryReportDatas = responseOne.getBody(); Iterator responseReportIterator = smsMessageDeliveryReportDatas.iterator(); @@ -315,23 +294,44 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob this.smsMessageRepository.save(smsMessage); if (statusChanged) { - LOG.info("Status of SMS message id: {} successfully changed to {}", smsMessage.getId(), statusType); + log.info("Status of SMS message id: {} successfully changed to {}", smsMessage.getId(), statusType); } } } if (smsMessageDeliveryReportDatas.size() > 0) { - LOG.info("{} delivery report(s) successfully received from the intermediate gateway - sms", + log.info("{} delivery report(s) successfully received from the intermediate gateway - sms", smsMessageDeliveryReportDatas.size()); } } - } - - catch (Exception e) { - LOG.error("Error occured.", e); + } catch (Exception e) { + log.error("Error occured.", e); } page++; totalRecords = smsMessageInternalIds.getTotalFilteredRecords(); } while (page < totalRecords); } + + class SmsTask implements Runnable, ApplicationListener { + + private final FineractContext context; + private final Collection apiQueueResourceDatas; + + SmsTask(final Collection apiQueueResourceDatas, final FineractContext context) { + this.context = context; + this.apiQueueResourceDatas = apiQueueResourceDatas; + } + + @Override + public void run() { + ThreadLocalContextUtil.init(context); + connectAndSendToIntermediateServer(apiQueueResourceDatas); + } + + @Override + public void onApplicationEvent(ContextClosedEvent event) { + genericExecutorService.shutdown(); + log.info("Shutting down the ExecutorService"); + } + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java index ce11c3708..d2533e905 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/interoperation/service/InteropServiceImpl.java @@ -380,7 +380,7 @@ public class InteropServiceImpl implements InteropService { public InteropTransferResponseData prepareTransfer(@NotNull JsonCommand command) { InteropTransferRequestData request = dataValidator.validateAndParseTransferRequest(command); String transferCode = request.getTransferCode(); - LocalDateTime transactionDate = DateUtils.getLocalDateTimeOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); // TODO validate request fee/comission and account quote amount // matching, at CREATE it is debited anyway @@ -401,12 +401,11 @@ public class InteropServiceImpl implements InteropService { PaymentDetail paymentDetail = instance(findPaymentType(), savingsAccount.getExternalId(), null, getRoutingCode(), transferCode, null); SavingsAccountTransaction holdTransaction = SavingsAccountTransaction.holdAmount(savingsAccount, savingsAccount.office(), - paymentDetail, transactionDate.toLocalDate(), Money.of(savingsAccount.getCurrency(), total), new Date(), getLoginUser(), - false); + paymentDetail, transactionDate, Money.of(savingsAccount.getCurrency(), total), new Date(), getLoginUser(), false); MonetaryCurrency accountCurrency = savingsAccount.getCurrency().copy(); holdTransaction.updateRunningBalance( Money.of(accountCurrency, savingsAccount.getWithdrawableBalance().subtract(holdTransaction.getAmount()))); - holdTransaction.updateCumulativeBalanceAndDates(accountCurrency, transactionDate.toLocalDate()); + holdTransaction.updateCumulativeBalanceAndDates(accountCurrency, transactionDate); savingsAccount.holdAmount(total); savingsAccount.addTransaction(holdTransaction); @@ -415,7 +414,7 @@ public class InteropServiceImpl implements InteropService { } return InteropTransferResponseData.build(command.commandId(), request.getTransactionCode(), InteropActionState.ACCEPTED, - request.getExpiration(), request.getExtensionList(), transferCode, transactionDate); + request.getExpiration(), request.getExtensionList(), transferCode, DateUtils.getLocalDateTimeOfTenant()); } @Override @@ -432,7 +431,7 @@ public class InteropServiceImpl implements InteropService { } LocalDateTime transactionDateTime = DateUtils.getLocalDateTimeOfTenant(); - LocalDate transactionDate = transactionDateTime.toLocalDate(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); DateTimeFormatter fmt = getDateTimeFormatter(command); SavingsAccountTransaction transaction; final boolean backdatedTxnsAllowedTill = false; @@ -489,15 +488,15 @@ public class InteropServiceImpl implements InteropService { SavingsAccount savingsAccount = validateAndGetSavingAccount(request); LocalDateTime transactionDateTime = DateUtils.getLocalDateTimeOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); SavingsAccountTransaction holdTransaction = findTransaction(savingsAccount, request.getTransferCode(), AMOUNT_HOLD.getValue()); if (holdTransaction != null && holdTransaction.getReleaseIdOfHoldAmountTransaction() == null) { - SavingsAccountTransaction releaseTransaction = releaseAmount(holdTransaction, transactionDateTime.toLocalDate(), new Date(), - getLoginUser()); + SavingsAccountTransaction releaseTransaction = releaseAmount(holdTransaction, transactionDate, new Date(), getLoginUser()); MonetaryCurrency accountCurrency = savingsAccount.getCurrency().copy(); releaseTransaction.updateRunningBalance( Money.of(accountCurrency, savingsAccount.getWithdrawableBalance().add(holdTransaction.getAmount()))); - releaseTransaction.updateCumulativeBalanceAndDates(accountCurrency, transactionDateTime.toLocalDate()); + releaseTransaction.updateCumulativeBalanceAndDates(accountCurrency, transactionDate); releaseTransaction = savingsAccountTransactionRepository.saveAndFlush(releaseTransaction); holdTransaction.updateReleaseId(releaseTransaction.getId()); @@ -536,8 +535,6 @@ public class InteropServiceImpl implements InteropService { Loan loan = validateAndGetLoan(accountId); Long loanId = loan.getId(); - LocalDateTime disbursedOnDate = DateUtils.getLocalDateTimeOfTenant(); - final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson); final CommandWrapper commandRequest = builder.disburseLoanApplication(loanId).build(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringEvent.java b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEvent.java similarity index 77% rename from fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringEvent.java rename to fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEvent.java index ea67efe56..65172e0e7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringEvent.java +++ b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEvent.java @@ -18,16 +18,17 @@ */ package org.apache.fineract.notification.eventandlistener; +import org.apache.fineract.infrastructure.core.domain.FineractContext; +import org.apache.fineract.infrastructure.core.domain.FineractEvent; import org.apache.fineract.notification.data.NotificationData; -import org.springframework.context.ApplicationEvent; @SuppressWarnings("serial") -public class SpringEvent extends ApplicationEvent { +public class NotificationEvent extends FineractEvent { private NotificationData notificationData; - public SpringEvent(Object source, NotificationData notificationData) { - super(source); + public NotificationEvent(Object source, NotificationData notificationData, FineractContext context) { + super(source, context); this.notificationData = notificationData; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEventListener.java b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEventListener.java index 3aea8ead8..31dc3cbe9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEventListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/NotificationEventListener.java @@ -23,9 +23,6 @@ import java.util.List; import java.util.Objects; import java.util.Set; import lombok.RequiredArgsConstructor; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; -import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; -import org.apache.fineract.infrastructure.security.service.BasicAuthTenantDetailsService; import org.apache.fineract.notification.data.NotificationData; import org.apache.fineract.notification.service.NotificationWritePlatformService; import org.apache.fineract.useradministration.domain.AppUser; @@ -36,15 +33,10 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class NotificationEventListener { - private final BasicAuthTenantDetailsService basicAuthTenantDetailsService; private final NotificationWritePlatformService notificationWritePlatformService; private final AppUserRepository appUserRepository; public void receive(NotificationData notificationData) { - final FineractPlatformTenant tenant = this.basicAuthTenantDetailsService.loadTenantById(notificationData.getTenantIdentifier(), - false); - ThreadLocalContextUtil.setTenant(tenant); - Long appUserId = notificationData.getActorId(); Set userIds = notificationData.getUserIds(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java index e57be9a06..4d427725b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventListener.java @@ -20,6 +20,7 @@ package org.apache.fineract.notification.eventandlistener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.notification.data.NotificationData; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Profile; @@ -29,13 +30,14 @@ import org.springframework.stereotype.Component; @Profile("!activeMqEnabled") @RequiredArgsConstructor @Slf4j -public class SpringNotificationEventListener implements ApplicationListener { +public class SpringNotificationEventListener implements ApplicationListener { private final NotificationEventListener notificationEventListener; @Override - public void onApplicationEvent(SpringEvent event) { + public void onApplicationEvent(NotificationEvent event) { log.debug("Processing Spring notification event {}", event); + ThreadLocalContextUtil.init(event.getContext()); NotificationData notificationData = event.getNotificationData(); notificationEventListener.receive(notificationData); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventPublisher.java b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventPublisher.java index 15547e3cf..9198538b2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventPublisher.java +++ b/fineract-provider/src/main/java/org/apache/fineract/notification/eventandlistener/SpringNotificationEventPublisher.java @@ -20,6 +20,7 @@ package org.apache.fineract.notification.eventandlistener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.notification.data.NotificationData; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Profile; @@ -36,7 +37,8 @@ public class SpringNotificationEventPublisher implements NotificationEventPublis @Override public void broadcastNotification(final NotificationData notificationData) { log.debug("Sending Spring notification event: {}", notificationData); - SpringEvent event = new SpringEvent(this, notificationData); + NotificationEvent event = new NotificationEvent(SpringNotificationEventPublisher.class, notificationData, + ThreadLocalContextUtil.getContext()); applicationEventPublisher.publishEvent(event); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java index 10c6192b4..92d52f874 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformServiceImpl.java @@ -161,7 +161,7 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers } // defaults - final LocalDate transferDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transferDate = DateUtils.getBusinessLocalDate(); Collection toOfficeOptions = fromOfficeOptions; Collection toClientOptions = null; @@ -516,7 +516,7 @@ public class AccountTransfersReadPlatformServiceImpl implements AccountTransfers } // defaults - final LocalDate transferDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transferDate = DateUtils.getBusinessLocalDate(); Collection toOfficeOptions = fromOfficeOptions; Collection toClientOptions = null; 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 810814d3f..3542c0325 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 @@ -294,10 +294,14 @@ public class PortfolioAccountReadPlatformServiceImpl implements PortfolioAccount private static final class PortfolioLoanAccountRefundByTransferMapper implements RowMapper { - private final String schemaSql; + private String schemaSql; + private final DatabaseSpecificSQLGenerator sqlGenerator; PortfolioLoanAccountRefundByTransferMapper(DatabaseSpecificSQLGenerator sqlGenerator) { + this.sqlGenerator = sqlGenerator; + } + public String schema() { final StringBuilder amountQueryString = new StringBuilder(400); amountQueryString.append("(select (SUM(COALESCE(mr.principal_completed_derived, 0)) +"); amountQueryString.append("SUM(COALESCE(mr.interest_completed_derived, 0)) + "); @@ -305,7 +309,7 @@ public class PortfolioAccountReadPlatformServiceImpl implements PortfolioAccount 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 >= " + sqlGenerator.currentDate() + " group by ml.id having"); + amountQueryString.append(" and mr.duedate >= " + sqlGenerator.currentBusinessDate() + " group by ml.id having"); 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)) + "); @@ -331,9 +335,7 @@ public class PortfolioAccountReadPlatformServiceImpl implements PortfolioAccount sqlBuilder.append("left join m_staff s ON s.id = la.loan_officer_id "); this.schemaSql = sqlBuilder.toString(); - } - public String schema() { return this.schemaSql; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionReadPlatformServiceImpl.java index ce97e2bff..da2d4ab46 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/StandingInstructionReadPlatformServiceImpl.java @@ -186,7 +186,7 @@ public class StandingInstructionReadPlatformServiceImpl implements StandingInstr } // defaults - final LocalDate transferDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transferDate = DateUtils.getBusinessLocalDate(); Collection toOfficeOptions = fromOfficeOptions; Collection toClientOptions = null; @@ -334,12 +334,13 @@ public class StandingInstructionReadPlatformServiceImpl implements StandingInstr @Override public Collection retrieveAll(final Integer status) { final StringBuilder sqlBuilder = new StringBuilder(200); + String businessDate = sqlGenerator.currentBusinessDate(); sqlBuilder.append("select "); sqlBuilder.append(this.standingInstructionMapper.schema()); sqlBuilder - .append(" where atsi.status=? and " + sqlGenerator.currentDate() + " >= atsi.valid_from and (atsi.valid_till IS NULL or " - + sqlGenerator.currentDate() + " < atsi.valid_till) ") - .append(" and (atsi.last_run_date <> " + sqlGenerator.currentDate() + " or atsi.last_run_date IS NULL)") + .append(" where atsi.status=? and " + businessDate + " >= atsi.valid_from and (atsi.valid_till IS NULL or " + businessDate + + " < atsi.valid_till) ") + .append(" and (atsi.last_run_date <> " + businessDate + " or atsi.last_run_date IS NULL)") .append(" ORDER BY atsi.priority DESC"); return this.jdbcTemplate.query(sqlBuilder.toString(), this.standingInstructionMapper, status); } @@ -359,7 +360,7 @@ public class StandingInstructionReadPlatformServiceImpl implements StandingInstr @Override public StandingInstructionDuesData retriveLoanDuesData(final Long loanId) { final StandingInstructionLoanDuesMapper rm = new StandingInstructionLoanDuesMapper(); - final String sql = "select " + rm.schema() + " where ml.id= ? and ls.duedate <= " + sqlGenerator.currentDate() + final String sql = "select " + rm.schema() + " where ml.id= ? and ls.duedate <= " + sqlGenerator.currentBusinessDate() + " and ls.completed_derived <> 1"; return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { loanId }); // NOSONAR } 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 94949b5f6..aef3885dd 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 @@ -199,7 +199,7 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst Collection instructionDatas = this.standingInstructionReadPlatformService .retrieveAll(StandingInstructionStatus.ACTIVE.getValue()); List errors = new ArrayList<>(); - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); for (StandingInstructionData data : instructionDatas) { boolean isDueForTransfer = false; AccountTransferRecurrenceType recurrenceType = data.recurrenceType(); @@ -232,7 +232,7 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst transactionAmount = standingInstructionDuesData.totalDueAmount(); } if (recurrenceType.isDuesRecurrence()) { - isDueForTransfer = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()).equals(standingInstructionDuesData.dueDate()); + isDueForTransfer = DateUtils.getBusinessLocalDate().equals(standingInstructionDuesData.dueDate()); } } @@ -265,7 +265,7 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst StringBuilder errorLog = new StringBuilder(); StringBuilder updateQuery = new StringBuilder( "INSERT INTO m_account_transfer_standing_instructions_history (standing_instruction_id, " + sqlGenerator.escape("status") - + ", amount,execution_time, error_log) VALUES ("); + + ", amount, execution_time, error_log) VALUES ("); try { this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO); } catch (final PlatformApiDataValidationException e) { @@ -294,8 +294,8 @@ public class StandingInstructionWritePlatformServiceImpl implements StandingInst updateQuery.append("'success'").append(","); } updateQuery.append(accountTransferDTO.getTransactionAmount().doubleValue()); - updateQuery.append(", now(),"); - updateQuery.append("'").append(errorLog.toString()).append("')"); + updateQuery.append(", ").append(sqlGenerator.currentTenantDateTime()).append(" "); + updateQuery.append(", '").append(errorLog).append("')"); this.jdbcTemplate.update(updateQuery.toString()); return transferCompleted; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java index 46d98aafb..bbbe4ee7e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java @@ -190,7 +190,7 @@ public final class ClientDataValidator { if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.dateOfBirthParamName, element)) { final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed(ClientApiConstants.dateOfBirthParamName, element); baseDataValidator.reset().parameter(ClientApiConstants.dateOfBirthParamName).value(dateOfBirth).notNull() - .validateDateBefore(DateUtils.getLocalDateOfTenant()).validateDateBefore(submittedOnDate); + .validateDateBefore(DateUtils.getBusinessLocalDate()).validateDateBefore(submittedOnDate); } if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.genderIdParamName, element)) { @@ -497,7 +497,7 @@ public final class ClientDataValidator { atLeastOneParameterPassedForUpdate = true; final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed(ClientApiConstants.dateOfBirthParamName, element); baseDataValidator.reset().parameter(ClientApiConstants.dateOfBirthParamName).value(dateOfBirth).notNull() - .validateDateBefore(DateUtils.getLocalDateOfTenant()).validateDateBefore(submittedDate); + .validateDateBefore(DateUtils.getBusinessLocalDate()).validateDateBefore(submittedDate); } if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.legalFormIdParamName, element)) { @@ -824,7 +824,7 @@ public final class ClientDataValidator { final LocalDate undoRejectionDate = this.fromApiJsonHelper.extractLocalDateNamed(ClientApiConstants.reopenedDateParamName, element); baseDataValidator.reset().parameter(ClientApiConstants.reopenedDateParamName).value(undoRejectionDate).notNull() - .validateDateBeforeOrEqual(DateUtils.getLocalDateOfTenant()); + .validateDateBeforeOrEqual(DateUtils.getBusinessLocalDate()); throwExceptionIfValidationWarningsExist(dataValidationErrors); @@ -850,7 +850,7 @@ public final class ClientDataValidator { final LocalDate undoWithdrawnDate = this.fromApiJsonHelper.extractLocalDateNamed(ClientApiConstants.reopenedDateParamName, element); baseDataValidator.reset().parameter(ClientApiConstants.reopenedDateParamName).value(undoWithdrawnDate).notNull() - .validateDateBeforeOrEqual(DateUtils.getLocalDateOfTenant()); + .validateDateBeforeOrEqual(DateUtils.getBusinessLocalDate()); throwExceptionIfValidationWarningsExist(dataValidationErrors); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java index c8c32fb63..8c0c1b271 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java @@ -273,7 +273,7 @@ public final class Client extends AbstractPersistableCustom { officeJoiningDate = activationDate; } - LocalDate submittedOnDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate submittedOnDate = DateUtils.getBusinessLocalDate(); if (active && submittedOnDate.isAfter(activationDate)) { submittedOnDate = activationDate; } @@ -486,7 +486,7 @@ public final class Client extends AbstractPersistableCustom { } private boolean isDateInTheFuture(final LocalDate localDate) { - return localDate.isAfter(DateUtils.getLocalDateOfTenant()); + return localDate.isAfter(DateUtils.getBusinessLocalDate()); } public boolean isRejected() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java index 41ed98b6e..0a57859a8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/serialization/ClientFamilyMemberCommandFromApiJsonDeserializer.java @@ -24,7 +24,6 @@ import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -162,7 +161,7 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { if (this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element) != null) { final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element); baseDataValidator.reset().parameter("dateOfBirth").value(dateOfBirth).value(dateOfBirth).notNull() - .validateDateBefore(DateUtils.getLocalDateOfTenant()); + .validateDateBefore(DateUtils.getBusinessLocalDate()); } @@ -229,10 +228,8 @@ public final class ClientFamilyMemberCommandFromApiJsonDeserializer { } if (this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element) != null) { - LocalDateTime currentDate = LocalDateTime.now(DateUtils.getDateTimeZoneOfTenant()); - final LocalDate dateOfBirth = this.fromApiJsonHelper.extractLocalDateNamed("dateOfBirth", element); - baseDataValidator.reset().parameter("dateOfBirth").value(dateOfBirth).validateDateBefore(currentDate.toLocalDate()); + baseDataValidator.reset().parameter("dateOfBirth").value(dateOfBirth).validateDateBefore(DateUtils.getBusinessLocalDate()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceJpaRepositoryImpl.java index 6b36d9d37..8b3a65e17 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientChargeWritePlatformServiceJpaRepositoryImpl.java @@ -207,7 +207,7 @@ public class ClientChargeWritePlatformServiceJpaRepositoryImpl implements Client try { final Client client = this.clientRepository.getActiveClientInUserScope(clientId); final ClientCharge clientCharge = this.clientChargeRepository.findOneWithNotFoundDetection(clientChargeId); - final LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transactionDate = DateUtils.getBusinessLocalDate(); // Validate business rules for payment validateWaiverTransaction(client, clientCharge); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/data/CollectionSheetTransactionDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/data/CollectionSheetTransactionDataValidator.java index 7a95f72f6..31ed4ded4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/data/CollectionSheetTransactionDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/data/CollectionSheetTransactionDataValidator.java @@ -134,7 +134,7 @@ public class CollectionSheetTransactionDataValidator { final LocalDate transactionDate = this.fromApiJsonHelper.extractLocalDateNamed(CollectionSheetConstants.transactionDateParamName, element); baseDataValidator.reset().parameter(CollectionSheetConstants.transactionDateParamName).value(transactionDate).notNull() - .validateDateBeforeOrEqual(DateUtils.getLocalDateOfTenant()); + .validateDateBeforeOrEqual(DateUtils.getBusinessLocalDate()); final String note = this.fromApiJsonHelper.extractStringNamed(CollectionSheetConstants.noteParamName, element); if (StringUtils.isNotBlank(note)) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java index 7f98dd3c5..89f882a7e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java @@ -49,6 +49,7 @@ import org.apache.fineract.portfolio.floatingrates.data.FloatingRateDTO; import org.apache.fineract.portfolio.floatingrates.data.FloatingRatePeriodData; import org.apache.fineract.useradministration.domain.AppUser; +//TODO: refactor to use AbstractAuditableCustom! @Entity @Table(name = "m_floating_rates", uniqueConstraints = { @UniqueConstraint(columnNames = { "name" }, name = "unq_name") }) public class FloatingRate extends AbstractPersistableCustom { @@ -109,11 +110,9 @@ public class FloatingRate extends AbstractPersistableCustom { : false; final boolean isActive = command.parameterExists("isActive") ? command.booleanPrimitiveValueOfParameterNamed("isActive") : true; final List floatingRatePeriods = getRatePeriods(currentUser, command); - final LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + final Date currentDate = DateUtils.getBusinessDate(); - return new FloatingRate(name, isBaseLendingRate, isActive, floatingRatePeriods, currentUser, currentUser, - Date.from(currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant()), - Date.from(currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); + return new FloatingRate(name, isBaseLendingRate, isActive, floatingRatePeriods, currentUser, currentUser, currentDate, currentDate); } private static List getRatePeriods(final AppUser currentUser, final JsonCommand command) { @@ -132,7 +131,7 @@ public class FloatingRate extends AbstractPersistableCustom { ? ratePeriodObject.get("isDifferentialToBaseLendingRate").getAsBoolean() : false; final boolean isActive = true; - final Date currentDate = DateUtils.getDateOfTenant(); + final Date currentDate = DateUtils.getBusinessDate(); ratePeriods.add(new FloatingRatePeriod(fromDate, interestRate, isDifferentialToBaseLendingRate, isActive, currentUser, currentUser, currentDate, currentDate)); } @@ -204,7 +203,7 @@ public class FloatingRate extends AbstractPersistableCustom { } private void updateRatePeriods(final List newRatePeriods, final AppUser appUser) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); if (this.floatingRatePeriods != null) { for (FloatingRatePeriod ratePeriod : this.floatingRatePeriods) { LocalDate fromDate = LocalDate.ofInstant(ratePeriod.getFromDate().toInstant(), DateUtils.getDateTimeZoneOfTenant()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java index 6cd5bec1b..bba429b3c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java @@ -34,6 +34,7 @@ import org.apache.fineract.portfolio.floatingrates.data.FloatingRateDTO; import org.apache.fineract.portfolio.floatingrates.data.FloatingRatePeriodData; import org.apache.fineract.useradministration.domain.AppUser; +//TODO: refactor to use AbstractAuditableCustom! @Entity @Table(name = "m_floating_rates_periods") public class FloatingRatePeriod extends AbstractPersistableCustom { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java index 5ed2ecf8b..3888f1b03 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/serialization/FloatingRateDataValidator.java @@ -117,7 +117,7 @@ public class FloatingRateDataValidator { final LocalDate fromDate = this.fromApiJsonHelper.extractLocalDateNamed("fromDate", ratePeriod); baseDataValidator.reset().parameter("fromDate").parameterAtIndexArray("fromDate", i + 1).value(fromDate).notBlank() - .validateDateAfter(DateUtils.getLocalDateOfTenant().plusDays(1)); + .validateDateAfter(DateUtils.getBusinessLocalDate().plusDays(1)); if (fromDate != null) { fromDates.add(fromDate); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java index 4188f7ddd..fca2814f4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java @@ -283,7 +283,7 @@ public final class Group extends AbstractPersistableCustom { } private boolean isDateInTheFuture(final LocalDate localDate) { - return localDate.isAfter(DateUtils.getLocalDateOfTenant()); + return localDate.isAfter(DateUtils.getBusinessLocalDate()); } public boolean isNotPending() { @@ -446,7 +446,7 @@ public final class Group extends AbstractPersistableCustom { public void updateStaff(final Staff staff) { if (this.isCenter() && this.isActive()) { - LocalDate updatedDate = DateUtils.getLocalDateOfTenant(); + LocalDate updatedDate = DateUtils.getBusinessLocalDate(); reassignStaff(staff, updatedDate); } this.staff = staff; @@ -454,7 +454,7 @@ public final class Group extends AbstractPersistableCustom { public void unassignStaff() { if (this.isCenter() && this.isActive()) { - LocalDate dateOfStaffUnassigned = DateUtils.getLocalDateOfTenant(); + LocalDate dateOfStaffUnassigned = DateUtils.getBusinessLocalDate(); removeStaff(dateOfStaffUnassigned); } this.staff = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index 46cd443ee..07796811d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -154,7 +154,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group final Set groupMembers = assembleSetOfChildGroups(officeId, command); final boolean active = command.booleanPrimitiveValueOfParameterNamed(GroupingTypesApiConstants.activeParamName); - LocalDate submittedOnDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate submittedOnDate = DateUtils.getBusinessLocalDate(); if (active && submittedOnDate.isAfter(activationDate)) { submittedOnDate = activationDate; } @@ -509,7 +509,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group groupForUpdate.updateStaff(staff); if (inheritStaffForClientAccounts) { - LocalDate loanOfficerReassignmentDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate loanOfficerReassignmentDate = DateUtils.getBusinessLocalDate(); /* * update loan officer for client and update loan officer for clients loans and savings */ diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/domain/InterestRateChartFields.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/domain/InterestRateChartFields.java index 4bc9e51ea..c60b0a5cd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/domain/InterestRateChartFields.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/domain/InterestRateChartFields.java @@ -154,10 +154,10 @@ public class InterestRateChartFields { public boolean isOverlapping(InterestRateChartFields that) { final LocalDate thisFromDate = this.getFromDateAsLocalDate(); LocalDate thisEndDate = this.getEndDateAsLocalDate(); - thisEndDate = thisEndDate == null ? DateUtils.getLocalDateOfTenant() : thisEndDate; + thisEndDate = thisEndDate == null ? DateUtils.getBusinessLocalDate() : thisEndDate; final LocalDate thatFromDate = that.getFromDateAsLocalDate(); LocalDate thatEndDate = that.getEndDateAsLocalDate(); - thatEndDate = thatEndDate == null ? DateUtils.getLocalDateOfTenant() : thatEndDate; + thatEndDate = thatEndDate == null ? DateUtils.getBusinessLocalDate() : thatEndDate; final LocalDateInterval thisInterval = LocalDateInterval.create(thisFromDate, thisEndDate); final LocalDateInterval thatInterval = LocalDateInterval.create(thatFromDate, thatEndDate); @@ -169,7 +169,7 @@ public class InterestRateChartFields { } public boolean isApplicableChartFor(final LocalDate target) { - final LocalDate endDate = this.endDate == null ? DateUtils.getLocalDateOfTenant() : this.getEndDateAsLocalDate(); + final LocalDate endDate = this.endDate == null ? DateUtils.getBusinessLocalDate() : this.getEndDateAsLocalDate(); final LocalDateInterval interval = LocalDateInterval.create(getFromDateAsLocalDate(), endDate); return interval.contains(target); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/incentive/ClientAttributeIncentiveCalculation.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/incentive/ClientAttributeIncentiveCalculation.java index 05d756e6f..f705d9871 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/incentive/ClientAttributeIncentiveCalculation.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/incentive/ClientAttributeIncentiveCalculation.java @@ -42,12 +42,11 @@ public class ClientAttributeIncentiveCalculation extends AttributeIncentiveCalcu break; case AGE: if (client.dateOfBirth() != null) { - final LocalDate dobLacalDate = LocalDate.ofInstant(client.dateOfBirth().toInstant(), + final LocalDate dobLocalDate = LocalDate.ofInstant(client.dateOfBirth().toInstant(), DateUtils.getDateTimeZoneOfTenant()); - final int age = Math - .toIntExact(ChronoUnit.YEARS.between(dobLacalDate, LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))); + final int age = Math.toIntExact(ChronoUnit.YEARS.between(dobLocalDate, DateUtils.getBusinessLocalDate())); applyIncentive = applyIncentive(incentivesFields.conditionType(), Long.valueOf(incentivesFields.attributeValue()), - Long.valueOf(age)); + (long) age); } break; case CLIENT_TYPE: diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java index f23cd5fce..4eed49599 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java @@ -135,15 +135,15 @@ public class LoanTransactionsApiResource { if (is(commandParam, "repayment")) { transactionData = this.loanReadPlatformService.retrieveLoanTransactionTemplate(loanId); } else if (is(commandParam, "merchantIssuedRefund")) { - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); transactionData = this.loanReadPlatformService.retrieveLoanPrePaymentTemplate(LoanTransactionType.MERCHANT_ISSUED_REFUND, loanId, transactionDate); } else if (is(commandParam, "payoutRefund")) { - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); transactionData = this.loanReadPlatformService.retrieveLoanPrePaymentTemplate(LoanTransactionType.PAYOUT_REFUND, loanId, transactionDate); } else if (is(commandParam, "goodwillCredit")) { - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); transactionData = this.loanReadPlatformService.retrieveLoanPrePaymentTemplate(LoanTransactionType.GOODWILL_CREDIT, loanId, transactionDate); } else if (is(commandParam, "waiveinterest")) { @@ -167,7 +167,7 @@ public class LoanTransactionsApiResource { } else if (is(commandParam, "prepayLoan")) { LocalDate transactionDate = null; if (transactionDateParam == null) { - transactionDate = DateUtils.getLocalDateOfTenant(); + transactionDate = DateUtils.getBusinessLocalDate(); } else { transactionDate = LocalDate.ofInstant(transactionDateParam.getDate("transactionDate", dateFormat, locale).toInstant(), DateUtils.getDateTimeZoneOfTenant()); @@ -181,7 +181,7 @@ public class LoanTransactionsApiResource { } else if (is(commandParam, "foreclosure")) { LocalDate transactionDate = null; if (transactionDateParam == null) { - transactionDate = DateUtils.getLocalDateOfTenant(); + transactionDate = DateUtils.getBusinessLocalDate(); } else { transactionDate = LocalDate.ofInstant(transactionDateParam.getDate("transactionDate", dateFormat, locale).toInstant(), DateUtils.getDateTimeZoneOfTenant()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 9592397e5..d89bed39c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -704,7 +704,7 @@ public class Loan extends AbstractPersistableCustom { transactionDate = suppliedTransactionDate; } else { transactionDate = loanCharge.getDueLocalDate(); - final LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + final LocalDate currentDate = DateUtils.getBusinessLocalDate(); // if loan charge is to be applied on a future date, the loan // transaction would show todays date as applied date @@ -1045,8 +1045,8 @@ public class Loan extends AbstractPersistableCustom { LocalDate transactionDate = getDisbursementDate(); if (loanCharge.isDueDateCharge()) { - if (loanCharge.getDueLocalDate().isAfter(DateUtils.getLocalDateOfTenant())) { - transactionDate = DateUtils.getLocalDateOfTenant(); + if (loanCharge.getDueLocalDate().isAfter(DateUtils.getBusinessLocalDate())) { + transactionDate = DateUtils.getBusinessLocalDate(); } else { transactionDate = loanCharge.getDueLocalDate(); } @@ -1067,8 +1067,8 @@ public class Loan extends AbstractPersistableCustom { waiveLoanChargeTransaction.getAmount(getCurrency()).getAmount(), loanInstallmentNumber); waiveLoanChargeTransaction.getLoanChargesPaid().add(loanChargePaidBy); addLoanTransaction(waiveLoanChargeTransaction); - if (this.repaymentScheduleDetail().isInterestRecalculationEnabled() && (loanCharge.getDueLocalDate() == null - || LocalDate.now(DateUtils.getDateTimeZoneOfTenant()).isAfter(loanCharge.getDueLocalDate()))) { + if (this.repaymentScheduleDetail().isInterestRecalculationEnabled() + && (loanCharge.getDueLocalDate() == null || DateUtils.getBusinessLocalDate().isAfter(loanCharge.getDueLocalDate()))) { regenerateRepaymentScheduleWithInterestRecalculation(scheduleGeneratorDTO, currentUser); } // Waive of charges whose due date falls after latest 'repayment' @@ -1562,9 +1562,9 @@ public class Loan extends AbstractPersistableCustom { } // the comparison should be done with the tenant date - // (DateUtils.getLocalDateOfTenant()) and not the server date (new + // (DateUtils.getBusinessDate()) and not the server date (new // LocalDate()) - if (getSubmittedOnDate().isAfter(DateUtils.getLocalDateOfTenant())) { + if (getSubmittedOnDate().isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is submitted cannot be in the future."; throw new InvalidLoanStateTransitionException("submittal", "cannot.be.a.future.date", errorMessage, getSubmittedOnDate()); } @@ -1774,7 +1774,7 @@ public class Loan extends AbstractPersistableCustom { private BigDecimal calculateOverdueAmountPercentageAppliedTo(final LoanCharge loanCharge, final int penaltyWaitPeriod) { LoanRepaymentScheduleInstallment installment = loanCharge.getOverdueInstallmentCharge().getInstallment(); - LocalDate graceDate = DateUtils.getLocalDateOfTenant().minusDays(penaltyWaitPeriod); + LocalDate graceDate = DateUtils.getBusinessLocalDate().minusDays(penaltyWaitPeriod); Money amount = Money.zero(getCurrency()); if (graceDate.isAfter(installment.getDueDate())) { amount = calculateOverdueAmountPercentageAppliedTo(installment, loanCharge.getChargeCalculation()); @@ -2090,7 +2090,7 @@ public class Loan extends AbstractPersistableCustom { updateLoanScheduleDependentDerivedFields(); - if (submittedOn.isAfter(DateUtils.getLocalDateOfTenant())) { + if (submittedOn.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is submitted cannot be in the future."; throw new InvalidLoanStateTransitionException("submittal", "cannot.be.a.future.date", errorMessage, submittedOn); } @@ -2190,7 +2190,7 @@ public class Loan extends AbstractPersistableCustom { validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.LOAN_REJECTED, rejectedOn); - if (rejectedOn.isAfter(DateUtils.getLocalDateOfTenant())) { + if (rejectedOn.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is rejected cannot be in the future."; throw new InvalidLoanStateTransitionException("reject", "cannot.be.a.future.date", errorMessage, rejectedOn); } @@ -2239,7 +2239,7 @@ public class Loan extends AbstractPersistableCustom { validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.LOAN_WITHDRAWN, withdrawnOn); - if (withdrawnOn.isAfter(DateUtils.getLocalDateOfTenant())) { + if (withdrawnOn.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is withdrawn cannot be in the future."; throw new InvalidLoanStateTransitionException("withdraw", "cannot.be.a.future.date", errorMessage, command); } @@ -2355,7 +2355,7 @@ public class Loan extends AbstractPersistableCustom { validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.LOAN_APPROVED, approvedOn); - if (approvedOn.isAfter(DateUtils.getLocalDateOfTenant())) { + if (approvedOn.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is approved cannot be in the future."; throw new InvalidLoanStateTransitionException("approval", "cannot.be.a.future.date", errorMessage, getApprovedOnDate()); } @@ -2513,7 +2513,7 @@ public class Loan extends AbstractPersistableCustom { LocalDate firstInstallmentDueDate = fetchRepaymentScheduleInstallment(1).getDueDate(); if (interestRecalculationEnabledParam - && (firstInstallmentDueDate.isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())) || disbursementMissedParam)) { + && (firstInstallmentDueDate.isBefore(DateUtils.getBusinessLocalDate()) || disbursementMissedParam)) { regenerateRepaymentScheduleWithInterestRecalculation(scheduleGeneratorDTO, currentUser); } @@ -2729,8 +2729,8 @@ public class Loan extends AbstractPersistableCustom { private boolean isDisbursementMissed() { boolean isDisbursementMissed = false; for (LoanDisbursementDetails disbursementDetail : this.disbursementDetails) { - if (disbursementDetail.actualDisbursementDate() == null && LocalDate.now(DateUtils.getDateTimeZoneOfTenant()) - .isAfter(disbursementDetail.expectedDisbursementDateAsLocalDate())) { + if (disbursementDetail.actualDisbursementDate() == null + && DateUtils.getBusinessLocalDate().isAfter(disbursementDetail.expectedDisbursementDateAsLocalDate())) { isDisbursementMissed = true; break; } @@ -2840,7 +2840,7 @@ public class Loan extends AbstractPersistableCustom { if (loanProduct.isLinkedToFloatingInterestRate()) { floatingRateDTO.resetInterestRateDiff(); Collection applicableRates = loanProduct.fetchInterestRates(floatingRateDTO); - LocalDate interestRateStartDate = DateUtils.getLocalDateOfTenant(); + LocalDate interestRateStartDate = DateUtils.getBusinessLocalDate(); for (FloatingRatePeriodData periodData : applicableRates) { LoanTermVariationsData loanTermVariation = new LoanTermVariationsData( LoanEnumerations.loanvariationType(LoanTermVariationType.INTEREST_RATE), periodData.getFromDateAsLocalDate(), @@ -2932,7 +2932,7 @@ public class Loan extends AbstractPersistableCustom { validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.LOAN_DISBURSED, disbursedOn); - if (disbursedOn.isAfter(DateUtils.getLocalDateOfTenant())) { + if (disbursedOn.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan with identifier : " + this.accountNumber + " is disbursed cannot be in the future."; throw new InvalidLoanStateTransitionException("disbursal", "cannot.be.a.future.date", errorMessage, disbursedOn); @@ -3132,7 +3132,7 @@ public class Loan extends AbstractPersistableCustom { validateRepaymentDateIsOnNonWorkingDay(paymentTransaction.getTransactionDate(), holidayDetailDTO.getWorkingDays(), holidayDetailDTO.isAllowTransactionsOnNonWorkingDay()); - if (paymentTransaction.getTransactionDate().isAfter(DateUtils.getLocalDateOfTenant())) { + if (paymentTransaction.getTransactionDate().isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan charge paid cannot be in the future."; throw new InvalidLoanStateTransitionException("charge.payment", "cannot.be.a.future.date", errorMessage, paymentTransaction.getTransactionDate()); @@ -3231,7 +3231,7 @@ public class Loan extends AbstractPersistableCustom { loanTransactionDate, getDisbursementDate()); } - if (loanTransactionDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (loanTransactionDate.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The transaction date cannot be in the future."; throw new InvalidLoanStateTransitionException("transaction", "cannot.be.a.future.date", errorMessage, loanTransactionDate); } @@ -3265,7 +3265,7 @@ public class Loan extends AbstractPersistableCustom { boolean reprocess = true; if (!isForeclosure() && isTransactionChronologicallyLatest && adjustedTransaction == null - && loanTransaction.getTransactionDate().isEqual(DateUtils.getLocalDateOfTenant()) && currentInstallment != null + && loanTransaction.getTransactionDate().isEqual(DateUtils.getBusinessLocalDate()) && currentInstallment != null && currentInstallment.getTotalOutstanding(getCurrency()).isEqualTo(loanTransaction.getAmount(getCurrency()))) { reprocess = false; } @@ -3570,7 +3570,7 @@ public class Loan extends AbstractPersistableCustom { } public LocalDate possibleNextRepaymentDate() { - LocalDate earliestUnpaidInstallmentDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate earliestUnpaidInstallmentDate = DateUtils.getBusinessLocalDate(); List installments = getRepaymentScheduleInstallments(); for (final LoanRepaymentScheduleInstallment installment : installments) { if (installment.isNotFullyPaidOff()) { @@ -3611,7 +3611,7 @@ public class Loan extends AbstractPersistableCustom { final Money totalInterestOutstanding = getTotalInterestOutstandingOnLoan(); Money possibleInterestToWaive = totalInterestOutstanding.copy(); - LocalDate transactionDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); if (totalInterestOutstanding.isGreaterThanZero()) { // find earliest known instance of overdue interest and default to @@ -3620,8 +3620,8 @@ public class Loan extends AbstractPersistableCustom { for (final LoanRepaymentScheduleInstallment scheduledRepayment : installments) { final Money outstandingForPeriod = scheduledRepayment.getInterestOutstanding(loanCurrency()); - if (scheduledRepayment.isOverdueOn(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())) - && scheduledRepayment.isNotFullyPaidOff() && outstandingForPeriod.isGreaterThanZero()) { + if (scheduledRepayment.isOverdueOn(DateUtils.getBusinessLocalDate()) && scheduledRepayment.isNotFullyPaidOff() + && outstandingForPeriod.isGreaterThanZero()) { transactionDate = scheduledRepayment.getDueDate(); possibleInterestToWaive = outstandingForPeriod; break; @@ -3799,7 +3799,7 @@ public class Loan extends AbstractPersistableCustom { validateActivityNotBeforeClientOrGroupTransferDate(LoanEvent.WRITE_OFF_OUTSTANDING, writtenOffOnLocalDate); - if (writtenOffOnLocalDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (writtenOffOnLocalDate.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is written off cannot be in the future."; throw new InvalidLoanStateTransitionException("writeoff", "cannot.be.a.future.date", errorMessage, writtenOffOnLocalDate); } @@ -3883,7 +3883,7 @@ public class Loan extends AbstractPersistableCustom { getDisbursementDate()); } - if (closureDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (closureDate.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is closed cannot be in the future."; throw new InvalidLoanStateTransitionException("close", "cannot.be.a.future.date", errorMessage, closureDate); } @@ -3980,7 +3980,7 @@ public class Loan extends AbstractPersistableCustom { rescheduledOnLocalDate, getDisbursementDate()); } - if (rescheduledOnLocalDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (rescheduledOnLocalDate.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The date on which a loan is rescheduled cannot be in the future."; throw new InvalidLoanStateTransitionException("close.reschedule", "cannot.be.a.future.date", errorMessage, rescheduledOnLocalDate); @@ -4214,7 +4214,7 @@ public class Loan extends AbstractPersistableCustom { for (final LoanRepaymentScheduleInstallment scheduledRepayment : installments) { final Money interestOutstandingForPeriod = scheduledRepayment.getInterestOutstanding(loanCurrency()); - if (scheduledRepayment.isOverdueOn(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))) { + if (scheduledRepayment.isOverdueOn(DateUtils.getBusinessLocalDate())) { cumulativeInterestOverdue = cumulativeInterestOverdue.plus(interestOutstandingForPeriod); } } @@ -4288,7 +4288,7 @@ public class Loan extends AbstractPersistableCustom { throw new LoanOfficerAssignmentDateException("cannot.be.before.previous.unassignement.date", errorMessage, assignmentDate, lastAssignmentRecord.getEndDate()); - } else if (DateUtils.getLocalDateOfTenant().isBefore(assignmentDate)) { + } else if (DateUtils.getBusinessLocalDate().isBefore(assignmentDate)) { final String errorMessage = "The Loan Officer assignment date (" + assignmentDate + ") cannot be in the future."; @@ -4332,7 +4332,7 @@ public class Loan extends AbstractPersistableCustom { private void validateUnassignDate(final LoanOfficerAssignmentHistory latestHistoryRecord, final LocalDate unassignDate) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); if (latestHistoryRecord.getStartDate().isAfter(unassignDate)) { @@ -4616,7 +4616,7 @@ public class Loan extends AbstractPersistableCustom { // FIXME: AA this won't update repayment dates before current date. - if (oldDueDate.isAfter(seedDate) && oldDueDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (oldDueDate.isAfter(seedDate) && oldDueDate.isAfter(DateUtils.getBusinessLocalDate())) { newRepaymentDate = CalendarUtils.getNewRepaymentMeetingDate(recuringRule, seedDate, oldDueDate, loanRepaymentInterval, frequency, workingDays, isSkipRepaymentonfirstdayofmonth, numberofDays); @@ -5421,7 +5421,7 @@ public class Loan extends AbstractPersistableCustom { return; } updateLoanSchedule(loanSchedule.getInstallments(), currentUser); - this.interestRecalculatedOn = DateUtils.getDateOfTenant(); + this.interestRecalculatedOn = DateUtils.getBusinessDate(); LocalDate lastRepaymentDate = this.getLastRepaymentPeriodDueDate(true); Set charges = this.charges(); for (final LoanCharge loanCharge : charges) { @@ -5475,7 +5475,7 @@ public class Loan extends AbstractPersistableCustom { List incomeTransactions = retreiveListOfIncomePostingTransactions(); List accrualTransactions = retreiveListOfAccrualTransactions(); for (LoanInterestRecalcualtionAdditionalDetails compoundingDetail : compoundingDetails) { - if (!compoundingDetail.getEffectiveDate().isBefore(DateUtils.getLocalDateOfTenant())) { + if (!compoundingDetail.getEffectiveDate().isBefore(DateUtils.getBusinessLocalDate())) { break; } LoanTransaction incomeTransaction = getTransactionForDate(incomeTransactions, compoundingDetail.getEffectiveDate()); @@ -5775,9 +5775,9 @@ public class Loan extends AbstractPersistableCustom { feeCharges = feeCharges.plus(scheduledRepayment.getFeeChargesOutstanding(loanCurrency())); penaltyCharges = penaltyCharges.plus(scheduledRepayment.getPenaltyChargesOutstanding(loanCurrency())); } - return new LoanRepaymentScheduleInstallment(null, 0, LocalDate.now(DateUtils.getDateTimeZoneOfTenant()), - LocalDate.now(DateUtils.getDateTimeZoneOfTenant()), totalPrincipal.getAmount(), totalInterest.getAmount(), - feeCharges.getAmount(), penaltyCharges.getAmount(), false, compoundingDetails); + LocalDate businessDate = DateUtils.getBusinessLocalDate(); + return new LoanRepaymentScheduleInstallment(null, 0, businessDate, businessDate, totalPrincipal.getAmount(), + totalInterest.getAmount(), feeCharges.getAmount(), penaltyCharges.getAmount(), false, compoundingDetails); } public LocalDate getAccruedTill() { @@ -6217,7 +6217,7 @@ public class Loan extends AbstractPersistableCustom { loanTransactionDate, getDisbursementDate()); } - if (loanTransactionDate.isAfter(DateUtils.getLocalDateOfTenant())) { + if (loanTransactionDate.isAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "The transaction date cannot be in the future."; throw new InvalidLoanStateTransitionException("transaction", "cannot.be.a.future.date", errorMessage, loanTransactionDate); } @@ -6257,7 +6257,7 @@ public class Loan extends AbstractPersistableCustom { public LocalDate possibleNextRefundDate() { - final LocalDate now = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + final LocalDate now = DateUtils.getBusinessLocalDate(); LocalDate lastTransactionDate = null; for (final LoanTransaction transaction : this.loanTransactions) { @@ -6435,7 +6435,7 @@ public class Loan extends AbstractPersistableCustom { */ public LocalDate getNextPossibleRepaymentDateForRescheduling() { List loanDisbursementDetails = this.disbursementDetails; - LocalDate nextRepaymentDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate nextRepaymentDate = DateUtils.getBusinessLocalDate(); for (LoanDisbursementDetails loanDisbursementDetail : loanDisbursementDetails) { if (loanDisbursementDetail.actualDisbursementDate() == null) { List installments = getRepaymentScheduleInstallments(); @@ -6500,7 +6500,7 @@ public class Loan extends AbstractPersistableCustom { Money totalPrincipal = Money.of(getCurrency(), this.getSummary().getTotalPrincipalOutstanding()); totalPrincipal = totalPrincipal.minus(receivables[3]); final Set compoundingDetails = null; - final LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + final LocalDate currentDate = DateUtils.getBusinessLocalDate(); return new LoanRepaymentScheduleInstallment(null, 0, currentDate, currentDate, totalPrincipal.getAmount(), receivables[0].getAmount(), receivables[1].getAmount(), receivables[2].getAmount(), false, compoundingDetails); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 41b2f1236..f26039000 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -546,7 +546,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { } boolean isOrganisationDateEnabled = this.configurationDomainService.isOrganisationstartDateEnabled(); - Date organisationStartDate = new Date(); + Date organisationStartDate = DateUtils.getBusinessDate(); if (isOrganisationDateEnabled) { organisationStartDate = this.configurationDomainService.retrieveOrganisationStartDate(); } @@ -566,7 +566,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { for (LoanRepaymentScheduleInstallment installment : installments) { if (installment.getDueDate().isAfter(loan.getMaturityDate())) { - accruedTill = DateUtils.getLocalDateOfTenant(); + accruedTill = DateUtils.getBusinessLocalDate(); } if (!isOrganisationDateEnabled || LocalDate.ofInstant(organisationStartDate.toInstant(), DateUtils.getDateTimeZoneOfTenant()) .isBefore(installment.getDueDate())) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java index dd52ed73d..ebb1bcc18 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java @@ -348,7 +348,7 @@ public class LoanTransaction extends AbstractPersistableCustom { this.paymentDetail = paymentDetail; this.office = office; this.externalId = externalId; - this.submittedOnDate = DateUtils.getDateOfTenant(); + this.submittedOnDate = DateUtils.getBusinessDate(); this.createdDate = Date.from(createdDate.atZone(DateUtils.getDateTimeZoneOfTenant()).toInstant()); this.appUser = appUser; } @@ -376,7 +376,7 @@ public class LoanTransaction extends AbstractPersistableCustom { this.dateOf = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()); this.externalId = externalId; this.office = office; - this.submittedOnDate = DateUtils.getDateOfTenant(); + this.submittedOnDate = DateUtils.getBusinessDate(); this.createdDate = Date.from(createdDate.atZone(DateUtils.getDateTimeZoneOfTenant()).toInstant()); this.appUser = appUser; } @@ -391,7 +391,7 @@ public class LoanTransaction extends AbstractPersistableCustom { this.dateOf = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()); this.externalId = externalId; this.office = office; - this.submittedOnDate = DateUtils.getDateOfTenant(); + this.submittedOnDate = DateUtils.getBusinessDate(); this.createdDate = Date.from(createdDate.atZone(DateUtils.getDateTimeZoneOfTenant()).toInstant()); this.appUser = appUser; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorDomainServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorDomainServiceImpl.java index 442c95d4b..4c795b962 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorDomainServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorDomainServiceImpl.java @@ -211,7 +211,7 @@ public class GuarantorDomainServiceImpl implements GuarantorDomainService { final List existGuarantorList = this.guarantorRepository.findByLoan(loan); final boolean isRegularTransaction = true; final boolean isExceptionForBalanceCheck = true; - LocalDate transactionDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); PortfolioAccountType fromAccountType = PortfolioAccountType.SAVINGS; PortfolioAccountType toAccountType = PortfolioAccountType.LOAN; final Long toAccountId = loan.getId(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java index cb71cb78f..8439f3e6a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/guarantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.portfolio.loanaccount.guarantor.service; -import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -125,7 +124,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto guarantorFundingDetails.add(fundingDetails); if (loan.isDisbursed() || (loan.isApproved() && (loan.getGuaranteeAmount() != null || loan.loanProduct().isHoldGuaranteeFundsEnabled()))) { - this.guarantorDomainService.assignGuarantor(fundingDetails, LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + this.guarantorDomainService.assignGuarantor(fundingDetails, DateUtils.getBusinessLocalDate()); loan.updateGuaranteeAmount(fundingDetails.getAmount()); } } @@ -312,7 +311,7 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto GuarantorFundStatusType fundStatusType = GuarantorFundStatusType.DELETED; if (guarantorForDelete.getLoan().isDisbursed() || guarantorForDelete.getLoan().isApproved()) { fundStatusType = GuarantorFundStatusType.WITHDRAWN; - this.guarantorDomainService.releaseGuarantor(guarantorFundingDetails, LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + this.guarantorDomainService.releaseGuarantor(guarantorFundingDetails, DateUtils.getBusinessLocalDate()); } guarantorForDelete.updateStatus(guarantorFundingDetails, fundStatusType); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java index dfbdf7d5e..6b2ae0b6f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java @@ -193,7 +193,7 @@ public final class LoanSchedulePeriodData { this.totalOutstandingForPeriod = this.feeChargesOutstanding; this.totalActualCostOfLoanForPeriod = this.feeChargesDue; this.totalInstallmentAmountForPeriod = null; - if (dueDate.isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))) { + if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) { this.totalOverdue = this.totalOutstandingForPeriod; } else { this.totalOverdue = null; @@ -255,7 +255,7 @@ public final class LoanSchedulePeriodData { this.totalActualCostOfLoanForPeriod = interestDueOnPrincipalOutstanding.add(feeChargesDueForPeriod); this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod; - if (dueDate.isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))) { + if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) { this.totalOverdue = this.totalOutstandingForPeriod; } else { this.totalOverdue = null; @@ -326,7 +326,7 @@ public final class LoanSchedulePeriodData { this.totalActualCostOfLoanForPeriod = totalActualCostOfLoanForPeriod; this.totalInstallmentAmountForPeriod = totalInstallmentAmountForPeriod; - if (dueDate.isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))) { + if (dueDate.isBefore(DateUtils.getBusinessLocalDate())) { this.totalOverdue = this.totalOutstandingForPeriod; } else { this.totalOverdue = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java index 4f906e76e..177451de1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AbstractLoanScheduleGenerator.java @@ -146,7 +146,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener // set and handled separately after all installments generated final Set nonCompoundingCharges = seperateTotalCompoundingPercentageCharges(loanCharges); - LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + LocalDate currentDate = DateUtils.getBusinessLocalDate(); LocalDate lastRestDate = currentDate; if (loanApplicationTerms.getRestCalendarInstance() != null) { lastRestDate = getNextRestScheduleDate(currentDate.minusDays(1), loanApplicationTerms, holidayDetailDTO); @@ -1596,7 +1596,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener final MonetaryCurrency currency, final Map latePaymentMap, final LocalDate scheduledDueDate, List installments, boolean applyRestFrequencyForPrincipal, final LocalDate lastRestDate) { latePaymentMap.clear(); - LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + LocalDate currentDate = DateUtils.getBusinessLocalDate(); Money totalCompoundingAmount = Money.zero(currency); for (LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment : installments) { @@ -1632,10 +1632,10 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener for (LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment : params.getInstallments()) { if (params.getCompoundingDateVariations().containsKey(loanRepaymentScheduleInstallment.getFromDate())) { lastInstallmentIsPastDate = params.applyInterestRecalculation() - && loanRepaymentScheduleInstallment.getDueDate().isBefore(DateUtils.getLocalDateOfTenant()); + && loanRepaymentScheduleInstallment.getDueDate().isBefore(DateUtils.getBusinessLocalDate()); } else { final boolean isPastDate = params.applyInterestRecalculation() - && loanRepaymentScheduleInstallment.getDueDate().isBefore(DateUtils.getLocalDateOfTenant()); + && loanRepaymentScheduleInstallment.getDueDate().isBefore(DateUtils.getBusinessLocalDate()); boolean periodHasCompoundingDate = false; Money amountCharged = Money.zero(currency); if (loanApplicationTerms.getInterestRecalculationCompoundingMethod() != null) { @@ -1915,7 +1915,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener periods.add(disbursementPeriod); principal = principal.add(disbursementData.amount()); } else if (!excludePastUndisbursed || disbursementData.isDisbursed() - || !disbursementData.disbursementDate().isBefore(DateUtils.getLocalDateOfTenant())) { + || !disbursementData.disbursementDate().isBefore(DateUtils.getBusinessLocalDate())) { /* * JW: sums up amounts by disbursal date in case of side-effect issues. Original assumed that there were * no duplicate disbursal dates and 'put' each amount into the map keyed by date @@ -2124,7 +2124,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener // interest calculation final TreeMap compoundingMap = new TreeMap<>(); final Map> compoundingDateVariations = new HashMap<>(); - LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + LocalDate currentDate = DateUtils.getBusinessLocalDate(); LocalDate lastRestDate = currentDate; if (loanApplicationTerms.isInterestRecalculationEnabled()) { lastRestDate = getNextRestScheduleDate(currentDate.minusDays(1), loanApplicationTerms, holidayDetailDTO); @@ -2494,7 +2494,7 @@ public abstract class AbstractLoanScheduleGenerator implements LoanScheduleGener } compoundingDateVariations.put(installment.getFromDate(), compoundingMap); if (totalCompounded.isGreaterThanZero()) { - final boolean isPastDate = installment.getDueDate().isBefore(DateUtils.getLocalDateOfTenant()); + final boolean isPastDate = installment.getDueDate().isBefore(DateUtils.getBusinessLocalDate()); final LocalDate restDate = getNextRestScheduleDate(installment.getDueDate().minusDays(1), loanApplicationTerms, holidayDetailDTO); if (isPastDate) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java index 1045aa321..8d7432d8e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleAssembler.java @@ -418,7 +418,7 @@ public class LoanScheduleAssembler { baseLendingRatePeriods); Collection applicableRates = loanProduct.fetchInterestRates(floatingRateDTO); - LocalDate interestRateStartDate = DateUtils.getLocalDateOfTenant(); + LocalDate interestRateStartDate = DateUtils.getBusinessLocalDate(); final LocalDate dateValue = null; final boolean isSpecificToInstallment = false; for (FloatingRatePeriodData periodData : applicableRates) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java index fa2e85160..2dbaaa154 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/service/LoanScheduleCalculationPlatformServiceImpl.java @@ -144,7 +144,7 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC final Loan loan = this.loanAssembler.assembleFrom(loanId); - LocalDate today = DateUtils.getLocalDateOfTenant(); + LocalDate today = DateUtils.getBusinessLocalDate(); final LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanRepaymentScheduleTransactionProcessorFactory .determineProcessor(loan.transactionProcessingStrategy()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java index 92daeedcd..a9aad716e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestWritePlatformServiceImpl.java @@ -496,7 +496,7 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche } loan.updateRescheduledByUser(appUser); - loan.updateRescheduledOnDate(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + loan.updateRescheduledOnDate(DateUtils.getBusinessLocalDate()); // update the status of the request loanRescheduleRequest.approve(appUser, approvedOnDate); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualPlatformServiceImpl.java index 49cb18261..c72390349 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualPlatformServiceImpl.java @@ -83,7 +83,7 @@ public class LoanAccrualPlatformServiceImpl implements LoanAccrualPlatformServic @CronTarget(jobName = JobName.ADD_PERIODIC_ACCRUAL_ENTRIES) public void addPeriodicAccruals() throws JobExecutionException { try { - addPeriodicAccruals(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + addPeriodicAccruals(DateUtils.getBusinessLocalDate()); } catch (MultiException e) { throw new JobExecutionException(e); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java index adf17a0c6..634376741 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java @@ -272,7 +272,7 @@ public class LoanAccrualWritePlatformServiceImpl implements LoanAccrualWritePlat + "fee_charges_portion_derived,penalty_charges_portion_derived, submitted_on_date) VALUES (?, ?, false, ?, ?, ?, ?, ?, ?, ?)"; this.jdbcTemplate.update(transactionSql, scheduleAccrualData.getLoanId(), scheduleAccrualData.getOfficeId(), LoanTransactionType.ACCRUAL.getValue(), Date.from(accruedTill.atStartOfDay(ZoneId.systemDefault()).toInstant()), amount, - interestportion, feeportion, penaltyportion, DateUtils.getDateOfTenant()); + interestportion, feeportion, penaltyportion, DateUtils.getBusinessDate()); @SuppressWarnings("deprecation") final Long transactonId = this.jdbcTemplate.queryForObject("SELECT " + sqlGenerator.lastInsertId(), Long.class); // NOSONAR diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java index bedca8d9e..d512fd5ed 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanArrearsAgingServiceImpl.java @@ -124,7 +124,8 @@ public class LoanArrearsAgingServiceImpl implements LoanArrearsAgingService { updateSqlBuilder.append(" WHERE ml.loan_status_id = 300 "); // active updateSqlBuilder.append(" and mr.completed_derived is false "); updateSqlBuilder.append(" and mr.duedate < ") - .append(sqlGenerator.subDate(sqlGenerator.currentDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day")).append(" "); + .append(sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day")) + .append(" "); updateSqlBuilder.append(" and (prd.arrears_based_on_original_schedule = false or prd.arrears_based_on_original_schedule is null) "); updateSqlBuilder.append(" GROUP BY ml.id"); @@ -180,9 +181,10 @@ public class LoanArrearsAgingServiceImpl implements LoanArrearsAgingService { BigDecimal interestOverdue = BigDecimal.ZERO; BigDecimal feeOverdue = BigDecimal.ZERO; BigDecimal penaltyOverdue = BigDecimal.ZERO; - LocalDate overDueSince = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate businessDate = DateUtils.getBusinessLocalDate(); + LocalDate overDueSince = businessDate; for (LoanRepaymentScheduleInstallment installment : installments) { - if (installment.getDueDate().isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))) { + if (installment.getDueDate().isBefore(businessDate)) { principalOverdue = principalOverdue.add(installment.getPrincipalOutstanding(loan.getCurrency()).getAmount()); interestOverdue = interestOverdue.add(installment.getInterestOutstanding(loan.getCurrency()).getAmount()); feeOverdue = feeOverdue.add(installment.getFeeChargesOutstanding(loan.getCurrency()).getAmount()); @@ -215,7 +217,7 @@ public class LoanArrearsAgingServiceImpl implements LoanArrearsAgingService { loanIdentifier.append( "inner join m_product_loan_recalculation_details prd on prd.product_id = ml.product_id and prd.arrears_based_on_original_schedule = true "); loanIdentifier.append("WHERE ml.loan_status_id = 300 and mr.completed_derived is false and mr.duedate < ") - .append(sqlGenerator.subDate(sqlGenerator.currentDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day")) + .append(sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day")) .append(" group by ml.id"); List loanIds = this.jdbcTemplate.queryForList(loanIdentifier.toString(), Long.class); if (!loanIds.isEmpty()) { @@ -276,7 +278,7 @@ public class LoanArrearsAgingServiceImpl implements LoanArrearsAgingService { BigDecimal interestOverdue = BigDecimal.ZERO; BigDecimal feeOverdue = BigDecimal.ZERO; BigDecimal penaltyOverdue = BigDecimal.ZERO; - LocalDate overDueSince = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate overDueSince = DateUtils.getBusinessLocalDate(); for (LoanSchedulePeriodData loanSchedulePeriodData : entry.getValue()) { if (!loanSchedulePeriodData.getComplete()) { @@ -437,7 +439,7 @@ public class LoanArrearsAgingServiceImpl implements LoanArrearsAgingService { "mr.interest_amount as interestAmount, mr.fee_charges_amount as feeAmount, mr.penalty_charges_amount as penaltyAmount "); scheduleDetail.append("from m_loan ml INNER JOIN m_loan_repayment_schedule_history mr on mr.loan_id = ml.id "); scheduleDetail.append("where mr.duedate < " - + sqlGenerator.subDate(sqlGenerator.currentDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day") + " and "); + + sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "COALESCE(ml.grace_on_arrears_ageing, 0)", "day") + " and "); scheduleDetail.append("ml.id IN(").append(loanIdsAsString).append(") and mr.version = ("); scheduleDetail.append("select max(lrs.version) from m_loan_repayment_schedule_history lrs where mr.loan_id = lrs.loan_id"); scheduleDetail.append(") order by ml.id,mr.duedate"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 8eff49ca9..4169aedb1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -25,7 +25,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; @@ -152,7 +151,6 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final PaginationHelper paginationHelper; private final LoanMapper loaanLoanMapper; private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final PaymentTypeReadPlatformService paymentTypeReadPlatformService; private final LoanRepaymentScheduleTransactionProcessorFactory loanRepaymentScheduleTransactionProcessorFactory; private final FloatingRatesReadPlatformService floatingRatesReadPlatformService; @@ -374,7 +372,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.context.authenticatedUser(); final ClientData clientAccount = this.clientReadPlatformService.retrieveOne(clientId); - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); LoanAccountData loanTemplateDetails = LoanAccountData.clientDefaults(clientAccount.id(), clientAccount.accountNo(), clientAccount.displayName(), clientAccount.officeId(), expectedDisbursementDate); @@ -392,7 +390,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.context.authenticatedUser(); final GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId); - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); LoanAccountData loanDetails = LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate); if (productId != null) { @@ -420,7 +418,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { collectionMeetingCalendar); } - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); LoanAccountData loanDetails = LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate); if (productId != null) { @@ -459,7 +457,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final CurrencyData currencyData = applicationCurrency.toData(); - final LocalDate earliestUnpaidInstallmentDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + final LocalDate earliestUnpaidInstallmentDate = DateUtils.getBusinessLocalDate(); final LocalDate recalculateFrom = null; final ScheduleGeneratorDTO scheduleGeneratorDTO = loanUtilService.buildScheduleGeneratorDTO(loan, recalculateFrom); final LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment = loan.fetchPrepaymentDetail(scheduleGeneratorDTO, onDate); @@ -525,7 +523,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final BigDecimal outstandingLoanBalance = null; final LoanTransactionEnumData transactionType = LoanEnumerations.transactionType(LoanTransactionType.WRITEOFF); final BigDecimal unrecognizedIncomePortion = null; - return new LoanTransactionData(null, null, null, transactionType, null, null, DateUtils.getLocalDateOfTenant(), null, null, null, + return new LoanTransactionData(null, null, null, transactionType, null, null, DateUtils.getBusinessLocalDate(), null, null, null, null, null, null, null, null, null, null, outstandingLoanBalance, unrecognizedIncomePortion, false); } @@ -533,7 +531,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public LoanApprovalData retrieveApprovalTemplate(final Long loanId) { final Loan loan = this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId, true); - return new LoanApprovalData(loan.getProposedPrincipal(), DateUtils.getLocalDateOfTenant(), loan.getNetDisbursalAmount()); + return new LoanApprovalData(loan.getProposedPrincipal(), DateUtils.getBusinessLocalDate(), loan.getNetDisbursalAmount()); } @Override @@ -1173,8 +1171,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } this.outstandingLoanPrincipalBalance = this.outstandingLoanPrincipalBalance.add(data.amount()); } else if (data.isDueForDisbursement(fromDate, dueDate)) { - if (!excludePastUndisbursed || (excludePastUndisbursed && (data.isDisbursed() - || !data.disbursementDate().isBefore(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()))))) { + if (!excludePastUndisbursed || (excludePastUndisbursed + && (data.isDisbursed() || !data.disbursementDate().isBefore(DateUtils.getBusinessLocalDate())))) { principal = principal.add(data.amount()); LoanSchedulePeriodData periodData = null; if (data.getChargeAmount() == null) { @@ -1472,7 +1470,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.context.authenticatedUser(); final ClientData clientAccount = this.clientReadPlatformService.retrieveOne(clientId); - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); return LoanAccountData.clientDefaults(clientAccount.id(), clientAccount.accountNo(), clientAccount.displayName(), clientAccount.officeId(), expectedDisbursementDate); @@ -1482,14 +1480,14 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { public LoanAccountData retrieveGroupDetailsTemplate(final Long groupId) { this.context.authenticatedUser(); final GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId); - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); return LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate); } @Override public LoanAccountData retrieveGroupAndMembersDetailsTemplate(final Long groupId) { GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId); - final LocalDate expectedDisbursementDate = DateUtils.getLocalDateOfTenant(); + final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); // get group associations final Collection membersOfGroup = this.clientReadPlatformService.retrieveActiveClientMembersOfGroup(groupId); @@ -1546,7 +1544,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("select ").append(rm.schema()) - .append(" where " + sqlGenerator.subDate(sqlGenerator.currentDate(), "?", "day") + " > ls.duedate ") + .append(" where " + sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "?", "day") + " > ls.duedate ") .append(" and ls.completed_derived <> true and mc.charge_applies_to_enum =1 ") .append(" and ls.recalculated_interest_component <> true ") .append(" and mc.charge_time_enum = 9 and ml.loan_status_id = 300 "); @@ -1556,7 +1554,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } // Only apply for duedate = yesterday (so that we don't apply // penalties on the duedate itself) - sqlBuilder.append(" and ls.duedate >= " + sqlGenerator.subDate(sqlGenerator.currentDate(), "(? + 1)", "day")); + sqlBuilder.append(" and ls.duedate >= " + sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "(? + 1)", "day")); return this.jdbcTemplate.query(sqlBuilder.toString(), rm, new Object[] { penaltyWaitPeriod, penaltyWaitPeriod }); } @@ -1666,18 +1664,17 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { .append(" and (((ls.fee_charges_amount <> COALESCE(ls.accrual_fee_charges_derived, 0))") .append(" or ( ls.penalty_charges_amount <> COALESCE(ls.accrual_penalty_charges_derived, 0))") .append(" or ( ls.interest_amount <> COALESCE(ls.accrual_interest_derived, 0)))") - .append(" and loan.loan_status_id=:active and mpl.accounting_type=:type and loan.is_npa=false and ls.duedate <= " - + sqlGenerator.currentDate() + ") "); + .append(" and loan.loan_status_id=:active and mpl.accounting_type=:type and loan.is_npa=false and ls.duedate <= :currentDate) "); if (organisationStartDate != null) { - sqlBuilder.append(" and ls.duedate > :organisationstartdate "); + sqlBuilder.append(" and ls.duedate > :organisationStartDate "); } sqlBuilder.append(" order by loan.id,ls.duedate "); Map paramMap = new HashMap<>(3); paramMap.put("active", LoanStatus.ACTIVE.getValue()); paramMap.put("type", AccountingRuleType.ACCRUAL_PERIODIC.getValue()); - paramMap.put("organisationstartdate", - (organisationStartDate == null) ? formatter.format(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())) - : formatter.format(LocalDate.ofInstant(organisationStartDate.toInstant(), DateUtils.getDateTimeZoneOfTenant()))); + paramMap.put("organisationStartDate", (organisationStartDate == null) ? DateUtils.getBusinessLocalDate() + : LocalDate.ofInstant(organisationStartDate.toInstant(), DateUtils.getDateTimeZoneOfTenant())); + paramMap.put("currentDate", DateUtils.getBusinessLocalDate()); return this.namedParameterJdbcTemplate.query(sqlBuilder.toString(), paramMap, mapper); } @@ -1687,26 +1684,24 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { LoanSchedulePeriodicAccrualMapper mapper = new LoanSchedulePeriodicAccrualMapper(); Date organisationStartDate = this.configurationDomainService.retrieveOrganisationStartDate(); - String formattedTillDate = formatter.format(tillDate); final StringBuilder sqlBuilder = new StringBuilder(400); sqlBuilder.append("select ").append(mapper.schema()).append( " where (recaldet.is_compounding_to_be_posted_as_transaction is null or recaldet.is_compounding_to_be_posted_as_transaction = false) ") .append(" and (((ls.fee_charges_amount <> COALESCE(ls.accrual_fee_charges_derived, 0))") .append(" or (ls.penalty_charges_amount <> COALESCE(ls.accrual_penalty_charges_derived, 0))") .append(" or (ls.interest_amount <> COALESCE(ls.accrual_interest_derived, 0)))") - .append(" and loan.loan_status_id=:active and mpl.accounting_type=:type and (loan.closedon_date <= '" + formattedTillDate - + "' or loan.closedon_date is null)") - .append(" and loan.is_npa=false and (ls.duedate <= '" + formattedTillDate + "' or (ls.duedate > '" + formattedTillDate - + "' and ls.fromdate < '" + formattedTillDate + "'))) "); + .append(" and loan.loan_status_id=:active and mpl.accounting_type=:type and (loan.closedon_date <= :tillDate or loan.closedon_date is null)") + .append(" and loan.is_npa=false and (ls.duedate <= :tillDate or (ls.duedate > :tillDate and ls.fromdate < :tillDate))) "); + Map paramMap = new HashMap<>(4); if (organisationStartDate != null) { - String formattedOrganizationStartDate = formatter - .format(LocalDate.ofInstant(organisationStartDate.toInstant(), DateUtils.getDateTimeZoneOfTenant())); - sqlBuilder.append(" and ls.duedate > '" + formattedOrganizationStartDate + "' "); + sqlBuilder.append(" and ls.duedate > :organisationStartDate "); + paramMap.put("organisationStartDate", + LocalDate.ofInstant(organisationStartDate.toInstant(), DateUtils.getDateTimeZoneOfTenant())); } sqlBuilder.append(" order by loan.id,ls.duedate "); - Map paramMap = new HashMap<>(4); paramMap.put("active", LoanStatus.ACTIVE.getValue()); paramMap.put("type", AccountingRuleType.ACCRUAL_PERIODIC.getValue()); + paramMap.put("tillDate", tillDate); return this.namedParameterJdbcTemplate.query(sqlBuilder.toString(), paramMap, mapper); } @@ -1852,7 +1847,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final List writeOffReasonOptions = new ArrayList<>( this.codeValueReadPlatformService.retrieveCodeValuesByCode(LoanApiConstants.WRITEOFFREASONS)); LoanTransactionData loanTransactionData = new LoanTransactionData(null, null, null, transactionType, null, loan.currency(), - DateUtils.getLocalDateOfTenant(), loan.getTotalOutstandingAmount(), loan.getNetDisbursalAmount(), null, null, null, null, + DateUtils.getBusinessLocalDate(), loan.getTotalOutstandingAmount(), loan.getNetDisbursalAmount(), null, null, null, null, null, null, null, null, outstandingLoanBalance, unrecognizedIncomePortion, false); loanTransactionData.setWriteOffReasonOptions(writeOffReasonOptions); return loanTransactionData; @@ -1891,9 +1886,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append(" ))"); sqlBuilder.append(" group by ml.id"); try { - String currentdate = formatter.format(DateUtils.getLocalDateOfTenant()); + LocalDate currentdate = DateUtils.getBusinessLocalDate(); // will look only for yesterday modified rates - String yesterday = formatter.format(DateUtils.getLocalDateOfTenant().minusDays(1)); + LocalDate yesterday = DateUtils.getBusinessLocalDate().minusDays(1); return this.jdbcTemplate.queryForList(sqlBuilder.toString(), Long.class, new Object[] { yesterday, LoanStatus.ACTIVE.getValue(), currentdate, currentdate, currentdate, yesterday }); } catch (final EmptyResultDataAccessException e) { @@ -1903,9 +1898,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public List fetchLoansForInterestRecalculation(Integer pageSize, Long maxLoanIdInList, String officeHierarchy) { - String currentdate = formatter.format(DateUtils.getLocalDateOfTenant()); + LocalDate currentdate = DateUtils.getBusinessLocalDate(); // will look only for yesterday modified rates - String yesterday = formatter.format(DateUtils.getLocalDateOfTenant().minusDays(1)); + LocalDate yesterday = DateUtils.getBusinessLocalDate().minusDays(1); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("SELECT ml.id FROM m_loan ml "); sqlBuilder.append(" left join m_client mc on mc.id = ml.client_id "); @@ -1920,20 +1915,19 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append(" left join m_loan_reschedule_request lrr on lrr.loan_id = ml.id"); // this is to identify the applicable rates when base rate is changed sqlBuilder.append(" left join m_floating_rates bfr on bfr.is_base_lending_rate = true"); - sqlBuilder.append(" left join m_floating_rates_periods bfrp on bfr.id = bfrp.floating_rates_id and bfrp.created_date >= '" - + yesterday + "'"); + sqlBuilder.append(" left join m_floating_rates_periods bfrp on bfr.id = bfrp.floating_rates_id and bfrp.created_date >= ?"); sqlBuilder.append(" WHERE ml.loan_status_id = ? "); sqlBuilder.append(" and ml.is_npa = false "); sqlBuilder.append(" and (("); sqlBuilder.append("ml.interest_recalculation_enabled = true "); - sqlBuilder.append(" and (ml.interest_recalcualated_on is null or ml.interest_recalcualated_on <> '" + currentdate + "')"); + sqlBuilder.append(" and (ml.interest_recalcualated_on is null or ml.interest_recalcualated_on <> ? )"); sqlBuilder.append(" and (("); sqlBuilder.append(" mr.completed_derived is false "); - sqlBuilder.append(" and mr.duedate < '" + currentdate + "' )"); - sqlBuilder.append(" or dd.expected_disburse_date < '" + currentdate + "' )) "); + sqlBuilder.append(" and mr.duedate < ? )"); + sqlBuilder.append(" or dd.expected_disburse_date < ? )) "); sqlBuilder.append(" or ("); sqlBuilder.append(" fr.is_active = true and frp.is_active = true"); - sqlBuilder.append(" and (frp.created_date >= '" + yesterday + "' or "); + sqlBuilder.append(" and (frp.created_date >= ? or "); sqlBuilder .append("(bfrp.id is not null and frp.is_differential_to_base_lending_rate = true and frp.from_date >= bfrp.from_date)) "); sqlBuilder.append("and lrr.loan_id is null"); @@ -1943,7 +1937,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append(" limit ? "); try { return Collections.synchronizedList(this.jdbcTemplate.queryForList(sqlBuilder.toString(), Long.class, - new Object[] { LoanStatus.ACTIVE.getValue(), maxLoanIdInList, officeHierarchy, pageSize })); + new Object[] { yesterday, LoanStatus.ACTIVE.getValue(), currentdate, currentdate, currentdate, yesterday, + maxLoanIdInList, officeHierarchy, pageSize })); } catch (final EmptyResultDataAccessException e) { return null; } @@ -2105,7 +2100,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { + " + 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 " + " from m_loan ml INNER JOIN m_loan_repayment_schedule mr on mr.loan_id = ml.id " - + " where ml.id=? and mr.duedate >= " + sqlGenerator.currentDate() + " group by ml.id having " + + " where ml.id=? and mr.duedate >= " + sqlGenerator.currentBusinessDate() + " group by ml.id having " + " (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))) > 0"; @@ -2200,7 +2195,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public Collection retrieveLoanIdsWithPendingIncomePostingTransactions() { - String currentdate = formatter.format(DateUtils.getLocalDateOfTenant()); + LocalDate currentdate = DateUtils.getBusinessLocalDate(); StringBuilder sqlBuilder = new StringBuilder().append(" select distinct loan.id ").append(" from m_loan as loan ").append( " inner join m_loan_recalculation_details as recdet on (recdet.loan_id = loan.id and recdet.is_compounding_to_be_posted_as_transaction is not null and recdet.is_compounding_to_be_posted_as_transaction = true) ") .append(" inner join m_loan_repayment_schedule as repsch on repsch.loan_id = loan.id ") @@ -2208,9 +2203,9 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { .append(" left join m_loan_transaction as trans on (trans.is_reversed <> true and trans.transaction_type_enum = 19 and trans.loan_id = loan.id and trans.transaction_date = adddet.effective_date) ") .append(" where loan.loan_status_id = 300 ").append(" and loan.is_npa = false ") .append(" and adddet.effective_date is not null ").append(" and trans.transaction_date is null ") - .append(" and adddet.effective_date < '" + currentdate + "' "); + .append(" and adddet.effective_date < ? "); try { - return this.jdbcTemplate.queryForList(sqlBuilder.toString(), Long.class); + return this.jdbcTemplate.queryForList(sqlBuilder.toString(), new Object[] { currentdate }, Long.class); } catch (final EmptyResultDataAccessException e) { return null; } @@ -2227,7 +2222,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final CurrencyData currencyData = applicationCurrency.toData(); - final LocalDate earliestUnpaidInstallmentDate = DateUtils.getLocalDateOfTenant(); + final LocalDate earliestUnpaidInstallmentDate = DateUtils.getBusinessLocalDate(); final LoanRepaymentScheduleInstallment loanRepaymentScheduleInstallment = loan.fetchLoanForeclosureDetail(transactionDate); BigDecimal unrecognizedIncomePortion = null; @@ -2377,13 +2372,15 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { sqlBuilder.append( "l.id as loanId, coalesce((l.approved_principal - l.principal_disbursed_derived), 0) as availableDisbursementAmount, "); - sqlBuilder.append(sqlGenerator.dateDiff(sqlGenerator.currentDate(), "laa.overdue_since_date_derived") + " as pastDueDays, "); + sqlBuilder.append( + sqlGenerator.dateDiff(sqlGenerator.currentBusinessDate(), "laa.overdue_since_date_derived") + " as pastDueDays, "); sqlBuilder.append( "(select coalesce(min(lrs.duedate), null) as duedate from m_loan_repayment_schedule lrs where lrs.loan_id=l.id and lrs.completed_derived is false and lrs.duedate >= " - + sqlGenerator.currentDate() + ") as nextPaymentDueDate, "); - sqlBuilder.append(sqlGenerator.dateDiff(sqlGenerator.currentDate(), "laa.overdue_since_date_derived") + " as delinquentDays, "); + + sqlGenerator.currentBusinessDate() + ") as nextPaymentDueDate, "); sqlBuilder.append( - sqlGenerator.currentDate() + " as delinquentDate, coalesce(laa.total_overdue_derived, 0) as delinquentAmount, "); + sqlGenerator.dateDiff(sqlGenerator.currentBusinessDate(), "laa.overdue_since_date_derived") + " as delinquentDays, "); + sqlBuilder.append(sqlGenerator.currentBusinessDate() + + " as delinquentDate, coalesce(laa.total_overdue_derived, 0) as delinquentAmount, "); sqlBuilder.append("lre.transactionDate as lastPaymentDate, coalesce(lre.amount, 0) as lastPaymentAmount "); sqlBuilder.append("from m_loan l left join m_loan_arrears_aging laa on laa.loan_id = l.id "); sqlBuilder.append( diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index aeeb40fbb..132c0199e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -587,7 +587,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Integer instructionType = StandingInstructionType.DUES.getValue(); final Integer status = StandingInstructionStatus.ACTIVE.getValue(); final Integer recurrenceType = AccountTransferRecurrenceType.AS_PER_DUES.getValue(); - final LocalDate validFrom = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + final LocalDate validFrom = DateUtils.getBusinessLocalDate(); AccountTransferDetails accountTransferDetails = AccountTransferDetails.savingsToLoanTransfer(fromOffice, fromClient, linkedSavingsAccount, toOffice, toClient, loan, transferType); @@ -1619,7 +1619,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf this.loanTransactionRepository.saveAndFlush(applyLoanChargeTransaction); } boolean isAppliedOnBackDate = false; - if (loanCharge.getDueLocalDate() == null || DateUtils.getLocalDateOfTenant().isAfter(loanCharge.getDueLocalDate())) { + if (loanCharge.getDueLocalDate() == null || DateUtils.getBusinessLocalDate().isAfter(loanCharge.getDueLocalDate())) { isAppliedOnBackDate = true; } return isAppliedOnBackDate; @@ -2053,29 +2053,28 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf .retrieveInstallmentLoanCharges(chargeData.getId(), true); PortfolioAccountData portfolioAccountData = null; for (final LoanInstallmentChargeData installmentChargeData : chargePerInstallments) { - if (!installmentChargeData.getDueDate().isAfter(DateUtils.getLocalDateOfTenant())) { + if (!installmentChargeData.getDueDate().isAfter(DateUtils.getBusinessLocalDate())) { if (portfolioAccountData == null) { portfolioAccountData = this.accountAssociationsReadPlatformService .retriveLoanLinkedAssociation(chargeData.getLoanId()); } final SavingsAccount fromSavingsAccount = null; final boolean isExceptionForBalanceCheck = false; - final AccountTransferDTO accountTransferDTO = new AccountTransferDTO( - LocalDate.now(DateUtils.getDateTimeZoneOfTenant()), installmentChargeData.getAmountOutstanding(), - PortfolioAccountType.SAVINGS, PortfolioAccountType.LOAN, portfolioAccountData.accountId(), - chargeData.getLoanId(), "Loan Charge Payment", null, null, null, null, + final AccountTransferDTO accountTransferDTO = new AccountTransferDTO(DateUtils.getBusinessLocalDate(), + installmentChargeData.getAmountOutstanding(), PortfolioAccountType.SAVINGS, PortfolioAccountType.LOAN, + portfolioAccountData.accountId(), chargeData.getLoanId(), "Loan Charge Payment", null, null, null, null, LoanTransactionType.CHARGE_PAYMENT.getValue(), chargeData.getId(), installmentChargeData.getInstallmentNumber(), AccountTransferType.CHARGE_PAYMENT.getValue(), null, null, null, null, null, fromSavingsAccount, isRegularTransaction, isExceptionForBalanceCheck); transferFeeCharge(accountTransferDTO, errors); } } - } else if (chargeData.getDueDate() != null && !chargeData.getDueDate().isAfter(DateUtils.getLocalDateOfTenant())) { + } else if (chargeData.getDueDate() != null && !chargeData.getDueDate().isAfter(DateUtils.getBusinessLocalDate())) { final PortfolioAccountData portfolioAccountData = this.accountAssociationsReadPlatformService .retriveLoanLinkedAssociation(chargeData.getLoanId()); final SavingsAccount fromSavingsAccount = null; final boolean isExceptionForBalanceCheck = false; - final AccountTransferDTO accountTransferDTO = new AccountTransferDTO(LocalDate.now(DateUtils.getDateTimeZoneOfTenant()), + final AccountTransferDTO accountTransferDTO = new AccountTransferDTO(DateUtils.getBusinessLocalDate(), chargeData.getAmountOutstanding(), PortfolioAccountType.SAVINGS, PortfolioAccountType.LOAN, portfolioAccountData.accountId(), chargeData.getLoanId(), "Loan Charge Payment", null, null, null, null, LoanTransactionType.CHARGE_PAYMENT.getValue(), chargeData.getId(), null, @@ -2607,7 +2606,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final List existingTransactionIds = new ArrayList<>(); final List existingReversedTransactionIds = new ArrayList<>(); boolean runInterestRecalculation = false; - LocalDate recalculateFrom = DateUtils.getLocalDateOfTenant(); + LocalDate recalculateFrom = DateUtils.getBusinessLocalDate(); LocalDate lastChargeDate = null; for (final OverdueLoanScheduleData overdueInstallment : overdueLoanScheduleDatas) { @@ -2714,7 +2713,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf if (feeFrequency == null) { scheduleDates.put(frequencyNunber++, startDate.minusDays(diff)); } else { - while (!startDate.isAfter(DateUtils.getLocalDateOfTenant())) { + while (!startDate.isAfter(DateUtils.getBusinessLocalDate())) { scheduleDates.put(frequencyNunber++, startDate.minusDays(diff)); LocalDate scheduleDate = scheduledDateGenerator.getRepaymentPeriodDate(PeriodFrequencyType.fromInt(feeFrequency), chargeDefinition.feeInterval(), startDate); @@ -2739,7 +2738,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf installment = loan.fetchRepaymentScheduleInstallment(periodNumber); lastChargeAppliedDate = installment.getDueDate(); } - LocalDate recalculateFrom = DateUtils.getLocalDateOfTenant(); + LocalDate recalculateFrom = DateUtils.getBusinessLocalDate(); if (loan != null) { businessEventNotifierService.notifyPreBusinessEvent(new LoanApplyOverdueChargeBusinessEvent(loan)); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java index ac6042758..bbb73decc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -335,7 +335,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo final LocalDate startDate = JdbcSupport.getLocalDate(rs, "startDate"); final LocalDate closeDate = JdbcSupport.getLocalDate(rs, "closeDate"); String status = ""; - if (closeDate != null && closeDate.isBefore(DateUtils.getLocalDateOfTenant())) { + if (closeDate != null && closeDate.isBefore(DateUtils.getBusinessLocalDate())) { status = "loanProduct.inActive"; } else { status = "loanProduct.active"; @@ -499,7 +499,7 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo } public String activeOnlySchema() { - return schema() + " where (close_date is null or close_date >= " + sqlGenerator.currentDate() + ")"; + return schema() + " where (close_date is null or close_date >= " + sqlGenerator.currentBusinessDate() + ")"; } public String productMixSchema() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/api/MeetingsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/api/MeetingsApiResource.java index 0dee72c68..98b70e977 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/api/MeetingsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/api/MeetingsApiResource.java @@ -130,7 +130,7 @@ public class MeetingsApiResource { calendarData = this.calendarReadPlatformService.retrieveCalendar(calendarId, entityId, entityTypeId); final boolean withHistory = true; final Collection recurringDates = this.calendarReadPlatformService.generateRecurringDates(calendarData, withHistory, - DateUtils.getLocalDateOfTenant()); + DateUtils.getBusinessLocalDate()); final Collection nextTenRecurringDates = this.calendarReadPlatformService .generateNextTenRecurringDates(calendarData); final LocalDate recentEligibleMeetingDate = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java index 09ea4efba..d334b918a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/meeting/domain/Meeting.java @@ -89,7 +89,7 @@ public class Meeting extends AbstractPersistableCustom { public void associateClientsAttendance(final Collection clientsAttendance) { // do not allow to capture attendance in advance. - if (isMeetingDateAfter(DateUtils.getLocalDateOfTenant())) { + if (isMeetingDateAfter(DateUtils.getBusinessLocalDate())) { final String errorMessage = "Attendance cannot be in the future."; throw new MeetingDateException("cannot.be.a.future.date", errorMessage, getMeetingDateLocalDate()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java index 5452164cc..e92edaefd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java @@ -234,7 +234,7 @@ public class SavingsAccountSummaryData implements Serializable { public void updateFromInterestPeriodSummaries(final MonetaryCurrency currency, final List allPostingPeriods) { Money totalEarned = Money.zero(currency); - LocalDate interestCalculationDate = DateUtils.getLocalDateOfTenant(); + LocalDate interestCalculationDate = DateUtils.getBusinessLocalDate(); for (final PostingPeriod period : allPostingPeriods) { Money interestEarned = period.interest(); interestEarned = interestEarned == null ? Money.zero(currency) : interestEarned; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java index d894128a6..a4946477f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java @@ -934,7 +934,7 @@ public final class SavingsAccountTransactionData implements Serializable { public static SavingsAccountTransactionData withWithDrawalTransactionDetails( final SavingsAccountTransactionData savingsAccountTransactionData) { - final LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + final LocalDate currentDate = DateUtils.getBusinessLocalDate(); final SavingsAccountTransactionEnumData transactionType = SavingsEnumerations .transactionType(SavingsAccountTransactionType.WITHDRAWAL.getValue()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java index 79a982986..c625404c3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java @@ -324,7 +324,7 @@ public class SavingsAccountTransactionDataValidator { throwExceptionIfValidationWarningsExist(dataValidationErrors); Date createdDate = new Date(); - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); SavingsAccountTransaction transaction = SavingsAccountTransaction.releaseAmount(holdTransaction, transactionDate, createdDate, createdUser); return transaction; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java index d0517be53..0a6fafd96 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountAssembler.java @@ -355,7 +355,7 @@ public class DepositAccountAssembler { if (account != null) { account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), depositAccountType.resourceName()); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), depositAccountType.resourceName()); } return account; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java index d1ad10b99..44fe44212 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountDomainServiceJpa.java @@ -161,7 +161,7 @@ public class DepositAccountDomainServiceJpa implements DepositAccountDomainServi account.handleScheduleInstallments(deposit); account.updateMaturityDateAndAmount(mc, isPreMatureClosure, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - account.updateOverduePayments(DateUtils.getLocalDateOfTenant()); + account.updateOverduePayments(DateUtils.getBusinessLocalDate()); if (isAnyActivationChargesDue) { postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds, isAccountTransfer); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java index 8506eb083..322b9a398 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/DepositAccountRecurringDetail.java @@ -127,7 +127,7 @@ public class DepositAccountRecurringDetail extends AbstractPersistableCustom { throw new PlatformApiDataValidationException(dataValidationErrors); } depositAccount.updateScheduleInstallmentsWithNewRecommendedDepositAmount(newMandatoryRecommendedDepositAmount, effectiveDate); - depositAccount.updateOverduePayments(DateUtils.getLocalDateOfTenant()); + depositAccount.updateOverduePayments(DateUtils.getBusinessLocalDate()); MathContext mc = MathContext.DECIMAL64; Boolean isPreMatureClosure = false; depositAccount.updateMaturityDateAndAmount(mc, isPreMatureClosure, isSavingsInterestPostingAtCurrentPeriodEnd, diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java index d0b43b28a..9dff82f57 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java @@ -231,7 +231,7 @@ public class FixedDepositAccount extends SavingsAccount { isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); // reset end of day balance back to today's date - this.resetAccountTransactionsEndOfDayBalances(transactions, DateUtils.getLocalDateOfTenant()); + this.resetAccountTransactionsEndOfDayBalances(transactions, DateUtils.getBusinessLocalDate()); Money totalInterestPayable = Money.zero(getCurrency()); for (PostingPeriod postingPeriod : postingPeriods) { @@ -256,7 +256,7 @@ public class FixedDepositAccount extends SavingsAccount { } } - final LocalDate todayDate = DateUtils.getLocalDateOfTenant(); + final LocalDate todayDate = DateUtils.getBusinessLocalDate(); if (!this.maturityDate().isAfter(todayDate)) { // update account status this.status = SavingsAccountStatusType.MATURED.getValue(); @@ -763,7 +763,7 @@ public class FixedDepositAccount extends SavingsAccount { if (this.chart != null) { final LocalDate chartFromDate = this.chart.getFromDateAsLocalDate(); LocalDate chartEndDate = this.chart.getEndDateAsLocalDate(); - chartEndDate = chartEndDate == null ? DateUtils.getLocalDateOfTenant() : chartEndDate; + chartEndDate = chartEndDate == null ? DateUtils.getBusinessLocalDate() : chartEndDate; final LocalDateInterval chartInterval = LocalDateInterval.create(chartFromDate, chartEndDate); if (!chartInterval.contains(accountSubmittedOrActivationDate())) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java index b228fef3b..6d87fee26 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java @@ -225,7 +225,7 @@ public class RecurringDepositAccount extends SavingsAccount { } if (depositCloseDate == null) { - depositCloseDate = DateUtils.getLocalDateOfTenant(); + depositCloseDate = DateUtils.getBusinessLocalDate(); } final BigDecimal depositAmount = accountTermAndPreClosure.depositAmount(); @@ -248,7 +248,7 @@ public class RecurringDepositAccount extends SavingsAccount { LocalDate interestCalculationUpto = null; List allTransactions = null; if (maturityDate == null) { - interestCalculationUpto = DateUtils.getLocalDateOfTenant(); + interestCalculationUpto = DateUtils.getBusinessLocalDate(); allTransactions = getTransactions(interestCalculationUpto, false); } else { interestCalculationUpto = maturityDate.minusDays(1); @@ -285,7 +285,7 @@ public class RecurringDepositAccount extends SavingsAccount { } } - final LocalDate todayDate = DateUtils.getLocalDateOfTenant(); + final LocalDate todayDate = DateUtils.getBusinessLocalDate(); if (!this.maturityDate().isAfter(todayDate)) { // update account status this.status = SavingsAccountStatusType.MATURED.getValue(); @@ -549,7 +549,7 @@ public class RecurringDepositAccount extends SavingsAccount { // update existing transactions so derived balance fields are // correct. - recalculateDailyBalances(Money.zero(this.currency), DateUtils.getLocalDateOfTenant(), backdatedTxnsAllowedTill); + recalculateDailyBalances(Money.zero(this.currency), DateUtils.getBusinessLocalDate(), backdatedTxnsAllowedTill); } } @@ -1059,7 +1059,7 @@ public class RecurringDepositAccount extends SavingsAccount { if (this.chart != null) { final LocalDate chartFromDate = this.chart.getFromDateAsLocalDate(); LocalDate chartEndDate = this.chart.getEndDateAsLocalDate(); - chartEndDate = chartEndDate == null ? DateUtils.getLocalDateOfTenant() : chartEndDate; + chartEndDate = chartEndDate == null ? DateUtils.getBusinessLocalDate() : chartEndDate; final LocalDateInterval chartInterval = LocalDateInterval.create(chartFromDate, chartEndDate); if (!chartInterval.contains(accountSubmittedOrActivationDate())) { @@ -1067,7 +1067,7 @@ public class RecurringDepositAccount extends SavingsAccount { } if (maturityDate == null) { - maturityDate = DateUtils.getLocalDateOfTenant(); + maturityDate = DateUtils.getBusinessLocalDate(); } final BigDecimal maturityAmount = this.accountTermAndPreClosure.depositAmount(); @@ -1199,7 +1199,7 @@ public class RecurringDepositAccount extends SavingsAccount { private LocalDate calcualteScheduleTillDate(final PeriodFrequencyType frequency, final Integer recurringEvery) { LocalDate tillDate = calculateMaturityDate(); if (tillDate == null) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); tillDate = DepositAccountUtils.calculateNextDepositDate(today, frequency, recurringEvery * (DepositAccountUtils.GENERATE_MINIMUM_NUMBER_OF_FUTURE_INSTALMENTS + 1)); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java index ce6ece216..625f998f3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java @@ -1309,23 +1309,16 @@ public class SavingsAccount extends AbstractPersistableCustom { Integer restartPeriod = charge.getRestartFrequency(); if (charge.getRestartFrequencyEnum() == 2) { // calculation for months - Date currentDate = new Date(); - LocalDate localDate = currentDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - Integer currentMonth = localDate.getMonthValue(); + LocalDate localDate = DateUtils.getBusinessLocalDate(); - LocalDate resetLocalDate = null; + LocalDate resetLocalDate; if (resetDate == null) { resetLocalDate = this.activatedOnDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } else { resetLocalDate = resetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } - Integer resetMonth = resetLocalDate.getMonthValue(); LocalDate gapIntervalMonth = resetLocalDate.plusMonths(restartPeriod); - Integer gapMonth = gapIntervalMonth.getMonthValue(); - - Integer resetYear = resetLocalDate.getYear(); - Integer currentYear = localDate.getYear(); YearMonth gapYearMonth = YearMonth.from(gapIntervalMonth); YearMonth localYearMonth = YearMonth.from(localDate); @@ -1335,18 +1328,18 @@ public class SavingsAccount extends AbstractPersistableCustom { discountCharge(1, charge); } } else { // calculation for days - Long completedDays = null; - Long days = null; + Long completedDays; + Long days; if (resetDate == null) { - completedDays = DateUtils.getDateOfTenant().getTime() - this.activatedOnDate.getTime(); + completedDays = DateUtils.getBusinessDate().getTime() - this.activatedOnDate.getTime(); days = TimeUnit.DAYS.convert(completedDays, TimeUnit.MILLISECONDS); } else { - completedDays = DateUtils.getDateOfTenant().getTime() - resetDate.getTime(); + completedDays = DateUtils.getBusinessDate().getTime() - resetDate.getTime(); days = TimeUnit.DAYS.convert(completedDays, TimeUnit.MILLISECONDS); } - Integer totalDays = days.intValue(); + int totalDays = days.intValue(); if (totalDays < restartPeriod) { countValidation(charge, transactionAmount, transactionDate, user, refNo); @@ -1371,7 +1364,7 @@ public class SavingsAccount extends AbstractPersistableCustom { private void discountCharge(Integer freeWithdrawalCount, SavingsAccountCharge charge) { charge.setFreeWithdrawalCount(freeWithdrawalCount); - charge.setDiscountDueDate(DateUtils.getDateOfTenant()); + charge.setDiscountDueDate(DateUtils.getBusinessDate()); charge.updateNoWithdrawalFee(); } @@ -1572,7 +1565,7 @@ public class SavingsAccount extends AbstractPersistableCustom { } private boolean isDateInTheFuture(final LocalDate transactionDate) { - return transactionDate.isAfter(DateUtils.getLocalDateOfTenant()); + return transactionDate.isAfter(DateUtils.getBusinessLocalDate()); } public BigDecimal getAccountBalance() { @@ -2067,7 +2060,7 @@ public class SavingsAccount extends AbstractPersistableCustom { throw new SavingsOfficerAssignmentDateException("cannot.be.before.previous.unassignement.date", errorMessage, assignmentDate, lastAssignmentRecord.getEndDate()); - } else if (DateUtils.getLocalDateOfTenant().isBefore(assignmentDate)) { + } else if (DateUtils.getBusinessLocalDate().isBefore(assignmentDate)) { final String errorMessage = "The Savings Officer assignment date (" + assignmentDate + ") cannot be in the future."; @@ -2164,7 +2157,7 @@ public class SavingsAccount extends AbstractPersistableCustom { private void validateUnassignDate(final SavingsOfficerAssignmentHistory latestHistoryRecord, final LocalDate unassignDate) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); if (latestHistoryRecord.getStartDate().isAfter(unassignDate)) { @@ -2768,12 +2761,12 @@ public class SavingsAccount extends AbstractPersistableCustom { boolean isInterestTransfer = false; LocalDate postInterestAsOnDate = null; if (this.isBeforeLastPostingPeriod(getActivationLocalDate(), backdatedTxnsAllowedTill)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); boolean postReversals = false; this.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestAsOnDate, backdatedTxnsAllowedTill, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); this.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestAsOnDate, backdatedTxnsAllowedTill); } @@ -3236,7 +3229,7 @@ public class SavingsAccount extends AbstractPersistableCustom { private void handleWaiverChargeTransactions(SavingsAccountCharge savingsAccountCharge, Money transactionAmount, AppUser user, boolean backdatedTxnsAllowedTill) { final SavingsAccountTransaction chargeTransaction = SavingsAccountTransaction.waiver(this, office(), - DateUtils.getLocalDateOfTenant(), transactionAmount, user); + DateUtils.getBusinessLocalDate(), transactionAmount, user); handleChargeTransactions(savingsAccountCharge, chargeTransaction, backdatedTxnsAllowedTill); } @@ -3511,7 +3504,7 @@ public class SavingsAccount extends AbstractPersistableCustom { public void setSubStatusInactive(AppUser appUser, final boolean backdatedTxnsAllowedTill) { this.sub_status = SavingsAccountSubStatusEnum.INACTIVE.getValue(); - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); for (SavingsAccountCharge charge : this.charges()) { if (charge.isSavingsNoActivity() && charge.isActive()) { charge.updateWithdralFeeAmount(this.getAccountBalance()); @@ -3531,10 +3524,10 @@ public class SavingsAccount extends AbstractPersistableCustom { public void escheat(AppUser appUser) { this.status = SavingsAccountStatusType.CLOSED.getValue(); this.sub_status = SavingsAccountSubStatusEnum.ESCHEAT.getValue(); - this.closedOnDate = DateUtils.getDateOfTenant(); + this.closedOnDate = DateUtils.getBusinessDate(); this.closedBy = appUser; boolean postInterestAsOnDate = false; - LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + LocalDate transactionDate = DateUtils.getBusinessLocalDate(); if (this.getSummary().getAccountBalance(this.getCurrency()).isGreaterThanZero()) { SavingsAccountTransaction transaction = SavingsAccountTransaction.escheat(this, transactionDate, appUser, postInterestAsOnDate); this.transactions.add(transaction); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java index 3c368ef0d..de98a78e3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java @@ -326,7 +326,7 @@ public class SavingsAccountAssembler { nominalAnnualInterestRateOverdraft, minOverdraftForInterestCalculation, withHoldTax); account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), SAVINGS_ACCOUNT_RESOURCE_NAME); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), SAVINGS_ACCOUNT_RESOURCE_NAME); account.validateAccountValuesWithProduct(); @@ -444,7 +444,7 @@ public class SavingsAccountAssembler { product.withHoldTax()); account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), SAVINGS_ACCOUNT_RESOURCE_NAME); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), SAVINGS_ACCOUNT_RESOURCE_NAME); account.validateAccountValuesWithProduct(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java index 9b105f647..29dbc4ce7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java @@ -114,13 +114,12 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi backdatedTxnsAllowedTill, refNo.toString()); final MathContext mc = MathContext.DECIMAL64; + final LocalDate today = DateUtils.getBusinessLocalDate(); if (account.isBeforeLastPostingPeriod(transactionDate, backdatedTxnsAllowedTill)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); boolean postReversals = false; account.postInterest(mc, today, transactionBooleanValues.isInterestTransfer(), isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); account.calculateInterestUsing(mc, today, transactionBooleanValues.isInterestTransfer(), isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill); } @@ -196,13 +195,12 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final LocalDate postInterestOnDate = null; final MathContext mc = MathContext.DECIMAL64; + final LocalDate today = DateUtils.getBusinessLocalDate(); if (account.isBeforeLastPostingPeriod(transactionDate, backdatedTxnsAllowedTill)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); boolean postReversals = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill); } @@ -315,7 +313,7 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi boolean isInterestTransfer = false; LocalDate postInterestOnDate = null; - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(15, MoneyHelper.getRoundingMode()); for (SavingsAccountTransaction savingsAccountTransaction : savingsAccountTransactions) { if (savingsAccountTransaction.isPostInterestCalculationRequired() diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java index a32afb6b7..82d105de1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSummary.java @@ -241,7 +241,7 @@ public final class SavingsAccountSummary { public void updateFromInterestPeriodSummaries(final MonetaryCurrency currency, final List allPostingPeriods) { Money totalEarned = Money.zero(currency); - LocalDate interestCalculationDate = DateUtils.getLocalDateOfTenant(); + LocalDate interestCalculationDate = DateUtils.getBusinessLocalDate(); for (final PostingPeriod period : allPostingPeriods) { Money interestEarned = period.interest(); interestEarned = interestEarned == null ? Money.zero(currency) : interestEarned; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java index 98dcf4978..cc2851f1d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java @@ -500,7 +500,7 @@ public final class PostingPeriod { private static LocalDate getPeriodEndDate(LocalDate periodEndDate, int previousMonth, int periodsInMonth, LocalDate periodStartDate) { int year = periodStartDate.get(ChronoField.YEAR_OF_ERA); int monthofYear = periodStartDate.getMonthValue(); - LocalDate date = DateUtils.getLocalDateOfTenant(); + LocalDate date = DateUtils.getBusinessLocalDate(); TreeSet monthSet = new TreeSet<>(); date = date.withMonth(previousMonth); monthSet.add(date.getMonthValue()); @@ -519,14 +519,14 @@ public final class PostingPeriod { for (Integer month : monthSet) { if (monthofYear <= month.intValue()) { - periodEndDate = LocalDate.of(year, month, DateUtils.getLocalDateOfTenant().withMonth(month).lengthOfMonth()); + periodEndDate = LocalDate.of(year, month, DateUtils.getBusinessLocalDate().withMonth(month).lengthOfMonth()); notInRange = false; break; } } if (notInRange) { periodEndDate = LocalDate.of(year + 1, monthSet.first(), - DateUtils.getLocalDateOfTenant().withMonth(monthSet.first()).lengthOfMonth()); + DateUtils.getBusinessLocalDate().withMonth(monthSet.first()).lengthOfMonth()); } return periodEndDate; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java index 3488bcc04..50fe4dbd9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java @@ -519,7 +519,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead @Override public Collection> retriveDataForRDScheduleCreation() { - String today = formatter.format(DateUtils.getLocalDateOfTenant()); + String today = formatter.format(DateUtils.getBusinessLocalDate()); final StringBuilder sb = new StringBuilder(300); sb.append(" select rd.savings_account_id savingsId, rd.mandatory_recommended_deposit_amount as amount,"); sb.append(" mc.recurrence as recurrence ,"); @@ -1387,7 +1387,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public String schema() { - LocalDate today = DateUtils.getLocalDateOfTenant(); + LocalDate today = DateUtils.getBusinessLocalDate(); String formattedToday = formatter.format(today); final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("da.id as id, "); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java index be46494e3..e5f326612 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountWritePlatformServiceJpaRepositoryImpl.java @@ -216,7 +216,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); - final Map changes = account.activate(user, command, DateUtils.getLocalDateOfTenant()); + final Map changes = account.activate(user, command, DateUtils.getBusinessLocalDate()); Money activationChargeAmount = getActivationCharge(account); if (!changes.isEmpty()) { final Locale locale = command.extractLocale(); @@ -247,11 +247,11 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo payActivationCharge(account, user); } if (account.isBeforeLastPostingPeriod(account.getActivationLocalDate(), false)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } @@ -323,7 +323,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); - final Map changes = account.activate(user, command, DateUtils.getLocalDateOfTenant()); + final Map changes = account.activate(user, command, DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { final Locale locale = command.extractLocale(); @@ -366,16 +366,16 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo financialYearBeginningMonth); } - final LocalDate overdueUptoDate = DateUtils.getLocalDateOfTenant(); + final LocalDate overdueUptoDate = DateUtils.getBusinessLocalDate(); account.updateOverduePayments(overdueUptoDate); final boolean isInterestTransfer = false; final LocalDate postInterestOnDate = null; if (account.isBeforeLastPostingPeriod(account.getActivationLocalDate(), false)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } @@ -524,7 +524,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final SavingsAccount account = this.depositAccountAssembler.assembleFrom(savingsId, depositAccountType); checkClientOrGroupActive(account); - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(15, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; LocalDate postInterestOnDate = null; @@ -568,7 +568,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo final Set existingTransactionIds = new HashSet<>(); final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; LocalDate postInterestOnDate = null; @@ -637,7 +637,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo transactionId); } - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = MathContext.DECIMAL64; if (account.isNotActive()) { @@ -668,7 +668,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo account.updateMaturityDateAndAmount(mc, isPreMatureClosure, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); - final LocalDate overdueUptoDate = DateUtils.getLocalDateOfTenant(); + final LocalDate overdueUptoDate = DateUtils.getBusinessLocalDate(); if (savingsAccountTransaction.isDeposit()) { account.updateScheduleInstallments(); @@ -723,7 +723,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo transactionId); } - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final RecurringDepositAccount account = (RecurringDepositAccount) this.depositAccountAssembler.assembleFrom(savingsId, DepositAccountType.RECURRING_DEPOSIT); @@ -780,7 +780,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo if (savingsAccountTransaction.isDeposit()) { account.handleScheduleInstallments(savingsAccountTransaction); } - final LocalDate overdueUptoDate = DateUtils.getLocalDateOfTenant(); + final LocalDate overdueUptoDate = DateUtils.getBusinessLocalDate(); account.updateOverduePayments(overdueUptoDate); this.savingAccountRepositoryWrapper.saveAndFlush(account); @@ -834,7 +834,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo DepositAccountType.FIXED_DEPOSIT); checkClientOrGroupActive(account); - this.depositAccountDomainService.handleFDAccountClosure(account, paymentDetail, user, command, DateUtils.getLocalDateOfTenant(), + this.depositAccountDomainService.handleFDAccountClosure(account, paymentDetail, user, command, DateUtils.getBusinessLocalDate(), changes); final String noteText = command.stringValueOfParameterNamed("note"); @@ -868,7 +868,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo DepositAccountType.RECURRING_DEPOSIT); checkClientOrGroupActive(account); - this.depositAccountDomainService.handleRDAccountClosure(account, paymentDetail, user, command, DateUtils.getLocalDateOfTenant(), + this.depositAccountDomainService.handleRDAccountClosure(account, paymentDetail, user, command, DateUtils.getBusinessLocalDate(), changes); final String noteText = command.stringValueOfParameterNamed("note"); @@ -903,7 +903,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo checkClientOrGroupActive(account); this.depositAccountDomainService.handleFDAccountPreMatureClosure(account, paymentDetail, user, command, - DateUtils.getLocalDateOfTenant(), changes); + DateUtils.getBusinessLocalDate(), changes); final String noteText = command.stringValueOfParameterNamed("note"); if (StringUtils.isNotBlank(noteText)) { @@ -946,7 +946,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo } this.depositAccountDomainService.handleRDAccountPreMatureClosure(account, paymentDetail, user, command, - DateUtils.getLocalDateOfTenant(), changes); + DateUtils.getBusinessLocalDate(), changes); final String noteText = command.stringValueOfParameterNamed("note"); if (StringUtils.isNotBlank(noteText)) { @@ -1220,12 +1220,12 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo LocalDate postInterestOnDate = null; final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(savingsAccountCharge.getDueLocalDate(), false)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); boolean postReversals = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } @@ -1328,7 +1328,7 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo public void applyChargeDue(final Long savingsAccountChargeId, final Long accountId, @SuppressWarnings("unused") final DepositAccountType depositAccountType) { // always use current date as transaction date for batch job - final LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transactionDate = DateUtils.getBusinessLocalDate(); final SavingsAccountCharge savingsAccountCharge = this.savingsAccountChargeRepository .findOneWithNotFoundDetection(savingsAccountChargeId, accountId); @@ -1360,12 +1360,12 @@ public class DepositAccountWritePlatformServiceJpaRepositoryImpl implements Depo LocalDate postInterestOnDate = null; final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(transactionDate, false)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); boolean postReversals = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, false); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index 9bc289577..9c76ec8c0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -384,7 +384,7 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl DepositAccountType.FIXED_DEPOSIT); checkClientOrGroupActive(account); account.modifyApplication(command, changes); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), DepositAccountType.FIXED_DEPOSIT.resourceName()); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), DepositAccountType.FIXED_DEPOSIT.resourceName()); if (!changes.isEmpty()) { updateFDAndRDCommonChanges(changes, command, account); @@ -474,7 +474,7 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl DepositAccountType.RECURRING_DEPOSIT); checkClientOrGroupActive(account); account.modifyApplication(command, changes); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), DepositAccountType.RECURRING_DEPOSIT.resourceName()); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), DepositAccountType.RECURRING_DEPOSIT.resourceName()); if (!changes.isEmpty()) { updateFDAndRDCommonChanges(changes, command, account); @@ -638,7 +638,7 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl final SavingsAccount savingsAccount = this.depositAccountAssembler.assembleFrom(savingsId, depositAccountType); checkClientOrGroupActive(savingsAccount); - final Map changes = savingsAccount.approveApplication(currentUser, command, DateUtils.getLocalDateOfTenant()); + final Map changes = savingsAccount.approveApplication(currentUser, command, DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); @@ -708,7 +708,7 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl final SavingsAccount savingsAccount = this.depositAccountAssembler.assembleFrom(savingsId, depositAccountType); checkClientOrGroupActive(savingsAccount); - final Map changes = savingsAccount.rejectApplication(currentUser, command, DateUtils.getLocalDateOfTenant()); + final Map changes = savingsAccount.rejectApplication(currentUser, command, DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); @@ -743,7 +743,7 @@ public class DepositApplicationProcessWritePlatformServiceJpaRepositoryImpl impl checkClientOrGroupActive(savingsAccount); final Map changes = savingsAccount.applicantWithdrawsFromApplication(currentUser, command, - DateUtils.getLocalDateOfTenant()); + DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java index afcea5973..ed128d97f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java @@ -30,6 +30,7 @@ import org.apache.fineract.accounting.glaccount.data.GLAccountData; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.service.DateUtils; +import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.charge.data.ChargeData; @@ -55,6 +56,7 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou private final PlatformSecurityContext context; private final ChargeDropdownReadPlatformService chargeDropdownReadPlatformService; private final DropdownReadPlatformService dropdownReadPlatformService; + private final DatabaseSpecificSQLGenerator sqlGenerator; // mappers private final SavingsAccountChargeDueMapper chargeDueMapper; @@ -62,10 +64,11 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou @Autowired public SavingsAccountChargeReadPlatformServiceImpl(final PlatformSecurityContext context, final ChargeDropdownReadPlatformService chargeDropdownReadPlatformService, final JdbcTemplate jdbcTemplate, - final DropdownReadPlatformService dropdownReadPlatformService) { + final DropdownReadPlatformService dropdownReadPlatformService, DatabaseSpecificSQLGenerator sqlGenerator) { this.context = context; this.chargeDropdownReadPlatformService = chargeDropdownReadPlatformService; this.jdbcTemplate = jdbcTemplate; + this.sqlGenerator = sqlGenerator; this.chargeDueMapper = new SavingsAccountChargeDueMapper(); this.dropdownReadPlatformService = dropdownReadPlatformService; } @@ -248,8 +251,8 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou @Override public Collection retrieveChargesWithAnnualFeeDue() { final String sql = "select " + this.chargeDueMapper.schema() - + " where sac.charge_due_date is not null and sac.charge_time_enum = ? " - + " and sac.charge_due_date <= NOW() and sa.status_enum = ? "; + + " where sac.charge_due_date is not null and sac.charge_time_enum = ? " + " and sac.charge_due_date <= " + + sqlGenerator.currentBusinessDate() + " and sa.status_enum = ? "; return this.jdbcTemplate.query(sql, this.chargeDueMapper, // NOSONAR new Object[] { ChargeTimeType.ANNUAL_FEE.getValue(), SavingsAccountStatusType.ACTIVE.getValue() }); @@ -258,10 +261,11 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou @Override public Collection retrieveChargesWithDue() { final String sql = "select " + this.chargeDueMapper.schema() - + " where sac.charge_due_date is not null and sac.charge_due_date <= NOW() and sac.waived = false and sac.is_paid_derived=false and sac.is_active=true and sa.status_enum = ? " + + " where sac.charge_due_date is not null and sac.charge_due_date <= ? and sac.waived = false and sac.is_paid_derived=false and sac.is_active=true and sa.status_enum = ? " + " order by sac.charge_due_date "; - return this.jdbcTemplate.query(sql, this.chargeDueMapper, new Object[] { SavingsAccountStatusType.ACTIVE.getValue() }); // NOSONAR + return this.jdbcTemplate.query(sql, this.chargeDueMapper, + new Object[] { DateUtils.getBusinessLocalDate(), SavingsAccountStatusType.ACTIVE.getValue() }); // NOSONAR } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java index 7e98984e9..a608a6794 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java @@ -22,7 +22,6 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; @@ -103,7 +102,6 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead private final SavingsDropdownReadPlatformService dropdownReadPlatformService; private final DatabaseSpecificSQLGenerator sqlGenerator; private final ChargeReadPlatformService chargeReadPlatformService; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // mappers private final SavingsAccountTransactionTemplateMapper transactionTemplateMapper; @@ -265,7 +263,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead @Override public List retrieveAllSavingsDataForInterestPosting(final boolean backdatedTxnsAllowedTill, final int pageSize, final Integer status, final Long maxSavingsId) { - LocalDate currentDate = DateUtils.getLocalDateOfTenant().minusDays(1); + LocalDate yesterday = DateUtils.getBusinessLocalDate().minusDays(1); String sql = "select " + this.savingAccountMapperForInterestPosting.schema() + "join (select a.id from m_savings_account a where a.id > ? and a.status_enum = ? limit ?) b on b.id = sa.id "; @@ -274,12 +272,11 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead + "where (CASE WHEN sa.interest_posted_till_date is not null THEN tr.transaction_date >= sa.interest_posted_till_date ELSE tr.transaction_date >= sa.activatedon_date END) "; } - sql = sql + " and (sa.interest_posted_till_date is null or sa.interest_posted_till_date < '" + java.sql.Date.valueOf(currentDate) - + "') "; + sql = sql + " and (sa.interest_posted_till_date is null or sa.interest_posted_till_date < ? ) "; sql = sql + " order by sa.id, tr.transaction_date, tr.created_date, tr.id"; List savingsAccountDataList = this.jdbcTemplate.query(sql, this.savingAccountMapperForInterestPosting, // NOSONAR - new Object[] { maxSavingsId, status, pageSize }); + new Object[] { maxSavingsId, status, pageSize, yesterday }); for (SavingsAccountData savingsAccountData : savingsAccountDataList) { this.savingAccountAssembler.assembleSavings(savingsAccountData); } @@ -457,7 +454,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead Integer daysToDormancy = null; Integer daysToEscheat = null; - LocalDate localTenantDate = DateUtils.getLocalDateOfTenant(); + LocalDate localTenantDate = DateUtils.getBusinessLocalDate(); if (isDormancyTrackingActive && statusEnum.equals(SavingsAccountStatusType.ACTIVE.getValue())) { if (subStatusEnum < SavingsAccountSubStatusEnum.ESCHEAT.getValue()) { daysToEscheat = Math.toIntExact( @@ -893,7 +890,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead Integer daysToDormancy = null; Integer daysToEscheat = null; - LocalDate localTenantDate = DateUtils.getLocalDateOfTenant(); + LocalDate localTenantDate = DateUtils.getBusinessLocalDate(); if (isDormancyTrackingActive && statusEnum.equals(SavingsAccountStatusType.ACTIVE.getValue())) { if (subStatusEnum < SavingsAccountSubStatusEnum.ESCHEAT.getValue()) { daysToEscheat = Math @@ -1475,7 +1472,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); - return SavingsAccountTransactionData.template(savingsId, accountNo, DateUtils.getLocalDateOfTenant(), currency); + return SavingsAccountTransactionData.template(savingsId, accountNo, DateUtils.getBusinessLocalDate(), currency); } } @@ -1680,7 +1677,6 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead @Override public List retrieveSavingsIdsPendingInactive(LocalDate tenantLocalDate) { - String formattedTenantLocalDate = formatter.format(tenantLocalDate); List ret = null; StringBuilder sql = new StringBuilder("select sa.id "); sql.append(" from m_savings_account as sa "); @@ -1690,11 +1686,10 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead String compareDate = "(select COALESCE(max(sat.transaction_date), sa.activatedon_date) " + "from m_savings_account_transaction as sat where sat.is_reversed = false" + " and sat.transaction_type_enum in (1,2) and sat.savings_account_id = sa.id)"; - sql.append(" and ").append(sqlGenerator.dateDiff("'" + formattedTenantLocalDate + "'", compareDate)) - .append(" >= sp.days_to_inactive "); + sql.append(" and ").append(sqlGenerator.dateDiff("?", compareDate)).append(" >= sp.days_to_inactive "); try { - ret = this.jdbcTemplate.queryForList(sql.toString(), Long.class); + ret = this.jdbcTemplate.queryForList(sql.toString(), new Object[] { tenantLocalDate }, Long.class); } catch (EmptyResultDataAccessException e) { // ignore empty result scenario } catch (DataAccessException e) { @@ -1706,20 +1701,19 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead @Override public List retrieveSavingsIdsPendingDormant(LocalDate tenantLocalDate) { - String currentDate = formatter.format(tenantLocalDate); List ret = null; StringBuilder sql = new StringBuilder("select sa.id "); sql.append(" from m_savings_account as sa "); sql.append(" inner join m_savings_product as sp on (sa.product_id = sp.id and sp.is_dormancy_tracking_active = true) "); sql.append(" where sa.status_enum = 300 "); sql.append(" and sa.sub_status_enum = 100 "); - sql.append(" and " + sqlGenerator.dateDiff("'" + currentDate + "'", + sql.append(" and " + sqlGenerator.dateDiff("?", "(select COALESCE(max(sat.transaction_date),sa.activatedon_date) from m_savings_account_transaction as sat where sat.is_reversed = false and sat.transaction_type_enum in (1,2) and sat.savings_account_id = sa.id)") + " "); sql.append(" >= sp.days_to_dormancy "); try { - ret = this.jdbcTemplate.queryForList(sql.toString(), Long.class); + ret = this.jdbcTemplate.queryForList(sql.toString(), new Object[] { tenantLocalDate }, Long.class); } catch (EmptyResultDataAccessException e) { // ignore empty result scenario } catch (DataAccessException e) { @@ -1743,7 +1737,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead sql.append(" >= sp.days_to_escheat "); try { - ret = this.jdbcTemplate.queryForList(sql.toString(), Long.class, new Object[] { formatter.format(tenantLocalDate) }); + ret = this.jdbcTemplate.queryForList(sql.toString(), Long.class, new Object[] { tenantLocalDate }); } catch (EmptyResultDataAccessException e) { // ignore empty result scenario } catch (DataAccessException e) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 5235cc1a9..6f9d473fc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -262,7 +262,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); - final Map changes = account.activate(user, command, DateUtils.getLocalDateOfTenant()); + final Map changes = account.activate(user, command, DateUtils.getBusinessLocalDate()); entityDatatableChecksWritePlatformService.runTheCheckForProduct(savingsId, EntityTables.SAVING.getName(), StatusEnum.ACTIVATE.getCode().longValue(), EntityTables.SAVING.getForeignKeyColumnNameOnDatatable(), account.productId()); @@ -483,7 +483,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final SavingsAccountCharge savingsAccountCharge = this.savingsAccountChargeRepository .findOneWithNotFoundDetection(savingsAccountChargeId, accountId); - final LocalDate todaysDate = DateUtils.getLocalDateOfTenant(); + final LocalDate todaysDate = DateUtils.getBusinessLocalDate(); final DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd MM yyyy").withZone(DateUtils.getDateTimeZoneOfTenant()); while (todaysDate.isAfter(savingsAccountCharge.getDueLocalDate())) { @@ -511,7 +511,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, backdatedTxnsAllowedTill); checkClientOrGroupActive(account); - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(15, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; final LocalDate postInterestOnDate = null; @@ -571,7 +571,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } } - LocalDate today = DateUtils.getLocalDateOfTenant(); + LocalDate today = DateUtils.getBusinessLocalDate(); if (transactionDate.isAfter(today)) { throw new PostInterestAsOnDateException(PostInterestAsOnExceptionType.FUTURE_DATE); } @@ -609,7 +609,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); } - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; LocalDate postInterestOnDate = null; @@ -654,7 +654,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final Set existingReversedTransactionIds = new HashSet<>(); updateExistingTransactionsDetails(savingsAccountData, existingTransactionIds, existingReversedTransactionIds); - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(10, MoneyHelper.getRoundingMode()); boolean isInterestTransfer = false; LocalDate postInterestOnDate = null; @@ -768,7 +768,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi "Savings account transaction:" + transactionId + " update not allowed for this savings type", transactionId); } - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final MathContext mc = new MathContext(15, MoneyHelper.getRoundingMode()); if (account.isNotActive()) { @@ -844,7 +844,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi this.savingsAccountTransactionDataValidator.validate(command); - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false); @@ -1030,7 +1030,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi } - final Map accountChanges = account.close(user, command, DateUtils.getLocalDateOfTenant()); + final Map accountChanges = account.close(user, command, DateUtils.getBusinessLocalDate()); changes.putAll(accountChanges); if (!changes.isEmpty()) { this.savingAccountRepositoryWrapper.save(account); @@ -1323,12 +1323,12 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi LocalDate postInterestOnDate = null; final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(savingsAccountCharge.getDueLocalDate(), backdatedTxnsAllowedTill)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); boolean postReversals = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill); } @@ -1445,7 +1445,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi // always use current date as transaction date for batch job AppUser user = null; - final LocalDate transactionDate = DateUtils.getLocalDateOfTenant(); + final LocalDate transactionDate = DateUtils.getBusinessLocalDate(); final SavingsAccountCharge savingsAccountCharge = this.savingsAccountChargeRepository .findOneWithNotFoundDetection(savingsAccountChargeId, accountId); @@ -1476,12 +1476,12 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi LocalDate postInterestOnDate = null; final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(transactionDate, backdatedTxnsAllowedTill)) { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); boolean postReversals = false; account.postInterest(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, isInterestTransfer, postReversals); } else { - final LocalDate today = DateUtils.getLocalDateOfTenant(); + final LocalDate today = DateUtils.getBusinessLocalDate(); account.calculateInterestUsing(mc, today, isInterestTransfer, isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth, postInterestOnDate, backdatedTxnsAllowedTill); } @@ -1550,7 +1550,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final SavingsAccount account = savingsAccountCharge.savingsAccount(); this.savingAccountAssembler.assignSavingAccountHelpers(account); - final LocalDate inactivationOnDate = DateUtils.getLocalDateOfTenant(); + final LocalDate inactivationOnDate = DateUtils.getBusinessLocalDate(); final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java index 9e9a00f17..66a2ae21b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl.java @@ -321,7 +321,7 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId, false); checkClientOrGroupActive(account); account.modifyApplication(command, changes); - account.validateNewApplicationState(DateUtils.getLocalDateOfTenant(), SAVINGS_ACCOUNT_RESOURCE_NAME); + account.validateNewApplicationState(DateUtils.getBusinessLocalDate(), SAVINGS_ACCOUNT_RESOURCE_NAME); account.validateAccountValuesWithProduct(); if (!changes.isEmpty()) { @@ -481,7 +481,7 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl StatusEnum.APPROVE.getCode().longValue(), EntityTables.SAVING.getForeignKeyColumnNameOnDatatable(), savingsAccount.productId()); - final Map changes = savingsAccount.approveApplication(currentUser, command, DateUtils.getLocalDateOfTenant()); + final Map changes = savingsAccount.approveApplication(currentUser, command, DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); @@ -604,7 +604,7 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl StatusEnum.REJECTED.getCode().longValue(), EntityTables.SAVING.getForeignKeyColumnNameOnDatatable(), savingsAccount.productId()); - final Map changes = savingsAccount.rejectApplication(currentUser, command, DateUtils.getLocalDateOfTenant()); + final Map changes = savingsAccount.rejectApplication(currentUser, command, DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); @@ -642,7 +642,7 @@ public class SavingsApplicationProcessWritePlatformServiceJpaRepositoryImpl impl savingsAccount.productId()); final Map changes = savingsAccount.applicantWithdrawsFromApplication(currentUser, command, - DateUtils.getLocalDateOfTenant()); + DateUtils.getBusinessLocalDate()); if (!changes.isEmpty()) { this.savingAccountRepository.save(savingsAccount); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java index 9c23fc322..fda525233 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java @@ -29,11 +29,12 @@ import java.util.HashMap; import java.util.List; import java.util.UUID; import java.util.concurrent.Callable; +import lombok.Setter; import org.apache.fineract.accounting.journalentry.domain.JournalEntryType; import org.apache.fineract.batch.command.CommandStrategyProvider; import org.apache.fineract.batch.service.ResolutionHelper; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; @@ -60,6 +61,7 @@ import org.springframework.transaction.support.TransactionTemplate; @Component @Scope("prototype") +@Setter public class SavingsSchedularInterestPoster implements Callable { private static final Logger LOG = LoggerFactory.getLogger(SavingsSchedularInterestPoster.class); @@ -70,7 +72,7 @@ public class SavingsSchedularInterestPoster implements Callable { private SavingsAccountWritePlatformService savingsAccountWritePlatformService; private SavingsAccountRepositoryWrapper savingsAccountRepository; private SavingsAccountAssembler savingAccountAssembler; - private FineractPlatformTenant tenant; + private FineractContext context; private ConfigurationDomainService configurationDomainService; private boolean backdatedTxnsAllowedTill; private List savingsAccountDataList = new ArrayList<>(); @@ -80,61 +82,13 @@ public class SavingsSchedularInterestPoster implements Callable { private ResolutionHelper resolutionHelper; private SavingsAccountReadPlatformService savingsAccountReadPlatformService; - public void setSavings(Collection savingAccounts) { - this.savingAccounts = savingAccounts; - } - - public void setBackdatedTxnsAllowedTill(final boolean backdatedTxnsAllowedTill) { - this.backdatedTxnsAllowedTill = backdatedTxnsAllowedTill; - } - - public void setSavingsAccountWritePlatformService(SavingsAccountWritePlatformService savingsAccountWritePlatformService) { - this.savingsAccountWritePlatformService = savingsAccountWritePlatformService; - } - - public void setSavingsAccountReadPlatformService(SavingsAccountReadPlatformService savingsAccountReadPlatformService) { - this.savingsAccountReadPlatformService = savingsAccountReadPlatformService; - } - - public void setSavingsAccountRepository(SavingsAccountRepositoryWrapper savingsAccountRepository) { - this.savingsAccountRepository = savingsAccountRepository; - } - - public void setSavingAccountAssembler(SavingsAccountAssembler savingAccountAssembler) { - this.savingAccountAssembler = savingAccountAssembler; - } - - public void setTenant(FineractPlatformTenant tenant) { - this.tenant = tenant; - } - - public void setConfigurationDomainService(ConfigurationDomainService configurationDomainService) { - this.configurationDomainService = configurationDomainService; - } - - public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public void setTransactionTemplate(TransactionTemplate transactionTemplate) { - this.transactionTemplate = transactionTemplate; - } - - public void setResolutionHelper(ResolutionHelper resolutionHelper) { - this.resolutionHelper = resolutionHelper; - } - - public void setStrategyProvider(CommandStrategyProvider commandStrategyProvider) { - this.strategyProvider = commandStrategyProvider; - } - @Override @SuppressFBWarnings(value = { "DMI_RANDOM_USED_ONLY_ONCE" }, justification = "False positive for random object created and used only once") public Void call() throws org.apache.fineract.infrastructure.jobs.exception.JobExecutionException { - ThreadLocalContextUtil.setTenant(tenant); - Integer maxNumberOfRetries = tenant.getConnection().getMaxRetriesOnDeadlock(); - Integer maxIntervalBetweenRetries = tenant.getConnection().getMaxIntervalBetweenRetries(); + ThreadLocalContextUtil.init(this.context); + Integer maxNumberOfRetries = this.context.getTenantContext().getConnection().getMaxRetriesOnDeadlock(); + Integer maxIntervalBetweenRetries = this.context.getTenantContext().getConnection().getMaxIntervalBetweenRetries(); // List responseList = new ArrayList<>(); long start = System.currentTimeMillis(); @@ -299,17 +253,14 @@ public class SavingsSchedularInterestPoster implements Callable { List transRefNo = new ArrayList<>(); for (SavingsAccountData savingsAccountData : savingsAccountDataList) { SavingsAccountSummaryData savingsAccountSummaryData = savingsAccountData.getSummary(); - paramsForSavingsSummary.add(new Object[] { savingsAccountSummaryData.getTotalDeposits(), - savingsAccountSummaryData.getTotalWithdrawals(), savingsAccountSummaryData.getTotalInterestEarned(), - savingsAccountSummaryData.getTotalInterestPosted(), savingsAccountSummaryData.getTotalWithdrawalFees(), - savingsAccountSummaryData.getTotalFeeCharge(), savingsAccountSummaryData.getTotalPenaltyCharge(), - savingsAccountSummaryData.getTotalAnnualFees(), savingsAccountSummaryData.getAccountBalance(), - savingsAccountSummaryData.getTotalOverdraftInterestDerived(), savingsAccountSummaryData.getTotalWithholdTax(), - Date.from(savingsAccountSummaryData.getLastInterestCalculationDate().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()) - .toInstant()), - Date.from(savingsAccountSummaryData.getInterestPostedTillDate().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()) - .toInstant()), - savingsAccountData.getId() }); + paramsForSavingsSummary + .add(new Object[] { savingsAccountSummaryData.getTotalDeposits(), savingsAccountSummaryData.getTotalWithdrawals(), + savingsAccountSummaryData.getTotalInterestEarned(), savingsAccountSummaryData.getTotalInterestPosted(), + savingsAccountSummaryData.getTotalWithdrawalFees(), savingsAccountSummaryData.getTotalFeeCharge(), + savingsAccountSummaryData.getTotalPenaltyCharge(), savingsAccountSummaryData.getTotalAnnualFees(), + savingsAccountSummaryData.getAccountBalance(), savingsAccountSummaryData.getTotalOverdraftInterestDerived(), + savingsAccountSummaryData.getTotalWithholdTax(), savingsAccountSummaryData.getLastInterestCalculationDate(), + savingsAccountSummaryData.getInterestPostedTillDate(), savingsAccountData.getId() }); List savingsAccountTransactionDataList = savingsAccountData.getSavingsAccountTransactionData(); for (SavingsAccountTransactionData savingsAccountTransactionData : savingsAccountTransactionDataList) { if (savingsAccountTransactionData.getId() == null) { @@ -322,9 +273,7 @@ public class SavingsSchedularInterestPoster implements Callable { .atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); } paramsForTransactionInsertion.add(new Object[] { savingsAccountData.getId(), savingsAccountData.getOfficeId(), - savingsAccountTransactionData.getTransactionType().getId(), - Date.from(savingsAccountTransactionData.getTransactionDate().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()) - .toInstant()), + savingsAccountTransactionData.getTransactionType().getId(), savingsAccountTransactionData.getTransactionDate(), savingsAccountTransactionData.getAmount(), balanceEndDate, savingsAccountTransactionData.getBalanceNumberOfDays(), savingsAccountTransactionData.getRunningBalance(), savingsAccountTransactionData.getCumulativeBalance(), savingsAccountTransactionData.getSubmittedOnDate(), diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java index 4fd88edac..5234e5932 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularServiceImpl.java @@ -36,7 +36,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; -import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; +import org.apache.fineract.infrastructure.core.domain.FineractContext; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; @@ -127,11 +127,11 @@ public class SavingsSchedularServiceImpl implements SavingsSchedularService { boolean lastBatch = false; int loopCount = size / batchSize + 1; - FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); + FineractContext context = ThreadLocalContextUtil.getContext(); Long finalMaxSavingsIdInList = maxSavingsIdInList; Callable fetchData = () -> { - ThreadLocalContextUtil.setTenant(tenant); + ThreadLocalContextUtil.init(context); Long maxId = finalMaxSavingsIdInList; if (!queue.isEmpty()) { maxId = Math.max(finalMaxSavingsIdInList, queue.element().get(queue.element().size() - 1).getId()); @@ -155,8 +155,8 @@ public class SavingsSchedularServiceImpl implements SavingsSchedularService { List subList = safeSubList(savingsAccounts, fromIndex, toIndex); SavingsSchedularInterestPoster poster = (SavingsSchedularInterestPoster) this.applicationContext .getBean("savingsSchedularInterestPoster"); - poster.setSavings(subList); - poster.setTenant(tenant); + poster.setSavingAccounts(subList); + poster.setContext(ThreadLocalContextUtil.getContext()); poster.setSavingsAccountWritePlatformService(savingsAccountWritePlatformService); poster.setSavingsAccountReadPlatformService(savingAccountReadPlatformService); poster.setSavingsAccountRepository(savingsAccountRepository); @@ -247,7 +247,7 @@ public class SavingsSchedularServiceImpl implements SavingsSchedularService { @Override @CronTarget(jobName = JobName.UPDATE_SAVINGS_DORMANT_ACCOUNTS) public void updateSavingsDormancyStatus() throws JobExecutionException { - LocalDate tenantLocalDate = DateUtils.getLocalDateOfTenant(); + LocalDate tenantLocalDate = DateUtils.getBusinessLocalDate(); List savingsPendingInactive = savingAccountReadPlatformService.retrieveSavingsIdsPendingInactive(tenantLocalDate); if (null != savingsPendingInactive && savingsPendingInactive.size() > 0) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java index 578d26f57..5925b1ca6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/serialization/ShareAccountDataSerializer.java @@ -239,7 +239,7 @@ public class ShareAccountDataSerializer { private void createChargeTransaction(ShareAccount account) { BigDecimal totalChargeAmount = BigDecimal.ZERO; Set charges = account.getCharges(); - Date currentDate = Date.from(DateUtils.getLocalDateOfTenant().atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date currentDate = Date.from(DateUtils.getBusinessLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant()); for (ShareAccountCharge charge : charges) { if (charge.isActive() && charge.isShareAccountActivation()) { charge.deriveChargeAmount(totalChargeAmount, account.getCurrency()); @@ -593,7 +593,7 @@ public class ShareAccountDataSerializer { public Map validateAndReject(JsonCommand jsonCommand, ShareAccount account) { Map actualChanges = new HashMap<>(); AppUser rejectedUser = this.platformSecurityContext.authenticatedUser(); - Date rejectedDate = DateUtils.getDateOfTenant(); + Date rejectedDate = DateUtils.getBusinessDate(); account.reject(rejectedDate, rejectedUser); actualChanges.put(ShareAccountApiConstants.charges_paramname, Boolean.TRUE); return actualChanges; @@ -1053,7 +1053,7 @@ public class ShareAccountDataSerializer { } AppUser approvedUser = this.platformSecurityContext.authenticatedUser(); - final BigDecimal unitPrice = account.getShareProduct().deriveMarketPrice(DateUtils.getDateOfTenant()); + final BigDecimal unitPrice = account.getShareProduct().deriveMarketPrice(DateUtils.getBusinessDate()); ShareAccountTransaction transaction = ShareAccountTransaction.createRedeemTransaction( Date.from(closedDate.atStartOfDay(ZoneId.systemDefault()).toInstant()), account.getTotalApprovedShares(), unitPrice); account.addAdditionalPurchasedShares(transaction); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java index 79d2b563a..e9e528ed3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java @@ -139,7 +139,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat BigDecimal marketValue = shareProductData.getUnitPrice(); Collection marketDataSet = shareProductData.getMarketPrice(); if (marketDataSet != null && !marketDataSet.isEmpty()) { - Date currentDate = DateUtils.getDateOfTenant(); + Date currentDate = DateUtils.getBusinessDate(); for (ShareProductMarketPriceData data : marketDataSet) { Date futureDate = data.getStartDate(); if (currentDate.after(futureDate)) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountSchedularServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountSchedularServiceImpl.java index 6fcb51f26..9460cc3bc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountSchedularServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountSchedularServiceImpl.java @@ -53,7 +53,7 @@ public class ShareAccountSchedularServiceImpl implements ShareAccountSchedularSe .orElseThrow(); final SavingsAccount savingsAccount = this.savingsAccountAssembler.assembleFrom(savingsId, false); SavingsAccountTransaction savingsAccountTransaction = this.savingsAccountDomainService.handleDividendPayout(savingsAccount, - DateUtils.getLocalDateOfTenant(), shareAccountDividendDetails.getAmount(), false); + DateUtils.getBusinessLocalDate(), shareAccountDividendDetails.getAmount(), false); shareAccountDividendDetails.update(ShareAccountDividendStatusType.POSTED.getValue(), savingsAccountTransaction.getId()); this.shareAccountDividendRepository.saveAndFlush(shareAccountDividendDetails); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java index 7c5a1010d..1a0bb317b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountWritePlatformServiceJpaRepositoryImpl.java @@ -190,7 +190,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA @Override public CommandProcessingResult updateShareAccount(Long accountId, JsonCommand jsonCommand) { try { - Date transactionDate = DateUtils.getDateOfTenant(); + Date transactionDate = DateUtils.getBusinessDate(); ShareAccount account = this.shareAccountRepository.findOneWithNotFoundDetection(accountId); Map changes = this.accountDataSerializer.validateAndUpdate(jsonCommand, account); if (!changes.isEmpty()) { @@ -350,7 +350,7 @@ public class ShareAccountWritePlatformServiceJpaRepositoryImpl implements ShareA journalEntryTransactions.add(transaction.getId()); } } - Date transactionDate = DateUtils.getDateOfTenant(); + Date transactionDate = DateUtils.getBusinessDate(); this.journalEntryWritePlatformService.revertShareAccountJournalEntries(journalEntryTransactions, transactionDate); journalEntryWritePlatformService.createJournalEntriesForShares( populateJournalEntries(account, account.getPendingForApprovalSharePurchaseTransactions())); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java index 0bdb37ea5..629817898 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/domain/ShareProduct.java @@ -19,8 +19,6 @@ package org.apache.fineract.portfolio.shareproducts.domain; import java.math.BigDecimal; -import java.time.Instant; -import java.time.ZonedDateTime; import java.util.Date; import java.util.HashSet; import java.util.Set; @@ -46,7 +44,6 @@ import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType; import org.apache.fineract.portfolio.shareproducts.data.ShareProductMarketPriceData; -import org.apache.fineract.useradministration.domain.AppUser; @SuppressWarnings("serial") @Entity @@ -137,8 +134,7 @@ public class ShareProduct extends AbstractAuditableCustom { final BigDecimal shareCapital, final Long minimumShares, final Long nominalShares, final Long maximumShares, Set marketPrice, Set charges, final Boolean allowDividendCalculationForInactiveClients, final Integer lockinPeriod, final PeriodFrequencyType lockPeriodType, final Integer minimumActivePeriod, - final PeriodFrequencyType minimumActivePeriodForDividendsType, AppUser createdBy, ZonedDateTime createdDate, - AppUser lastModifiedBy, ZonedDateTime lastModifiedDate, final AccountingRuleType accountingRuleType) { + final PeriodFrequencyType minimumActivePeriodForDividendsType, final AccountingRuleType accountingRuleType) { this.name = name; this.shortName = shortName; @@ -159,12 +155,9 @@ public class ShareProduct extends AbstractAuditableCustom { this.lockPeriodType = lockPeriodType; this.minimumActivePeriod = minimumActivePeriod; this.minimumActivePeriodType = minimumActivePeriodForDividendsType; - setCreatedBy(createdBy); - setCreatedDate(Instant.ofEpochMilli(createdDate.toInstant().toEpochMilli())); - setLastModifiedBy(lastModifiedBy); - setLastModifiedDate(Instant.ofEpochMilli(lastModifiedDate.toInstant().toEpochMilli())); - startDate = DateUtils.getDateOfTenant(); - endDate = DateUtils.getDateOfTenant(); + // TODO: is this used at all? + this.startDate = DateUtils.getBusinessDate(); + this.endDate = DateUtils.getBusinessDate(); if (accountingRuleType != null) { this.accountingRule = accountingRuleType.getValue(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/serialization/ShareProductDataSerializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/serialization/ShareProductDataSerializer.java index dd4e40c04..69c93a40f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/serialization/ShareProductDataSerializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareproducts/serialization/ShareProductDataSerializer.java @@ -26,7 +26,6 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; -import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -45,7 +44,6 @@ import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.InvalidJsonException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.portfolio.charge.domain.Charge; @@ -56,18 +54,12 @@ import org.apache.fineract.portfolio.shareproducts.constants.ShareProductApiCons import org.apache.fineract.portfolio.shareproducts.data.ShareProductMarketPriceData; import org.apache.fineract.portfolio.shareproducts.domain.ShareProduct; import org.apache.fineract.portfolio.shareproducts.domain.ShareProductMarketPrice; -import org.apache.fineract.useradministration.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ShareProductDataSerializer { - private final FromJsonHelper fromApiJsonHelper; - - private final ChargeRepositoryWrapper chargeRepository; - - private final PlatformSecurityContext platformSecurityContext; private static final Set supportedParametersForCreate = new HashSet<>(Arrays.asList(ShareProductApiConstants.locale_paramname, ShareProductApiConstants.name_paramname, ShareProductApiConstants.shortname_paramname, ShareProductApiConstants.shortname_paramname, ShareProductApiConstants.description_paramname, @@ -85,10 +77,12 @@ public class ShareProductDataSerializer { AccountingConstants.SharesProductAccountingParams.SHARES_EQUITY.getValue(), AccountingConstants.SharesProductAccountingParams.SHARES_REFERENCE.getValue(), AccountingConstants.SharesProductAccountingParams.SHARES_SUSPENSE.getValue())); - private static final Set supportedParametersForDivident = new HashSet<>(Arrays.asList(ShareProductApiConstants.locale_paramname, ShareProductApiConstants.dateFormatParamName, ShareProductApiConstants.dividendPeriodStartDateParamName, ShareProductApiConstants.dividendPeriodEndDateParamName, ShareProductApiConstants.dividendAmountParamName)); + private final FromJsonHelper fromApiJsonHelper; + private final ChargeRepositoryWrapper chargeRepository; + private final PlatformSecurityContext platformSecurityContext; @Autowired public ShareProductDataSerializer(final FromJsonHelper fromApiJsonHelper, final ChargeRepositoryWrapper chargeRepository, @@ -102,7 +96,9 @@ public class ShareProductDataSerializer { if (StringUtils.isBlank(jsonCommand.json())) { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForCreate); final List dataValidationErrors = new ArrayList<>(); @@ -187,14 +183,10 @@ public class ShareProductDataSerializer { Integer lockinPeriod = this.fromApiJsonHelper.extractIntegerNamed(ShareProductApiConstants.lockperiod_paramname, element, locale); PeriodFrequencyType lockPeriodType = extractPeriodType(ShareProductApiConstants.lockinperiodfrequencytype_paramname, element); - AppUser createdBy = platformSecurityContext.authenticatedUser(); - AppUser modifiedBy = createdBy; - ZonedDateTime createdDate = DateUtils.getLocalDateTimeOfTenant().atZone(DateUtils.getDateTimeZoneOfTenant()); - ZonedDateTime modifiedOn = createdDate; ShareProduct product = new ShareProduct(productName, shortName, description, externalId, currency, totalNumberOfShares, sharesIssued, unitPrice, shareCapitalValue, minimumClientShares, nominalClientShares, maximumClientShares, marketPriceSet, charges, allowdividendsForInactiveClients, lockinPeriod, lockPeriodType, minimumActivePeriod, minimumActivePeriodType, - createdBy, createdDate, modifiedBy, modifiedOn, accountingRuleType); + accountingRuleType); for (ShareProductMarketPrice data : marketPriceSet) { data.setShareProduct(product); @@ -276,7 +268,9 @@ public class ShareProductDataSerializer { if (StringUtils.isBlank(jsonCommand.json())) { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForCreate); final List dataValidationErrors = new ArrayList<>(); @@ -482,7 +476,9 @@ public class ShareProductDataSerializer { if (StringUtils.isBlank(jsonCommand.json())) { throw new InvalidJsonException(); } - final Type typeOfMap = new TypeToken>() {}.getType(); + final Type typeOfMap = new TypeToken>() { + + }.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForDivident); final List dataValidationErrors = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java index 02948a5ae..8b79ee3f3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java @@ -133,7 +133,7 @@ public class TaxComponent extends AbstractAuditableCustom { } private void updateStartDate(final JsonCommand command, final Map changes, boolean setAsCurrentDate) { - LocalDate startDate = DateUtils.getLocalDateOfTenant(); + LocalDate startDate = DateUtils.getBusinessLocalDate(); if (command.parameterExists(TaxApiConstants.startDateParamName)) { LocalDate startDateFromUI = command.localDateValueOfParameterNamed(TaxApiConstants.startDateParamName); if (startDateFromUI != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java index 631fd5307..6fc9a7750 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/serialization/TaxValidator.java @@ -152,7 +152,7 @@ public class TaxValidator { if (this.fromApiJsonHelper.parameterExists(TaxApiConstants.startDateParamName, element)) { final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.startDateParamName, element); baseDataValidator.reset().parameter(TaxApiConstants.startDateParamName).value(startDate) - .validateDateAfter(DateUtils.getLocalDateOfTenant()); + .validateDateAfter(DateUtils.getBusinessLocalDate()); } throwExceptionIfValidationWarningsExist(dataValidationErrors); } @@ -247,7 +247,7 @@ public class TaxValidator { dateFormat, locale); baseDataValidator.reset() .parameter(TaxApiConstants.taxComponentsParamName + "." + TaxApiConstants.endDateParamName + ".at.index." + i) - .value(endDate).ignoreIfNull().validateDateAfter(DateUtils.getLocalDateOfTenant()); + .value(endDate).ignoreIfNull().validateDateAfter(DateUtils.getBusinessLocalDate()); final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.startDateParamName, taxComponent, dateFormat, locale); if (endDate != null && startDate != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxAssembler.java index 371522528..7e226838e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/service/TaxAssembler.java @@ -102,7 +102,7 @@ public class TaxAssembler { throwExceptionIfValidationWarningsExist(dataValidationErrors); LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.startDateParamName, element); if (startDate == null) { - startDate = DateUtils.getLocalDateOfTenant(); + startDate = DateUtils.getBusinessLocalDate(); } return TaxComponent.createTaxComponent(name, percentage, debitGlAccountType, debitGlAccount, creditGlAccountType, creditGlAccount, @@ -141,7 +141,7 @@ public class TaxAssembler { final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed(TaxApiConstants.endDateParamName, taxComponent, dateFormat, locale); if (endDate == null && startDate == null) { - startDate = DateUtils.getLocalDateOfTenant(); + startDate = DateUtils.getBusinessLocalDate(); } TaxGroupMappings mappings = null; if (isUpdate && mappingId != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java index a73dfb19a..dace0392f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java @@ -244,9 +244,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr loan.updateGroup(destinationGroup); if (inheritDestinationGroupLoanOfficer != null && inheritDestinationGroupLoanOfficer == true && destinationGroupLoanOfficer != null) { - loan.reassignLoanOfficer(destinationGroupLoanOfficer, DateUtils.getLocalDateOfTenant()); + loan.reassignLoanOfficer(destinationGroupLoanOfficer, DateUtils.getBusinessLocalDate()); } else if (newLoanOfficer != null) { - loan.reassignLoanOfficer(newLoanOfficer, DateUtils.getLocalDateOfTenant()); + loan.reassignLoanOfficer(newLoanOfficer, DateUtils.getBusinessLocalDate()); } this.loanRepositoryWrapper.saveAndFlush(loan); } @@ -489,10 +489,9 @@ public class TransferWritePlatformServiceJpaRepositoryImpl implements TransferWr this.noteWritePlatformService.createAndPersistClientNote(client, jsonCommand); Date proposedTransferDate = transferDate != null ? Date.from(transferDate.atStartOfDay(ZoneId.systemDefault()).toInstant()) : null; - this.clientTransferDetailsRepositoryWrapper.save(ClientTransferDetails.instance(client.getId(), client.getOffice().getId(), - destinationOffice.getId(), proposedTransferDate, transferEventType.getValue(), - Date.from(DateUtils.getLocalDateTimeOfTenant().atZone(DateUtils.getDateTimeZoneOfTenant()).toInstant()), - this.context.authenticatedUser().getId())); + this.clientTransferDetailsRepositoryWrapper.save( + ClientTransferDetails.instance(client.getId(), client.getOffice().getId(), destinationOffice.getId(), proposedTransferDate, + transferEventType.getValue(), DateUtils.getBusinessDate(), this.context.authenticatedUser().getId())); } private List assembleListOfClients(final JsonCommand command) { 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 3cc6775e7..d063483dd 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 @@ -22,7 +22,6 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDate; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; @@ -69,9 +68,6 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService private static final Logger LOG = LoggerFactory.getLogger(ScheduledJobRunnerServiceImpl.class); - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - private final DateTimeFormatter formatterWithTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - private final RoutingDataSourceServiceFactory dataSourceServiceFactory; private final SavingsAccountWritePlatformService savingsAccountWritePlatformService; private final SavingsAccountChargeReadPlatformService savingsAccountChargeReadPlatformService; @@ -194,7 +190,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService 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 < " - + sqlGenerator.subDate(sqlGenerator.currentDate(), "COALESCE(mpl.overdue_days_for_npa, 0)", "day") + + sqlGenerator.subDate(sqlGenerator.currentBusinessDate(), "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 "); @@ -241,7 +237,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService 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 "; StringBuilder sb = new StringBuilder(); - String currentDate = formatterWithTime.format(DateUtils.getLocalDateTimeOfTenant()); + String currentDate = DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER); int iterations = 0; for (Map details : scheduleDetails) { Long count = (Long) details.get("futureInstallemts"); @@ -265,7 +261,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService sb.append("("); sb.append(savingsId); sb.append(",'"); - sb.append(formatter.format(lastDepositDate)); + sb.append(lastDepositDate.format(DateUtils.DEFAULT_DATE_FORMATER)); sb.append("',"); sb.append(installmentNumber); sb.append(","); @@ -339,7 +335,7 @@ public class ScheduledJobRunnerServiceImpl implements ScheduledJobRunnerService for (Date tbGap : tbGaps) { LocalDate convDate = ZonedDateTime.ofInstant(tbGap.toInstant(), DateUtils.getDateTimeZoneOfTenant()).toLocalDate(); - int days = Math.toIntExact(ChronoUnit.DAYS.between(convDate, DateUtils.getLocalDateOfTenant())); + int days = Math.toIntExact(ChronoUnit.DAYS.between(convDate, DateUtils.getBusinessLocalDate())); if (days < 1) { continue; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java b/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java index 75353b75b..1402b10cd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/service/SpmService.java @@ -82,7 +82,7 @@ public class SpmService { this.deactivateSurvey(previousSurvey.getId()); } // set valid from to start of today - LocalDate validFrom = DateUtils.getLocalDateOfTenant(); + LocalDate validFrom = DateUtils.getBusinessLocalDate(); // set valid to for 100 years Calendar cal = Calendar.getInstance(); cal.setTime(Date.from(validFrom.atStartOfDay(ZoneId.systemDefault()).toInstant())); @@ -133,7 +133,7 @@ public class SpmService { this.securityContext.authenticatedUser(); final Survey survey = findById(id); - LocalDate validFrom = DateUtils.getLocalDateOfTenant(); + LocalDate validFrom = DateUtils.getBusinessLocalDate(); Calendar cal = Calendar.getInstance(); cal.setTime(Date.from(validFrom.atStartOfDay(ZoneId.systemDefault()).toInstant())); cal.add(Calendar.YEAR, 100); diff --git a/fineract-provider/src/main/java/org/apache/fineract/spm/util/ScorecardMapper.java b/fineract-provider/src/main/java/org/apache/fineract/spm/util/ScorecardMapper.java index 484a8c070..111a5ddb2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/spm/util/ScorecardMapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/spm/util/ScorecardMapper.java @@ -52,7 +52,7 @@ public final class ScorecardMapper { ScorecardMapper.setQuestionAndResponse(scorecardValue, scorecard, survey); scorecard.setAppUser(appUser); scorecard.setClient(client); - scorecard.setCreatedOn(Date.from(DateUtils.getLocalDateOfTenant().atStartOfDay(ZoneId.systemDefault()).toInstant())); + scorecard.setCreatedOn(Date.from(DateUtils.getBusinessLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant())); scorecard.setValue(scorecardValue.getValue()); } } else { diff --git a/fineract-provider/src/test/java/org/apache/fineract/TestSuite.java b/fineract-provider/src/test/java/org/apache/fineract/TestSuite.java index 6a4f819e0..a19862348 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/TestSuite.java +++ b/fineract-provider/src/test/java/org/apache/fineract/TestSuite.java @@ -31,4 +31,6 @@ import org.springframework.test.context.web.WebAppConfiguration; @WebAppConfiguration @ContextConfiguration(classes = TestConfiguration.class) // @SpringBootTest(classes = TestConfiguration.class) -public class TestSuite {} +public class TestSuite { + +} diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java index b896f8334..a73f7d613 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/businessdate/service/BusinessDateWritePlatformServiceTest.java @@ -37,8 +37,11 @@ import org.apache.fineract.infrastructure.businessdate.validator.BusinessDateDat import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.service.DateUtils; +import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; @@ -69,6 +72,11 @@ public class BusinessDateWritePlatformServiceTest { @Captor private ArgumentCaptor businessDateArgumentCaptor; + @BeforeEach + public void init() { + ThreadLocalContextUtil.setTenant(new FineractPlatformTenant(1L, "default", "Default", "Asia/Kolkata", null)); + } + @Test public void businessDateIsNotEnabled() { JsonCommand command = JsonCommand.from(""); diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTest.java index 8b55f176c..ab8e62d30 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTest.java @@ -22,9 +22,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.Collection; import java.util.Collections; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.portfolio.charge.domain.Charge; import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType; import org.apache.fineract.portfolio.charge.domain.ChargePaymentMode; @@ -82,7 +82,7 @@ public class LoanTest { */ private LoanCharge buildLoanCharge() { return new LoanCharge(mock(Loan.class), mock(Charge.class), new BigDecimal(100), new BigDecimal(100), - ChargeTimeType.TRANCHE_DISBURSEMENT, ChargeCalculationType.FLAT, DateUtils.getLocalDateOfTenant(), - ChargePaymentMode.REGULAR, 1, new BigDecimal(100)); + ChargeTimeType.TRANCHE_DISBURSEMENT, ChargeCalculationType.FLAT, LocalDate.of(2022, 6, 27), ChargePaymentMode.REGULAR, 1, + new BigDecimal(100)); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java index 1a0337f45..62927af04 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AccountingScenarioIntegrationTest.java @@ -125,6 +125,7 @@ public class AccountingScenarioIntegrationTest { Utils.initializeRESTAssured(); requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); this.loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec); @@ -844,13 +845,13 @@ public class AccountingScenarioIntegrationTest { final ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); // MAKE 1 List fromDateList = (List) loanSchedule.get(1).get("fromDate"); - LocalDate fromDateLocal = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate fromDateLocal = LocalDate.now(Utils.getZoneIdOfTenant()); fromDateLocal = fromDateLocal.withYear((int) fromDateList.get(0)); fromDateLocal = fromDateLocal.withMonth((int) fromDateList.get(1)); fromDateLocal = fromDateLocal.withDayOfMonth((int) fromDateList.get(2)); List dueDateList = (List) loanSchedule.get(1).get("dueDate"); - LocalDate dueDateLocal = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate dueDateLocal = LocalDate.now(Utils.getZoneIdOfTenant()); dueDateLocal = dueDateLocal.withYear((int) dueDateList.get(0)); dueDateLocal = dueDateLocal.withMonth((int) dueDateList.get(1)); dueDateLocal = dueDateLocal.withDayOfMonth((int) dueDateList.get(2)); @@ -957,13 +958,13 @@ public class AccountingScenarioIntegrationTest { final ArrayList loanSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, responseSpec, loanID); // MAKE 1 List fromDateList = (List) loanSchedule.get(1).get("fromDate"); - LocalDate fromDateLocal = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate fromDateLocal = LocalDate.now(Utils.getZoneIdOfTenant()); fromDateLocal = fromDateLocal.withYear((int) fromDateList.get(0)); fromDateLocal = fromDateLocal.withMonth((int) fromDateList.get(1)); fromDateLocal = fromDateLocal.withDayOfMonth((int) fromDateList.get(2)); List dueDateList = (List) loanSchedule.get(1).get("dueDate"); - LocalDate dueDateLocal = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate dueDateLocal = LocalDate.now(Utils.getZoneIdOfTenant()); dueDateLocal = dueDateLocal.withYear((int) dueDateList.get(0)); dueDateLocal = dueDateLocal.withMonth((int) dueDateList.get(1)); dueDateLocal = dueDateLocal.withDayOfMonth((int) dueDateList.get(2)); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java index b5324799b..690dfe88a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanIntegrationTest.java @@ -42,7 +42,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CollateralManagementHelper; import org.apache.fineract.integrationtests.common.SchedulerJobHelper; @@ -99,6 +98,7 @@ public class ClientLoanIntegrationTest { this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec); this.schedulerJobHelper = new SchedulerJobHelper(this.requestSpec); @@ -4854,8 +4854,7 @@ public class ClientLoanIntegrationTest { // FINERACT-885: As loan may not have started exactly four months ago, // make final payment today and not four months from start (as that may be in the future) - fourMonthsfromNowCalendar - .setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + fourMonthsfromNowCalendar.setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); final String now = Utils.convertDateToURLFormat(fourMonthsfromNowCalendar); this.loanTransactionHelper.makeRefundByCash(now, Float.parseFloat("20"), loanID); @@ -5035,8 +5034,7 @@ public class ClientLoanIntegrationTest { // FINERACT-885: As loan may not have started exactly four months ago, // make final payment today and not four months from start (as that may be in the future) - fourMonthsfromNowCalendar - .setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + fourMonthsfromNowCalendar.setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); final String now = Utils.convertDateToURLFormat(fourMonthsfromNowCalendar); this.loanTransactionHelper.makeRefundByCash(now, Float.parseFloat("20"), loanID); @@ -5239,8 +5237,7 @@ public class ClientLoanIntegrationTest { // FINERACT-885: As loan may not have started exactly four months ago, // make final payment today and not four months from start (as that may be in the future) - fourMonthsfromNowCalendar - .setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + fourMonthsfromNowCalendar.setTime(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); final String now = Utils.convertDateToURLFormat(fourMonthsfromNowCalendar); final String FROM_LOAN_ACCOUNT_TYPE = "1"; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java index 9cc08a415..7a85e0a88 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java @@ -39,7 +39,6 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CommonConstants; import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper; @@ -82,6 +81,7 @@ public class ClientSavingsIntegrationTest { Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); } @@ -1920,7 +1920,7 @@ public class ClientSavingsIntegrationTest { savingsList.add(savingsId); final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM yyyy"); - LocalDate transactionDate = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); + LocalDate transactionDate = LocalDate.now(Utils.getZoneIdOfTenant()); for (int i = 0; i < 4; i++) { String transactionDateValue = formatter.format(transactionDate); Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(i), DEPOSIT_AMOUNT, @@ -1953,7 +1953,7 @@ public class ClientSavingsIntegrationTest { balance -= chargeAmt; assertEquals(balance, summary.get("accountBalance"), "Verifying account Balance"); - String transactionDateValue = formatter.format(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + String transactionDateValue = formatter.format(LocalDate.now(Utils.getZoneIdOfTenant())); Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(1), DEPOSIT_AMOUNT, transactionDateValue, CommonConstants.RESPONSE_RESOURCE_ID); savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(1)); @@ -1972,7 +1972,7 @@ public class ClientSavingsIntegrationTest { balance -= chargeAmt; assertEquals(balance, summary.get("accountBalance"), "Verifying account Balance"); - transactionDateValue = formatter.format(LocalDate.now(DateUtils.getDateTimeZoneOfTenant())); + transactionDateValue = formatter.format(LocalDate.now(Utils.getZoneIdOfTenant())); depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(2), DEPOSIT_AMOUNT, transactionDateValue, CommonConstants.RESPONSE_RESOURCE_ID); savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(2)); @@ -2225,7 +2225,7 @@ public class ClientSavingsIntegrationTest { error.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); Integer releaseTransactionId = this.savingsAccountHelper.releaseAmount(savingsId, holdTransactionId); - Date today = Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); + Date today = Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant()); String todayDate = today.toString(); SimpleDateFormat dt1 = new SimpleDateFormat("dd MMM yyyy"); todayDate = dt1.format(today).toString(); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientUndoRejectAndWithdrawalIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientUndoRejectAndWithdrawalIntegrationTest.java index ed795a376..b6916532c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientUndoRejectAndWithdrawalIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientUndoRejectAndWithdrawalIntegrationTest.java @@ -25,13 +25,9 @@ import io.restassured.builder.ResponseSpecBuilder; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; import io.restassured.specification.ResponseSpecification; -import java.text.DateFormat; -import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; -import java.util.Locale; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CommonConstants; import org.apache.fineract.integrationtests.common.Utils; @@ -55,6 +51,7 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); this.clientHelper = new ClientHelper(this.requestSpec, this.responseSpec); @@ -124,9 +121,8 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { HashMap status = ClientHelper.getClientStatus(requestSpec, responseSpec, String.valueOf(clientId)); ClientStatusChecker.verifyClientPending(status); - DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - Date todaysDate = Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); - final String undoRejectDate = dateFormat.format(todaysDate); + LocalDate todaysDate = Utils.getLocalDateOfTenant(); + final String undoRejectDate = todaysDate.format(Utils.dateFormatter); ArrayList> clientErrorData = validationErrorHelper.undoRejectedclient(clientId, CommonConstants.RESPONSE_ERROR, undoRejectDate); @@ -156,11 +152,9 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { status = this.clientHelper.rejectClient(clientId); ClientStatusChecker.verifyClientRejected(status); - DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - Date tomorrowsDate = Date - .from(Utils.getLocalDateOfTenant().plusDays(1).atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); - final String undoRejectDate = dateFormat.format(tomorrowsDate); - ArrayList> clientErrorData = validationErrorHelper.undoWithdrawclient(clientId, + LocalDate tomorrowsDate = Utils.getLocalDateOfTenant().plusDays(1); + final String undoRejectDate = tomorrowsDate.format(Utils.dateFormatter); + ArrayList> clientErrorData = validationErrorHelper.undoRejectedclient(clientId, CommonConstants.RESPONSE_ERROR, undoRejectDate); assertEquals("validation.msg.client.reopenedDate.is.greater.than.date", clientErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); @@ -233,9 +227,8 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { // GET CLIENT STATUS HashMap status = ClientHelper.getClientStatus(requestSpec, responseSpec, String.valueOf(clientId)); - DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - Date todaysDate = Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); - final String undoWithdrawDate = dateFormat.format(todaysDate); + LocalDate todaysDate = Utils.getLocalDateOfTenant(); + final String undoWithdrawDate = todaysDate.format(Utils.dateFormatter); ArrayList> clientErrorData = validationErrorHelper.undoWithdrawclient(clientId, CommonConstants.RESPONSE_ERROR, undoWithdrawDate); @@ -265,10 +258,8 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { status = this.clientHelper.withdrawClient(clientId); ClientStatusChecker.verifyClientWithdrawn(status); - DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - Date tomorrowsDate = Date - .from(Utils.getLocalDateOfTenant().plusDays(1).atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); - final String undoWithdrawDate = dateFormat.format(tomorrowsDate); + LocalDate tomorrowsDate = Utils.getLocalDateOfTenant().plusDays(1); + final String undoWithdrawDate = tomorrowsDate.format(Utils.dateFormatter); ArrayList> clientErrorData = validationErrorHelper.undoWithdrawclient(clientId, CommonConstants.RESPONSE_ERROR, undoWithdrawDate); assertEquals("validation.msg.client.reopenedDate.is.greater.than.date", @@ -276,7 +267,6 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest { status = this.clientHelper.undoWithdrawn(clientId); ClientStatusChecker.verifyClientPending(status); - } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/FixedDepositTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/FixedDepositTest.java index a0e8c2ffc..0f1d078a3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/FixedDepositTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/FixedDepositTest.java @@ -39,7 +39,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import org.apache.fineract.accounting.common.AccountingConstants.FinancialActivity; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CommonConstants; import org.apache.fineract.integrationtests.common.SchedulerJobHelper; @@ -1569,10 +1568,10 @@ public class FixedDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); activationDate.add(Calendar.DAY_OF_MONTH, -1); - ZonedDateTime startDate = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime startDate = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Calendar prematureClosureDate = Calendar.getInstance(); - ZonedDateTime endDate = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime endDate = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Integer depositedPeriod = Math.toIntExact(ChronoUnit.MONTHS.between(startDate.toLocalDate(), endDate.toLocalDate())); @@ -1683,10 +1682,10 @@ public class FixedDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); activationDate.add(Calendar.DAY_OF_MONTH, -1); - ZonedDateTime startDate = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime startDate = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Calendar prematureClosureDate = Calendar.getInstance(); - ZonedDateTime endDate = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime endDate = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Integer depositedPeriod = Math.toIntExact(ChronoUnit.MONTHS.between(startDate.toLocalDate(), endDate.toLocalDate())); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupSavingsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupSavingsIntegrationTest.java index cd7b0e1a3..ebc5d1319 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupSavingsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/GroupSavingsIntegrationTest.java @@ -31,12 +31,10 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CommonConstants; import org.apache.fineract.integrationtests.common.GroupHelper; @@ -74,6 +72,7 @@ public class GroupSavingsIntegrationTest { Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); } @@ -771,7 +770,7 @@ public class GroupSavingsIntegrationTest { assertEquals(expectedNextDueDate, nextDueDate); this.savingsAccountHelper.closeSavingsAccountAndGetBackRequiredField(savingsId, "true", null, - sdf.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()))); + Utils.getLocalDateOfTenant().format(Utils.dateFormatter)); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/InstanceModeIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/InstanceModeIntegrationTest.java index 3e0e38413..251490c4c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/InstanceModeIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/InstanceModeIntegrationTest.java @@ -52,6 +52,7 @@ public class InstanceModeIntegrationTest { requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + requestSpec.header("Fineract-Platform-TenantId", "default"); responseSpec200 = new ResponseSpecBuilder().expectStatusCode(200).build(); responseSpec405 = new ResponseSpecBuilder().expectStatusCode(405).build(); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java index 05b9161af..9c66a5dd3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java @@ -73,6 +73,7 @@ public class LoanReschedulingWithinCenterTest { this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); this.loanApplicationApprovalTest = new LoanApplicationApprovalTest(); this.generalResponseSpec = new ResponseSpecBuilder().build(); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/RecurringDepositTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/RecurringDepositTest.java index 53c46ecf6..af2f2e9a5 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/RecurringDepositTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/RecurringDepositTest.java @@ -36,7 +36,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import org.apache.fineract.accounting.common.AccountingConstants.FinancialActivity; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CommonConstants; import org.apache.fineract.integrationtests.common.SchedulerJobHelper; @@ -1920,10 +1919,10 @@ public class RecurringDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); activationDate.add(Calendar.DAY_OF_MONTH, -1); - ZonedDateTime start = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime start = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Calendar prematureClosureDate = Calendar.getInstance(); - ZonedDateTime end = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime end = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Integer depositedPeriod = Math.toIntExact(ChronoUnit.MONTHS.between(start.toLocalDate(), end.toLocalDate())); @@ -2061,10 +2060,10 @@ public class RecurringDepositTest { Calendar activationDate = Calendar.getInstance(); activationDate.add(Calendar.MONTH, -1); activationDate.add(Calendar.DAY_OF_MONTH, -1); - ZonedDateTime start = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime start = ZonedDateTime.ofInstant(activationDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Calendar prematureClosureDate = Calendar.getInstance(); - ZonedDateTime end = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), DateUtils.getDateTimeZoneOfTenant()); + ZonedDateTime end = ZonedDateTime.ofInstant(prematureClosureDate.getTime().toInstant(), Utils.getZoneIdOfTenant()); Integer depositedPeriod = Math.toIntExact(ChronoUnit.MONTHS.between(start.toLocalDate(), end.toLocalDate())); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java index 4af42f74a..c2022024f 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SchedulerJobsTest.java @@ -142,5 +142,6 @@ public class SchedulerJobsTest { for (String jobName : schedulerJobHelper.getAllSchedulerJobNames()) { schedulerJobHelper.executeAndAwaitJob(jobName); } + GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterDomain.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterDomain.java index 590d1ef73..f030516c1 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterDomain.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterDomain.java @@ -22,7 +22,6 @@ import com.google.gson.Gson; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -155,8 +154,7 @@ public class CenterDomain implements Comparable { } else { map.put("active", "false"); if (submittedDate == null) { - map.put("submittedOnDate", - Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + map.put("submittedOnDate", Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); } else { map.put("submittedOnDate", submittedDate); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java index 1d1c9c40f..ba6ec8cf6 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java @@ -61,16 +61,9 @@ public class ClientHelper { private static final String UNDOREJECT_CLIENT_COMMAND = "undoRejection"; private static final String UNDOWITHDRAWN_CLIENT_COMMAND = "undoWithdrawal"; private static final Integer LEGALFORM_ID_PERSON = 1; - - public static final String CREATED_DATE = "27 November 2014"; - public static final String CREATED_DATE_PLUS_ONE = "28 November 2014"; - public static final String CREATED_DATE_PLUS_TWO = "29 November 2014"; - - public static final String CREATED_DATE_MINUS_ONE = "27 November 2014"; - public static final String TRANSACTION_DATE = "01 March 2013"; - public static final String LAST_TRANSACTION_DATE = "01 March 2013"; - public static final String DATE_FORMAT = "dd MMMM yyyy"; - public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm"; + public static final String CREATED_DATE = Utils.getLocalDateOfTenant().minusDays(5).format(Utils.dateFormatter); + public static final String CREATED_DATE_PLUS_ONE = Utils.getLocalDateOfTenant().minusDays(4).format(Utils.dateFormatter); + public static final String CREATED_DATE_PLUS_TWO = Utils.getLocalDateOfTenant().minusDays(3).format(Utils.dateFormatter); private static final Gson GSON = new JSON().getGson(); @@ -210,7 +203,7 @@ public class ClientHelper { map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "true"); map.put("activationDate", dateOfJoining); @@ -225,7 +218,7 @@ public class ClientHelper { map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "false"); map.put("submittedOnDate", submittedOnDate); @@ -240,7 +233,7 @@ public class ClientHelper { map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "false"); map.put("submittedOnDate", "04 March 2014"); @@ -257,7 +250,7 @@ public class ClientHelper { dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4)); dataMap.put("Number of Dependents", 5); dataMap.put("Time of Visit", "01 December 2016 04:03"); - dataMap.put("dateFormat", DATE_TIME_FORMAT); + dataMap.put("dateFormat", Utils.DATE_TIME_FORMAT); dataMap.put("Date of Approval", "02 December 2016 00:00"); datatableMap.put("registeredTableName", registeredTableName); datatableMap.put("data", dataMap); @@ -271,7 +264,7 @@ public class ClientHelper { map.put("officeId", officeId); map.put("fullname", Utils.randomNameGenerator("Client_FullName_", 5)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "true"); map.put("activationDate", dateOfJoining); @@ -287,7 +280,7 @@ public class ClientHelper { map.put("officeId", officeId); map.put("fullname", Utils.randomNameGenerator("Client_FullName_", 5)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "true"); map.put("activationDate", dateOfJoining); @@ -308,7 +301,7 @@ public class ClientHelper { map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("locale", "en"); map.put("active", "true"); map.put("activationDate", dateOfJoining); @@ -477,7 +470,7 @@ public class ClientHelper { public static String getSpecifiedDueDateChargesClientAsJSON(final String chargeId, final String dueDate) { final HashMap map = new HashMap<>(); map.put("locale", "en_GB"); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("dueDate", dueDate); map.put("chargeId", chargeId); map.put("amount", "200"); @@ -488,7 +481,7 @@ public class ClientHelper { public static String getPayChargeJSON(final String date, String amount) { final HashMap map = new HashMap<>(); map.put("locale", "en_GB"); - map.put("dateFormat", DATE_FORMAT); + map.put("dateFormat", Utils.DATE_FORMAT); map.put("transactionDate", date); map.put("amount", amount); String json = GSON.toJson(map); @@ -674,6 +667,7 @@ public class ClientHelper { public static PostClientsRequest defaultClientCreationRequest() { return new PostClientsRequest().officeId(1).legalFormId(LEGALFORM_ID_PERSON) .firstname(Utils.randomNameGenerator("Client_FirstName_", 5)).lastname(Utils.randomNameGenerator("Client_LastName_", 5)) - .externalId(randomIDGenerator("ID_", 7)).dateFormat(DATE_FORMAT).locale("en").active(true).activationDate("04 March 2011"); + .externalId(randomIDGenerator("ID_", 7)).dateFormat(Utils.DATE_FORMAT).locale("en").active(true) + .activationDate("04 March 2011"); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java index 6300c8c25..12c3e4cc3 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/GlobalConfigurationHelper.java @@ -444,7 +444,7 @@ public class GlobalConfigurationHelper { isBusinessDateEnabled.put("id", 44); isBusinessDateEnabled.put("name", "enable_business_date"); isBusinessDateEnabled.put("value", 0); - isBusinessDateEnabled.put("enabled", true); + isBusinessDateEnabled.put("enabled", false); isBusinessDateEnabled.put("trapDoor", false); defaults.add(isBusinessDateEnabled); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java index b87f7d590..c90d3f803 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ProvisioningIntegrationTest.java @@ -35,7 +35,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.accounting.Account; import org.apache.fineract.integrationtests.common.accounting.AccountHelper; import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder; @@ -69,6 +68,7 @@ public class ProvisioningIntegrationTest { this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec); Assumptions.assumeTrue(!isAlreadyProvisioningEntriesCreated()); @@ -261,7 +261,7 @@ public class ProvisioningIntegrationTest { Date date1 = formatter.parse(date); DateFormat simple = new SimpleDateFormat("dd MMMM yyyy", Locale.US); String formattedString = simple - .format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + .format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); Date currentDate = simple.parse(formattedString); if (date1.getTime() == currentDate.getTime()) { provisioningetryAlreadyCreated = true; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java index 32b1d1caf..e40a52d3f 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java @@ -40,6 +40,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -48,7 +50,6 @@ import java.util.Locale; import java.util.Map; import java.util.TimeZone; import org.apache.commons.lang3.StringUtils; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.http.conn.HttpHostConnectException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +78,11 @@ public final class Utils { private static final String HEALTH_URL = "/fineract-provider/actuator/health"; private static final String LOGIN_URL = "/fineract-provider/api/v1/authentication?" + TENANT_IDENTIFIER; + public static final String DATE_FORMAT = "dd MMMM yyyy"; + public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm"; + public static final DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().appendPattern(DATE_FORMAT).toFormatter(); + public static final DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().appendPattern(DATE_TIME_FORMAT).toFormatter(); + public static void initializeRESTAssured() { RestAssured.baseURI = "https://localhost"; RestAssured.port = 8443; @@ -287,19 +293,18 @@ public final class Utils { return dateFormat.format(dateToBeConvert.getTime()); } - public static LocalDate getLocalDateOfTenant() { - LocalDate today = LocalDate.now(DateUtils.getDateTimeZoneOfTenant()); - final ZoneId zone = ZoneId.of(TENANT_TIME_ZONE); - if (zone != null) { - today = LocalDate.now(zone); - } - return today; - } - public static TimeZone getTimeZoneOfTenant() { return TimeZone.getTimeZone(TENANT_TIME_ZONE); } + public static ZoneId getZoneIdOfTenant() { + return ZoneId.of(TENANT_TIME_ZONE); + } + + public static LocalDate getLocalDateOfTenant() { + return LocalDate.now(getZoneIdOfTenant()); + } + public static Date convertJsonElementAsDate(JsonElement jsonElement) { if (jsonElement.isJsonArray()) { JsonArray jsonArray = jsonElement.getAsJsonArray(); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsHelper.java index 4cc1b8f38..f69a4ecef 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsHelper.java @@ -29,7 +29,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.report.ReportData; import org.slf4j.Logger; @@ -110,7 +109,7 @@ public class CampaignsHelper { map.put("triggerType", triggerType); if (2 == triggerType) { map.put("recurrenceStartDate", - LocalDateTime.now(DateUtils.getDateTimeZoneOfTenant()).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); + LocalDateTime.now(Utils.getZoneIdOfTenant()).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); map.put("frequency", 1); map.put("interval", "1"); } @@ -138,7 +137,7 @@ public class CampaignsHelper { map.put("triggerType", triggerType); if (2 == triggerType) { map.put("recurrenceStartDate", - LocalDateTime.now(DateUtils.getDateTimeZoneOfTenant()).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); + LocalDateTime.now(Utils.getZoneIdOfTenant()).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); } map.put("campaignName", Utils.randomNameGenerator("Campaign_Name_", 5)); map.put("campaignType", 1); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java index 8532b5ffb..8e704927a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/CampaignsTest.java @@ -86,6 +86,7 @@ public class CampaignsTest { Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); this.campaignsHelper = new CampaignsHelper(this.requestSpec, this.responseSpec); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/provisioning/ProvisioningHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/provisioning/ProvisioningHelper.java index fceb9fdef..30ddb1987 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/provisioning/ProvisioningHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/provisioning/ProvisioningHelper.java @@ -28,7 +28,6 @@ import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.accounting.Account; @@ -48,8 +47,7 @@ public final class ProvisioningHelper { map.put("loanProducts", addLoanProducts(loanProducts)); map.put("definitions", addProvisioningCategories(categories, liability, expense)); DateFormat simple = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - String formattedString = simple - .format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())); + String formattedString = simple.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant())); String criteriaName = "General Provisioning Criteria" + formattedString + rand.nextLong(); map.put("criteriaName", criteriaName); @@ -63,8 +61,7 @@ public final class ProvisioningHelper { map.put("locale", "en"); map.put("dateFormat", "dd MMMM yyyy"); DateFormat simple = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - map.put("date", - simple.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()))); + map.put("date", simple.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant()))); String provisioningEntryCreateJson = new Gson().toJson(map); return provisioningEntryCreateJson; } @@ -75,8 +72,7 @@ public final class ProvisioningHelper { map.put("locale", "en"); map.put("dateFormat", "dd MMMM yyyy"); DateFormat simple = new SimpleDateFormat("dd MMMM yyyy", Locale.US); - map.put("date", - simple.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()))); + map.put("date", simple.format(Date.from(Utils.getLocalDateOfTenant().atStartOfDay(Utils.getZoneIdOfTenant()).toInstant()))); String provisioningEntryCreateJson = new Gson().toJson(map); return provisioningEntryCreateJson; } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java index d8e7fcc4c..ff84125de 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareAccountIntegrationTests.java @@ -26,13 +26,13 @@ import io.restassured.specification.RequestSpecification; import io.restassured.specification.ResponseSpecification; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.charges.ChargesHelper; @@ -55,6 +55,7 @@ public class ShareAccountIntegrationTests { Utils.initializeRESTAssured(); this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); } @@ -115,7 +116,7 @@ public class ShareAccountIntegrationTests { Map shareAccountDataForUpdate = new HashMap<>(); shareAccountDataForUpdate.put("requestedShares", 30); - shareAccountDataForUpdate.put("applicationDate", "02 Mar 2016"); + shareAccountDataForUpdate.put("applicationDate", "02 March 2016"); shareAccountDataForUpdate.put("dateFormat", "dd MMMM yyyy"); shareAccountDataForUpdate.put("locale", "en_GB"); String updateShareAccountJsonString = new Gson().toJson(shareAccountDataForUpdate); @@ -132,14 +133,13 @@ public class ShareAccountIntegrationTests { Calendar cal = Calendar.getInstance(); cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2)); Date date = cal.getTime(); - DateFormat simple = new SimpleDateFormat("dd MMM yyyy"); - Assertions.assertEquals("02 Mar 2016", simple.format(date)); + DateFormat simple = new SimpleDateFormat("dd MMMM yyyy"); + Assertions.assertEquals("02 March 2016", simple.format(date)); } @Test @SuppressWarnings("unchecked") public void testShareAccountApproval() { - DateFormat simple = new SimpleDateFormat("dd MMM yyyy"); shareProductHelper = new ShareProductHelper(); final Integer productId = createShareProduct(); Assertions.assertNotNull(productId); @@ -167,7 +167,7 @@ public class ShareAccountIntegrationTests { Map approveMap = new HashMap<>(); approveMap.put("note", "Share Account Approval Note"); approveMap.put("dateFormat", "dd MMMM yyyy"); - approveMap.put("approvedDate", "01 Jan 2016"); + approveMap.put("approvedDate", "01 January 2016"); approveMap.put("locale", "en"); String approve = new Gson().toJson(approveMap); ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec); @@ -176,10 +176,8 @@ public class ShareAccountIntegrationTests { Assertions.assertEquals("shareAccountStatusType.approved", String.valueOf(statusMap.get("code"))); Map timelineMap = (Map) shareAccountData.get("timeline"); List dateList = (List) timelineMap.get("approvedDate"); - Calendar cal = Calendar.getInstance(); - cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2)); - Date approvedDate = cal.getTime(); - Assertions.assertEquals("01 Jan 2016", simple.format(approvedDate)); + LocalDate approvedDate = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); + Assertions.assertEquals("01 January 2016", approvedDate.format(Utils.dateFormatter)); List> transactions = (List>) shareAccountData.get("purchasedShares"); Assertions.assertNotNull(transactions); Assertions.assertEquals(2, transactions.size()); @@ -187,9 +185,7 @@ public class ShareAccountIntegrationTests { Map transaction = transactions.get(i); Map transactionTypeMap = (Map) transaction.get("type"); dateList = (List) transaction.get("purchasedDate"); - cal = Calendar.getInstance(); - cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2)); - Date date = cal.getTime(); + LocalDate transactionDate = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); String transactionType = (String) transactionTypeMap.get("code"); if (transactionType.equals("purchasedSharesType.purchased")) { Assertions.assertEquals("25", String.valueOf(transaction.get("numberOfShares"))); @@ -197,14 +193,11 @@ public class ShareAccountIntegrationTests { Assertions.assertEquals("52.0", String.valueOf(transaction.get("amountPaid"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice"))); - Assertions.assertEquals("01 Jan 2016", simple.format(date)); + Assertions.assertEquals("01 January 2016", transactionDate.format(Utils.dateFormatter)); } else if (transactionType.equals("charge.payment")) { Assertions.assertEquals("2.0", String.valueOf(transaction.get("amount"))); Assertions.assertEquals("0", String.valueOf(transaction.get("amountPaid"))); - Assertions.assertEquals( - simple.format( - Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())), - simple.format(date)); + Assertions.assertEquals(Utils.getLocalDateOfTenant(), transactionDate); } } @@ -245,13 +238,12 @@ public class ShareAccountIntegrationTests { String rejectJson = new Gson().toJson(rejectMap); ShareAccountTransactionHelper.postCommand("reject", shareAccountId, rejectJson, requestSpec, responseSpec); shareAccountData = ShareAccountTransactionHelper.retrieveShareAccount(shareAccountId, requestSpec, responseSpec); - DateFormat simple = new SimpleDateFormat("dd MMM yyyy"); Map statusMap = (Map) shareAccountData.get("status"); Assertions.assertEquals("shareAccountStatusType.rejected", String.valueOf(statusMap.get("code"))); Map timelineMap = (Map) shareAccountData.get("timeline"); List dateList = (List) timelineMap.get("rejectedDate"); - Date rejectedDate = DateUtils.createDate(dateList.get(0), dateList.get(1), dateList.get(2)); - Assertions.assertEquals(simple.format(DateUtils.convertLocalDateToDate(Utils.getLocalDateOfTenant())), simple.format(rejectedDate)); + LocalDate rejectedDate = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); + Assertions.assertEquals(Utils.getLocalDateOfTenant(), rejectedDate); List> transactions = (List>) shareAccountData.get("purchasedShares"); Assertions.assertNotNull(transactions); @@ -260,7 +252,7 @@ public class ShareAccountIntegrationTests { Map transaction = transactions.get(i); Map transactionTypeMap = (Map) transaction.get("type"); dateList = (List) transaction.get("purchasedDate"); - Date date = DateUtils.createDate(dateList.get(0), dateList.get(1), dateList.get(2)); + LocalDate date = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); String transactionType = (String) transactionTypeMap.get("code"); if (transactionType.equals("purchasedSharesType.purchased")) { Assertions.assertEquals("25", String.valueOf(transaction.get("numberOfShares"))); @@ -268,13 +260,12 @@ public class ShareAccountIntegrationTests { Assertions.assertEquals("50.0", String.valueOf(transaction.get("amountPaid"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice"))); - Assertions.assertEquals("01 Jan 2016", simple.format(date)); + Assertions.assertEquals("01 January 2016", date.format(Utils.dateFormatter)); } else if (transactionType.equals("charge.payment")) { Assertions.assertEquals("2.0", String.valueOf(transaction.get("amount"))); Assertions.assertEquals("0", String.valueOf(transaction.get("amountPaid"))); - Date transactionDate = Date - .from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant()); - Assertions.assertEquals(simple.format(transactionDate), simple.format(date)); + LocalDate transactionDate = Utils.getLocalDateOfTenant(); + Assertions.assertEquals(transactionDate, date); } } @@ -286,7 +277,6 @@ public class ShareAccountIntegrationTests { @Test @SuppressWarnings("unchecked") public void testShareAccountUndoApproval() { - DateFormat simple = new SimpleDateFormat("dd MMM yyyy"); shareProductHelper = new ShareProductHelper(); final Integer productId = createShareProduct(); Assertions.assertNotNull(productId); @@ -314,7 +304,7 @@ public class ShareAccountIntegrationTests { Map approveMap = new HashMap<>(); approveMap.put("note", "Share Account Approval Note"); approveMap.put("dateFormat", "dd MMMM yyyy"); - approveMap.put("approvedDate", "01 Jan 2016"); + approveMap.put("approvedDate", "01 January 2016"); approveMap.put("locale", "en"); String approve = new Gson().toJson(approveMap); ShareAccountTransactionHelper.postCommand("approve", shareAccountId, approve, requestSpec, responseSpec); @@ -323,10 +313,9 @@ public class ShareAccountIntegrationTests { Assertions.assertEquals("shareAccountStatusType.approved", String.valueOf(statusMap.get("code"))); Map timelineMap = (Map) shareAccountData.get("timeline"); List dateList = (List) timelineMap.get("approvedDate"); - Calendar cal = Calendar.getInstance(); - cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2)); - Date approvedDate = cal.getTime(); - Assertions.assertEquals("01 Jan 2016", simple.format(approvedDate)); + + LocalDate approvedDate = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); + Assertions.assertEquals("01 January 2016", approvedDate.format(Utils.dateFormatter)); // Undo Approval share Account Map undoApprovalMap = new HashMap<>(); @@ -345,9 +334,7 @@ public class ShareAccountIntegrationTests { Map transaction = transactions.get(i); Map transactionTypeMap = (Map) transaction.get("type"); dateList = (List) transaction.get("purchasedDate"); - cal = Calendar.getInstance(); - cal.set(dateList.get(0), dateList.get(1) - 1, dateList.get(2)); - Date date = cal.getTime(); + LocalDate transactionDate = LocalDate.of(dateList.get(0), dateList.get(1), dateList.get(2)); String transactionType = (String) transactionTypeMap.get("code"); if (transactionType.equals("purchasedSharesType.purchased")) { Assertions.assertEquals("25", String.valueOf(transaction.get("numberOfShares"))); @@ -355,14 +342,11 @@ public class ShareAccountIntegrationTests { Assertions.assertEquals("0.0", String.valueOf(transaction.get("amountPaid"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("chargeAmount"))); Assertions.assertEquals("2.0", String.valueOf(transaction.get("purchasedPrice"))); - Assertions.assertEquals("01 Jan 2016", simple.format(date)); + Assertions.assertEquals("01 January 2016", transactionDate.format(Utils.dateFormatter)); } else if (transactionType.equals("charge.payment")) { Assertions.assertEquals("2.0", String.valueOf(transaction.get("amount"))); Assertions.assertEquals("0", String.valueOf(transaction.get("amountPaid"))); - Assertions.assertEquals( - simple.format( - Date.from(Utils.getLocalDateOfTenant().atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant())), - simple.format(date)); + Assertions.assertEquals(Utils.getLocalDateOfTenant(), transactionDate); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java index 97913bea4..151ffebbb 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/shares/ShareProductHelper.java @@ -27,7 +27,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.integrationtests.common.Utils; import org.junit.jupiter.api.Assertions; import org.slf4j.Logger; @@ -106,7 +105,7 @@ public class ShareProductHelper { public ShareProductHelper withMarketPrice() { this.marketPrices = new ArrayList<>(); - LocalDate currentDate = DateUtils.getLocalDateOfTenant(); + LocalDate currentDate = Utils.getLocalDateOfTenant(); String[] prices = { "3.0", "4.0", "5.0", "6.0", "7.0" }; DateFormat simple = new SimpleDateFormat("dd MMMM yyyy", Locale.US); for (int i = 0; i < prices.length; i++) { diff --git a/integration-tests/src/test/resources/logback.xml b/integration-tests/src/test/resources/logback.xml new file mode 100644 index 000000000..30cf96640 --- /dev/null +++ b/integration-tests/src/test/resources/logback.xml @@ -0,0 +1,41 @@ + + + + + false + + + + true + + %green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n + + + + + + + + + + +