Code example - finance.c


/*
** FINANCE
**
**      HTTP Wrapper for the Financial Tools
**
**	Confidential Property of Tod Sambar
**	(c) Copyright Tod Sambar 1996-1997
**	All rights reserved.
**
**
** Public Functions:
**
**	finance_init
**
**
** History:
** Chg#	Date	Description						Resp
** ----	-------	-------------------------------------------------------	----
** 	6SEP96	Created							sambar
*/

#include	
#include	
#include	
#include	
#include	
#include	

/*
**  FINANCE_INIT
**
**	Initialize the Financial Tools calculators.
**
**  Parameters:
**	sactx		Sambar Server context
**
**  Returns:
**	SA_SUCCEED | SA_FAIL
*/
SA_RETCODE SA_PUBLIC
finance_init(sactx)
SA_CTX		*sactx;
{
	if (sa_cmd_init(sactx, "amorcalc", SA_AUTHORIZATION_ALL,
		"Amortization schedule calculation.",
		(SA_RPCFUNC)finance_amorcalc) != SA_SUCCEED)
	{
		sa_log(sactx, "Unable to initialize Finance RPCs");
		return (SA_FAIL);
	}

	if (sa_cmd_init(sactx, "mortcalc", SA_AUTHORIZATION_ALL,
		"Mortgage calculation.", 
		(SA_RPCFUNC)finance_mortcalc) != SA_SUCCEED)
	{
		sa_log(sactx, "Unable to initialize Finance RPCs");
		return (SA_FAIL);
	}

	sa_log(sactx, "Finance Library Initialized");

	return (SA_SUCCEED);
}

/*
**  FINANCE_AMORCALC
**
**	Amortization schedule calculator.
**
**  Parameters:
**	sactx		Sambar Server context
**	saconn		Sambar Server connection
**	saparams	RPC Parameters
**	infop		Error parameters
**
**  Returns:
**	SA_SUCCEED | SA_FAIL
*/
SA_RETCODE SA_PUBLIC
finance_amorcalc(sactx, saconn, saparams, infop)
SA_CTX		*sactx;
SA_CONN		*saconn;
SA_PARAMS	*saparams;
SA_INT		*infop;
{
	SA_INT		i;
	SA_INT		months;
	SA_INT		start;
	SA_INT		year;
	SA_INT		datalen;
	double		price;
	double		rate;
	double		payment;
	double		tmp1;
	double		tmp2;
	double		at;
	double		ay;
	SA_CHAR		*data;
	SA_CHAR		buffer[256];

	/* Get the principle amount 										*/
	if ((sa_param(sactx, saparams, "price", &data, &datalen) != SA_SUCCEED) ||
		(datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	price = atof(data);

	/* Get the number of months in the loan 							*/
	if ((sa_param(sactx, saparams, "months", &data, &datalen) != SA_SUCCEED)
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	months = atoi(data);

	/* Get the interest rate 											*/
	if ((sa_param(sactx, saparams, "rate", &data, &datalen) != SA_SUCCEED) 
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	rate = atof(data);

	/* Get the starting month 											*/
	if ((sa_param(sactx, saparams, "month", &data, &datalen) != SA_SUCCEED) || 
		(datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	start = atoi(data);

	/* Get the starting year 											*/
	if ((sa_param(sactx, saparams, "year", &data, &datalen) != SA_SUCCEED) 
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	year = atoi(data);

	if ((price <= 0) || (months <= 0) || (rate <= 0) || (start <= 0) ||
		(year <= 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	if (sa_send_macro(saconn, "FINANCE_AMORCALC") != SA_SUCCEED)
		return (SA_FAIL);

	start--;
	year--;

	tmp1 = rate / 1200.0;
	tmp2 = 1.0 - (1.0 / pow((float)(tmp1+1), (float)months));
	payment = price * tmp1 / tmp2;

	at = ay = 0.0;
	for (i = 0; i < months; i++)
	{
		if (start >= 12)
		{
			year++;
			at += ay;
			sprintf(buffer, 
				"Total Interest for paid during %d: $%11.2f",
				year, ay);

			if (sa_conn_send(saconn, buffer, SA_NULLTERM) != SA_SUCCEED)
				return (SA_FAIL);

			ay = 0.0;
			start = 0;
		}

		ay = ay + (price * tmp1);
		price = price - (payment - (price * tmp1));

		if (price > 0.0)
			start++;
		else
			break;
	}

	if (start > 0)
	{
		at += ay;
		sprintf(buffer, 
			"Total Interest paid during %d: $%11.2f",
			year, ay);
		if (sa_conn_send(saconn, buffer, SA_NULLTERM) != SA_SUCCEED)
			return (SA_FAIL);
	}

	sprintf(buffer, 
		"Total Interest paid during loan: $%11.2f",
		at);
	if (sa_conn_send(saconn, buffer, SA_NULLTERM) != SA_SUCCEED)
		return (SA_FAIL);

	if (sa_send_macro(saconn, "FINANCE_FOOTER") != SA_SUCCEED)
		return (SA_FAIL);

	return (SA_SUCCEED);
}

/*
**  FINANCE_MORTCALC
**
**	Mortgage calculator.
**
**  Parameters:
**	sactx		Sambar Server context
**	saconn		Sambar Server connection
**	saparams	RPC Parameters
**	infop		Error parameters
**
**  Returns:
**	SA_SUCCEED | SA_FAIL
*/
SA_RETCODE SA_PUBLIC
finance_mortcalc(sactx, saconn, saparams, infop)
SA_CTX		*sactx;
SA_CONN		*saconn;
SA_PARAMS	*saparams;
SA_INT		*infop;
{
	SA_INT		years;
	SA_INT		datalen;
	double		price;
	double		down;
	double		rate;
	double		tmp1;
	double		mort;
	SA_CHAR		*data;
	SA_CHAR		buffer[256];

	/* Get the sale price of the house 									*/
	if ((sa_param(sactx, saparams, "price", &data, &datalen) != SA_SUCCEED)
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	price = atof(data);

	/* Get the down payment amount 										*/
	if ((sa_param(sactx, saparams, "down", &data, &datalen) != SA_SUCCEED)
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	down = atof(data);

	/* Get the number of years to pay off the mortgage 					*/
	if ((sa_param(sactx, saparams, "years", &data, &datalen) != SA_SUCCEED) 
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	years = atoi(data);

	/* Get the interest rate 											*/
	if ((sa_param(sactx, saparams, "rate", &data, &datalen) != SA_SUCCEED) 
		|| (datalen == 0))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	rate = atof(data);

	if ((price <= 0) || (down <= 0) || (years <= 0) || (rate <= 0) ||
		(down > price))
	{
		*infop = SA_E_INVALIDDATA;
		return (SA_FAIL);
	}

	tmp1 = rate / (12 * 100);
	mort = (price - down) * (tmp1 / (1 - pow(1 + tmp1, - (years * 12))));

	if (sa_send_macro(saconn, "FINANCE_MORTCALC") != SA_SUCCEED)
		return (SA_FAIL);

	sprintf(buffer, "$%11.2f\n", mort);
	if (sa_conn_send(saconn, buffer, SA_NULLTERM) != SA_SUCCEED)
		return (SA_FAIL);

	if (sa_send_macro(saconn, "FINANCE_FOOTER") != SA_SUCCEED)
		return (SA_FAIL);

	return (SA_SUCCEED);
}