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. }
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. }
private System.Collections.Generic.IEnumerable <Obrot> GetSalesInPeriod() => MagazynyModule.GetInstance(Session) .Obroty.WgTowar .Where(o => FromTo.Contains(o.Data));
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(); } }
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)); }