Skocz do zawartości

[Sfera] Realizacja ZK w WZ, a magazyny ZK i jej pozycji

Polecane posty

Podczas realizacji ZK w WZ, za pomocą mojego rozwiązania sferycznego (znany wam już kod, poniżej), natrafiłem na problem - albo powinienem coś zmodyfikować w Swoim kodzie, albo jest pewnego rodzaju błąd po stronie Sfery. Otóż, naszemu działowi handlowemu, zdarza się raz na jakiś czas popełni ZK, które spełnia następujące warunki:

- jest tam wiele pozycji, w przypadku, w którym to wykrywałem, było 7

- magazyn na pozycjach jest inny niż magazyn na ZK, na co zresztą sam Subiekt zwraca uwagę ostrzeżeniem

W przypadku, gdy ja realizuję takie ZK, przesyłam dane do WZ z wskazanymi ilościami partii dla każdej pozycji, na pierwszy rzut oka, wszystko wygląda ok i to co przesłałem, zwraca mi się prawidłowo, w pętli weryfikującej ustawienie ilości, na partiach rozbicia danej pozycji. Gdzieś po tym, następuje coś po stronie Sfery, co powoduje wyczyszczenie zasugerowanego przez mnie rozbicia i wprowadzenia rozbicia po FIFO, tak jakby na chwilę zmieniła magazyn na ten z dokumentu, potem wróciła do tego co był nie wiem. Ten problem nie występuję w Subiekcie lub jeśli realizuję tylko jedną pozycję.

// 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;
    poz.CenaRecznieEdytowana = true;
    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;
        }
     foreach(var pozr in r.Pozycje.Where(p => p.PartiaZrodlowa.Id != 0 )) 
       {
     	Console.WriteLine("Wybrane partie: "+pozr.PartiaZrodlowa.Id+" = "+pozr.Ilosc);
       }
      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; }
  // 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); }
  // 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; }
  // osoba wystawiająca
  string sign = results.sign;
  wz.Dane.WystawilaOsoba = uzytkownicy.Dane.Wszystkie().Where(p => p.Sygnatura == sign).FirstOrDefault().Osoba;

 

Link to postu

Problemem jest wielokrotne wywoływanie metody WypelnijNaPodstawieZK, ponieważ za każdym wypełnia ona WZ "od nowa", czyli między innymi ponownie ustawia magazyn (pobrany z dodawanej pozycji). Metoda powinna być wywoływana tylko raz, a pozycje można później odnaleźć np. przez realizacje:

IDokumentZRozbiciem dok = (IDokumentZRozbiciem)wz;
var zamowienie = zamowienia.Dane.Wszystkie().Where(p => p.Id == results.docid).FirstOrDefault(); // znalezienie zamówienia
var pozycje = wz.WypelnijNaPodstawieZK(zamowienie.Pozycje, zamowienie, parametryGrupowania); // dodanie pozycji z ZK
// 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 poz = pozycje.Single(p => p.ZnajdzPozycjeRealizowane(TypDokumentu.ZamowienieOdKlienta).Any(pr => pr.Id == posid));
    Console.WriteLine("Dodanie pozycji: " + posid + ", " + poz.AsortymentAktualny.Nazwa);

 

Link to postu

Jest wywoływana wielokrotnie, gdyż pozycje mogą pochodzi z różnych zamówień - łączona wysyłka, dla zmniejszenia ilości dokumentów końcowych. Jedno ZK jest wczytywane bezpośrednio tylko po to aby ustawić główne parametry. Póki co, problem zniwelowałem na poziomie rozwiązania zewnętrznego, poprzez blokadę realizacji z odpowiednim komunikatem, więc docelowo, może się udać zniwelować błędne wystawienie po stronie handlowca i ZK. A gdybym poprawiał ten magazyn gdzieś po drodze?

Link to postu

Przekazywane w parametrze pozycje mogą pochodzić z różnych zamówień.

var pozycjeId = results.pos.Select(pd => pd.id).ToList();
var pozycjeZK = zamowienia.Dane.Wszystkie().SelectMany(p => p.Pozycje).Where(p => pozycjeId.Contains(p.Id)).ToList();
var pozycje = wz.WypelnijNaPodstawieZK(pozycjeZK, zk, parametryGrupowania); // dodanie pozycji z ZK

Jeśli jednak woli Pan dodawać pozycje pojedynczo, to można spróbować najpierw dodać wszystkie, a później dopiero je rozbić.

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