Radomił Ząbik 310 Napisano 3 Października 2018 Udostępnij Napisano 3 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ Natrafiliśmy na dosyć nietypowy problem, ale zacznę od scenariusza: - posiadamy cennik dodatkowy, na pewną grupę elementów - 30 sierpnia, zostało wystawione zamówienie na element z cennika i zaczytała się cena 21,87 - z dniem pierwszego września, koleżanka zmieniła w cenniku dodatkowym, cenę tego elementu na 25,50 - 10 września, wystawiliśmy WZ za pomocą Sfery (kod poniżej) i cena zmieniła się na tą z nowego cennika, czyli 25,50 Jaka może być przyczyna zmiany tej ceny? Wystawienie tego dokumentu z poziomu NEXO nie powoduje takowej zmiany. W patametrachGrupowania, mam wybraną metodę wyliczania cen z dokumentu głównego. Akurat zgłoszenie powstało od jednej grupy handlowej, która nie stosuje zamykania i otwierania cenników, więc tutaj może być problem. Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - dodawanie WZki do wybranych pozycji."); // przygotowanie danych IAsortymenty asortyment = sfera.PodajObiektTypu<IAsortymenty>(); IPodmioty podmioty = sfera.PodajObiektTypu<IPodmioty>(); IUzytkownicy uzytkownicy = sfera.PodajObiektTypu<IUzytkownicy>(); IStatusyDokumentowDaneDomyslne statusyDD = sfera.PodajObiektTypu<IStatusyDokumentow>().DaneDomyslne; Konfiguracja konfWz = sfera.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.WydanieZewnetrzne; string stock; stock = results.stock; Magazyn mag = sfera.PodajObiektTypu<IMagazyny>().Dane.Wszystkie().Where(m => m.Symbol == stock).FirstOrDefault(); IWydaniaZewnetrzne dokumentWydania = sfera.PodajObiektTypu<IWydaniaZewnetrzne>(); IZamowieniaOdKlientow zamowienia = sfera.PodajObiektTypu<IZamowieniaOdKlientow>(); // pobranie danych jakiegokolwiek ZK, aby ustawić parametry int docid; docid = results.docid; var zk = zamowienia.Dane.Wszystkie().Where(p => p.Id == docid).FirstOrDefault(); // znalezienie zamówienia using (IWydanieZewnetrzne wz = dokumentWydania.Utworz(konfWz)) { // przeniesienie parametrów z ZK ParametryGrupowaniaPodstawowe parametryGrupowania = new ParametryGrupowaniaPodstawowe(); parametryGrupowania.MetodaGrupowaniaPozycji = MetodaGrupowaniaPozycji.BezKonsolidacji; parametryGrupowania.MetodaWyliczeniaCen = MetodaWyliczeniaCen.PrzepisanieZDokumentuGlownego; parametryGrupowania.MiejsceDostawy = zk.MiejsceDostawy; parametryGrupowania.MiejsceDostawyTyp = MiejsceDostawyTyp.Nabywca; parametryGrupowania.NabywcaSprzedawca = zk.NabywcaSprzedawcaWybrany; IAplikatorSkutkowMagazynowych aplikatorSM = (IAplikatorSkutkowMagazynowych)wz; wz.Dane.Magazyn = mag; wz.Dane.Uwagi = results.comment; wz.Dane.StatusDokumentu = statusyDD.Rozchod_WydanyTowar; IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz; // wypełnienie pozycji na podstawie ZK foreach(var posadd in results.pos) { int posdocid; int posid; decimal posq; int posbatch; string comment; posdocid = posadd.docid; posid = posadd.id; posq = posadd.quantity; posbatch = posadd.batch; comment = posadd.comment; //Console.WriteLine("Pobieranie pozycji: "+posid+" z ZK "+posdocid); var zamowienie = zamowienia.Dane.Wszystkie().Where(p => p.Id == posdocid).FirstOrDefault(); // znalezienie zamówienia var poz = wz.WypelnijNaPodstawieZK(zamowienie.Pozycje.Where(p => p.Id == posid),zamowienie,parametryGrupowania).Single(); // dodanie pozycji z ZK Console.WriteLine("Dodanie pozycji: "+posid+", "+poz.AsortymentAktualny.Nazwa); poz.Opis = comment; if(posadd.batch!=null) { poz.Ilosc = 0; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); // poprawka od Insertu na poprawne działanie skutku magazynu var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiRozchodowe; Console.WriteLine("Wprowadzenie partii: " + posbatch + " w ilości " + posq); r.Pozycje.Where(p => p.PartiaZrodlowa.Id == posbatch).Single().Ilosc = posq; foreach (var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != posbatch && p.Ilosc > 0m)) pozr.Ilosc = 0m; //Console.WriteLine("Partia wprowadzona: " + posbatch); r.ZakonczRozbicie(); aplikatorSM.AplikujSkutkiMagazynowe(poz); // ponowna poprawka na poprawne rozbicie } else { poz.Ilosc = posq; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); } //Console.WriteLine("Ilość na pozycji: " + poz.Ilosc); wz.Przelicz(); } // wypełnienie pozycji na podstawie asortymentu foreach(var posadd in results.posextra) { int posid; decimal posq; posid = posadd.id; posq = posadd.quantity; Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Id == posid).First(); var poz = wz.Pozycje.Dodaj(a,posq, a.JednostkaSprzedazy); Console.WriteLine("Dodanie pozycji dodatkowej: "+poz.AsortymentAktualny.Nazwa); // jeśli jest opis pozycji if(posadd.desc!=null && posadd.desc!="") { string posd; posd = posadd.desc; poz.Opis = posd; } // jeśli jest cena pozycji if(posadd.price!=null) { decimal posp; posp = posadd.price; poz.Cena.NettoPoRabacie = posp; } wz.Przelicz(); } // poprawka na nabywcę if(wz.Dane.NabywcaSprzedawca==null) { wz.Dane.NabywcaSprzedawca = wz.Dane.Podmiot; wz.Dane.RolaInnegoPodmiotu = (byte)RolaInnegoPodmiotu.InnyNabywca; } // dopisanie transportu, jeśli jest - DO USUNIĘCIA!!!! decimal transport; transport = results.transport; if(transport!=0) { Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Symbol == "U Transport").First(); var poz = wz.Pozycje.Dodaj(a, 1m, a.JednostkaSprzedazy); poz.Cena.NettoPoRabacie = transport; } // ustawienie daty if(results.date!=null && results.date!="") { string dateString = results.date+" 07:00:00,000"; DateTime wzDate = DateTime.ParseExact(dateString,"yyyy-MM-dd HH:mm:ss,fff",System.Globalization.CultureInfo.InvariantCulture); wz.Dane.DataWydaniaWystawienia = wzDate; wz.Dane.DataWprowadzenia = wzDate; Console.WriteLine("Data wystawienia: " + wzDate); } // osoba wystawiająca string sign = results.sign; wz.Dane.WystawilaOsoba = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault().Osoba; // zapisywanie i eksportowanie wydruku wz.Zapisz()) Link to postu
Wojciech Szopiński 227 Napisano 3 Października 2018 Udostępnij Napisano 3 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ Podejrzewam, że całym winowajcą jest ten kawałek kodu: if(wz.Dane.NabywcaSprzedawca==null) { wz.Dane.NabywcaSprzedawca = wz.Dane.Podmiot; wz.Dane.RolaInnegoPodmiotu = (byte)RolaInnegoPodmiotu.InnyNabywca; } Po ustawieniu NabywcySprzedawcy przeliczane są ceny i dlatego pobierane są "świeże" ceny z cennika. W interfejsie dzieje się dokładnie tak samo gdy ustawi Pan na WZce pole Nabywca. Link to postu
Radomił Ząbik 310 Napisano 3 Października 2018 Autor Udostępnij Napisano 3 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ NOPE, przeniosłem ten zapis przed przetwarzanie pozycji, a potem nawet wywaliłem, dalej zmienia ceny. Link to postu
Radomił Ząbik 310 Napisano 3 Października 2018 Autor Udostępnij Napisano 3 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ ... i data wystawienia też nie powoduje tego, aczkolwiek przeniosłem te dwa elementy przed zaczytywanie pozycji. Rozszerzyłem logowanie i wygląda na to, że cena zmienia się gdzieś tutaj: poz.Opis = comment; if(posadd.batch!=null) { poz.Ilosc = 0; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); // poprawka od Insertu na poprawne działanie skutku magazynu var r = dok.RozpocznijRozbicie(poz) as IRozbiciePozycjiRozchodowe; Console.WriteLine("Wprowadzenie partii: " + posbatch + " w ilości " + posq); r.Pozycje.Where(p => p.PartiaZrodlowa.Id == posbatch).Single().Ilosc = posq; foreach (var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != posbatch && p.Ilosc > 0m)) pozr.Ilosc = 0m; r.ZakonczRozbicie(); aplikatorSM.AplikujSkutkiMagazynowe(poz); // ponowna poprawka na poprawne rozbicie } else { poz.Ilosc = posq; // ustawiamy na 0, wyjdzie z rozbicia aplikatorSM.AplikujSkutkiMagazynowe(poz); } Link to postu
Radomił Ząbik 310 Napisano 3 Października 2018 Autor Udostępnij Napisano 3 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ No i mam winnego: poz.Ilosc = 0; Jakakolwiek zmiana ilości to powoduje, a przecież to normalne że na WZ można wydać mniej. W NEXO to samo! Link to postu
Wojciech Szopiński 227 Napisano 4 Października 2018 Udostępnij Napisano 4 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ Faktycznie jest tak jak Pan pisze. Zmiana ilości powoduje przeliczenie cen ze względu na ewentualne progi cenowe w cenniku. Tak samo dzieje się to na interfejsie. Proponuję w Pana kodzie przed zerowaniem ilości dodać ustawienie flagi CenaRecznieEdytowana na zmienianej pozycji WZki: poz.CenaRecznieEdytowana = true; W tym momencie cena na pozycji będzie traktowana jak wpisana ręcznie przez użytkownika i nie będzie dla niej wyliczana nowa cena. Docelowo błąd naprawimy w jednej z kolejnych wersji. 1 Link to postu
Radomił Ząbik 310 Napisano 4 Października 2018 Autor Udostępnij Napisano 4 Października 2018 w [Sfera] Przeliczenie ceny podczas wystawiania WZ Super, modyfikacja naniesiona, dzięki za szybką pomoc. 1 Link to postu
Polecane posty