Skocz do zawartości

[Sfera zdarzeniowa] Zmiana tytułu rozrachunku automatycznego do faktury

Polecane posty

Chciałbym po zapisaniu faktury, aby w tytule rozrachunku znalazła się odpowiednia wartość. Dodatkowo planuję jeszcze przenieść tą wartość dalej, do rozrachunków cesji, ale to już inna para kaloszy. Niestety podczas próby zmiany rozrachunku, po zapisie obiektu DokumentDS, otrzymuję błąd:

Cytat

Nie można pojedynczo zapisać obiektu utworzonego w ramach większej operacji biznesowej.

Z poziomu Subiekta, mogę Swobodnie zmienić tytuł. Zrobiłem klasyczne rozwiązanie Sferyczne kopiując część kodu odpowiedzialną za zmianę i bez problemu przeszło. Problem mam tylko w Sferze zdarzeniowej. Coś się nie zamyka po zapisaniu obiektu?

 

Kod rozwiązania, błąd występuje w momencie użycia metody Zapisz.

public override void PoZapisieObiektu(IKontekstZdarzeniaPoZapisieObiektu<IDokumentSprzedazy> kontekst)
  {
  if (kontekst.StanZapisanegoObiektu == StanZapisanegoObiektu.Dodany)
     {
     IDokumentySprzedazy sprzedaz = kontekst.Uchwyt.PodajObiektTypu<IDokumentySprzedazy>();
     IRozrachunki rozrachunki = kontekst.Uchwyt.PodajObiektTypu<IRozrachunki>();

     int identyfikatorZapisanegoPodmiotu = (int)kontekst.IdDanych;
     IDokumentSprzedazy ds = sprzedaz.Znajdz(d => d.Id == identyfikatorZapisanegoPodmiotu);

     var rozrachunek = ds.Dane.Rozrachunek;
     using(var rch = rozrachunki.Znajdz(rozrachunek))
       {
       if(rch.Zablokuj())
         {
         rch.Odblokuj();
         rch.Dane.Tytul = ds.Dane.Uwagi;
         if(rch.Zapisz()) {}
         else rch.WypiszBledy();
         }
       }
    }
  }

 

Link to postu

Problemem jest tutaj przekazywanie encji rozrachunku z załadowanego dokumentu sprzedaży do metody tworzącej obiekt rozrachunku. W zasadzie wystarczy drobna zmiana w Pana kodzie, aby odizolować oba obiekty od siebie i aby ten plugin działał.

...
using (var rch = rozrachunki.Znajdz(x => x.Id == rozrachunek.Id))
{
  ...
}

Jednak sugeruję nieco większą zmianę ze względu na wydajność. Dokument sprzedaży jest dość złożonym obiektem i bez potrzeby nie warto powoływać go do życia. W tym przypadku dokument ten nie jest zmieniany, pobierane są z niego jedynie uwagi, więc proponuję następującą zmianę.

public override void PoZapisieObiektu(IKontekstZdarzeniaPoZapisieObiektu<IDokumentSprzedazy> kontekst)
{
    if (kontekst.StanZapisanegoObiektu == StanZapisanegoObiektu.Dodany)
    {
        IDokumentySprzedazy sprzedaz = kontekst.Uchwyt.PodajObiektTypu<IDokumentySprzedazy>();
        IRozrachunki rozrachunki = kontekst.Uchwyt.PodajObiektTypu<IRozrachunki>();

        int idZapisanegoDokumentu = (int)kontekst.IdDanych;
        var uwagi = sprzedaz.Dane.Wszystkie()
            .Where(x => x.Id == idZapisanegoDokumentu)
            .Select(x => x.Uwagi)
            .FirstOrDefault();

        using (var rch = rozrachunki.Znajdz(x => x.Dokument.Id == idZapisanegoDokumentu))
        {
            if (rch.Zablokuj())
            {
                rch.Odblokuj();
                rch.Dane.Tytul = uwagi;
                if (rch.Zapisz()) { }
                else rch.WypiszBledy();
            }
        }
    }
}

Nadmiarowy wydaje mi się także kod związany z blokowaniem obiektu.

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