TimeTrex/interface/html5/views/payroll/pay_periods/PayPeriodsViewController.js

620 lines
17 KiB
JavaScript

export class PayPeriodsViewController extends BaseViewController {
constructor( options = {} ) {
_.defaults( options, {
el: '#pay_periods_view_container',
status_array: null,
type_array: null,
pay_period_schedule_api: null
} );
super( options );
}
init( options ) {
//this._super('initialize', options );
this.edit_view_tpl = 'PayPeriodsEditView.html';
this.permission_id = 'pay_period_schedule';
this.script_name = 'PayPeriodsView';
this.viewId = 'PayPeriods';
this.table_name_key = 'pay_period';
this.context_menu_name = $.i18n._( 'Pay Period' );
this.navigation_label = $.i18n._( 'Pay Period' );
this.api = TTAPI.APIPayPeriod;
this.pay_period_schedule_api = TTAPI.APIPayPeriodSchedule;
this.render();
if ( this.sub_view_mode ) {
this.buildContextMenu( true );
} else {
this.buildContextMenu();
}
//call init data in parent view
if ( !this.sub_view_mode ) {
this.initData();
}
}
removeEditView( is_cancel ) {
super.removeEditView();
if ( this.parent_view_controller &&
( this.parent_view_controller.viewId === 'TimeSheet' || this.parent_view_controller.viewId === 'PayStub' ) ) {
this.parent_view_controller.onSubViewRemoved( is_cancel );
}
}
initOptions( callBack ) {
var $this = this;
var options = [
{ option_name: 'status', field_name: null, api: null },
{ option_name: 'type', field_name: 'type_id', api: this.pay_period_schedule_api }
];
this.initDropDownOptions( options, function( result ) {
if ( callBack ) {
callBack( result ); // First to initialize drop down options, and then to initialize edit view UI.
}
} );
}
getCustomContextMenuModel() {
var context_menu_model = {
exclude: ['copy'],
include: [
{
label: '', //Empty label. vue_icon is displayed instead of text.
id: 'other_header',
menu_align: 'right',
action_group: 'other',
action_group_header: true,
vue_icon: 'tticon tticon-more_vert_black_24dp',
},
{
label: $.i18n._( 'Delete Data' ),
id: 'delete_data',
menu_align: 'right',
action_group: 'other'
},
{
label: $.i18n._( 'Import Data' ),
id: 'import_icon',
menu_align: 'right',
action_group: 'other'
},
]
};
if ( this.edit_only_mode ) {
context_menu_model.exclude.push( 'import_icon', 'delete_data' );
}
return context_menu_model;
}
onEditClick( record_id, noRefreshUI ) {
//If a dynamic future pay period is selected (zero id) do not allow it to be interacted with.
if ( this.getGridSelectIdArray().includes( TTUUID.zero_id ) ) {
ProgressBar.closeOverlay();
return;
}
super.onEditClick( record_id, noRefreshUI );
}
openEditView( id ) {
var $this = this;
if ( $this.edit_only_mode ) {
$this.initOptions( function( result ) {
if ( !$this.edit_view ) {
$this.initEditViewUI( $this.viewId, $this.edit_view_tpl );
}
$this.getPayPeriodData( id, function( result ) {
// Waiting for the TTAPI.API returns data to set the current edit record.
$this.current_edit_record = result;
$this.initEditView();
} );
} );
} else {
if ( !this.edit_view ) {
this.initEditViewUI( $this.viewId, $this.edit_view_tpl );
}
}
}
setCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {
switch ( id ) {
case 'login':
this.setDefaultMenuLoginIcon( context_btn, grid_selected_length );
break;
case 'cancel':
this.setDefaultMenuCancelIcon( context_btn, grid_selected_length );
break;
case 'import_icon':
this.setDefaultMenuImportIcon( context_btn, grid_selected_length );
break;
case 'delete_data':
this.setDefaultMenuDeleteDataIcon( context_btn, grid_selected_length );
break;
}
}
setDefaultMenu( doNotSetFocus ) {
//Overloads setDefaultMenu due to custom logic where if a dynamic future pay period is selected do not allow it to be interacted with.
//Still calls super below if did not click a dynamic future pay period.
var context_menu_array = ContextMenuManager.getMenuModelByMenuId( this.determineContextMenuMountAttributes().id );
if ( this.getSelectedItems().some( select_item => select_item && select_item.status_id == 50 ) ) {
for ( var i = 0; i < context_menu_array.length; i++ ) {
let context_btn = context_menu_array[i];
let id = context_menu_array[i].id;
if ( id === 'add' ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
} else {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
return;
}
super.setDefaultMenu( doNotSetFocus );
}
/* jshint ignore:end */
setDefaultMenuImportIcon( context_btn, grid_selected_length ) {
if ( !this.importValidate() ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
if ( grid_selected_length >= 1 ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
} else {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
importValidate( selected_item ) {
var p_id = this.permission_id;
if ( !Global.isSet( selected_item ) ) {
selected_item = this.getSelectedItem();
}
if ( p_id === 'report' ) {
return true;
}
if ( this.editPermissionValidate( p_id, selected_item ) || this.addPermissionValidate( p_id, selected_item ) ) {
return true;
}
return false;
}
setDefaultMenuDeleteDataIcon( context_btn, grid_selected_length ) {
if ( !this.importValidate() ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
if ( grid_selected_length >= 1 ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
} else {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setCustomEditMenuIcon( id, context_btn ) {
switch ( id ) {
case 'delete_data':
this.setEditMenuImportIcon( context_btn );
break;
}
}
setEditMenuImportIcon( context_btn, pId ) {
if ( !this.importValidate() || this.is_viewing || this.is_edit || this.is_add ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
onCustomContextClick( context_btn ) {
var $this = this;
var grid_selected_id_array;
var ids = [];
if ( $this.edit_view && $this.current_edit_record.id ) {
ids.push( $this.current_edit_record.id );
} else {
grid_selected_id_array = this.getGridSelectIdArray();
$.each( grid_selected_id_array, function( index, value ) {
var grid_selected_row = $this.getRecordFromGridById( value );
ids.push( grid_selected_row.id );
} );
}
if ( ids.length > 0 ) {
switch ( context_btn ) {
case 'import_icon':
TAlertManager.showConfirmAlert( $.i18n._( 'This will import employee attendance data from other pay periods into this pay period.Are you sure you wish to continue?' ), null, function( result ) {
if ( result ) {
ProgressBar.showOverlay();
$this.api.importData( ids, {
onResult: function( res ) {
ProgressBar.closeOverlay();
if ( res.isValid() ) {
$this.search( false );
} else {
TAlertManager.showErrorAlert( res );
}
}
} );
} else {
ProgressBar.closeOverlay();
}
} );
break;
case 'delete_data':
TAlertManager.showConfirmAlert( $.i18n._( 'This will delete all attendance data assigned to this pay period. Are you sure you wish to continue?' ), null, function( result ) {
if ( result ) {
ProgressBar.showOverlay();
$this.api.deleteData( ids, {
onResult: function( res ) {
ProgressBar.closeOverlay();
if ( res.isValid() ) {
$this.search( false );
} else {
TAlertManager.showErrorAlert( res );
}
}
} );
} else {
ProgressBar.closeOverlay();
}
} );
break;
case 'export_excel':
this.onExportClick( 'export' + this.api.key_name );
break;
}
}
}
getPayPeriodData( id, callBack ) {
var filter = {};
filter.filter_data = {};
filter.filter_data.id = [id];
this.api['get' + this.api.key_name]( filter, {
onResult: function( result ) {
var result_data = result.getResult();
if ( !result_data ) {
result_data = [];
}
result_data = result_data[0];
callBack( result_data );
}
} );
}
buildSearchFields() {
super.buildSearchFields();
this.search_fields = [
new SearchField( {
label: $.i18n._( 'Pay Period Schedule' ),
in_column: 1,
field: 'pay_period_schedule_id',
layout_name: 'global_pay_period_schedule',
api_class: TTAPI.APIPayPeriodSchedule,
multiple: true,
basic_search: true,
adv_search: true,
script_name: 'PayPeriodScheduleView',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Status' ),
in_column: 1,
field: 'status_id',
multiple: true,
basic_search: true,
adv_search: true,
layout_name: 'global_option_column',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Type' ),
in_column: 1,
field: 'type_id',
multiple: true,
basic_search: true,
adv_search: true,
layout_name: 'global_option_column',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Start Date' ),
in_column: 1,
field: 'start_date',
basic_search: true,
adv_search: true,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'End Date' ),
in_column: 1,
field: 'end_date',
basic_search: true,
adv_search: true,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'Transaction Start Date' ),
in_column: 2,
field: 'transaction_start_date',
basic_search: true,
adv_search: true,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'Transaction End Date' ),
in_column: 2,
field: 'transaction_end_date',
basic_search: true,
adv_search: true,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'Show Future Pay Periods' ),
in_column: 2,
field: 'show_future_pay_periods',
basic_search: false,
adv_search: true,
form_item_type: FormItemType.CHECKBOX
} ),
new SearchField( {
label: $.i18n._( 'Created By' ),
in_column: 2,
field: 'created_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: true,
script_name: 'EmployeeView',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Updated By' ),
in_column: 2,
field: 'updated_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: true,
script_name: 'EmployeeView',
form_item_type: FormItemType.AWESOME_BOX
} )
];
}
buildEditViewUI() {
super.buildEditViewUI();
var $this = this;
var tab_model = {
'tab_pay_period': { 'label': $.i18n._( 'Pay Period' ) },
'tab_audit': true,
};
this.setTabModel( tab_model );
if ( !this.edit_only_mode ) {
this.navigation.AComboBox( {
id: this.script_name + '_navigation',
api_class: TTAPI.APIPayPeriod,
allow_multiple_selection: false,
layout_name: 'global_Pay_period',
navigation_mode: true,
show_search_inputs: true
} );
this.setNavigation();
}
//Tab 0 start
var tab_pay_period = this.edit_view_tab.find( '#tab_pay_period' );
var tab_pay_period_column1 = tab_pay_period.find( '.first-column' );
this.edit_view_tabs[0] = [];
this.edit_view_tabs[0].push( tab_pay_period_column1 );
// Status
var form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
form_item_input.TComboBox( { field: 'status_id', set_empty: false } );
form_item_input.setSourceData( $this.status_array );
this.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_pay_period_column1, '' );
// Pay Period Schedule
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
form_item_input.TText( { field: 'pay_period_schedule' } );
this.addEditFieldToColumn( $.i18n._( 'Pay Period Schedule' ), form_item_input, tab_pay_period_column1, '', null, true );
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIPayPeriodSchedule,
allow_multiple_selection: false,
layout_name: 'global_pay_period_schedule',
show_search_inputs: true,
set_empty: true,
field: 'pay_period_schedule_id'
} );
this.addEditFieldToColumn( $.i18n._( 'Pay Period Schedule' ), form_item_input, tab_pay_period_column1, '', null, true );
// Start date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'start_date', mode: 'date_time' } );
this.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_pay_period_column1, '', null, true );
// End date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'end_date', mode: 'date_time' } );
this.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_pay_period_column1, '', null, true );
// Transaction date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'transaction_date', mode: 'date_time' } );
this.addEditFieldToColumn( $.i18n._( 'Transaction Date' ), form_item_input, tab_pay_period_column1, '', null, true );
}
onFormItemChange( target, doNotValidate ) {
this.setIsChanged( target );
this.setMassEditingFieldsWhenFormChange( target );
var key = target.getField();
var c_value = target.getValue();
if ( !this.current_edit_record ) {
this.current_edit_record = {};
}
this.current_edit_record[key] = c_value;
if ( key === 'status_id' ) {
this.onStatusChange();
}
if ( !doNotValidate ) {
this.validate();
}
}
setDateColumnStatus( value, disabled ) {
if ( this.edit_view_ui_dic[value] ) {
if ( disabled ) {
this.edit_view_ui_dic[value].find( 'input' ).attr( 'disabled', 'disabled' );
this.edit_view_ui_dic[value].find( 'img' ).unbind( 'click' );
} else {
this.edit_view_ui_dic[value].find( 'input' ).removeAttr( 'disabled' );
this.edit_view_ui_dic[value].find( 'img' ).bind( 'click' );
}
}
}
onStatusChange() {
//TypeError: Cannot read property 'status_id' of undefined
if ( this.current_edit_record && this.current_edit_record['status_id'] == 20 ) {
this.setDateColumnStatus( 'start_date', true );
this.setDateColumnStatus( 'end_date', true );
this.setDateColumnStatus( 'transaction_date', true );
} else {
this.setDateColumnStatus( 'start_date', false );
this.setDateColumnStatus( 'end_date', false );
this.setDateColumnStatus( 'transaction_date', false );
}
}
isEditChange() {
if ( this.current_edit_record && this.current_edit_record.id ) {
this.attachElement( 'pay_period_schedule' );
this.detachElement( 'pay_period_schedule_id' );
} else if ( this.is_mass_editing ) {
this.detachElement( 'pay_period_schedule' );
this.detachElement( 'pay_period_schedule_id' );
} else {
this.detachElement( 'pay_period_schedule' );
this.attachElement( 'pay_period_schedule_id' );
}
this.editFieldResize();
}
setEditViewDataDone() {
super.setEditViewDataDone();
this.onStatusChange();
this.isEditChange();
}
getValidSearchFilter() {
var validFilterData = super.getValidSearchFilter();
if ( Global.isSet( validFilterData.show_future_pay_periods ) && validFilterData.show_future_pay_periods.value === false ) {
delete validFilterData.show_future_pay_periods;
}
return validFilterData;
}
}
PayPeriodsViewController.loadSubView = function( container, beforeViewLoadedFun, afterViewLoadedFun ) {
Global.loadViewSource( 'PayPeriods', 'SubPayPeriodsView.html', function( result ) {
var args = {};
var template = _.template( result );
if ( Global.isSet( beforeViewLoadedFun ) ) {
beforeViewLoadedFun();
}
if ( Global.isSet( container ) ) {
container.html( template( args ) );
if ( Global.isSet( afterViewLoadedFun ) ) {
TTPromise.wait( 'BaseViewController', 'initialize', function() {
afterViewLoadedFun( sub_pay_periods_view_controller );
} );
}
}
} );
};