Skocz do zawartości

[Sfera] Generyczny sposób wydruku dokumentów

Polecane posty

Dzień dobry

Próbuję przygotować generyczną funkcję wydruku dokumentu.

 IDokumentySprzedazy dokumenty = _sfera.PodajObiektTypu<IDokumentySprzedazy>();
            Dokument dokumentDoWydruku = dokumenty.Dane
                .Wszystkie()
                .FirstOrDefault(x => x.Id == daneId);

Mając już dokument, można utworzyć wydruk i wybrać dla niego wzorzec wydruku

IWydruki manager = _sfera.PodajObiektTypu<IWydruki>();
IWydruk wydruk = manager.Utworz(TypWzorcaWydruku.DokumentSprzedazy);

Chciałbym używać wzorca dedykowanego dla dokumentu

TypWzorcaWydruku.FakturaSprzedazy
TypWzorcaWydruku.ParagonImienn
TypWzorcaWydruku.Paragon

Jak powinno się mapować dokument na typ wzorca?

Chciałem spróbować po typie dokumentu

TypDokumentu typ = dokumentDoWydruku.PodajTypDokumentu();

Niestety dla PA/PI/FS zwracany jest "DokumentSprzedazy".

Jest jakiś sposób aby na podstawie pobranego dokumentu użyć dedykowanego dla niego wzorca?

Link to postu

Podrzucam mój kod, do drukowania WZ w PDF (lekka modyfikacja i będzie drukował na drukarce). Można na podstawie niego, potem odpowiednio zrobić przeróbkę pod inne dokumenty. Kod wspiera pobieranie odpowiednio przypisanych do klienta wzorców wydruków, kopia/oryginał. Oczywiście zmienne powstałe z results, trzeba Sobie poprawić - to moja zmienna, z przetworzonego zapytania JSON. Zmienna response, to także odpowiedź do mojego systemu, więc też do wywalenia :)

int id; id = results.id;          	
// uzyskanie dokumentu do wydruku
IWydaniaZewnetrzne dokumenty = sfera.PodajObiektTypu<IWydaniaZewnetrzne>();
Dokument dokument = dokumenty.Dane.Wszystkie().Where(d => d.Id == id).Single();
if(dokument == null) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Wskazany do wydruku dokument nie istnieje!"); response = "{ \"error\":\"Dokument nie istnieje!\" }"; }
  {
  Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Drukowanie WZki: "+dokument.NumerWewnetrzny.PelnaSygnatura);
  //pobranie managera drukowania
  IWydruki manager = sfera.PodajObiektTypu<IWydruki>();
  // utworzenie zadania drukowania
  using (IWydruk wydruk = manager.Utworz(TypWzorcaWydruku.WydanieZewnetrzne))
    {
    // wskazanie obiektu do wydruku
    wydruk.ObiektDoWydruku = dokument;
    using (var podmiot = sfera.PodajObiektTypu<IPodmioty>().Znajdz(dokument.Podmiot))
      {
      IOperacjePodmiotuDlaDokumentu operacje = podmiot.OperacjePodmiotuDlaDokumentu[dokument.Konfiguracja];
      wydruk.ParametryDrukowania.WybranyWzorzec = operacje.WzorzecWydruku;
      // sposób ustawienia "kopia" na wydruku
      IWydrukParametryExtension param = (IWydrukParametryExtension)wydruk.ParametryDrukowania;
      if(results.type=="copy") ((IWydrukParametryDokument)wydruk.ParametryDrukowania).SposobWydrukuOryginalKopia = SposobWydrukuOryginalKopia.Kopia;
      if(results.type=="org") ((IWydrukParametryDokument)wydruk.ParametryDrukowania).SposobWydrukuOryginalKopia = SposobWydrukuOryginalKopia.Oryginal;
      param.ZastapPliki = true;
      // wyeksportowanie dokumentu do pliku 
      wydruk.ObiektDoWydruku = dokument;
      string filename;
      if(Globals.mode=="developer") filename = "wz"+dokument.Id+"_"+results.type+"_DEV"; else filename = "wz"+dokument.Id+"_"+results.type;
      wydruk.ParametryDrukowania.NazwaDokumentuUzytkownika = filename;
      wydruk.ParametryDrukowania.SciezkaEksportu = @"N:\";
      wydruk.Eksport();
      if(!wydruk.OstatniaOperacjaZakonczonaSukcesem) { foreach (var blad in wydruk.PobierzListeBledow()) { Console.WriteLine(blad); }}
      Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - Wydrukowano: " +wydruk.ParametryDrukowania.NazwaDokumentuUzytkownika+".pdf");                      
      response = "{ \"number\":\""+dokument.NumerWewnetrzny.PelnaSygnatura+"\", \"filename\":\""+filename+"\", \"id\":\""+dokument.Id+"\" }";                        
      }
    }       
  }

 

  • Dziękuję 1
Link to postu

Dzięki serdeczne za przykład, ale też odwołanie jest do konkretnego wzorca:

  using (IWydruk wydruk = manager.Utworz(TypWzorcaWydruku.WydanieZewnetrzne))
    

Ja bym chciał aby wydrukować dokument niezależnie od jego typu.
Na razie poradziłem sobie ifami:

 IDokumenty dokumenty = _sfera.PodajObiektTypu<IDokumenty>();
            Dokument dokumentDoWydruku = dokumenty.Dane
                .Wszystkie()
                .FirstOrDefault(x => x.Id == daneId);


            IWydruki manager = _sfera.PodajObiektTypu<IWydruki>();
            TypDokumentu typ = dokumentDoWydruku.PodajTypDokumentu();
            string symbol = dokumentDoWydruku.Symbol;

            // utworzenie zadania drukowania
            TypWzorcaWydruku typWzorca = TypWzorcaWydruku.DokumentSprzedazy;
            if (symbol == "FS")
                typWzorca = TypWzorcaWydruku.FakturaSprzedazy;
            else if (symbol == "FU")
                typWzorca = TypWzorcaWydruku.FakturaSprzedazyUproszczona;
            else if (symbol == "FL")
                typWzorca = TypWzorcaWydruku.FakturaSprzedazyZaliczkowa;
            else if (symbol == "FM")
                typWzorca = TypWzorcaWydruku.FakturaVatMarza;
            else if (symbol == "PI")
                typWzorca = TypWzorcaWydruku.ParagonImienny;
            else if (symbol == "PA")
                typWzorca = TypWzorcaWydruku.Paragon;
            else if (symbol == "ZK")
                typWzorca = TypWzorcaWydruku.ZamowienieOdKlienta;
            else if (symbol == "ZD")
                typWzorca = TypWzorcaWydruku.ZamowienieDoDostawcy;
            else if (symbol == "WZ")
                typWzorca = TypWzorcaWydruku.WydanieZewnetrzne;
            else
                typWzorca = TypWzorcaWydruku.DokumentSprzedazy;

            using (IWydruk wydruk = manager.Utworz(typWzorca))
            {
                // wskazanie obiektu do wydruku
                wydruk.ObiektDoWydruku = dokumentDoWydruku;
                // wykonanie wydruku
                wydruk.Drukuj();
            }

Ale nie wydaje mi się aby to był odpowiedni sposób :)

 

 

 

 

Link to postu

I to działa z tymi wszystkimi typami dokumentów? To się nawet nie spodziewałem. Ale jeśli działa i te wydruki na tych IF'ach się generują, to pewnie Insert ma jakąś tajną funkcję :D W sumie, jest według dokumentacji numeryczna możliwość określenia typu dokumentu, poszuka Pan "TypWzorcaWydruku Enumeration". Tam jest taka fajna tabelka:

image.thumb.png.a401169cda82402e0861448af1212683.png

Teraz tylko znaleźć to po stronie IDokumenty.....

Awaryjnie, można tego IF'a podrasować i oprzeć go wtedy na ładnej tablicy ;)

DOBRA, poddaje się z gdybaniem, to już Insert podpowie ;) Możliwe, że jest coś na wzór pobrania wzorca dla klienta, względem wzorca dla dokumentu, bo przecież takie są, ale to już jakaś tajemna, zaszyta w manualu wiedza :D

Edytowane przez Radomił Ząbik
Link to postu
×
×
  • Dodaj nową pozycję...