Skocz do zawartości

Sfera Zdarzeniowa - modyfikacja Ceny po dodaniu nowej pozycji do zamówienia

Polecane posty

Dzień Dobry,

 

Mam pewien problem nad, którym ostatnio siedzę.

 

Potrzebuję stworzyć plugin sfery zdarzeniowej, który po dodaniu do zamówienia od klienta asortymentu, będzie automatycznie przypisywał cenę z przypisanego do danego klienta cennika. 


Wiem, że subiekt  standardowo sam automatycznie cenę z cennika przypisuje. Jednak w momencie gdy użytkownik wybierze towar z listy ostatnio sprzedanych towarów to przypisuje się cena z sprzedaży a nie z jego cennika.

 

Chciałem im to zautomatyzować pluginem, ponieważ notorycznie użytkownicy zapominają zmieniać tej ceny.

 

 

Utknąłem na tym, że próbując wyłapac moment dodania pozycji (Rodzaj zmiany "DodanieNowejWartościDoKolekcji" NazwaWłasciwosci to "Pozycje") to dodana pozycja jeszcze nie ma żadnych danych. W następnych krokach rodzaj zmiany zmienia się na "PrzypisanieNowejWartosci" i NazwaWłasciwosci leci po każdej właściwosci PozycjiDokumentu (LP, AsortymentWybrany, Ceny itp. itd.) 

 

 

Czy jest jakiś sposób, którym mógłbym osiągnąć powyższy cel?

Link to postu

A nie lepiej, zareagować na zmianę samej ceny, albo lepiej, na informacje o źródle ceny - ta pobrana, z ostatnio sprzedanych, będzie miała pewnie inne źródło, ale tutaj trzeba poeksperymentować z Debugiem ;) Przykładowo, reakcja na manipulację terminem pozycji, dla kontekstu Dokumentu - daje więcej możliwości, reakcji na inne elementy, albo zapisywania jakiś zdarzeń przed, jak zmiana cennika, po wyborze klienta  ;)

 

public override void PoZmianieWlasciwosciObiektu(IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<IDokument> kontekst)
{
Dokument dokument = kontekst.ObiektBiznesowy.Dokument;		
if(kontekst.NazwaWlasciwosci == nameof(PozycjaDokumentu.Termin) && (dokument.Symbol == "ZK" || dokument.Symbol == "FP"))
  {
  }
}

 

Link to postu

Faktycznie nie jest to aktualnie proste do zaimplementowania. Przy dodawaniu pozycji dzieje się sporo różnych rzeczy i ciężko jest złapać odpowiedni moment. Tym bardziej w kontekście używania listy ostatnio sprzedanych towarów gdzie ustawianie ceny z ostatniej sprzedaży jest wykonywane już po zakończeniu dodawania pozycji. Zapisaliśmy sobie ten temat do przemyślenia. Na ten moment można wykorzystać własność CenaZCennika na pozycji dokumentu gdzie zapisuje się cena (netto bądź brutto - w zależności od sposobu wyliczania dokumentu) pobrana z cennika wybranego w kalkulacji:

        public override void PoZmianieWlasciwosciObiektu(IKontekstZdarzeniaPoZmianieWlasciwosciObiektu<IZamowienieOdKlienta> kontekst)
        {
            base.PoZmianieWlasciwosciObiektu(kontekst);

            if (kontekst.Dane is PozycjaDokumentu pozycja && pozycja.Dokument is DokumentZK zamowienie)
            {
              	// jeśli dokument liczony od netto, zmieniono cenę netto przed rabatem i jest ona inna niż cena pobrana z cennika
                if (zamowienie.WyliczenieVAT == (int)WyliczeniaVAT.Netto
                    && kontekst.NazwaWlasciwosci == $"{nameof(PozycjaDokumentu.Cena)}.{nameof(Cena.NettoPrzedRabatem)}"
                    && pozycja.Cena.NettoPrzedRabatem != pozycja.CenaZCennika)
                {
                    pozycja.Cena.NettoPrzedRabatem = pozycja.CenaZCennika;
                }
              	// j.w. tylko dla brutto
                else if (zamowienie.WyliczenieVAT == (int)WyliczeniaVAT.Brutto
                    && kontekst.NazwaWlasciwosci == $"{nameof(PozycjaDokumentu.Cena)}.{nameof(Cena.BruttoPrzedRabatem)}"
                    && pozycja.Cena.BruttoPrzedRabatem != pozycja.CenaZCennika)
                {
                    pozycja.Cena.BruttoPrzedRabatem = pozycja.CenaZCennika;
                }
            }
        }

Powyższy kod po prostu zawsze nadpisuje cenę wpisaną na pozycję ceną pobraną z cennika. Efekt jest taki, że na pozycji nie da się wpisać innej ceny niż cena wybrana w kalkulacji. Warto będzie w tym momencie zabrać użytkownikom uprawnienia do zmiany kalkulacji dokumentu dzięki czemu nie będą mogli zmienić cennika ustawionego automatycznie z klienta. Wadą rozwiązania jest to, że nie działa ono przy wykorzystywaniu w kalkulacji pluginów cenowych np. ostatnia cena sprzedaży i rabat. Wtedy w polu CenaZCennika jest wartość zerowa i pozycja zawsze ustawia 0. Trzeba byłoby również uwzględnić tutaj możliwość dodawania usług jednorazowych, które również będą miały w polu CenaZCennika kwotę zero.

  • Dziękuję 1
Link to postu

Samą cenę mogą modyfikować ręcznie - to jest akurat wymagane.

 

Udało mi się uzyskać docelowy efekt z pomocą kodu Pana Wojciecha.

 

Stworzyłem dodatkowe pole własne (niewidoczne i nieedytowalne), które ustawia tymczasową wartość gdy wykryje dodanie nowej pozycji.

Ono jest później sprawdzane również z innymi warunkami i modyfikowane są ceny.

 

Następnie w momencie kiedy modyfikowana jest wartość całego dokumentu (zauważyłem, że tymi operacjami kończy się dodawania pozycji do listy)

wartość pola własnego zostaje wyczyszczona.

Edytowane przez Bartłomiej Warchoł
Link to postu
×
×
  • Dodaj nową pozycję...