Untitled

 avatar
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