public InvoiceModel EdiDecode(string strEdi)
        {
            InvoiceModel invoice = new InvoiceModel();

            string[] segments = Edi.ParseToSegmets(strEdi);

            int nSegments = segments.Length;

            // ustawiam czy odczytywane dane należą do dostwcy czy nabywcy, lub czy są to dane dostwy
            // 0 - dostawca, 1 - nabywca, 2 - dane do dostwy
            int who = 0;

            string[]            arguments;
            string[]            parameters;
            InvoiceAddressModel address;
            int productIndex = -1;
            InvoiceProductModel        product;
            List <InvoiceProductModel> products = new List <InvoiceProductModel>();
            bool details = false;

            for (int i = 0; i < nSegments; i++)
            {
                if (i == 23)
                {
                }
                segments[i] = segments[i].Trim();
                if (String.IsNullOrEmpty(segments[i]))
                {
                    continue;
                }
                arguments = Edi.ParseToArguments(segments[i]);

                switch (arguments[0])
                {
                case "UNH":
                    parameters = Edi.ParseToParameters(arguments[2]);
                    if (parameters[0] != "INVOIC")
                    {
                        return(null);
                    }
                    break;

                case "BGM":
                    if (arguments[1] == "380")
                    {
                        invoice.Number = arguments[2];
                        invoice.Type   = Int16.Parse(arguments[3]);
                    }
                    break;

                case "DTM":
                    DateTime date;
                    parameters = Edi.ParseToParameters(arguments[1]);
                    if (parameters[2] == "102")
                    {
                        date = DateTime.ParseExact(parameters[1], "yyyyMMdd", null);
                    }
                    else
                    {
                        date = DateTime.Parse(parameters[1]);
                    }
                    switch (parameters[0])
                    {
                    case "137":
                        invoice.SaleDate = date;
                        break;

                    case "13":
                        invoice.PaymentDate = date;
                        break;
                    }
                    break;

                case "NAD":
                    address             = new InvoiceAddressModel();
                    parameters          = Edi.ParseToParameters(arguments[5]);
                    address.Street      = parameters[0];
                    address.City        = arguments[6];
                    address.PostCode    = arguments[8];
                    address.CountryCode = arguments[9];

                    switch (arguments[1])
                    {
                    case "SU":
                        //dane dostawcy
                        who                     = 0;
                        parameters              = Edi.ParseToParameters(arguments[4]);
                        invoice.ProviderName    = parameters[0];
                        invoice.ProviderAddress = address;
                        break;

                    case "BY":
                        //dane nabywcy
                        who                  = 1;
                        parameters           = Edi.ParseToParameters(arguments[4]);
                        invoice.BuyerName    = parameters[0];
                        invoice.BuyerAddress = address;
                        break;

                    case "DP":
                        //dane do dostawy
                        who                     = 2;
                        parameters              = Edi.ParseToParameters(arguments[4]);
                        invoice.DeliveryName    = parameters[0];
                        invoice.DeliveryAddress = address;
                        break;
                    }
                    break;

                case "RFF":
                    parameters = Edi.ParseToParameters(arguments[1]);
                    if (parameters[0] == "VA")
                    {
                        switch (who)
                        {
                        case 0:
                            //nip dostawcy
                            invoice.ProviderNip = parameters[1];
                            break;

                        case 1:
                            //nip nabywcy
                            invoice.BuyerNip = parameters[1];
                            break;
                        }
                    }
                    break;

                case "PAT":
                    details = true;
                    break;

                case "LIN":
                    productIndex++;
                    product            = new InvoiceProductModel();
                    product.ItemNumber = Int16.Parse(arguments[1]);
                    parameters         = Edi.ParseToParameters(arguments[3]);
                    product.Number     = parameters[0];
                    products.Insert(productIndex, product);
                    break;

                case "IMD":
                    product      = products[productIndex];
                    product.Name = arguments[2];
                    parameters   = Edi.ParseToParameters(arguments[3]);
                    product.Type = parameters[0];
                    break;

                case "QTY":
                    product              = products[productIndex];
                    parameters           = Edi.ParseToParameters(arguments[1]);
                    product.QuantityType = Int16.Parse(parameters[0]);
                    product.Quantity     = int.Parse(parameters[1]);
                    break;

                case "MOA":
                    parameters = Edi.ParseToParameters(arguments[1]);
                    if (details)
                    {
                        switch (parameters[0])
                        {
                        case "66":
                        case "35E":
                            product = products[productIndex];
                            product.SumAmountType = parameters[0];
                            product.SumAmountNet  = float.Parse(parameters[1]);
                            break;
                        }
                    }
                    else
                    {
                        float amount = float.Parse(parameters[1]);
                        switch (parameters[0])
                        {
                        case "77":
                            invoice.AmountGross = amount;
                            break;

                        case "79":
                            invoice.AmountNet = amount;
                            break;

                        case "124":
                            invoice.AmountTax = amount;
                            break;
                        }
                    }
                    break;

                case "PRI":
                    parameters = Edi.ParseToParameters(arguments[1]);
                    if (parameters[0] == "AAA")
                    {
                        product = products[productIndex];
                        product.UnitPriceNet = float.Parse(parameters[1]);
                    }
                    break;

                case "TAX":
                    if (arguments[1] == "7" && arguments[2] == "VAT")
                    {
                        parameters = Edi.ParseToParameters(arguments[5]);
                        if (details)
                        {
                            product     = products[productIndex];
                            product.Tax = Int16.Parse(parameters[3]);
                        }
                        else
                        {
                            invoice.Tax = Int16.Parse(parameters[3]);
                        }
                    }
                    break;

                case "UNS":
                    if (arguments[1] == "S")
                    {
                        invoice.Products = products;
                        details          = false;
                    }
                    break;

                case "CNT":
                    parameters             = Edi.ParseToParameters(arguments[1]);
                    invoice.ProductQuntity = int.Parse(parameters[0]);
                    break;
                }
            }

            return(invoice);
        }