").dxDataGrid( {
height : instance.options.gridHeight,
scrolling : { mode : "virtual" },
filterRow : { visible : true },
showBorders : true,
selection : {
mode : "multiple",
allowSelectAll : false,
deferred : false,
showCheckBoxesMode : "always"
},
onSelectionChanged : function( e ) {
if( e.selectedRowsData.length ) {
if( instance.newCallButton ) instance.newCallButton.option( "disabled", false );
instance.deleteSelectedButton.option( "disabled", false );
} else {
if( instance.newCallButton ) instance.newCallButton.option( "disabled", true );
instance.deleteSelectedButton.option( "disabled", true );
}
},
columns : columns,
summary : {
groupItems : [
{
column : "unconfirmedAnnualVolumeQty",
summaryType : "sum",
valueFormat : "fixedPoint",
displayFormat : "Ann. Buying: {0}",
showInGroupFooter : true
}
],
totalItems : [
{
column : "unconfirmedAnnualVolumeQty",
summaryType : "sum",
valueFormat : "fixedPoint",
displayFormat : "Tot. Ann. Buying: {0}"
}
]
},
keyExpr : "productStatusId",
noDataText : "",
loadPanel : { enabled : false },
onRowDblClick : function( e ) {
if( e.rowType != "data" || e.isExpanded ) {
return;
}
e.component.expandRow( e.key );
},
masterDetail : {
autoExpandAll : false,
enabled : true,
template : function( container, options) {
let item = options.data;
let form = instance.createProductStatusForm( item );
instance.productStatusForm[item.productStatusId] = form;
container.append( form.element() );
}
},
onRowExpanded : function( e ) {
if( e.key && instance.productStatusForm[e.key]) {
let form = instance.productStatusForm[e.key];
let vr = form.validate();
if( ! vr.isValid ) {
// vr.brokenRules[0].validator.focus();
}
}
}
}).dxDataGrid( "instance" );
instance.load()
/*
instance.dataReady.done( function() {
// we are using raw data so that we can update with refresh( true ) after a save
instance.gridView.option( { "dataSource" : instance.data, "noDataText" : null } );
})
*/
return instance.gridView;
}
OperatorPurchasing.prototype.saveUnconfirmed = function() {
let instance = this;
let savePromise = $.Deferred();
let okayToSave = false;
for( let notUsed in instance.productStatusForm ) {
okayToSave = true;
break;
}
if( ! okayToSave ) {
alert( "Nothing to save" )
savePromise.reject();
return savePromise;
}
let vr = DevExpress.validationEngine.validateGroup( "productStatusRecords" );
if( vr.isValid ) {
let dataToSend = {
operatorId : instance.operatorData.operatorId,
productStatusUpdates : []
};
for( let productStatusId in instance.productStatusForm ) {
let form = instance.productStatusForm[productStatusId]
let isDirty = form.option( "isDirty2" );
if( isDirty ) {
dataToSend.productStatusUpdates.push( form.option( "formData" ) );
}
}
// console.log( dataToSend );
if( dataToSend.productStatusUpdates.length ) {
Fse.Ajax.performAction( {
object : "OPR.saveProductStatus",
data : dataToSend
}).done( function( result ) {
for( let productStatusId in instance.productStatusForm ) {
let form = instance.productStatusForm[productStatusId]
form.option( "isDirty2", false );
}
instance._isDirty = false;
if( instance.saveUnconfirmedButton ) instance.saveUnconfirmedButton.option( { disabled : true } );
let changes = [];
let refreshPromise = $.Deferred();
let refreshWaits = result.productStatus.length;
refreshPromise.progress( function( change ) {
refreshWaits--;
if( change ) {
changes.push( change );
}
if( ! refreshWaits ) {
// we are done
refreshPromise.resolve( changes );
}
})
let productStatusStore = instance.dataSource.store();
result.productStatus.forEach( function( ps ) {
productStatusStore.byKey( ps.productStatusId ).done( function( productStatus ) {
let change = null;
if( productStatus.length ) {
change = {
type : "update",
data : productStatus[0],
key : productStatus[0].productStatusId
}
}
refreshPromise.notify( change );
})
})
refreshPromise.done( function( changes ) {
if( changes.length ) {
DevExpress.data.applyChanges(instance.data, changes, { keyExpr: "productStatusId" });
instance.gridView.option( {
editing : {
changes : changes
}
})
instance.gridView.refresh( true );
}
})
Fse.UI.toast( `Purchasing Saved`, "success", 1000 );
savePromise.resolve();
});
} else {
savePromise.reject();
}
} else {
vr.brokenRules[0].validator.focus();
//console.log( vr );
savePromise.reject();
}
return savePromise;
}
OperatorPurchasing.prototype.deleteProductStatus = function( productStatus ) {
let instance = this;
if( ! productStatus ) {
return;
}
let dataToSend = {
operatorId : instance.operatorData.operatorId,
productStatusToDelete : productStatus
}
if( ! Array.isArray( dataToSend.productStatusToDelete ) ) {
dataToSend.productStatusToDelete = [dataToSend.productStatusToDelete];
}
if( dataToSend.productStatusToDelete.length == 0 ) {
return;
}
Fse.Ajax.performAction( {
object : "OPR.deleteProductStatus",
data : dataToSend
}).done( function( deleteResult ) {
instance.load();
})
}
OperatorPurchasing.prototype.load = function() {
instance = this;
let d = $.Deferred();
instance.dataSource = Fse.Data.newDataSource(
{ object : "OPR.productStatus", keyField : "productStatusId",
paginate : false, objectParams : { operatorId : instance.operatorData.operatorId, includeInactiveManufacturers : instance.includeInactiveManufacturers }
}
);
instance.loadPanel.show();
instance.dataSource.load().done( function( data ) {
instance.data = data;
instance.gridView.option( {
dataSource : instance.data,
// editing : { changes : [] },
"noDataText" : null
})
instance.gridView.refresh();
instance.loadPanel.hide();
d.resolve( instance.data );
});
return d;
}
OperatorPurchasing.prototype.addProductStatus = function( catalogType ) {
this.addProductStatusNew( catalogType )
}
OperatorPurchasing.prototype.addProductStatusNew = function( catalogType ) {
let instance = this;
let productPickerOptions = {
partnerId : instance.operatorData.operatorId,
partnerType : 'OPR',
autoFocusScope : "false",
pick : catalogType == "SKU" ? catalogType : catalogType == "PRD" ? catalogType : "SKU",
selectMode : catalogType == "SKU" ? "multiple" : "single",
territoryId : instance.operatorData.territoryId
}
let territoryDS = Fse.Data.newDataSource( { object : 'TER.salesTerritories', keyField : "territoryId", paginate : false });
territoryDS.filter( [ "territoryPath", "startswith", instance.operatorData.territoryPath ])
let territoryIdPromise = territoryDS.load().done( function( territories ) {
let territoryIds = [];
territories.forEach( function( territory ) {
territoryIds.push( territory.TerritoryID )
})
productPickerOptions.territoryId = territoryIds.join( "," );
});
if( productPickerOptions.pick == "SKU" ) {
productPickerOptions.operatorId = instance.operatorData.operatorId;
productPickerOptions.scope = "global,favorites";
productPickerOptions.title = "Add SKUs";
if( false && nMfrId ) {
productPickerOptions.scope = `mfr:${nMfrId},global,favorites`;
}
} else {
productPickerOptions.title = "Add Product";
}
// handle current selections - these are disabled in the picker
let currentSelections = [];
instance.data.forEach( function( item ) {
if( item.skuId ) {
currentSelections.push( {
catalogType : "SKU", catalogId : item.skuId
})
} else if ( item.prodId ) {
currentSelections.push( {
catalogType : "PRD", catalogId : item.prodId
})
}
})
if( currentSelections.length ) {
productPickerOptions.currentSelections = currentSelections;
}
productPickerOptions.onProductsPicked = function( productsPickedEvent ) {
let toAdd = productsPickedEvent.selectedItems;
if( ! toAdd || toAdd.length == 0 ) return;
Fse.Ajax.performAction( {
object : "OPR.addProductStatus",
data : {
operatorId : instance.operatorData.operatorId,
productStatusToAdd : toAdd
}
}).done( function( addResult ) {
if( addResult.length ) {
let loadPanel = $("
").dxLoadPanel( {
message : "Loading...",
hideOnOutsideClick : false,
onHidden : function( e ) {
e.component.element().remove();
e.component.dispose();
}
}).appendTo( $("body") ).dxLoadPanel( "instance" );
loadPanel.show();
instance.load().done( function() {
let firstKey = null;
addResult.forEach( function( productStatus ) {
if( ! firstKey ) {
firstKey = productStatus.productStatusId;
}
instance.gridView.expandRow( productStatus.productStatusId );
} )
if( firstKey ) {
instance.gridView.navigateToRow( firstKey );
}
instance._isDirty = true;
if( instance.saveUnconfirmedButton ) instance.saveUnconfirmedButton.option( { disabled : false } );
loadPanel.hide();
})
}
})
}
territoryIdPromise.done( function() {
let productPicker = new ProductPicker( productPickerOptions );
productPicker.show();
})
};
OperatorPurchasing.prototype.addProductStatusOld = function( catalogType ) {
let instance = this;
let productPickerOptions = {
partnerId : instance.operatorData.operatorId,
partnerType : 'OPR',
autoFocusScope : "false",
pickLevel : catalogType == "PRD" ? 2 : 1,
selectMode : "single",
territoryId : instance.operatorData.territoryId
}
if( productPickerOptions.pickLevel == 1 ) {
productPickerOptions.operatorId = instance.operatorData.operatorId;
productPickerOptions.scope = "global,favorites";
productPickerOptions.selectMode = "multiple";
if( false && nMfrId ) {
productPickerOptions.scope = `mfr:${nMfrId},global,favorites`;
}
}
let currentIds = [];
instance.data.forEach( function( item ) {
if( productPickerOptions.pickLevel == 2 ) {
currentIds.push( item.prodId );
} else if ( item.skuId ) {
currentIds.push( item.skuId );
}
})
productPickerOptions.disabledIdList = currentIds.join( "," );
productPickerOptions.disabledIdList = "";
productPickerOptions.onSuccess = function( r ) {
console.log( r );
if( r.status == 200 ) {
let result = JSON.parse( r.responseText );
let toAdd = [];
let catalogIds = null;
let catalogType = null;
if( result.SKUID ) {
catalogIds = result.SKUID.split( "," );
catalogType = "SKU";
} else if ( result.PRODID ) {
catalogIds = result.PRODID.split( "," );
catalogType = "PRD"
}
if( catalogIds && catalogType ) {
catalogIds.forEach( function( catalogId ) {
toAdd.push( {
catalogId : Number.parseInt( catalogId ),
catalogType : catalogType
})
})
}
if( toAdd.length ) {
Fse.Ajax.performAction( {
object : "OPR.addProductStatus",
data : {
operatorId : instance.operatorData.operatorId,
productStatusToAdd : toAdd
}
}).done( function( addResult ) {
if( addResult.length ) {
let loadPanel = $("
").dxLoadPanel( {
message : "Loading...",
hideOnOutsideClick : false,
onHidden : function( e ) {
e.component.element().remove();
e.component.dispose();
}
}).appendTo( $("body") ).dxLoadPanel( "instance" );
loadPanel.show();
instance.load().done( function() {
let firstKey = null;
addResult.forEach( function( productStatus ) {
if( ! firstKey ) {
firstKey = productStatus.productStatusId;
}
instance.gridView.expandRow( productStatus.productStatusId );
} )
if( firstKey ) {
instance.gridView.navigateToRow( firstKey );
}
instance._isDirty = true;
if( instance.saveUnconfirmedButton ) instance.saveUnconfirmedButton.option( { disabled : false } );
loadPanel.hide();
})
}
})
}
console.log( result );
}
}
Fse.FND.showProductLookup( productPickerOptions );
};
OperatorPurchasing.prototype.isDirty = function() {
return instance._isDirty;
// return instance.saveUnconfirmedButton.option( "disabled" ) ? false : true;
}
OperatorPurchasing.prototype.manageInteractions = function( productStatus ) {
let instance = this;
// in order to do this, the purchasing profile must be saved first
if( instance.isDirty() ) {
alert( "Please save changes first." );
returnl
}
let skuIds = [];
let prodIds = [];
productStatus.forEach( function( ps ) {
if( ps.skuId ) {
skuIds.push( ps.skuId );
} else {
prodIds.push( ps.prodId );
}
})
let postUpdate = function() {
instance.load();
}
// once the products have been picked, open the call dialog to use the standard logic and allow for all edits
let processJSONResponse = function( oRequest ) {
let _response = YAHOO.lang.JSON.parse( oRequest.responseText );
if (!_response.SALESCALLUNIFIEDPLATFORM) { _response.SALESCALLUNIFIEDPLATFORM = "FALSE"; }
if( _response.INTERACTIONID > 0 ) {
//if( _response.OWNERTYPE == "BRO" ) {
if( _response.OWNERTYPE == "BRO" || _response.SALESCALLUNIFIEDPLATFORM == "TRUE" ) {
Fse.CLOS.openInteractionDialog( _response.INTERACTIONID, postUpdate );
} else {
// Fse.OPR.showInteractionDialog( _response.INTERACTIONID, _response.INTERACTIONTK, null, _fnPostUpdate );
// scrum 15038 JM - verify this is correct with MG, but the previous popup was throwing JS errors. the
// function call below is the one used in sales call listing section.
Fse.CRM.showInteractionDialog(_response.INTERACTIONID, _response.INTERACTIONTK,null, postUpdate);
}
} else {
// do nothing
}
};
let oOptions = {
title : "Add Items to Sales Call",
width : "650px",
onSuccess : processJSONResponse
};
oOptions.src = $("link#oprHandlerLink").attr( "href" ) + "?get=manageInteractionsDialog&mode=direct";
oOptions.src = Fse.Util.updateURL( oOptions.src, { operatorId : instance.operatorData.operatorId });
oOptions.src = Fse.Util.updateURL( oOptions.src, { selectAll : false } );
if( skuIds.length ) {
oOptions.src = Fse.Util.updateURL( oOptions.src, { skuId : skuIds.join( "," ) } )
oOptions.src = Fse.Util.updateURL( oOptions.src, { selectAll : false } );
}
if( prodIds.length ) {
oOptions.src = Fse.Util.updateURL( oOptions.src, { prodId : prodIds.join( "," ) } )
oOptions.src = Fse.Util.updateURL( oOptions.src, { selectAll : false } );
}
Fse.DialogManager.show( "manageInteractionsDialog$", oOptions );
}