<?php
require_once dirname(__FILE__)."/".str_repeat("../",4)."lib-tk/shield.php";
require_once(dirname(__FILE__)."/../../../../lib-action/action.php");

class GenerateInvoiceEvents extends MB_Action
{
	public function execute()
	{
		parent::execute();

		if ($_REQUEST["reRequest"]){
			$tmp = unserialize(base64_decode($_REQUEST["reRequest"]));
			if (is_array($tmp)){
				$_REQUEST = secureInput(unsecureInput($tmp));
			}
		}

		$overrideDateDue = $this->handleDateSelector("overrideDateDue", 0);

		// set packageDateNextRenewalLessThan
		if (checkdate($_REQUEST["packageRenewMonth"],$_REQUEST["packageRenewDay"],$_REQUEST["packageRenewYear"])) {
            if (intval($_REQUEST["packageRenewHour"]) <= 23) {
                $packageRenewHour = (int) $_REQUEST["packageRenewHour"];
            } else {
                $packageRenewHour = date("h");
            }
            if (intval($_REQUEST["packageRenewMinute"]) <= 59) {
                $packageRenewMinute = (int) $_REQUEST["packageRenewMinute"];
            } else {
                $packageRenewMinute = date("i");
            }
			$packageDateNextRenewalLessThan = mktime($packageRenewHour,$packageRenewMinute,0,$_REQUEST["packageRenewMonth"],$_REQUEST["packageRenewDay"],$_REQUEST["packageRenewYear"]);
		} else {
			$packageDateNextRenewalLessThan = mktime();
		}

		// set domainDateNextRenewalLessThan
		if (checkdate($_REQUEST["domainRenewMonth"],$_REQUEST["domainRenewDay"],$_REQUEST["domainRenewYear"])) {
            if (intval($_REQUEST["domainRenewHour"]) <= 23) {
                $domainRenewHour = (int) $_REQUEST["domainRenewHour"];
            } else {
                $domainRenewHour = date("h");
            }
            if (intval($_REQUEST["domainRenewMinute"]) <= 59) {
                $domainRenewMinute = (int) $_REQUEST["domainRenewMinute"];
            } else {
                $domainRenewMinute = date("i");
            }
			$domainDateNextRenewalLessThan = mktime($domainRenewHour,$domainRenewMinute,0,$_REQUEST["domainRenewMonth"],$_REQUEST["domainRenewDay"],$_REQUEST["domainRenewYear"]);
		} else {
			$domainDateNextRenewalLessThan = mktime();
		}

		// set systemQueueTime
		if (checkdate($_REQUEST["scheduleTimeMonth"],$_REQUEST["scheduleTimeDay"],$_REQUEST["scheduleTimeYear"])) {
		 	if (intval($_REQUEST["scheduleTimeHour"]) <= 23) {
		 		$scheduleTimeHour = (int) $_REQUEST["scheduleTimeHour"];
			} else {
				$scheduleTimeHour = date("h");
			}
		 	if (intval($_REQUEST["scheduleTimeMinute"]) <= 59) {
		 		$scheduleTimeMinute = (int) $_REQUEST["scheduleTimeMinute"];
			} else {
				$scheduleTimeMinute = date("i");
			}
			$systemQueueTime = mktime($scheduleTimeHour,$scheduleTimeMinute,0,$_REQUEST["scheduleTimeMonth"],$_REQUEST["scheduleTimeDay"],$_REQUEST["scheduleTimeYear"]);
		} else {
			$systemQueueTime = mktime();
		}

		// count how many invoices will be generated with these params
		if ((int)$_REQUEST["clientID"]){

			$wmXML = ((int)$_REQUEST["disableWalkMode"]>0)?"   <disableWalkMode>1</disableWalkMode>":"";
			$pmXML = ((int)$_REQUEST["previewMode"])?"<generateInvoicePreview>1</generateInvoicePreview>":"";
			$cXML =  ((int)$_REQUEST["clientID"])?"<getClients><clientID>".(int)$_REQUEST["clientID"]."</clientID></getClients>":"";
			if (!count($_REQUEST["packageIDs"])){
				$_REQUEST["packageIDs"][] = 0;
			}
			$pXML =  toXML(array(
				"getPackages" => array(
					"packageID" => $_REQUEST["packageIDs"],
				),
			));
			$ProcessInvoicesXML =
				"<mbapi>
				<command>ProcessInvoices</command>
				<showXMLHeader>0</showXMLHeader>
				<params>
					$pmXML
					$wmXML
					$cXML
					$pXML
					<setSendInvoiceEmails>".(int)$_REQUEST["sendInvoiceEmail"]."</setSendInvoiceEmails>
					<clientStatus>".(int)$clientStatus."</clientStatus>
					<packageStatus>".(int)$packageStatus."</packageStatus>
					<packageDateNextRenewalLessThan>$packageDateNextRenewalLessThan</packageDateNextRenewalLessThan>
					<domainDateNextRenewalLessThan>$domainDateNextRenewalLessThan</domainDateNextRenewalLessThan>
					<getActiveClients>".(int) $_REQUEST["getActiveClients"]."</getActiveClients>
					<getSuspendedClients>".(int) $_REQUEST["getSuspendedClients"]."</getSuspendedClients>
					<getSuspendedPackages>".(int) $_REQUEST["getSuspendedPackages"]."</getSuspendedPackages>
					<getActiveDomains>".(int) $_REQUEST["getActiveDomains"]."</getActiveDomains>
					<overrideDateDue>".$overrideDateDue."</overrideDateDue>
				</params>
				</mbapi>";

			dbg($ProcessInvoicesXML);

			$results = dispatchMBAPI($ProcessInvoicesXML, 1);
			$this->smartyVars["invoices"] = correctArray(grabSimpleMBAPIResults($results));
			$this->smartyVars["previewMode"] = (int)$_REQUEST["previewMode"];
			$this->smartyVars["clientInfo"] = grabFirstResultFromMBAPIArray(array(
				"mbapi" => array(
					"command" => "GetClients",
					"params" => array(
						"clientID" => (int)$_REQUEST["clientID"],
						"mergePrimaryContact" => 1,
					),
				),
			));
			$this->smartyVars["numInvoices"] = count($this->smartyVars["invoices"]);

			$this->smartyVars["reRequest"] = base64_encode(serialize(array("previewMode"=>0)+$_REQUEST));

			$this->addTemplate("invoices/ShowGenerateInvoiceEvents", $this->smartyVars);

		} else {
			$cmdArgs = array
			(
				"disableWalkMode" => (int) $_REQUEST["disableWalkMode"],
				"getActiveClients" => (int) $_REQUEST["getActiveClients"],
				"getSuspendedClients" => (int) $_REQUEST["getSuspendedClients"],
				"getActivePackages" => (int) $_REQUEST["getActivePackages"],
				"getSuspendedPackages" => (int) $_REQUEST["getSuspendedPackages"],
				"packageDateNextRenewalLessThan" => $packageDateNextRenewalLessThan,
				"domainDateNextRenewalLessThan" => $domainDateNextRenewalLessThan,
				"countInvoicesToBeGeneratedOnly" => 1,
				"setSendInvoiceEmails" => (int)$_REQUEST["sendInvoiceEmail"],
			);

			$query = $this->getMBAPIQuery("ProcessInvoices", "", $cmdArgs);
			$data = dispatchMBAPI($query, 1);

			$numInvoicesGenerated = $data["mbapi"][0]["header"][0]["numInvoicesGenerated"][0];

			$numInvoicesPerEvent = (NUMBER_OF_INVOICES_PER_EVENT>0)?NUMBER_OF_INVOICES_PER_EVENT:5;
			$numEventsToCreate = ceil($numInvoicesGenerated / $numInvoicesPerEvent);

			dbg($numInvoicesPerEvent);

			$wmXML = ((int) $_REQUEST["disableWalkMode"]>0)?"   <disableWalkMode>1</disableWalkMode>":"";

			//for($i=1;$i<=$numEventsToCreate;$i++){
				// Get the time quantities for $current
				// minute;hour;day;month;year
				$timeData = explode(";", date("i;G;j;n;Y", $systemQueueTime));
				$dateToRun = mktime($timeData[1], $timeData[0], 0, $timeData[3], $timeData[2], $timeData[4]);

				$ProcessInvoicesXML =
					"<mbapi>
					<command>ProcessInvoices</command>
					<showXMLHeader>0</showXMLHeader>
					<params>
						<manualRun>1</manualRun>
						$wmXML
						<numInvoicesToGenerate>$numInvoicesPerEvent</numInvoicesToGenerate>
						<setBillingMode>anniversary</setBillingMode>
						<setSendInvoiceEmails>".(int)$_REQUEST["sendInvoiceEmail"]."</setSendInvoiceEmails>
						<clientStatus>".(int)$clientStatus."</clientStatus>
						<packageStatus>".(int)$packageStatus."</packageStatus>
						<packageDateNextRenewalLessThan>$packageDateNextRenewalLessThan</packageDateNextRenewalLessThan>
						<domainDateNextRenewalLessThan>$domainDateNextRenewalLessThan</domainDateNextRenewalLessThan>
						<getActiveClients>".(int) $_REQUEST["getActiveClients"]."</getActiveClients>
						<getSuspendedClients>".(int) $_REQUEST["getSuspendedClients"]."</getSuspendedClients>
						<getActivePackages>".(int) $_REQUEST["getActivePackages"]."</getActivePackages>
						<getSuspendedPackages>".(int) $_REQUEST["getSuspendedPackages"]."</getSuspendedPackages>
						<overrideDateDue>".$overrideDateDue."</overrideDateDue>
						".(((int)$_REQUEST["clientID"])?"<clientIDs><clientID>".(int)$_REQUEST["clientID"]."</clientID></clientIDs>":"")."
					</params>
					</mbapi>";

				$cmdArgs = array
				(
					"systemQueueCommand" => "ProcessInvoices",
					"systemQueueCommandInput" => htmlentities($ProcessInvoicesXML),
					"systemQueueMinute" => $timeData[0],
					"systemQueueHour" => $timeData[1],
					"systemQueueDay" => $timeData[2],
					"systemQueueMonth" => $timeData[3],
					"systemQueueYear" => $timeData[4],
					"systemQueueIsRecurring" => 0,
					"systemQueueDateCreated" => time(),
					"systemQueueDateToRun" => $dateToRun,
					"systemQueueDateStarted" => 0,
					"systemQueueDateFinished" => 0,
				);
				$query = $this->getMBAPIQuery("SetSystemQueue", "insert", $cmdArgs);
				$data = dispatchMBAPI($query, 1);

			$systemQueueID = (int)$data["mbapi"][0]["header"][0]["lastInsertID"][0];

			//}

			$this->smartyVars["numInovicesToBeGenerated"] = $numInvoicesGenerated;
			$this->smartyVars["systemQueueID"] = $systemQueueID;
			if ($dateToRun<time()+1){
				$this->smartyVars["runNow"] = 1;
			} else {
				$this->smartyVars["runNow"] = 0;
			}
			$this->addTemplate("invoices/ShowGenerateInvoiceEvents", $this->smartyVars);
		}

		return $this->hasExecutedSuccessfully();
	}
}
