Untitled
unknown
plain_text
19 days ago
8.7 kB
4
Indexable
var ACWAPP = ACWAPP || {};
ACWAPP.AwardAmount = (function () {
const SUBGRID_NAME = "RelatedCaseRef";
const AMOUNT_FIELD = "acwapp_amountofrewardgrantedtoeachinformant";
const CONFIG_TABLE = "acwapp_awardconfiguration";
const CONFIG_AMOUNT_FIELD = "acwapp_totalawardamount";
const AWARD_RESULT_FIELD = "acwapp_awardresult";
const APPROVED_VALUE = 100000000;
const REJECTED_VALUE = 100000001;
const REQUIRE_FIELDS_WHEN_APPROVED = [
"acwapp_amountofrewardgrantedtoeachinformant",
"acwapp_awardamountapproval"
];
const LOCK_FIELDS_WHEN_REJECTED = [
"acwapp_amountofrewardgrantedtoeachinformant",
"acwapp_awardamountapproval"
];
const ALLEGATION_STATUS_FIELD = "acwapp_allegationstatus";
const REVIEW_SUBMIT_DATE_FIELD = "acwapp_reviewsubmitteddate";
const REVIEW_STATUS = 100000001;
const RESULT_STATUS = 100000002;
// New const
const ALLEGATION_ENTITY = "acwapp_suspectedabuse";
const ALLEGATION_CASE_LOOKUP = "acwapp_abusecase";
const DATE_ISSUANCE_NTQ_FIELD = "acwapp_dateofissuanceofntq";
const DATE_ACTUAL_TERMINATION_FIELD = "acwapp_dateofactualterminationoftenancy";
const ACTIONS_FOR_SUGGESTED_TENANCY_FIELD = "acwapp_actionsforsuggestedtenancy";
const REASON_NO_TENANCY_ACTION_FIELD = "acwapp_reasonofnotenancyactionrequired";
const ACTION_ISSUANCE_OF_NTQ = 100000000;
const ACTION_FLAT_RETURNED_BEFORE_NTQ = 100000001;
const ACTION_FLAT_RETURNED_BEFORE_ACTION_TAKEN = 100000003;
const REASON_FLAT_RETURNED_DURING_INVESTIGATION = 100000002;
function OnSave(executionContext) {
const formContext = executionContext.getFormContext();
setReviewSubmittedDate(formContext);
}
function OnLoad(executionContext) {
const formContext = executionContext.getFormContext();
lockFieldsIfRejected(formContext);
requireFieldsIfApproved(formContext);
handleTenancyDateFields(formContext);
window.setTimeout(function () {
validateAmount(formContext);
registerSubgridOnLoad(formContext);
}, 1000);
}
function OnAmountChange(executionContext) {
const formContext = executionContext.getFormContext();
validateAmount(formContext);
}
function registerSubgridOnLoad(formContext) {
const subgrid = formContext.getControl(SUBGRID_NAME);
if (subgrid && !subgrid._awardAmountRegistered) {
subgrid.addOnLoad(function () {
validateAmount(formContext);
});
subgrid._awardAmountRegistered = true;
}
}
async function getTotalAwardAmount() {
const result = await Xrm.WebApi.retrieveMultipleRecords(
CONFIG_TABLE,
"?$select=" + CONFIG_AMOUNT_FIELD + "&$filter=statecode eq 0&$top=1"
);
if (!result.entities || result.entities.length === 0) {
return null;
}
return result.entities[0][CONFIG_AMOUNT_FIELD];
}
async function validateAmount(formContext) {
const subgrid = formContext.getControl(SUBGRID_NAME);
const amountAttr = formContext.getAttribute(AMOUNT_FIELD);
const amountCtrl = formContext.getControl(AMOUNT_FIELD);
if (!subgrid || !amountAttr || !amountCtrl) return;
const grid = subgrid.getGrid();
if (!grid) return;
const rowCount = grid.getTotalRecordCount();
amountCtrl.clearNotification("amount_limit");
if (rowCount <= 0) return;
const totalAmount = await getTotalAwardAmount();
if (totalAmount === null) {
amountCtrl.setNotification(
"Award configuration is missing. Please contact an administrator.",
"amount_limit"
);
return;
}
const perRowAmount = totalAmount / rowCount;
const currentAmount = amountAttr.getValue();
if (currentAmount !== null && currentAmount > perRowAmount) {
amountCtrl.setNotification(
"Amount cannot exceed " + perRowAmount + ".",
"amount_limit"
);
}
}
function lockFieldsIfRejected(formContext) {
const awardResultAttr = formContext.getAttribute(AWARD_RESULT_FIELD);
if (!awardResultAttr) return;
const isRejected = awardResultAttr.getValue() === REJECTED_VALUE;
LOCK_FIELDS_WHEN_REJECTED.forEach(function (fieldName) {
const control = formContext.getControl(fieldName);
if (control) {
control.setDisabled(isRejected);
}
});
}
function requireFieldsIfApproved(formContext) {
const awardResultAttr = formContext.getAttribute(AWARD_RESULT_FIELD);
if (!awardResultAttr) return;
const isApproved = awardResultAttr.getValue() === APPROVED_VALUE;
REQUIRE_FIELDS_WHEN_APPROVED.forEach(function (fieldName) {
const attr = formContext.getAttribute(fieldName);
if (attr) {
attr.setRequiredLevel(isApproved ? "required" : "none");
}
});
}
function OnAwardResultChange(executionContext) {
const formContext = executionContext.getFormContext();
lockFieldsIfRejected(formContext);
requireFieldsIfApproved(formContext);
}
function setReviewSubmittedDate(formContext) {
const statusAttr = formContext.getAttribute(ALLEGATION_STATUS_FIELD);
const submitDateAttr = formContext.getAttribute(REVIEW_SUBMIT_DATE_FIELD);
if (!statusAttr || !submitDateAttr) return;
const currentStatus = statusAttr.getValue();
const currentDate = submitDateAttr.getValue();
if (currentStatus === RESULT_STATUS && !currentDate) {
submitDateAttr.setValue(new Date());
}
if (currentStatus === REVIEW_STATUS) {
submitDateAttr.setValue(null);
}
}
async function fetchAllegations(caseId) {
const fetchXml = `
<fetch>
<entity name="${ALLEGATION_ENTITY}">
<attribute name="${ACTIONS_FOR_SUGGESTED_TENANCY_FIELD}" />
<attribute name="${REASON_NO_TENANCY_ACTION_FIELD}" />
<filter>
<condition attribute="${ALLEGATION_CASE_LOOKUP}"
operator="eq"
value="${caseId}" />
</filter>
</entity>
</fetch>`;
try {
const result = await Xrm.WebApi.retrieveMultipleRecords(
ALLEGATION_ENTITY,
"?fetchXml=" + encodeURIComponent(fetchXml)
);
return result.entities || [];
} catch (e) {
console.error("Error fetching Allegations:", e);
return [];
}
}
function setVisibleAndRequired(formContext, fieldName, required) {
const attr = formContext.getAttribute(fieldName);
const ctrl = formContext.getControl(fieldName);
if (ctrl) {
ctrl.setVisible(required);
}
if (attr) {
attr.setRequiredLevel(required ? "required" : "none");
}
}
async function handleTenancyDateFields(formContext) {
const caseIdRaw = formContext.data.entity.getId();
if (!caseIdRaw) return;
const caseId = caseIdRaw.replace(/[{}]/g, "");
const allegations = await fetchAllegations(caseId);
const showIssuanceNTQ = allegations.some(function (a) {
return a[ACTIONS_FOR_SUGGESTED_TENANCY_FIELD] === ACTION_ISSUANCE_OF_NTQ;
});
const showActualTermination = allegations.some(function (a) {
return (
a[ACTIONS_FOR_SUGGESTED_TENANCY_FIELD] === ACTION_FLAT_RETURNED_BEFORE_NTQ ||
a[ACTIONS_FOR_SUGGESTED_TENANCY_FIELD] === ACTION_FLAT_RETURNED_BEFORE_ACTION_TAKEN ||
a[REASON_NO_TENANCY_ACTION_FIELD] === REASON_FLAT_RETURNED_DURING_INVESTIGATION
);
});
setVisibleAndRequired(formContext, DATE_ISSUANCE_NTQ_FIELD, showIssuanceNTQ);
setVisibleAndRequired(formContext, DATE_ACTUAL_TERMINATION_FIELD, showActualTermination);
}
return {
OnSave: OnSave,
OnLoad: OnLoad,
OnAmountChange: OnAmountChange,
OnAwardResultChange: OnAwardResultChange
};
})();Editor is loading...
Leave a Comment