/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed 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.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.application.admin.business.service;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.mifos.accounts.api.TransactionImport;
import org.mifos.accounts.loan.util.helpers.LoanConstants;
import org.mifos.application.admin.servicefacade.ViewOrganizationSettingsServiceFacade;
import org.mifos.application.master.MessageLookup;
import org.mifos.application.master.business.MifosCurrency;
import org.mifos.application.meeting.util.helpers.WeekDay;
import org.mifos.application.servicefacade.ApplicationContextProvider;
import org.mifos.application.util.helpers.YesNoFlag;
import org.mifos.config.AccountingRules;
import org.mifos.config.ClientRules;
import org.mifos.config.FiscalCalendarRules;
import org.mifos.config.LocaleSetting;
import org.mifos.config.ProcessFlowRules;
import org.mifos.config.business.MifosConfigurationManager;
import org.mifos.config.business.service.ConfigurationBusinessService;
import org.mifos.framework.image.service.ImageStorageManager;
import org.mifos.framework.plugin.PluginManager;
import org.mifos.framework.util.ConfigurationLocator;
public class ViewOrganizationSettingsServiceFacadeWebTier implements ViewOrganizationSettingsServiceFacade {
private static final String DELIMITER = ", ";
@Override
public Properties getOrganizationSettings(HttpSession httpSession) {
Properties orgSettings = new Properties();
orgSettings.putAll(getFiscalRules());
orgSettings.putAll(getLocaleInfo());
orgSettings.putAll(getAccountingRules());
orgSettings.put("currencies", getCurrencies());
orgSettings.putAll(getClientRules());
orgSettings.putAll(getProcessFlowRules());
orgSettings.putAll(getMiscRules(httpSession));
orgSettings.putAll(getConfigurationContent());
orgSettings.putAll(getGeneralConfig());
orgSettings.putAll(getMpesa());
orgSettings.putAll(getRest());
return orgSettings;
}
private Properties getFiscalRules() {
Properties fiscalRules = new Properties();
fiscalRules.setProperty("workingDays", getWorkingDays());
FiscalCalendarRules fiscalCalendarRules = new FiscalCalendarRules();
Short startOfWeekValue = fiscalCalendarRules.getStartOfWeek();
WeekDay startOfWeek = WeekDay.getWeekDay(startOfWeekValue);
String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(startOfWeek.getPropertiesKey());
startOfWeek.setWeekdayName(weekdayName);
fiscalRules.setProperty("startOfWeek", startOfWeek.getName());
fiscalRules.setProperty("offDays", getOffDays());
fiscalRules.setProperty("holidayMeeting", fiscalCalendarRules.getScheduleMeetingIfNonWorkingDay());
return fiscalRules;
}
private Properties getLocaleInfo() {
LocaleSetting configLocale = new LocaleSetting();
Properties localeInfo = new Properties();
localeInfo.setProperty("localeCountryCode", configLocale.getCountryCode());
localeInfo.setProperty("localeLanguageCode", configLocale.getLanguageCode());
localeInfo.setProperty("localeDirection", configLocale.getDirection());
return localeInfo;
}
private Properties getAccountingRules() {
Properties accountingRules = new Properties();
accountingRules.setProperty("maxInterest", AccountingRules.getMaxInterest().toString());
accountingRules.setProperty("minInterest", AccountingRules.getMinInterest().toString());
accountingRules.setProperty("digitsBeforeDecimal", AccountingRules.getDigitsBeforeDecimal().toString());
accountingRules.setProperty("intDigitsAfterDecimal", AccountingRules.getDigitsAfterDecimalForInterest()
.toString());
accountingRules.setProperty("intDigitsBeforeDecimal", AccountingRules.getDigitsBeforeDecimalForInterest()
.toString());
accountingRules.setProperty("interestDays", AccountingRules.getNumberOfInterestDays().toString());
accountingRules.setProperty("currencyRoundingMode", AccountingRules.getCurrencyRoundingMode().toString());
accountingRules.setProperty("initialRoundingMode", AccountingRules.getInitialRoundingMode().toString());
accountingRules.setProperty("finalRoundingMode", AccountingRules.getFinalRoundingMode().toString());
accountingRules.setProperty("minCashFlowThreshold", AccountingRules.getMinCashFlowThreshold().toString());
accountingRules.setProperty("maxCashFlowThreshold", AccountingRules.getMaxCashFlowThreshold().toString());
accountingRules.setProperty("minRepaymentCapacity", AccountingRules.getMinRepaymentCapacity().toString());
accountingRules.setProperty("maxRepaymentCapacity", AccountingRules.getMaxRepaymentCapacity().toString());
accountingRules.setProperty("minIndebtednessRatio", AccountingRules.getMinIndebtednessRatio().toString());
accountingRules.setProperty("maxIndebtednessRatio", AccountingRules.getMaxIndebtednessRatio().toString());
accountingRules.setProperty("digitsAfterDecimalForCashFlow", AccountingRules.getDigitsAfterDecimalForCashFlowValidations().toString());
accountingRules.setProperty("GLNamesMode", String.valueOf(AccountingRules.getGlNamesMode()));
accountingRules.setProperty("simpleAccountingModule", booleanToYesNo(AccountingRules.getSimpleAccountingStatus()));
accountingRules.setProperty("overdueInterestPaidFirst", booleanToYesNo(AccountingRules.isOverdueInterestPaidFirst()));
return accountingRules;
}
private List<Properties> getCurrencies() {
List<Properties> currencies = new ArrayList<Properties>();
for (MifosCurrency currency : AccountingRules.getCurrencies()) {
Properties currencyRules = new Properties();
currencyRules.setProperty("code", currency.getCurrencyCode());
currencyRules.setProperty("digitsAfterDecimal", AccountingRules.getDigitsAfterDecimal(currency).toString());
currencyRules.setProperty("finalRoundOffMultiple", AccountingRules.getFinalRoundOffMultiple(currency).toString());
currencyRules.setProperty("initialRoundOffMultiple", AccountingRules.getInitialRoundOffMultiple(currency).toString());
currencies.add(currencyRules);
}
return currencies;
}
private Properties getClientRules() {
Properties clientRules = new Properties();
clientRules.setProperty("centerHierarchyExists", booleanToYesNo(ClientRules.getCenterHierarchyExists()));
clientRules.setProperty("loansForGroups", booleanToYesNo(ClientRules.getGroupCanApplyLoans()));
clientRules.setProperty("clientsOutsideGroups", booleanToYesNo(ClientRules.getClientCanExistOutsideGroup()));
clientRules.setProperty("nameSequence", StringUtils.join(ClientRules.getNameSequence(), DELIMITER));
clientRules.setProperty("isAgeCheckEnabled",booleanToYesNo(ClientRules.isAgeCheckEnabled()));
clientRules.setProperty("isAgeCheckWarningInsteadOfErrorEnabled",booleanToYesNo(ClientRules.isAgeCheckWarningInsteadOfErrorEnabled()));
clientRules.setProperty("maximumAge", String.valueOf(ClientRules.getMaximumAgeForNewClient()));
clientRules.setProperty("minimumAge", String.valueOf(ClientRules.getMinimumAgeForNewClient()));
clientRules.setProperty("isFamilyDetailsRequired",booleanToYesNo(ClientRules.isFamilyDetailsRequired()));
clientRules.setProperty("maximumNumberOfFamilyMembers",String.valueOf(ClientRules.getMaximumNumberOfFamilyMembers()));
return clientRules;
}
private Properties getProcessFlowRules() {
Properties processFlowRules = new Properties();
processFlowRules.setProperty("clientPendingState", booleanToYesNo(ProcessFlowRules
.isClientPendingApprovalStateEnabled()));
processFlowRules.setProperty("groupPendingState", booleanToYesNo(ProcessFlowRules
.isGroupPendingApprovalStateEnabled()));
processFlowRules.setProperty("loanPendingState", booleanToYesNo(ProcessFlowRules
.isLoanPendingApprovalStateEnabled()));
processFlowRules.setProperty("savingsPendingState", booleanToYesNo(ProcessFlowRules
.isSavingsPendingApprovalStateEnabled()));
return processFlowRules;
}
private Properties getMiscRules(HttpSession httpSession) {
Properties misc = new Properties();
Integer timeoutVal = httpSession.getMaxInactiveInterval() / 60;
misc.setProperty("sessionTimeout", timeoutVal.toString());
misc.setProperty("backDatedTransactions", booleanToYesNo(AccountingRules.isBackDatedTxnAllowed()));
misc.setProperty("backDatedApprovals", booleanToYesNo(AccountingRules.isBackDatedApprovalAllowed()));
ConfigurationBusinessService cbs = new ConfigurationBusinessService();
misc.setProperty("glim", booleanToYesNo(cbs.isGlimEnabled()));
misc.setProperty("lsim", booleanToYesNo(cbs.isRepaymentIndepOfMeetingEnabled()));
MifosConfigurationManager configurationManager = MifosConfigurationManager.getInstance();
misc.setProperty("backDatedLoanProductCreationAllowed", booleanToYesNo(
configurationManager.getBoolean(LoanConstants.BACK_DATED_LOAN_PRODUCT_CREATION)));
misc.setProperty("grouploanwithmembers", booleanToYesNo(AccountingRules.isGroupLoanWithMembers()));
return misc;
}
private String getWorkingDays() {
List<WeekDay> workDaysList = new FiscalCalendarRules().getWorkingDays();
List<String> workDayNames = new ArrayList<String>();
for (WeekDay workDay : workDaysList) {
String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(workDay.getPropertiesKey());
workDay.setWeekdayName(weekdayName);
workDayNames.add(workDay.getName());
}
return StringUtils.join(workDayNames, DELIMITER);
}
private String getOffDays() {
List<Short> offDaysList = new FiscalCalendarRules().getWeekDayOffList();
List<String> offDayNames = new ArrayList<String>();
for (Short offDayNum : offDaysList) {
WeekDay weekDay = WeekDay.getWeekDay(offDayNum);
String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class).lookup(weekDay.getPropertiesKey());
weekDay.setWeekdayName(weekdayName);
offDayNames.add(weekDay.getName());
}
return StringUtils.join(offDayNames, DELIMITER);
}
private String booleanToYesNo(boolean bool) {
MessageLookup m = ApplicationContextProvider.getBean(MessageLookup.class);
if (bool) {
return m.lookup(YesNoFlag.YES);
}
return m.lookup(YesNoFlag.NO);
}
@Override
public Map<String, String> getDisplayablePluginsProperties() {
Map<String, String> result = new LinkedHashMap<String, String>();
for (TransactionImport ti : new PluginManager().loadImportPlugins()) {
Map<String, String> properties = ti.getPropertiesForAdminDisplay();
Iterator<String> iterator = properties.keySet().iterator();
while(iterator.hasNext())
{
String key = String.valueOf(iterator.next());
String value = String.valueOf(properties.get(key));
if (key != null && value != null) {
result.put(key, value);
}
}
}
return result;
}
private Properties getConfigurationContent() {
Properties configContent = new Properties();
MifosConfigurationManager configuration = MifosConfigurationManager.getInstance();
String branchMangerRoleName = configuration.getString("RolesAndPermissions.BranchManager.RoleName");
configContent.put("branchManagerRoleName", branchMangerRoleName);
return configContent;
}
private Properties getMpesa() {
Properties configContent = new Properties();
MifosConfigurationManager configuration = MifosConfigurationManager.getInstance();
String disbursalMax = configuration.getString("MPESA.DisbursalMax");
configContent.put("disbursalMax", disbursalMax);
return configContent;
}
private Properties getRest() {
Properties configContent = new Properties();
MifosConfigurationManager configuration = MifosConfigurationManager.getInstance();
String approvalRequired = configuration.getString("REST.approvalRequired");
configContent.put("approvalRequired", approvalRequired);
return configContent;
}
public String getUploadStorageDirectory() {
ConfigurationLocator configurationLocator = new ConfigurationLocator();
String reportPath = configurationLocator.getConfigurationDirectory() + "/uploads";
String uploadsDir = reportPath;
if (File.separatorChar == '\\') { // windows platform
uploadsDir = uploadsDir.replaceAll("/", "\\\\");
}
return uploadsDir;
}
public String getAdminDocumentStorageDirectory() {
return getUploadStorageDirectory().endsWith(File.separator) ? getUploadStorageDirectory() + "adminReport"
: getUploadStorageDirectory() + File.separator + "adminReport";
}
public String getUploadQGDirectory() {
String uploadsQGDir = MifosConfigurationManager.getInstance().getString("GeneralConfig.UploadQGDirectory",
"file:$MIFOS_CONF/uploads/questionGroups");
return uploadsQGDir;
}
public String getClientStorageDirectory() {
return getUploadStorageDirectory().endsWith(File.separator) ? getUploadStorageDirectory() + "clients"
: getUploadStorageDirectory() + File.separator + "clients";
}
public String getLoanStorageDirectory() {
return getUploadStorageDirectory().endsWith(File.separator) ? getUploadStorageDirectory() + "loans"
: getUploadStorageDirectory() + File.separator + "loans";
}
private Properties getGeneralConfig() {
Properties configContent = new Properties();
MifosConfigurationManager configuration = MifosConfigurationManager.getInstance();
String maxPointsPerPPISurvey = configuration.getString("GeneralConfig.MaxPointsPerPPISurvey");
String batchSizeForBatchJobs = configuration.getString("GeneralConfig.BatchSizeForBatchJobs");
String recordCommittingSizeForBatchJobs = configuration.getString("GeneralConfig.RecordCommittingSizeForBatchJobs");
String outputIntervalForBatchJobs = configuration.getString("GeneralConfig.OutputIntervalForBatchJobs");
String allowDataPrefetchingWhenSavingCollectionSheets = configuration.getString("GeneralConfig.allowDataPrefetchingWhenSavingCollectionSheets");
String shutdownCountdownNotificationThreshold = configuration.getString("GeneralConfig.ShutdownCountdownNotificationThreshold");
String imageStorageType = configuration.getString("GeneralConfig.ImageStorageType");
String uploadStorageDirectory = getUploadStorageDirectory();
String uploadQGDirectory = new ConfigurationLocator().resolvePath(getUploadQGDirectory());
String imageStorageDirectory = ImageStorageManager.getStorageLocation();
configContent.put("maxPointsPerPPISurvey", maxPointsPerPPISurvey);
configContent.put("batchSizeForBatchJobs", batchSizeForBatchJobs);
configContent.put("recordCommittingSizeForBatchJobs", recordCommittingSizeForBatchJobs);
configContent.put("outputIntervalForBatchJobs", outputIntervalForBatchJobs);
configContent.put("allowDataPrefetchingWhenSavingCollectionSheets", allowDataPrefetchingWhenSavingCollectionSheets);
configContent.put("shutdownCountdownNotificationThreshold", shutdownCountdownNotificationThreshold);
configContent.put("imageStorageType", imageStorageType);
configContent.put("uploadStorageDirectory", uploadStorageDirectory);
configContent.put("uploadQGDirectory", uploadQGDirectory);
configContent.put("imageStorageDirectory", imageStorageDirectory);
return configContent;
}
}