")
.css({
padding: "10px 16px"
})
.append( instance.toolbar.element() )
.appendTo( instance.rootElement );
}
ClaimReview.prototype.createDataGrid = function() {
var instance = this;
let claimPendingListDataSource = Fse.Data.newDataSource({
object: 'TPM.claimPendingList',
paginate: true,
pageSize: 50,
});
instance.dataGrid = $( '
' ).dxDataGrid({
dataSource: claimPendingListDataSource,
showBorders: false,
filterRow : { visible : true },
headerFilter : { visible : true },
scrolling : { mode : 'virtual' },
hoverStateEnabled: true,
allowColumnResizing: true,
columns: [
{ dataField: 'operatorName', caption: 'Operator' },
{ dataField: 'claimInvoice', caption: 'Claim Invoice #' },
{ dataField: 'claimPeriodStart', caption: 'Claim Start Date', dataType: 'date', allowFiltering: false },
{ dataField: 'claimPeriodEnd', caption: 'Claim End Date', dataType: 'date', allowFiltering: false },
{ dataField: 'externalAgreementNumber', caption: 'Agreement Number', visible: false },
{ dataField: 'pendingDate', caption: 'Submitted for Review', dataType: 'date', allowFiltering: false },
{ dataField: 'totalExceptionCount', caption: 'Exception Count', format: "#,##0" },
{ dataField: 'totalItemQty', caption: 'Total Qty', format: "#,##0.00" },
{ dataField: 'totalAmount', caption: 'Total Dollars', format: { type: 'currency', precision: 2 } },
{ dataField: 'doubleDipQtyAllowed', caption: 'Double Dip Qty Allowed', format: "#,##0.00", visible: false },
{ dataField: 'doubleDipQtyDenied', caption: 'Double Dip Qty Denied', format: "#,##0.00", visible: false },
{ dataField: 'doubleDipAmountAllowed', caption: 'Double Dip Amount Allowed', format: "$#,##0.00", visible: false },
{ dataField: 'doubleDipAmountDenied', caption: 'Double Dip Amount Denied', format: "$#,##0.00", visible: false },
{ dataField: 'claimPendingStatus', caption: 'Status' },
],
onRowClick: function( e ) {
if( e.rowType !== 'data' ) return;
instance.openClaimDetailPopup( e.data );
},
onToolbarPreparing : function( e ) {
if( ! e.toolbarOptions.items ) e.toolbarOptions.items = [];
let items = e.toolbarOptions.items;
items.push({ location : "after", widget : "dxButton", options : {
hint : "Choose Columns",
icon : "columnchooser",
onClick : function( ) {
let columnChooser = new CustomDataGridColumnChooser( e.component, function() { }, true );
columnChooser.show();
}
}
});
items.push( { location: "after", widget : "dxButton", options : {
hint : "Excel Export",
icon : "export",
onClick : function( e ) {
Fse.UI.DataGridHelper.exportDataGrid( { dataGrid : instance.dataGrid, fileName : "ClaimReview_Summary.xlsx" } );
}
}
});
items.push( { widget: "dxButton", location: "after", options : {
type : "normal",
icon :"help",
hint : "View Help",
onClick : function( e ) {
Fse.Portal.showQuickHelp( "DoubleDipModule" );
}
}
});
},
}).dxDataGrid( 'instance' );
//instance.rootElement.append( instance.dataGrid.element() );
$("
")
.css({
padding: "10px 16px 16px 16px"
})
.append( instance.dataGrid.element() )
.appendTo( instance.rootElement );
}
ClaimReview.prototype.openClaimDetailPopup = function( claimData ) {
let instance = this;
instance.currentClaimData = claimData;
instance.podUpdates = {};
if( ! instance.claimDetailPopupElement ) {
instance.claimDetailPopupElement = $( '
' ).appendTo( 'body' );
instance.loadingPanel = $( '
' ).appendTo( 'body' ).dxLoadPanel({
message: 'Processing Acknowledgement...',
visible: false,
showIndicator: true,
showPane: true,
shading: true,
shadingColor: 'rgba(0,0,0,0.4)',
position: { of: window }
}).dxLoadPanel( 'instance' );
instance.cancelButton = $( '
' ).dxButton({
text: 'Cancel',
type: 'normal',
onClick: function( e ) {
if( confirm( 'Are you sure you want to cancel?' ) ) {
instance.claimDetailPopup.hide();
}
}
}).dxButton( 'instance' );
instance.saveDraftButton = $( '
' ).dxButton({
text: 'Save Draft',
type: 'normal',
onClick: function( e ) {
let currentClaim = instance.currentClaimData;
var sSaveDraftURL = $("link#PortalDocRootURL").attr("href") + "/apps/TPM/index.cfm?do=saveClaimPendingDetails";
if( confirm( 'Save Draft?' ) ) {
let selectedRows = Object.values( instance.podUpdates );
//console.log( selectedRows );
$.ajax({
url: sSaveDraftURL,
method: 'POST',
data: {
claimId: currentClaim.claimId,
podUpdates: JSON.stringify( selectedRows )
},
}).done( function( e ) {
instance.claimDetailPopupContent.empty();
instance.claimDetailPopup.hide();
instance.dataGrid.refresh();
instance.refreshKPIs();
}).fail( function() {
console.log( 'Save draft failed' );
alert( 'Unable to save draft. Please try again.' );
})
}
},
}).dxButton( 'instance' );
instance.submitAcknowledgementButton = $( '
' ).dxButton({
text: 'Submit Acknowledgement',
type: 'default',
disabled: ( Fse.Portal.checkPermission( "DoubleDipViewOnly" ) && !Fse.Portal.checkPermission( "DoubleDipAdmin" ) ) || claimData.claimPendingStatus == "Closed",
onClick: function( e ) {
let currentClaim = instance.currentClaimData;
var sAcknowledgeURL = $("link#PortalDocRootURL").attr("href") + "/apps/TPM/index.cfm?do=acknowledgeClaim";
if( confirm( 'Acknowledge Claim?' ) ) {
let selectedRows = Object.values( instance.podUpdates );
instance.loadingPanel.show();
$.ajax({
url: sAcknowledgeURL,
method: 'POST',
data: {
claimId: currentClaim.claimId,
podUpdates: JSON.stringify( selectedRows )
},
}).done( function( e ) {
instance.loadingPanel.hide();
instance.claimDetailPopupContent.empty();
instance.claimDetailPopup.hide();
instance.dataGrid.refresh();
instance.refreshKPIs();
DevExpress.ui.notify( {
message: 'Acknowledgement received. Your billback file is now processing. You will receive an email notification with the file attached once it is complete.',
type: 'success',
displayTime: 4000,
position: {
my: 'center top',
at: 'center top'
}
});
}).fail( function( xhr ) {
instance.loadingPanel.hide();
let message = 'Unable to acknowledge claim. Please try again.';
if( xhr.responseJSON && xhr.responseJSON.message ) {
message = xhr.responseJSON.message;
}
DevExpress.ui.notify( {
message: message,
type: 'error',
displayTime: 4000,
position: {
my: 'center top',
at: 'center top'
}
});
})
}
},
}).dxButton( 'instance' );
let claimDetailPopupToolbarItems = [{
toolbar: 'bottom',
location: 'after',
template: function( e ) {
return instance.cancelButton.element();
},
},{
toolbar: 'bottom',
location: 'after',
template: function( e ) {
return instance.saveDraftButton.element();
}
},{
toolbar: 'bottom',
location: 'after',
template: function( e ) {
return instance.submitAcknowledgementButton.element();
}
}];
instance.claimDetailPopup = instance.claimDetailPopupElement.dxPopup({
//title: claimData.operatorName + " | " + claimData.claimInvoice,
width: "80%",
height: 650,
dragEnabled: true,
resizeEnabled: true,
toolbarItems: claimDetailPopupToolbarItems,
contentTemplate: function( contentElement ) {
instance.claimDetailPopupContent = $( '
' ).addClass("claim-detail-popup-content").css({
width: '100%',
height: '100%',
boxSizing: 'border-box',
padding: '12px'
});
contentElement.append( instance.claimDetailPopupContent );
},
onHidden: function() {
if ( instance.claimDetailPopupContent ) {
instance.claimDetailPopupContent.empty();
}
}
}).dxPopup( 'instance' );
}
let formattedClaimPeriodStart = DevExpress.localization.formatDate( new Date( claimData.claimPeriodStart ), "MM/dd/yyyy" );
let formattedClaimPeriodEnd = DevExpress.localization.formatDate( new Date( claimData.claimPeriodEnd ), "MM/dd/yyyy" );
instance.claimDetailPopup.option(
"title",
claimData.operatorName + " | " + claimData.claimInvoice + " | " + formattedClaimPeriodStart + " to " + formattedClaimPeriodEnd
);
let isClosed = instance.currentClaimData.claimPendingStatus == "Closed";
let isViewOnly = Fse.Portal.checkPermission( "DoubleDipViewOnly" ) && !Fse.Portal.checkPermission( "DoubleDipAdmin" );
instance.saveDraftButton.option( 'disabled', isViewOnly || isClosed );
instance.submitAcknowledgementButton.option( 'disabled', isViewOnly || isClosed );
instance.claimDetailPopup.show();
instance.renderClaimDetailPopupContent( claimData );
}
ClaimReview.prototype.renderClaimDetailPopupContent = function( claimData ) {
let instance = this;
let isClosed = claimData.claimPendingStatus == "Closed";
let isViewOnly = Fse.Portal.checkPermission( "DoubleDipViewOnly" ) && !Fse.Portal.checkPermission( "DoubleDipAdmin" );
if( instance.claimDetailPopupContent ) {
instance.claimDetailPopupContent.empty();
}
let headerRow = $( '
' ).css({
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: '12px'
});
const totalRecords = claimData.totalExceptionCount || 0;
const acceptedExclusions = claimData.totalSuppressedCount || 0;
const deniedExclusions = totalRecords - acceptedExclusions;
let statsContainer = $('
').css({
display: 'flex',
'flex-direction': 'column',
gap: '6px'
});
let statsRow = $('
').css({
display: 'flex',
gap: '24px',
padding: '8px 0',
'font-weight': '500'
});
$( '
' ).html( 'Total Records: ' + totalRecords ).appendTo( statsRow );
$( '' ).html( 'Allowed as Double Dip: ' + acceptedExclusions ).appendTo( statsRow );
$( '' ).html( 'Denied as Double Dip: ' + deniedExclusions ).appendTo( statsRow );
statsRow.appendTo( statsContainer );
if( claimData.acknowledgedDate && claimData.acknowledgedDate != "" ) {
let date = new Date(claimData.acknowledgedDate);
let formattedDate = DevExpress.localization.formatDate( date, "MMM dd, yyyy" );
$( '' ).html( '
Closed: ' + formattedDate + ' by ' + claimData.acknowledgedByName )
.appendTo( statsContainer );
}
statsContainer.appendTo( headerRow );
let hasBatchFile = typeof claimData.generatedBatchFileName === "string" && claimData.generatedBatchFileName.trim() !== "";
if( hasBatchFile ) {
let fileName = claimData.generatedBatchFileName.split(/[\\/]/).pop();
let sDownloadURL = $( "link#PortalDocRootURL" ).attr( "href" ) + "/apps/TPM/index.cfm?mode=direct&ajax=downloadBillback&bId=" + claimData.generatedBatchId + "&bType=I";
$('
').dxButton({
text: 'Download Billback File',
title: fileName,
icon: 'download',
stylingMode: 'text',
onClick: function () {
window.location.href = sDownloadURL;
}
}).appendTo( headerRow );
}
instance.claimDetailPopupContent.append( headerRow );
let claimPendingDetailDataSource = Fse.Data.newDataSource({
object: 'TPM.claimPendingDetail',
objectParams: {
claimId: claimData.claimId
},
paginate: true,
pageSize: 50,
});
instance.claimDetailRows = claimPendingDetailDataSource.items();
let gridElement = $( '
' ).css({
width: '100%',
height: '100%'
});
instance.claimDetailPopupContent.append( gridElement );
instance.claimDetailGrid = gridElement.dxDataGrid({
dataSource: claimPendingDetailDataSource,
width: '100%',
showBorders: false,
filterRow : { visible : true },
headerFilter : { visible : true },
scrolling : { mode : 'virtual' },
hoverStateEnabled: true,
columnAutoWidth: false,
allowColumnResizing: true,
onToolbarPreparing : function( e ) {
if( ! e.toolbarOptions.items ) e.toolbarOptions.items = [];
let items = e.toolbarOptions.items;
items.push({ location : "after", widget : "dxButton", options : {
hint : "Choose Columns",
icon : "columnchooser",
onClick : function( ) {
let columnChooser = new CustomDataGridColumnChooser( e.component, function() { }, true );
columnChooser.show();
}
}
});
items.push( { location: "after", widget : "dxButton", options : {
hint : "Excel Export",
icon : "export",
onClick : function( e ) {
Fse.UI.DataGridHelper.exportDataGrid( { dataGrid : instance.claimDetailGrid, fileName : "ClaimReview_Detail.xlsx" } );
}
}
});
},
//allowColumnResizing: true,
remoteOperations: { filtering: true, paging: true, sorting: true, grouping: false },
grouping: {
autoExpandAll: false
},
groupPanel: {
visible: false
},
onCellPrepared: function( e ) {
if ( e.rowType === 'group' && e.column.dataField === 'acceptAsDoubleDip') {
e.cellElement.empty();
let grid = e.component;
let allGroups = grid.getDataSource().items();
let groupKey = Array.isArray( e.key ) ? e.key[ 0 ] : e.key;
let currentGroup = allGroups.find( group => group.key === groupKey );
let isChecked = currentGroup && currentGroup.items && currentGroup.items.every( item => item.exceptionSuppressList );
$( '
' ).dxCheckBox({
value: isChecked,
disabled: isClosed || isViewOnly,
onValueChanged: function( args ) {
let items = [];
if ( Array.isArray( currentGroup.items ) && currentGroup.items.length > 0) {
items = currentGroup.items;
} else if ( Array.isArray( currentGroup.collapsedItems ) && currentGroup.collapsedItems.length > 0 ) {
items = currentGroup.collapsedItems;
}
items.forEach( function( item) {
item.exceptionSuppressList = args.value ? item.proofOfDeliveryId : null;
instance.podUpdates[ item.proofOfDeliveryId ] = {
claimId: item.claimId,
proofOfDeliveryId: item.proofOfDeliveryId,
flagComment: args.value ? item.flagComment : ""
};
});
let allChecked = items.every( item => item.exceptionSuppressList );
this.option( "value", allChecked );
currentGroup.checkedState = args.value;
grid.repaint();
}
}).appendTo( e.cellElement );
}
},
columns: [
{
dataField: 'cho_name',
caption: '1FS Company Name',
//width: 160,
},
{
dataField: 'companyName',
caption: 'Company Name',
//width: 160,
allowFiltering: false,
visible: false,
},
{
dataField: 'cho_address',
caption: '1FS Address',
//width: 120,
allowFiltering: false,
},
{
dataField: 'address',
caption: 'Address',
//width: 120,
allowFiltering: false,
visible: false,
},
{
dataField: 'cho_city',
caption: '1FS City',
//width: 100,
},
{
dataField: 'city',
caption: 'City',
//width: 100,
visible: false,
},
{
dataField: 'cho_state',
caption: '1FS State',
//width: 50,
},
{
dataField: 'state',
caption: 'State',
//width: 50,
visible: false,
},
{
dataField: 'conflictType',
caption: 'Conflict Type',
//width: 120,
/*cellTemplate: function(container, options) {
let value = options.value || "";
let color = "#555";
if (value === "Direct Agreement Conflict") {
color = "#e83e8c";
} else if (value === "GPO Overlap") {
color = "#0d6efd";
}
$("
")
.css({
color: color,
fontWeight: "600"
})
.text(value)
.appendTo(container);
}*/
},
{
dataField: 'flagComment',
caption: 'System Comment',
//width: 300,
wordWrapEnabled: true,
groupIndex: 0,
sortOrder: 'asc',
groupCellTemplate: function( container, options ) {
let text = options.value || "";
text = text.replace( /^System Comment:\s*/i, '');
$( "" )
.text( text )
.appendTo( container );
}
},
{
caption: 'SKU + Description',
calculateCellValue: function( rowData ) {
return ( rowData.itemCode || '' ) + ' - ' + ( rowData.itemDescription || '' );
},
allowFiltering: false,
visible: false,
},
{
dataField: 'itemQty',
caption: 'Double Dip Qty',
//width: 60,
dataType: 'number',
format: "#,##0.00",
allowFiltering: true,
alignment: 'right',
},
{
dataField: 'totalRebate',
caption: 'Double Dip Dollars',
//width: 100,
format: { type: 'currency', precision: 2 },
allowFiltering: true,
alignment: 'right',
},
{
dataField: 'acceptAsDoubleDip',
caption: 'Allow as Double Dip',
//width: 25,
alignment: 'center',
allowFiltering: false,
cellTemplate: function( container, options ) {
let acceptCheckbox = $( '' ).dxCheckBox({
name: 'acceptAsDoubleDip',
hint: 'Allow as Double Dip',
value: !! options.data.exceptionSuppressList,
disabled: isClosed || isViewOnly,
onValueChanged: function( e ) {
options.data.exceptionSuppressList = e.value ? options.data.proofOfDeliveryId : null;
instance.podUpdates[ options.data.proofOfDeliveryId ] = {
claimId: options.data.claimId,
proofOfDeliveryId: options.data.proofOfDeliveryId,
flagComment: e.value ? options.data.flagComment : ""
};
}
});
acceptCheckbox.appendTo( container );
}
}
],
summary: {
groupItems: [
{
column: 'itemQty',
summaryType: 'sum',
displayFormat: '{0}',
valueFormat: {
type: 'fixedPoint',
precision: 2
},
alignByColumn: true
},
{
column: 'totalRebate',
summaryType: 'sum',
valueFormat: 'currency',
displayFormat: '${0}',
valueFormat: {
type: 'fixedPoint',
precision: 2
},
alignByColumn: true
}
]
}
}).dxDataGrid( 'instance' );
}
ClaimReview.prototype.refreshKPIs = function() {
let instance = this;
instance._loadStats().done(function() {
instance.pendingCountElement.text(
DevExpress.localization.formatNumber( instance.stats.pendingCount || 0 )
);
instance.agingCountElement.text(
DevExpress.localization.formatNumber( instance.stats.agingCount || 0 )
);
instance.completionPctElement.text(
DevExpress.localization.formatNumber( instance.stats.completionPct || 0, "percent" )
);
instance.potentialRecoveryElement.text(
DevExpress.localization.formatNumber( instance.stats.potentialRecovery || 0, "currency" )
);
instance.realizedOffsetsElement.text(
DevExpress.localization.formatNumber( instance.stats.realizedOffsets || 0, "currency" )
);
instance.realizedOffsetsSubElement.text(
"MTD: " +
DevExpress.localization.formatNumber( instance.stats.realizedOffsetsMTD || 0, "currency" ) +
" | YTD: " +
DevExpress.localization.formatNumber( instance.stats.realizedOffsetsYTD || 0, "currency" )
);
});
}
ClaimReview.prototype.getObjectParams = function() {
let instance = this;
let parameters = {};
let claimPendingStatus = instance.claimStatusSelectBox.option( 'value' );
let claimPendingOperator = instance.operatorSelectBox.option( 'value' );
let claimStartDate = instance.claimStartDateBox.option( 'value' );
let claimEndDate = instance.claimEndDateBox.option( 'value' );
if( claimPendingStatus ) {
parameters.claimPendingStatus = claimPendingStatus;
}
if( claimPendingOperator ) {
parameters.claimPendingOperator = claimPendingOperator;
}
if( claimStartDate ) {
parameters.claimStartDate = claimStartDate;
}
if( claimEndDate ) {
parameters.claimEndDate = claimEndDate;
}
return parameters;
}