public string EdiEncode(InvoiceModel invoice)
        {
            List <string> segments = new List <string>();

            segments.Add("UNH+1+INVOIC:D:96A:UN:EAN008");
            //numer faktury
            segments.Add("BGM+380+" + invoice.Number + "+" + invoice.Type);
            //data wystawienia faktury
            segments.Add("DTM+137:" + invoice.SaleDate.ToString("yyyyMMdd") + ":102");
            //dane dostawcy
            segments.Add("NAD+SU+4012345500004::9++" +
                         Edi.Filter(invoice.ProviderName) + ":::::+" +
                         Edi.Filter(invoice.ProviderAddress.Street) +
                         " " +
                         invoice.ProviderAddress.Number +
                         ":::+" + Edi.Filter(invoice.ProviderAddress.City) + "++" + invoice.ProviderAddress.PostCode + "+" + invoice.ProviderAddress.CountryCode
                         );
            segments.Add("RFF+VA:" + invoice.ProviderNip);
            //dane nabywcy
            segments.Add("NAD+BY+4012345500004::9++" +
                         Edi.Filter(invoice.BuyerName) +
                         ":::::+" +
                         Edi.Filter(invoice.BuyerAddress.Street) +
                         " " +
                         invoice.BuyerAddress.Number +
                         ":::+" +
                         Edi.Filter(invoice.BuyerAddress.City) +
                         "++" +
                         invoice.BuyerAddress.PostCode + "+" + invoice.BuyerAddress.CountryCode
                         );
            segments.Add("RFF+VA:" + invoice.BuyerNip);
            //miejsce dostwy
            if (invoice.DeliveryName != null && invoice.DeliveryAddress != null)
            {
                segments.Add("NAD+DP+4012345500004::9++" +
                             Edi.Filter(invoice.DeliveryName) +
                             ":::::+" +
                             Edi.Filter(invoice.DeliveryAddress.Street) +
                             " " +
                             invoice.DeliveryAddress.Number +
                             ":::+" +
                             Edi.Filter(invoice.DeliveryAddress.City) +
                             "++" +
                             invoice.DeliveryAddress.PostCode + "+" +
                             invoice.DeliveryAddress.CountryCode
                             );
            }
            //
            segments.Add("PAT+1");
            //data płatności
            segments.Add("DTM+13:" + invoice.PaymentDate.ToString("yyyyMMdd") + ":102");

            //wypisanie towarów/usług
            foreach (InvoiceProductModel p in invoice.Products)
            {
                //numer pozycji towarowej na fakturze++globalny numer towaru
                segments.Add("LIN+" + p.ItemNumber + "++" + p.Number);
                //nazwa towaru/uslugi
                segments.Add("IMD+C++" + p.Type + "::9:" + Edi.Filter(p.Name));
                //ilość
                segments.Add("QTY+" + p.QuantityType + ":" + p.Quantity);
                //sumaryczna wartość towarów
                segments.Add("MOA+" + p.SumAmountType + ":" + p.SumAmountNet + ":PLN");
                //cena jednostkowa netto
                segments.Add("PRI+AAA:" + p.UnitPriceNet);
            }

            //liczba pozycji towarowych
            segments.Add("CNT+" + invoice.ProductQuntity + ":120");
            //kwota do zapłaty
            segments.Add("MOA+77:" + invoice.AmountGross);
            //kwota netto
            segments.Add("MOA+79:" + invoice.AmountNet);
            //kwota podatku
            segments.Add("MOA+124:" + invoice.AmountTax);
            //kwota opodatkowana
            segments.Add("MOA+125:" + invoice.AmountTax);
            //stawka podatku
            segments.Add("TAX+7+VAT+++:::" + invoice.Tax + "+S");

            //liczba segmentow w komunikacie
            segments.Add("UNT+" + (segments.Count() + 1) + "+1");

            return(String.Join("'", segments));
        }