Friday 20 December 2019

Purchase order flow and Sales order flow

Purchase order flow and Sales order flow:


Purchase order flow:
1.Purchase order creation
2.Confirmation
3.Receipt list
4.Product receipt or packing slip (Physical inventory)
5.Invoice (Financial)
classes:
PurchFormLetter
PurchFormLetter_confirmation
PurchFormLetter_receiptlist
PurchFormLetter_packingslip
PurchFormLetter_invoice

Sales order flow:
1.Sales order creation
2.Confirmation
3.Picking list , picking list registration
4.Packing slip (Physical inventory)
5.Invoice


classes:
SalesFormLetter
SalesFormLetter_confirmation
SalesFormLetter_pickinglist
SalesFormLetter_packingslip
SalesFormLetter_invoice

Friday 6 December 2019

Amount in words in indonesian language. malay and english in ax

1. Class 

class MSCAmountInWordsforIndonesia
{

    public static str FirstWordUppercase(str p_strStatement)
    {
        //return strFmt('%1%2',strupr(substr(p_strStatement,1,1)),substr(p_strStatement,2,strlen(p_strStatement)));
        return Global::str2CapitalWord(p_strStatement);
    }

    public static void main(Args args)
    {

        //    print DPRTerbilang::SayReal(1.1);
        //    print DPRTerbilang::SayReal(-1.2);
        //    print DPRTerbilang::SayReal(0.3);
        //    print DPRTerbilang::SayReal(10000.0000001);
        //    print DPRTerbilang::SayReal(1000.12);
        //    print DPRTerbilang::SayReal(2.45);
        //    print DPRTerbilang::SayReal(10.3894);
        //    print DPRTerbilang::SayReal(11.10001203);
        //    print DPRTerbilang::SayReal(20.0000);
        //    print DPRTerbilang::SayReal(21.00010000);
        //print DPR_Terbilang::SayReal(30.21);
        //    print DPRTerbilang::SayReal(100.091238);
        //    print DPRTerbilang::SayReal(101.5445);
        //    print DPRTerbilang::SayReal(111.7667);
        //    print DPRTerbilang::SayReal(1011.67867);
        //    print DPRTerbilang::SayReal(10011.5089);
        //    print DPRTerbilang::SayReal(100011.0912);
        //    print DPRTerbilang::SayReal(1000011.09120);
        //    print DPRTerbilang::SayReal(10000011.0009);
        //    print DPRTerbilang::SayReal(100000011.100000001);
        //    print DPRTerbilang::SayReal(-1000000011.1000000001);
        //    print DPRTerbilang::TerbilangReal(9999.99);
        //print DPRTerbilang::say(1000.20);
        //pause;
    }

    public static str Nol(str _nolSebelumAngka="")
    {
        str     terbilangNol;
        int     totalNol = strLen(_nolSebelumAngka);
        int     no;
        ;

        for(no=1; no <= totalNol; no++)
        {
            if(!terbilangNol)
            terbilangNol = "nol";
            else
            terbilangNol += " nol";
        }
        return terbilangNol;
    }

    public static str Say(int lAngka,int p_intDigit = 0)
    {
        str sBilangan [,1];
        str sKelipatan3 [,1];

        str sKalimat = "";
        str sAngka = int2str(lAngka<0?-lAngka:lAngka);
        boolean bNegatif = lAngka < 0;
        boolean bKelipatan3Ada = false;
        boolean bBelas = false;

        int i,j;
        ;
        sBilangan [1] = "zero";
        sBilangan [2] = "one";
        sBilangan [3] = "two";
        sBilangan [4] = "three";
        sBilangan [5] = "four";
        sBilangan [6] = "five";
        sBilangan [7] = "six";
        sBilangan [8] = "seven";
        sBilangan [9] = "eight";
        sBilangan [10] = "nine";
        sKelipatan3 [1] = "thousand";
        sKelipatan3 [2] = "million";
        sKelipatan3 [3] = "billion";
        sKelipatan3 [4] = "quintillion";
        sKelipatan3 [5] = "pentillion";

        for (i=1; i<=strlen(sAngka); i++)
        {
            j = strlen(sAngka) - i;
            switch (j mod 3)
            {
                case 0:        //satuan
                    if (bBelas)
                    {
                        switch (substr(sAngka,i,1))
                        {
                            case '1':
                                sKalimat += "eleven "; break;
                            case '2':
                                sKalimat += "twelve "; break;
                            case '3':
                                sKalimat += "thirteen "; break;
                            case '5':
                                sKalimat += "fifteen "; break;
                            case '8':
                                sKalimat += "eighteen "; break;
                            case '0':
                                sKalimat += "ten "; break;
                            default:
                                sKalimat +=  sBilangan[1+str2int(substr(sAngka,i,1))] + "teen "; break;
                        }
                        bKelipatan3Ada = true;
                        bBelas = false;
                    }
                    else if (substr(sAngka,i,1) > '0')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " ";
                        bKelipatan3Ada = true;
                    }
                    if (bKelipatan3Ada)
                    {
                        if (j / 3 > 0)
                        {
                            if (sKalimat == "one " && j / 3 == 1)    //berubah jadi se
                            {
                                sKalimat = "a ";
                            }
                            sKalimat += sKelipatan3[j / 3] + " ";
                        }
                        bKelipatan3Ada = false;
                    }
                    break;

                case 1:        //puluhan
                    if (substr(sAngka,i,1) != '0')
                    {
                        switch (substr(sAngka,i,1))
                        {
                            case '1':        //belasan
                                bBelas = true; break;
                            case '2':
                                sKalimat += "twenty "; break;
                            case '3':
                                sKalimat += "thirtty "; break;
                            case '5':
                                sKalimat += "fifty "; break;
                            case '8':
                                sKalimat += "eighty "; break;
                            default:
                                sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + "ty "; break;
                        }
                        bKelipatan3Ada = true;
                    }
                    break;
                case 2:        //ratusan
                    if (substr(sAngka,i,1) != '0')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " hundred ";
                        bKelipatan3Ada = true;
                    }
                    break;
            }
        }
        if (p_intDigit > strlen(sAngka))    //by SW
        {
            for (i=strlen(sAngka); i < p_intDigit; i++)
            {
                sKalimat = sBilangan[1] + " " + sKalimat;
            }
        }
        if (sKalimat == "") sKalimat = sBilangan[1] + " ";
        return (bNegatif?"negative ":"") + sKalimat;
    }

    public static str SayReal(real p_reaAngka,int p_intDecimalDigit = 3, CurrencyCode _currency = Ledger::accountingCurrency())
    {
        str     sAngka = num2str(p_reaAngka,0,p_intDecimalDigit,1,0);
        str     sLeft;
        str     sRight;
        int     iPos;
        str     terbilang;
        ;
        iPos = strfind(sAngka,".",1,strlen(sAngka));
        if (iPos)
        {
            sLeft = substr(sAngka,1,iPos-1);
            sRight = substr(sAngka,iPos+1,strlen(sAngka));
            iPos = strfind(sRight,"123456789",strlen(sRight),-strlen(sRight));
            if (iPos)
            {
                sRight = substr(sRight,1,iPos);
            }
            else
            {
                sRight = "0";
            }
        }
        else
        {
            sLeft = sAngka;
            sRight = "0";
        }
        if (sRight != "0")
        terbilang   = MSCAmountInWordsforIndonesia::FirstWordUppercase(strfmt("%1%2 %3", MSCAmountInWordsforIndonesia::Say(str2int(sLeft)), "point ", MSCAmountInWordsforIndonesia::Say(str2int(sRight),strlen(sRight))));
        else
        terbilang   = MSCAmountInWordsforIndonesia::FirstWordUppercase(strFmt("%1", MSCAmountInWordsforIndonesia::Say(str2int(sLeft))));

        return strFmt("%1 %2", terbilang, Currency::find(_currency).Txt);
    }

    public static str Terbilang(real lAngka, real p_intDigit = 0, CurrencyCode _currency = Ledger::accountingCurrency(), NoYes _isCurrency = NoYes::Yes)
    {
        str sBilangan [,1];
        str sKelipatan3 [,1];
        str currency;

        str sKalimat = "";
        //str sAngka = int2str(lAngka<0?-lAngka:lAngka);
        str sAngka = num2str(lAngka<0?-lAngka:lAngka,12,0,0,0);
        boolean bNegatif = lAngka < 0;
        boolean bKelipatan3Ada = false;
        boolean bBelas = false;

        int i,j;
        ;
        sBilangan [1] = "nol";
        sBilangan [2] = "satu";
        sBilangan [3] = "dua";
        sBilangan [4] = "tiga";
        sBilangan [5] = "empat";
        sBilangan [6] = "lima";
        sBilangan [7] = "enam";
        sBilangan [8] = "tujuh";
        sBilangan [9] = "delapan";
        sBilangan [10] = "sembilan";
        sKelipatan3 [1] = "ribu";
        sKelipatan3 [2] = "juta";
        sKelipatan3 [3] = "milyar";
        sKelipatan3 [4] = "trilyun";
        sKelipatan3 [5] = "bilyun";

        for (i=1; i<=strlen(sAngka); i++)
        {
            j = strlen(sAngka) - i;
            switch (j mod 3)
            {
                case 0:        //satuan
                    if (bBelas)
                    {
                        if (substr(sAngka,i,1) == '1')
                        {
                            sKalimat += "sebelas ";
                            bKelipatan3Ada = true;
                        }
                        else if (substr(sAngka,i,1) > '1')
                        {
                            sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " belas ";
                            bKelipatan3Ada = true;
                        }
                        else        //10
                        {
                            sKalimat += "sepuluh ";
                            bKelipatan3Ada = true;
                        }
                        bBelas = false;
                    }
                    else if (substr(sAngka,i,1) > '0')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " ";
                        bKelipatan3Ada = true;
                    }
                    if (bKelipatan3Ada)
                    {
                        if (j / 3 > 0)
                        {
                            if (sKalimat == "satu " && j / 3 == 1)    //berubah jadi se
                            {
                                sKalimat = "se";
                            }
                            sKalimat += sKelipatan3[j / 3] + " ";
                        }
                        bKelipatan3Ada = false;
                    }
                    break;

                case 1:        //puluhan
                    if (substr(sAngka,i,1) == '1')        //belasan
                    {
                        bBelas = true;
                        bKelipatan3Ada = true;
                    }
                    else if (substr(sAngka,i,1) > '1')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " puluh ";
                        bKelipatan3Ada = true;
                    }
                    break;
                case 2:        //ratusan
                    if (substr(sAngka,i,1) == '1')    //se
                    {
                        sKalimat += "seratus ";
                        bKelipatan3Ada = true;
                    }
                    else if (substr(sAngka,i,1) > '1')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " ratus ";
                        bKelipatan3Ada = true;
                    }
                    break;
            }
        }
        if (p_intDigit > strlen(sAngka))    //by SW
        {
            for (i=strlen(sAngka); i < p_intDigit; i++)
            {
                sKalimat = sBilangan[1] + " " + sKalimat;
            }
        }
        if (sKalimat == "") sKalimat = sBilangan[1] + " ";

        //by SF
        currency    = _isCurrency ? Currency::find(_currency).Txt : "";

        return (bNegatif?" ":"") + MSCAmountInWordsforIndonesia::FirstWordUppercase(sKalimat) + " " + currency;
    }

    public static str TerbilangKomaNew(real p_reaAngka,CurrencyCode _currency = "",int p_intDecimalDigit = 3)
    {
        str     sAngka = num2str(p_reaAngka,0,p_intDecimalDigit,1,0);
        str     sLeft;
        str     sRight;
        int     iPos;

        str     tempStrLeft, tempStrRight;

        MSCAmountInWordsforIndonesia   terbilang = new MSCAmountInWordsforIndonesia();
        ;
        iPos = strfind(sAngka,".",1,strlen(sAngka));
        if (iPos)
        {
            sLeft = substr(sAngka,1,iPos-1);
            sRight = substr(sAngka,iPos+1,strlen(sAngka));
            iPos = strfind(sRight,"123456789",strlen(sRight),-strlen(sRight));
            if (iPos)
            {
                sRight = substr(sRight,1,iPos);
            }
            else
            {
                sRight = "0";
            }
        }
        else
        {
            sLeft = sAngka;
            sRight = "0";
        }

        if (sRight != "0")
        {
            tempStrLeft     = MSCAmountInWordsforIndonesia::TerbilangNew(str2num(sLeft),_currency);
            tempStrRight    = MSCAmountInWordsforIndonesia::TerbilangNew(str2num(sRight));

            return MSCAmountInWordsforIndonesia::FirstWordUppercase(strfmt ("%1 koma %2", tempStrLeft,tempStrRight));
        }
        else
        {
            if(_currency)
            return MSCAmountInWordsforIndonesia::FirstWordUppercase(MSCAmountInWordsforIndonesia::TerbilangNew(str2num(sLeft),_currency));
            else
            return MSCAmountInWordsforIndonesia::FirstWordUppercase(MSCAmountInWordsforIndonesia::TerbilangNew(str2num(sLeft)));
        }
    }

    public static str TerbilangNew(amount _num, CurrencyCode _currency = Ledger::accountingCurrency())
    {
        int     numOfPennies = frac(_num)*100 mod 100;
        int     test         = real2int(round(_num,0));

        int     numOfTenths;
        str 20  ones[19], tenths[9], hundreds, thousands, millions, billions;

        int     temp;
        str 200 returntxt;

        int checkPower(int  _test, int _power)
        {
            int     numOfPower;

            if (_test >= _power)
            {
                numOfPower = _test DIV _power;
                if (numOfPower >= 100)
                {
                    temp = numOfPower DIV 100;
                    returntxt = returntxt ? returntxt + ' ' + ones[temp] + ' ' + hundreds : ones[temp] + ' ' + hundreds;
                    numOfPower = numOfPower MOD 100;
                }
                if (numOfPower >= 20)
                {
                    temp = numOfPower DIV 10;
                    returntxt = returntxt ? returntxt + ' ' + tenths[temp] : tenths[temp];
                    numOfPower = numOfPower MOD 10;
                }
                if (numOfPower >= 1)
                {
                    returntxt = returntxt ? returntxt + ' ' + ones[numOfPower] : ones[numOfPower];
                    numOfPower = numOfPower MOD 10;
                }
                switch(_power)
                {
                    case 1000000000 :
                    {
                        returntxt = returntxt ? returntxt + ' ' + billions : billions;
                        _test = _test MOD 1000000000;
                        break;
                    }
                case 1000000 :
                {
                    returntxt = returntxt ? returntxt + ' ' + millions : millions;
                    _test = _test MOD 1000000;
                    break;
                }
            case 1000 :
            {
                returntxt = returntxt ? returntxt + ' ' + thousands : thousands;
                _test = _test MOD 1000;
                break;
            }
        case 100 :
        {
            returntxt = returntxt ? returntxt + ' ' + hundreds : hundreds;
            _test = _test MOD 100;
            break;
        }
                }
            }
            return _test;
        }



        ones[1] = "Satu";
        ones[2] = "Dua";
        ones[3] = "Tiga";
        ones[4] = "Empat";
        ones[5] = "Lima";
        ones[6] = "Enam";
        ones[7] = "Tujuh";
        ones[8] = "Delapan";
        ones[9] = "Sembilan";
        ones[10] = "Sepuluh";
        ones[11] = "Sebelas";
        ones[12] = "Dua Belas";
        ones[13] = "Tiga Belas";
        ones[14] = "Empat Belas";
        ones[15] = "Lima Belas";
        ones[16] = "Enam Belas";
        ones[17] = "Tujuh Belas";
        ones[18] = "Delapan Belas";
        ones[19] = "Sembilan Belas";

        tenths[1] = 'Not used';
        tenths[2] = "Dua Puluh";
        tenths[3] = "Tiga Puluh";
        tenths[4] = "Empat Puluh";
        tenths[5] = "Lima Puluh";
        tenths[6] = "Enam Puluh";
        tenths[7] = "Tujuh Puluh";
        tenths[8] = "Delapan Puluh";
        tenths[9] = "Sembilan Puluh";

        hundreds    = "Ratus";
        thousands   = "Ribu";
        millions    = "Juta";
        billions    = "Miliar";


        test = checkPower(test, 1000000000);
        test = checkPower(test, 1000000);
        test = checkPower(test, 1000);
        test = checkPower(test, 100);

        if (test >= 20)
        {
            numOfTenths = test DIV 10;
            returntxt = returntxt ? returntxt + ' ' + tenths[numofTenths] : tenths[numofTenths];
            numOfTenths = numOfTenths MOD 10;
            test = test MOD 10;
        }
        if (test >= 1)
        {
            numOfTenths = test;
            returntxt = returntxt ? returntxt + ' ' + ones[numOfTenths] : ones[numOfTenths];

        }

        if (numOfPennies)
        {
            returntxt = returntxt + MSCAmountInWordsforIndonesia::TerbilangNew(numofpennies) ;//+ ' Sen';
        }

        if (strscan(strltrim(returntxt),"Satu Ribu",1,15)==1)
        {
            returntxt = strReplace(returntxt, "Satu Ribu", "Seribu");
        }

        returntxt = strReplace(returntxt, "Juta Satu Ribu", "Juta Seribu");
        returntxt = strReplace(returntxt, "Satu Ratus", "Seratus");

        if(_currency)
        return returntxt + " " + Currency::find(_currency).Txt;
        else
        return returntxt;
    }

    public static str TerbilangNoMinus(real lAngka, real p_intDigit = 0)
    {
        str sBilangan [,1];
        str sKelipatan3 [,1];

        str sKalimat = "";
        //str sAngka = int2str(lAngka<0?-lAngka:lAngka);
        str sAngka = num2str(lAngka<0?-lAngka:lAngka,12,0,0,0);
        boolean bNegatif = lAngka < 0;
        boolean bKelipatan3Ada = false;
        boolean bBelas = false;

        int i,j;
        ;
        sBilangan [1] = "Nol";
        sBilangan [2] = "Satu";
        sBilangan [3] = "Dua";
        sBilangan [4] = "Tiga";
        sBilangan [5] = "Empat";
        sBilangan [6] = "Lima";
        sBilangan [7] = "Enam";
        sBilangan [8] = "Tujuh";
        sBilangan [9] = "Delapan";
        sBilangan [10] = "Sembilan";
        sKelipatan3 [1] = "Ribu";
        sKelipatan3 [2] = "Juta";
        sKelipatan3 [3] = "Milyar";
        sKelipatan3 [4] = "Trilyun";
        sKelipatan3 [5] = "Bilyun";

        for (i=1; i<=strlen(sAngka); i++)
        {
            j = strlen(sAngka) - i;
            switch (j mod 3)
            {
                case 0:        //satuan
                    if (bBelas)
                    {
                        if (substr(sAngka,i,1) == '1')
                        {
                            sKalimat += "Sebelas ";
                            bKelipatan3Ada = true;
                        }
                        else if (substr(sAngka,i,1) > '1')
                        {
                            sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " belas ";
                            bKelipatan3Ada = true;
                        }
                        else        //10
                        {
                            sKalimat += "Sepuluh ";
                            bKelipatan3Ada = true;
                        }
                        bBelas = false;
                    }
                    else if (substr(sAngka,i,1) > '0')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " ";
                        bKelipatan3Ada = true;
                    }
                    if (bKelipatan3Ada)
                    {
                        if (j / 3 > 0)
                        {
                            if (sKalimat == "Satu " && j / 3 == 1)    //berubah jadi se
                            {
                                sKalimat = "se";
                            }
                            sKalimat += sKelipatan3[j / 3] + " ";
                        }
                        bKelipatan3Ada = false;
                    }
                    break;

                case 1:        //puluhan
                    if (substr(sAngka,i,1) == '1')        //belasan
                    {
                        bBelas = true;
                        bKelipatan3Ada = true;
                    }
                    else if (substr(sAngka,i,1) > '1')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " Puluh ";
                        bKelipatan3Ada = true;
                    }
                    break;
                case 2:        //ratusan
                    if (substr(sAngka,i,1) == '1')    //se
                    {
                        sKalimat += "Seratus ";
                        bKelipatan3Ada = true;
                    }
                    else if (substr(sAngka,i,1) > '1')
                    {
                        sKalimat += sBilangan[1+str2int(substr(sAngka,i,1))] + " Ratus ";
                        bKelipatan3Ada = true;
                    }
                    break;
            }
        }
        if (p_intDigit > strlen(sAngka))    //by SW
        {
            for (i=strlen(sAngka); i < p_intDigit; i++)
            {
                sKalimat = sBilangan[1] + " " + sKalimat;
            }
        }
        if (sKalimat == "") sKalimat = sBilangan[1] + " ";
        return (bNegatif?"":"") + sKalimat;
    }

    public static str TerbilangReal(real p_reaAngka,int p_intDecimalDigit = 2, CurrencyCode _currency = Ledger::accountingCurrency())
    {
        str     sAngka = num2str(p_reaAngka,0,p_intDecimalDigit,1,0);
        str     sLeft;
        str     sRight;
        str     sZero;
        int     iPos;
        ;
        iPos = strfind(sAngka,".",1,strlen(sAngka));
        if (iPos)
        {
            sLeft = substr(sAngka,1,iPos-1);
            sRight = substr(sAngka,iPos+1,strlen(sAngka));
            //iPos = strfind(sRight,"123456789",strlen(sRight),-strlen(sRight));
            iPos = strfind(sRight,"123456789",1,strlen(sRight));
            if (iPos)
            {
                //sRight = substr(sRight,1,iPos);
                sZero = substr(sRight,1,iPos-1);
            }
            else
            {
                sRight = "0";
            }
        }
        else
        {
            sLeft = sAngka;
            sRight = "0";
        }
        if (sRight != "0")
        return MSCAmountInWordsforIndonesia::FirstWordUppercase(strfmt ("%1%2 %3%4",
            MSCAmountInWordsforIndonesia::Terbilang(str2num(sLeft)),
            "koma",
            MSCAmountInWordsforIndonesia::Nol(sZero),
            MSCAmountInWordsforIndonesia::Nol(sZero)?(" " + MSCAmountInWordsforIndonesia::Terbilang(str2int(sRight),strlen(sRight))):
            MSCAmountInWordsforIndonesia::Terbilang(str2int(sRight),strlen(sRight))
            ));
        return MSCAmountInWordsforIndonesia::FirstWordUppercase(MSCAmountInWordsforIndonesia::Terbilang(str2num(sLeft), p_intDecimalDigit, _currency));
    }

    public static str TerbilangRealNoMinus(real p_reaAngka,int p_intDecimalDigit = 3)
    {
        str     sAngka = num2str(p_reaAngka,0,p_intDecimalDigit,1,0);
        str     sLeft;
        str     sRight;
        str     sZero;
        int     iPos;
        ;
        iPos = strfind(sAngka,".",1,strlen(sAngka));
        if (iPos)
        {
            sLeft = substr(sAngka,1,iPos-1);
            sRight = substr(sAngka,iPos+1,strlen(sAngka));
            //iPos = strfind(sRight,"123456789",strlen(sRight),-strlen(sRight));
            iPos = strfind(sRight,"123456789",1,strlen(sRight));
            if (iPos)
            {
                //sRight = substr(sRight,1,iPos);
                sZero = substr(sRight,1,iPos-1);
            }
            else
            {
                sRight = "0";
            }
        }
        else
        {
            sLeft = sAngka;
            sRight = "0";
        }
        if (sRight != "0")
        return MSCAmountInWordsforIndonesia::FirstWordUppercase(strfmt ("%1%2 %3%4",
            MSCAmountInWordsforIndonesia::TerbilangNoMinus(str2num(sLeft)),
            "koma",
            MSCAmountInWordsforIndonesia::Nol(sZero),
            MSCAmountInWordsforIndonesia::Nol(sZero)?(" " + MSCAmountInWordsforIndonesia::TerbilangNoMinus(str2int(sRight),strlen(sRight))):
            MSCAmountInWordsforIndonesia::TerbilangNoMinus(str2int(sRight),strlen(sRight))
            ));
        return MSCAmountInWordsforIndonesia::FirstWordUppercase(MSCAmountInWordsforIndonesia::TerbilangNoMinus(str2num(sLeft)));
    }


}








2. Class :


class MSCGlobal
{
    static TempStr numeralsToTxt_Indonesia(real _num)
    {
        int     numOfPennies = real2int(decRound(frac(_num), 2) * 100) mod 100;
        real    test         = _num - frac(_num);

        int64   numOfTenths;
        str 20  ones[19], tenths[9], hundreds, thousands, millions, billions, trillions;

        int64   temp;
        str 200 returntxt;
        int64   testLoc;

        real modOperator(real a1, real a2)
        {
            int tmpi;
            real tmp1, tmp2;
            tmp1 = a1 / a2;
            tmpi = real2int(tmp1);
            tmp2 = tmpi;
            return (tmp1 - tmp2)*a2;
        }

        real checkPower(real  _test, int64 _power)
        {
            int64   numOfPower;

            if (_test >= _power)
            {
                testLoc = any2Int64(_test);
                numOfPower = testLoc div _power;
                if (numOfPower >= 100)
                {
                    temp = numOfPower div 100;
                    returntxt = returntxt + ' ' + ones[temp] + ' ' + hundreds;
                    numOfPower = numOfPower mod 100;
                }
                if (numOfPower >= 20)
                {
                    temp = numOfPower div 10;
                    returntxt = returntxt + ' ' + tenths[temp];
                    numOfPower = numOfPower mod 10;
                }
                if (numOfPower >= 1)
                {
                    returntxt = returntxt + ' ' + ones[numOfPower];
                    numOfPower = numOfPower mod 10;
                }
                switch(_power)
                {
                    case 1000000000000 :
                        returntxt = returntxt + ' ' + trillions;
                        _test = modOperator(_test, 1000000000000.00);
                        break;
                    case 1000000000 :
                        returntxt = returntxt + ' ' + billions;
                        _test = modOperator(_test, 1000000000);
                        break;
                    case 1000000 :
                        returntxt = returntxt + ' ' + millions;
                        _test = modOperator(_test, 1000000);
                        break;
                    case 1000 :
                        returntxt = returntxt + ' ' + thousands;
                        _test = modOperator(_test, 1000);
                        break;
                    case 100 :
                        returntxt = returntxt + ' ' + hundreds;
                        _test = modOperator(_test, 100);
                        break;
                }
            }
            return _test;
        }

        #Define.text_1('Satu')
        #Define.text_2('Dua')
        #Define.text_3('Tiga')
        #Define.text_4('Empat')
        #Define.text_5('Lima')
        #Define.text_6('Enam')
        #Define.text_7('Tujuh')
        #Define.text_8('Delapan')
        #Define.text_9('Sembilan')
        #Define.text_10('Sepuluh')
        #Define.text_11('Sebelas')
        #Define.text_12('Dua belas')
        #Define.text_13('Tiga belas')
        #Define.text_14('Empat belas')
        #Define.text_15('Lima belas')
        #Define.text_16('Enam belas')
        #Define.text_17('Tujuh belas')
        #Define.text_18('Delapan belas')
        #Define.text_19('Sembilan belas')
        #Define.text_20('Dua Puluh')
        #Define.text_30('Tiga Puluh')
        #Define.text_40('Empat Puluh')
        #Define.text_50('Lima Puluh')
        #Define.text_60('Enam Puluh')
        #Define.text_70('Tujuh Puluh')
        #Define.text_80('Delapan Puluh')
        #Define.text_90('Sembilan Puluh')
        #Define.text_100('Ratus')
        #Define.text_1000('Ribu')
        #Define.text_1000000('Juta')
        #Define.text_1000000000('Billion') //"Miliar";
        #Define.text_1000000000000('Trillion')
        #Define.text_and('dan')

        ones[1] = #text_1;
        ones[2] = #text_2;
        ones[3] = #text_3;
        ones[4] = #text_4;
        ones[5] = #text_5;
        ones[6] = #text_6;
        ones[7] = #text_7;
        ones[8] = #text_8;
        ones[9] = #text_9;
        ones[10] = #text_10;
        ones[11] = #text_11;
        ones[12] = #text_12;
        ones[13] = #text_13;
        ones[14] = #text_14;
        ones[15] = #text_15;
        ones[16] = #text_16;
        ones[17] = #text_17;
        ones[18] = #text_18;
        ones[19] = #text_19;

        tenths[1] = 'Tidak digunakan';
        tenths[2] = #text_20;
        tenths[3] = #text_30;
        tenths[4] = #text_40;
        tenths[5] = #text_50;
        tenths[6] = #text_60;
        tenths[7] = #text_70;
        tenths[8] = #text_80;
        tenths[9] = #text_90;

        hundreds    = #text_100;
        thousands   = #text_1000;
        millions    = #text_1000000;
        billions    = #text_1000000000;
        trillions   = #text_1000000000000;


        test = checkPower(test, 1000000000000);
        test = checkPower(test, 1000000000);
        test = checkPower(test, 1000000);
        test = checkPower(test, 1000);
        test = checkPower(test, 100);

        if (test >= 20)
        {
            testLoc = any2int64(test);
            numOfTenths = testLoc div 10;
            returntxt = returntxt + ' ' + tenths[numofTenths];
            numOfTenths = numOfTenths mod 10;
            test = real2int(test) mod 10;
        }
        if (test >= 1)
        {
            numOfTenths = real2int(test);
            returntxt = returntxt + ' ' + ones[numOfTenths];
        }

        if (numOfPennies)
        {
            returntxt = '***' + returntxt + ' ' + #text_and + ' ' + num2str(numOfPennies,0,0,0,0) + '/100';
        }
        else
        {
            returntxt = '***' + returntxt + ' ' + #text_and + ' ' + '00/100';
        }

        return returntxt;
    }

    public static Description1000 convertAmountInWords_Indonesia(real _amount, str _currency1, str _currency2)
    {
        real             decimals;
        int64            intNumValue;
        Description1000  word, decWord;
        int64            repPos, repPos1;
        ;

        word        = MSCGlobal::numeralsToTxt_Indonesia(_amount);
        repPos      = strscan(word, ' dan', 1, strlen(word));
        intNumValue = _amount;
        decimals    = _amount - intNumValue;

        if (decimals == 0.00)
        {
            word = strdel(strpoke(word, strfmt(' %1 dan  Nol %2', _currency1, _currency2), repPos), 1, 4); //No
        }
        else
        {
            decWord = substr(num2str(decimals, 0, 2, 1, 1), 3, 2);
            decWord = MSCGlobal::numeralsToTxt_Indonesia(str2num(decWord));
            repPos1 = strscan(decWord, ' dan', 1, strlen(decWord));
            decWord = strpoke(decWord, strfmt(' %1', _currency2), repPos1);
            decWord = strdel(decWord, 1, 4);

            word    = strdel(strpoke(word, strFmt(' %1 dan %2', _currency1, decWord), repPos), 1, 4);
            word    = strdel(word, strscan(word, '/100', 1, strlen(word)), 4);
        }

        // added for Seratus and Seribu
        word = strReplace(word, "Satu Ribu", "Seribu");
        word = strReplace(word, "Satu Ratus", "Seratus");

        return word;
    }

    public static Description1000 convertAmountInWords(real _amount, str _currency1, str _currency2)
    {
        real             decimals;
        int64            intNumValue;
        Description1000  word, decWord;
        int64            repPos, repPos1;
        ;

        word        = Global::numeralsToTxt_EN(_amount);
        repPos      = strscan(word, ' and', 1, strlen(word));
        intNumValue = _amount;
        decimals    = _amount - intNumValue;

        if (decimals == 0.00)
        {
            word = strdel(strpoke(word, strfmt(' %1 and No %2', _currency1, _currency2), repPos), 1, 4);
        }
        else
        {
            decWord = substr(num2str(decimals, 0, 2, 1, 1), 3, 2);
            decWord = Global::numeralsToTxt_EN(str2num(decWord));
            repPos1 = strscan(decWord, ' and', 1, strlen(decWord));
            decWord = strpoke(decWord, strfmt(' %1', _currency2), repPos1);
            decWord = strdel(decWord, 1, 4);

            word    = strdel(strpoke(word, strFmt(' %1 and %2', _currency1, decWord), repPos), 1, 4);
            //word    = strdel(word, strscan(word, '/100', 1, strlen(word)), 4);
            word    = strdel(word, strscan(word, '0/100', 1, strlen(word)), 5);
        }

        return word;
    }

    static TempStr conversionOfNumeralsToTxt(real _num)
    {
        int     numOfPennies = (decRound(frac(_num), 2) * 100) mod 100;
        real    test         = _num - frac(_num);

        int64   numOfTenths;
        str 20  ones[19], tenths[9], hundreds, thousands, millions, billions, trillions;

        int64   temp;
        str 200 returntxt;
        int64   testLoc;

        real modOperator(real a1, real a2)
        {
            int tmpi;
            real tmp1, tmp2;
            tmp1 = a1 / a2;
            tmpi = real2int(tmp1);
            tmp2 = tmpi;
            return (tmp1 - tmp2)*a2;
        }

        real checkPower(real  _test, int64 _power)
        {
            int64   numOfPower;

            if (_test >= _power)
            {
                testLoc = real2double(_test);
                numOfPower = testLoc div _power;

                if (numOfPower >= 100)
                {
                    temp = numOfPower div 100;
                    returntxt = returntxt + ' ' + ones[temp] + ' ' + hundreds;
                    numOfPower = numOfPower mod 100;
                }
                if (numOfPower >= 20)
                {
                    temp = numOfPower div 10;
                    returntxt = returntxt + ' ' + tenths[temp];
                    numOfPower = numOfPower mod 10;
                }
                if (numOfPower >= 1)
                {
                    returntxt = returntxt + ' ' + ones[numOfPower];
                    numOfPower = numOfPower mod 10;
                }
                switch(_power)
                {
                    case 1000000000000 :
                        returntxt = returntxt + ' ' + trillions;
                        _test = modOperator(_test, 1000000000000.00);
                        break;
                    case 1000000000 :
                        returntxt = returntxt + ' ' + billions;
                        _test = modOperator(_test, 1000000000);
                        break;
                    case 1000000 :
                        returntxt = returntxt + ' ' + millions;
                        _test = modOperator(_test, 1000000);
                        break;
                    case 1000 :
                        returntxt = returntxt + ' ' + thousands;
                        _test = modOperator(_test, 1000);
                        break;
                    case 100 :
                        returntxt = returntxt + ' ' + hundreds;
                        _test = modOperator(_test, 100);
                        break;
                }
            }
            return _test;
        }



        ones[1] = "@SYS26620";
        ones[2] = "@SYS26621";
        ones[3] = "@SYS26622";
        ones[4] = "@SYS26626";
        ones[5] = "@SYS26627";
        ones[6] = "@SYS26628";
        ones[7] = "@SYS26629";
        ones[8] = "@SYS26630";
        ones[9] = "@SYS26631";
        ones[10] = "@SYS26632";
        ones[11] = "@SYS26633";
        ones[12] = "@SYS26634";
        ones[13] = "@SYS26635";
        ones[14] = "@SYS26636";
        ones[15] = "@SYS26637";
        ones[16] = "@SYS26638";
        ones[17] = "@SYS26639";
        ones[18] = "@SYS26640";
        ones[19] = "@SYS26641";

        tenths[1] = 'Not used';
        tenths[2] = "@SYS26643";
        tenths[3] = "@SYS26644";
        tenths[4] = "@SYS26645";
        tenths[5] = "@SYS26646";
        tenths[6] = "@SYS26647";
        tenths[7] = "@SYS26648";
        tenths[8] = "@SYS26649";
        tenths[9] = "@SYS26650";

        hundreds    = "@SYS26651";
        thousands   = "@SYS26652";
        millions    = "@SYS26653";
        billions    = "@SYS26654";
        trillions   = "@SYS101697";


        test = checkPower(test, 1000000000000);
        test = checkPower(test, 1000000000);
        test = checkPower(test, 1000000);
        test = checkPower(test, 1000);
        test = checkPower(test, 100);

        if (test >= 20)
        {
            testLoc = real2double(test);
            numOfTenths = testLoc div 10;

            returntxt = returntxt + ' ' + tenths[numofTenths];
            numOfTenths = numOfTenths mod 10;
            test = real2int(test) mod 10;
        }
        if (test >= 1)
        {
            numOfTenths = real2int(test);
            returntxt = returntxt + ' ' + ones[numOfTenths];
        }

        if (numOfPennies)
        {
            //returntxt = '***' + returntxt + ' ' + "@SYS5534" + ' ' + num2str(numOfPennies,0,0,0,0) + '/100';

            returntxt =  returntxt + ' ' + "@SYS5534";
            if (numOfPennies >= 20)
            {
                numOfTenths = numOfPennies div 10;
                numOfPennies = numOfPennies mod 10;
                returntxt = returntxt + ' ' + tenths[numofTenths];
            }
            if (numOfPennies >= 1)
            {
                numOfTenths = real2int(numOfPennies);

                returntxt = returntxt + ' ' + ones[numOfTenths];
            }

            returntxt = returntxt + ' cents ';
        }
        else
        {
            returntxt = returntxt;
        }

        return returntxt;
    }


}

Friday 5 July 2019

Getting item unit price in sales line

Getting item unit price in sales line :

unit price of item comes from
1. item master sales unit price
2. if any sales trade agreement against that item it will come

code for pulling unit price in sales line of item.



public Price getPriceFromSalesPriceAgreement()
    {
        SalesLine     salesLine;
        InventDim     inventDim;
        InventTable             inventTable;
        EcoResProductParameters ecoResProductParameters;
        InventTableModule       inventTableModule;

        select firstonly CustAccount, CurrencyCode from salesLine
            where salesLine.RecId == this.SalesLine
                join inventDim
                    where inventDim.inventDimId == salesLine.InventDimId
                join inventTable
                    where inventTable.ItemId == this.ItemNumber
                join FBHAdditiveReleaseUOM from ecoResProductParameters;

        return conPeek(inventTable.salesPriceAgreement(
                        DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()),
                        inventDim,
                        this.totalAdditiveQty(),
                        ecoResProductParameters.FBHAdditiveReleaseUOM,
                        SalesLine.CustAccount,
                        SalesLine.CurrencyCode), 1);
    }


or in standard we have method in inventtable
need to pass parameters
inventtable.salesPriceAgreement(XXX);



Friday 22 March 2019

Having query in dialog form get the query values by using contract class

I am using query for dialog
need to get the values of that query

Create a query.
action type menu item
add to controller class
form controller class getting the service class
here in service class we are getting contract class.
here in attribute of contact class we are passing our query


contract class:

/// <summary>
/// Contract class for releasing sales order
/// </summary>
[DataContractAttribute]
class FBHSalesReleaseOrderContract
{
    str         packedQuery;

    [DataMemberAttribute,
    AifQueryTypeAttribute('_packedQuery', querystr(FBHSalesAgreementFollowUp))]
    /// <summary>
    ///    Parm method to return and set parameters.
    /// </summary>
    /// <param name="_packedQuery">
    /// </param>
    /// <returns>
    ///    Returnd the parameter passed.
    /// </returns>
    public str parmQuery(str _packedQuery = packedQuery)
    {
        packedQuery = _packedQuery;
        return packedQuery;
    }

    /// <summary>
    ///    Method to return query.
    /// </summary>
    /// <returns>
    ///    Returnd the query.
    /// </returns>
    public Query getQuery()
    {
        return new Query(SysOperationHelper::base64Decode(packedQuery));
    }

    /// <summary>
    ///    Method to set the query.
    /// </summary>
    /// <param name="_query">
    /// </param>
    public void setQuery(Query _query)
    {
        packedQuery = SysOperationHelper::base64Encode(_query.pack());
    }

}


Controller class:

/// <summary>
/// Controller class for release order
/// </summary>
class FBHSalesReleaseOrderController extends SysOperationServiceController
{
    /// <summary>
    /// Construct for calling service class
    /// </summary>
    /// <param name = "_args">Argument</param>
    /// <returns></returns>
    public static FBHSalesReleaseOrderController construct(SysOperationExecutionMode _executionMode=SysOperationExecutionMode::Synchronous)
    {
        FBHSalesReleaseOrderController FBHSalesReleaseOrderController = new FBHSalesReleaseOrderController(classStr(FBHSalesReleaseOrderService),methodStr(FBHSalesReleaseOrderService,process),_executionMode);
        return FBHSalesReleaseOrderController;
    }

    /// <summary>
    /// Main method for controller class
    /// </summary>
    /// <param name = "_args"></param>
    public static void main(Args _args)
    {
        FBHSalesReleaseOrderController   FBHSalesReleaseOrderController;
        FBHSalesReleaseOrderController = FBHSalesReleaseOrderController::construct();
        FBHSalesReleaseOrderController.startOperation();
    }

    /// <summary>
    /// To set the dialog caption
    /// </summary>
    /// <param name = "_dialogCaption"></param>
    /// <returns></returns>
    public LabelType parmDialogCaption(LabelType _dialogCaption = "")
    {
        return "@FBH:FBH50718";
    }

    /// <summary>
    ///
    /// </summary>
    /// <returns></returns>
    protected boolean canRunInNewSession()
    {
        boolean ret;
   
        ret = super();
        ret = true;
        return ret;
    }


}


Service class:


/// <summary>
/// Service class for releasing sales order
/// </summary>
class FBHSalesReleaseOrderService
{
 
    /// <summary>
    /// Method to run the query and apply validations.
    /// </summary>
    /// <param name="_FBHSalesReleaseOrderContract">
    /// FBHSalesReleaseOrderContract contract class parameter
    /// </param>
    public void process(FBHSalesReleaseOrderContract _FBHSalesReleaseOrderContract)
    {
        Query                query;
        QueryRun             queryRun;
        query                = _FBHSalesReleaseOrderContract.getQuery();
        queryRun             = new QueryRun(query);
        query                = queryRun.query();

        QueryBuildDataSource qbds = query.dataSourceTable(tableNum(AgreementLine));
        QueryFilter filter = query.findQueryFilter(qbds, fieldId2Name(tableNum(AgreementLine), fieldNum(AgreementLine, FBHReleaseDate)));
        if (filter == null)
        {
            filter = query.addQueryFilter(qbds, fieldId2Name(tableNum(AgreementLine), fieldNum(AgreementLine, FBHReleaseDate)));
        }
       
        if (filter && filter.value() == "")
        {
            filter.value(queryValue(DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone())));
        }

        SalesAgreementHeader salesAgreementHeader;
       
        while(queryRun.next())
        {
            if (queryRun.changed(tableNum(SalesAgreementHeader)) )
            {
                salesAgreementHeader          = queryRun.get(TableNum(SalesAgreementHeader)) as SalesAgreementHeader;
                salesAgreementHeader          = SalesAgreementHeader::findAgreementId(SalesAgreementHeader.SalesNumberSequence);

                if((   SalesAgreementHeader.LatestLineExpirationDate
&& SalesAgreementHeader.LatestLineExpirationDate
<=  DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()))
||!SalesAgreementHeader::hasdeliverySchedule(SalesAgreementHeader))
                {
                    continue;
                }
                try
                {
                    ttsbegin;
                    FBHSalesReleaseOrderService::releaseOrderFromAgreement(SalesAgreementHeader,query);
                    ttscommit;
                }
                catch(Exception::Error)
                {
                    continue;
                }
            }
        }
    }

    /// <summary>
    ///  Release order from agreement
    /// </summary>
    /// <param name = "salesAgreementHeader">sales agreement from which order is to be released</param>
    /// <param name = "_query">passing selected query from dialog</param>
    public static void releaseOrderFromAgreement(SalesAgreementHeader salesAgreementHeader,Query _query = new Query())
    {
        salesCreateReleaseOrderTableTmp salesCreateReleaseOrderTabletmp;
        salesCreateReleaseOrderLineTmp  salesCreateReleaseOrderLineTmp;
        SalesAgreementHeader.Currency = Ledger::accountingCurrency(CompanyInfo::current());
        FBHSalesAgreementGenerateReleaseOrder salesAgreementGenerateReleaseOrder
                                          = FBHSalesAgreementGenerateReleaseOrder::construct();

        salesAgreementGenerateReleaseOrder.parmSalesAgreementHeader(salesAgreementHeader);
        salesAgreementGenerateReleaseOrder.parmisBatch(NoYes::Yes);
        salesAgreementGenerateReleaseOrder.parmQuery(_query);
        salesAgreementGenerateReleaseOrder.createReleaseOrderTable(salesCreateReleaseOrderTableTmp);
        salesAgreementGenerateReleaseOrder.createReleaseOrderLine(salesCreateReleaseOrderLineTmp);
        salesAgreementGenerateReleaseOrder.parmReleaseOrderTable(salesCreateReleaseOrderTableTmp);
        salesAgreementGenerateReleaseOrder.parmReleaseOrderLine(SalesCreateReleaseOrderLineTmp);

        if (salesAgreementGenerateReleaseOrder.check())
        {
            ttsbegin;

            SalesAutoCreate salesAutoCreate = SalesAutoCreate::construct(salesAgreementGenerateReleaseOrder.getreleaseorderline(), null,salesAgreementGenerateReleaseOrder.getreleaseordertable());
            salesAutoCreate.create();

            ttscommit;
        }
    }


}