Example #1
0
        public bool UtworzTowar(TowarModel towarModel)
        {
            using (Session s = hm.Session.Login.CreateSession(false, true))
            {
                var tw = TowaryModule.GetInstance(s);
                using (ITransaction t = s.Logout(true))
                {
                    var nowyTowar = new Towar()
                    {
                        Nazwa = towarModel.Nazwa,
                        Kod   = towarModel.Kod,
                        EAN   = towarModel.EAN
                    };
                    tw.Towary.AddRow(nowyTowar);

                    nowyTowar.Jednostka = tw.Jednostki.WgKodu[towarModel.Jednostka];

                    var defCeny = tw.DefinicjeCen.WgNazwy["Podstawowa"];
                    nowyTowar.Jednostka = tw.Jednostki.WgKodu[towarModel.Jednostka];
                    nowyTowar.Ceny[tw.DefinicjeCen.WgNazwy["Podstawowa"]].Netto = new Soneta.Types.DoubleCy(towarModel.Cena, "PLN");

                    t.Commit();
                }
                s.Save();
            }

            return(true);
        }
        private View initView()
        {
            var tm   = TowaryModule.GetInstance(_session);
            var view = tm.Towary.CreateView();

            view.Context    = Context.Empty.Clone(_session);
            view.NewRowType = typeof(Towar);
            return(view);
        }
Example #3
0
        private SubTable initDatasource()
        {
            var tm        = TowaryModule.GetInstance(_session);
            var tkey      = tm.Towary.PrimaryKey;
            var condition = RowCondition.Empty;

            condition &= new FieldCondition.Equal("Typ", TypTowaru.Towar);
            condition &= new FieldCondition.Equal("Features.Synchronizowany", true);
            return(tkey[condition]);
        }
Example #4
0
        protected View ViewCreate(WParams pars)
        {
            var condUlubione = RowCondition.Empty;
            var rc           = RowCondition.Empty;
            var tm           = TowaryModule.GetInstance(pars.Context.Session);
            var view         = tm.Towary.CreateView();

            if (pars.KontaktOsoba == null)
            {
                condUlubione &= new FieldCondition.Null("Zapis", true);
            }
            else
            {
                condUlubione &= new FieldCondition.Equal("Zapis", pars.KontaktOsoba);
            }

            rc             &= new FieldCondition.Equal("Blokada", false);
            rc             &= new FieldCondition.Exists("TowaryUlubione", "Towar", condUlubione);
            view.Condition &= rc;

            return(view);
        }
Example #5
0
        public IHttpActionResult Get(Guid guid)
        {
            try
            {
                using (Session session = EnovaClient.Login.CreateSession(true, false))
                {
                    TowaryModule tm    = TowaryModule.GetInstance(session);
                    Towar        towar = tm.Towary[guid];

                    if (towar != null)
                    {
                        return(Ok(towar.ToDto()));
                    }

                    return(NotFound());
                }
            }
            catch (Soneta.Business.RowNotFoundException)
            {
                return(NotFound());
            }
        }
Example #6
0
        public void GenerujInwentaryzacje()
        {
            HandelModule   handelModule   = HandelModule.GetInstance(Session);
            TowaryModule   towaryModule   = TowaryModule.GetInstance(Session);
            MagazynyModule magazynyModule = MagazynyModule.GetInstance(Session);

            using (ITransaction tran = Session.Logout(true))
            {
                DokumentHandlowy dokument = new DokumentHandlowy();

                // Nowy dokument należy związać z definicją dokumentu
                // handlowego. W tym przypadku wyszukujemy definicje wyszukujemy
                // z kolekcji standardowych definicji.
                dokument.Definicja = handelModule.DefDokHandlowych.Inwentaryzacja;

                dokument.Magazyn = magazynyModule.Magazyny.Firma;
                handelModule.DokHandlowe.AddRow(dokument);

                Towar towar = towaryModule.Towary.WgKodu["BIKINI"];
                if (towar != null)
                {
                    using (var tranPozycji = Session.Logout(true))
                    {
                        PozycjaDokHandlowego pozycja = new PozycjaDokHandlowego(dokument);
                        handelModule.PozycjeDokHan.AddRow(pozycja);
                        pozycja.Towar = towar;
                        pozycja.Ilosc = new Quantity(10, null);
                        pozycja.Cena  = new DoubleCy(12.34);
                        tranPozycji.CommitUI();
                    }
                }
                tran.Commit();
            }

            // Dokument ten znajduje się w buforze, więc żeby stany magazynowe
            // mogły być zmodyfikowane należy zatwierdzić ten wygenerowany
            // właśnie dokument.
        }
Example #7
0
        public async Task <IHttpActionResult> GetPriceForCustomer(Guid productGuid, Guid customerGuid)
        {
            using (Session session = EnovaClient.Login.CreateSession(true, false))
            {
                TowaryModule tm         = TowaryModule.GetInstance(session);
                CRMModule    cm         = CRMModule.GetInstance(session);
                Towar        towar      = tm.Towary[productGuid];
                Kontrahent   kontrahent = cm.Kontrahenci[customerGuid];

                var worker = new CenyKontrahentaWorker();
                worker.Towar         = towar;
                worker.Kontrahent    = kontrahent;
                worker.DefinicjaCeny = tm.DefinicjeCen["Hurtowa"];

                return(Ok(new ProductPriceInfo
                {
                    ProductGuid = productGuid,
                    CustomerGuid = customerGuid,
                    Price = (decimal)worker.NettoPrzedRabatem.Value,
                    Rebate = worker.Rabat
                }));
            }
        }
        public void GenerujPrzyjecieMagazynowe(Context context)
        {
            // Metoda tworzy nowy dokument PZ2 wypełniając go przykładowymi
            // pozycjami

            // Rozpoczęcie tworzenia dokumentu (w ogóle operacji na logice
            // biznesowej) polega na utworzeniu obiektu sesji (Session),
            // w którym będą odbywać się poszczególne operacje.
            // Pierwszy parametr określa, czy sesja jest tylko do odczytu
            // danych, drugi parametr, czy sesja będzie modyfikować ustawienia
            // konfiguracyjne (tj. definicje dokumentów, jednostki,
            // definicje cen, itp). Standardowo obydwa parametry dajemy false.
            using (Session session = context.Login.CreateSession(false, false))
            {
                // Po utworzeniu sesji dobrze jest sobie przygotować odpowiednie
                // zmienne reprezentujące poszczególne moduły programu w tej sesji.
                // Wystarczy przygotwać tylko te moduły, które będą nam potrzebne.
                HandelModule   handelModule   = HandelModule.GetInstance(session);
                TowaryModule   towaryModule   = TowaryModule.GetInstance(session);
                MagazynyModule magazynyModule = MagazynyModule.GetInstance(session);
                CRMModule      CRMModule      = CRMModule.GetInstance(session);

                // Wszystkie operacje wykonujemy w transakcji sesji, którą należy
                // na początku otworzyć. W transakcji możemy wskazać czy będą
                // robione zmiany w danych.
                using (ITransaction tran = session.Logout(true))
                {
                    // Następnie należy utworzyć nowy obiekt reprezentujący dokument
                    // handlowy (nagłówek dokumentu)
                    DokumentHandlowy dokument = new DokumentHandlowy();

                    // Nowy dokument nalezy również związać z definicją dokumentu
                    // handlowego. W tym przypadku wyszukujemy definicje wyszukujemy
                    // wg jej symbolu "PZ 2".
                    DefDokHandlowego definicja = handelModule.DefDokHandlowych.WgSymbolu["PZ 2"];
                    if (definicja == null)
                    {
                        throw new InvalidOperationException("Nieznaleziona definicja dokumentu PZ 2.");
                    }
                    dokument.Definicja = definicja;

                    // Dokument należy też przypisać do magazynu, do którego będzie
                    // przyjmowany towar. Poniżej przypisywany jest standardowy
                    // magazyn programu "Firma".
                    dokument.Magazyn = magazynyModule.Magazyny.Firma;

                    // Ale można wyszukać magazyn np wg symbolu
                    // dokument.Magazyn = mm.Magazyny.WgSymbol["MAG1"];

                    // Oraz dodajemy nowo utworzony dokument do aktualnej sesji
                    handelModule.DokHandlowe.AddRow(dokument);

                    // Przyjęcie magazynowe PZ 2 wymaga również przypisania kontrahenta,
                    // od którego towaru jest przyjmowany.
                    // Przykład prezentuje przypisanie dokumentowi kontrahenta
                    // o kodzie "ABC".
                    Kontrahent kontrahent = CRMModule.Kontrahenci.WgKodu["ABC"];
                    if (kontrahent == null)
                    {
                        throw new InvalidOperationException("Nieznaleziony kontrahent o kodzie ABC.");
                    }
                    dokument.Kontrahent = kontrahent;

                    // W kartotece towarów wyszukać towar. Przykład poniżej
                    // prezentuje wyszukanie towaru wg kodu EAN "2000000000022".
                    // Ponieważ w kartotece może znajdować się wiele towarów o tym
                    // samym kodzie, wybrany zostanie pierwszy z nich.
                    Towar towar = towaryModule.Towary.WgEAN["2000000000954"].GetNext();
                    if (towar != null)
                    {
                        // Utworzyć nową transakcję dla każdej pozycji osobno
                        using (var tranPozycji = session.Logout(true))
                        {
                            // Utworzyć nowy obiekt pozycji dokumentu handlowego, który
                            // zostanie dodany do sesji
                            PozycjaDokHandlowego pozycja = new PozycjaDokHandlowego(dokument);
                            handelModule.PozycjeDokHan.AddRow(pozycja);

                            // Przypisać towar do nowo utworzonej pozycji dokumentu, czyli
                            // wskazać, który towar ma być przyjęty do magazynu
                            pozycja.Towar = towar;

                            // W pozycji dokumentu należy jeszcze wprowadzić ilość
                            // towaru przyjmowanego na magazyn. Ilość reprezentowana jest
                            // przez liczbę 10 będącą wartością ilości (pierwszy parametr)
                            // oraz jednostkę opisującą tę ilość (drugi parametr). Jeżeli
                            // jednostka jest null, to przyjmowana jest jednostka z
                            // karty towarowej.
                            // Poniżej znajduje się również wykomentowany przykład, w
                            // którym w sposób jawny jest wskazanie na jednostkę w metrach.
                            pozycja.Ilosc = new Quantity(10, null);
                            // pozycja.Ilosc = new Quantity(10, "m");

                            // Pozycji dokumentu należy również przypisać cenę w jakiej
                            // będzie on wprowadzany do magazynu (cena zakupu).
                            // Poniżej przypisywana jest cena w PLN. Dlatego nie jest
                            // wyspecyfikowany drugi parametr określający walutę ceny.
                            pozycja.Cena = new DoubleCy(12.34);

                            // Poszczególnym pozycją można przypisać również dodatkowe
                            // cechy, które zależne są od konfiguracji programu. Przykład
                            // pokazuje jak ustawić cechę z numerem beli.
                            //
                            // pozycja.Features["Numer beli"] = "123456";

                            // Na każdej pozycji dokumentu należy zatwierdzić osobną
                            // transakcję metodą CommitUI
                            tranPozycji.CommitUI();
                        }
                    }

                    // Dokumentowi podobnie jak pozycji dokumentu również można
                    // przypisać dodatkowe cechy zależne od konfiguracji programu.
                    // Przykład pokazuje jak ustawić cechę z lokalizacją.
                    //
                    // dokument.Features["Lokalizacja"] = "AB/12";

                    // Po dokonaniu wszystkich operacji na dokumencie można ten
                    // dokument wprowadzić (zatwierdzić), co powoduje zabezpieczenie
                    // przed przypadkową edycją tego dokumentu oraz przeniesienie go
                    // do ewidencji dokumentów księgowych.
                    dokument.Stan = StanDokumentuHandlowego.Zatwierdzony;

                    // Wszystkie operacje zostały poprawnie zakończone i zapewne
                    // chcemy zatwierdzić transakcję sesji.
                    tran.Commit();
                }

                // Powyższe operacje były wykonywane na sesji, czyli w pamięci.
                // Teraz należy rezultat prac zapisać do bazy danych.
                session.Save();
            }

            // I to wszystko. Dokument PZ znajduje się w bazie.
        }
Example #9
0
 public TowarWebApi(Session session)
 {
     getTowar = new GetTowarInfo(session);
     hm       = HandelModule.GetInstance(session);
     tw       = TowaryModule.GetInstance(session);
 }
        public void GenerujFakture()
        {
            HandelModule   handelModule  = HandelModule.GetInstance(Session);
            TowaryModule   towaryModule  = TowaryModule.GetInstance(Session);
            MagazynyModule magazynyModue = MagazynyModule.GetInstance(Session);
            CRMModule      CRMModule     = CRMModule.GetInstance(Session);
            KasaModule     kasaModule    = KasaModule.GetInstance(Session);

            using (ITransaction tran = Session.Logout(true))
            {
                DokumentHandlowy dokument = new DokumentHandlowy();
                dokument.Definicja = handelModule.DefDokHandlowych.FakturaSprzedaży;
                dokument.Magazyn   = magazynyModue.Magazyny.Firma;

                handelModule.DokHandlowe.AddRow(dokument);

                Kontrahent kontrahent = CRMModule.Kontrahenci.WgKodu["ABC"];
                if (kontrahent == null)
                {
                    throw new InvalidOperationException("Nieznaleziony kontrahent o kodzie ABC.");
                }
                dokument.Kontrahent = kontrahent;

                Towar towar = towaryModule.Towary.WgKodu["MONTAZ"];
                if (towar != null)
                {
                    using (var tranPozycji = Session.Logout(true))
                    {
                        PozycjaDokHandlowego pozycja = new PozycjaDokHandlowego(dokument);
                        handelModule.PozycjeDokHan.AddRow(pozycja);
                        pozycja.Towar = towar;
                        pozycja.Ilosc = new Quantity(10, null);
                        pozycja.Cena  = new DoubleCy(12.34);

                        tranPozycji.CommitUI();
                    }
                }

                // Modyfikacja płatności
                // Standradowo dokument ma wygenerowaną przez system jedną płatność. Zmienimy w niej
                // sposób zapłaty, domyślną ewidencję oraz termin płatności.
                // Jeżeli chcemy mieć więcej niż jedną płatność, to zmniejszamy kwotę w instniejącej
                // i dodajemy kolejne płatności aż do zrównoważenia kwoty płatności i dokumentu.
                // Dodatkowo, jeżeli generujemy płatność gotówkową, to dodamy do niej informację
                // o zapłacieniu i odpowiedni wpis na raport kasowy (musi być założony i niezatwierdzony).

                // Wymuszamy przeliczenie zdarzeń. W przeciwnym razie sumy mogą być nieaktualne.
                // Normalnie robi to za nas UI.
                Session.Events.Invoke();

                Naleznosc gotowka = null;
                Naleznosc przelew = null;
                // Pobieramy isntniejacą płatność. System zrobił na pewno jedną (o ile wartość
                // dokumentu jest różna od zera).
                // Możemy też płatność usunąć i odtworzyć dokładnie tak samo jak to jest
                // robione z dodatkową płatnością.
                Naleznosc platnosc = (Naleznosc)dokument.Platnosci.GetNext();
                if (Params.Gotowka && Params.Przelew)
                {
                    Currency kwota = platnosc.Kwota;
                    platnosc.Kwota = platnosc.Kwota / 2;
                    gotowka        = platnosc;
                    // Tworzymy nowy obiekt należności
                    przelew = new Naleznosc(dokument);
                    // Dodajemy go do tabeli Platnosci
                    kasaModule.Platnosci.AddRow(przelew);
                    // Ustawiamy kwotę
                    przelew.Kwota = kwota - gotowka.Kwota;
                }
                else if (Params.Gotowka)
                {
                    gotowka = platnosc;
                }
                else if (Params.Przelew)
                {
                    przelew = platnosc;
                }

                // Mamy już potrzebne płatności. Teraz musimy im zmodyfikować sposób zapłaty,
                // ewidencję SP oraz termin płatności.

                // Najpier przelew
                if (przelew != null)
                {
                    // Wyszukujemy sposób zapłaty. Na szczęście dla gotówki mamy standardowy.
                    // Możemy też szukać wg nazwy lub Guid.
                    przelew.SposobZaplaty = kasaModule.SposobyZaplaty.Przelew;

                    // Szukamy ewidencję SP
                    przelew.EwidencjaSP = kasaModule.EwidencjeSP.WgNazwy["Firmowy rachunek bankowy"];

                    // I termin płatności
                    przelew.TerminDni = 21;
                }

                if (gotowka != null)
                {
                    // Wyszukujemy sposób zapłaty. Na szczęście dla gotówki mamy standardowy.
                    // Możemy też szukać wg nazwy lub Guid.
                    gotowka.SposobZaplaty = kasaModule.SposobyZaplaty.Gotówka;

                    // Szukamy ewidencję SP
                    gotowka.EwidencjaSP = kasaModule.EwidencjeSP.WgNazwy["Kasa gotówkowa"];

                    // I termin płatności
                    gotowka.TerminDni = 0;

                    // Pozostaje to teraz zapłacić.
                    // Szukamy raportu kasowego. Musi być istnieć i być otwarty lub
                    // nie istnieć i mieć flagę automatyczny.
                    // Oczywiście ewidencja SP musi być typu kasa.
                    RaportESP raport = ((Kasa)gotowka.EwidencjaSP).NowyRaport(dokument, dokument.Data);
                    // Tworzymy nowy dokument wpłaty
                    Wplata wpłata = new Wplata(dokument, raport);
                    // Dodajemy go do tabeli
                    kasaModule.Zaplaty.AddRow(wpłata);
                    // Ustawiamy podmiot (taki jak w należności)
                    wpłata.Podmiot = dokument.Kontrahent;
                    // ... sposób zapłaty
                    wpłata.SposobZaplaty = gotowka.SposobZaplaty;
                    // ... opis wystawrczy zainicjować, zostanie przeliczony podczas zapisu
                    wpłata.Opis = "?";
                    // Oraz oczywiście kwotę
                    wpłata.Kwota = gotowka.Kwota;

                    // Wpłata z należnością zostaną rozliczone podczas zatwierdzania dokumentu
                }

                dokument.Stan = StanDokumentuHandlowego.Zatwierdzony;

                tran.Commit();
            }
        }
Example #11
0
        public Towar GetTowar(string ean)
        {
            var towaryModule = TowaryModule.GetInstance(session);

            return(towaryModule.Towary.WgEAN[ean].GetFirst());
        }
Example #12
0
        public IHttpActionResult Post(DokumentHandlowySaveDataRequestDto request)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    DokumentHandlowy dokumentHandlowy = null;

                    using (Session session = EnovaClient.Login.CreateSession(false, false))
                    {
                        HandelModule   hm = HandelModule.GetInstance(session);
                        CRMModule      cm = CRMModule.GetInstance(session);
                        MagazynyModule mm = MagazynyModule.GetInstance(session);
                        TowaryModule   tm = TowaryModule.GetInstance(session);
                        KasaModule     km = KasaModule.GetInstance(session);

                        using (ITransaction t = session.Logout(true))
                        {
                            dokumentHandlowy = new DokumentHandlowy();
                            var definicja = hm.DefDokHandlowych[request.DefinicjaGuid];
                            dokumentHandlowy.Definicja = definicja;

                            var magazyn = request.MagazynGuid.HasValue ? mm.Magazyny[request.MagazynGuid.Value] : mm.Magazyny.Firma;
                            dokumentHandlowy.Magazyn = magazyn;

                            hm.DokHandlowe.AddRow(dokumentHandlowy);

                            request.Features?.Foreach((feature) =>
                            {
                                dokumentHandlowy.Features[feature.Name] = feature.Value;
                            });

                            Kontrahent kontrahent = cm.Kontrahenci[request.KontrahentGuid];
                            dokumentHandlowy.Kontrahent = kontrahent;

                            foreach (var pozDto in request.Pozycje)
                            {
                                Towar towar = tm.Towary[pozDto.TowarGuid];
                                PozycjaDokHandlowego pozycja = new PozycjaDokHandlowego(dokumentHandlowy);
                                hm.PozycjeDokHan.AddRow(pozycja);

                                pozycja.Towar = towar;
                                pozycja.Ilosc = new Quantity(pozDto.Ilosc);
                                if (pozDto.CenaNetto.HasValue)
                                {
                                    pozycja.Cena = new Soneta.Types.DoubleCy(pozDto.CenaNetto.Value);
                                }
                                if (pozDto.Rabat.HasValue)
                                {
                                    pozycja.Rabat = new Percent(pozDto.Rabat.Value / 100M);
                                }
                            }

                            session.Events.Invoke();

                            if (request.Platnosci?.Any() ?? false)
                            {
                                var naleznosc      = (Naleznosc)dokumentHandlowy.Platnosci.GetNext();
                                var pozostalaKwota = naleznosc.Kwota;

                                request.Platnosci?.Foreach((platnoscDto) =>
                                {
                                    if (naleznosc == null)
                                    {
                                        naleznosc = new Naleznosc(dokumentHandlowy);
                                        km.Platnosci.AddRow(naleznosc);
                                    }

                                    if (platnoscDto.SposobZaplaty.HasValue)
                                    {
                                        switch (platnoscDto.SposobZaplaty.Value)
                                        {
                                        case SposobZaplatyDto.Gotowka:
                                            naleznosc.SposobZaplaty = km.SposobyZaplaty.Gotówka;
                                            break;

                                        case SposobZaplatyDto.Przelew:
                                            naleznosc.SposobZaplaty = km.SposobyZaplaty.Przelew;
                                            break;
                                        }
                                    }

                                    if (platnoscDto.Kwota.HasValue)
                                    {
                                        naleznosc.Kwota = platnoscDto.Kwota.Value;
                                        pozostalaKwota -= platnoscDto.Kwota.Value;
                                    }
                                    else
                                    {
                                        naleznosc.Kwota = pozostalaKwota;
                                        pozostalaKwota  = 0;
                                    }

                                    if (platnoscDto.TerminDni.HasValue)
                                    {
                                        naleznosc.TerminDni = platnoscDto.TerminDni.Value;
                                    }

                                    if (naleznosc.SposobZaplaty == km.SposobyZaplaty.Gotówka && naleznosc.TerminDni == 0)
                                    {
                                        RaportESP raport = ((Kasa)naleznosc.EwidencjaSP).NowyRaport(dokumentHandlowy, dokumentHandlowy.Data);
                                        Wplata wplata    = new Wplata(dokumentHandlowy, raport);
                                        km.Zaplaty.AddRow(wplata);
                                        wplata.Podmiot       = dokumentHandlowy.Kontrahent;
                                        wplata.SposobZaplaty = naleznosc.SposobZaplaty;
                                        wplata.Opis          = "?";
                                        wplata.Kwota         = naleznosc.Kwota;
                                    }

                                    naleznosc = null;
                                });
                            }

                            session.Events.Invoke();

                            dokumentHandlowy.Stan = StanDokumentuHandlowego.Zatwierdzony;
                            t.Commit();
                        }

                        session.Save();
                    }

                    return(Ok(new ResponseDto(dokumentHandlowy)));
                }
                catch (FeatureRequiredVerifier ex)
                {
                    return(BadRequest(ex.Description));
                }
                catch (Exception ex)
                {
                    return(BadRequest(ex.ToString()));
                }
            }
            return(BadRequest(ModelState));
        }
        public string WyswietlTowary()
        {
            // Przygotować zmienną do gromadzenia wyników
            StringBuilder sb = new StringBuilder();

            // Towary znajdują się w module Towary, ale kontrahenci
            // też się przydadzą
            TowaryModule towaryModule = TowaryModule.GetInstance(Session);
            CRMModule    CRMModule    = CRMModule.GetInstance(Session);

            // Następnie odczytujemy obiekt reprezentujący tabele
            // wszystkich towarów znajdujących się w bazie danych
            Towary towary = towaryModule.Towary;

            // Jeżeli chcemy przeglądnąć wszystkie towary to
            // można wykorzystać enumerator w celu ich przeglądnięcia.
            // Przeglądanie będzie odbywać się wg nazwy towaru.
            // Zostanie wyciągnięta mało ciekawa statystyka.
            int suma = 0;

            foreach (Towar towar in towary.WgNazwy)
            {
                // Tutaj można umieścić kod przetwarzający towar
                suma += towar.Nazwa.Length;
            }
            sb.AppendLine(string.Format(
                              "Suma długości nazw wszystkich towarów: {0} znaków", suma));

            // Częściej zdarza się jednak, że chcemy wyszukać towary
            // spełniające pewne warunki, które najlepiej gdyby liczyły się
            // na serwerze SQL. W tym celu należy uzyskać obiekt widoku view.
            View view = towary.CreateView();

            // I założyć filtr, np tylko towary o cesze 'Kolor'
            // równiej wartości 'Czerwony'. Warunek zakładany jest wówczas
            // gdy cecha 'Kolor' w ogóle istnieje.
            if (towary.FeatureDefinitions.Contains("Kolor"))
            {
                view.Condition &= new FieldCondition.Equal("Features.Kolor", "Czerwony");
            }

            // Można również zakładać warunki na pola będące referencjami
            // do innych obiektów.
            // Dołóżmy jeszcze warunek, dla towarów pochodzących od dostawcy
            // 'ABC', o ile taki kontrahent istnieje w bazie.
            Kontrahent kontrahentABC = CRMModule.Kontrahenci.WgKodu["ABC"];

            if (kontrahentABC != null)
            {
                view.Condition &= new FieldCondition.Equal("Dostawca", kontrahentABC);
            }

            // Teraz możemy przeglądnąć otrzymaną listę
            foreach (Towar towar in view)
            {
                sb.AppendLine(string.Format("Kod={0}, Nazwa={1}",
                                            towar.Kod, towar.Nazwa));
            }

            // Zwracamy rezultat
            return(sb.ToString());
        }