enova 8.0 CRM
Transkrypt
enova 8.0 CRM
Ekspert radzi – mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8 Ekspert radzi. Spis treści 1. 2. Zarys rozwiązania .........................................................................................................3 1.2 Case study ...............................................................................................................3 1.3 Wymagania ..............................................................................................................3 Projekt ...........................................................................................................................3 2.2 Przygotowanie konfiguracji .......................................................................................3 2.3 Szablon projektu.......................................................................................................4 2.4 Rozszerzenie funkcjonalności ..................................................................................5 2.5 Dodatki: pełen kod źródłowy .....................................................................................6 Strona 2 z 8 Ekspert radzi. 1. Zarys rozwiązania 1.2 Case study Coraz częstszą praktyką stosowaną w przedsiębiorstwach jest automatyzacja pewnych „wzorcowych”, powtarzalnych procesów w firmie. Przyjmijmy zatem następujący scenariusz do zaimplementowania w enova. Operator modułu handel, po zakończeniu wystawiana faktury gotówkowej na jednej drukarce drukuje FV, a na innej KP. Następnie na magazynach w rozbiciu na miejsce przebywania towarów drukowały by się wydania zewnętrzne. Dodatkowo można by sterować w ramach wydruku różnymi sterownikami (tzn. wielokrotność zainstalowanej danej drukarki z różnymi preferencjami np.1 sterownik drukuje z podajnika nr 1 gdzie jest włożony papier z nadrukami w kolorze) a sterownik nr 2 drukuje z zasobnika nr2 w którym załadowany jest zwykły papier. Plan zatem, który chcemy osiągnąć: umożliwienie dla danego stanowiska i wydruku wskazanie domyślnej drukarki. 1.3 Wymagania W celu implementacji poniższego rozwiązania konieczne jest spełnienie następujących składowych: Podstawowa wiedza z zakresu programowania obiektowego (C#, .NET) Skonfigurowane środowisko programistyczne (API) – framework .NET, aktualne biblioteki logiki enova (Soneta.Business, Soneta.Printer etc.), Microsoft Visual Studio 2005 wzwyż. Środowisko testowe – enova, kilka osobnych stanowisk, różne sterowniki drukarek. 2. Projekt 2.2 Przygotowanie konfiguracji W naszym przykładzie stworzymy tylko prosty zarys rozwiązania, które następnie będzie można do woli modyfikować i rozbudowywać o nowe funkcjonalności. Podstawą będzie trywialna podmiana domyślnej drukarki na czas wydruku na jednym stanowisku. Jako, że chcemy by w dalszej przyszłości zmiany były zależne od operatora oraz wzorca wydruku, przygotujmy wstępnie taką konfigurację, która umożliwi nam osiągnięcie takiej funkcjonalności bez zbędnych zabiegów środowiskowych czy rekompilacji dodatku. Strona 3 z 8 Ekspert radzi. W tym celu nasz worker wzbogacimy o parsowanie własnego XML wrzuconego do tej samej lokalizacji co pliki konfiguracyjne enova (%APPDATA%\Soneta) gdzie będzie definiowany sterownik drukarki. Przykładowa struktura pliku XML (Ustawienia drukarki.xml) wykorzystana w poniższym przykładzie. Bez problemu dzięki temu można rozbudować funkcjonalność np. odnośnie skojarzenia wzorca aspx (wystarczy dodanie zupełnie nowej gałęzi do Items np. <report>Handel \ Sprzedaż.aspx</report>) z drukarką i kontekstem w którym operator aktualnie znajduje się w programie oraz odpowiednią przeciążyć metodę parsującą. Za obsługę natomiast od strony stanowiska odpowiada już sam XML konfiguracyjny. 2.3 Szablon projektu Pełen kod projektu wraz z komentarzami zamieszczono na końcu artykułu. Projekt rozpoczynamy od załadowania wymaganych bibliotek enova (klauzula using). Następnie definiujemy własny namespace i budujemy w niej główną klasę naszego projektu. Przykładowy worker został jak widać zarejestrowany dla kontekstu obiektu Zadania CRM oraz przypisany na sztywno tylko do jednego wzorca aspx. W rozbudowanej formie Strona 4 z 8 Ekspert radzi. będziemy mogli jednak zarejestrować go globalnie (niezależnie od kontekstu, niezależnie czy wywołanie z poziomu listy czy też formatki danego obiektu) poprzez rejestrację w atrybucie assembly dla typu Soneta.Business.App.Login, natomiast same dane odnośnie wydruków pobierać z XML. Cała idea naszego dodatku będzie opierać się zatem na załadowaniu XML’a konfiguracyjnego i następnie odpowiednim sparsowaniu go pod kątem potrzebnych nam danych (dane sterownika drukarki, wzorca wydruku, kontekstu etc.). Przed przestawieniem sterownika drukarki dla danego wydruku pobierzemy dodatkowo dane o aktualnej domyślnej drukarce w systemie (celem przywrócenia jej ustawienia po zakończeniu generowania wydruku). Po wybraniu już docelowego dla nas sterownika, generujemy wydruk z danego wzorca aspx wykorzystując obiekt Soneta.Printer.AspGenerator. Przykład wywołania workera z przestawieniem domyślnej drukarki na PDFCreator dla danego wydruku. 2.4 Rozszerzenie funkcjonalności. Jak już wspomniano na wstępie, wykorzystanie idei XML z konfiguracją pozwala nam nie tylko na bezinwazyjne rozszerzanie funkcjonalności naszego serwisu ale dodatkowo na łatwą personalną konfigurację zdefiniowaną np. pod kątem specyficznego stanowiska lub operatora. W celu rozbudowy dodatku wystarczy w zasadzie dodanie nowych gałęzi odwołujących się do dodatkowych danych tj. np. wzorzec wydruku który chcemy przypisać do danej drukarki lub format wydruku. Inną możliwością jest zdefiniowanie własnej klasy parametrów i przekazywanie z niej listy wszystkich wydruków w danym kontekście. Do tego celu będzie można wykorzystać nowo dodaną klasę (od wersji 8.0) opartą na interfejsie IWizardGetReportPagesService. Została ona przygotowana specjalnie na potrzeby użycia w kreatorach a dokładnie w obiektach WizardStepDefinition (typ kroku – zakładka wydruku). Strona 5 z 8 Ekspert radzi. 2.5 using using using using using using using using using using using using using using using using using using Dodatki: pełen kod źródłowy System; System.Collections.Generic; System.Linq; System.Text; Soneta.Business; Soneta.Types; Soneta.Printer; Soneta.Tools; Soneta.Forms; System.Management; System.Drawing.Printing; System.Windows.Forms; System.Runtime.InteropServices; System.Xml; System.IO; Soneta.Business.Db.Wizard; Soneta.Business.App; Soneta.Business.Forms.Reports; // Rejestracja workera [assembly: Worker(typeof(ASPgenerator.Print),typeof(Soneta.Zadania.Zadanie))] namespace ASPgenerator { public class Print { // Przypnij na Toolbar w enova [Action( "Drukuj Raport", Description = "", CommandShortcut = Soneta.Commands.CommandShortcut.F5, Priority = 1000, Icon = ActionIcon.Wizard, Target = ActionTarget.Menu | ActionTarget.ToolbarWithText)] public void printer_run(Context cx) { string RaportName = "CRM/26etykieta.aspx"; string PrinterName = DefaultPrinterName(); string drukarka_kodow = DefinedPrinter(); SetAsDefaultPrinter(drukarka_kodow); Strona 6 z 8 Ekspert radzi. // Generuj wydruk ze wzorca aspx try { Soneta.Zadania.Zadanie zadanie = (Soneta.Zadania.Zadanie)cx[typeof(Soneta.Zadania.Zadanie)]; cx.Set(zadanie); Soneta.Printer.AspGenerator generator = new Soneta.Printer.AspGenerator(); generator.Name = "Zadanie CRM"; generator.TemplateFileName = RaportName; generator.Prompt = true; generator.Destination = Soneta.Printer.AspGenerator.Destinations.Printer; generator.Print(Soneta.Forms.FormsTools.MainForm, cx, false, new Soneta.Zadania.Zadanie[] { zadanie }); } catch (System.IO.FileNotFoundException) { throw new Exception("Nie znaleziono wzorca wydruku"); } catch { throw new Exception("Problem z drukowaniem raportu"); } finally { // Poczekaj na zakończenie wydruku System.Threading.Thread.Sleep(1000); // Przywróć domyślną drukarkę SetAsDefaultPrinter(PrinterName); } } // Rejestracja workera /// <summary> /// Zwróć nazwę domyślnaje drukarki w systemie /// </summary> public static string DefaultPrinterName() { string functionReturnValue = null; System.Drawing.Printing.PrinterSettings oPS = new System.Drawing.Printing.PrinterSettings(); try { functionReturnValue = oPS.PrinterName; } catch (System.Exception ex) { functionReturnValue = ""; } finally { oPS = null; } return functionReturnValue; } static int SetAsDefaultPrinter(string printerDevice) { int ret = 0; string path = "win32_printer.DeviceId='" + printerDevice + "'"; using (ManagementObject printer = new ManagementObject(path)) { ManagementBaseObject outParams = printer.InvokeMethod("SetDefaultPrinter", null, null); ret = (int)(uint)outParams.Properties["ReturnValue"].Value; } Strona 7 z 8 Ekspert radzi. /// <summary> /// Metoda parsująca XML konfiguracyjny /// </summary> private stringDefinedPrinter() { string modelDrukarki = ""; string EnviromentPath = System.Environment.GetEnvironmentVariable("APPDATA"); string strFilename = EnviromentPath + "\\Soneta\\Ustawienia drukarki.xml"; XmlDocument xmlDoc = new XmlDocument(); FileStream xmlStream = null; if (File.Exists(strFilename)) { xmlStream = new FileStream(strFilename, FileMode.Open, FileAccess.Read); xmlDoc.Load(xmlStream); XmlNodeList fnames = xmlDoc.GetElementsByTagName("Model"); modelDrukarki = fnames[0].InnerText; } return modelDrukarki; } /// /// /// /// <summary> Metoda przestawiająca domyślną drukarkę na pobraną z konfiguracji wykorzystaując delegatę systemową InvokeMethod() oraz WMI </summary> static int SetAsDefaultPrinter(string printerDevice) { int ret = 0; string path = "win32_printer.DeviceId='" + printerDevice + "'"; using (ManagementObject printer = new ManagementObject(path)) { ManagementBaseObject outParams = printer.InvokeMethod("SetDefaultPrinter", null, null); ret = (int)(uint)outParams.Properties["ReturnValue"].Value; } return ret; } } public static class myPrinters { [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SetDefaultPrinter(string Name); } } Strona 8 z 8 Ekspert radzi.