/**
  * Provides access to sales statistics
  *
  * @param  array $params
  * @param  \Smarty $smarty
  * @return string the value of the requested attribute
  */
 public function statsAccess($params, $smarty)
 {
     if (false === array_key_exists("key", $params)) {
         throw new \InvalidArgumentException(sprintf("missing key attribute in stats access function"));
     }
     if (false === array_key_exists("startDate", $params) || $params['startDate'] === '') {
         throw new \InvalidArgumentException(sprintf("missing startDate attribute in stats access function"));
     }
     if (false === array_key_exists("endDate", $params) || $params['endDate'] === '') {
         throw new \InvalidArgumentException(sprintf("missing endDate attribute in stats access function"));
     }
     if (false !== array_key_exists("includeShipping", $params) && $params['includeShipping'] == 'false') {
         $includeShipping = false;
     } else {
         $includeShipping = true;
     }
     if ($params['startDate'] == 'today') {
         $startDate = new \DateTime();
         $startDate->setTime(0, 0, 0);
     } elseif ($params['startDate'] == 'yesterday') {
         $startDate = new \DateTime();
         $startDate->setTime(0, 0, 0);
         $startDate->modify('-1 day');
     } elseif ($params['startDate'] == 'this_month') {
         $startDate = new \DateTime();
         $startDate->modify('first day of this month');
         $startDate->setTime(0, 0, 0);
     } elseif ($params['startDate'] == 'last_month') {
         $startDate = new \DateTime();
         $startDate->modify('first day of last month');
         $startDate->setTime(0, 0, 0);
     } elseif ($params['startDate'] == 'this_year') {
         $startDate = new \DateTime();
         $startDate->modify('first day of January this year');
         $startDate->setTime(0, 0, 0);
     } elseif ($params['startDate'] == 'last_year') {
         $startDate = new \DateTime();
         $startDate->modify('first day of January last year');
         $startDate->setTime(0, 0, 0);
     } else {
         try {
             $startDate = new \DateTime($params['startDate']);
         } catch (\Exception $e) {
             throw new \InvalidArgumentException(sprintf("invalid startDate attribute '%s' in stats access function", $params['startDate']));
         }
     }
     if ($params['endDate'] == 'today') {
         $endDate = new \DateTime();
         $endDate->setTime(0, 0, 0);
     } elseif ($params['endDate'] == 'yesterday') {
         $endDate = new \DateTime();
         $endDate->setTime(0, 0, 0);
         $endDate->modify('-1 day');
     } elseif ($params['endDate'] == 'this_month') {
         $endDate = new \DateTime();
         $endDate->modify('last day of this month');
         $endDate->setTime(0, 0, 0);
     } elseif ($params['endDate'] == 'last_month') {
         $endDate = new \DateTime();
         $endDate->modify('last day of last month');
         $endDate->setTime(0, 0, 0);
     } elseif ($params['endDate'] == 'this_year') {
         $endDate = new \DateTime();
         $endDate->modify('last day of December this year');
         $endDate->setTime(0, 0, 0);
     } elseif ($params['endDate'] == 'last_year') {
         $endDate = new \DateTime();
         $endDate->modify('last day of December last year');
         $endDate->setTime(0, 0, 0);
     } else {
         try {
             $endDate = new \DateTime($params['endDate']);
         } catch (\Exception $e) {
             throw new \InvalidArgumentException(sprintf("invalid endDate attribute '%s' in stats access function", $params['endDate']));
         }
     }
     switch ($params['key']) {
         case 'sales':
             return OrderQuery::getSaleStats($startDate, $endDate, $includeShipping);
             break;
         case 'orders':
             return OrderQuery::getOrderStats($startDate, $endDate, array(1, 2, 3, 4));
             break;
     }
     throw new \InvalidArgumentException(sprintf("invalid key attribute '%s' in stats access function", $params['key']));
 }