<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * This class is for processing Ezypay payments.
 *
 * @package    Payment
 * @category   Helpers
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Payment_Bulk_Ezypay {
	private function file($name) {
		$result = array();

		// Process file
		$file = preg_split("/[\r]?[\n]+/",file_get_contents($_FILES[$name]['tmp_name']));

		$i = 0;
		foreach ($file as $line) {
			// Line 0 is our header
			if ($i++ == 0 OR ! trim($line))
				continue;

			// Trim our whitespace on the end of the line.
			$line = preg_replace("/\s+$/",'',$line);
			array_push($result,explode("\t",$line));
		}

		return $result;
	}

	/**
	 * The input form to capture the required files
	 */
	public function form() {
		$result = '';

		$result .= Form::open(NULL,array('enctype'=>'multipart/form-data','class'=>'form-horizontal'));
		$result .= View::factory('payment/admin/addbulk/ezypay');
		$result .= Form::close();

		return $result;
	}

	/**
	 * Process the uploaded files
	 */
	public function process() {
		// Process payment
		$payments = array();

		foreach ($this->file('payment') as $line => $array) {
			// Field 4 has our account reference
			if (preg_match('/^'.Company::instance()->site(TRUE).'-/',$array[4]) AND $array[10] == 'Cleared') {
				$aid = preg_replace('/^'.Company::instance()->site(TRUE).'-/','',$array[4]);

				$po = ORM::factory('Payment');
				$po->account_id = $aid;
				$po->total_amt = $array[7];
				$po->checkout_data = array('transid'=>$array[2].':'.$array[3]);
				$po->date_payment = strtotime(str_replace('/','-',$array[8]));

				$sbo = $po->account->service_billing->where('plugin_data','=',$array[3])->find();
				if (! $sbo->loaded())
					throw HTTP_Exception::factory(501,'No Service Billing Data for :aid (:pd)?',array(':aid'=>$aid,':pd'=>$array[3]));

				$po->checkout_id = $sbo->checkout_id;

				$payments[$array[3]] = $po;
			}
		}

		foreach ($this->file('transaction') as $line => $array) {
			// If we dont have a payment item for this fee, we'll continue.
			if (! isset($payments[$array[3]]))
				continue;

			// Our commission fees, which appear has Type 1 or 15
			if (in_array($array[9],array(1,15)))
				$payments[$array[3]]->fees_amt = (float)$array[7];
		}

		$total = $fees = 0;
		foreach ($payments as $po) {
			$po->save();

			if (! $po->saved())
				throw HTTP_Exception::factory(501,'Failed to Save Payment for :aid (:pd)?',array(':aid'=>$po->account_id,':pd'=>$po->checkout_data['transid']));

			$total += $po->total_amt;
			$fees += $po->fees_amt;
		}

		$output = Table::factory()
			->data($payments)
			->columns(array(
				'id'=>'ID',
				'date_payment'=>'Date',
				'checkout->display("name")'=>'Method',
				'total_amt'=>'Amount',
				'fees_amt'=>'Fees',
				'account->accnum()'=>'Cust ID',
				'account->name()'=>'Customer',
			))
			->prepend(array(
				'id'=>array('url'=>URL::link('admin','payment/edit/')),
			));

		return View::factory('payment/admin/addbulk/ezypay_processed')
			->set('table',$output)
			->set('fee',$fees)
			->set('total',$total);
	}
}
?>
