public void GenerujRozliczenie()
        {
            KasaModule kasaModule = KasaModule.GetInstance(Session);

            foreach (var kontrahent in Kontrahenci)
            {
                Wplata    wpłata    = null;
                Naleznosc należność = null;

                SubTable st = kasaModule.RozrachunkiIdx.WgPodmiot[kontrahent, Date.MaxValue];
                foreach (RozrachunekIdx idx in st)
                {
                    if (idx.Typ == TypRozrachunku.Wpłata && wpłata == null)
                    {
                        wpłata = (Wplata)idx.Dokument;
                    }
                    if (idx.Typ == TypRozrachunku.Należność && należność == null && !idx.Dokument.Bufor)
                    {
                        należność = (Naleznosc)idx.Dokument;
                    }
                    if (wpłata != null && należność != null)
                    {
                        break;
                    }
                }

                if (wpłata == null || należność == null)
                {
                    throw new InvalidOperationException(string.Format("Nieznalezione wpłata lub należność dla kontrahenta {0}", kontrahent.Nazwa));
                }

                using (ITransaction t = Session.Logout(true))
                {
                    RozliczenieSP rozliczenie = new RozliczenieSP(należność, wpłata);
                    kasaModule.RozliczeniaSP.AddRow(rozliczenie);
                    t.Commit();
                }
            }
        }
        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 #3
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));
        }