DSS Util d365fo x++

 DSS Util d365fo x++

Code:

using System.Globalization;

class DSSUtil
{
    private static DSSUtil utilObject;



    public static DSSUtil construct()
    {
        if(!utilObject)
        {
            utilObject = new DSSUtil();
        }
        return utilObject;
    }

    public str getNumberSequence(ExtendedTypeId _edt)
    {
        str                     numberSequenceID;
        SysLastValue            sysLastValue;
        NumberSequenceReference numberSequenceReference = NumberSeqReference::findReference(_edt);
        NumberSequenceTable     numberSequenceTable     = NumberSequenceTable::find(numberSequenceReference.NumberSequenceId);

        if (numberSequenceReference && numberSequenceTable)
        {
            if(!numberSequenceTable.Manual)
            {
                NumberSeq numberSeq = NumberSeq::newGetNumFromId(numberSequenceTable.RecId,true,true,sysLastValue,false);
                numberSequenceID    = (numberSeq) ? numberSeq.num() : '';
            }
        }
        return numberSequenceID;
    }

    public str getNumberSequenceValueFromTableField(RefTableId tableId, RefFieldId fieldId)
    {
        str numberSequenceValue;

        if(tableId && fieldId)
        {
            SysDictTable    dictTable   = new SysDictTable(tableId);
            SysDictField    dictField   = dictTable.fieldObject(fieldId);
            numberSequenceValue = this.getNumberSequence(dictField.typeId());
        }

        return numberSequenceValue;
    }

    public str getInfoLog()
    {
        str error;
        Exception exception;
        SysInfologEnumerator enumerator;
        SysInfologMessageStruct msgStruct;

        enumerator = SysInfologEnumerator::newData(infolog.cut());

        while (enumerator.moveNext())
        {
            msgStruct = new SysInfologMessageStruct(enumerator.currentMessage());
            exception = enumerator.currentException();
            error = strfmt("%1 %2", error, msgStruct.message());
        }

        return error;
    }

    public Common findRecord(TableId _tableId, RecId _recId, Boolean _forUpdate = false, boolean _crossCompany = false)
    {
        Common      common;
        DictTable   dictTable;
        ;

        if(_tableId && _recId)
        {
            dictTable = new DictTable(_tableId);
            common = dictTable.makeRecord();
 
            common.selectForUpdate(_forUpdate);
 
            if(_crossCompany)
            {
                select firstonly crosscompany common where common.RecId == _recId;
            }
            else
            {
                select firstonly common where common.RecId == _recId;
            }
        }
        
        return common;
    }

    public List stringLookupValues(RefTableId _tableId, RefFieldId _fieldId, str _filterField, System.Object _filterValue, str _orderByField)
    {
        str         filterField;
        str         orderBy;
        List        stringValues;
        Common      tableBuffer;
        DictTable   dictTable;
        TableId     tableId;
        FieldId     fieldId;
        System.Object           filterValue;
        SysDaQueryObject        sysDaQuery;
        SysDaSearchObject       searchObject;
        SysDaSearchStatement    searchStmt;
        ;

        try
        {
            filterField = _filterField;
            filterValue = _filterValue;
            orderBy     = _orderByField;
            tableId     = _tableId;
            fieldId     = _fieldId;
            stringValues= new List(Types::String);
            dictTable   = new DictTable(tableId);
            tableBuffer = dictTable.makeRecord();
            sysDaQuery  = new SysDaQueryObject(tableBuffer);
            searchStmt  = new SysDaSearchStatement();
            
            sysDaQuery.projection().add(fieldId2Name(tableId, fieldId));

            if(filterField && filterValue)
                sysDaQuery.whereClause(new SysDaEqualsExpression (new SysDaFieldExpression(tableBuffer, filterField), new SysDaValueExpression(filterValue)));

            if(orderBy)
                sysDaQuery.orderByClause().add(orderBy);

            searchObject = new SysDaSearchObject(sysDaQuery);

            while (searchStmt.nextRecord(searchObject))
            {
                stringValues.addEnd(tableBuffer.(fieldId));
            }
            
        }
        catch
        {
        }

        return stringValues;
    }

    anytype getFirstValueFromList(List list)
    {
        anytype value;
        ListEnumerator enumerator;
        ;

        if(list != null)
        {
            enumerator = list.getEnumerator();

            while(enumerator.moveNext())
            {
                value = enumerator.current();
                break;
            }
        }
        return value;
    }

    List getEnumValues(EnumId _enumId)
    {
        List enumValuesList = new List(Types::String);
        SysDictEnum SysDictEnum = new SysDictEnum(_enumId);
        
        for (int i=0; i<SysDictEnum.values(); i++)
        {
            enumValuesList.addEnd(SysDictEnum.index2Label(i));
        }
        return enumValuesList;
    }

    EnumId getEnumIdFromTableFieldId(RefTableId tableId, RefFieldId fieldId)
    {
        EnumId          enumId;
        SysDictTable    dictTable;
        SysDictField    dictField;

        if(tableId && fieldId)
        {
            dictTable   = new SysDictTable(tableId);
            dictField   = dictTable.fieldObject(fieldId);
            enumId      = dictField.enumId();
        }

        return enumId;
    }

    List getEnumValuesFromField(RefTableId tableId, RefFieldId fieldId)
    {
        return this.getEnumValues(this.getEnumIdFromTableFieldId(tableId, fieldId));
    }

    List getSupportedEnumValuesFromField(Common _common, RefFieldId _fieldId)
    {
        List supportedEnumValues = new List(Types::String);
        boolean hasGetSupportedEnumValues;
        IdentifierName methodName;
        
        methodName = 'getSupportedEnumValues';

        if(_common)
        {
            SysDictTable dictTable = new SysDictTable(_common.TableId);
            hasGetSupportedEnumValues = SysDictTable::hasMethod(dictTable, methodName);

            if(hasGetSupportedEnumValues)
            {
                Set supportedEnumValueSet = dictTable.callObject(methodName, _common, _fieldId);

                if(supportedEnumValueSet)
                {
                    SetEnumerator setEnumerator = supportedEnumValueSet.getEnumerator();
                    //SysDictEnum sysDictEnum = new SysDictEnum(this.getEnumIdFromTableFieldId(_common.TableId, _fieldId));
                    while (setEnumerator.moveNext())
                    {
                        supportedEnumValues.addEnd(enum2Str(setEnumerator.current()));
                    }
                }
            }
        }

        return supportedEnumValues;
    }

    str getImageAsBase64(Bitmap _image)
    {
        Image imgObj;
        BinData bd;
        str result;

        if (_image)
        {
            imgObj = new Image(_image);
            imgObj.saveType(ImageSaveType::PNG);

            bd = new BinData();
            bd.setData(imgObj.getData());
            result = bd.base64Encode();
        }
        else
        {
            result = "";
        }
        return result;
    }

    str str2Base64(str _text)
    {
        BinData binData  = new BinData();
        System.Text.Encoding encoding = System.Text.Encoding::UTF8;
        System.Byte[] array = encoding.GetBytes(_text);
        System.IO.MemoryStream stream = new System.IO.MemoryStream(array);
        binData.setData(Binary::constructFromMemoryStream(stream).getContainer());
        return binData.base64Encode();
    }

    //str base642Str(str _base64)
    //{
    //    BinData binData = BinData::loadFromBase64(_base64Data);
    //    binData.get
    //}

    container getBase64AsImage(str _base64Data)
    {
        return BinData::loadFromBase64(_base64Data);
    }

    public void refreshDataSource(FormDataSource _fds)
    {
        FormDataSource fds;
        ;

        fds = _fds;

        if(fds)
        {
            fds.refresh();
            fds.reread();
            fds.research(true);
        }
    }

    public boolean isValidToSubmit(Common _common)
    {
        boolean ret = true;
        SysDictTable dictTable;
        RefTableId tableId;
        RefRecId recId;
        boolean hasValidToSubmitMethod;
        IdentifierName methodName;
        DictTable dt;
        ;

        methodName = 'isValidToSubmit';

        if(_common)
        {
            tableId = _common.TableId;
            recId = _common.RecId;
            dictTable = new SysDictTable(tableId);
            hasValidToSubmitMethod = SysDictTable::hasMethod(dictTable, methodName);

            if(hasValidToSubmitMethod)
            {
                ret = dictTable.callObject(methodName, _common);
            }
        }

        return ret;
    }

    public boolean callIsValidToApprove(Common _common)
    {
        boolean ret = true;
        SysDictTable dictTable;
        RefTableId tableId;
        RefRecId recId;
        boolean hasValidToSubmitMethod;
        IdentifierName methodName;
        DictTable dt;
        ;

        methodName = 'isValidToApprove';

        if(_common)
        {
            tableId = _common.TableId;
            recId = _common.RecId;
            dictTable = new SysDictTable(tableId);
            hasValidToSubmitMethod = SysDictTable::hasMethod(dictTable, methodName);

            if(hasValidToSubmitMethod)
            {
                ret = dictTable.callObject(methodName, _common);
            }
        }

        return ret;
    }

    public void callOnEditFormActivated(Common _common)
    {
        SysDictTable dictTable;
        RefTableId tableId;
        RefRecId recId;
        boolean hasOnEditFormActivated;
        IdentifierName methodName;
        DictTable dt;
        ;

        methodName = 'onEditFormActivated';

        if(_common)
        {
            tableId = _common.TableId;
            recId = _common.RecId;
            dictTable = new SysDictTable(tableId);
            hasOnEditFormActivated = SysDictTable::hasMethod(dictTable, methodName);

            if(hasOnEditFormActivated)
            {
                dictTable.callObject(methodName, _common);
            }
        }
    }

    public void setRecordUserScope(Common _common, UserId _userId)
    {
        str scope = strFmt('CurrentUserScope-%1-%2', _common.TableId, _common.RecId);
        container key = ['User'];
        
        new SysGlobalObjectCache().insert(scope, key, [_userId]);
    }

    public void removeRecordUserScope(Common _common)
    {
        str scope = strFmt('CurrentUserScope-%1-%2', _common.TableId, _common.RecId);
        container key = ['User'];

        new SysGlobalObjectCache().remove(scope, key);
    }

    public void callOnEditFormActivatedForUser(Common _common, UserId _userId)
    {   
        this.setRecordUserScope(_common, _userId);

        this.callOnEditFormActivated(_common);

        this.removeRecordUserScope(_common);
    }

    public boolean callOnViewFormActivated(Common _common)
    {
        SysDictTable dictTable;
        RefTableId tableId;
        RefRecId recId;
        boolean hasOnViewFormActivated;
        IdentifierName methodName;
        DictTable dt;
        ;

        methodName = 'onViewFormActivated';

        if(_common)
        {
            tableId = _common.TableId;
            recId = _common.RecId;
            dictTable = new SysDictTable(tableId);
            hasOnViewFormActivated = SysDictTable::hasMethod(dictTable, methodName);

            if(hasOnViewFormActivated)
            {
                dictTable.callObject(methodName, _common);
            }
        }

        return hasOnViewFormActivated;
    }

    public boolean isEditableForUser(Common _common, DSSUserId _userId)
    {
        boolean ret;

        this.setRecordUserScope(_common, _userId);

        ret = this.isEditable(_common);

        this.removeRecordUserScope(_common);

        return ret;
    }

    private boolean isEditable(Common _common)
    {
        boolean ret;
        SysDictTable dictTable;
        RefTableId tableId;
        RefRecId recId;
        boolean hasMethod;
        IdentifierName methodName;
        DictTable dt;
        ;

        methodName = 'isEditable';

        if(_common.TableId)
        {
            tableId = _common.TableId;
            recId = _common.RecId;
            dictTable = new SysDictTable(tableId);
            hasMethod = SysDictTable::hasMethod(dictTable, methodName);

            if(hasMethod)
            {
                ret = dictTable.callObject(methodName, _common);
            }
        }

        return ret;
    }

    public RefRecId getRecId(Common _common)
    {
        RefRecId ret;
        SysDictTable dictTable;
        boolean hasMethod;
        RefTableId tableId;
        IdentifierName methodName;
        ;

        methodName = 'getRecId';

        if(_common)
        {
            tableId = _common.TableId;
            dictTable = new SysDictTable(tableId);
            hasMethod = SysDictTable::hasMethod(dictTable, methodName);

            if(hasMethod)
            {
                ret = dictTable.callObject(methodName, _common);
            }
        }

        if(!ret)
            ret = _common.RecId;

        return ret;
    }

    public DSSRefTableId getTableId(Common _common)
    {
        DSSRefTableId ret;
        SysDictTable dictTable;
        boolean hasMethod;
        RefTableId tableId;
        IdentifierName methodName;
        ;

        methodName = 'getTableId';

        if(_common)
        {
            tableId = _common.TableId;
            dictTable = new SysDictTable(tableId);
            hasMethod = SysDictTable::hasMethod(dictTable, methodName);

            if(hasMethod)
            {
                ret = dictTable.callObject(methodName, _common);
            }
        }

        if(!ret)
            ret = tableId;

        return ret;
    }

    List getFieldGroupFieldList(TableId _tableId, str _fieldGroupName)
    {
        List fieldList;
        TableId tableId;
        FieldId fieldId;
        str fieldGroupName;
        DictTable dictTable;
        DictFieldGroup fieldGroup;
        ;

        fieldList = new List(Types::Integer);
        tableId = _tableId;
        fieldGroupName = _fieldGroupName;

        dictTable = new SysDictTable(tableId);
        fieldGroup = new DictFieldGroup(tableId, fieldGroupName);

        for (int i = 1; i <= fieldGroup.numberOfFields(); i++)
        {
            if (fieldGroup && fieldGroup.numberOfFields())
            {
                fieldId = fieldGroup.field(i);
                if(fieldId)
                {
                    fieldList.addEnd(fieldId);
                }
            }
        }

        return fieldList;
    }

    List getTableFieldGroupLookupFieldContractList(TableId _tableId, str _fieldGroupName)
    {
        List selectionList;
        TableId tableId;
        FieldId fieldId;
        str fieldGroupName;
        DictTable dictTable;
        DictFieldGroup fieldGroup;
        DSSLookupFieldContract fieldContract;
        ;

        selectionList = new List(Types::Class);
        tableId = _tableId;
        fieldGroupName = _fieldGroupName;

        dictTable = new SysDictTable(tableId);
        fieldGroup = new DictFieldGroup(tableId, fieldGroupName);

        for (int i = 1; i <= fieldGroup.numberOfFields(); i++)
        {
            fieldContract = new DSSLookupFieldContract();
            DictField dictField = dictTable.fieldObject(fieldGroup.field(i));
            
            if (fieldGroup.methodName(fieldGroup.field(i)))
            {
                MethodName methodName = fieldGroup.methodName(fieldGroup.field(i));
                
                fieldContract.parmFieldId(0);
                fieldContract.parmLabel(methodName);
                fieldContract.parmMethodName(methodName);
                fieldContract.parmReferenceType(DSSReferenceType::Method);
            }
            else if (dictField)
            {
                fieldId = fieldGroup.field(i);

                fieldContract.parmFieldId(fieldId);
                fieldContract.parmLabel(dictField.label());
                fieldContract.parmMethodName('');
                fieldContract.parmReferenceType(DSSReferenceType::Field);
            }

            selectionList.addEnd(fieldContract);
        }

        return selectionList;
    }

    internal str encrypt(str _txtToEncrypt)
    {
        return AdBaseCryptography_Rijndael::construct().encrypt(_txtToEncrypt);
    }

    internal str decrypt(str _encryptedString)
    {        
        return AdBaseCryptography_Rijndael::construct().decrypt(_encryptedString);
    }

    public void refreshCaller(FormRun _fRun)
    {
        FormRun callerForm;
        ;

        callerForm = _fRun.args().caller();

        if(callerForm)
        {
            this.refreshForm(callerForm);
        }
    }

    public void refreshForm(FormRun _fRun)
    {
        FormDataSource fds;
        ;

        fds = _fRun.dataSource();

        this.refreshDataSource(fds);
    }

    public str generateRandomString(int _stringLength = 8)
    {
        int i;
        str randomString;
        RandomGenerate random = new RandomGenerate();

        for (i=1; i<= _stringLength; i++)
        {
            if (i mod 3)
            randomString += num2char(random.randomInt(char2num('a', 1), char2num('z', 1)));
            else
            randomString += num2char(random.randomInt(char2num('0', 1), char2num('9', 1)));
        }

        return randomString;
    }

    public boolean validatePassword(DSSPassword _password)
    {
        int MIN_LENGTH = 8;
        int MAX_LENGTH = 100;
        int passwordLength;
        DSSPassword password;
        boolean result;
        ;
        
        password = _password;
        passwordLength = strLen(password);
        result = (passwordLength >= MIN_LENGTH) ? true : false;

        this.throwError(!result, strFmt("@DSSLabel:DSS000075", MIN_LENGTH));

        result = (passwordLength <= MAX_LENGTH) ? true : false;
        
        this.throwError(!result, strFmt("@DSSLabel:DSS000076", MAX_LENGTH));
        
        return result;
    }

    public void showWarning(boolean _show, str _warning)
    {
        if(_show)
            warning(_warning);
    }

    public void showError(boolean _show, str _error)
    {
        if(_show)
            error(_error);
    }

    public void throwError(boolean _throw, str _error)
    {
        if(_throw)
            throw error(_error);
    }

    public str getRecordTitleFields(Common _record)
    {
        str title1;
        str title2;
        str recordTitle;
        ;

        title1 = this.getRecordTitleField(_record);
        title2 = this.getRecordTitleField(_record, false);
        title2 = (title1 && title2) ? strFmt(' - %1', title2) : title2;
        recordTitle = strFmt('%1%2', title1, title2);
        return recordTitle;
    }

    public str getRecordTitleField(Common _record, boolean _getFirst = true)
    {
        DictTable dictTable;
        Common record;
        TableId tableId;
        FieldId titleFieldId;
        str titleFieldValue;
        ;

        record = _record;
        tableId = record.TableId;

        if(record && tableId)
        {
            dictTable = new SysDictTable(tableId);
            titleFieldId = (_getFirst) ? dictTable.titleField1() : dictTable.titleField2();
            titleFieldValue = (titleFieldId) ? record.(titleFieldId) : '';
        }

        return titleFieldValue;
        
    }

    public DSSUserId getEmployeeUserId(DSSEmployeeId _employeeId)
    {
        HcmWorker worker;
        DirPersonUser personUser;
        UserId  userId;
        HcmPersonnelNumberId personnelNumberId;
        ;

        personnelNumberId = _employeeId;

        // Verify selected worker has user attached
        if(personnelNumberId)
        {
            select firstonly1 User
                from personUser
                join worker
                where personUser.PersonParty == worker.Person
                && worker.PersonnelNumber == personnelNumberId;

            userId = personUser.User;
        }

        return userId;
    }

    public int getRandomIntColor()
    {
        int MAX_COLOR = 16777216;
        int MID_COLOR = MAX_COLOR / 2;
        int START_FROM = 100;

        return RandomGenerate::construct().randomInt(START_FROM, MID_COLOR);
    }

    public int hex2ColorInt(str _hex)
    {
        int colorInt;
        int rValue, gValue, bValue;

        if(match('[A-F0-9]',_hex))
        {
            rValue  = hex2Int(subStr(_hex, 0, 2));
            gValue  = hex2Int(subStr(_hex, 3, 2));
            bValue  = hex2Int(subStr(_hex, 5, 2));
            colorInt= WinAPI::RGB2int(rValue, gValue, bValue);
        }

        return colorInt;
    }

    private str intColor2Hex(int _color)
    {
        container colorcon;
        str colorhex;
        ;
        colorcon=WinApi::RGBint2Con(_color);
        colorhex=Global::int2Hex(conpeek(colorcon,1),2);
        colorhex+=Global::int2Hex(conpeek(colorcon,2),2);
        colorhex+=Global::int2Hex(conpeek(colorcon,3),2);
        
        return colorhex;
    }

    public str getRamdomColorHex()
    {
        return this.intColor2Hex(this.getRandomIntColor());
    }

    public System.IO.MemoryStream getStreamFromContainer(container _c)
    {
        System.IO.MemoryStream stream = Binary::constructFromContainer(_c).getMemoryStream();
        return stream;
    }

    public container getContainerFromStream(System.IO.MemoryStream _memoryStream)
    {
        return Binary::constructFromMemoryStream(_memoryStream).getContainer();
    }

    public List map2List(Map map)
    {
        List list;

        if(map)
        {
            MapEnumerator enumerator = map.getEnumerator();
            list = new List(map.valueType());
            while(enumerator.moveNext())
            {
                list.addEnd(enumerator.currentValue());
            }
        }
        return list;
    }

    public str dateToStringWithFormat(date _date, str _format)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        
        System.DateTime dateTime = _date;
        return dateTime.ToString(_format);
    }

    public str dateToStringForLocale(date _date, str _locale)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        
        System.DateTime dateTime = _date;
        return dateTime.ToString('d', this.getDateTimeFormatInfoFromLocale(_locale));
    }

    public str dateTimeToStringForLocaleAndTimeZone(utcdatetime _dateTime, str _locale, Timezone _timeZone)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        
        System.DateTime dateTime = DateTimeUtil::applyTimeZoneOffset(_dateTime,_timeZone);
        return dateTime.ToString('g', this.getDateTimeFormatInfoFromLocale(_locale));
    }

    public str dateTimeToUTCDateTimeString(utcdatetime _dateTime, Timezone _timeZone)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        
        System.DateTime dateTime = DateTimeUtil::applyTimeZoneOffset(_dateTime,_timeZone);
        return dateTime.ToString('u');
    }

    public str timeToString(int _time)
    {
        str timeString;
        ;
       
        timeString = time2StrHMLeadingZero(_time);

        return timeString;
    }

    public TempStr time2StrAMPM(int timE)
    {
        str hourStr;
        str minuteStr;
        str amPmStr;

        int hour = timE / 3600;
        int minute = (timE mod 3600) / 60;

        if (hour >= 12)
        {
            amPmStr = "PM";
            if (hour > 12)
            {
                hour -= 12;
            }
        }
        else
        {
            amPmStr = "AM";
            if (hour == 0)
            {
                hour = 12;
            }
        }

        hourStr = num2str(hour, 2, 0, 0, 0);
        hourStr = strReplace(hourStr, ' ', '0');
        minuteStr = num2Str0(minute, 2, 0, 0, 0);

        return hourStr + ':' + minuteStr + ' ' + amPmStr;
    }

    public date stringToDateWithFormat(str _dateStr, str _format)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();

        const DateTimeStyles dateTimeStyles =
            DateTimeStyles::NoCurrentDateDefault
            | DateTimeStyles::AllowLeadingWhite
            | DateTimeStyles::AllowTrailingWhite;

        System.DateTime dateTime;
        boolean valid = System.DateTime::TryParse(_dateStr, byref dateTime);
        
        if (valid)
        {
            dateTime = dateTime.get_Date();
        }
        else
        {
            System.DateTime minDate = System.DateTime::MinValue;
            dateTime = minDate.get_Date();
        }

        return dateTime;
    }

    public date stringToDateForLocale(str _dateStr, str _locale)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();

        const DateTimeStyles dateTimeStyles =
            DateTimeStyles::NoCurrentDateDefault
            | DateTimeStyles::AllowLeadingWhite
            | DateTimeStyles::AllowTrailingWhite;

        System.DateTime dateTime;
        boolean valid = System.DateTime::TryParse(
                            _dateStr,
                            this.getDateTimeFormatInfoFromLocale(_locale),
                            dateTimeStyles,
                            byref dateTime);
        
        if (valid)
        {
            dateTime = dateTime.get_Date();
        }
        else
        {
            System.DateTime minDate = System.DateTime::MinValue;
            dateTime = minDate.get_Date();
        }

        return dateTime;
    }

    public DSSShortDatePattern getDatePattern(str _locale)
    {
        DSSShortDatePattern shortDatePattern;

        shortDatePattern = this.cultureInfo(_locale).get_DateTimeFormat().ShortDatePattern.ToString();

        return shortDatePattern;
    }

    public DateTimeFormatInfo getDateTimeFormatInfoFromLocale(str _locale)
    {
        return this.cultureInfo(_locale).get_DateTimeFormat();
    }

    public CultureInfo cultureInfo(str _locale)
    {
        str locale = _locale;

        new InteropPermission(InteropKind::ClrInterop).assert();
        // We need to use a two parameter version because the wrong overload is chosen
        // when only one parameter is supplied
        return CultureInfo::GetCultureInfo(locale, locale);
    }

    public str getRecIdValue(TableId _tableId, FieldId _fieldId, RefRecId _refRecId)
    {
        DictTable       dictTable;
        DictRelation    dictRelation;
        DictIndex       dictIndex;
        TableId         relTable;
        FieldId         relField;
        Common          common;
        str             ret;
    
        dictRelation = new DictRelation(_tableId);
        dictRelation.loadFieldRelation(_fieldId);
        relTable = dictRelation.externTable();
    
        dictTable = new DictTable(relTable);
    
        common = dictTable.makeRecord();
        select common where common.recId == _refRecId;
    
        dictIndex = new dictIndex(relTable, dictTable.replacementKey());
        relField = dictIndex.field(1); //Replacement key should only have 1 value
        //dictIndex.numberOfFields
        ret = common.(relField);
    
        return ret;
    }

    public MethodName getTableDisplayMethodName(TableId _tableId)
    {
        #ResAppl
        FormRun         formRun;
        container       tableMethods;
        SysDictTable    dt = new SysDictTable(_tableId);
        list            methodList;
        listEnumerator  methodListEnumerator;
        ;
    
        formRun = classFactory.createPicklist();
        formRun.init();
    
        methodList = dt.getListOfDisplayMethods();
    
        methodListEnumerator = methodList.getEnumerator();
        while (methodListEnumerator.moveNext())
        {
            tableMethods += methodListEnumerator.current();
        }
    
        formRun.choices(tableMethods, #ImageClass);
        formRun.caption("@ENG5005");
        formRun.run();
        formRun.wait();
        if (formRun.choice())
        {
            return formRun.choice();
        }
        else
        {
            return '';
        }
    }

    public str decodeJWT(str _token)
    {
        //System.IdentityModel.Tokens.jwt
        //var handler = new JwtSecurityTokenHandler();
        //var decodedValue = handler.ReadJwtToken(_token);

        return '';
    }

    public void lookupFormForContainer(FormStringControl _ctrl, container _container, str _caption)
    {
        #ResAppl
        FormRun  formRun;
        formRun = classFactory.createSysLookupPicklist();
        formRun.init();

        formRun.choices(_container, #ImageTable);
        formRun.caption(_caption);
        _ctrl.performFormLookup(formRun);
    }

    public container getTableRelations(RefTableId _refTableId)
    {
        container tableRelations;
        SysDictTable sdt = new SysDictTable(_refTableId);
        SysDictRelation sdr = new SysDictRelation(_refTableId);
                
        
        for (int i = 1; i <= sdt.relationCnt(); i++)
        {
            tableRelations += sdt.relation(i);          
        }

        return tableRelations;
    }

    public void tableFieldsLookup(FormStringControl _formStringControl, RefTableId _refTableId)
    {
        Query q;
        QueryBuildDataSource qbds;

        q = new Query();
        qbds = q.addDataSource(tableNum(SqlDictionary));
        qbds.addRange(fieldNum(SqlDictionary, fieldId)).value(SysQuery::valueNot(0));
        qbds.addRange(fieldNum(SqlDictionary, array)).value(SysQuery::valueNot(0));
        qbds.addRange(fieldNum(SqlDictionary, tabId)).value(queryValue(_refTableId));
        SysTableLookup tablelookup = SysTableLookup::newParameters(tableNum(SqlDictionary), _formStringControl, true);

        tablelookup.addLookupfield(fieldNum(SqlDictionary, name));
        tablelookup.addLookupfield(fieldNum(SqlDictionary, sqlName));
        tablelookup.parmQuery(q);
        tablelookup.performFormLookup();
    }

    public  System.Byte[] getBytesFromContainer(container c)
    {
        System.Byte[] byteArray = null;

        System.IO.MemoryStream publicKeyStream = new System.IO.MemoryStream();

        Binary binary = Binary::constructFromContainer(c);
        using (System.IO.MemoryStream stream = binary.getMemoryStream())
        {
            byteArray = stream.ToArray();
            return byteArray;
        }
    }

    public Query getEmployeeReportToMeQuery(DSSEmployeeId _employeeId)
    {
        Query query = new Query();
        QueryBuildDataSource    qbdsWorker,qbdsPositionWorkerAssignemnt, qbdsPositionDetail,qbdsPosition,qbdsPostion,qbdsPositionHirarchy,qbdsPositionHierarchyType;
        HcmWorkerLookup         workerLookup = HcmWorkerLookup::newActiveWorkers();
        HRMParameters   hrmParameters = HRMParameters::find();
        HcmPositionHierarchySystemType positionHierarchyType = hrmParameters.PositionHierarchyType;
        HcmPositionHierarchyName positionHierarchyName = hrmParameters.PositionHierarchyName;
        ;

        workerLookup.parmIncludeTerminated(false);
        query = new Query(workerLookup.updateQuery());

        HcmPositionRecId  CurrentEmployeePositionRecId;

        CurrentEmployeePositionRecId = HcmPosition::findByPosition(HcmWorker::findByPersonnelNumber(_employeeId).primaryPositionId()).RecId;
         
        //qbdsWorker = q.addDataSource(tableNum(HcmWorker));
        // qbdsPositionWorkerAssignemnt = qbdsWorker.addDataSource(tableNum(HcmPositionWorkerAssignment));
  
        qbdsPositionWorkerAssignemnt = query.dataSourceTable(tableNum(HcmWorker)).addDataSource(tableNum(HcmPositionWorkerAssignment));
        
        qbdsPositionWorkerAssignemnt.relations(false);
        qbdsPositionWorkerAssignemnt.joinMode(JoinMode::ExistsJoin);
        qbdsPositionWorkerAssignemnt.addLink(fieldNum(HcmWorker,Recid),fieldNum(HcmPositionWorkerAssignment,Worker));
    
     
        qbdsPositionDetail = qbdsPositionWorkerAssignemnt.addDataSource(tableNum(HcmPositionDetail));
        qbdsPositionDetail.relations(false);
        qbdsPositionDetail.joinMode(JoinMode::ExistsJoin);
        qbdsPositionDetail.addLink(fieldNum(HcmPositionWorkerAssignment,Position),fieldNum(HcmPositionDetail,Position));

        qbdsPosition = qbdsPositionDetail.addDataSource(tableNum(HCMPosition));
        qbdsPosition.relations(false);
        qbdsPosition.joinMode(JoinMode::ExistsJoin);
        qbdsPosition.addLink(fieldNum(HcmPositionDetail,Position),fieldNum(HCMPosition,RecId));

        qbdsPositionHirarchy = qbdsPosition.addDataSource(tableNum(HcmPositionHierarchy));
        qbdsPositionHirarchy.relations(false);
        qbdsPositionHirarchy.joinMode(JoinMode::ExistsJoin);
        qbdsPositionHirarchy.addLink(fieldNum(HcmPosition,RecId),fieldNum(HcmPositionHierarchy,Position));
        //qbdsPositionHirarchy.addRange(fieldNum(HcmPositionHierarchy,parentposition)).value(queryValue(CurrentEmployeePositionRecId));

        qbdsPositionHierarchyType = qbdsPositionHirarchy.addDataSource(tablenum (HcmPositionHierarchyType));
        qbdsPositionHierarchyType.relations(false);
        qbdsPositionHierarchyType.joinMode(JoinMode::ExistsJoin);
        qbdsPositionHierarchyType.addLink(fieldNum(HcmPositionHierarchy,PositionHierarchyType),fieldnum(HcmPositionHierarchyType,RecId));
        //qbdsPositionHierarchyType.addRange(fieldNum(HcmPositionHierarchyType,HierarchyType)).value(queryValue(HcmPositionHierarchySystemType::Line));

        // <10-28-2020 Abdul Ghani //Reason On Behalf of Requirment>
        //SysQuery::findOrCreateRange(qbdsPositionHierarchyType,fieldNum(HcmPositionHierarchyType,HierarchyType)).value(strFmt("%1",HcmPositionHierarchySystemType::Line));

        SysQuery::findOrCreateRange(qbdsPositionHierarchyType,fieldNum(HcmPositionHierarchyType,HierarchyType)).value(queryValue(positionHierarchyType));

        if(positionHierarchyName && positionHierarchyType == HcmPositionHierarchySystemType::Other)
            SysQuery::findOrCreateRange(qbdsPositionHierarchyType,fieldNum(HcmPositionHierarchyType, Name)).value(queryValue(positionHierarchyName));

        SysQuery::findOrCreateRange(qbdsPositionHirarchy,fieldNum(HcmPositionHierarchy,parentposition)).value(strfmt('((parentposition = %1))',CurrentEmployeePositionRecId)); // current employee position
  
        return query;
    }

    public void createEmailNotification(DSSEmployeeId _employeeId, DSSTitle _subject, DSSBody _body)
    {
        Email email = HcmWorker::findByPersonnelNumber(_employeeId).email();
        SysEmailSystemTable table = SysEmailSystemTable::find(DSSParameters::find().WorkflowEmailId);
        if(email && _subject && _body && table)
        {
            SysEmailBatch batch = SysEmailBatch::construct();

            batch.parmEmailAddr(email);
            batch.parmMessageBody(_body);
            batch.parmSenderAddr(table.SenderAddr);
            batch.parmSendername(table.SenderName);
            batch.parmSubject(_subject);
            batch.parmPriority(table.Priority);

            if (table.BatchGroupId)
                    batch.sendToBatch(table.BatchGroupId);
            else
                    batch.runOperation();
        }
    }

}

Comments

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++

SalesLine Reservation in D365fo x++