<?php
/*********************************************************************************
 *
 * TimeTrex is a Workforce Management program developed by
 * TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 *
 *
 * You should have received a copy of the GNU Affero General Public License along
 * with this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 *
 * You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
 * #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
 *
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 *
 *
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by TimeTrex" logo. If the display of the logo is not reasonably
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by TimeTrex".
 *
 ********************************************************************************/


/**
 * @package API\Core
 */
class APIDashboard extends APIFactory {
	protected $main_class = false;

	/**
	 * APIDashboard constructor.
	 */
	public function __construct() {
		parent::__construct(); //Make sure parent constructor is always called.

		return true;
	}

	/**
	 * Get all possible dashlets
	 * @param bool $name
	 * @param null $parent
	 * @return bool|array
	 */
	function getOptions( $name = false, $parent = null ) {
		$product_edition = $this->getCurrentCompanyObject()->getProductEdition();

		$retarr = [];
		switch ( $name ) {
			case 'dashlets':
				$retarr = [];

				//News
				$retarr['news'] = TTi18n::getText( 'News' );

				if ( $this->getPermissionObject()->Check( 'punch', 'enabled' ) && $this->getPermissionObject()->Check( 'punch', 'view_own' ) ) {
					$retarr['exception_summary'] = TTi18n::getText( 'Exceptions' );         //Current/Last week, Own
					$retarr['timesheet_summary'] = TTi18n::getText( 'TimeSheet Summary' );  //Current/Last week, Own
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_timesheet_summary' ) ) {
						$retarr['timesheet_verification_summary'] = TTi18n::getText( 'TimeSheet Verifications' ); //Own
					}
				}

				if ( $this->getPermissionObject()->Check( 'punch', 'enabled' ) && ( $this->getPermissionObject()->Check( 'punch', 'view_child' ) || $this->getPermissionObject()->Check( 'punch', 'view' ) ) ) {
					$retarr['exception_summary_child'] = TTi18n::getText( 'Exceptions (Subordinates)' );  //Current/Last week, Subordinates/All
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_timesheet_summary' ) ) {
						$retarr['timesheet_verification_summary_child'] = TTi18n::getText( 'TimeSheet Verifications (Subordinates)' ); //Subordinates/All
					}
				}

				if ( $this->getPermissionObject()->Check( 'request', 'enabled' ) && $this->getPermissionObject()->Check( 'request', 'view_own' ) ) {
					$retarr['request_summary'] = TTi18n::getText( 'Requests' );  //Current/Last week, Own
				}
				if ( $this->getPermissionObject()->Check( 'request', 'enabled' ) && ( $this->getPermissionObject()->Check( 'request', 'authorize' ) ) ) {
					$retarr['request_authorize_summary'] = TTi18n::getText( 'Request Authorizations' );  //Subordinates
				}

				if ( $this->getPermissionObject()->Check( 'message', 'enabled' ) && $this->getPermissionObject()->Check( 'message', 'view_own' ) ) {
					$retarr['message_summary'] = TTi18n::getText( 'Messages (UnRead)' );  //Own
				}

				if ( $this->getPermissionObject()->Check( 'accrual', 'enabled' ) && $this->getPermissionObject()->Check( 'accrual', 'view_own' ) ) {
					$retarr['accrual_balance_summary'] = TTi18n::getText( 'Accrual Balances' );  //Own
				}

				if ( $product_edition >= 25 ) {
					if ( $this->getPermissionObject()->Check( 'expense', 'enabled' ) && $this->getPermissionObject()->Check( 'expense', 'view_own' ) ) {
						$retarr['expense_summary'] = TTi18n::getText( 'Expenses' );  //Current/Last week, Own
					}
					if ( $this->getPermissionObject()->Check( 'expense', 'enabled' ) && ( $this->getPermissionObject()->Check( 'expense', 'authorize' ) ) ) {
						$retarr['expense_authorize_summary'] = TTi18n::getText( 'Expense Authorizations' );  //Subordinates
					}
				}

				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_active_shift' ) ) { //Don't check punch/user permissions, as the ActiveShift report itself does not do that.
					$retarr['user_active_shift_summary'] = TTi18n::getText( 'Whos In/Out' );  //Subordinates/All
				}

				if ( $this->getPermissionObject()->Check( 'schedule', 'enabled' ) ) {
					if ( $this->getPermissionObject()->Check( 'schedule', 'view_own' ) ) {
						$retarr['schedule_summary'] = TTi18n::getText( 'Schedule Summary' );  //Own
					}
					if ( $this->getPermissionObject()->Check( 'schedule', 'view_child' ) || $this->getPermissionObject()->Check( 'schedule', 'view' ) ) {
						$retarr['schedule_summary_child'] = TTi18n::getText( 'Schedule Summary (Subordinates)' );  //Own
					}
				}

				asort( $retarr ); //Put Custom List/Custom Report at the bottom always.
				if ( $product_edition > 10 ) {
					$retarr['custom_list'] = TTi18n::getText( 'Custom List' );      //Saved Search & Layout
					$retarr['custom_report'] = TTi18n::getText( 'Custom Report' );  //Report, Report Template/Saved Report
				}

				$retarr = Misc::addSortPrefix( $retarr );

				break;
			case 'custom_list':
				$retarr = [];

				//Attendance
				if ( $this->getPermissionObject()->Check( 'punch', 'enabled' ) && ( $this->getPermissionObject()->Check( 'punch', 'view_own' ) || $this->getPermissionObject()->Check( 'punch', 'view_child' ) || $this->getPermissionObject()->Check( 'punch', 'view' ) ) ) {
					$retarr['Exception'] = TTi18n::getText( 'Exceptions' );
				}
				if ( $this->getPermissionObject()->Check( 'accrual', 'enabled' ) && ( $this->getPermissionObject()->Check( 'accrual', 'view_own' ) || $this->getPermissionObject()->Check( 'accrual', 'view_child' ) || $this->getPermissionObject()->Check( 'accrual', 'view' ) ) ) {
					$retarr['AccrualBalance'] = TTi18n::getText( 'Accrual Balances' );
				}
				if ( $this->getPermissionObject()->Check( 'accrual', 'enabled' ) && ( $this->getPermissionObject()->Check( 'accrual', 'view_own' ) || $this->getPermissionObject()->Check( 'accrual', 'view_child' ) || $this->getPermissionObject()->Check( 'accrual', 'view' ) ) ) {
					$retarr['Accrual'] = TTi18n::getText( 'Accruals' );
				}
				if ( $this->getPermissionObject()->Check( 'schedule', 'enabled' ) && ( $this->getPermissionObject()->Check( 'schedule', 'view_own' ) || $this->getPermissionObject()->Check( 'schedule', 'view_child' ) || $this->getPermissionObject()->Check( 'schedule', 'view' ) ) ) {
					$retarr['Schedule'] = TTi18n::getText( 'Scheduled Shifts' );
				}
				if ( $this->getPermissionObject()->Check( 'recurring_schedule', 'enabled' ) && ( $this->getPermissionObject()->Check( 'recurring_schedule', 'view_own' ) || $this->getPermissionObject()->Check( 'recurring_schedule', 'view_child' ) || $this->getPermissionObject()->Check( 'recurring_schedule', 'view' ) ) ) {
					$retarr['RecurringScheduleControl'] = TTi18n::getText( 'Recurring Schedules' );
				}
				if ( $this->getPermissionObject()->Check( 'recurring_schedule_template', 'enabled' ) && ( $this->getPermissionObject()->Check( 'recurring_schedule_template', 'view_own' ) || $this->getPermissionObject()->Check( 'recurring_schedule_template', 'view_child' ) || $this->getPermissionObject()->Check( 'recurring_schedule_template', 'view' ) ) ) {
					$retarr['RecurringScheduleTemplateControl'] = TTi18n::getText( 'Recurring Templates' );
				}
				if ( $product_edition >= 20 ) {
					if ( $this->getPermissionObject()->Check( 'job', 'enabled' ) && ( $this->getPermissionObject()->Check( 'job', 'view_own' ) || $this->getPermissionObject()->Check( 'job', 'view_child' ) || $this->getPermissionObject()->Check( 'job', 'view' ) ) ) {
						$retarr['Job'] = TTi18n::getText( 'Jobs' );
					}
					if ( $this->getPermissionObject()->Check( 'job_item', 'enabled' ) && ( $this->getPermissionObject()->Check( 'job_item', 'view_own' ) || $this->getPermissionObject()->Check( 'job_item', 'view_child' ) || $this->getPermissionObject()->Check( 'job_item', 'view' ) ) ) {
						$retarr['JobItem'] = TTi18n::getText( 'Tasks' );
					}
				}


				//Employee
				if ( $this->getPermissionObject()->Check( 'user', 'enabled' ) && ( $this->getPermissionObject()->Check( 'user', 'view_own' ) || $this->getPermissionObject()->Check( 'user', 'view_child' ) || $this->getPermissionObject()->Check( 'user', 'view' ) ) ) {
					$retarr['User'] = TTi18n::getText( 'Employees' );
				}
				if ( $this->getPermissionObject()->Check( 'user_contact', 'enabled' ) && ( $this->getPermissionObject()->Check( 'user_contact', 'view_own' ) || $this->getPermissionObject()->Check( 'user_contact', 'view_child' ) || $this->getPermissionObject()->Check( 'user_contact', 'view' ) ) ) {
					$retarr['UserContact'] = TTi18n::getText( 'Employee Contacts' );
				}
				if ( $this->getPermissionObject()->Check( 'wage', 'enabled' ) && ( $this->getPermissionObject()->Check( 'wage', 'view_own' ) || $this->getPermissionObject()->Check( 'wage', 'view_child' ) || $this->getPermissionObject()->Check( 'wage', 'view' ) ) ) {
					$retarr['UserWage'] = TTi18n::getText( 'Wages' );
				}

				//Company


				//Payroll
				if ( $this->getPermissionObject()->Check( 'pay_stub', 'enabled' ) && ( $this->getPermissionObject()->Check( 'pay_stub', 'view_own' ) || $this->getPermissionObject()->Check( 'pay_stub', 'view_child' ) || $this->getPermissionObject()->Check( 'pay_stub', 'view' ) ) ) {
					$retarr['PayStub'] = TTi18n::getText( 'Pay Stubs' );
				}
				if ( $this->getPermissionObject()->Check( 'pay_period', 'enabled' ) && ( $this->getPermissionObject()->Check( 'pay_period', 'view_own' ) || $this->getPermissionObject()->Check( 'pay_period', 'view_child' ) || $this->getPermissionObject()->Check( 'pay_period', 'view' ) ) ) {
					$retarr['PayPeriod'] = TTi18n::getText( 'Pay Periods' );
				}
				if ( $this->getPermissionObject()->Check( 'pay_stub_amendment', 'enabled' ) && ( $this->getPermissionObject()->Check( 'pay_stub_amendment', 'view_own' ) || $this->getPermissionObject()->Check( 'pay_stub_amendment', 'view_child' ) || $this->getPermissionObject()->Check( 'pay_stub_amendment', 'view' ) ) ) {
					$retarr['PayStubAmendment'] = TTi18n::getText( 'Pay Stub Amendments' );
				}
				if ( $product_edition >= 25 && $this->getPermissionObject()->Check( 'user_expense', 'enabled' ) && ( $this->getPermissionObject()->Check( 'user_expense', 'view_own' ) || $this->getPermissionObject()->Check( 'user_expense', 'view_child' ) || $this->getPermissionObject()->Check( 'user_expense', 'view' ) ) ) {
					$retarr['UserExpense'] = TTi18n::getText( 'Expenses' );
				}


				//Invoice
				if ( $product_edition >= 20 ) {
					if ( $this->getPermissionObject()->Check( 'client', 'enabled' ) && ( $this->getPermissionObject()->Check( 'client', 'view_own' ) || $this->getPermissionObject()->Check( 'client', 'view_child' ) || $this->getPermissionObject()->Check( 'client', 'view' ) ) ) {
						$retarr['Client'] = TTi18n::getText( 'Clients' );
					}
					if ( $this->getPermissionObject()->Check( 'client_contact', 'enabled' ) && ( $this->getPermissionObject()->Check( 'client_contact', 'view_own' ) || $this->getPermissionObject()->Check( 'client_contact', 'view_child' ) || $this->getPermissionObject()->Check( 'client_contact', 'view' ) ) ) {
						$retarr['ClientContact'] = TTi18n::getText( 'Client Contacts' );
					}
					if ( $this->getPermissionObject()->Check( 'invoice', 'enabled' ) && ( $this->getPermissionObject()->Check( 'invoice', 'view_own' ) || $this->getPermissionObject()->Check( 'invoice', 'view_child' ) || $this->getPermissionObject()->Check( 'invoice', 'view' ) ) ) {
						$retarr['Invoice'] = TTi18n::getText( 'Invoices' );
					}
					if ( $this->getPermissionObject()->Check( 'invoice', 'enabled' ) && ( $this->getPermissionObject()->Check( 'invoice', 'view_own' ) || $this->getPermissionObject()->Check( 'invoice', 'view_child' ) || $this->getPermissionObject()->Check( 'invoice', 'view' ) ) ) {
						$retarr['Transaction'] = TTi18n::getText( 'Invoice Transactions' );
					}
				}


				//HR
				if ( $this->getPermissionObject()->Check( 'user_review', 'enabled' ) && ( $this->getPermissionObject()->Check( 'user_review', 'view_own' ) || $this->getPermissionObject()->Check( 'user_review', 'view_child' ) || $this->getPermissionObject()->Check( 'user_review', 'view' ) ) ) {
					$retarr['UserReviewControl'] = TTi18n::getText( 'Reviews' );
				}
				if ( $product_edition >= 25 ) {
					if ( $this->getPermissionObject()->Check( 'job_vacancy', 'enabled' ) && ( $this->getPermissionObject()->Check( 'job_vacancy', 'view_own' ) || $this->getPermissionObject()->Check( 'job_vacancy', 'view_child' ) || $this->getPermissionObject()->Check( 'job_vacancy', 'view' ) ) ) {
						$retarr['JobVacancy'] = TTi18n::getText( 'Job Vacancies' );
					}
					if ( $this->getPermissionObject()->Check( 'job_applicant', 'enabled' ) && ( $this->getPermissionObject()->Check( 'job_applicant', 'view_own' ) || $this->getPermissionObject()->Check( 'job_applicant', 'view_child' ) || $this->getPermissionObject()->Check( 'job_applicant', 'view' ) ) ) {
						$retarr['JobApplicant'] = TTi18n::getText( 'Job Applicants' );
					}
					if ( $this->getPermissionObject()->Check( 'job_application', 'enabled' ) && ( $this->getPermissionObject()->Check( 'job_application', 'view_own' ) || $this->getPermissionObject()->Check( 'job_application', 'view_child' ) || $this->getPermissionObject()->Check( 'job_application', 'view' ) ) ) {
						$retarr['JobApplication'] = TTi18n::getText( 'Job Applications' );
					}
				}


				//My Account
				if ( $this->getPermissionObject()->Check( 'request', 'enabled' ) && ( $this->getPermissionObject()->Check( 'request', 'view_own' ) || $this->getPermissionObject()->Check( 'request', 'view_child' ) || $this->getPermissionObject()->Check( 'request', 'view' ) ) ) {
					$retarr['Request'] = TTi18n::getText( 'Requests' );
				}
				//  Expenses is already added above.


				//My Account -> Authorization related views.
				if ( $this->getPermissionObject()->Check( 'request', 'enabled' ) && $this->getPermissionObject()->Check( 'request', 'authorize' ) && ( $this->getPermissionObject()->Check( 'request', 'view_child' ) || $this->getPermissionObject()->Check( 'request', 'view' ) ) ) {
					$retarr['Request-Authorization'] = TTi18n::getText( 'Request Authorization' );
				}
				if ( $this->getPermissionObject()->Check( 'punch', 'enabled' ) && $this->getPermissionObject()->Check( 'punch', 'verify_time_sheet' ) && ( $this->getPermissionObject()->Check( 'punch', 'view_child' ) || $this->getPermissionObject()->Check( 'punch', 'view' ) ) ) {
					$retarr['PayPeriodTimeSheetVerify'] = TTi18n::getText( 'TimeSheet Verification' );
				}
				if ( $product_edition >= 25 && $this->getPermissionObject()->Check( 'user_expense', 'enabled' ) && $this->getPermissionObject()->Check( 'user_expense', 'authorize' ) && ( $this->getPermissionObject()->Check( 'user_expense', 'view_child' ) || $this->getPermissionObject()->Check( 'user_expense', 'view' ) ) ) {
					$retarr['UserExpense-Authorization'] = TTi18n::getText( 'Expense Verification' );
				}

				asort( $retarr );
				$retarr = Misc::addSortPrefix( $retarr );

				break;
			case 'custom_report':
				$retarr = [];

				//Employee Reports
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_user_information' ) ) {
					$retarr['UserSummaryReport'] = TTi18n::getText( 'Employee Information' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_active_shift' ) ) {
					$retarr['ActiveShiftReport'] = TTi18n::getText( 'Whos In Summary' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_system_log' ) ) {
					$retarr['AuditTrailReport'] = TTi18n::getText( 'Audit Trail' );
				}


				//TimeSheet Reports
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_schedule_summary' ) ) {
					$retarr['ScheduleSummaryReport'] = TTi18n::getText( 'Schedule Summary' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_timesheet_summary' ) ) {
					$retarr['TimesheetSummaryReport'] = TTi18n::getText( 'TimeSheet Summary' );
					$retarr['TimesheetDetailReport'] = TTi18n::getText( 'TimeSheet Detail' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_punch_summary' ) ) {
					$retarr['PunchSummaryReport'] = TTi18n::getText( 'Punch Summary' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_accrual_balance_summary' ) ) {
					$retarr['AccrualBalanceSummaryReport'] = TTi18n::getText( 'Accrual Balance Summary' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_exception_summary' ) ) {
					$retarr['ExceptionReport'] = TTi18n::getText( 'Exception Summary' );
				}


				//Payroll Reports
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_pay_stub_summary' ) ) {
					$retarr['PayStubSummaryReport'] = TTi18n::getText( 'Pay Stub Summary' );
				}
				if ( $product_edition >= 25 && $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_expense' ) ) {
					$retarr['UserExpenseReport'] = TTi18n::getText( 'Expense Summary' );
				}


				//Job Tracking Reports
				if ( $product_edition >= 20 ) {
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'job_report', 'view_job_summary' ) ) {
						$retarr['JobSummaryReport'] = TTi18n::getText( 'Job Summary' );
					}
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'job_report', 'view_job_analysis' ) ) {
						$retarr['JobDetailReport'] = TTi18n::getText( 'Job Analysis' );
					}
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'job_report', 'view_job_summary' ) ) {
						$retarr['JobInformationReport'] = TTi18n::getText( 'Job Information' );
						$retarr['JobItemInformationReport'] = TTi18n::getText( 'Task Information' );
					}
				}


				//Invoice Reports
				if ( $product_edition >= 20 ) {
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'report', 'view_transaction_summary' ) ) {
						$retarr['InvoiceTransactionSummaryReport'] = TTi18n::getText( 'Transaction Summary' );
					}
				}


				//HR Reports
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'hr_report', 'user_qualification' ) ) {
					$retarr['UserQualificationReport'] = TTi18n::getText( 'Qualification Summary' );
				}
				if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'hr_report', 'user_review' ) ) {
					$retarr['KPIReport'] = TTi18n::getText( 'Review Summary' );
				}


				//HR-Recruitment Reports
				if ( $product_edition >= 25 ) {
					if ( $this->getPermissionObject()->Check( 'report', 'enabled' ) && $this->getPermissionObject()->Check( 'recruitment_report', 'user_recruitment' ) ) {
						$retarr['UserRecruitmentSummaryReport'] = TTi18n::getText( 'Recruitment Summary' );
						$retarr['UserRecruitmentDetailReport'] = TTi18n::getText( 'Recruitment Detail' );
					}
				}

				asort( $retarr );
				$retarr = Misc::addSortPrefix( $retarr );

				break;
			case 'auto_refresh':
				$retarr = [
						0     => TTi18n::getText( 'Disabled' ),
						300   => TTi18n::getText( '5 mins' ),
						600   => TTi18n::getText( '10 mins' ),
						900   => TTi18n::getText( '15 mins' ),
						1800  => TTi18n::getText( '30 mins' ),
						3600  => TTi18n::getText( '1 hour' ),
						7200  => TTi18n::getText( '2 hours' ),
						10800 => TTi18n::getText( '3 hours' ),
						21600 => TTi18n::getText( '6 hours' ),
				];

				if ( PRODUCTION == false ) { //Shorter time for testing.
					$retarr[30] = TTi18n::getText( '30 seconds' );
				}

				break;
		}

		return $retarr;
	}

	/**
	 * Create filter base on user generic data
	 * @param string $view_name        the view name
	 * @param array $user_generic_data user generic data
	 * @param $rows_per_page
	 * @return array
	 */
	function buildFilterParameters( $view_name, $user_generic_data, $rows_per_page ) {
		$parameters = [];
		$parameters['filter_columns'] = [];
		// Always return id column in case we may need it.
		$parameters['filter_columns']['id'] = true;
		// If $user_generic_data set filter_data, convert it to api filter_data format.
		if ( isset( $user_generic_data['filter_data'] ) ) {
			$parameters['filter_data'] = [];
			foreach ( $user_generic_data['filter_data'] as $key => $value ) {
				if ( is_array( $value['value'] ) ) {
					$values = [];
					foreach ( $value['value'] as $i => $item ) {
						if ( isset( $item['value'] ) ) { // saved options
							$values[] = $item['value'];
						} else {
							if ( isset( $item['id'] ) ) {  // saved awesomebox
								$values[] = $item['id'];
							} else {
								$values[] = $item;
							}
						}
					}
					$parameters['filter_data'][$key] = $values;
				} else {
					$parameters['filter_data'][$key] = $value['value'];
				}
			}
		}
		// Add default filter for some views.
		if ( $view_name == 'Request-Authorization' ) {
			if ( !isset( $parameters['filter_data'] ) ) {
				$parameters['filter_data'] = [];
			}
			if ( !isset( $parameters['filter_data']['type_id'] ) ) {
				$parameters['filter_data']['type_id'] = [ -1 ];
			}
			if ( !isset( $parameters['filter_data']['hierarchy_level'] ) ) {
				$parameters['filter_data']['hierarchy_level'] = 1;
			}
		} else {
			if ( $view_name == 'PayPeriodTimeSheetVerify' ) {
				if ( !isset( $parameters['filter_data'] ) ) {
					$parameters['filter_data'] = [];
				}
				if ( !isset( $parameters['filter_data']['hierarchy_level'] ) ) {
					$parameters['filter_data']['hierarchy_level'] = 1;
				}
			} else {
				if ( $view_name == 'UserExpense-Authorization' ) {
					if ( !isset( $parameters['filter_data'] ) ) {
						$parameters['filter_data'] = [];
					}
					$parameters['filter_data']['parent_id'] = [ TTUUID::getZeroID() ];
					if ( !isset( $parameters['filter_data']['hierarchy_level'] ) ) {
						$parameters['filter_data']['hierarchy_level'] = 1;
					}
				}
			}
		}
		// filter_sort in user generic data is same format as api need.
		if ( isset( $user_generic_data['filter_sort'] ) ) {
			$parameters['filter_sort'] = $user_generic_data['filter_sort'];
		}
		if ( isset( $user_generic_data['display_columns'] ) ) {
			for ( $i = 0; $i < count( $user_generic_data['display_columns'] ); $i++ ) {
				$parameters['filter_columns'][$user_generic_data['display_columns'][$i]] = true;
			}
		}
		$parameters['filter_items_per_page'] = $rows_per_page;

		return $parameters;
	}

	/**
	 * @param $display_columns
	 * @param $rows_per_page
	 * @return array
	 */
	function buildDefaultDashletParameters( $display_columns, $rows_per_page ) {
		$parameters = [];
		$parameters['filter_columns'] = [];
		$parameters['filter_columns']['id'] = true;
		if ( is_array( $display_columns ) ) {
			for ( $i = 0; $i < count( $display_columns ); $i++ ) {
				$parameters['filter_columns'][$display_columns[$i]] = true;
			}
		}
		$parameters['filter_items_per_page'] = $rows_per_page;

		return $parameters;
	}

	/**
	 * Get data for specific datalet
	 * @param string $name name of dashlet
	 * @param bool $data
	 * @return array
	 * @internal param array $params parameters for returning dashlet data
	 */
	function getDashletData( $name, $data = false ) {
		$name = strtolower( $name );
		$display_columns = null;
		Debug::Text( 'Name: ' . $name, __FILE__, __LINE__, __METHOD__, 10 );
		switch ( $name ) {
			case 'news':
				$retarr = [];

				$current_epoch = time();

				//$product_edition = $this->getCurrentCompanyObject()->getProductEdition();

				//$permission = new Permission();
				//$permission_level = $permission->getLevel( $this->getCurrentUserObject()->getId(), $this->getCurrentCompanyObject()->getId() );

				//Notify user of new features.
				//if ( Misc::MajorVersionCompare( APPLICATION_VERSION, '9.0.0', '=' ) && TTDate::getBeginDayEpoch( $this->getCurrentUserObject()->getLastLoginDate() ) <= APPLICATION_VERSION_DATE ) {
				//	$retarr[] = '*<b>' . TTi18n::getText( 'Tip' ) . '</b>: ' . TTi18n::getText( 'You can set the default screen that appears after login under MyAccount -> Preferences in the menu along the top of the screen.' );
				//}
				//
				//if ( $product_edition > 10 && $permission_level >= 40 && Misc::MajorVersionCompare( APPLICATION_VERSION, '9.0.0', '=' ) && TTDate::getBeginDayEpoch( $this->getCurrentUserObject()->getLastLoginDate() ) <= APPLICATION_VERSION_DATE ) {
				//	$retarr[] = '*<b>' . TTi18n::getText( 'Tip' ) . '</b>: ' . TTi18n::getText( 'You can add your own custom reports to the dashboard by clicking the Add Dashlet icon at the top left.' );
				//}

				//
				//Regular Employee Related news:
				//
				if ( ( $this->getPermissionObject()->Check( 'punch', 'enabled' ) && ( $this->getPermissionObject()->Check( 'punch', 'view_own' ) || $this->getPermissionObject()->Check( 'punch', 'punch_in_out' ) ) ) ) { //Exceptions are only viewable if they permissions to punch in/out.
					//  Check for critical severity exceptions
					$elf = TTNew( 'ExceptionListFactory' ); /** @var ExceptionListFactory $elf */
					$elf->getFlaggedExceptionsByUserIdAndPayPeriodStatus( $this->getCurrentUserObject()->getId(), 10 );
					if ( $elf->getRecordCount() > 0 ) {
						foreach ( $elf as $e_obj ) {
							if ( $e_obj->getColumn( 'severity_id' ) == 30 ) {
								$retarr[] = TTi18n::getText( 'Critical severity exceptions exist, you may want to take a look at those.' );
							}
							break;
						}
					}
					unset( $elf, $e_obj );
				}

				//  Check for recent unread messages
				$api = TTNew( 'APIMessageControl' ); /** @var APIMessageControl $api */
				$api_result = $this->stripReturnHandler( $api->getMessageControl( [ 'filter_data' => [ 'status_id' => 10, 'folder_id' => 10 ] ] ) );
				if ( is_array( $api_result ) && count( $api_result ) > 0 ) {
					foreach ( $api_result as $message_data ) {
						$retarr[] = TTi18n::getText( 'UnRead message sent from %1 on %2.', [ $message_data['from_first_name'] . ' ' . $message_data['from_last_name'], TTDate::getDate( 'DATE', TTDate::parseDateTime( $message_data['created_date'] ) ) ] );
						break;
					}
				}
				unset( $api_result, $message_data );

				//  Check for timesheet verifications
				$ppslf = TTNew( 'PayPeriodScheduleListFactory' ); /** @var PayPeriodScheduleListFactory $ppslf */
				$ppslf->getByUserId( $this->getCurrentUserObject()->getId() );
				if ( $ppslf->getRecordCount() > 0 ) {
					foreach ( $ppslf as $pps_obj ) {
						if ( in_array( $pps_obj->getTimeSheetVerifyType(), [ 20, 40 ] ) ) { //Check if TimeSheet Verification is enabled or not.
							$pplf = TTNew( 'PayPeriodListFactory' ); /** @var PayPeriodListFactory $pplf */
							$pplf->getThisPayPeriodByCompanyIdAndPayPeriodScheduleIdAndDate( $pps_obj->getCompany(), [ $pps_obj->getId() ], $current_epoch );
							if ( $pplf->getRecordCount() > 0 ) {
								foreach ( $pplf as $pp_obj ) {
									Debug::Text( 'Pay Period ID: ' . $pp_obj->getId() . ' PP Schedule ID: ' . $pps_obj->getId(), __FILE__, __LINE__, __METHOD__, 10 );
									$pptsvlf = TTnew( 'PayPeriodTimeSheetVerifyListFactory' ); /** @var PayPeriodTimeSheetVerifyListFactory $pptsvlf */
									$pptsvlf->getByPayPeriodIdAndUserId( $pp_obj->getId(), $this->getCurrentUserObject()->getId() );
									if ( $pptsvlf->getRecordCount() > 0 ) {
										$pptsv_obj = $pptsvlf->getCurrent();
										$pptsv_obj->setCurrentUser( $this->getCurrentUserObject()->getId() );
									} else {
										$pptsv_obj = $pptsvlf;
										$pptsv_obj->setCurrentUser( $this->getCurrentUserObject()->getId() );
										$pptsv_obj->setUser( $this->getCurrentUserObject()->getId() );
										$pptsv_obj->setPayPeriod( $pp_obj->getId() );
									}

									$verification_window_dates = $pptsv_obj->getVerificationWindowDates();
									Debug::Arr( [ $pptsv_obj->getPayPeriodObject()->data, $verification_window_dates ], ' Verification Dates: ', __FILE__, __LINE__, __METHOD__, 10 );

									//Only display messages if the timesheet isn't already verified.
									if ( $pptsv_obj->displayVerifyButton( $this->getCurrentUserObject()->getId(), $this->getCurrentUserObject()->getId() ) == true ) {
										$retarr[] = TTi18n::getText( 'Timesheet verification required by %2', [ TTDate::getDate( 'DATE', $verification_window_dates['start'] ), TTDate::getDate( 'DATE', $verification_window_dates['end'] ) ] );
									} else {
										Debug::Text( 'TimeSheet Verification is not required or already done...', __FILE__, __LINE__, __METHOD__, 10 );
									}
								}
								unset( $pptsvlf, $pptsv_obj, $verification_window_dates );
							} else {
								Debug::Text( 'No Pay Periods found for PP Schedule ID: ' . $pps_obj->getId(), __FILE__, __LINE__, __METHOD__, 10 );
							}
						} else {
							Debug::Text( 'TimeSheet Verification is not enabled...', __FILE__, __LINE__, __METHOD__, 10 );
						}
					}
				}
				unset( $ppslf, $pps_obj, $pplf, $pp_obj );

				//  Check for requests that changed status.
				$rlf = TTNew( 'RequestListFactory' ); /** @var RequestListFactory $rlf */
				$rlf->getAPISearchByCompanyIdAndArrayCriteria( $this->getCurrentUserObject()->getCompany(), [ 'user_id' => $this->getCurrentUserObject()->getId(), 'status_id' => [ 50, 55 ], 'updated_date_start' => ( TTDate::getBeginDayEpoch( $current_epoch ) - ( 86400 * 2 ) ), 'updated_date_end' => TTDate::getEndDayEpoch( $current_epoch ) ] );
				if ( $rlf->getRecordCount() > 0 ) {
					foreach ( $rlf as $r_obj ) {
						if ( $r_obj->getStatus() == 50 ) {
							$retarr[] = TTi18n::getText( 'A request has recently been authorized.' );
						} else if ( $r_obj->getStatus() == 55 ) {
							$retarr[] = TTi18n::getText( 'A request has recently been declined.' );
						}
						break;
					}
				}
				unset( $rlf, $r_obj );

				//  Check for upcoming scheduled absences
				$api = TTNew( 'APISchedule' ); /** @var APISchedule $api */
				$api_result = $this->stripReturnHandler( $api->getCombinedSchedule( [ 'filter_data' => [ 'status_id' => 20, 'include_user_id' => [ $this->getCurrentUserObject()->getId() ] ] ], TTDate::getDate( 'DATE', $current_epoch ), 'week', false ) );
				if ( isset( $api_result['schedule_data'] ) ) {
					foreach ( $api_result['schedule_data'] as $date => $schedule_data ) {
						$retarr[] = TTi18n::getText( 'Upcoming %1 absence scheduled for %2.', [ $schedule_data[0]['absence_policy'], TTDate::getDate( 'DATE', strtotime( $date ) ) ] );
						break;
					}
				}
				unset( $api_result, $schedule_data, $date );

				//  Check for recent pay stubs.
				$api = TTNew( 'APIPayStub' ); /** @var APIPayStub $api */
				$api_result = $this->stripReturnHandler( $api->getPayStub( [ 'filter_data' => [ 'status_id' => 40, 'include_user_id' => [ $this->getCurrentUserObject()->getId() ], 'start_date' => TTDate::getBeginDayEpoch( $current_epoch - ( 86400 * 2 ) ), 'end_date' => TTDate::getEndDayEpoch( $current_epoch + ( 86400 * 5 ) ) ] ], false ) );
				if ( is_array( $api_result ) && count( $api_result ) > 0 ) {
					foreach ( $api_result as $pay_stub_data ) {
						$retarr[] = TTi18n::getText( 'Pay stub scheduled to be paid on %1 is now available.', [ $pay_stub_data['transaction_date'] ] );
						break;
					}
				}
				unset( $api_result, $pay_stub_data );

				//  Check for Pay Periods nearing end date or transaction date
				$pplf = TTNew( 'PayPeriodListFactory' ); /** @var PayPeriodListFactory $pplf */
				$pplf->getByUserIdAndTransactionDate( $this->getCurrentUserObject()->getId(), $current_epoch );
				if ( $pplf->getRecordCount() > 0 ) {
					foreach ( $pplf as $pp_obj ) {
						$pay_period_end_diff = ( $pp_obj->getEndDate() - $current_epoch );
						$pay_period_transaction_diff = ( $pp_obj->getTransactionDate() - $current_epoch );
						if ( $pay_period_end_diff > 0 && $pay_period_end_diff < ( 86400 * 2 ) ) {
							$retarr[] = TTi18n::getText( 'Current pay period ends on %1, will be paid by %2', [ TTDate::getDate( 'DATE', $pp_obj->getEndDate() ), TTDate::getDate( 'DATE', $pp_obj->getTransactionDate() ) ] );
						} else if ( $pay_period_end_diff < 0 && $pay_period_end_diff > ( 86400 * -2 ) ) {
							$retarr[] = TTi18n::getText( 'Previous pay period ended on %1, will be paid by %2', [ TTDate::getDate( 'DATE', $pp_obj->getEndDate() ), TTDate::getDate( 'DATE', $pp_obj->getTransactionDate() ) ] );
						} else if ( $pay_period_transaction_diff > 0 && $pay_period_transaction_diff < ( 86400 * 2 ) ) {
							$retarr[] = TTi18n::getText( 'Previous pay period will be paid by %2', [ TTDate::getDate( 'DATE', $pp_obj->getEndDate() ), TTDate::getDate( 'DATE', $pp_obj->getTransactionDate() ) ] );
						}
					}
				}
				unset( $pplf, $pp_obj );

				$content = '<style type=\'text/css\'>
							.newsItemContainer{
								display:table;
								width:100%;
								border-spacing:0 5px;
								font-family: Arial, Helvetica, sans-serif;
								font-size: 15px;
							}

							.item{
								display:table-row;
								height:2em;
								line-height: 2em;
								text-align: left;
							}

							.item > div {
							  background-color: #B0C8E0;
							  padding-left: 0.25em;
							}

							.item > div {
							  border-radius: 4px 4px 4px 4px;
							}

							.newsItem g{
								display:table-cell;
							}

							.newsItem{
								width:100%;
								//font-weight: bold;
							}
							</style>';

				if ( count( $retarr ) > 0 ) {
					$content .= '<div class="newsItemContainer">';
					foreach ( $retarr as $item ) {
						$content .= '<div class="item"><div class="newsItem">' . $item . '</div></div>';
					}
					$content .= '</div><div align="center">&bull;</center>';
				} else {
					$content .= '<div class="newsItemContainer">';
					$content .= '<div class="item"><div class="newsItem">' . TTi18n::getText( 'Slow news day, nothing to see here yet' ) . '...</div></div>';
					$content .= '</div><div align="center">&bull;</center>';
				}

				return $this->returnHandler( $content );
				break;
			case 'schedule_summary':
			case 'schedule_summary_child':
				$api = TTNew( 'APISchedule' ); /** @var APISchedule $api */

				$maximum_row_limit = ( isset( $data['rows_per_page'] ) && $data['rows_per_page'] > 0 ) ? $data['rows_per_page'] : $this->getCurrentUserPreferenceObject()->getItemsPerPage();
				$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
				if ( $name == 'schedule_summary' ) {
					$display_columns = [ 'id', 'date_stamp', 'status', 'status_id', 'start_time', 'end_time', 'total_time' ];
					$parameters['filter_data'] = [ 'include_user_ids' => [ $this->getCurrentUserObject()->getId() ] ];
				} else {
					$display_columns = $api->getOptions( 'default_display_columns' );
					$parameters['filter_data'] = [ 'exclude_user_ids' => [ $this->getCurrentUserObject()->getId(), '0' ] ];
				}

				$retarr['api_retval'] = [];

				$api_result = $api->getCombinedSchedule( $parameters, TTDate::getDate( 'DATE', time() ), 'week', false );
				if ( isset( $api_result['api_retval']['schedule_data'] ) ) {
					$i = 0;
					foreach ( $api_result['api_retval']['schedule_data'] as $val ) {
						foreach ( $val as $val1 ) {
							if ( $val1['status_id'] == 10 ) {
								$val1['status'] = TTi18n::getText( 'Working' );
							} else if ( $val1['status_id'] == 20 ) {
								$val1['status'] = ( $val1['absence_policy'] != '' ) ? $val1['absence_policy'] : TTi18n::getText( 'N/A' );
							}
							$retarr['api_retval'][] = $val1;
						}

						if ( $i >= $maximum_row_limit ) {
							array_splice( $retarr['api_retval'], $i );
							break;
						}
						$i++;
					}
				}
				unset( $api_result, $i, $maximum_row_limit );
				break;
			case 'user_active_shift_summary':
				$api = TTNew( 'APIActiveShiftReport' ); /** @var APIActiveShiftReport $api */
				$template_data = $api->getTemplate( 'by_status_by_type_by_employee' );
				$template_data = Misc::trimSortPrefix( $template_data['api_retval'] );
				$template_data['other']['maximum_row_limit'] = ( isset( $data['rows_per_page'] ) && $data['rows_per_page'] > 0 ) ? $data['rows_per_page'] : $this->getCurrentUserPreferenceObject()->getItemsPerPage();
				$display_columns = $template_data['columns'];
				$template_data = Misc::addSortPrefix( $template_data );
				$retarr = $api->getActiveShiftReport( $template_data, 'raw' );
				if ( is_array( $retarr['api_retval'] ) ) {
					array_pop( $retarr['api_retval'] );
				}
				break;
			case 'timesheet_verification_summary':
			case 'timesheet_verification_summary_child':
				$api = TTNew( 'APITimesheetSummaryReport' ); /** @var APITimesheetSummaryReport $api */
				$template_data = $api->getTemplate( 'by_pay_period_by_employee+verified_time_sheet' );
				$template_data = Misc::trimSortPrefix( $template_data['api_retval'] );
				$template_data['other']['maximum_row_limit'] = ( isset( $data['rows_per_page'] ) && $data['rows_per_page'] > 0 ) ? $data['rows_per_page'] : $this->getCurrentUserPreferenceObject()->getItemsPerPage();
				$display_columns = $template_data['columns'];
				if ( $name == 'timesheet_verification_summary_child' ) {
					$template_data['exclude_user_id'] = [ $this->getCurrentUserObject()->getId() ];
				}
				$template_data['sort'][] = [ 'verified_time_sheet' => 'asc' ];
				$template_data['sort'][] = [ 'last_name' => 'asc' ];
				$template_data = Misc::addSortPrefix( $template_data );
				$retarr = $api->getTimesheetSummaryReport( $template_data, 'raw' );
				if ( is_array( $retarr['api_retval'] ) ) {
					array_pop( $retarr['api_retval'] );
				}
				break;
			case 'message_summary':
				$api = TTNew( 'APIMessageControl' ); /** @var APIMessageControl $api */
				$display_columns = $api->getOptions( 'default_display_columns' );
				$display_columns[] = 'status_id';
				$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
				$parameters['filter_data'] = [ 'status_id' => 10, 'folder_id' => 10 ];
				$retarr = $api->getMessageControl( $parameters );
				break;
			case 'exception_summary':
			case 'exception_summary_child':
				$ppslf = TTnew( 'PayPeriodScheduleListFactory' ); /** @var PayPeriodScheduleListFactory $ppslf */
				if ( $name == 'exception_summary_child' ) {
					$ppslf->getByCompanyId( $this->getCurrentCompanyObject()->getId() ); //Must be all PP schedules when showing subordinate exceptions.
				} else {
					$ppslf->getByCompanyIdAndUserId( $this->getCurrentCompanyObject()->getId(), $this->getCurrentUserObject()->getId() ); //Just current users PP schedule.
				}
				$pay_period_schedule_id = $ppslf->getIDSByListFactory( $ppslf );

				//Get pay period schedule that this user belongs to
				if ( is_array( $pay_period_schedule_id ) && count( $pay_period_schedule_id ) > 0 ) {
					$pay_period_ids = [];

					//Get last and this pay period IDs.
					$pplf = TTnew( 'PayPeriodListFactory' ); /** @var PayPeriodListFactory $pplf */
					$pplf->getThisPayPeriodByCompanyIdAndPayPeriodScheduleIdAndDate( $this->getCurrentCompanyObject()->getId(), $pay_period_schedule_id, time() );
					if ( $pplf->getRecordCount() > 0 ) {
						foreach ( $pplf as $pp_obj ) {
							$pay_period_ids[] = $pp_obj->getId();
						}
					}
					$pplf->getLastPayPeriodByCompanyIdAndPayPeriodScheduleIdAndDate( $this->getCurrentCompanyObject()->getId(), $pay_period_schedule_id, time() );
					if ( $pplf->getRecordCount() > 0 ) {
						foreach ( $pplf as $pp_obj ) {
							//Only show last pay period if its not closed.
							if ( $pp_obj->getStatus() != 20 ) {
								$pay_period_ids[] = $pp_obj->getId();
							}
						}
					}

					if ( count( $pay_period_ids ) > 0 ) {
						$api = TTNew( 'APIException' ); /** @var APIException $api */

						if ( $name == 'exception_summary' ) { //Only show the users own exceptions
							//No need to show first/last name as its only displaying their own exceptions anyways.
							$display_columns = [
									'date_stamp',
									'severity',
									'exception_policy_type',
									'exception_policy_type_id',
							];
						} else {
							//Showing other users exceptions, make sure first/last name is displayed.
							$display_columns = $api->getOptions( 'default_display_columns' );
						}
						$display_columns[] = 'exception_color';
						$display_columns[] = 'exception_background_color';
						$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
						$parameters['filter_data'] = [ 'pay_period_id' => $pay_period_ids ];

						if ( $name == 'exception_summary' ) { //Only show the users own exceptions
							$parameters['filter_data']['user_id'] = $this->getCurrentUserObject()->getId();
						} else { //Show all *but* the users own exceptions.
							$parameters['filter_data']['exclude_user_id'] = $this->getCurrentUserObject()->getId();
						}
						$parameters['filter_data']['type_id'] = [ 50 ]; //Exclude pre-mature exceptions.
						$retarr = $api->getException( $parameters );
					}
				}
				break;
			case 'request_summary':
				$api = TTNew( 'APIRequest' ); /** @var APIRequest $api */
				$display_columns = $api->getOptions( 'default_display_columns' );
				$display_columns[] = 'status_id';
				$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
				$parameters['filter_data'] = [ 'status_id' => 30 ];
				$retarr = $api->getRequest( $parameters );
				break;
			case 'request_authorize_summary':
				$api = TTNew( 'APIRequest' ); /** @var APIRequest $api */
				$display_columns = $api->getOptions( 'default_display_columns' );
				$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
				$parameters['filter_data'] = [];
				$parameters['filter_data']['type_id'] = [ -1 ];
				$parameters['filter_data']['status_id'] = 30; //Pending Auth
				$parameters['filter_data']['hierarchy_level'] = 1;
				$retarr = $api->getRequest( $parameters );
				break;
			case 'accrual_balance_summary':
				$api = TTNew( 'APIAccrualBalance' ); /** @var APIAccrualBalance $api */
				$display_columns = $api->getOptions( 'default_display_columns' );
				//$display_columns[] = 'status_id';
				$parameters = $this->buildDefaultDashletParameters( $display_columns, $data['rows_per_page'] );
				$parameters['filter_data'] = [ 'status_id' => 10 ]; //Only active employees.
				$retarr = $api->getAccrualBalance( $parameters );
				break;
			case 'custom_list':
				/*
				 * Params=array('class' => <string>, 'user_generic_data_id' => array() )
				 */

				if ( isset( $data['class'] ) && $data['class'] != '' ) {
					Debug::Text( '  Class: ' . $data['class'], __FILE__, __LINE__, __METHOD__, 10 );

					//Get saved search and layout.
					if ( isset( $data['user_generic_data_id'] ) ) {
						Debug::Text( '  Getting UserGenericData for ID: ' . $data['user_generic_data_id'], __FILE__, __LINE__, __METHOD__, 10 );

						if ( $data['class'] == 'Request-Authorization' ) {
							$api = TTNew( 'APIRequest' ); /** @var APIRequest $api */
							$function_name = 'getRequest';
						} else {
							if ( $data['class'] == 'UserExpense-Authorization' ) {
								$api = TTNew( 'APIUserExpense' ); /** @var APIUserExpense $api */
								$function_name = 'getUserExpense';
							} else {
								$api = TTNew( 'API' . $data['class'] );
								$function_name = 'get' . $data['class'];
							}
						}

						$augd = TTNew( 'APIUserGenericData' ); /** @var APIUserGenericData $augd */
						$retval = $this->stripReturnHandler( $augd->getUserGenericData( [ 'filter_data' => [ 'id' => TTUUID::castUUID( $data['user_generic_data_id'] ) ] ] ) );
						if ( is_array( $retval ) && count( $retval ) == 1 ) {
							if ( isset( $retval[0]['data'] ) ) {
								$user_generic_data = $retval[0]['data'];
								$display_columns = $user_generic_data['display_columns'];
							}
						} else {
							//No user_generic_data specified, just use default display columns instead.
							$display_columns = $api->getOptions( 'default_display_columns' );
							$user_generic_data = [ 'display_columns' => $display_columns ];
						}
						unset( $retval );

						if ( isset( $user_generic_data ) ) {
							Debug::Arr( $user_generic_data, '  UserGenericData for Class: ' . $data['class'] . ' ID: ' . $data['user_generic_data_id'], __FILE__, __LINE__, __METHOD__, 10 );

							if ( strpos( '-', $data['class'] ) === false ) {
								Debug::Text( '  Getting Dashlet Data for Class: ' . $data['class'], __FILE__, __LINE__, __METHOD__, 10 );
								$retarr = $api->$function_name( $this->buildFilterParameters( $data['class'], $user_generic_data, $data['rows_per_page'] ) );
							}
							//else {
							//Special class, need to handle it manually.
							//}
						} else {
							Debug::Text( 'ERROR: No UserGenericData available...', __FILE__, __LINE__, __METHOD__, 10 );
						}
					} else {
						Debug::Text( 'ERROR: No UserGenericData ID specified...', __FILE__, __LINE__, __METHOD__, 10 );
					}
				} else {
					Debug::Text( 'ERROR: No Class specified...', __FILE__, __LINE__, __METHOD__, 10 );
				}

				break;
			case 'custom_report':
				break;
		}

		if ( isset( $retarr ) ) {
			$data = $retarr['api_retval'];
			$retarr['api_retval'] = [ 'data' => $data, 'display_columns' => $display_columns ];

			return $retarr;
		}

		return $this->returnHandler( false );
	}

	/**
	 * @return array
	 */
	function getDefaultDashlets() {
		$parameters = [];

		$permission = new Permission();
		$permission_level = $permission->getLevel( $this->getCurrentUserObject()->getId(), $this->getCurrentCompanyObject()->getId() );
		Debug::Text( 'Permission Level: ' . $permission_level, __FILE__, __LINE__, __METHOD__, 10 );

		//Get available dashlets (as that performs permission checks), and only add ones that are available.
		$dashlet_options = Misc::trimSortPrefix( $this->getOptions( 'dashlets' ) );

		//Check if TimeSheet Verifications are even enabled, not need to display dashlets if they aren't.
		$enabled_timesheet_verification = false;
		$ppslf = TTNew( 'PayPeriodScheduleListFactory' ); /** @var PayPeriodScheduleListFactory $ppslf */
		$ppslf->getByCompanyId( $this->getCurrentCompanyObject()->getId() );
		if ( $ppslf->getRecordCount() > 0 ) {
			foreach ( $ppslf as $pps_obj ) {
				if ( in_array( $pps_obj->getTimeSheetVerifyType(), [ 20, 40 ] ) ) { //Check if TimeSheet Verification is enabled or not.
					$enabled_timesheet_verification = true;
					break;
				}
			}
		}

		//Note: Dashlet information including its name/title is saved to UserGenericData, which means if the user changes languages then the dashlet titles won't get changed unless they edit/save them, or restore defaults.
		//      This is required behavior since the user can rename the dashlets to whatever they want.

		//Common to all levels.
		( ( isset( $dashlet_options['news'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'news', TTi18n::getText( 'News' ) ) : null );
		( ( isset( $dashlet_options['exception_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'exception_summary', TTi18n::getText( 'Exception Summary' ) ) : null );
		( ( isset( $dashlet_options['message_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'message_summary', TTi18n::getText( 'Messages (UnRead)' ) ) : null );

		if ( $permission_level >= 40 ) {
			( ( isset( $dashlet_options['request_authorize_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'request_authorize_summary', TTi18n::getText( 'Request Authorizations' ) ) : null );
			( ( isset( $dashlet_options['exception_summary_child'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'exception_summary_child', TTi18n::getText( 'Exceptions (Subordinates)' ) ) : null );
			( ( isset( $dashlet_options['schedule_summary_child'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'schedule_summary_child', TTi18n::getText( 'Schedule Summary (Subordinates)' ) ) : null );
		}

		if ( $permission_level <= 40 ) {
			( ( isset( $dashlet_options['timesheet_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'timesheet_summary', TTi18n::getText( 'TimeSheet Summary' ) ) : null );
		}
		( ( isset( $dashlet_options['schedule_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'schedule_summary', TTi18n::getText( 'Schedule Summary' ) ) : null );
		if ( $permission_level <= 40 ) {
			( ( isset( $dashlet_options['accrual_balance_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'accrual_balance_summary', TTi18n::getText( 'Accrual Balances' ) ) : null );
		}

		if ( $enabled_timesheet_verification == true ) {
			if ( $permission_level == 40 ) {
				( ( isset( $dashlet_options['timesheet_verification_summary_child'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'timesheet_verification_summary_child', TTi18n::getText( 'TimeSheet Verifications (Subordinates)' ) ) : null );
			} else if ( $permission_level >= 50 ) {
				( ( isset( $dashlet_options['timesheet_verification_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'timesheet_verification_summary', TTi18n::getText( 'TimeSheet Verifications' ) ) : null );
			}
		}

		if ( $permission_level >= 40 ) {
			( ( isset( $dashlet_options['user_active_shift_summary'] ) ) ? $parameters[] = $this->createDefaultDashletData( 'user_active_shift_summary', TTi18n::getText( 'Whos In/Out' ) ) : null );
		}

		$augd = TTNew( 'APIUserGenericData' ); /** @var APIUserGenericData $augd */
		$retval = $augd->setUserGenericData( $parameters );
		if ( $retval['api_retval'] == true ) {
			$parameters = [
					'name'       => 'order_data',
					'script'     => 'global_dashboard_order',
					'is_default' => true,
					'data'       => $retval['api_details']['details'],
			];
			$augd->setUserGenericData( $parameters );

			return $augd->getUserGenericData( [ 'filter_data' => [ 'script' => 'global_dashboard', 'deleted' => false ] ] );
		} else {
			return $this->returnHandler( false );
		}
	}

	/**
	 * @param $type
	 * @param $name
	 * @return array
	 */
	function createDefaultDashletData( $type, $name ) {
		$result = [
				'script'     => 'global_dashboard',
				'is_default' => false,
				'name'       => $name,
				'data'       => [
						'dashlet_type'  => $type,
						'auto_refresh'  => 0,
						'rows_per_page' => 0,
				],
		];

		return $result;
	}

	/**
	 * @return bool
	 */
	function removeAllDashlets() {
		return true;
	}
}

?>