// commis.cpp
//commis.cpp
// Programmer:		Bill McQuain
// Platform:		IBM ThinkPad P75
// Compiler:		MS Visual C++ v4.0
// Last modified:	October 15, 1996
//Last modified:	October 15, 1996
// Calculates sales commissions.  The deal is that a salesperson in category
// 1 gets:
//1 gets:
//	1)	a base salary of $1000 per month
//	2)	a monthly commission of 8% of all sales if s/he sells at least 
//		$5000 but less than $30000
//	3)	a monthly commission of 15% of all sales if s/he sells at least
//		$30000
//	$30000
// A salesperson in category 2 gets:
//A salesperson in category 2 gets:
//	1)	a base salary of $0 per month
//	2)	a monthly commission of 10% of all sales if s/he sells at least 
//		$2000 but less than $20000
//	3)	a monthly commission of 30% of all sales if s/he sells at least
//		$20000
//	$20000
// The program reads lines of input from a file called "sales.dat".
// Each input line contains a 4-digit employee ID number, the salesperson's
// category, and the amount of sales by that employee in the current month.
//category, and the amount of sales by that employee in the current month.
// Output includes the employee ID number, base salary, commission, and
// total salary for each employee, in labeled columns.  The maximum,
// minimum and average total salaries are reported.
//minimum and average total salaries are reported.
#include <fstream.h>
#include <iomanip.h>

void main() {

	const float BaseSalary1 =  1000.0f;	// category 1 base salary,
	const float HiRate1     =    0.15f;	//   high commission rate,
	const float LoRate1     =    0.08f;	//   low commission rate,
	const float BaseSalary2 =     0.0f;	// category 2 base salary,
	const float HiRate2     =    0.30f;	//   high commission rate,
	const float LoRate2     =    0.10f;	//   low commission rate
	const float HiSales1    = 30000.0f;	// category 1 high sales level
	const float LoSales1    =  5000.0f;	//   satisfactory sales level
	const float HiSales2    = 20000.0f;	// category 2 high sales level
	const float LoSales2    =  2000.0f;	//   satisfactory sales level


	float Sales,				// monthly sales for current employee
		  Commission,			// commission for current employee
		  BaseSalary,			// base salary for current employee
		  TotalSalary;			// total salary for current employee
	float MaxSalary =     0.0f,	// maximum salary of all employees
		  MinSalary = 20000.0f,	// miminum salary of all employees
								// I'm assuming no one will make more 
								//     than $20000 in a month
		  SumSalaries =   0.0f,	// sum of all total salaries
		  AvgSalary;			// average of all total salaries
	int	  NumSalesPeople = 0,	// number of employees considered
		  EmployeeID,			// ID number of current employee
		  Category;				// category of current employee

	ifstream insales;				// input file stream
	ofstream comm;				// output file stream

	insales.open("sales.dat");	// open input and output files
	comm.open("comm.dat");

	comm.setf(ios::fixed, ios::floatfield);	// turn on manipulators
	comm.setf(ios::showpoint);

//////////////////////////////////////////////////////////////////////////
//	Print file header:
//Print file header:
	comm << "ACME Corporation Sales Staff Compensation"
	comm << endl << endl;
	comm << "  ID       Sales        Base     Commission      Total"
	comm << endl;
	comm << "------------------------------------------------------"
	comm << endl;

//////////////////////////////////////////////////////////////////////////
//  Try to read first line of input file:
// Try to read first line of input file:
	insales >> EmployeeID >> Category>> Sales;

//////////////////////////////////////////////////////////////////////////
//  Process input file until all lines have been read:
// Process input file until all lines have been read:

	while (insales) {

		NumSalesPeople++;		// count number of employees read

		//////////////////////////////////////////////////////////////////
		// Determine employee category and calculate base salary and 
		// commission accordingly:

		switch (Category) {
		case 1: {if (Sales < LoSales1) 
			        Commission = 0.0f;
		         else if (Sales < HiSales1)
			        Commission = LoRate1 * Sales;
		         else
			        Commission = HiRate1 * Sales;
				 BaseSalary = BaseSalary1;
				 break;
				}
		case 2: {if (Sales < LoSales2) 
			        Commission = 0.0f;
		         else if (Sales < HiSales2)
			        Commission = LoRate2 * Sales;
		         else
			        Commission = HiRate2 * Sales;
				 BaseSalary = BaseSalary2;
				 break;
				}
		default:{comm << setw(4) << EmployeeID;
			     comm << " has invalid category!" << endl;
				 Commission = 0.0f;
				 BaseSalary = 0.0f;
				}
		}
									// calculate total salary

		TotalSalary = BaseSalary + Commission;

		//////////////////////////////////////////////////////////////////
		// Check for new minimum and/or maximum salary:
		//Check for new minimum and/or maximum salary:
		if (TotalSalary < MinSalary) MinSalary = TotalSalary;
		if (TotalSalary > MaxSalary) MaxSalary = TotalSalary;

		//////////////////////////////////////////////////////////////////
		//  Keep running total of salaries (for averaging later):
		// Keep running total of salaries (for averaging later):
		SumSalaries += TotalSalary;
		
		//////////////////////////////////////////////////////////////////
		// Print out data for current employee:
		//Print out data for current employee:
		comm << EmployeeID;
		comm << setw(12) << setprecision(2) << Sales;
		comm << setw(12) << setprecision(2) << BaseSalary;
		comm << setw(15) << setprecision(2) << Commission;
		comm << setw(11) << setprecision(2) << TotalSalary;
		comm << endl;

		//////////////////////////////////////////////////////////////////
		// Try to read another line of input from file:
		//Try to read another line of input from file:
		insales >> EmployeeID >> Category >> Sales;
	}

	//////////////////////////////////////////////////////////////////////
	//  Print out minimum and maximum salaries:
	// Print out minimum and maximum salaries:
	comm << endl;
	comm << "Minimum salary: "
	comm << setw(12) << setprecision(2) << MinSalary;
	comm << endl;
	comm << "Maximum salary: "
	comm << setw(12) << setprecision(2) << MaxSalary;
	comm << endl;

	//////////////////////////////////////////////////////////////////////
	// Calculate and print out the average salary.  Be careful to guard
	// against a possible division by zero.
	//against a possible division by zero.
	comm << "Average salary: "
	if (NumSalesPeople > 0) 
	   AvgSalary = SumSalaries / NumSalesPeople;
	else
	   AvgSalary = 0.0f;
	comm << setw(12) << setprecision(2) << AvgSalary;

	//////////////////////////////////////////////////////////////////////
	// Close input and output files:
	//Close input and output files:
	insales.close();
	comm.close();
}