Skocz do zawartości

[SFERA nexo] - faktura zaliczkowa błąd


Zobacz rozwiązanie Rozwiązane przez Wojciech Szopiński,

Polecane posty

Dzień dobry, próbuję utworzyć fakturę zaliczkową przez sferę w nexo i ciągle zwraca mi błąd

"Suma płatności (1 025,00 PLN) nie jest równa kwocie do zapłaty (0,00 PLN) na dokumencie". Jest jedna pozycja na 1025 zł brutto. dodałem płatność natychmiastowa na 1025zł brutto. i ciągle to samo. 

w pozycji wrzucam

 poz.Cena.BruttoPrzedRabatem = item.AmountGross;

i tam na pewno jest 1025 brutto. 

 

                                    var pozycje = zamPositions.Where(a => a.ExternalDocID == dok.ExternalID);
                                    var platnosci = hospDocPayments.Where(a => a.ExternalDocID == dok.ExternalID);

                                    var konfFsZ = sfera.Konfiguracje().DaneDomyslne.FakturaVATZaliczkowa;

                                    var dokumentySprzedazy = sfera.DokumentySprzedazy();

                                    using (var fs = dokumentySprzedazy.Utworz(konfFsZ))
                                    {
                                        var klient = AddClientIfNotExist(sfera, dok);
                                        var mag = AddMagazynIfNotExist(sfera, dok);

                                        fs.Dane.Podmiot = klient;
                                        fs.Dane.Podtytul = dok.ExternalID;
                                        fs.Dane.Magazyn = mag;
                                        fs.Dane.DataWprowadzenia = dok.DocumentDate.Value;
                                       // fs.Dane.OperacjePrzeliczaniaPozycji = OperacjePrzeliczaniaPozycji.Brutto_ID;
                                       

                                        if (dok.Currency == "PLN")
                                        {
                                            fs.Dane.Waluta = PLN;
                                        }
                                        else if (dok.Currency == "EUR")
                                        {
                                            fs.Dane.Waluta = EUR;
                                        }

                                        decimal doZaplaty = 0m;

                                        foreach (var item in pozycje)
                                        {
                                            var asortyment = AddArticleIfNotExist(sfera, item);
                                            var poz = fs.Pozycje.Dodaj(asortyment.Id);
                                            poz.Cena.BruttoPrzedRabatem = item.AmountGross;

                                            doZaplaty += item.AmountGross;

   
                                                poz.StawkaVat = vat23;
                                        }
                     

                                        #region PLATNOSCI

                                        //_ = pi.Platnosci.DodajDomyslnaPlatnoscNatychmiastowaNaKwoteDokumentu();

                                        var formyPlatnosci = sfera.FormyPlatnosci().DaneDomyslne;
                                        var kartaPla = sfera.FormyPlatnosci().Dane.Pierwszy(a => a.Nazwa == "Karta płatnicza");
                                        var przelewForma = sfera.FormyPlatnosci().Dane.Pierwszy(a => a.Nazwa == "Przelew natychmiastowy");

                                        _ = fs.Przelicz();

                                        fs.Dane.KwotaDoZaplaty = doZaplaty;
                                        

                                        foreach (var pla in platnosci)
                                        {

                                            {
                                                var przelew = decimal.Round(pla.AmountCurrency, 2, MidpointRounding.AwayFromZero);
                                                _ = fs.Platnosci.DodajPlatnoscNatychmiastowa(przelewForma, przelew);
                                            }
                                            
                                        }
                                        #endregion


                                        if (fs.Zapisz())
                                        {
                                            //Console.WriteLine(fs.Dane.NumerWewnetrzny.PelnaSygnatura);
                                        }
                                        else
                                        {
                                            //Console.WriteLine("Błędy:");
                                            fs.WypiszBledy(dok.ExternalID);
                                        }

 

dodałem 

                                        fs.Dane.KwotaDoZaplaty = doZaplaty;
 

ale to nic nie pomogło.

 

Proszę o jakąś podpowiedź. 

 

 

 

Link to postu

Faktura zaliczkowa swoją kwotę do zapłaty wylicza z kwoty zaliczki ustawionej na pozycji dokumentu, a nie z wartości całej pozycji. W Pana przypadku faktycznie kwota do zapłaty jest zerowa gdyż ustawił Pan tylko cenę brutto na pozycji. Proszę spróbować wykonać taką samą operację w programie - efekt będzie taki sam i kwota do zapłaty będzie zerowa.

Pytanie czy wie Pan jakie kwoty zaliczek będą wpisane na pozycjach czy zna Pan tylko zaliczkę na cały dokument i będzie Pan chciał rozpisać ją automatycznie na pozycje dokumentu? Pytanie jest istotne gdyż w obu przypadkach postępowanie będzie odrobinę inne.

Link to postu
  • 4 miesiące temu...
W dniu 6.07.2023 o 12:20, Wojciech Szopiński napisał:

Faktura zaliczkowa swoją kwotę do zapłaty wylicza z kwoty zaliczki ustawionej na pozycji dokumentu, a nie z wartości całej pozycji. W Pana przypadku faktycznie kwota do zapłaty jest zerowa gdyż ustawił Pan tylko cenę brutto na pozycji. Proszę spróbować wykonać taką samą operację w programie - efekt będzie taki sam i kwota do zapłaty będzie zerowa.

Pytanie czy wie Pan jakie kwoty zaliczek będą wpisane na pozycjach czy zna Pan tylko zaliczkę na cały dokument i będzie Pan chciał rozpisać ją automatycznie na pozycje dokumentu? Pytanie jest istotne gdyż w obu przypadkach postępowanie będzie odrobinę inne.

Witam odnowię trochę temat. Jak Wykonać przypadek gdzie nie będę rozliczał poszczególnych pozycji a znam zaliczki na cały dokument. Chcę żeby subiekt rozpisał zaliczki automatycznie. Tak jak Pan wspomniał powyżej. 

Link to postu

W nexo zaliczka dokumentu jest zawsze rozpisywana na pozycje i do obsługi tej procedury służy obiekt implementujący interfejs IFunkcjaRozdzielajacaZaliczkeNaPozycje. W nexo wbudowane są trzy algorytmy rozdzielania zaliczki na pozycje (proporcjonalnie, kolejno wg pozycji i kolejno wg stawki). Na dokumencie zaliczkowym wybrany algorytm rozdzielania określany jest w polu IDokumentSprzedazy.Dane.AspektZaliczki.FunkcjaRozdzielajacaZaliczke i podawany jest tam identyfikator (Guid) wybranej funkcji (domyślnie zawsze jest to algorytm proporcjonalny o identyfikatorze FF809F2F-8136-44DC-A088-46C1FFBA114D). Wszystkie funkcje można przeglądać i "powoływać do życia" przy pomocy obiektu implementującego interfejs IFabrykaFunkcjiRozdzielajacychZaliczkeNaPozycje, który to można pobrać "legalnie" z uchwytu do sfery. Kod mógłby więc wyglądać mniej więcej tak:

using (IDokumentSprzedazy zaliczka = dokumentySprzedazy.UtworzFaktureZaliczkowa())
{
	IFabrykaFunkcjiRozdzielajacychZaliczkeNaPozycje fabrykaFunkcjiRozdzielajacychZaliczke = sfera.PodajObiektTypu<IFabrykaFunkcjiRozdzielajacychZaliczkeNaPozycje>();
	zaliczka.PodmiotyDokumentu.UstawNabywceWedlugNIP("8945986588");
	zaliczka.Pozycje.Dodaj("DZSO20", 10m).Cena.BruttoPoRabacie = 10m;
	zaliczka.Pozycje.Dodaj("POYAR01", 10m).Cena.BruttoPoRabacie = 10m;
	zaliczka.Dane.AspektZaliczki.Zaliczka = 100m;
	zaliczka.Dane.AspektZaliczki.FunkcjaRozdzielajacaZaliczke = new Guid("FF809F2F-8136-44DC-A088-46C1FFBA114D");
	zaliczka.Dane.Uwagi = "proporcjonalnie - wywołane ręcznie";
	if (fabrykaFunkcjiRozdzielajacychZaliczke.SprobujZnalezc(zaliczka.Dane.AspektZaliczki.FunkcjaRozdzielajacaZaliczke.Value, out IFunkcjaRozdzielajacaZaliczkeNaPozycje funkcja))
		funkcja.RozdzielZaliczke(zaliczka.Dane);
	else
		throw new InvalidOperationException("Niepoprawny identyfikator funkcji rozdzielającej zaliczkę.");
	zaliczka.Platnosci.DodajDomyslnaPlatnoscNatychmiastowaNaKwoteDokumentu();
	if (!zaliczka.Zapisz())
    	throw new InvalidOperationException("Nie udało się zapisać zaliczki częściowej.");
}

Dodam jeszcze, że do wersji wiosennej mamy w planach usprawnienie pewnych aspektów tego tematu. Identyfikatory wbudowanych funkcji rozdzielających zaliczkę będzie można uzyskać ze statycznej klasy, a samo wywoływanie algorytmu rozpisywania będzie możliwe od strony obiektu biznesowego dokumentu sprzedaży (IDokumentSprzedazy) bez konieczności powoływania do życia we własnym kodzie fabryki funkcji. Warto również wspomnieć o tym, że można również implementować własne algorytmy rozpisywania zaliczki na pozycji i wdrażać do nexo w postaci plugina.

Edytowane przez Wojciech Szopiński
  • Dziękuję 1
Link to postu
×
×
  • Dodaj nową pozycję...