Skocz do zawartości

[sfera zdarzeniowa] Pozycje Korekt i numery ich partii


Zobacz rozwiązanie Rozwiązane przez Wojciech Szopiński,

Polecane posty

Dzień Dobry,

 

Chciałem zrobić plugin, który po zapisie nowej korekty zakupowej wysyłała sie mailowa informacja do konkretnego pracownika z informacjami na temat korekty.

 

Natknąłem się na problem z uzyskaniem informacji na temat partii korygowanej. Próbowałem z wykorzystaniem Pola SpecyfikacjePozycji ale są one puste.

 

 public override void PoZapisieObiektu(IKontekstZdarzeniaPoZapisieObiektu<IDokument> kontekst)
        {
            if (kontekst.TypDanych != typeof(DokumentKDZ))
                return;
            if (kontekst.IdDanych == null || !(kontekst.IdDanych is int) )
                return;
            if(kontekst.StanZapisanegoObiektu == 0)
            {
                int dokumentKorektyId = (int)kontekst.IdDanych;
                IDokumenty korekty = kontekst.Uchwyt.PodajObiektTypu<IDokumenty>();
                Dokument korekta = korekty.Dane.Wszystkie(nameof(Dokument.Pozycje)).Where(d => d.Id == dokumentKorektyId).FirstOrDefault();
                Stream stream = new MemoryStream();
                string sn = "";
                Workbook workbook = new Workbook();
                Worksheet sheet = workbook.Worksheets[0];
                sheet.Range[2, 2].Value = "Numer wewnętrzny korekty: ";
                sheet.Range[3, 2].Value = "Kontrahent";
                sheet.Range[3, 3].Value = korekta.Podmiot.NazwaSkrocona;
                sheet.Range[4, 2].Value = "Data Wystawienia korekty: ";
                sheet.Range[7, 2].Value = "Skutek: ";
                sheet.Range[2, 3].Value = korekta.NumerWewnetrzny.PelnaSygnatura;
                sheet.Range[4, 3].Value = korekta.DataWystawienia().ToString();
                sheet.Range[2, 2, 4, 2].Style.Color = Color.LightYellow;
                switch ( korekta.SkutekMagazynowy.ToString())
                {
                    case "0":
                        sheet.Range[7, 3].Value = "Brak Skutku Magazynowego";
                        break;
                    case "1":
                        sheet.Range[7, 3].Value = "Rezerwacja";
                        break;
                    case "2":
                        sheet.Range[7, 3].Value = "Rezerwacja Częściowa";
                        break;
                    case "3":
                        sheet.Range[7, 3].Value = "Wykonany Skutek Magazynowek";
                        break;
                }
                int i = 11;
                sheet.Range[10, 2].Value = "Towar";
                sheet.Range[10, 3].Value = "Ilość korygowana";
                sheet.Range[10, 4].Value = "Cena Netto";
                sheet.Range[10, 5].Value = "Wartośc Netto";
                sheet.Range[10, 2, 10, 5].Style.Color = Color.LightYellow;
                sheet.Range[7, 2].Style.Color = Color.LightYellow;
                foreach (PozycjaKorekty x in korekta.Pozycje)
                {
                    if(x.RodzajAsortymentuId != 1)
                    {
                        sheet.Range[i, 2].Value = x.AsortymentAktualny.Nazwa;
                        sheet.Range[i, 3].Value = x.IloscRoznica.ToString();
                        sheet.Range[i, 3].Style.HorizontalAlignment = HorizontalAlignType.Center;
                        sheet.Range[i, 4].Value = Convert.ToString(0 - x.CenaOryginalna.NettoPoRabacie) ;
                        sheet.Range[i, 5].Value = Convert.ToString(x.WartoscRoznica.NettoPoRabacie) ;
                        sheet.Range[i, 4].NumberFormat = "#,##0.00 zł";
                        sheet.Range[i, 5].NumberFormat = "#,##0.00 zł";
                        foreach(SpecyfikacjaPozycji spec in x.SpecyfikacjePozycji)
                        {
                            if(spec.Numer != "" && spec.Numer != "0")
                            {
                                sn = sn + spec.Numer + ", ";
                            }
                        }
                        sheet.Range[i, 6].Value = sn;
                    }       
                    i++;
                }

W jaki sposób mógłbym się dobrać do tej informacji.

Link to postu
  • Rozwiązanie

Specyfikacje pozycji będą wypełnione dla pozycji korekty zakupowej "na plus" ponieważ tworzy ona nowe partie towaru na magazynie. Dla korekty "na minus" towar jest wydawany z magazynu. Wtedy trzeba najpierw odszukać pozycje dokumentów magazynowych powiązane z pozycją korekty zakupu i na nich sięgnąć do encji typu Wydanie, potem do ich rozchodów, a następnie do partii, z których dane rozchody powstały. Proszę wypróbować taki kod:

foreach (PozycjaKorekty x in korekta.Pozycje)
{
	IEnumerable<string> numeryPartiiWydanych =
		x.ZnajdzPozycjeRealizowane(TypDokumentu.PrzyjecieZewnetrzne | TypDokumentu.KorektaPrzyjeciaZewnetrznego)
		.Where(p => p.Wydanie != null)
		.SelectMany(p => p.Wydanie.Rozchody.Select(r => r.Partia))
		.Select(p => p.Numer)
		.ToArray();
		// zapis danych w arkuszu
}

 

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