1027 lines
29 KiB
JavaScript
1027 lines
29 KiB
JavaScript
|
export class InOutViewController extends BaseViewController {
|
||
|
constructor( options = {} ) {
|
||
|
_.defaults( options, {
|
||
|
|
||
|
type_array: null,
|
||
|
|
||
|
job_api: null,
|
||
|
job_item_api: null,
|
||
|
punch_tag_api: null,
|
||
|
user_api: null,
|
||
|
department_api: null,
|
||
|
system_job_queue_api: null,
|
||
|
|
||
|
default_punch_tag: [],
|
||
|
previous_punch_tag_selection: [],
|
||
|
|
||
|
old_type_status: {},
|
||
|
|
||
|
show_job_ui: false,
|
||
|
show_job_item_ui: false,
|
||
|
show_punch_tag_ui: false,
|
||
|
show_branch_ui: false,
|
||
|
show_department_ui: false,
|
||
|
show_good_quantity_ui: false,
|
||
|
show_bad_quantity_ui: false,
|
||
|
show_transfer_ui: false,
|
||
|
show_node_ui: false,
|
||
|
|
||
|
original_note: false,
|
||
|
new_note: false,
|
||
|
|
||
|
do_not_prevalidate: true //Help reduce server load by skipping prevalidation. Enabled if validation fails during save.
|
||
|
} );
|
||
|
|
||
|
super( options );
|
||
|
}
|
||
|
|
||
|
init( options ) {
|
||
|
Global.setUINotready( true );
|
||
|
|
||
|
this.permission_id = 'punch';
|
||
|
this.viewId = 'InOut';
|
||
|
this.script_name = 'InOutView';
|
||
|
this.table_name_key = 'punch';
|
||
|
this.context_menu_name = $.i18n._( 'In/Out' );
|
||
|
this.api = TTAPI.APIPunch;
|
||
|
this.system_job_queue_api = TTAPI.APISystemJobQueue;
|
||
|
this.event_bus = new TTEventBus({ view_id: this.viewId });
|
||
|
|
||
|
//Tried to fix Cannot call method 'getJobItem' of null. Use ( Global.getProductEdition() >= 20 )
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.job_api = TTAPI.APIJob;
|
||
|
this.job_item_api = TTAPI.APIJobItem;
|
||
|
this.punch_tag_api = TTAPI.APIPunchTag;
|
||
|
this.user_api = TTAPI.APIUser;
|
||
|
this.department_api = TTAPI.APIDepartment;
|
||
|
}
|
||
|
|
||
|
this.render();
|
||
|
// this.buildContextMenu(); // #VueContextMenu#EditOnly - Commented out as must happen after initEditViewUI
|
||
|
|
||
|
this.initPermission();
|
||
|
|
||
|
this.initData();
|
||
|
this.is_changed = true;
|
||
|
}
|
||
|
|
||
|
getCustomContextMenuModel() {
|
||
|
var context_menu_model = {
|
||
|
exclude: ['default'],
|
||
|
include: ['save', 'cancel']
|
||
|
};
|
||
|
|
||
|
return context_menu_model;
|
||
|
}
|
||
|
|
||
|
addPermissionValidate( p_id ) {
|
||
|
if ( !Global.isSet( p_id ) ) {
|
||
|
p_id = this.permission_id;
|
||
|
}
|
||
|
|
||
|
if ( p_id === 'report' ) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if ( PermissionManager.validate( p_id, 'punch_in_out' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
jobUIValidate() {
|
||
|
if ( PermissionManager.validate( 'job', 'enabled' ) &&
|
||
|
PermissionManager.validate( 'punch', 'edit_job' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
jobItemUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_job_item' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
punchTagUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_punch_tag' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
branchUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_branch' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
departmentUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_department' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
goodQuantityUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_quantity' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
badQuantityUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_quantity' ) &&
|
||
|
PermissionManager.validate( 'punch', 'edit_bad_quantity' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
transferUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_transfer' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
noteUIValidate() {
|
||
|
if ( PermissionManager.validate( 'punch', 'edit_note' ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//Speical permission check for views, need override
|
||
|
initPermission() {
|
||
|
if ( this.jobUIValidate() ) {
|
||
|
this.show_job_ui = true;
|
||
|
} else {
|
||
|
this.show_job_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.jobItemUIValidate() ) {
|
||
|
this.show_job_item_ui = true;
|
||
|
} else {
|
||
|
this.show_job_item_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.punchTagUIValidate() ) {
|
||
|
this.show_punch_tag_ui = true;
|
||
|
} else {
|
||
|
this.show_punch_tag_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.branchUIValidate() ) {
|
||
|
this.show_branch_ui = true;
|
||
|
} else {
|
||
|
this.show_branch_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.departmentUIValidate() ) {
|
||
|
this.show_department_ui = true;
|
||
|
} else {
|
||
|
this.show_department_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.goodQuantityUIValidate() ) {
|
||
|
this.show_good_quantity_ui = true;
|
||
|
} else {
|
||
|
this.show_good_quantity_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.badQuantityUIValidate() ) {
|
||
|
this.show_bad_quantity_ui = true;
|
||
|
} else {
|
||
|
this.show_bad_quantity_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.transferUIValidate() ) {
|
||
|
this.show_transfer_ui = true;
|
||
|
} else {
|
||
|
this.show_transfer_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( this.noteUIValidate() ) {
|
||
|
this.show_node_ui = true;
|
||
|
} else {
|
||
|
this.show_node_ui = false;
|
||
|
}
|
||
|
|
||
|
var result = false;
|
||
|
|
||
|
// Error: Uncaught TypeError: (intermediate value).isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled is not a function on line 207
|
||
|
var company_api = TTAPI.APICompany;
|
||
|
if ( company_api && _.isFunction( company_api.isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled ) ) {
|
||
|
result = company_api.isBranchAndDepartmentAndJobAndJobItemAndPunchTagEnabled( { async: false } );
|
||
|
}
|
||
|
|
||
|
//tried to fix Unable to get property 'getResult' of undefined or null reference, added if(!result)
|
||
|
if ( !result ) {
|
||
|
this.show_branch_ui = false;
|
||
|
this.show_department_ui = false;
|
||
|
this.show_job_ui = false;
|
||
|
this.show_job_item_ui = false;
|
||
|
this.show_punch_tag_ui = false;
|
||
|
} else {
|
||
|
result = result.getResult();
|
||
|
if ( !result.branch ) {
|
||
|
this.show_branch_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( !result.department ) {
|
||
|
this.show_department_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( !result.job ) {
|
||
|
this.show_job_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( !result.job_item ) {
|
||
|
this.show_job_item_ui = false;
|
||
|
}
|
||
|
|
||
|
if ( !result.punch_tag ) {
|
||
|
this.show_punch_tag_ui = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( !this.show_job_ui && !this.show_job_item_ui ) {
|
||
|
this.show_bad_quantity_ui = false;
|
||
|
this.show_good_quantity_ui = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
super.render();
|
||
|
}
|
||
|
|
||
|
initOptions( callBack ) {
|
||
|
|
||
|
var options = [
|
||
|
{ option_name: 'type' },
|
||
|
{ option_name: 'status' }
|
||
|
];
|
||
|
|
||
|
this.initDropDownOptions( options, function( result ) {
|
||
|
if ( callBack ) {
|
||
|
callBack( result ); // First to initialize drop down options, and then to initialize edit view UI.
|
||
|
}
|
||
|
} );
|
||
|
}
|
||
|
getUserPunch( callBack ) {
|
||
|
var $this = this;
|
||
|
|
||
|
var station_id = Global.getStationID();
|
||
|
|
||
|
var api_station = TTAPI.APIStation;
|
||
|
|
||
|
if ( station_id ) {
|
||
|
api_station.getCurrentStation( station_id, '10', {
|
||
|
onResult: function( result ) {
|
||
|
doNext( result );
|
||
|
}
|
||
|
} );
|
||
|
} else {
|
||
|
api_station.getCurrentStation( '', '10', {
|
||
|
onResult: function( result ) {
|
||
|
doNext( result );
|
||
|
}
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
function doNext( result ) {
|
||
|
|
||
|
// Error: Uncaught TypeError: undefined is not a function in /interface/html5/#!m=TimeSheet&date=20150324&user_id=36135&sm=InOut line 285
|
||
|
if ( !$this.api || typeof $this.api['getUserPunch'] !== 'function' ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var res_data = result.getResult();
|
||
|
//setCookie( 'StationID', res_data );
|
||
|
Global.setStationID( res_data );
|
||
|
|
||
|
$this.api.getUserPunch( {
|
||
|
onResult: function( result ) {
|
||
|
var result_data = result.getResult();
|
||
|
//keep the inout view fields consistent for screenshots in unit test mode
|
||
|
if ( Global.UNIT_TEST_MODE === true ) {
|
||
|
result_data.punch_date = 'UNITTEST';
|
||
|
result_data.punch_time = 'UNITTEST';
|
||
|
}
|
||
|
|
||
|
if ( !result.isValid() ) {
|
||
|
TAlertManager.showErrorAlert( result );
|
||
|
$this.onCancelClick( true );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( Global.isSet( result_data ) ) {
|
||
|
callBack( result_data );
|
||
|
|
||
|
} else {
|
||
|
$this.onCancelClick();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onCancelClick( force_no_confirm ) {
|
||
|
this.is_changed = true;
|
||
|
super.onCancelClick( force_no_confirm );
|
||
|
}
|
||
|
|
||
|
openEditView() {
|
||
|
var $this = this;
|
||
|
|
||
|
if ( this.edit_only_mode && this.api ) {
|
||
|
|
||
|
this.initOptions( function( result ) {
|
||
|
if ( !$this.edit_view ) {
|
||
|
$this.initEditViewUI( 'InOut', 'InOutEditView.html' );
|
||
|
$this.buildContextMenu(); // #VueContextMenu#EditOnly - Must happen after initEditViewUI
|
||
|
}
|
||
|
|
||
|
$this.getUserPunch( function( result ) {
|
||
|
// Waiting for the TTAPI.API returns data to set the current edit record.
|
||
|
$this.current_edit_record = result;
|
||
|
|
||
|
//keep fields consistent in unit test mode for consistent screenshots
|
||
|
if ( Global.UNIT_TEST_MODE === true ) {
|
||
|
$this.current_edit_record.punch_date = 'UNITTEST';
|
||
|
$this.current_edit_record.punch_time = 'UNITTEST';
|
||
|
}
|
||
|
$this.initEditView();
|
||
|
|
||
|
} );
|
||
|
|
||
|
} );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
|
||
|
doNotValidate = this.do_not_prevalidate; //Help reduce server load. Defaults to true unless validation fails on save.
|
||
|
|
||
|
switch ( key ) {
|
||
|
case 'transfer':
|
||
|
this.onTransferChanged();
|
||
|
break;
|
||
|
case 'job_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );
|
||
|
this.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id', {
|
||
|
status_id: 10,
|
||
|
job_id: this.current_edit_record.job_id
|
||
|
} );
|
||
|
this.edit_view_ui_dic['job_quick_search'].setCheckBox( true );
|
||
|
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
}
|
||
|
break;
|
||
|
case 'job_item_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );
|
||
|
this.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );
|
||
|
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
}
|
||
|
break;
|
||
|
case 'punch_tag_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
if ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {
|
||
|
this.setPunchTagQuickSearchManualIds( target.getSelectItems() );
|
||
|
} else {
|
||
|
this.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );
|
||
|
}
|
||
|
$this.previous_punch_tag_selection = c_value;
|
||
|
//Reset source data to make sure correct punch tags are always shown.
|
||
|
this.edit_view_ui_dic['punch_tag_id'].setSourceData( null );
|
||
|
}
|
||
|
break;
|
||
|
case 'branch_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
this.setJobValueWhenCriteriaChanged( 'job_id', {
|
||
|
status_id: 10,
|
||
|
user_id: this.current_edit_record.user_id,
|
||
|
punch_branch_id: this.current_edit_record.branch_id,
|
||
|
punch_department_id: this.current_edit_record.department_id
|
||
|
} );
|
||
|
this.setDepartmentValueWhenBranchChanged( target.getValue( true ), 'department_id', {
|
||
|
branch_id: this.current_edit_record.branch_id,
|
||
|
user_id: this.current_edit_record.user_id
|
||
|
} );
|
||
|
}
|
||
|
break;
|
||
|
case 'user_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
}
|
||
|
break;
|
||
|
case 'department_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
this.setJobValueWhenCriteriaChanged( 'job_id', {
|
||
|
status_id: 10,
|
||
|
user_id: this.current_edit_record.user_id,
|
||
|
punch_branch_id: this.current_edit_record.branch_id,
|
||
|
punch_department_id: this.current_edit_record.department_id
|
||
|
} );
|
||
|
}
|
||
|
break;
|
||
|
case 'job_quick_search':
|
||
|
case 'job_item_quick_search':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.onJobQuickSearch( key, c_value );
|
||
|
TTPromise.wait( 'BaseViewController', 'onJobQuickSearch', function() {
|
||
|
$this.setPunchTagValuesWhenCriteriaChanged( $this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
} );
|
||
|
//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.
|
||
|
doNotValidate = true;
|
||
|
}
|
||
|
break;
|
||
|
case 'punch_tag_quick_search':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
this.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );
|
||
|
|
||
|
//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.
|
||
|
doNotValidate = true;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( !doNotValidate ) {
|
||
|
this.validate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
onTransferChanged( initial_load ) {
|
||
|
|
||
|
var is_transfer = false;
|
||
|
if ( this.edit_view_ui_dic && this.edit_view_ui_dic['transfer'] && this.edit_view_ui_dic['transfer'].getValue() == true ) {
|
||
|
is_transfer = true;
|
||
|
}
|
||
|
|
||
|
// type_id_widget is undefined in interface/html5/framework/jquery.min.js?v=9.0.1-20151022-091549 line 2 > eval line 390
|
||
|
var type_id_widget = this.edit_view_ui_dic['type_id'];
|
||
|
var status_id_widget = this.edit_view_ui_dic['status_id'];
|
||
|
if ( is_transfer && type_id_widget && status_id_widget ) {
|
||
|
|
||
|
type_id_widget.setEnabled( false );
|
||
|
status_id_widget.setEnabled( false );
|
||
|
|
||
|
this.old_type_status.type_id = type_id_widget.getValue();
|
||
|
this.old_type_status.status_id = status_id_widget.getValue();
|
||
|
|
||
|
type_id_widget.setValue( 10 );
|
||
|
status_id_widget.setValue( 10 );
|
||
|
|
||
|
this.current_edit_record.type_id = 10;
|
||
|
this.current_edit_record.status_id = 10;
|
||
|
|
||
|
} else if ( type_id_widget && status_id_widget ) {
|
||
|
type_id_widget.setEnabled( true );
|
||
|
status_id_widget.setEnabled( true );
|
||
|
|
||
|
if ( this.old_type_status.hasOwnProperty( 'type_id' ) ) {
|
||
|
type_id_widget.setValue( this.old_type_status.type_id );
|
||
|
status_id_widget.setValue( this.old_type_status.status_id );
|
||
|
|
||
|
this.current_edit_record.type_id = this.old_type_status.type_id;
|
||
|
this.current_edit_record.status_id = this.old_type_status.status_id;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( is_transfer == true ) {
|
||
|
if ( this.original_note == '' ) {
|
||
|
this.original_note = this.current_edit_record.note;
|
||
|
} else {
|
||
|
this.original_note = this.edit_view_ui_dic.note.getValue();
|
||
|
}
|
||
|
this.edit_view_ui_dic.note.setValue( this.new_note ? this.new_note : '' );
|
||
|
this.current_edit_record.note = this.new_note ? this.new_note : '';
|
||
|
|
||
|
} else if ( typeof initial_load == 'undefined' || initial_load === false ) {
|
||
|
|
||
|
this.new_note = this.edit_view_ui_dic.note.getValue();
|
||
|
this.edit_view_ui_dic.note.setValue( this.original_note ? this.original_note : '' );
|
||
|
this.current_edit_record.note = this.original_note ? this.original_note : '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Make sure this.current_edit_record is updated before validate
|
||
|
validate() {
|
||
|
|
||
|
var $this = this;
|
||
|
|
||
|
var 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 );
|
||
|
|
||
|
this.api.setUserPunch( record, true, {
|
||
|
onResult: function( result ) {
|
||
|
$this.validateResult( result );
|
||
|
|
||
|
}
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
// Overrides BaseViewController
|
||
|
doSaveAPICall( record, ignoreWarning, callback ) {
|
||
|
var current_api = this.getCurrentAPI();
|
||
|
|
||
|
if ( !callback ) {
|
||
|
callback = {
|
||
|
onResult: function( result ) {
|
||
|
this.onSaveResult( result );
|
||
|
}.bind( this )
|
||
|
};
|
||
|
}
|
||
|
|
||
|
current_api.setIsIdempotent( true ); //Force to idempotent API call to avoid duplicate network requests from causing errors displayed to the user.
|
||
|
return current_api.setUserPunch( record, false, ignoreWarning, callback );
|
||
|
}
|
||
|
|
||
|
convertSetUserPunchToGetPunch( record ) {
|
||
|
record.id = TTUUID.not_exist_id;
|
||
|
record.longitude = null;
|
||
|
record.latitude = null;
|
||
|
record.position_accuracy = null;
|
||
|
record.pay_period_id = null;
|
||
|
record.punch_control_id = record.punch_control_id ? record.punch_control_id : null;
|
||
|
record.tainted = false;
|
||
|
record.has_image = false;
|
||
|
|
||
|
return record;
|
||
|
}
|
||
|
|
||
|
onSaveResult( result ) {
|
||
|
let pending_punch = _.clone( this.current_edit_record );
|
||
|
super.onSaveResult( result );
|
||
|
//If pending punch is null that means the In/Out view has already been closed. Multiple clicks of save under latency could cause this.
|
||
|
//Do not continue further or exceptions will be thrown trying to read a null punch.
|
||
|
if ( result && result.isValid() && pending_punch != null ) {
|
||
|
LocalCacheData.setLastPunchTime( new Date().getTime() ); //Update last punch time so that we can limit the user from punching in more than once a minute.
|
||
|
var system_job_queue = result.getAttributeInAPIDetails( 'system_job_queue' );
|
||
|
if ( system_job_queue ) {
|
||
|
LocalCacheData.setJobQueuePunchData( this.convertSetUserPunchToGetPunch( pending_punch ) );
|
||
|
this.event_bus.emit( 'tt_topbar', 'toggle_job_queue_spinner', {
|
||
|
show: true,
|
||
|
get_job_data: true
|
||
|
} );
|
||
|
}
|
||
|
|
||
|
if ( LocalCacheData.current_open_primary_controller && LocalCacheData.current_open_primary_controller.viewId === 'TimeSheet' ) {
|
||
|
LocalCacheData.current_open_primary_controller.search();
|
||
|
}
|
||
|
} else {
|
||
|
this.do_not_prevalidate = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
setErrorMenu() {
|
||
|
var context_menu_array = ContextMenuManager.getMenuModelByMenuId( this.determineContextMenuMountAttributes().id );
|
||
|
var len = context_menu_array.length;
|
||
|
|
||
|
for ( var i = 0; i < len; i++ ) {
|
||
|
let context_btn = context_menu_array[i];
|
||
|
let id = context_menu_array[i].id;
|
||
|
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
|
||
|
|
||
|
switch ( id ) {
|
||
|
case 'cancel':
|
||
|
break;
|
||
|
default:
|
||
|
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
getCustomFieldReferenceField() {
|
||
|
return 'note';
|
||
|
}
|
||
|
|
||
|
buildEditViewUI() {
|
||
|
super.buildEditViewUI();
|
||
|
|
||
|
var $this = this;
|
||
|
|
||
|
var tab_model = {
|
||
|
'tab_punch': { 'label': $.i18n._( 'Punch' ) },
|
||
|
'tab_audit': false,
|
||
|
};
|
||
|
this.setTabModel( tab_model );
|
||
|
|
||
|
//Tab 0 start
|
||
|
|
||
|
var tab_punch = this.edit_view_tab.find( '#tab_punch' );
|
||
|
|
||
|
var tab_punch_column1 = tab_punch.find( '.first-column' );
|
||
|
|
||
|
this.edit_view_tabs[0] = [];
|
||
|
|
||
|
this.edit_view_tabs[0].push( tab_punch_column1 );
|
||
|
|
||
|
var form_item_input;
|
||
|
var widgetContainer;
|
||
|
var label;
|
||
|
|
||
|
// Employee
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
|
||
|
|
||
|
form_item_input.TText( {
|
||
|
field: 'user_id_readonly'
|
||
|
} );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_punch_column1, '' );
|
||
|
|
||
|
// Time
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );
|
||
|
|
||
|
form_item_input.TTimePicker( { field: 'punch_time' } );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Time' ), form_item_input, tab_punch_column1 );
|
||
|
|
||
|
// Date
|
||
|
// punch_date, punch_dates
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
|
||
|
|
||
|
form_item_input.TDatePicker( { field: 'punch_date' } );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_punch_column1 );
|
||
|
|
||
|
//Transfer
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
||
|
form_item_input.TCheckbox( { field: 'transfer' } );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Transfer' ), form_item_input, tab_punch_column1, '', null, true );
|
||
|
|
||
|
if ( !this.show_transfer_ui ) {
|
||
|
this.detachElement( 'transfer' );
|
||
|
}
|
||
|
|
||
|
// Punch
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
|
||
|
form_item_input.TComboBox( { field: 'type_id' } );
|
||
|
form_item_input.setSourceData( $this.type_array );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Punch Type' ), form_item_input, tab_punch_column1 );
|
||
|
|
||
|
// In/Out
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
|
||
|
form_item_input.TComboBox( { field: 'status_id' } );
|
||
|
form_item_input.setSourceData( $this.status_array );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'In/Out' ), form_item_input, tab_punch_column1 );
|
||
|
|
||
|
// Branch
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
||
|
|
||
|
form_item_input.AComboBox( {
|
||
|
api_class: TTAPI.APIBranch,
|
||
|
allow_multiple_selection: false,
|
||
|
layout_name: 'global_branch',
|
||
|
show_search_inputs: true,
|
||
|
set_empty: true,
|
||
|
field: 'branch_id'
|
||
|
} );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_punch_column1, '', null, true );
|
||
|
|
||
|
if ( !this.show_branch_ui ) {
|
||
|
this.detachElement( 'branch_id' );
|
||
|
}
|
||
|
|
||
|
// Department
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
||
|
|
||
|
form_item_input.AComboBox( {
|
||
|
api_class: TTAPI.APIDepartment,
|
||
|
allow_multiple_selection: false,
|
||
|
layout_name: 'global_department',
|
||
|
show_search_inputs: true,
|
||
|
set_empty: true,
|
||
|
field: 'department_id'
|
||
|
} );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_punch_column1, '', null, true );
|
||
|
|
||
|
if ( !this.show_department_ui ) {
|
||
|
this.detachElement( 'department_id' );
|
||
|
}
|
||
|
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
|
||
|
//Job
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
||
|
|
||
|
form_item_input.AComboBox( {
|
||
|
api_class: TTAPI.APIJob,
|
||
|
allow_multiple_selection: false,
|
||
|
layout_name: 'global_job',
|
||
|
show_search_inputs: true,
|
||
|
set_empty: true,
|
||
|
always_include_columns: ['group_id'],
|
||
|
setRealValueCallBack: ( function( val ) {
|
||
|
|
||
|
if ( val ) {
|
||
|
job_coder.setValue( val.manual_id );
|
||
|
}
|
||
|
} ),
|
||
|
field: 'job_id'
|
||
|
} );
|
||
|
|
||
|
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
|
||
|
|
||
|
var job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
||
|
job_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );
|
||
|
job_coder.addClass( 'job-coder' );
|
||
|
|
||
|
widgetContainer.append( job_coder );
|
||
|
widgetContainer.append( form_item_input );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_punch_column1, '', widgetContainer, true );
|
||
|
|
||
|
if ( !this.show_job_ui ) {
|
||
|
this.detachElement( 'job_id' );
|
||
|
}
|
||
|
|
||
|
// Task
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
||
|
|
||
|
form_item_input.AComboBox( {
|
||
|
api_class: TTAPI.APIJobItem,
|
||
|
allow_multiple_selection: false,
|
||
|
layout_name: 'global_job_item',
|
||
|
show_search_inputs: true,
|
||
|
set_empty: true,
|
||
|
always_include_columns: ['group_id'],
|
||
|
setRealValueCallBack: ( function( val ) {
|
||
|
if ( val ) {
|
||
|
job_item_coder.setValue( val.manual_id );
|
||
|
}
|
||
|
} ),
|
||
|
field: 'job_item_id'
|
||
|
} );
|
||
|
|
||
|
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
|
||
|
|
||
|
var job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
||
|
job_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );
|
||
|
job_item_coder.addClass( 'job-coder' );
|
||
|
|
||
|
widgetContainer.append( job_item_coder );
|
||
|
widgetContainer.append( form_item_input );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_punch_column1, '', widgetContainer, true );
|
||
|
|
||
|
if ( !this.show_job_item_ui ) {
|
||
|
this.detachElement( 'job_item_id' );
|
||
|
}
|
||
|
|
||
|
//Punch Tag
|
||
|
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
||
|
|
||
|
form_item_input.AComboBox( {
|
||
|
api_class: TTAPI.APIPunchTag,
|
||
|
allow_multiple_selection: true,
|
||
|
layout_name: 'global_punch_tag',
|
||
|
show_search_inputs: true,
|
||
|
set_empty: true,
|
||
|
get_real_data_on_multi: true,
|
||
|
setRealValueCallBack: ( ( punch_tags, get_real_data ) => {
|
||
|
if ( punch_tags ) {
|
||
|
this.setPunchTagQuickSearchManualIds( punch_tags, get_real_data );
|
||
|
}
|
||
|
} ),
|
||
|
field: 'punch_tag_id'
|
||
|
} );
|
||
|
|
||
|
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
|
||
|
|
||
|
var punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
||
|
punch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );
|
||
|
punch_tag_coder.addClass( 'job-coder' );
|
||
|
|
||
|
widgetContainer.append( punch_tag_coder );
|
||
|
widgetContainer.append( form_item_input );
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Tags' ), [form_item_input, punch_tag_coder], tab_punch_column1, '', widgetContainer, true );
|
||
|
|
||
|
if ( !this.show_punch_tag_ui ) {
|
||
|
this.detachElement( 'punch_tag_id' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Quantity
|
||
|
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
|
||
|
var good = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
||
|
good.TTextInput( { field: 'quantity', width: 40 } );
|
||
|
good.addClass( 'quantity-input' );
|
||
|
|
||
|
var good_label = $( '<span class=\'widget-right-label\'>' + $.i18n._( 'Good' ) + ': </span>' );
|
||
|
|
||
|
var bad = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
||
|
bad.TTextInput( { field: 'bad_quantity', width: 40 } );
|
||
|
bad.addClass( 'quantity-input' );
|
||
|
|
||
|
var bad_label = $( '<span class=\'widget-right-label\'>/ ' + $.i18n._( 'Bad' ) + ': </span>' );
|
||
|
|
||
|
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
|
||
|
|
||
|
widgetContainer.append( good_label );
|
||
|
widgetContainer.append( good );
|
||
|
widgetContainer.append( bad_label );
|
||
|
widgetContainer.append( bad );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Quantity' ), [good, bad], tab_punch_column1, '', widgetContainer, true );
|
||
|
|
||
|
if ( !this.show_bad_quantity_ui && !this.show_good_quantity_ui ) {
|
||
|
this.detachElement( 'quantity' );
|
||
|
} else {
|
||
|
if ( !this.show_bad_quantity_ui ) {
|
||
|
bad_label.hide();
|
||
|
bad.hide();
|
||
|
}
|
||
|
|
||
|
if ( !this.show_good_quantity_ui ) {
|
||
|
good_label.hide();
|
||
|
good.hide();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//Note
|
||
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );
|
||
|
|
||
|
form_item_input.TTextArea( { field: 'note', width: '100%' } );
|
||
|
|
||
|
this.addEditFieldToColumn( $.i18n._( 'Note' ), form_item_input, tab_punch_column1, '', null, true, true );
|
||
|
|
||
|
form_item_input.parent().width( '45%' );
|
||
|
|
||
|
if ( !this.show_node_ui ) {
|
||
|
this.detachElement( 'note' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
setCurrentEditRecordData() {
|
||
|
var $this = this;
|
||
|
// reset old_types, should only be set when type change and transfer is true. fixed bug 1500
|
||
|
this.old_type_status = {};
|
||
|
//Set current edit record data to all widgets
|
||
|
for ( var key in this.current_edit_record ) {
|
||
|
|
||
|
if ( !this.current_edit_record.hasOwnProperty( key ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
var widget = this.edit_view_ui_dic[key];
|
||
|
if ( Global.isSet( widget ) ) {
|
||
|
switch ( key ) {
|
||
|
case 'user_id_readonly':
|
||
|
widget.setValue( this.current_edit_record.first_name + ' ' + this.current_edit_record.last_name );
|
||
|
break;
|
||
|
case 'job_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
var args = {};
|
||
|
args.filter_data = {
|
||
|
status_id: 10,
|
||
|
user_id: this.current_edit_record.user_id,
|
||
|
punch_branch_id: this.current_edit_record.branch_id,
|
||
|
punch_department_id: this.current_edit_record.department_id
|
||
|
};
|
||
|
widget.setDefaultArgs( args );
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
}
|
||
|
break;
|
||
|
case 'job_item_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
var args = {};
|
||
|
args.filter_data = { status_id: 10, job_id: this.current_edit_record.job_id };
|
||
|
widget.setDefaultArgs( args );
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
}
|
||
|
break;
|
||
|
case 'punch_tag_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
this.previous_punch_tag_selection = this.current_edit_record[key];
|
||
|
|
||
|
var punch_tag_widget = widget;
|
||
|
TTPromise.wait( null, null, function() {
|
||
|
//Update default args for punch tags AComboBox last as they rely on data from job, job item and related fields.
|
||
|
var args = {};
|
||
|
args.filter_data = $this.getPunchTagFilterData();
|
||
|
punch_tag_widget.setDefaultArgs( args );
|
||
|
} );
|
||
|
}
|
||
|
break;
|
||
|
case 'branch_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
var args = {};
|
||
|
args.filter_data = { status_id: 10, user_id: this.current_edit_record.user_id };
|
||
|
widget.setDefaultArgs( args );
|
||
|
}
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
break;
|
||
|
case 'department_id':
|
||
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
||
|
var args = {};
|
||
|
args.filter_data = { status_id: 10, user_id: this.current_edit_record.user_id, branch_id: this.current_edit_record.branch_id };
|
||
|
widget.setDefaultArgs( args );
|
||
|
}
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
break;
|
||
|
case 'job_quick_search':
|
||
|
break;
|
||
|
case 'job_item_quick_search':
|
||
|
break;
|
||
|
case 'punch_tag_quick_search':
|
||
|
break;
|
||
|
case 'transfer':
|
||
|
// do this at last
|
||
|
break;
|
||
|
case 'punch_time':
|
||
|
case 'punch_date':
|
||
|
widget.setEnabled( false );
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
break;
|
||
|
default:
|
||
|
widget.setValue( this.current_edit_record[key] );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Error: Uncaught TypeError: Cannot read property 'setValue' of undefined in interface/html5/#!m=TimeSheet&date=20151019&user_id=25869&show_wage=0&sm=InOut line 926
|
||
|
//The API will return if transfer should be enabled/disabled by default.
|
||
|
if ( this.show_transfer_ui && this.edit_view_ui_dic['transfer'] ) {
|
||
|
this.edit_view_ui_dic['transfer'].setValue( this.current_edit_record['transfer'] );
|
||
|
}
|
||
|
|
||
|
this.onTransferChanged( true );
|
||
|
|
||
|
this.collectUIDataToCurrentEditRecord();
|
||
|
this.setEditViewDataDone();
|
||
|
}
|
||
|
|
||
|
setEditViewDataDone() {
|
||
|
super.setEditViewDataDone();
|
||
|
this.confirm_on_exit = true; //confirm on leaving even if no changes have been made so users can't accidentally not save punches by logging out without clicking save for example
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InOutViewController.loadView = function() {
|
||
|
|
||
|
Global.loadViewSource( 'InOut', 'InOutView.html', function( result ) {
|
||
|
|
||
|
var args = {};
|
||
|
var template = _.template( result );
|
||
|
|
||
|
Global.contentContainer().html( template( args ) );
|
||
|
} );
|
||
|
|
||
|
};
|