Sunday, February 11, 2018

Add custom fields in email to print mgmt settings PrintMgmtPrintDestinationTokens

To add custom fields like the image below, get to the PrintMgmtPrintDestinationTokens class and make the following modifications


PrintMgmtPrintDestinationTokens classDeclaration - add the following code (in red) to ClassDeclaration
[SrsPrintDestinationTokensExtAttribute('PrintMgmt')]
class PrintMgmtPrintDestinationTokens extends SrsPrintDestinationTokens
{
    Common jour;
    PrintMgmtDocType docType;
    container validTokens;

    SysLookupMultiSelectCtrl printMgmtMultiSelect;
    FormStringControl printMgmtCtl;
    FormCheckBoxControl printMgmtCheckBox;

    // Custom token for line manager
    FormCheckBoxControl lineMgrCheckBox;
    #define.LineMgrToken('@LineMgr@')
    #define.LineMgrTokenName('LineMgr')
}

PrintMgmtPrintDestinationTokens.addUICtls - add the following code (in red) to
protected void addUICtls(FormGroupControl _group)
{
    .
    .
    .
    printMgmtCheckBox = _group.addControl(FormControlType::CheckBox, 'PrintMgmtPrintDestinationPrimary');
    printMgmtCheckBox.widthMode(FormWidth::ColumnWidth);
    printMgmtCheckBox.label(partyType == PrintMgmtPrintDestinationPartyType::Unknown ?
            "@SYS316632" :
            strFmt("@SYS4004929", partyType));

    if (partyType == PrintMgmtPrintDestinationPartyType::Worker)//the condition for the new field based on party type or could even be document type
    {
        lineMgrCheckBox = _group.addControl(FormControlType::CheckBox, 'PrintMgmtPrintDestinationLineMgr');
        lineMgrCheckBox.widthMode(FormWidth::ColumnWidth);
        lineMgrCheckBox.label(strFmt("@SYS4004929", "@LABEL"));
    }
    .
    .
}


PrintMgmtPrintDestinationTokens.expandEmailToken- add the following code (in red) to expandEmailToken (screenshot here to keep things clear)

As you can see, a new method getHCMWorkerLineMgrEmail is defined here, this will let print mgmt settings know which email address to pick, so lets define that
protected str getHcmWorkerLineMgrEmail(Common _jour)
{
    PrintMgmtPrintDestinationPartyType  partyType;
    CustVendAC                          ac;
    str                                 addresses;
    HcmWorker                           hcmWorker, hcmWorkerMgr;
    HcmPositionRecId                    workerPositionRecId;

    [partyType, ac] = docType.getDestinationPartyTypeAndIdExt(_jour);//to get the party type in this class
    if (partyType == PrintMgmtPrintDestinationPartyType::Worker)
    {
        hcmWorker = HcmWorker::findByPersonnelNumber(ac);//to get the personnel number ac is defined above
        if (hcmWorker)
        {
            // Get worker's line manager
            workerPositionRecId = HcmWorker::getPrimaryPosition(hcmWorker.RecId);

            hcmWorkerMgr = ConcurExpWorkerFileWriter::findWorkerLineManager(workerPositionRecId);
            if (hcmWorkerMgr)
            {
                addresses = this.getEmailAddressForParty(partyType, hcmWorkerMgr.Person, '');
            }
        }
    }

    return addresses;
}
PrintMgmtPrintDestinationTokens.getUIAddresses- add the following code (in red)
public str getUIAddresses()
{
    str addresses = this.makeAddressTokens(printMgmtCtl.text());

    if(printMgmtCheckBox.checked())
    {
        addresses = this.appendAddresses(addresses, this.emptyToken());
    }

    if (lineMgrCheckBox)
    {
        if(lineMgrCheckBox.checked())
        {
            addresses = this.appendAddresses(addresses, #LineMgrToken);
        }
    }

    return this.appendAddresses(addresses, nextTokens ? nextTokens.getUIAddresses() : '');
}

Override the PrintMgmtPrintDestinationTokens.parseAddress as that is picked up from the parent class SrsPrintDestinationTokens and make sure it accommodates for our new tokens. This was completely non intuitive and most things had to be specified only here which do not exist in the parent class.
// Parse custom line manager token, to split from standard otherAddress (3rd element) to customToken (4rd element)
protected container parseAddresses(str _addresses, container _availableTokens)
{
    container       availableAddresses;
    str             otherAddresses;
    List            otherAddressesTokens;
    ListEnumerator  listEnum;
    List            customTokenList = new List(Types::String);
    List            otherAddressesList = new List(Types::String);
    str             sep = this.parmAddressSeparator();

    availableAddresses = super(_addresses, _availableTokens);

    otherAddresses = conPeek(availableAddresses, 3);
    otherAddressesTokens = strSplit(otherAddresses, this.parmAddressSeparator());
    listEnum = otherAddressesTokens.getEnumerator();

    while (listEnum.moveNext())
    {
        if (listEnum.current() == #LineMgrToken)
        {
            customTokenList.addEnd(listEnum.current());
        }
        else
        {
            otherAddressesList.addEnd(listEnum.current());
        }
    }

    return [conPeek(availableAddresses, 1), conPeek(availableAddresses, 2), SrsPrintDestinationTokens::list2Str(otherAddressesList, sep), SrsPrintDestinationTokens::list2Str(customTokenList, sep)];
}

The last method you need to modify is setUIAddresses. Just added the lines in red in the method
protected void setUIAddresses(str _addresses)
{
    container availableAddresses = this.parseAddresses(_addresses, conPeek(validTokens, 2));

    // We handle @token@ and @@ so pass the rest to super for further processing
    if(nextTokens)
    {
        nextTokens.setUIAddresses(conPeek(availableAddresses, 3));
    }

    printMgmtMultiSelect.set(this.selectTokens(conPeek(availableAddresses, 1), validTokens));
    printMgmtCtl.text(conPeek(availableAddresses, 1));
    printMgmtCheckBox.value(conPeek(availableAddresses, 2) != '');

    if (lineMgrCheckBox)
    {
        lineMgrCheckBox.value(conPeek(availableAddresses, 4) != '');
    }
}

These are the only changes I made to display the businesslineMgr in the window and picking up the manager's email whenever an email is sent to a subordinate.

So, the following methods were modified (and added) to make it work. I am also attaching the whole file here for easy reference.






No comments:

Post a Comment