TimeTrex Community Edition v16.2.0
This commit is contained in:
426
classes/modules/api/qualification/APIQualification.class.php
Normal file
426
classes/modules/api/qualification/APIQualification.class.php
Normal file
@ -0,0 +1,426 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIQualification extends APIFactory {
|
||||
protected $main_class = 'QualificationFactory';
|
||||
|
||||
/**
|
||||
* APIQualification constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'view' ) || $this->getPermissionObject()->Check( 'qualification', 'view_own' ) || $this->getPermissionObject()->Check( 'qualification', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default qualification data for creating new qualifications.
|
||||
* @return array
|
||||
*/
|
||||
function getQualificationDefaultData() {
|
||||
$company_obj = $this->getCurrentCompanyObject();
|
||||
|
||||
Debug::Text( 'Getting qualification default data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$data = [
|
||||
'company_id' => $company_obj->getId(),
|
||||
'source_type_id' => 10, //Internal
|
||||
'visibility_type_id' => 10, //Internal Only
|
||||
];
|
||||
|
||||
return $this->returnHandler( $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get qualification data for one or more qualifications.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getQualification( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'view' ) || $this->getPermissionObject()->Check( 'qualification', 'view_own' ) || $this->getPermissionObject()->Check( 'qualification', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'qualification', 'view' );
|
||||
|
||||
$qlf = TTnew( 'QualificationListFactory' ); /** @var QualificationListFactory $qlf */
|
||||
|
||||
$qlf->getAPISearchByCompanyIdAndArrayCriteria( $this->getCurrentCompanyObject()->getId(), $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $qlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $qlf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $qlf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $qlf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $qlf as $q_obj ) {
|
||||
|
||||
$retarr[] = $q_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $qlf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param array $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportQualification( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getQualification( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_qualification', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonQualificationData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getQualification( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate qualification data for one or more qualifications.
|
||||
* @param array $data qualification data
|
||||
* @return array
|
||||
*/
|
||||
function validateQualification( $data ) {
|
||||
return $this->setQualification( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set qualification data for one or more qualifications.
|
||||
* @param array $data qualification data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setQualification( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'edit' ) || $this->getPermissionObject()->Check( 'qualification', 'edit_own' ) || $this->getPermissionObject()->Check( 'qualification', 'edit_child' ) || $this->getPermissionObject()->Check( 'qualification', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Qualifications', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'QualificationListFactory' ); /** @var QualificationListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'qualification', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getCreatedBy(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
$primary_validator->isTrue( 'permission', $this->getPermissionObject()->Check( 'qualification', 'add' ), TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
//Force Company ID to current company.
|
||||
$row['company_id'] = $this->getCurrentCompanyObject()->getId();
|
||||
$row['source_type_id'] = 10; // Internal. force all new qualifications set from the main application UI to 10.
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more qualifications.
|
||||
* @param array $data qualification data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteQualification( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'delete' ) || $this->getPermissionObject()->Check( 'qualification', 'delete_own' ) || $this->getPermissionObject()->Check( 'qualification', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Qualifications', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'QualificationListFactory' ); /** @var QualificationListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'qualification', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getCreatedBy(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more qualifications.
|
||||
* @param array $data qualification IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyQualification( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Qualifications', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getQualification( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
$src_rows[$key]['name'] = Misc::generateCopyName( $row['name'] ); //Generate unique name
|
||||
}
|
||||
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setQualification( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -0,0 +1,445 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIQualificationGroup extends APIFactory {
|
||||
protected $main_class = 'QualificationGroupFactory';
|
||||
|
||||
/**
|
||||
* APIQualificationGroup constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'view' ) || $this->getPermissionObject()->Check( 'qualification', 'view_own' ) || $this->getPermissionObject()->Check( 'qualification', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default QualificationGroup data for creating new QualificationGroupes.
|
||||
* @return array
|
||||
*/
|
||||
function getQualificationGroupDefaultData() {
|
||||
$company_obj = $this->getCurrentCompanyObject();
|
||||
|
||||
Debug::Text( 'Getting QualificationGroup default data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$data = [
|
||||
'company_id' => $company_obj->getId(),
|
||||
'parent_id' => TTUUID::getZeroID(),
|
||||
'name' => null,
|
||||
];
|
||||
|
||||
return $this->returnHandler( $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get QualificationGroup data for one or more QualificationGroupes.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @param string $mode
|
||||
* @return array|bool
|
||||
*/
|
||||
function getQualificationGroup( $data = null, $disable_paging = false, $mode = 'flat' ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'view' ) || $this->getPermissionObject()->Check( 'qualification', 'view_own' ) || $this->getPermissionObject()->Check( 'qualification', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'qualification', 'view' );
|
||||
|
||||
$qglf = TTnew( 'QualificationGroupListFactory' ); /** @var QualificationGroupListFactory $qglf */
|
||||
|
||||
if ( $mode == 'flat' ) {
|
||||
|
||||
$qglf->getAPISearchByCompanyIdAndArrayCriteria( $this->getCurrentCompanyObject()->getId(), $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
Debug::Text( 'Record Count: ' . $qglf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
if ( $qglf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $qglf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $qglf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $qglf as $ug_obj ) {
|
||||
$retarr[] = $ug_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $qglf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
} else {
|
||||
$nodes = $qglf->getByCompanyIdArray( $this->getCurrentCompanyObject()->getId() );
|
||||
//Debug::Arr($nodes, ' Nodes: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
//Debug::Text('Record Count: '. count($nodes), __FILE__, __LINE__, __METHOD__, 10);
|
||||
if ( isset( $nodes ) ) {
|
||||
$retarr = TTTree::FormatArray( $nodes );
|
||||
|
||||
//Debug::Arr($retarr, ' Data: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonQualificationGroupData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getQualificationGroup( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate QualificationGroup data for one or more QualificationGroupes.
|
||||
* @param array $data QualificationGroup data
|
||||
* @return array
|
||||
*/
|
||||
function validateQualificationGroup( $data ) {
|
||||
return $this->setQualificationGroup( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set QualificationGroup data for one or more QualificationGroupes.
|
||||
* @param array $data QualificationGroup data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setQualificationGroup( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'edit' ) || $this->getPermissionObject()->Check( 'qualification', 'edit_own' ) || $this->getPermissionObject()->Check( 'qualification', 'edit_child' ) || $this->getPermissionObject()->Check( 'qualification', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' QualificationGroups', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'QualificationGroupListFactory' ); /** @var QualificationGroupListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get QualificationGroup object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'qualification', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getCreatedBy(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
$primary_validator->isTrue( 'permission', $this->getPermissionObject()->Check( 'qualification', 'add' ), TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
//Force Company ID to current company.
|
||||
$row['company_id'] = $this->getCurrentCompanyObject()->getId();
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
}
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more QualificationGroups.
|
||||
* @param array $data QualificationGroup data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteQualificationGroup( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'qualification', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'qualification', 'delete' ) || $this->getPermissionObject()->Check( 'qualification', 'delete_own' ) || $this->getPermissionObject()->Check( 'qualification', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' QualificationGroups', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'QualificationGroupListFactory' ); /** @var QualificationGroupListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get QualificationGroup object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'qualification', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'qualification', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getCreatedBy(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
}
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more QualificationGroupes.
|
||||
* @param array $data QualificationGroup IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyQualificationGroup( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' QualificationGroups', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getQualificationGroup( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'], $src_rows[$key]['manual_id'] ); //Clear fields that can't be copied
|
||||
$src_rows[$key]['name'] = Misc::generateCopyName( $row['name'] ); //Generate unique name
|
||||
}
|
||||
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setQualificationGroup( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Change parent of one or more groups to another group.
|
||||
* @param array $src_id source Group ID
|
||||
* @param int $dst_id destination Group ID
|
||||
* @return array
|
||||
*/
|
||||
function dragNdropQualificationGroup( $src_id, $dst_id ) {
|
||||
if ( !is_array( $src_id ) ) {
|
||||
$src_id = [ $src_id ];
|
||||
}
|
||||
|
||||
if ( is_array( $dst_id ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Arr( $src_id, 'Src ID: Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $dst_id, 'Dst ID: Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getQualificationGroup( [ 'filter_data' => [ 'id' => $src_id ] ], true, 'flat' ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
$src_rows[$key]['parent_id'] = $dst_id;
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
Debug::Arr( $src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
return $this->setQualificationGroup( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
429
classes/modules/api/qualification/APIUserEducation.class.php
Normal file
429
classes/modules/api/qualification/APIUserEducation.class.php
Normal file
@ -0,0 +1,429 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIUserEducation extends APIFactory {
|
||||
protected $main_class = 'UserEducationFactory';
|
||||
|
||||
/**
|
||||
* APIUserEducation constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'user_education', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_education', 'view' ) || $this->getPermissionObject()->Check( 'user_education', 'view_own' ) || $this->getPermissionObject()->Check( 'user_education', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default user education data for creating new educations.
|
||||
* @return array
|
||||
*/
|
||||
function getUserEducationDefaultData() {
|
||||
$data = [];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user education data for one or more educations.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getUserEducation( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_education', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_education', 'view' ) || $this->getPermissionObject()->Check( 'user_education', 'view_own' ) || $this->getPermissionObject()->Check( 'user_education', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'user_education', 'view' );
|
||||
|
||||
if ( isset( $data['filter_data']['company_id'] )
|
||||
&& TTUUID::isUUID( $data['filter_data']['company_id'] ) && $data['filter_data']['company_id'] != TTUUID::getZeroID() && $data['filter_data']['company_id'] != TTUUID::getNotExistID()
|
||||
&& ( $this->getPermissionObject()->Check( 'company', 'enabled' ) && $this->getPermissionObject()->Check( 'company', 'edit' ) ) ) {
|
||||
$company_id = $data['filter_data']['company_id'];
|
||||
} else {
|
||||
$company_id = $this->getCurrentCompanyObject()->getId();
|
||||
}
|
||||
|
||||
$uelf = TTnew( 'UserEducationListFactory' ); /** @var UserEducationListFactory $uelf */
|
||||
|
||||
$uelf->getAPISearchByCompanyIdAndArrayCriteria( $company_id, $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $uelf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $uelf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $uelf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $uelf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $uelf as $s_obj ) {
|
||||
|
||||
$retarr[] = $s_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $uelf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param null $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportUserEducation( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getUserEducation( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_education', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonUserEducationData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getUserEducation( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate education data for one or more educations.
|
||||
* @param array $data education data
|
||||
* @return array
|
||||
*/
|
||||
function validateUserEducation( $data ) {
|
||||
return $this->setUserEducation( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set education data for one or more educations.
|
||||
* @param array $data education data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setUserEducation( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_education', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_education', 'edit' ) || $this->getPermissionObject()->Check( 'user_education', 'edit_own' ) || $this->getPermissionObject()->Check( 'user_education', 'edit_child' ) || $this->getPermissionObject()->Check( 'user_education', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Educations', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserEducationListFactory' ); /** @var UserEducationListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_education', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_education', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_education', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
if ( !( $validate_only == true
|
||||
||
|
||||
( $this->getPermissionObject()->Check( 'user_education', 'add' )
|
||||
&&
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_education', 'edit' )
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_education', 'edit_own' ) && $this->getPermissionObject()->isOwner( false, $row['user_id'] ) === true ) //We don't know the created_by of the user at this point, but only check if the user is assigned to the logged in person.
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_education', 'edit_child' ) && $this->getPermissionObject()->isChild( $row['user_id'], $permission_children_ids ) === true )
|
||||
)
|
||||
)
|
||||
) ) {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more educations.
|
||||
* @param array $data education data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteUserEducation( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_education', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_education', 'delete' ) || $this->getPermissionObject()->Check( 'user_education', 'delete_own' ) || $this->getPermissionObject()->Check( 'user_education', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Educations', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserEducationListFactory' ); /** @var UserEducationListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'user_education', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_education', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_education', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more Educations.
|
||||
* @param array $data education IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyUserEducation( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Educations', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getUserEducation( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setUserEducation( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
428
classes/modules/api/qualification/APIUserLanguage.class.php
Normal file
428
classes/modules/api/qualification/APIUserLanguage.class.php
Normal file
@ -0,0 +1,428 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIUserLanguage extends APIFactory {
|
||||
protected $main_class = 'UserLanguageFactory';
|
||||
|
||||
/**
|
||||
* APIUserLanguage constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'user_language', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_language', 'view' ) || $this->getPermissionObject()->Check( 'user_language', 'view_own' ) || $this->getPermissionObject()->Check( 'user_language', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default user language data for creating new languages.
|
||||
* @return array
|
||||
*/
|
||||
function getUserLanguageDefaultData() {
|
||||
$data = [];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user language data for one or more languages.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getUserLanguage( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_language', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_language', 'view' ) || $this->getPermissionObject()->Check( 'user_language', 'view_own' ) || $this->getPermissionObject()->Check( 'user_language', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'user_language', 'view' );
|
||||
|
||||
if ( isset( $data['filter_data']['company_id'] )
|
||||
&& TTUUID::isUUID( $data['filter_data']['company_id'] ) && $data['filter_data']['company_id'] != TTUUID::getZeroID() && $data['filter_data']['company_id'] != TTUUID::getNotExistID()
|
||||
&& ( $this->getPermissionObject()->Check( 'company', 'enabled' ) && $this->getPermissionObject()->Check( 'company', 'edit' ) ) ) {
|
||||
$company_id = $data['filter_data']['company_id'];
|
||||
} else {
|
||||
$company_id = $this->getCurrentCompanyObject()->getId();
|
||||
}
|
||||
|
||||
$ullf = TTnew( 'UserLanguageListFactory' ); /** @var UserLanguageListFactory $ullf */
|
||||
|
||||
$ullf->getAPISearchByCompanyIdAndArrayCriteria( $company_id, $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $ullf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $ullf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $ullf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $ullf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $ullf as $s_obj ) {
|
||||
|
||||
$retarr[] = $s_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $ullf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param array $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportUserLanguage( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getUserLanguage( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_language', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonUserLanguageData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getUserLanguage( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate language data for one or more languages.
|
||||
* @param array $data language data
|
||||
* @return array
|
||||
*/
|
||||
function validateUserLanguage( $data ) {
|
||||
return $this->setUserLanguage( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set language data for one or more languages.
|
||||
* @param array $data language data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setUserLanguage( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_language', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_language', 'edit' ) || $this->getPermissionObject()->Check( 'user_language', 'edit_own' ) || $this->getPermissionObject()->Check( 'user_language', 'edit_child' ) || $this->getPermissionObject()->Check( 'user_language', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Languages', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserLanguageListFactory' ); /** @var UserLanguageListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_language', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_language', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_language', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
if ( !( $validate_only == true
|
||||
||
|
||||
( $this->getPermissionObject()->Check( 'user_language', 'add' )
|
||||
&&
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_language', 'edit' )
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_language', 'edit_own' ) && $this->getPermissionObject()->isOwner( false, $row['user_id'] ) === true ) //We don't know the created_by of the user at this point, but only check if the user is assigned to the logged in person.
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_language', 'edit_child' ) && $this->getPermissionObject()->isChild( $row['user_id'], $permission_children_ids ) === true )
|
||||
)
|
||||
)
|
||||
) ) {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more languages.
|
||||
* @param array $data language data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteUserLanguage( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_language', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_language', 'delete' ) || $this->getPermissionObject()->Check( 'user_language', 'delete_own' ) || $this->getPermissionObject()->Check( 'user_language', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Languages', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserLanguageListFactory' ); /** @var UserLanguageListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'user_language', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_language', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_language', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more Languages.
|
||||
* @param array $data language IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyUserLanguage( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Languages', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getUserLanguage( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setUserLanguage( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
430
classes/modules/api/qualification/APIUserLicense.class.php
Normal file
430
classes/modules/api/qualification/APIUserLicense.class.php
Normal file
@ -0,0 +1,430 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIUserLicense extends APIFactory {
|
||||
protected $main_class = 'UserLicenseFactory';
|
||||
|
||||
/**
|
||||
* APIUserLicense constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'user_license', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_license', 'view' ) || $this->getPermissionObject()->Check( 'user_license', 'view_own' ) || $this->getPermissionObject()->Check( 'user_license', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default user license data for creating new licenses.
|
||||
* @return array
|
||||
*/
|
||||
function getUserLicenseDefaultData() {
|
||||
$data = [];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user license data for one or more licenses.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getUserLicense( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_license', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_license', 'view' ) || $this->getPermissionObject()->Check( 'user_license', 'view_own' ) || $this->getPermissionObject()->Check( 'user_license', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'user_license', 'view' );
|
||||
|
||||
if ( isset( $data['filter_data']['company_id'] )
|
||||
&& TTUUID::isUUID( $data['filter_data']['company_id'] ) && $data['filter_data']['company_id'] != TTUUID::getZeroID() && $data['filter_data']['company_id'] != TTUUID::getNotExistID()
|
||||
&& ( $this->getPermissionObject()->Check( 'company', 'enabled' ) && $this->getPermissionObject()->Check( 'company', 'edit' ) ) ) {
|
||||
$company_id = $data['filter_data']['company_id'];
|
||||
} else {
|
||||
$company_id = $this->getCurrentCompanyObject()->getId();
|
||||
}
|
||||
|
||||
$ullf = TTnew( 'UserLicenseListFactory' ); /** @var UserLicenseListFactory $ullf */
|
||||
|
||||
$ullf->getAPISearchByCompanyIdAndArrayCriteria( $company_id, $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $ullf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $ullf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $ullf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $ullf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $ullf as $s_obj ) {
|
||||
|
||||
$retarr[] = $s_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $ullf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param array $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportUserLicense( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getUserLicense( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_license', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonUserLicenseData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getUserLicense( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate license data for one or more licenses.
|
||||
* @param array $data license data
|
||||
* @return array
|
||||
*/
|
||||
function validateUserLicense( $data ) {
|
||||
return $this->setUserLicense( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set license data for one or more licenses.
|
||||
* @param array $data license data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setUserLicense( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_license', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_license', 'edit' ) || $this->getPermissionObject()->Check( 'user_license', 'edit_own' ) || $this->getPermissionObject()->Check( 'user_license', 'edit_child' ) || $this->getPermissionObject()->Check( 'user_license', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Licenses', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserLicenseListFactory' ); /** @var UserLicenseListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_license', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_license', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_license', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
if ( !( $validate_only == true
|
||||
||
|
||||
( $this->getPermissionObject()->Check( 'user_license', 'add' )
|
||||
&&
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_license', 'edit' )
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_license', 'edit_own' ) && $this->getPermissionObject()->isOwner( false, $row['user_id'] ) === true ) //We don't know the created_by of the user at this point, but only check if the user is assigned to the logged in person.
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_license', 'edit_child' ) && $this->getPermissionObject()->isChild( $row['user_id'], $permission_children_ids ) === true )
|
||||
)
|
||||
)
|
||||
) ) {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more licenses.
|
||||
* @param array $data license data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteUserLicense( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_license', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_license', 'delete' ) || $this->getPermissionObject()->Check( 'user_license', 'delete_own' ) || $this->getPermissionObject()->Check( 'user_license', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Licenses', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserLicenseListFactory' ); /** @var UserLicenseListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'user_license', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_license', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_license', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more Licenses.
|
||||
* @param array $data license IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyUserLicense( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Licenses', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getUserLicense( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setUserLicense( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
430
classes/modules/api/qualification/APIUserMembership.class.php
Normal file
430
classes/modules/api/qualification/APIUserMembership.class.php
Normal file
@ -0,0 +1,430 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIUserMembership extends APIFactory {
|
||||
protected $main_class = 'UserMembershipFactory';
|
||||
|
||||
/**
|
||||
* APIUserMembership constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'user_membership', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_membership', 'view' ) || $this->getPermissionObject()->Check( 'user_membership', 'view_own' ) || $this->getPermissionObject()->Check( 'user_membership', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default user membership data for creating new memberships.
|
||||
* @return array
|
||||
*/
|
||||
function getUserMembershipDefaultData() {
|
||||
$data = [ 'amount' => '0.00' ];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user membership data for one or more memberships.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getUserMembership( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_membership', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_membership', 'view' ) || $this->getPermissionObject()->Check( 'user_membership', 'view_own' ) || $this->getPermissionObject()->Check( 'user_membership', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'user_membership', 'view' );
|
||||
|
||||
if ( isset( $data['filter_data']['company_id'] )
|
||||
&& TTUUID::isUUID( $data['filter_data']['company_id'] ) && $data['filter_data']['company_id'] != TTUUID::getZeroID() && $data['filter_data']['company_id'] != TTUUID::getNotExistID()
|
||||
&& ( $this->getPermissionObject()->Check( 'company', 'enabled' ) && $this->getPermissionObject()->Check( 'company', 'edit' ) ) ) {
|
||||
$company_id = $data['filter_data']['company_id'];
|
||||
} else {
|
||||
$company_id = $this->getCurrentCompanyObject()->getId();
|
||||
}
|
||||
|
||||
$umlf = TTnew( 'UserMembershipListFactory' ); /** @var UserMembershipListFactory $umlf */
|
||||
|
||||
$umlf->getAPISearchByCompanyIdAndArrayCriteria( $company_id, $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $umlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $umlf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $umlf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $umlf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $umlf as $s_obj ) {
|
||||
|
||||
$retarr[] = $s_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $umlf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param array $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportUserMembership( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getUserMembership( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_membership', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonUserMembershipData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getUserMembership( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate membership data for one or more memberships.
|
||||
* @param array $data membership data
|
||||
* @return array
|
||||
*/
|
||||
function validateUserMembership( $data ) {
|
||||
return $this->setUserMembership( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set membership data for one or more memberships.
|
||||
* @param array $data membership data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setUserMembership( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_membership', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_membership', 'edit' ) || $this->getPermissionObject()->Check( 'user_membership', 'edit_own' ) || $this->getPermissionObject()->Check( 'user_membership', 'edit_child' ) || $this->getPermissionObject()->Check( 'user_membership', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Memberships', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserMembershipListFactory' ); /** @var UserMembershipListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_membership', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_membership', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_membership', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
if ( !( $validate_only == true
|
||||
||
|
||||
( $this->getPermissionObject()->Check( 'user_membership', 'add' )
|
||||
&&
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_membership', 'edit' )
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_membership', 'edit_own' ) && $this->getPermissionObject()->isOwner( false, $row['user_id'] ) === true ) //We don't know the created_by of the user at this point, but only check if the user is assigned to the logged in person.
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_membership', 'edit_child' ) && $this->getPermissionObject()->isChild( $row['user_id'], $permission_children_ids ) === true )
|
||||
)
|
||||
)
|
||||
) ) {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more memberships.
|
||||
* @param array $data membership data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteUserMembership( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_membership', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_membership', 'delete' ) || $this->getPermissionObject()->Check( 'user_membership', 'delete_own' ) || $this->getPermissionObject()->Check( 'user_membership', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Memberships', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserMembershipListFactory' ); /** @var UserMembershipListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'user_membership', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_membership', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_membership', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more Memberships.
|
||||
* @param array $data membership IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyUserMembership( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Memberships', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getUserMembership( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setUserMembership( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
452
classes/modules/api/qualification/APIUserSkill.class.php
Normal file
452
classes/modules/api/qualification/APIUserSkill.class.php
Normal file
@ -0,0 +1,452 @@
|
||||
<?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\Qualification
|
||||
*/
|
||||
class APIUserSkill extends APIFactory {
|
||||
protected $main_class = 'UserSkillFactory';
|
||||
|
||||
/**
|
||||
* APIUserSkill constructor.
|
||||
*/
|
||||
public function __construct() {
|
||||
parent::__construct(); //Make sure parent constructor is always called.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get options for dropdown boxes.
|
||||
* @param bool|string $name Name of options to return, ie: 'columns', 'type', 'status'
|
||||
* @param mixed $parent Parent name/ID of options to return if data is in hierarchical format. (ie: Province)
|
||||
* @return bool|array
|
||||
*/
|
||||
function getOptions( $name = false, $parent = null ) {
|
||||
if ( $name == 'columns'
|
||||
&& ( !$this->getPermissionObject()->Check( 'user_skill', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_skill', 'view' ) || $this->getPermissionObject()->Check( 'user_skill', 'view_own' ) || $this->getPermissionObject()->Check( 'user_skill', 'view_child' ) ) ) ) {
|
||||
$name = 'list_columns';
|
||||
}
|
||||
|
||||
return parent::getOptions( $name, $parent );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default user skill data for creating new skills.
|
||||
* @return array
|
||||
*/
|
||||
function getUserSkillDefaultData() {
|
||||
$data = [];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user skill data for one or more skills.
|
||||
* @param array $data filter data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function getUserSkill( $data = null, $disable_paging = false ) {
|
||||
$data = $this->initializeFilterAndPager( $data, $disable_paging );
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_skill', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_skill', 'view' ) || $this->getPermissionObject()->Check( 'user_skill', 'view_own' ) || $this->getPermissionObject()->Check( 'user_skill', 'view_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$data['filter_data']['permission_children_ids'] = $this->getPermissionObject()->getPermissionChildren( 'user_skill', 'view' );
|
||||
|
||||
if ( isset( $data['filter_data']['company_id'] )
|
||||
&& TTUUID::isUUID( $data['filter_data']['company_id'] ) && $data['filter_data']['company_id'] != TTUUID::getZeroID() && $data['filter_data']['company_id'] != TTUUID::getNotExistID()
|
||||
&& ( $this->getPermissionObject()->Check( 'company', 'enabled' ) && $this->getPermissionObject()->Check( 'company', 'edit' ) ) ) {
|
||||
$company_id = $data['filter_data']['company_id'];
|
||||
} else {
|
||||
$company_id = $this->getCurrentCompanyObject()->getId();
|
||||
}
|
||||
|
||||
$uslf = TTnew( 'UserSkillListFactory' ); /** @var UserSkillListFactory $uslf */
|
||||
|
||||
$uslf->getAPISearchByCompanyIdAndArrayCriteria( $company_id, $data['filter_data'], $data['filter_items_per_page'], $data['filter_page'], null, $data['filter_sort'] );
|
||||
|
||||
Debug::Text( 'Record Count: ' . $uslf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $uslf->getRecordCount() > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $uslf->getRecordCount() );
|
||||
|
||||
$this->setPagerObject( $uslf );
|
||||
|
||||
$retarr = [];
|
||||
foreach ( $uslf as $s_obj ) {
|
||||
|
||||
$retarr[] = $s_obj->getObjectAsArray( $data['filter_columns'], $data['filter_data']['permission_children_ids'] );
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $uslf->getCurrentRow() );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->returnHandler( $retarr );
|
||||
}
|
||||
|
||||
return $this->returnHandler( true ); //No records returned.
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $format
|
||||
* @param null $data
|
||||
* @param bool $disable_paging
|
||||
* @return array|bool
|
||||
*/
|
||||
function exportUserSkill( $format = 'csv', $data = null, $disable_paging = true ) {
|
||||
$result = $this->stripReturnHandler( $this->getUserSkill( $data, $disable_paging ) );
|
||||
|
||||
return $this->exportRecords( $format, 'export_skill', $result, ( ( isset( $data['filter_columns'] ) ) ? $data['filter_columns'] : null ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get only the fields that are common across all records in the search criteria. Used for Mass Editing of records.
|
||||
* @param array $data filter data
|
||||
* @return array
|
||||
*/
|
||||
function getCommonUserSkillData( $data ) {
|
||||
return Misc::arrayIntersectByRow( $this->stripReturnHandler( $this->getUserSkill( $data, true ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate skill data for one or more skills.
|
||||
* @param array $data skill data
|
||||
* @return array
|
||||
*/
|
||||
function validateUserSkill( $data ) {
|
||||
return $this->setUserSkill( $data, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set skill data for one or more skills.
|
||||
* @param array $data skill data
|
||||
* @param bool $validate_only
|
||||
* @param bool $ignore_warning
|
||||
* @return array|bool
|
||||
*/
|
||||
function setUserSkill( $data, $validate_only = false, $ignore_warning = true ) {
|
||||
$validate_only = (bool)$validate_only;
|
||||
$ignore_warning = (bool)$ignore_warning;
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_skill', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_skill', 'edit' ) || $this->getPermissionObject()->Check( 'user_skill', 'edit_own' ) || $this->getPermissionObject()->Check( 'user_skill', 'edit_child' ) || $this->getPermissionObject()->Check( 'user_skill', 'add' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
if ( $validate_only == true ) {
|
||||
Debug::Text( 'Validating Only!', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$permission_children_ids = false;
|
||||
} else {
|
||||
//Get Permission Hierarchy Children first, as this can be used for viewing, or editing.
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
}
|
||||
|
||||
[ $data, $total_records ] = $this->convertToMultipleRecords( $data );
|
||||
Debug::Text( 'Received data for: ' . $total_records . ' Skills', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
$validator = $save_result = []; $key = false;
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $row ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserSkillListFactory' ); /** @var UserSkillListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( isset( $row['id'] ) && $row['id'] != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $row['id'], $this->getCurrentCompanyObject()->getId() );
|
||||
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if (
|
||||
$validate_only == true
|
||||
||
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_skill', 'edit' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_skill', 'edit_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_skill', 'edit_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true )
|
||||
) ) {
|
||||
Debug::Text( 'Row Exists, getting current data for ID: ' . $row['id'], __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
$row = array_merge( $lf->getObjectAsArray(), $row );
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Edit permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Edit permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
//Adding new object, check ADD permissions.
|
||||
if ( !( $validate_only == true
|
||||
||
|
||||
( $this->getPermissionObject()->Check( 'user_skill', 'add' )
|
||||
&&
|
||||
(
|
||||
$this->getPermissionObject()->Check( 'user_skill', 'edit' )
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_skill', 'edit_own' ) && $this->getPermissionObject()->isOwner( false, $row['user_id'] ) === true ) //We don't know the created_by of the user at this point, but only check if the user is assigned to the logged in person.
|
||||
|| ( isset( $row['user_id'] ) && $this->getPermissionObject()->Check( 'user_skill', 'edit_child' ) && $this->getPermissionObject()->isChild( $row['user_id'], $permission_children_ids ) === true )
|
||||
)
|
||||
)
|
||||
) ) {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Add permission denied' ) );
|
||||
}
|
||||
}
|
||||
Debug::Arr( $row, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Setting object data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->setObjectFromArray( $row );
|
||||
$lf->Validator->setValidateOnly( $validate_only );
|
||||
|
||||
$is_valid = $lf->isValid( $ignore_warning );
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Saving data...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
if ( $validate_only == true ) {
|
||||
$save_result[$key] = true;
|
||||
} else {
|
||||
$save_result[$key] = $lf->Save();
|
||||
}
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
} else if ( $validate_only == true ) {
|
||||
$lf->FailTransaction();
|
||||
}
|
||||
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete one or more skills.
|
||||
* @param array $data skill data
|
||||
* @return array|bool
|
||||
*/
|
||||
function deleteUserSkill( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
if ( $this->getPermissionObject()->checkAuthenticationType( 700 ) == false ) { //700=HTTP Auth with username/password
|
||||
return $this->getPermissionObject()->AuthenticationTypeDenied();
|
||||
}
|
||||
|
||||
if ( !$this->getPermissionObject()->Check( 'user_skill', 'enabled' )
|
||||
|| !( $this->getPermissionObject()->Check( 'user_skill', 'delete' ) || $this->getPermissionObject()->Check( 'user_skill', 'delete_own' ) || $this->getPermissionObject()->Check( 'user_skill', 'delete_child' ) ) ) {
|
||||
return $this->getPermissionObject()->PermissionDenied();
|
||||
}
|
||||
|
||||
$permission_children_ids = $this->getPermissionChildren();
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Skills', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$total_records = count( $data );
|
||||
$validator = $save_result = []; $key = false;
|
||||
$validator_stats = [ 'total_records' => $total_records, 'valid_records' => 0 ];
|
||||
if ( is_array( $data ) && $total_records > 0 ) {
|
||||
$this->getProgressBarObject()->start( $this->getAPIMessageID(), $total_records );
|
||||
|
||||
foreach ( $data as $key => $id ) {
|
||||
$primary_validator = new Validator();
|
||||
$lf = TTnew( 'UserSkillListFactory' ); /** @var UserSkillListFactory $lf */
|
||||
$lf->StartTransaction();
|
||||
if ( $id != '' ) {
|
||||
//Modifying existing object.
|
||||
//Get qualification object, so we can only modify just changed data for specific records if needed.
|
||||
$lf->getByIdAndCompanyId( $id, $this->getCurrentCompanyObject()->getId() );
|
||||
//$lf->getById($id);
|
||||
if ( $lf->getRecordCount() == 1 ) {
|
||||
//Object exists, check edit permissions
|
||||
if ( $this->getPermissionObject()->Check( 'user_skill', 'delete' )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_skill', 'delete_own' ) && $this->getPermissionObject()->isOwner( $lf->getCurrent()->getCreatedBy(), $lf->getCurrent()->getUser() ) === true )
|
||||
|| ( $this->getPermissionObject()->Check( 'user_skill', 'delete_child' ) && $this->getPermissionObject()->isChild( $lf->getCurrent()->getUser(), $permission_children_ids ) === true ) ) {
|
||||
Debug::Text( 'Record Exists, deleting record ID: ' . $id, __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf = $lf->getCurrent();
|
||||
} else {
|
||||
$primary_validator->isTrue( 'permission', false, TTi18n::gettext( 'Delete permission denied' ) );
|
||||
}
|
||||
} else {
|
||||
//Object doesn't exist.
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
} else {
|
||||
$primary_validator->isTrue( 'id', false, TTi18n::gettext( 'Delete permission denied, record does not exist' ) );
|
||||
}
|
||||
|
||||
//Debug::Arr($lf, 'AData: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
$is_valid = $primary_validator->isValid();
|
||||
if ( $is_valid == true ) { //Check to see if all permission checks passed before trying to save data.
|
||||
Debug::Text( 'Attempting to delete record...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$lf->setDeleted( true );
|
||||
|
||||
$is_valid = $lf->isValid();
|
||||
if ( $is_valid == true ) {
|
||||
Debug::Text( 'Record Deleted...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
$save_result[$key] = $lf->Save();
|
||||
$validator_stats['valid_records']++;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $is_valid == false ) {
|
||||
Debug::Text( 'Data is Invalid...', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$lf->FailTransaction(); //Just rollback this single record, continue on to the rest.
|
||||
|
||||
$validator[$key] = $this->setValidationArray( [ $primary_validator, $lf ] );
|
||||
}
|
||||
|
||||
$lf->CommitTransaction();
|
||||
|
||||
$this->getProgressBarObject()->set( $this->getAPIMessageID(), $key );
|
||||
}
|
||||
|
||||
$this->getProgressBarObject()->stop( $this->getAPIMessageID() );
|
||||
|
||||
return $this->handleRecordValidationResults( $validator, $validator_stats, $key, $save_result );
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy one or more Skills.
|
||||
* @param array $data skill IDs
|
||||
* @return array
|
||||
*/
|
||||
function copyUserSkill( $data ) {
|
||||
if ( !is_array( $data ) ) {
|
||||
$data = [ $data ];
|
||||
}
|
||||
|
||||
if ( !is_array( $data ) ) {
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
Debug::Text( 'Received data for: ' . count( $data ) . ' Skills', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
Debug::Arr( $data, 'Data: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
|
||||
$src_rows = $this->stripReturnHandler( $this->getUserSkill( [ 'filter_data' => [ 'id' => $data ] ], true ) );
|
||||
if ( is_array( $src_rows ) && count( $src_rows ) > 0 ) {
|
||||
Debug::Arr( $src_rows, 'SRC Rows: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||||
foreach ( $src_rows as $key => $row ) {
|
||||
unset( $src_rows[$key]['id'] ); //Clear fields that can't be copied
|
||||
}
|
||||
unset( $row ); //code standards
|
||||
//Debug::Arr($src_rows, 'bSRC Rows: ', __FILE__, __LINE__, __METHOD__, 10);
|
||||
|
||||
return $this->setUserSkill( $src_rows ); //Save copied rows
|
||||
}
|
||||
|
||||
return $this->returnHandler( false );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $first_used_date EPOCH
|
||||
* @param int $last_used_date EPOCH
|
||||
* @return array|bool
|
||||
*/
|
||||
function calcExperience( $first_used_date, $last_used_date = null ) {
|
||||
if ( $first_used_date == '' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$last_used_date = ( isset( $last_used_date ) && $last_used_date != '' ) ? TTDate::parseDateTime( $last_used_date ) : TTDate::getTime();
|
||||
|
||||
$usf = TTnew( 'UserSkillFactory' ); /** @var UserSkillFactory $usf */
|
||||
|
||||
$usf->setFirstUsedDate( TTDate::parseDateTime( $first_used_date ) );
|
||||
$usf->setLastUsedDate( $last_used_date );
|
||||
|
||||
$usf->preSave();
|
||||
|
||||
return $this->returnHandler( $usf->calcExperience() );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Reference in New Issue
Block a user