Create a DeviceHub PrintJob

PHOTO EMBED

Thu Mar 13 2025 14:22:06 GMT+0000 (Coordinated Universal Time)

Saved by @SDureck #c#

        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.");
        }
content_copyCOPY