import { Decimal } from 'decimal.js'; export class PayStubViewController extends BaseViewController { constructor( options = {} ) { _.defaults( options, { el: '#pay_stub_view_container', filtered_status_array: null, user_status_array: null, user_group_array: null, user_destination_account_array: null, currency_array: null, type_array: null, country_array: null, province_array: null, e_province_array: null, user_api: null, user_group_api: null, company_api: null, pay_stub_entry_api: null, include_pay_stub_accounts: true, transaction_status_array: false, net_pay_amount: false, pseal_link: false, original_status_id: 10 } ); super( options ); } init( options ) { //this._super('initialize', options ); this.edit_view_tpl = 'PayStubEditView.html'; this.permission_id = 'pay_stub'; this.viewId = 'PayStub'; this.script_name = 'PayStubView'; this.table_name_key = 'pay_stub'; this.context_menu_name = $.i18n._( 'Pay Stub' ); this.navigation_label = $.i18n._( 'Pay Stubs' ); this.api = TTAPI.APIPayStub; this.user_api = TTAPI.APIUser; this.pay_stub_entry_api = TTAPI.APIPayStubEntry; this.pay_stub_entry_account_link_api = TTAPI.APIPayStubEntryAccountLink; this.user_group_api = TTAPI.APIUserGroup; this.company_api = TTAPI.APICompany; this.pay_period_api = TTAPI.APIPayPeriod; this.pay_stub_transaction_api = TTAPI.APIPayStubTransaction; this.remittance_destination_account_api = TTAPI.APIRemittanceDestinationAccount; var $this = this; $.when( this.preloadTransactionOptions( new $.Deferred() ), this.preloadPayStubAccountLinks( new $.Deferred() ) ).done( function() { $this.completeInit(); } ); } isEditMode() { if ( this.is_add || ( this.is_edit && this.original_status_id == 25 ) ) { return true; } return false; } preloadTransactionOptions( dfd ) { var $this = this; this.pay_stub_transaction_api.getOptions( 'status', false, false, { onResult: function( result ) { $this.transaction_status_array = result.getResult(); dfd.resolve( true ); } } ); return dfd.promise(); } preloadPayStubAccountLinks( dfd ) { var $this = this; this.pay_stub_entry_account_link_api.getPayStubEntryAccountLink( '', false, false, { onResult: function( result ) { var data = result.getResult()[0]; if ( data ) { $this.pseal_link = { total_gross_entry_account_id: false, total_deductions_entry_account_id: false, net_pay_entry_account_id: false, contributions_entry_account_id: false }; $this.pseal_link.total_gross_entry_account_id = data.total_gross; $this.pseal_link.total_deductions_entry_account_id = data.total_employee_deduction; $this.pseal_link.net_pay_entry_account_id = data.total_net_pay; $this.pseal_link.contributions_entry_account_id = data.total_employer_deduction; } dfd.resolve( true ); } } ); return dfd.promise(); } completeInit() { this.initPermission(); this.render(); this.buildContextMenu(); this.initData(); } initPermission() { super.initPermission(); if ( PermissionManager.validate( this.permission_id, 'view' ) || PermissionManager.validate( this.permission_id, 'view_child' ) ) { this.show_search_tab = true; } else { this.show_search_tab = false; } return {}; } initOptions() { var $this = this; var options = [ { option_name: 'filtered_status', field_name: 'status_id', api: this.api }, { option_name: 'type', field_name: 'type_id', api: this.api }, { option_name: 'status', field_name: 'user_status_id', api: this.user_api }, { option_name: 'country', field_name: 'country', api: this.company_api }, ]; this.initDropDownOptions( options ); var result = {}; for ( var i = 1; i <= 128; i++ ) { result[i] = i; } $this.basic_search_field_ui_dic['run_id'].setSourceData( Global.buildRecordArray( result ) ); $this.adv_search_field_ui_dic['run_id'].setSourceData( Global.buildRecordArray( result ) ); this.user_group_api.getUserGroup( '', false, false, { onResult: function( res ) { res = res.getResult(); res = Global.buildTreeRecord( res ); $this.user_group_array = res; if ( !$this.sub_view_mode && $this.basic_search_field_ui_dic['group_id'] ) { $this.basic_search_field_ui_dic['group_id'].setSourceData( res ); $this.adv_search_field_ui_dic['group_id'].setSourceData( res ); } } } ); } getCustomContextMenuModel() { var context_menu_model = { groups: { pay_stubs: { label: $.i18n._( 'Pay Stubs' ), id: this.script_name + 'Pay Stubs' } }, exclude: [ 'copy', 'save_and_new', 'save_and_copy', ], include: [ { label: $.i18n._( 'Jump To' ), id: 'jump_to_header', menu_align: 'right', action_group: 'jump_to', action_group_header: true, permission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers. }, { label: $.i18n._( 'TimeSheet' ), id: 'timesheet', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { label: $.i18n._( 'Schedule' ), id: 'schedule', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { label: $.i18n._( 'Pay Stub Amendments' ), id: 'pay_stub_amendment', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { label: $.i18n._( 'Pay Stub Transactions' ), id: 'pay_stub_transaction', menu_align: 'right', action_group: 'jump_to', group: 'navigation', items: [], // TODO: Is this still needed? It interferes with PrimeVue as it thinks its a submenu but wrong format, but I cant see anywhere this code is used, other than for Print menu. permission_result: true, permission: true, sort_order: null }, { label: $.i18n._( 'Edit Employee' ), id: 'edit_employee', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { label: $.i18n._( 'Edit Pay Period' ), id: 'edit_pay_period', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { 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._( 'View: Employee Pay Stubs' ), id: 'employee_pay_stubs', menu_align: 'right', action_group: 'other', }, { label: $.i18n._( 'View: Employer Pay Stubs' ), id: 'employer_pay_stubs', menu_align: 'right', action_group: 'other', }, { label: $.i18n._( 'Generate Pay Stub' ), id: 'generate_pay_stub', menu_align: 'right', action_group: 'other', }, { label: $.i18n._( 'Process Transactions' ), id: 'direct_deposit', menu_align: 'right', action_group: 'other', icon: 'direct_deposit-35x35.png', items: [], permission_result: true, permission: true }, ] }; return context_menu_model; } setCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) { switch ( id ) { case 'timesheet': this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'punch' ); break; case 'schedule': this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'schedule' ); break; case 'pay_stub_amendment': this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'pay_stub_amendment' ); break; case 'pay_stub_transaction': this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'pay_stub_transaction' ); break; case 'edit_employee': this.setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length, 'user' ); break; case 'edit_pay_period': this.setDefaultMenuEditPayPeriodIcon( context_btn, grid_selected_length ); break; case 'employee_pay_stubs': case 'employer_pay_stubs': case 'print_checks': case 'direct_deposit': this.setDefaultMenuReportRelatedIcons( context_btn, grid_selected_length ); break; case 'generate_pay_stub': this.setDefaultMenuGeneratePayStubIcon( context_btn, grid_selected_length ); break; } } setDefaultMenuEditPayPeriodIcon( context_btn, grid_selected_length, pId ) { if ( !this.editPermissionValidate( 'pay_period_schedule' ) ) { 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 ); } } setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length ) { if ( !this.editChildPermissionValidate( 'user' ) ) { 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 ); } } setDefaultMenuViewIcon( context_btn, grid_selected_length, pId ) { if ( pId === 'punch' || pId === 'schedule' || pId === 'pay_stub_amendment' ) { super.setDefaultMenuViewIcon( context_btn, grid_selected_length, pId ); } else if ( pId === 'pay_stub_transaction' ) { if ( PermissionManager.validate( 'pay_stub', 'enabled' ) && ( PermissionManager.validate( 'pay_stub', 'view' ) || PermissionManager.validate( 'pay_stub', 'view_child' ) ) ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true ); } else { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } } else { if ( !this.viewPermissionValidate( pId ) || this.edit_only_mode ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } if ( grid_selected_length > 0 && this.viewOwnerOrChildPermissionValidate() ) { 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 'timesheet': this.setEditMenuViewIcon( context_btn, 'punch' ); break; case 'schedule': this.setEditMenuViewIcon( context_btn, 'schedule' ); break; case 'pay_stub_amendment': this.setEditMenuViewIcon( context_btn, 'pay_stub_amendment' ); break; case 'pay_stub_transaction': this.setEditMenuViewIcon( context_btn, 'pay_stub_transaction' ); break; case 'edit_employee': this.setEditMenuViewIcon( context_btn, 'user' ); break; case 'edit_pay_period': this.setEditMenuViewIcon( context_btn, 'pay_period_schedule' ); break; case 'view': case 'employer_pay_stubs': case 'employee_pay_stubs': case 'print_checks': case 'direct_deposit': //this.setEditMenuReportRelatedIcons( context_btn ); this.setEditMenuEditIcon( context_btn ); break; case 'generate_pay_stub': this.setEditMenuGeneratePayStubIcon( context_btn ); break; } } payStubReportIconsValidate() { if ( !PermissionManager.validate( 'pay_stub', 'enabled' ) ) { return false; } var selected_item = this.getSelectedItem(); if ( PermissionManager.validate( 'pay_stub', 'view' ) || this.ownerOrChildPermissionValidate( 'pay_stub', 'view_child', selected_item ) ) { return true; } return false; } setDefaultMenuReportRelatedIcons( context_btn, grid_selected_length, pId ) { if ( !this.payStubReportIconsValidate() ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } if ( grid_selected_length > 0 && this.viewOwnerOrChildPermissionValidate() ) { ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true ); } else { ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ); } } setEditMenuReportRelatedIcons( context_btn, grid_selected_length, pId ) { if ( !this.payStubReportIconsValidate() ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } if ( this.current_edit_record.id && this.viewOwnerOrChildPermissionValidate() ) { ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true ); } else { ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ); } } setEditMenuGeneratePayStubIcon( context_btn, grid_selected_length, pId ) { if ( !PermissionManager.checkTopLevelPermission( 'GeneratePayStubs' ) ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } } setDefaultMenuGeneratePayStubIcon( context_btn, grid_selected_length, pId ) { if ( !PermissionManager.checkTopLevelPermission( 'GeneratePayStubs' ) ) { ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false ) } } removeEntryInsideEditorCover() { if ( this.cover && this.cover.length > 0 ) { this.cover.remove(); } this.cover = null; } setCurrentEditRecordData() { this.include_pay_stub_accounts = true; //Set current edit record data to all widgets for ( var key in this.current_edit_record ) { var widget = this.edit_view_ui_dic[key]; if ( Global.isSet( widget ) ) { switch ( key ) { case 'country': this.setCountryValue( widget, key ); break; case 'status_id': if ( this.current_edit_record[key] == 40 || this.current_edit_record[key] == 100 ) { this.include_pay_stub_accounts = false; } widget.setValue( this.current_edit_record[key] ); break; default: widget.setValue( this.current_edit_record[key] ); break; } } } this.collectUIDataToCurrentEditRecord(); this.setEditViewDataDone(); } setEditViewDataDone() { super.setEditViewDataDone(); if ( this.is_add ) { this.edit_view_ui_dic.user_id.setEnabled( true ); } else { this.edit_view_ui_dic.user_id.setEnabled( false ); } if ( !this.is_mass_editing ) { this.initInsideEntryEditorData(); } } getPayStubTransactionDefaultData( callback, index ) { this.pay_stub_transaction_api['get' + this.pay_stub_transaction_api.key_name + 'DefaultData']( { onResult: function( result ) { var data = []; var result_data = result.getResult(); result_data.id = false; data.push( result_data ); callback( data, index ); } } ); } getPayStubTransaction( callback ) { var $this = this; var args = {}; args.filter_data = {}; args.filter_data.pay_stub_id = TTUUID.isUUID( this.current_edit_record.id ) ? this.current_edit_record.id : ( TTUUID.isUUID( this.copied_record_id ) ? this.copied_record_id : '' ); this.pay_stub_transaction_api['getPayStubTransaction']( args, true, { onResult: function( res ) { if ( !$this.edit_view ) { return; } var result_data = res.getResult(); if ( _.size( result_data ) == 0 ) { result_data = []; } callback( result_data ); } } ); } initInsideTransactionEditorData() { var $this = this; if ( ( !this.current_edit_record || TTUUID.isUUID( this.current_edit_record.id ) == false ) && !this.copied_record_id ) { this.getPayStubTransactionDefaultData( function( data ) { if ( $this.isEditMode() == true || data.length > 0 ) { $this.editor.transaction_data = data; } else { $this.editor.transaction_data = false; } //Issue #2890 - Having a promise resolve after the API call for getting transaction data and storing that data //to be used later while building the HTML. This stops this API call from being delayed and causing unintended issues //with duplicating transactions, overlays and data sync issues. TTPromise.resolve( 'PayStubViewController', 'insideEditorDataLoaded' ); } ); } else { this.getPayStubTransaction( function( data ) { if ( $this.isEditMode() == true || data.length > 0 ) { $this.editor.transaction_data = data; } else { $this.editor.transaction_data = false; } //Issue #2890 - Having a promise resolve after the API call for getting transaction data and storing that data //to be used later while building the HTML. This stops this API call from being delayed and causing unintended issues //with duplicating transactions, overlays and data sync issues. TTPromise.resolve( 'PayStubViewController', 'insideEditorDataLoaded' ); } ); } } initInsideEntryEditorData() { TTPromise.add( 'PayStubViewController', 'insideEditorDataLoaded' ); var $this = this; var args = {}; args.filter_data = {}; if ( this.copied_record_id || ( this.current_edit_record && this.current_edit_record.id ) ) { args.filter_data.pay_stub_id = TTUUID.isUUID( this.current_edit_record.id ) ? this.current_edit_record.id : this.copied_record_id; this.pay_stub_entry_api['get' + this.pay_stub_entry_api.key_name]( args, { onResult: function( res ) { if ( !$this.edit_view ) { return; } var data = $this.handlePayStubEntryData( res.getResult() ); TTPromise.wait( 'PayStubViewController', 'insideEditorDataLoaded', function() { $this.editor.setValue( data ); } ); } } ); } else { var data = $this.handlePayStubEntryData(); TTPromise.wait( 'PayStubViewController', 'insideEditorDataLoaded', function() { $this.editor.setValue( data ); } ); } this.initInsideTransactionEditorData(); } handlePayStubEntryData( data ) { var total_rows = {}; var retval = {}; if ( data ) { for ( var n in data ) { var type_id = data[n].type_id; if ( type_id == 40 ) { if ( data[n].pay_stub_entry_account_id ) { var newrow = data[n]; newrow.total_row = true; total_rows[data[n].pay_stub_entry_account_id] = newrow[n]; } } else { if ( typeof retval[type_id] == 'undefined' ) { retval[type_id] = []; } retval[type_id].push( data[n] ); } } } //set blanks where there are no records in any given sections var type_ids = [10, 20, 30, 50, 80]; //no net pay default row for ( var t = 0; t < type_ids.length; t++ ) { if ( typeof retval[type_ids[t]] == 'undefined' || retval[type_ids[t]].length == 0 ) { retval[type_ids[t]] = []; retval[type_ids[t]].push( { type_id: type_ids[t] } ); } } //Fill up the missing total rows. var gross_total = {}; if ( total_rows[this.pseal_link.total_gross_entry_account_id] ) { gross_total = total_rows[this.pseal_link.total_gross_entry_account_id]; } else { gross_total = { total_row: true, type_id: 40, name: $.i18n._( 'Total Gross' ), pay_stub_entry_account_id: this.pseal_link.total_gross_entry_account_id }; } retval[10].push( gross_total ); var employee_deduction_total = {}; if ( total_rows[this.pseal_link.total_deductions_entry_account_id] ) { employee_deduction_total = total_rows[this.pseal_link.total_deductions_entry_account_id]; } else { employee_deduction_total = { total_row: true, type_id: 40, name: $.i18n._( 'Total Deductions' ), pay_stub_entry_account_id: this.pseal_link.total_deductions_entry_account_id }; } retval[20].push( employee_deduction_total ); var net_pay_total = {}; if ( total_rows[this.pseal_link.net_pay_entry_account_id] ) { net_pay_total = total_rows[this.pseal_link.net_pay_entry_account_id]; } else { net_pay_total = { //total_row: true, type_id: 40, name: $.i18n._( 'Net Pay' ), pay_stub_entry_account_id: this.pseal_link.net_pay_entry_account_id }; } //Because we don't add empty rows to retval[40], and there should only ever be one row in net pay, we will need to initialize retval[40] here. retval[40] = net_pay_total; var employer_deduction_total = {}; if ( total_rows[this.pseal_link.contributions_entry_account_id] ) { employer_deduction_total = total_rows[this.pseal_link.contributions_entry_account_id]; } else { employer_deduction_total = { total_row: true, type_id: 40, name: $.i18n._( 'Employer Total Contributions' ), pay_stub_entry_account_id: this.pseal_link.contributions_entry_account_id }; } retval[30].push( employer_deduction_total ); return retval; } insideEntryEditorSetValue( val ) { var $this = this; this.removeAllRows( true ); this.removeCover(); function setEarnings( data ) { var render = $this.getRender(); //get render, should be a table var headerRow = ` <%= col1 %> <%= col2 %> <%= col3 %> <%= col4 %> <%= col5 %> <%= col6 %> `; var args = { col1: $.i18n._( 'Earnings' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Rate' ), col4: $.i18n._( 'Hrs/Units' ), col5: $.i18n._( 'Amount' ), col6: $.i18n._( 'YTD Amount' ) }; var template = _.template( headerRow ); $( render ).append( template( args ) ); $this.rows_widgets_array.push( true ); for ( var i = 0; i < _.size( data ); i++ ) { if ( Global.isSet( data[i] ) ) { var row = data[i]; row.type_id = 10; $this.addRow( row ); } } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } function getHeaderThreeColumn() { return ` <%= col1 %> <%= col2 %> <%= col3 %> <%= col4 %> `; } function setDeductions( data ) { var render = $this.getRender(); //get render, should be a table var headerRow = getHeaderThreeColumn(); var args = { col1: $.i18n._( 'Deductions' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Amount' ), col4: $.i18n._( 'YTD Amount' ) }; var template = _.template( headerRow ); $( render ).append( template( args ) ); $this.rows_widgets_array.push( true ); for ( var i = 0; i < _.size( data ); i++ ) { if ( Global.isSet( data[i] ) ) { var row = data[i]; row.type_id = 20; $this.addRow( row ); } } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } function setNetPay( data ) { var render = $this.getRender(); //get render, should be a table if ( data ) { // data.type_id = 40; $this.addRow( data ); } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } function setMiscellaneous( data ) { var render = $this.getRender(); //get render, should be a table var headerRow = getHeaderThreeColumn(); var args = { col1: $.i18n._( 'Miscellaneous' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Amount' ), col4: $.i18n._( 'YTD Amount' ) }; var template = _.template( headerRow ); $( render ).append( template( args ) ); $this.rows_widgets_array.push( true ); for ( var i in data ) { $this.addRow( data[i] ); } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } function setEmployerContributions( data ) { var render = $this.getRender(); //get render, should be a table var headerRow = getHeaderThreeColumn(); var args = { col1: $.i18n._( 'Employer Contributions' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Amount' ), col4: $.i18n._( 'YTD Amount' ) }; var template = _.template( headerRow ); $( render ).append( template( args ) ); $this.rows_widgets_array.push( true ); for ( var i = 0; i < _.size( data ); i++ ) { if ( Global.isSet( data[i] ) ) { var row = data[i]; row.type_id = 30; $this.addRow( row ); } } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } function setAccrual( data ) { var render = $this.getRender(); //get render, should be a table var headerRow = getHeaderThreeColumn(); var args = { col1: $.i18n._( 'Accrual' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Amount' ), col4: $.i18n._( 'Balance' ) }; var template = _.template( headerRow ); $( render ).append( template( args ) ); $this.rows_widgets_array.push( true ); for ( var i = 0; i < _.size( data ); i++ ) { if ( Global.isSet( data[i] ) ) { var row = data[i]; row.type_id = 50; $this.addRow( row ); } } $( render ).append( '
' ); $this.rows_widgets_array.push( true ); } if ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[10] ) ) { setEarnings( val[10] ); } if ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[20] ) ) { setDeductions( val[20] ); } setNetPay( val[40] ); if ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[80] ) ) { setMiscellaneous( val[80] ); } if ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[30] ) ) { setEmployerContributions( val[30] ); } if ( this.parent_controller.isEditMode() == true || this.parent_controller.checkForNonHeaderData( val[50] ) ) { setAccrual( val[50] ); } if ( this.parent_controller.editor.transaction_data ) { this.parent_controller.editor.insideTransactionEditorSetValue( this.parent_controller.editor.transaction_data ); } if ( this.parent_controller.copied_record_id && TTUUID.isUUID( this.parent_controller.copied_record_id ) ) { this.parent_controller.copied_record_id = ''; } this.calcTotal(); } checkForNonHeaderData( data ) { for ( var n in data ) { if ( TTUUID.isUUID( data[n].id ) == true ) { return true; } } return false; } insideEntryEditorAddRow( data, index ) { var $this = this; if ( !data ) { $this.addRow( {}, index ); } else { if ( typeof index != 'undefined' && typeof this.rows_widgets_array[index].ytd_amount != 'undefined' && !data['type_id'] ) { data['type_id'] = this.rows_widgets_array[index].ytd_amount.attr( 'type_id' ); } function renderColumns( data, type, index ) { var render = $this.getRender(); //get render, should be a table var widgets = {}; //Save each row's widgets var row; //Get Row render var widgetContainer = $( '
' ); var right_label; var args = { filter_data: {} }; var pay_stub_amendment_id = '', user_expense_id = ''; var pay_stub_status_id = $this.parent_controller['current_edit_record']['status_id']; var is_add = false; if ( ( !$this.parent_controller['current_edit_record']['id'] && !$this.parent_controller.copied_record_id ) || ( !data.id ) ) { is_add = true; } if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 ) { is_add = false; } if ( TTUUID.isUUID( data['pay_stub_amendment_id'] ) && data['pay_stub_amendment_id'] != TTUUID.zero_id ) { pay_stub_amendment_id = data['pay_stub_amendment_id']; } if ( TTUUID.isUUID( data['user_expense_id'] ) && data['user_expense_id'] != TTUUID.zero_id ) { user_expense_id = data['user_expense_id']; } if ( $this.parent_controller.copied_record_id ) { pay_stub_amendment_id = ''; user_expense_id = ''; } var row_enabled = true; // if the pay_stub_amendment_id and user_expense_id all >0 how to display the right label? if ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) { right_label = $( ' (' + $.i18n._( 'Amendment' ) + ')' ); row_enabled = false; } else if ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) { right_label = $( ' (' + $.i18n._( 'Expense' ) + ')' ); row_enabled = false; } if ( type == 10 ) { row = $( `
` ); } else { row = $( ` ` ); } // Pay Stub Account var form_item_name_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_name_input.AComboBox( { api_class: TTAPI.APIPayStubEntryAccount, width: 132, is_static_width: 132, allow_multiple_selection: false, layout_name: 'global_PayStubAccount', show_search_inputs: true, set_empty: true, field: 'pay_stub_entry_name_id' } ); form_item_name_input.setValue( data.pay_stub_entry_name_id ); form_item_name_input.setEnabled( row_enabled ); form_item_name_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.onFormItemChange( target ); } ); var form_item_name_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_name_text.TText( { field: 'name' } ); form_item_name_text.setValue( data.name ? ( ( data['type_id'] != 40 ) ? ' ' + data.name : data.name ) : '' ); // Note(description) var form_item_note_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_note_input.TTextInput( { field: 'description', width: 300, display_na: false } ); form_item_note_input.setValue( data.description ); form_item_note_input.attr( 'editable', true ); var form_item_note_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_note_text.TText( { field: 'description', display_na: false } ); form_item_note_text.setValue( data.description ? data.description : ' ' ); // Rate var form_item_rate_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_rate_input.TTextInput( { field: 'rate', width: 60, hasKeyEvent: true } ); form_item_rate_input.setValue( Global.removeTrailingZeros( data.rate ) ); form_item_rate_input.attr( 'editable', true ); form_item_rate_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) { $this.onFormItemKeyUp( target ); } ); form_item_rate_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) { $this.onFormItemKeyDown( target ); } ); form_item_rate_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.onFormItemChange( target ); } ); var form_item_rate_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_rate_text.TText( { field: 'rate' } ); form_item_rate_text.setValue( Global.removeTrailingZeros( data.rate ) ); // Hrs/Units var form_item_units_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_units_input.TTextInput( { field: 'units', width: 60, hasKeyEvent: true } ); form_item_units_input.setValue( Global.removeTrailingZeros( data.units ) ); form_item_units_input.attr( 'editable', true ); form_item_units_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) { $this.onFormItemKeyUp( target ); } ); form_item_units_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) { $this.onFormItemKeyDown( target ); } ); form_item_units_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.onFormItemChange( target ); } ); var form_item_units_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_units_text.TText( { field: 'units' } ); form_item_units_text.setValue( Global.removeTrailingZeros( data.units ) ); // Amount var form_item_amount_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_amount_input.TTextInput( { field: 'amount', width: 60 } ); form_item_amount_input.setValue( Global.removeTrailingZeros( data.amount ) ); form_item_amount_input.unbind( 'formItemKeyUp' ).bind( 'formItemKeyUp', function( e, target ) { $this.onFormItemKeyUp( target ); } ); form_item_amount_input.unbind( 'formItemKeyDown' ).bind( 'formItemKeyDown', function( e, target ) { $this.onFormItemKeyDown( target ); } ); form_item_amount_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.onFormItemChange( target ); } ); var form_item_amount_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_amount_text.TText( { field: 'amount' } ); form_item_amount_text.setValue( Global.removeTrailingZeros( data.amount ) ); // YTD Amount var form_item_ytd_amount_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_ytd_amount_text.TText( { field: 'ytd_amount' } ); form_item_ytd_amount_text.setValue( Global.removeTrailingZeros( data.ytd_amount ) ); form_item_ytd_amount_text.attr( { 'pay_stub_entry_id': ( data.id && $this.parent_controller.current_edit_record.id ) ? data.id : '', 'type_id': data['type_id'], 'original_amount': data['amount'] ? data['amount'] : '0.00', 'original_ytd_amount': data['ytd_amount'] ? data['ytd_amount'] : '0.00', 'pay_stub_entry_name_id': data['pay_stub_entry_name_id'] ? data['pay_stub_entry_name_id'] : null } ); // if ( !$this.parent_controller.copied_record_id ) { form_item_ytd_amount_text.attr( 'pay_stub_amendment_id', pay_stub_amendment_id ); form_item_ytd_amount_text.attr( 'user_expense_id', user_expense_id ); // } if ( parseFloat( data['ytd_amount'] ) != 0 ) { } else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) { form_item_ytd_amount_text.text( '-' ); } if ( data.rate && parseFloat( data.rate ) != 0 && !$this.parent_controller.copied_record_id ) { form_item_amount_input.setReadOnly( true ); } else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) { form_item_rate_text.text( '-' ); } if ( data.units && parseFloat( data.units ) != 0 && !$this.parent_controller.copied_record_id ) { form_item_amount_input.setReadOnly( true ); } else if ( pay_stub_status_id == 40 || pay_stub_status_id == 100 || data.total_row === true ) { form_item_units_text.text( '-' ); } // name if ( type == 40 || data.total_row === true ) { if ( data['type_id'] == 40 || data.total_row === true ) { form_item_name_text.css( 'font-weight', 'bold' ); } widgets[form_item_name_text.getField()] = form_item_name_text; widgetContainer.append( form_item_name_text ); widgetContainer.append( right_label ); row.children().eq( 0 ).append( widgetContainer ); } else { if ( $this.parent_controller.isEditMode() == true || index ) { if ( data['type_id'] == 40 || data.total_row === true ) { form_item_name_text.css( 'font-weight', 'bold' ); widgets[form_item_name_text.getField()] = form_item_name_text; widgetContainer.append( form_item_name_text ); widgetContainer.append( right_label ); row.children().eq( 0 ).append( widgetContainer ); } else { args['filter_data']['type_id'] = [type]; form_item_name_input.setDefaultArgs( args ); widgets[form_item_name_input.getField()] = form_item_name_input; widgetContainer.append( form_item_name_input ); widgetContainer.append( right_label ); row.children().eq( 0 ).append( widgetContainer ); } } else { if ( data['type_id'] == 40 || data.total_row === true ) { form_item_name_text.css( 'font-weight', 'bold' ); } widgets[form_item_name_text.getField()] = form_item_name_text; widgetContainer.append( form_item_name_text ); widgetContainer.append( right_label ); row.children().eq( 0 ).append( widgetContainer ); } } // Note if ( ( data['type_id'] == type.toString() || data['type_id'] === type ) && type != 40 && !data.total_row ) { if ( $this.parent_controller.isEditMode() == true ) { if ( ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) ) { form_item_note_input.setReadOnly( true ); } widgets[form_item_note_input.getField()] = form_item_note_input; row.children().eq( 1 ).append( form_item_note_input ); } else { widgets[form_item_note_text.getField()] = form_item_note_text; row.children().eq( 1 ).append( form_item_note_text ); } } else { if ( Global.isSet( index ) || is_add || ( _.size( data ) === 1 && ( $this.parent_controller.isEditMode() == true ) ) ) { if ( ( data['type_id'] == 40 || data.total_row === true ) ) { } else { widgets[form_item_note_input.getField()] = form_item_note_input; row.children().eq( 1 ).append( form_item_note_input ); } } else if ( type == 20 || type == 30 || type == 50 || type == 80 ) { widgets[form_item_note_text.getField()] = form_item_note_text; row.children().eq( 1 ).append( form_item_note_text ); } } // amount if ( ( data['type_id'] === type.toString() || data['type_id'] === type ) && type != 40 && !data.total_row ) { if ( $this.parent_controller.isEditMode() == true ) { if ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) { form_item_amount_input.setReadOnly( true ); } widgets[form_item_amount_input.getField()] = form_item_amount_input; if ( type == 10 ) { row.children().eq( 4 ).append( form_item_amount_input ); } else { row.children().eq( 2 ).append( form_item_amount_input ); } } else { widgets[form_item_amount_text.getField()] = form_item_amount_text; if ( type == 10 ) { row.children().eq( 4 ).append( form_item_amount_text ); } else { row.children().eq( 2 ).append( form_item_amount_text ); } } } else { if ( ( Global.isSet( index ) || is_add || ( _.size( data ) === 1 && ( $this.parent_controller.isEditMode() == true ) ) ) && type != 40 && !data.total_row ) { if ( data['type_id'] == 40 ) { form_item_amount_text.css( 'font-weight', 'bold' ); widgets[form_item_amount_text.getField()] = form_item_amount_text; if ( type == 10 ) { row.children().eq( 4 ).append( form_item_amount_text ); } else { row.children().eq( 2 ).append( form_item_amount_text ); } } else { widgets[form_item_amount_input.getField()] = form_item_amount_input; if ( type == 10 ) { row.children().eq( 4 ).append( form_item_amount_input ); } else { row.children().eq( 2 ).append( form_item_amount_input ); } } } else { if ( ( data['type_id'] == 40 || data.total_row ) && type == 30 ) { form_item_amount_text.css( 'font-weight', 'bold' ); } else { form_item_amount_text.css( 'font-weight', 'bold' ); } widgets[form_item_amount_text.getField()] = form_item_amount_text; if ( type == 10 ) { row.children().eq( 4 ).append( form_item_amount_text ); } else { row.children().eq( 2 ).append( form_item_amount_text ); } } } // Ytd amount if ( data['type_id'] == 40 || data.total_row ) { form_item_ytd_amount_text.css( 'font-weight', 'bold' ); } if ( ( Global.isSet( index ) || is_add || _.size( data ) === 1 ) && type != 40 ) { form_item_ytd_amount_text.text( '-' ); } widgets[form_item_ytd_amount_text.getField()] = form_item_ytd_amount_text; if ( type == 10 ) { row.children().eq( 5 ).append( form_item_ytd_amount_text ); } else { row.children().eq( 3 ).append( form_item_ytd_amount_text ); } if ( type == 10 ) { // && !data.total_row ) { // rate if ( data['type_id'] == 10 && !data.total_row ) { if ( $this.parent_controller.isEditMode() == true ) { if ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) { form_item_rate_input.setReadOnly( true ); } widgets[form_item_rate_input.getField()] = form_item_rate_input; row.children().eq( 2 ).append( form_item_rate_input ); } else { widgets[form_item_rate_text.getField()] = form_item_rate_text; row.children().eq( 2 ).append( form_item_rate_text ); } } else { if ( Global.isSet( index ) || is_add ) { if ( data['type_id'] == 40 || data.total_row ) { } else { widgets[form_item_rate_input.getField()] = form_item_rate_input; row.children().eq( 2 ).append( form_item_rate_input ); } } } // units if ( data['type_id'] == 10 && !data.total_row ) { if ( $this.parent_controller.isEditMode() == true ) { if ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) { form_item_units_input.setReadOnly( true ); } widgets[form_item_units_input.getField()] = form_item_units_input; row.children().eq( 3 ).append( form_item_units_input ); } else { widgets[form_item_units_text.getField()] = form_item_units_text; row.children().eq( 3 ).append( form_item_units_text ); } } else { if ( Global.isSet( index ) || is_add ) { if ( data['type_id'] == 40 || data.total_row ) { form_item_units_text.css( 'font-weight', 'bold' ); widgets[form_item_units_text.getField()] = form_item_units_text; row.children().eq( 3 ).append( form_item_units_text ); } else { widgets[form_item_units_input.getField()] = form_item_units_input; row.children().eq( 3 ).append( form_item_units_input ); } } else { form_item_units_text.css( 'font-weight', 'bold' ); widgets[form_item_units_text.getField()] = form_item_units_text; row.children().eq( 3 ).append( form_item_units_text ); } } } //Build row widgets if ( ( TTUUID.isUUID( pay_stub_amendment_id ) && pay_stub_amendment_id != TTUUID.zero_id ) || ( TTUUID.isUUID( user_expense_id ) && user_expense_id != TTUUID.zero_id ) ) { row.children().last().find( '.minus-icon ' ).hide(); } if ( data['total_row'] == true ) { widgets['total_row'] = true; } if ( typeof data['type_id'] != 'undefined' ) { widgets['type_id'] = data['type_id']; } if ( data['pay_stub_entry_account_id'] == $this.parent_controller.pseal_link.net_pay_entry_account_id ) { widgets['pay_stub_entry_account_id'] = $this.parent_controller.pseal_link.net_pay_entry_account_id; } if ( typeof index !== 'undefined' ) { row.insertAfter( $( render ).find( 'tr' ).eq( index ) ); $this.rows_widgets_array.splice( ( index + 1 ), 0, widgets ); } else { $( render ).append( row ); $this.rows_widgets_array.push( widgets ); } if ( $this.parent_controller.isEditMode() == true ) { $this.addIconsEvent( row ); //Bind event to add and minus icon } else { row.children().last().empty(); } if ( data.total_row || data.type_id == 40 ) { row.find( '.plus-icon' ).remove(); row.find( '.minus-icon' ).remove(); } } if ( data['type_id'] == 10 ) { renderColumns( data, 10, index ); } else if ( data['type_id'] == 20 ) { renderColumns( data, 20, index ); } else if ( data['type_id'] == 30 ) { renderColumns( data, 30, index ); } else if ( data['type_id'] == 40 ) { renderColumns( data, 40, index ); } else if ( data['type_id'] == 50 ) { renderColumns( data, 50, index ); } else if ( data['type_id'] == 80 ) { renderColumns( data, 80, index ); } } } insideEntryEditorRemoveRow( row ) { var index = row[0].rowIndex; if ( this.rows_widgets_array[index].ytd_amount ) { var remove_id = this.rows_widgets_array[index].ytd_amount.attr( 'pay_stub_entry_id' ); var type_id = this.rows_widgets_array[index].ytd_amount.attr( 'type_id' ); if ( TTUUID.isUUID( remove_id ) ) { this.delete_ids.push( remove_id ); } row.remove(); if ( this.rows_widgets_array[index - 1] === true && ( this.rows_widgets_array[index + 1]['total_row'] === true || this.rows_widgets_array[index + 1] === true ) ) { this.addRow( { id: '', type_id: type_id }, index - 1 ); this.rows_widgets_array.splice( index + 1, 1 ); //Remove from the array used in calcTotal() } else { this.rows_widgets_array.splice( index, 1 ); //Remove from the array used in calcTotal() } } this.calcTotal(); } savePayStub( record, callbackFunction ) { // when the user create a new pay stub record have them can send entries to api. if ( this.include_pay_stub_accounts ) { var entries = this.saveInsideEntryEditorData(); var transactions = this.saveInsideTransactionEditorData(); if ( entries.length > 0 ) { record['entries'] = entries; } if ( transactions.length > 0 ) { record['transactions'] = transactions; } } callbackFunction(); } onSaveClick( ignoreWarning ) { if ( this.is_mass_editing ) { this.include_pay_stub_accounts = false; } super.onSaveClick( ignoreWarning ); } doSaveAPICall( record, ignoreWarning, callback ) { this.savePayStub( record, () => { super.doSaveAPICall( record, true, callback ); } ); } onSaveDone( result ) { this.current_edit_record = null; return true; } saveInsideTransactionEditorData( callBack ) { //called by validation function var $this = this; var data = this.editor.insideTransactionEditorGetValue( $this.current_edit_record.id ? $this.current_edit_record.id : '' ); if ( this.editor.delete_transaction_ids.length > 0 ) { for ( var i = 0; i < this.editor.delete_transaction_ids.length; i++ ) { for ( var n = 0; n < data.length; n++ ) { if ( this.editor.delete_transaction_ids[i] == data[n].id ) { data[n].deleted = 1; } } } } return data; } onCopyAsNewClick() { var $this = this; var reload_entries = false; this.setCurrentEditViewState( 'new' ); LocalCacheData.current_doing_context_action = 'copy_as_new'; if ( Global.isSet( this.edit_view ) ) { // for ( var i = 0; i < this.editor.rows_widgets_array.length; i++ ) { // if ( this.editor.rows_widgets_array[i] === true ) { // continue; // } // this.editor.rows_widgets_array[i].ytd_amount.attr( 'pay_stub_entry_id', '' ); // this.editor.rows_widgets_array[i].ytd_amount.removeAttr( 'pay_stub_amendment_id' ); // this.editor.rows_widgets_array[i].ytd_amount.removeAttr( 'user_expense_id' ); // } this.copied_record_id = this.current_edit_record.id; this.current_edit_record.id = ''; this.edit_view_ui_dic.user_id.setEnabled( true ); if ( this.current_edit_record.status_id != 25 ) { this.current_edit_record.status_id = 25; this.edit_view_ui_dic.status_id.setValue( 25 ); // this.editor.show_cover = false; // this.include_pay_stub_accounts = true; // reload_entries = true; } this.editor.show_cover = false; // this.editor.removeCover(); var navigation_div = this.edit_view.find( '.navigation-div' ); navigation_div.css( 'display', 'none' ); this.setEditMenu(); this.setTabStatus(); this.is_changed = false; // reset the entries data. // if ( reload_entries ) { this.editor.removeAllRows( true ); this.initInsideEntryEditorData(); // } ProgressBar.closeOverlay(); } else { var filter = {}; var grid_selected_id_array = this.getGridSelectIdArray(); var grid_selected_length = grid_selected_id_array.length; var selectedId; if ( grid_selected_length > 0 ) { selectedId = grid_selected_id_array[0]; filter.filter_data = {}; filter.filter_data.id = [selectedId]; this.api['get' + this.api.key_name]( filter, { onResult: function( result ) { $this.onCopyAsNewResult( result ); } } ); } else { TAlertManager.showAlert( $.i18n._( 'No selected record' ) ); } } } initEditView() { this.original_status_id = this.current_edit_record.status_id; super.initEditView(); } onSubViewRemoved() { this.search(); if ( !this.edit_view ) { this.setDefaultMenu(); } else { this.setEditMenu(); } } onCopyAsNewResult( result ) { var $this = this; var result_data = result.getResult(); if ( !result_data ) { TAlertManager.showAlert( $.i18n._( 'Record does not exist' ) ); $this.onCancelClick(); return; } $this.openEditView(); // Put it here is to avoid if the selected one is not existed in data or have deleted by other pragram. in this case, the edit view should not be opend. result_data = result_data[0]; this.copied_record_id = result_data.id; result_data.id = ''; if ( $this.sub_view_mode && $this.parent_key ) { result_data[$this.parent_key] = $this.parent_value; } if ( result_data.status_id != 25 ) { result_data.status_id = 25; // If its status is not open then set it to open status. } $this.current_edit_record = result_data; $this.editor.show_cover = false; $this.initEditView(); } onSaveAndContinue( ignoreWarning ) { var $this = this; if ( !Global.isSet( ignoreWarning ) ) { ignoreWarning = false; } this.is_changed = false; this.is_add = false; LocalCacheData.current_doing_context_action = 'save_and_continue'; var record = this.current_edit_record; this.original_status_id = record.status_id; record = this.uniformVariable( record ); this.savePayStub( record, function() { $this.api['set' + $this.api.key_name]( record, false, ignoreWarning, { onResult: function( result ) { $this.onSaveAndContinueResult( result ); } } ); } ); } onCancelClick() { TTPromise.reject( 'PayStubViewController', 'insideEditorDataLoaded' ); super.onCancelClick(); } openEditView() { if ( this.editor ) { this.editor.transaction_data = false; } TTPromise.reject( 'PayStubViewController', 'insideEditorDataLoaded' ); super.openEditView(); } onMassEditClick() { var $this = this; $this.is_add = false; $this.is_viewing = false; $this.is_mass_editing = true; LocalCacheData.current_doing_context_action = 'mass_edit'; $this.openEditView(); var filter = {}; var grid_selected_id_array = this.getGridSelectIdArray(); var grid_selected_length = grid_selected_id_array.length; this.mass_edit_record_ids = []; $.each( grid_selected_id_array, function( index, value ) { $this.mass_edit_record_ids.push( value ); } ); filter.filter_data = {}; filter.filter_data.id = this.mass_edit_record_ids; this.api['getCommon' + this.api.key_name + 'Data']( filter, { onResult: function( result ) { var result_data = result.getResult(); if ( !result_data ) { result_data = []; } $this.api['getOptions']( 'unique_columns', { onResult: function( result ) { $this.unique_columns = result.getResult(); $this.api['getOptions']( 'linked_columns', { onResult: function( result1 ) { $this.linked_columns = result1.getResult(); if ( $this.sub_view_mode && $this.parent_key ) { result_data[$this.parent_key] = $this.parent_value; } $this.current_edit_record = result_data; $this.initEditView(); } } ); } } ); } } ); } onSaveAndContinueResult( result ) { var $this = this; if ( result.isValid() ) { var result_data = result.getResult(); if ( result_data === true ) { $this.refresh_id = $this.current_edit_record.id; } else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { $this.refresh_id = result_data; } $this.search( false ); $this.editor.show_cover = false; $this.onEditClick( $this.refresh_id, true ); $this.onSaveAndContinueDone( result ); } else { $this.setErrorTips( result ); $this.setErrorMenu(); } } // onSaveAndNextResult( result ) { // var $this = this; // if ( result.isValid() ) { // var result_data = result.getResult(); // if ( result_data === true ) { // $this.refresh_id = $this.current_edit_record.id; // } else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // $this.refresh_id = result_data; // } // $this.editor.show_cover = true; // $this.onRightArrowClick(); // $this.search( false ); // $this.onSaveAndNextDone( result ); // // } else { // $this.setErrorTips( result ); // $this.setErrorMenu(); // } // }, saveInsideEntryEditorData( callBack ) { //called by validation function var $this = this; var data = this.editor.getValue( $this.current_edit_record.id ? $this.current_edit_record.id : '' ); if ( this.editor.delete_ids.length > 0 ) { for ( var i = 0; i < this.editor.delete_ids.length; i++ ) { for ( var n = 0; n < data.length; n++ ) { if ( this.editor.delete_ids[i] == data[n].id ) { data[n].deleted = 1; } } } } if ( callBack && typeof callBack == 'function' ) { callBack(); } return data; } insideEntryEditorGetValue( current_edit_item_id ) { var len = this.rows_widgets_array.length; var result = []; if ( this.cover && this.cover.length > 0 ) { return result; } for ( var i = 0; i < len; i++ ) { var row = this.rows_widgets_array[i]; var data = {}; if ( row === true || _.isArray( row ) ) { continue; } // var pay_stub_amendment_id = row['ytd_amount'].attr( 'pay_stub_amendment_id' ); // var user_expense_id = row['ytd_amount'].attr( 'user_expense_id' ); // // if ( pay_stub_amendment_id > 0 || user_expense_id > 0 ) { // continue; // } data['id'] = row['ytd_amount'].attr( 'pay_stub_entry_id' ); if ( row['ytd_amount'].attr( 'type_id' ) ) { data['type'] = row['ytd_amount'].attr( 'type_id' ); } data['rate'] = row['rate'] ? row['rate'].getValue() : ''; data['units'] = row['units'] ? row['units'].getValue() : ''; data['amount'] = row['amount'] ? row['amount'].getValue() : ''; if ( Global.isSet( row['ytd_amount'] ) ) { data['ytd_amount'] = row['ytd_amount'].getValue(); } data['description'] = row['description'] ? row['description'].getValue() : ''; if ( Global.isSet( row['pay_stub_entry_name_id'] ) ) { data['pay_stub_entry_name_id'] = row['pay_stub_entry_name_id'].getValue(); } else { data['pay_stub_entry_name_id'] = row['ytd_amount'].attr( 'pay_stub_entry_name_id' ); } // return back to the server with the same data get from API. data['pay_stub_amendment_id'] = row['ytd_amount'].attr( 'pay_stub_amendment_id' ); data['user_expense_id'] = row['ytd_amount'].attr( 'user_expense_id' ); data['pay_stub_id'] = current_edit_item_id; if ( row['total_row'] != true && TTUUID.isUUID( data['pay_stub_entry_name_id'] ) && ( data['pay_stub_entry_name_id'] != TTUUID.zero_id || ( data['description'] != undefined && data['description'].length > 0 ) || ( data['rate'] != undefined && data['rate'].length > 0 && parseFloat( data['rate'] ) != 0 ) || ( data['units'] != undefined && data['units'].length > 0 && parseFloat( data['units'] ) != 0 ) || ( data['amount'] != undefined && data['amount'].length > 0 && parseFloat( data['amount'] ) != 0 ) ) ) { result.push( data ); } } return result; } getFilterColumnsFromDisplayColumns() { var column_filter = {}; column_filter.is_owner = true; column_filter.id = true; column_filter.user_id = true; column_filter.is_child = true; column_filter.in_use = true; column_filter.first_name = true; column_filter.last_name = true; column_filter.start_date = true; column_filter.end_date = true; column_filter.pay_period_id = true; // Error: Unable to get property 'getGridParam' of undefined or null reference var display_columns = []; if ( this.grid ) { display_columns = this.grid.getGridParam( 'colModel' ); } if ( display_columns ) { var len = display_columns.length; for ( var i = 0; i < len; i++ ) { var column_info = display_columns[i]; column_filter[column_info.name] = true; } } return column_filter; } onFormItemChange( target, doNotValidate ) { var $this = this; this.setIsChanged( target ); this.setMassEditingFieldsWhenFormChange( target ); var key = target.getField(); var c_value = target.getValue(); this.current_edit_record[key] = c_value; switch ( key ) { // case 'status_id': // if ( c_value == 40 || c_value == 100 ) { // this.include_pay_stub_accounts = false; // } // break; case 'user_id': if ( this.is_add ) { var transaction_rows = $this.editor.rows_widgets_array[$this.editor.rows_widgets_array.length - 2]; var user_id = $this.edit_view_ui_dic.user_id.getValue(); for ( var t in transaction_rows ) { if ( Global.isArray( transaction_rows ) && transaction_rows[t].remittance_destination_account_id ) { transaction_rows[t].remittance_destination_account_id.setDefaultArgs( { filter_data: { user_id: user_id } } ); transaction_rows[t].remittance_destination_account_id.setValue( TTUUID.zero_id ); } } } break; case 'country': var widget = this.edit_view_ui_dic['province']; widget.setValue( null ); break; case 'pay_period_id': var filter = {}; filter.filter_data = {}; filter.filter_data.id = c_value; this.pay_period_api['get' + this.pay_period_api.key_name]( filter, { onResult: function( res ) { //Error: Uncaught TypeError: Cannot read property 'start_date' of undefined in interface/html5/#!m=PayStub&a=new&tab=PayStub line 1836 if ( res.isValid() && res.getResult()[0] ) { var result = res.getResult()[0]; var start_date = Global.strToDate( result.start_date ).format(); var end_date = Global.strToDate( result.end_date ).format(); var transaction_date = Global.strToDate( result.transaction_date ).format(); $this.current_edit_record['start_date'] = start_date; $this.current_edit_record['end_date'] = end_date; $this.current_edit_record['transaction_date'] = transaction_date; $this.edit_view_ui_dic['start_date'].setValue( start_date ); $this.edit_view_ui_dic['end_date'].setValue( end_date ); $this.edit_view_ui_dic['transaction_date'].setValue( transaction_date ); if ( !doNotValidate ) { $this.validate(); } } } } ); break; default: if ( !doNotValidate ) { $this.validate(); } break; } if ( key === 'country' || key === 'pay_period_id' ) { return; } if ( !doNotValidate ) { this.validate(); } } onSetSearchFilterFinished() { if ( this.search_panel.getSelectTabIndex() === 1 ) { var combo = this.adv_search_field_ui_dic['country']; var select_value = combo.getValue(); this.setProvince( select_value ); } } onBuildAdvUIFinished() { this.adv_search_field_ui_dic['country'].change( $.proxy( function() { var combo = this.adv_search_field_ui_dic['country']; var selectVal = combo.getValue(); this.setProvince( selectVal ); this.adv_search_field_ui_dic['province'].setValue( null ); }, this ) ); } setProvince( val, m ) { var $this = this; if ( !val || val === '-1' || val === '0' ) { $this.province_array = []; this.adv_search_field_ui_dic['province'].setSourceData( [] ); } else { this.company_api.getOptions( 'province', val, { onResult: function( res ) { res = res.getResult(); if ( !res ) { res = []; } $this.province_array = Global.buildRecordArray( res ); $this.adv_search_field_ui_dic['province'].setSourceData( $this.province_array ); } } ); } } eSetProvince( val, refresh ) { var $this = this; var province_widget = $this.edit_view_ui_dic['province']; if ( !val || val === '-1' || val === '0' ) { $this.e_province_array = []; province_widget.setSourceData( [] ); } else { this.company_api.getOptions( 'province', val, { onResult: function( res ) { res = res.getResult(); if ( !res ) { res = []; } $this.e_province_array = Global.buildRecordArray( res ); if ( refresh && $this.e_province_array.length > 0 ) { $this.current_edit_record.province = $this.e_province_array[0].value; province_widget.setValue( $this.current_edit_record.province ); } province_widget.setSourceData( $this.e_province_array ); } } ); } } validate() { var $this = this; var record = {}; var transaction_record = {}; if ( this.is_mass_editing ) { for ( var key in this.edit_view_ui_dic ) { if ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) { continue; } var widget = this.edit_view_ui_dic[key]; if ( Global.isSet( widget.isChecked ) ) { if ( widget.isChecked() && widget.getEnabled() ) { record[key] = widget.getValue(); } } } } else { record = this.current_edit_record; } record = this.uniformVariable( record ); if ( this.include_pay_stub_accounts ) { var entries = $this.saveInsideEntryEditorData(); var transactions = $this.saveInsideTransactionEditorData(); if ( typeof entries == 'object' ) { record['entries'] = entries; } if ( typeof transactions == 'object' ) { record['transactions'] = transactions; } } this.api['validate' + this.api.key_name]( record, { onResult: function( result ) { $this.validateResult( result ); } } ); } buildEditViewUI() { super.buildEditViewUI(); var $this = this; var tab_model = { 'tab_pay_stub': { 'label': $.i18n._( 'Pay Stub' ), 'is_multi_column': true, 'html_template': this.getPayStubTabHtml() }, 'tab_audit': true, }; this.setTabModel( tab_model ); this.navigation.AComboBox( { api_class: TTAPI.APIPayStub, id: this.script_name + '_navigation', allow_multiple_selection: false, layout_name: 'global_pay_stub', navigation_mode: true, show_search_inputs: true } ); this.setNavigation(); //Tab 0 start var tab_pay_stub = this.edit_view_tab.find( '#tab_pay_stub' ); var tab_pay_stub_column1 = tab_pay_stub.find( '.first-column' ); var tab_pay_stub_column2 = tab_pay_stub.find( '.second-column' ); // var tab_pay_stub_column3 = tab_pay_stub.find( '.third-column' ); var form_item_input; this.edit_view_tabs[0] = []; this.edit_view_tabs[0].push( tab_pay_stub_column1 ); // Employee form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_input.AComboBox( { api_class: TTAPI.APIUser, allow_multiple_selection: false, layout_name: 'global_user', show_search_inputs: true, set_empty: false, field: 'user_id' } ); this.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_pay_stub_column1 ); // Status form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX ); form_item_input.TComboBox( { field: 'status_id', set_empty: false } ); form_item_input.setSourceData( $this.filtered_status_array ); this.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_pay_stub_column1 ); // Type form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX ); form_item_input.TComboBox( { field: 'type_id', set_empty: false } ); form_item_input.setSourceData( $this.type_array ); this.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_pay_stub_column1 ); // Currency form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_input.AComboBox( { api_class: TTAPI.APICurrency, allow_multiple_selection: false, layout_name: 'global_currency', show_search_inputs: true, set_empty: true, field: 'currency_id' } ); this.addEditFieldToColumn( $.i18n._( 'Currency' ), form_item_input, tab_pay_stub_column1 ); // Pay Period form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_input.AComboBox( { api_class: TTAPI.APIPayPeriod, allow_multiple_selection: false, layout_name: 'global_Pay_period', show_search_inputs: true, set_empty: true, field: 'pay_period_id' } ); this.addEditFieldToColumn( $.i18n._( 'Pay Period' ), form_item_input, tab_pay_stub_column2 ); // Payroll Run form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_input.TTextInput( { field: 'run_id', width: 20 } ); this.addEditFieldToColumn( $.i18n._( 'Payroll Run' ), form_item_input, tab_pay_stub_column2 ); // Pay Start Date form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER ); form_item_input.TDatePicker( { field: 'start_date' } ); this.addEditFieldToColumn( $.i18n._( 'Pay Start Date' ), form_item_input, tab_pay_stub_column2 ); // Pay End Date form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER ); form_item_input.TDatePicker( { field: 'end_date' } ); this.addEditFieldToColumn( $.i18n._( 'Pay End Date' ), form_item_input, tab_pay_stub_column2 ); // Payment Date form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER ); form_item_input.TDatePicker( { field: 'transaction_date' } ); this.addEditFieldToColumn( $.i18n._( 'Payment Date' ), form_item_input, tab_pay_stub_column2, '' ); //Inside pay stub entries editor var inside_pay_stub_entry_editor_div = tab_pay_stub.find( '.inside-pay-stub-entry-editor-div' ); this.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR ); this.editor.InsideEditor( { addRow: this.insideEntryEditorAddRow, removeRow: this.insideEntryEditorRemoveRow, getValue: this.insideEntryEditorGetValue, setValue: this.insideEntryEditorSetValue, parent_controller: this, api: this.pay_stub_entry_api, render: getRender(), render_args: {}, render_inline_html: true, row_render: getRowRender() } ); function getRender() { return `
`; } function getRowRender() { return `
`; } this.editor.show_cover = true; this.editor.delete_transaction_ids = []; this.editor.removeCover = this.removeEntryInsideEditorCover; this.editor.onEditClick = this.removeEntryInsideEditorCover; this.editor.onFormItemKeyUp = function( target ) { var index = target.parent().parent().index(); var $this = this; var widget_rate = $this.rows_widgets_array[index]['rate']; var widget_units = $this.rows_widgets_array[index]['units']; var widget_amount = $this.rows_widgets_array[index]['amount']; if ( target.getValue().length === 0 ) { widget_amount.setReadOnly( false ); } if ( widget_rate.getValue().length > 0 || widget_units.getValue().length > 0 ) { widget_amount.setReadOnly( true ); } if ( widget_rate.getValue().length > 0 && widget_units.getValue().length > 0 ) { //widget_amount.setValue( ( parseFloat( widget_rate.getValue() ) * parseFloat( widget_units.getValue() ) ).toFixed( 2 ) ); //var amount_value = Global.MoneyRound( parseFloat( widget_rate.getValue() ) * parseFloat( widget_units.getValue() ) ); var amount_value = Global.MoneyRound( Decimal( parseFloat( widget_rate.getValue() ) ).mul( parseFloat( widget_units.getValue() ) ).toFixed( 4 ) ); if ( amount_value == 'NaN' || amount_value == 0 || amount_value == '' ) { amount_value = '0.00'; } widget_amount.setValue( amount_value ); this.onFormItemChange( widget_amount, true ); } else { widget_amount.setValue( '0.00' ); this.onFormItemChange( widget_amount, true ); } }; this.editor.onFormItemKeyDown = function( target ) { var index = target.parent().parent().index(); var $this = this; var widget = $this.rows_widgets_array[index]['amount']; var widget_rate = $this.rows_widgets_array[index]['rate']; var widget_units = $this.rows_widgets_array[index]['units']; if ( widget_rate.getValue().length > 0 && widget_units.getValue().length > 0 ) { } else { widget.setValue( '0.00' ); this.onFormItemChange( widget, true ); } widget.setReadOnly( true ); }; this.editor.onFormItemChange = function( target, doNotValidate ) { var key = target.getField(); var c_value = parseFloat( target.getValue() ? target.getValue() : 0 ); // new value var index = target.parent().parent().index(); if ( key === 'amount' ) { var original_ytd_amount = parseFloat( this.rows_widgets_array[index]['ytd_amount'].attr( 'original_ytd_amount' ) ); if ( isNaN( original_ytd_amount ) ) { original_ytd_amount = 0.00; } var original_amount = parseFloat( this.rows_widgets_array[index]['ytd_amount'].attr( 'original_amount' ) ); if ( isNaN( original_amount ) ) { original_amount = 0.00; } var new_ytd_amount = Global.removeTrailingZeros( Decimal( original_ytd_amount ).sub( original_amount ).add( c_value ).toFixed( 4 ) ); if ( isNaN( new_ytd_amount ) ) { new_ytd_amount = 0.00; } this.rows_widgets_array[index]['ytd_amount'].setValue( new_ytd_amount != 0 ? new_ytd_amount : '-' ); this.rows_widgets_array[index]['ytd_amount'].attr( 'original_ytd_amount', new_ytd_amount ); this.rows_widgets_array[index]['ytd_amount'].attr( 'original_amount', c_value ); } if ( doNotValidate ) { } else { this.parent_controller.validate(); } this.calcTotal(); }; this.editor.calcTotal = function() { var total_units = 0; var total_amount = 0; var total_ytd_amount = 0; var net_pay_amount = 0; var net_pay_ytd_amount = 0; var total_units_blank = true; for ( var i = 0; i < this.rows_widgets_array.length; i++ ) { var row = this.rows_widgets_array[i]; if ( row === true || _.isArray( row ) ) { total_units = 0; total_amount = 0; total_ytd_amount = 0; continue; } if ( row['total_row'] === true ) { if ( !Global.isNumeric( total_amount ) ) { total_amount = 0; } if ( Global.isSet( row['units'] ) ) { if ( total_units_blank == false ) { row['units'].setValue( Global.MoneyRound( total_units ) ); } else if ( total_units_blank ) { row['units'].setValue( '-' ); } } row['amount'].setValue( Global.MoneyRound( parseFloat( total_amount ) ) ); row['ytd_amount'].setValue( Global.MoneyRound( parseFloat( total_ytd_amount ) ) ); if ( row.type_id == 10 ) { // Start with total gross value net_pay_amount = total_amount; net_pay_ytd_amount = total_ytd_amount; } else if ( row.type_id == 20 ) { // Subtract deductions (only) //net_pay_amount = net_pay_amount - total_amount; net_pay_amount = Decimal( net_pay_amount ).sub( total_amount ).toFixed( 4 ); //net_pay_ytd_amount = net_pay_ytd_amount - total_ytd_amount; net_pay_ytd_amount = Decimal( net_pay_ytd_amount ).sub( total_ytd_amount ).toFixed( 4 ); } this.parent_controller.net_pay_amount = net_pay_amount; continue; } if ( row['pay_stub_entry_account_id'] && row['pay_stub_entry_account_id'] == this.parent_controller.pseal_link.net_pay_entry_account_id ) { row['amount'].setValue( Global.MoneyRound( net_pay_amount ) ); row['ytd_amount'].setValue( Global.MoneyRound( net_pay_ytd_amount ) ); continue; } var current_units = 0; if ( Global.isSet( row['units'] ) && Global.isNumeric( row['units'].getValue() ) ) { current_units = Global.MoneyRound( parseFloat( row['units'].getValue() ) ); total_units_blank = false; } var current_total_amount = 0; if ( Global.isSet( row['amount'] ) && Global.isNumeric( row['amount'].getValue() ) ) { current_total_amount = parseFloat( row['amount'].getValue() ); total_units_blank = false; } var current_ytd_total = 0; if ( Global.isSet( row['ytd_amount'] ) && Global.isNumeric( row['ytd_amount'].getValue() ) ) { current_ytd_total = parseFloat( row['ytd_amount'].getValue() ); } if ( total_units_blank == false ) { // total_units = parseFloat( total_units ) + parseFloat( current_units ); total_units = Decimal( parseFloat( total_units ) ).add( parseFloat( current_units ) ).toFixed( 4 ); } else { total_units = ''; } if ( Global.isNumeric( current_total_amount ) ) { // total_amount = total_amount + current_total_amount; total_amount = Decimal( total_amount ).add( current_total_amount ).toFixed( 4 ); } if ( Global.isNumeric( current_ytd_total ) ) { // total_ytd_amount = total_ytd_amount + current_ytd_total; total_ytd_amount = Decimal( total_ytd_amount ).add( current_ytd_total ).toFixed( 4 ); } } this.calcTransactionTotals(); }; this.editor.insideTransactionEditorSetValue = function( data ) { $this = this; if ( !this.parent_controller.current_edit_record ) { return false; } var pay_stub_status_id = this.parent_controller['current_edit_record']['status_id']; var is_add = false; if ( !this.parent_controller['current_edit_record']['id'] && !this.parent_controller.copied_record_id ) { is_add = true; } if ( !is_add && ( pay_stub_status_id == 25 ) && this.show_cover ) { this.cover = Global.loadWidgetByName( WidgetNamesDic.NO_RESULT_BOX ); this.cover.NoResultBox( { related_view_controller: this, message: $.i18n._( 'Click the Edit icon below to override pay stub amounts' ), is_edit: true } ); } var render = this.getRender(); //get render, should be a table var headerRow = ` <%= col1 %> <%= col2 %> <%= col3 %> <%= col4 %> <%= col5 %> `; var args = { col1: $.i18n._( 'Payment Method' ), col2: $.i18n._( 'Note' ), col3: $.i18n._( 'Status' ), col4: $.i18n._( 'Payment Date' ), col5: $.i18n._( 'Amount' ) }; $( render ).append( '' + $.i18n._( 'Transactions' ) + '' ); var template = _.template( headerRow ); $( render ).append( template( args ) ); this.rows_widgets_array.push( true ); if ( _.size( data ) > 0 ) { for ( var i = 0; i < _.size( data ); i++ ) { if ( Global.isSet( data[i] ) ) { var row = data[i]; this.insideTransactionEditorAddRow( row ); } } //$( render ).append( '
' ); this.rows_widgets_array.push( true ); if ( this.cover && this.cover.length > 0 ) { this.cover.css( { width: this.width(), height: this.height() + 30 } ); this.parent().append( this.cover ); } } else { this.parent_controller.getPayStubTransactionDefaultData( function( data ) { $this.insideTransactionEditorAddRow( data ); //$( render ).append( '
' ); $this.rows_widgets_array.push( true ); if ( $this.cover && $this.cover.length > 0 ) { $this.cover.css( { width: $this.width(), height: $this.height() } ); $this.parent().append( $this.cover ); } } ); } this.calcTransactionTotals(); }; this.editor.insideTransactionEditorGetValue = function( parent_id ) { var len = this.rows_widgets_array.length; var result = []; if ( this.cover && this.cover.length > 0 ) { return result; } for ( var i = 0; i < len; i++ ) { var data = {}; if ( _.isArray( this.rows_widgets_array[i] ) ) { var row = this.rows_widgets_array[i][0]; if ( !Global.isSet( row['remittance_destination_account_id'] ) || !row['remittance_destination_account_id'].getValue() ) { continue; //row is not editable but is among those that are. } data['id'] = row['form_item_record']['id']; data['remittance_destination_account_id'] = row['remittance_destination_account_id'] ? row['remittance_destination_account_id'].getValue() : TTUUID.zero_id; if ( Global.isSet( row['status_id'] ) ) { data['status_id'] = row['status_id'].getValue(); } data['transaction_date'] = row['transaction_date'] ? row['transaction_date'].getValue() : ''; if ( Global.isSet( row['currency_id'] ) ) { data['currency_id'] = row['currency_id'].getValue(); } data['note'] = row['note'] ? row['note'].getValue() : ''; data['amount'] = row['amount'] ? row['amount'].getValue() : ''; if ( Global.isSet( row['deleted'] ) && row['deleted'] == 1 ) { data['deleted'] = 1; } else { data['deleted'] = 0; } data['pay_stub_id'] = parent_id; if ( row['total_row'] != true && TTUUID.isUUID( data['remittance_destination_account_id'] ) && ( data['remittance_destination_account_id'] != TTUUID.zero_id || ( data['note'] != undefined && data['note'].length > 0 ) || ( data['amount'] != undefined && data['amount'].length > 0 && parseFloat( data['amount'] ) != 0 ) ) ) { result.push( data ); } } } return result; }; this.editor.insideTransactionEditorRemoveRow = function( row ) { var index = row[0].rowIndex - 1; if ( this.rows_widgets_array[index][0] ) { this.rows_widgets_array[index][0]['form_item_record']['deleted'] = 1; var remove_id = this.rows_widgets_array[index][0]['form_item_record']['id']; } if ( TTUUID.isUUID( remove_id ) ) { this.delete_transaction_ids.push( remove_id ); } else { // only remove the row if it was a new row, existing rows (in db) must only be hidden, not removed. this.rows_widgets_array.splice( index, 1 ); } // hide the row from user view, so we can still query the data during the save operation (api still needs it to know what to delete). row.hide(); //count transaction rows. var trows = $( '.paystub_transaction_row:visible' ).length; if ( trows == 0 ) { // if all rows removed, make sure we add a blank row in again. this.insideTransactionEditorAddRow( {}, index ); } this.parent_controller.validate(); $this.calcTransactionTotals(); }; this.editor.calcTransactionTotals = function() { var total_amount = 0; for ( var i = 0; i < this.rows_widgets_array.length; i++ ) { var row = this.rows_widgets_array[i]; //use transaction_date column existence as is transaction flag. if ( _.isObject( row ) //row is object && Global.isSet( row[0] ) //row's object is set. && Global.isSet( row[0].remittance_destination_account_id ) //row is a pay stub transaction && Global.isSet( row[0].form_item_record.deleted ) == false //row is not removed && Global.isSet( row[0].status_id ) //row is not removed && ( row[0].status_id.getValue() == 10 || row[0].status_id.getValue() == 20 ) //status is valid ) { var current = parseFloat( row[0].amount.getValue() ); if ( isNaN( current ) ) { current = 0; } total_amount += current; } } total_amount = Global.MoneyRound( total_amount ); //total_amount = Global.removeTrailingZeros(total_amount); var render = this.getRender(); $( '.transaction_total_rows' ).remove(); if ( total_amount > 0 ) { // var difference = Global.removeTrailingZeros( parseFloat( total_amount ) - parseFloat( this.parent_controller.net_pay_amount ) ); var difference = Global.removeTrailingZeros( Decimal( parseFloat( total_amount ) ).sub( parseFloat( this.parent_controller.net_pay_amount ) ).toFixed( 4 ) ); if ( isNaN( difference ) ) { difference = 0; } var color = 'green'; if ( difference != 0 ) { color = 'red'; } if ( difference != 0 ) { difference = Global.MoneyRound( difference ); $( render ).append( 'Transaction Total
Difference: ' + difference + '' + Global.MoneyRound( total_amount ) + '' ); } else { $( render ).append( 'Transaction Total
' + total_amount + '' ); } this.rows_widgets_array.push( true ); } }; this.editor.insideTransactionEditorAddRow = function( data, index ) { var $this = this; if ( _.size( data ) == 0 ) { this.parent_controller.getPayStubTransactionDefaultData( function( data ) { $this.insideTransactionEditorAddRow( data, index ); }, index ); } else { var render = $this.getRender(); var widgets = []; var transaction = {}; transaction.form_item_record = {}; var row = $( `
` ); data = _.isArray( data ) ? data[0] : data; transaction.form_item_record.id = ( data.id && $this.parent_controller.current_edit_record.id ) ? data.id : ''; var pay_stub_status_id = $this.parent_controller.current_edit_record.status_id; var is_add = false; if ( !$this.parent_controller.current_edit_record.id && !$this.parent_controller.copied_record_id ) { is_add = true; data.status_id = 10; //10=Pending == When using Copy as New force transaction statuses to pending. } // Destination Account - writable var allowed_statuses = [10]; if ( $this.parent_controller.is_add == false ) { allowed_statuses.push( 20 ); } var form_item_remittance_destination_account_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_remittance_destination_account_input.AComboBox( { api_class: TTAPI.APIRemittanceDestinationAccount, allow_multiple_selection: false, layout_name: 'global_remittance_destination_account', show_search_inputs: true, set_empty: true, field: 'remittance_destination_account_id', default_args: { filter_data: { user_id: $this.parent_controller.current_edit_record.user_id, status_id: allowed_statuses } } } ); form_item_remittance_destination_account_input.setValue( data.remittance_destination_account_id ? data.remittance_destination_account_id : '' ); form_item_remittance_destination_account_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.parent_controller.validate(); } ); // readable var form_item_remittance_destination_account_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_remittance_destination_account_text.TText( { field: 'remittance_destination_account' } ); form_item_remittance_destination_account_text.setValue( data.remittance_destination_account ? data.remittance_destination_account : '' ); // Note - writable var form_item_note_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_note_input.TTextInput( { field: 'note', width: 300, display_na: false } ); form_item_note_input.setValue( data.note ); form_item_note_input.attr( 'editable', true ); //readable var form_item_note_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_note_text.TText( { field: 'description', display_na: false } ); form_item_note_text.setValue( data.description ); // Transaction Status - writable var form_item_status_input = Global.loadWidgetByName( FormItemType.COMBO_BOX ); form_item_status_input.TComboBox( { field: 'status_id', set_empty: false } ); form_item_status_input.setSourceData( $this.parent_controller.transaction_status_array ); form_item_status_input.setValue( data.status_id ? data.status_id : '' ); form_item_status_input.setEnabled( ( LocalCacheData.current_doing_context_action == 'copy_as_new' ) ); form_item_status_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.parent_controller.validate(); } ); // readable var form_item_status_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_status_text.TText( { field: 'status' } ); form_item_status_text.setValue( data.status ? data.status : '' ); // Transaction Date - writable var form_item_transaction_date_input = Global.loadWidgetByName( FormItemType.DATE_PICKER ); form_item_transaction_date_input.TDatePicker( { field: 'transaction_date' } ); form_item_transaction_date_input.setValue( data.transaction_date ? data.transaction_date : '' ); form_item_transaction_date_input.attr( 'editable', true ); if ( !data['transaction_date'] ) { form_item_transaction_date_input.setValue( $this.parent_controller.edit_view_ui_dic.transaction_date.getValue() ); } form_item_transaction_date_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.parent_controller.validate(); } ); // readable var form_item_confirmation_number_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_confirmation_number_text.TText( { field: 'transaction_date' } ); form_item_confirmation_number_text.setValue( data.transaction_date ? data.transaction_date : '' ); // Amount - writable var form_item_amount_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_amount_input.TTextInput( { field: 'amount', width: 60 } ); form_item_amount_input.setValue( data.amount ? Global.removeTrailingZeros( data.amount ) : '' ); form_item_amount_input.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) { $this.parent_controller.validate(); $this.calcTransactionTotals(); } ); form_item_amount_input.attr( 'editable', true ); // readable var form_item_amount_text = Global.loadWidgetByName( FormItemType.TEXT ); form_item_amount_text.TText( { field: 'amount' } ); form_item_amount_text.setValue( data.amount ? Global.removeTrailingZeros( data.amount ) : '' ); if ( !data.status_id ) { data.status_id = 10; } if ( $this.parent_controller.isEditMode() ) { form_item_remittance_destination_account_input.setEnabled( data.status_id == 10 ); form_item_transaction_date_input.setEnabled( data.status_id == 10 ); form_item_amount_input.setReadOnly( data.status_id != 10 ); form_item_note_input.setReadOnly( data.status_id != 10 ); //form_item_status_input.setValue( 10 ); //set to pending form_item_status_input.setEnabled( false ); } else { //status is not pending. disable editing the row. form_item_remittance_destination_account_input.setEnabled( false ); form_item_transaction_date_input.setEnabled( false ); form_item_amount_input.setEnabled( false ); form_item_note_input.setEnabled( false ); form_item_status_input.setEnabled( false ); form_item_input = form_item_note_text; //only way to hide the N/A is to swap in a Text Field in view mode. } //actually append the row to the DOM transaction[form_item_remittance_destination_account_input.getField()] = form_item_remittance_destination_account_input; row.children().eq( 0 ).append( form_item_remittance_destination_account_input ); transaction[form_item_note_input.getField()] = form_item_note_input; row.children().eq( 1 ).append( form_item_note_input ); transaction[form_item_status_input.getField()] = form_item_status_input; row.children().eq( 2 ).append( form_item_status_input ); transaction[form_item_transaction_date_input.getField()] = form_item_transaction_date_input; row.children().eq( 3 ).append( form_item_transaction_date_input ); transaction[form_item_amount_input.getField()] = form_item_amount_input; row.children().eq( 4 ).append( form_item_amount_input ); widgets.push( transaction ); if ( typeof index !== 'undefined' ) { row.insertAfter( $( render ).find( 'tr' ).eq( index ) ); $this.rows_widgets_array.splice( ( index ), 0, widgets ); } else { $( render ).append( row ); $this.rows_widgets_array.push( widgets ); } if ( $this.parent_controller.isEditMode() == true ) { var minus_icon = row.find( '.minus-icon' ); if ( data.status_id != 10 ) { minus_icon.remove(); } else { minus_icon.click( function() { $this.insideTransactionEditorRemoveRow( row ); } ); } var plus_icon = row.find( '.plus-icon' ); plus_icon.click( function() { $this.insideTransactionEditorAddRow( {}, $( this ).parents( 'tr' ).index() ); } ); } else { //#2548 - Do not show plus button in view mode (when paystub is marked paid) row.children().last().find( '.minus-icon' ).remove(); //if ( data.status_id != 20 ) { row.children().last().find( '.plus-icon' ).remove(); //} } } }; inside_pay_stub_entry_editor_div.append( this.editor ); } buildSearchFields() { super.buildSearchFields(); this.search_fields = [ new SearchField( { label: $.i18n._( 'Pay Stub 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._( 'Pay Stub 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._( 'Employee Status' ), in_column: 1, field: 'user_status_id', multiple: true, basic_search: false, adv_search: true, layout_name: 'global_option_column', form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Pay Period' ), in_column: 1, field: 'pay_period_id', layout_name: 'global_Pay_period', api_class: TTAPI.APIPayPeriod, multiple: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Payroll Run' ), in_column: 1, field: 'run_id', multiple: true, basic_search: true, adv_search: true, layout_name: 'global_option_column', form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Employee' ), in_column: 1, field: 'user_id', layout_name: 'global_user', api_class: TTAPI.APIUser, multiple: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Title' ), field: 'title_id', in_column: 1, layout_name: 'global_job_title', api_class: TTAPI.APIUserTitle, multiple: true, basic_search: false, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Currency' ), field: 'currency_id', in_column: 1, layout_name: 'global_currency', api_class: TTAPI.APICurrency, multiple: true, basic_search: false, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Group' ), in_column: 2, multiple: true, field: 'group_id', layout_name: 'global_tree_column', tree_mode: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Default Branch' ), in_column: 2, field: 'default_branch_id', layout_name: 'global_branch', api_class: TTAPI.APIBranch, multiple: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Default Department' ), field: 'default_department_id', in_column: 2, layout_name: 'global_department', api_class: TTAPI.APIDepartment, multiple: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Country' ), in_column: 2, field: 'country', multiple: true, basic_search: false, adv_search: true, layout_name: 'global_option_column', form_item_type: FormItemType.COMBO_BOX } ), new SearchField( { label: $.i18n._( 'Province/State' ), in_column: 2, field: 'province', multiple: true, basic_search: false, adv_search: true, layout_name: 'global_option_column', form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'City' ), field: 'city', basic_search: false, adv_search: true, in_column: 2, form_item_type: FormItemType.TEXT_INPUT } ), new SearchField( { label: $.i18n._( 'Created By' ), in_column: 2, field: 'created_by', layout_name: 'global_user', api_class: TTAPI.APIUser, multiple: true, basic_search: false, adv_search: true, 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: false, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ) ]; } onCustomContextClick( id ) { switch ( id ) { case 'timesheet': case 'schedule': case 'pay_stub_amendment': case 'edit_employee': case 'employee_pay_stubs': case 'employer_pay_stubs': case 'generate_pay_stub': case 'edit_pay_period': case 'export_excel': case 'pay_stub_transaction': default: this.onNavigationClick( id ); break; } } onViewClick( edit_record, noRefreshUI ) { this.onNavigationClick( 'view' ); } onReportPrintClick( key ) { var $this = this; var grid_selected_id_array; var filter = {}; var ids = []; var user_ids = []; var base_date; var pay_period_ids = []; if ( $this.edit_view && $this.current_edit_record.id ) { ids.push( $this.current_edit_record.id ); user_ids.push( $this.current_edit_record.user_id ); pay_period_ids.push( $this.current_edit_record.pay_period_id ); base_date = $this.current_edit_record.start_date; } 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 ); user_ids.push( grid_selected_row.user_id ); pay_period_ids.push( grid_selected_row.pay_period_id ); base_date = grid_selected_row.start_date; } ); } var args = { filter_data: { id: ids } }; var post_data = { 0: args, 1: true, 2: key }; this.doFormIFrameCall( post_data ); } onNavigationClick( iconName ) { var $this = this; var grid_selected_id_array; var filter = {}; var ids = []; var user_ids = []; var base_date; var pay_period_ids = []; if ( $this.edit_view && $this.current_edit_record.id ) { ids.push( $this.current_edit_record.id ); user_ids.push( $this.current_edit_record.user_id ); pay_period_ids.push( $this.current_edit_record.pay_period_id ); base_date = $this.current_edit_record.start_date; } 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 ); user_ids.push( grid_selected_row.user_id ); pay_period_ids.push( grid_selected_row.pay_period_id ); base_date = grid_selected_row.start_date; } ); } var args = { filter_data: { id: ids } }; var post_data; switch ( iconName ) { case 'edit_employee': if ( user_ids.length > 0 ) { IndexViewController.openEditView( this, 'Employee', user_ids[0] ); } break; case 'edit_pay_period': if ( pay_period_ids.length > 0 ) { IndexViewController.openEditView( this, 'PayPeriods', pay_period_ids[0] ); } break; case 'timesheet': if ( user_ids.length > 0 ) { filter.user_id = user_ids[0]; filter.base_date = base_date; Global.addViewTab( $this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href ); IndexViewController.goToView( 'TimeSheet', filter ); } break; case 'schedule': filter.filter_data = {}; var include_users = { value: user_ids }; filter.filter_data.include_user_ids = include_users; filter.select_date = base_date; Global.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href ); IndexViewController.goToView( 'Schedule', filter ); break; case 'pay_stub_amendment': filter.filter_data = {}; filter.filter_data.user_id = user_ids[0]; filter.filter_data.pay_period_id = pay_period_ids[0]; Global.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href ); IndexViewController.goToView( 'PayStubAmendment', filter ); break; case 'generate_pay_stub': if ( user_ids.length === 1 ) { filter.user_id = user_ids[0]; } else if ( user_ids.length > 1 ) { filter.user_id = user_ids; } if ( pay_period_ids.length === 1 ) { filter.pay_period_id = [pay_period_ids[0]]; } else if ( pay_period_ids.length > 1 ) { filter.pay_period_id = pay_period_ids; } else { filter.pay_period_id = []; } IndexViewController.openWizard( 'GeneratePayStubWizard', filter, function() { $this.search(); } ); break; case 'view': //If its a payroll admin or higher, by default make the View button show employer pay stub. if ( ( PermissionManager.validate( 'pay_stub', 'view' ) || PermissionManager.validate( 'pay_stub', 'view_child' ) ) ) { post_data = { 0: args, 1: false, 2: 'pdf', 3: false }; } else { post_data = { 0: args, 1: false, 2: 'pdf', 3: true }; } this.doFormIFrameCall( post_data ); $().TFeedback( { source: 'View', // viewId GovernmentDocument will be prepended in TFeedback functions. delay: 5000 } ); break; case 'employee_pay_stubs': post_data = { 0: args, 1: false, 2: 'pdf', 3: true }; this.doFormIFrameCall( post_data ); break; case 'employer_pay_stubs': post_data = { 0: args, 1: false, 2: 'pdf', 3: false }; this.doFormIFrameCall( post_data ); break; case 'pay_stub_transaction': filter = {}; filter.filter_data = {}; filter.filter_data.user_id = { value: user_ids }; filter.filter_data.pay_period_id = { value: pay_period_ids }; Global.addViewTab( this.viewId, $.i18n._( 'Pay Stubs' ), window.location.href ); IndexViewController.goToView( 'PayStubTransaction', filter ); break; case 'export_excel': this.onExportClick( 'export' + this.api.key_name ); break; case 'direct_deposit': var data = { filter_data: { pay_stub_id: this.getGridSelectIdArray() } }; IndexViewController.openWizardController( 'ProcessTransactionsWizardController', data ); break; } } onReportMenuClick( id ) { this.onReportPrintClick( id ); } doFormIFrameCall( postData ) { Global.APIFileDownload( this.api.className, 'get' + this.api.key_name, postData ); } getPayStubTabHtml() { return `
`; } }