How To Use Mifos Application Services Delivered in JAR

Example of using application services outside of mifos project.

As an example, here is a maven project that uses mifos jars, creates application context so it may invoke java based application services.

Spring Security not fully implemented for JAR

Any spring scecurity that exists on application services (service facades) is not yet being invoked

Create maven java project with the following pom.xml files

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.mifos</groupId>
  <artifactId>migration-demo</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>migration-demo</name>
  <url>http://maven.apache.org</url>

  <properties>
        <jdk.version>1.6</jdk.version>
    </properties>

    <dependencies>
    	<dependency>
            <groupId>org.mifos</groupId>
            <artifactId>mifos-serviceInterfaces</artifactId>
            <version>1.8-SNAPSHOT</version>
        </dependency>
	    <dependency>
            <groupId>org.mifos</groupId>
            <artifactId>mifos-questionnaire</artifactId>
            <version>1.8-SNAPSHOT</version>
        </dependency>
	    <dependency>
	    	<groupId>org.mifos</groupId>
	    	<artifactId>mifos-appdomain</artifactId>
	    	<version>1.8-SNAPSHOT</version>
	    </dependency>
    </dependencies>

    <build>
    	<plugins>
    		<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <debug>true</debug>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
    	</plugins>
    </build>
</project>

Main Java class that showing simmple retrieval of Audit logs for a savings account

package demo.migration;

import java.util.List;

import org.mifos.application.servicefacade.SavingsServiceFacade;
import org.mifos.dto.domain.AuditLogDto;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MigrationDemo {

	public static void main(String[] args) {

		System.setProperty("mifos.mode", "main");

		String[] configLocations = new String[2];
		configLocations[0] = "classpath:/org/mifos/config/resources/applicationContext.xml";
		configLocations[1] = "classpath:META-INF/spring/QuestionnaireContext.xml";

		// NOTE: Questionaire is coupled with applicationContext due to
		// QuestionaireMigration effort.
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(configLocations);

		// NOTE: need to ensure hibernateUtil is initialised
		StaticHibernateUtil.initialize();

		System.out.println("fetching service");
		SavingsServiceFacade savingsServiceFacade = applicationContext.getBean(SavingsServiceFacade.class);
		System.out.println("found");

                // use a savings account id that exists in your 'mifos' schema and one that has 'audit' or 'change logs' would be best
		List<AuditLogDto> auditlogs = savingsServiceFacade.retrieveSavingsAccountAuditLogs(Long.valueOf("16"));
		System.out.println("printing logs...");
		for (AuditLogDto auditLogDto : auditlogs) {
			System.out.println(auditLogDto.getDate());
			System.out.println(auditLogDto.getField());
			System.out.println(auditLogDto.getUser());
		}
	}
}

Main Java class showing example of creating a Savings Product

package demo.migration;

import java.math.BigDecimal;
import java.util.List;

import org.joda.time.DateTime;
import org.mifos.accounts.productdefinition.util.helpers.ApplicableTo;
import org.mifos.accounts.productdefinition.util.helpers.InterestCalcType;
import org.mifos.accounts.productdefinition.util.helpers.SavingsType;
import org.mifos.application.admin.servicefacade.AdminServiceFacade;
import org.mifos.application.master.business.MifosCurrency;
import org.mifos.application.master.util.helpers.PaymentTypes;
import org.mifos.application.meeting.util.helpers.RecurrenceType;
import org.mifos.application.servicefacade.SavingsServiceFacade;
import org.mifos.dto.domain.AuditLogDto;
import org.mifos.dto.domain.PrdOfferingDto;
import org.mifos.dto.domain.ProductDetailsDto;
import org.mifos.dto.domain.SavingsProductDto;
import org.mifos.dto.screen.ProductDisplayDto;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.mifos.framework.util.helpers.Money;
import org.mifos.security.AuthenticationAuthorizationServiceFacade;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MigrationDemo {

	public static void main(String[] args) {

		System.setProperty("mifos.mode", "main");

		String[] configLocations = new String[2];
		configLocations[0] = "classpath:/org/mifos/config/resources/applicationContext.xml";
		configLocations[1] = "classpath:META-INF/spring/QuestionnaireContext.xml";

		// NOTE: Questionaire is coupled with applicationContext due to
		// QuestionaireMigration effort.
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(configLocations);

		// NOTE: need to ensure hibernateUtil is initialised
		StaticHibernateUtil.initialize();

		// NOTE: need to set default currency
		final MifosCurrency RUPEE = new MifosCurrency((short) 2, "RUPEE", BigDecimal.valueOf(1.0), "INR");
		Money.setDefaultCurrency(RUPEE);

		System.out.println("fetching service");
		SavingsServiceFacade savingsServiceFacade = applicationContext.getBean(SavingsServiceFacade.class);

		AuthenticationAuthorizationServiceFacade authenticationAuthorizationServiceFacade = applicationContext.getBean(AuthenticationAuthorizationServiceFacade.class);
		System.out.println("found");

		String name = "testSavingsProductFacade3";
		String shortName = "spf3";
		String description = "";
		Integer category = Integer.valueOf(1); // Other
		DateTime startDate = new DateTime();
		DateTime endDate = null;
		Integer applicableFor = ApplicableTo.CLIENTS.getValue().intValue();
		ProductDetailsDto productDetailsDto = new ProductDetailsDto(name, shortName, description, category, startDate, endDate, applicableFor);

		boolean jointSavingsAccount = false;
		Integer groupSavingsType = null;
		Integer depositType = SavingsType.VOLUNTARY.getValue().intValue();
		Double amountForDeposit = Double.valueOf("50.0");
		Double maxWithdrawal = Double.valueOf("40.0");
		BigDecimal interestRate = BigDecimal.valueOf(Double.valueOf("15.0"));
		Integer interestCalculationType = InterestCalcType.AVERAGE_BALANCE.getValue().intValue();
		Integer interestCalculationFrequency = Integer.valueOf(1);
		Integer interestCalculationFrequencyPeriod = RecurrenceType.WEEKLY.getValue().intValue();
		Integer interestPostingMonthlyFrequency = Integer.valueOf(3);
		BigDecimal minBalanceForInterestCalculation = BigDecimal.valueOf(Double.valueOf("2500.0"));
		Integer depositGlCode = Integer.valueOf(11);
		Integer interestGlCode = Integer.valueOf(12);

		SavingsProductDto savingsProduct = new SavingsProductDto(productDetailsDto, jointSavingsAccount, depositType, groupSavingsType,
				amountForDeposit, maxWithdrawal, interestRate, interestCalculationType, interestCalculationFrequency,
				interestCalculationFrequencyPeriod, interestPostingMonthlyFrequency,
				minBalanceForInterestCalculation, depositGlCode, interestGlCode);


		// authenticate first of all
		authenticationAuthorizationServiceFacade.reloadUserDetailsForSecurityContext("mifos");

		// validation to do:
		// 1. does currency exist?
		PrdOfferingDto product = adminServiceFacade.createSavingsProduct(savingsProduct);

		List<ProductDisplayDto> allSavingsProducts = adminServiceFacade.retrieveSavingsProducts();
		for (ProductDisplayDto productDisplayDto : allSavingsProducts) {
			System.out.println("savings product: " + productDisplayDto.getPrdOfferingName());
		}

	}
}