Create a DeviceHub PrintJob
Thu Mar 13 2025 14:22:06 GMT+0000 (Coordinated Universal Time)
public PXAction<SOShipment> printShipmentWithDialog; [PXButton] [PXUIField(DisplayName = "Print Shipment (Select Printer)", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)] protected void PrintShipmentWithDialog() { var tmsg = new TraceMessageCollector(); tmsg.Start(); try { var shipment = Base.Document.Current; if (shipment == null) throw new PXException("No Shipment Selected."); tmsg.Add($"Processing shipment: {shipment.ShipmentNbr}"); // Get available printers List<SMPrinter> printers = GetAvailablePrinters(); if (printers == null || printers.Count == 0) throw new PXException("No printers are available in DeviceHub."); tmsg.Add($"Found {printers.Count} available printers."); // Get the user's default printer SMPrinter defPrinter = GetDefaultPrinterForUser(); if (defPrinter != null) tmsg.Add($"User default printer: {defPrinter.Description}"); // Show selection dialog for the printer SMPrinter selectedPrinter = ShowPrinterSelectionDialog(printers, defPrinter); if (selectedPrinter == null) throw new PXException("No printer selected."); tmsg.Add($"Selected printer: {selectedPrinter.Description}"); // Define report parameters var parameters = new Dictionary<string, string> { ["ShipmentNbr"] = shipment.ShipmentNbr }; string description = $"Shipment Print Job for {shipment.ShipmentNbr}"; // Send the print job to DeviceHub CreateDeviceHubPrintJob("SO642000", parameters, selectedPrinter, description, tmsg); tmsg.Add($"Print job sent successfully for shipment: {shipment.ShipmentNbr}"); } catch (Exception ex) { tmsg.Add($"Error in PrintShipmentWithDialog: {ex.Message}", MsgLevel.Error); throw; } finally { tmsg.Send(); } } private List<SMPrinter> GetAvailablePrinters() { return SelectFrom<SMPrinter> .View.Select(Base) .RowCast<SMPrinter>() .ToList(); } private SMPrinter GetDefaultPrinterForUser() { var userPref = SelectFrom<UserPreferences> .Where<UserPreferences.userID.IsEqual<@P.AsGuid>> .View.Select(Base, PXAccess.GetUserID()) .TopFirst; if (userPref?.DefaultPrinterID == null) return null; return SelectFrom<SMPrinter> .Where<SMPrinter.printerID.IsEqual<@P.AsGuid>> .View.Select(Base, userPref.DefaultPrinterID) .TopFirst; } private SMPrinter ShowPrinterSelectionDialog(List<SMPrinter> printers, SMPrinter defaultPrinter) { if (printers == null || printers.Count == 0) return null; // Default to user printer or first available return defaultPrinter ?? printers.FirstOrDefault(); } private void CreateDeviceHubPrintJob(string reportID, Dictionary<string, string> parameters, SMPrinter printer, string description, TraceMessageCollector tmsg) { tmsg.Start(); tmsg.Add($"Creating print job for {reportID} using printer: {printer.Description}"); string safeDescription = description.Length > 50 ? description.Substring(0, 50) : description; PrintSettings printSettings = new PrintSettings { PrinterID = printer.PrinterID, NumberOfCopies = 1, PrintWithDeviceHub = true, DefinePrinterManually = false }; SMPrintJobMaint graph = PXGraph.CreateInstance<SMPrintJobMaint>(); graph.LongOperationManager.StartAsyncOperation(ct => graph.CreatePrintJob(printSettings, reportID, parameters, safeDescription, ct) ); tmsg.Add("Print job successfully queued."); }
Comments