Skocz do zawartości

[Sfera] Przeliczenie ceny podczas wystawiania WZ

Polecane posty

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

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

... 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

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.

  • Dziękuję 1
Link to postu
×
×
  • Dodaj nową pozycję...