/// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("DeliveryLocation", "");
            responseMsg.Properties.Write("DeliveryLocationCheckDigits", "");
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "verify_loc", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("WSID_IO", msg.Properties.ReadAsString("AlternateDeliveryArea"));
                whMsg.Properties.Write("WPADR_I", msg.Properties.ReadAsString("AlternateDeliveryLocation"));
                whMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                whMsg.Properties.Write("ALMID_O", "");

                CorrelationContext context;

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                PropertyCollection properties = context.ResponseMessages[0].Properties;

                responseMsg.Properties.Write("DeliveryLocation", properties.Read("WSID_IO") + " " + msg.Properties.ReadAsString("AlternateDeliveryLocation"));

                DropLoadCarrier(TrimContainerId(msg.Properties.ReadAsString("ContainerId")), properties.ReadAsString("WSID_IO"), msg.Properties.ReadAsString("AlternateDeliveryLocation"), session);

                /* Clear drop variables so the container won't be dropped in next call to PrTaskGetDeliveryLocations */
                session.Write("DROPSEQNUM", "");
                session.Write("DROPWSID", "");
                session.Write("DROPWPADR", "");
            }
            catch (WarehouseAdapterException ex)
            {
                if (ex.AlarmId == "WS001")
                {
                    responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeAddressNotUnique);
                }
                else
                {
                    responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeInvalidLocation);
                }

                responseMsg.Properties.Write("Message", ex.Message);
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        private static string GetCachedAlarmText(string alarmId, VocollectSession session, string languageCode)
        {
            if ((session == null) || (!session.Contains(alarmId)))
            {
                CorrelationContext context;

                if (session != null)
                {
                    languageCode = session.ReadAsString("NLANGCOD");
                }

                MultiPartMessage whMsg = CreateRequestMessage("wlsystem", "getalmtxt", null);
                whMsg.Properties.Write("ALMID_I", alarmId);
                whMsg.Properties.Write("NLANGCOD_I", languageCode);
                whMsg.Properties.Write("ALMTXT_O", "");

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                string alarmText = context.ResponseMessages[0].Properties.ReadAsString("ALMTXT_O");

                if (session != null)
                {
                    session.Write(alarmId, alarmText);
                }

                return(alarmText);
            }
            else
            {
                return(session.ReadAsString(alarmId));
            }
        }
Exemple #3
0
        public static void Print(string printerNumber, string containerId, VocollectSession session, bool isReprint)
        {
            if ((string.IsNullOrEmpty(printerNumber)) || (printerNumber == "1"))
            {
                printerNumber = "";
            }

            CorrelationContext context;

            /* Save printer number in session for use when finish pick to print PS */
            session.Write("PRINTERNUMBER", printerNumber);

            if (string.IsNullOrEmpty(containerId) && isReprint)
            {
                MultiPartMessage reprintMsg = CreateRequestMessage("wlvoicepick", "print_allloadcarriers", session);
                reprintMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                reprintMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                reprintMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                reprintMsg.Properties.Write("PRTID_I", printerNumber);

                reprintMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(reprintMsg, reprintMsg.MessageId, out context);
            }
            else if (string.IsNullOrEmpty(containerId))
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "print", session);
                whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                whMsg.Properties.Write("PRTID_I", printerNumber);

                if (string.IsNullOrEmpty(session.ReadAsString("PBROWID")) && (session.ReadAsInt("PBROW_COUNT") > 0))
                {
                    whMsg.Properties.Write("PRINTCOD_I", "BP");
                }
                else
                {
                    whMsg.Properties.Write("PRINTCOD_I", "AP");
                }

                whMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);
            }
            else
            {
                MultiPartMessage reprintMsg = CreateRequestMessage("wlvoicepick", "print_singleloadcarrier", session);
                reprintMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                reprintMsg.Properties.Write("SEQNUM_I", TrimContainerId(containerId));
                reprintMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                reprintMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                reprintMsg.Properties.Write("PRTID_I", printerNumber);

                reprintMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(reprintMsg, reprintMsg.MessageId, out context);
            }
        }
Exemple #4
0
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                /* Do not direct operator to collect containers when continuing a temporarily stopped assignment
                 * or when print request is sent at the end of an assignment */
                if ((string.IsNullOrEmpty(session.ReadAsString("HOLD_TYPE")) ||
                     (session.ReadAsString("HOLD_TYPE") == HOLD_TYPE_Definitely)) &&
                    string.IsNullOrEmpty(session.ReadAsString("PBROWID")))
                {
                    responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCollectContainers);
                }

                if ((msg.Properties.ReadAsInt("PrinterNumber") > 0) && (msg.Properties.ReadAsInt("Operation") < 2))
                {
                    if ((session.ReadAsString("PRINTED") == "1") &&
                        (string.IsNullOrEmpty(TrimContainerId(msg.Properties.ReadAsString("SystemContainerId")))) &&
                        (msg.Properties.ReadAsInt("Operation") == 1))
                    {
                        Print(msg.Properties.ReadAsString("PrinterNumber"), TrimContainerId(msg.Properties.ReadAsString("SystemContainerId")), session, true);
                    }
                    else
                    {
                        Print(msg.Properties.ReadAsString("PrinterNumber"), TrimContainerId(msg.Properties.ReadAsString("SystemContainerId")), session, false);
                    }
                }

                session.Write("PRINTED", "1");
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
Exemple #5
0
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            /* Ignore ODRs stored in flash output queue after terminal reset */
            if (session == null)
            {
                return;
            }

            CatchMeasure measure = new CatchMeasure();

            measure.Measurement = msg.Properties.ReadAsDouble("VariableWeight");
            session.CatchMeasureEntries.Add(measure);

            if (msg.Properties.ReadAsString("TransmissionStatus") == "1")
            {
                /* Final variable weight message */

                try
                {
                    MultiPartMessage pickedMsg = new MultiPartMessage();
                    pickedMsg.Properties.Write("AssignmentId", session.ReadAsString("PBHEADID"));
                    pickedMsg.Properties.Write("WorkId", "1");
                    pickedMsg.Properties.Write("LocationId", msg.Properties.ReadAsString("LocationId"));
                    pickedMsg.Properties.Write("QuantityPicked", (double)session.CatchMeasureEntries.Count);
                    pickedMsg.Properties.Write("PickedStatus", "1");
                    pickedMsg.Properties.Write("ContainerId", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    pickedMsg.Properties.Write("Sequence", msg.Properties.ReadAsString("Sequence"));
                    pickedMsg.Properties.Write("DiscrepancyCode", session.ReadAsString("RESTCOD"));
                    pickedMsg.Properties.Write("SplitExchange", "0");

                    try
                    {
                        PrTaskLUTPicked.ProcessPickedMessage(pickedMsg, session);
                    }
                    catch (Exception ex)
                    {
                        session.Write("CatchMeasureException", ex);
                        throw;
                    }
                }
                finally
                {
                    session.CatchMeasureEntries.Clear();
                }
            }
        }
        /// <summary>
        /// Verifies and connects the pick truck of a definitely stopped pick order.
        /// </summary>
        /// <param name="session">The current session.</param>
        /// <param name="verifyVehicleId">The vehicle id to verify.</param>
        public static void VerifyAndConnectPickTruck(VocollectSession session, string assignmentId, string vehicleId, string verifyVehicleId)
        {
            MultiPartMessage tuMsg = CreateRequestMessage("wlvoicepick", "verify_and_connect_tu", session);

            tuMsg.Properties.Write("PBHEADID_I", assignmentId);
            tuMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
            tuMsg.Properties.Write("TUID_I", vehicleId);
            tuMsg.Properties.Write("VERIFY_TUID_I", verifyVehicleId);
            tuMsg.Properties.Write("VERIFY_TUID_O", "");
            tuMsg.Properties.Write("ALMID_O", "");

            CorrelationContext context;

            MessageEngine.Instance.TransmitRequestMessage(tuMsg, tuMsg.MessageId, out context);

            //Update session with new vehicle id
            session.Write("TUID", context.ResponseMessages[0].Properties.ReadAsString("VERIFY_TUID_O"));
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                /* Set a value for PBROWID so we know that picking has started even if user skipped a location */
                session.Write("PBROWID", "X");
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    //Drop last load carrier from PrTaskLUTGetDeliveryLocation
                    if (!string.IsNullOrEmpty(session.ReadAsString("DROPSEQNUM")))
                    {
                        PrTaskLUTAltDeliveryLocations.DropLoadCarrier(session.ReadAsString("DROPSEQNUM"), session.ReadAsString("DROPWSID"), session.ReadAsString("DROPWPADR"), session);
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "finish_pick", session);
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));

                    string CPL_PRINTCOD  = session.ReadAsString("CPL_PRINTCOD");
                    string PLCP_PRINTCOD = session.ReadAsString("PLCP_PRINTCOD");

                    if (session.Contains("PRINTERNUMBER"))
                    {
                        whMsg.Properties.Write("PRTID_I", session.ReadAsString("PRINTERNUMBER"));
                    }
                    else
                    {
                        whMsg.Properties.Write("PRTID_I", "");
                    }

                    whMsg.Properties.Write("ALMID_O", "");

                    CorrelationContext context;

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    transactionScope.Complete();

                    session.Write("PBHEADID", "");
                    session.CurrentAssignmentData = null;
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        public static void ProcessPickedMessage(MultiPartMessage msg, VocollectSession session)
        {
            CorrelationContext context;

            using (TransactionScope transactionScope = new TransactionScope())
            {
                #region Exchange Container logic

                if ((msg.Properties.ReadAsString("SplitExchange") == "2") ||
                    (msg.Properties.ReadAsString("SplitExchange") == "3"))
                {
                    /* Exchange line to new PLC */
                    MultiPartMessage exchangeMsg = CreateRequestMessage("wlvoicepick", "change_loadcarrier", session);
                    exchangeMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    exchangeMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    exchangeMsg.Properties.Write("PBROWID_I", msg.Properties.ReadAsString("Sequence"));
                    exchangeMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));

                    if (msg.Properties.ReadAsString("SplitExchange") == "3")
                    {
                        exchangeMsg.Properties.Write("CHANGEREST_I", "1");
                    }
                    else
                    {
                        exchangeMsg.Properties.Write("CHANGEREST_I", "0");
                    }

                    exchangeMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(exchangeMsg, exchangeMsg.MessageId, out context);

                    transactionScope.Complete();

                    return;
                }

                #endregion

                #region Split Line logic

                if ((msg.Properties.ReadAsString("SplitExchange") == "1") && (session.ReadAsString("SPLIT_STATUS") == "0"))
                {
                    /* Ignore first msg during split process for original PLC */
                    session.Write("SPLIT_STATUS", "1");
                    session.Write("SPLIT_PBROWID", msg.Properties.ReadAsString("Sequence"));

                    return;
                }
                else if ((msg.Properties.ReadAsString("SplitExchange") == "0") && (session.ReadAsString("SPLIT_STATUS") == "1"))
                {
                    /* Second msg during split process for original PLC */
                    MultiPartMessage splitMsg = CreateRequestMessage("wlvoicepick", "split_pickorderrow", session);
                    splitMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    splitMsg.Properties.Write("PBROWID_I", session.ReadAsString("SPLIT_PBROWID"));
                    splitMsg.Properties.Write("PICKQTY_I", msg.Properties.ReadAsDouble("QuantityPicked"));
                    splitMsg.Properties.Write("PBROWID_O", "");
                    splitMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(splitMsg, splitMsg.MessageId, out context);

                    msg.Properties.Write("Sequence", session.ReadAsString("SPLIT_PBROWID"));

                    session.Write("SPLIT_PBROWID", context.ResponseMessages[0].Properties.ReadAsString("PBROWID_O"));
                    session.Write("SPLIT_STATUS", "2");

                    msg.Properties.Write("PickedStatus", "1");
                }
                else if ((msg.Properties.ReadAsString("SplitExchange") == "0") &&
                         (session.ReadAsString("SPLIT_STATUS") == "2") &&
                         (msg.Properties.ReadAsString("PickedStatus") == "0"))
                {
                    /* Check for discrepancy during split process for new PLC */

                    msg.Properties.Write("Sequence", session.ReadAsString("SPLIT_PBROWID"));
                }
                else if ((msg.Properties.ReadAsString("SplitExchange") == "0") &&
                         (session.ReadAsString("SPLIT_STATUS") == "2") &&
                         (msg.Properties.ReadAsString("PickedStatus") == "1"))
                {
                    /* Final msg during split process for new PLC */

                    /* Move splitted line to new PLC */
                    MultiPartMessage exchangeMsg = CreateRequestMessage("wlvoicepick", "change_loadcarrier", session);
                    exchangeMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    exchangeMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    exchangeMsg.Properties.Write("PBROWID_I", session.ReadAsString("SPLIT_PBROWID"));
                    exchangeMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    exchangeMsg.Properties.Write("CHANGEREST_I", "0");
                    exchangeMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(exchangeMsg, exchangeMsg.MessageId, out context);

                    msg.Properties.Write("Sequence", session.ReadAsString("SPLIT_PBROWID"));

                    session.Write("SPLIT_STATUS", "0");
                    session.Write("SPLIT_PBROWID", "");
                }
                else if ((msg.Properties.ReadAsString("SplitExchange") == "1") && (session.ReadAsString("SPLIT_STATUS") == "2"))
                {
                    msg.Properties.Write("Sequence", session.ReadAsString("SPLIT_PBROWID"));

                    session.Write("SPLIT_STATUS", "1");
                }

                #endregion

                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "modify_pickorderrow", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PBROWID_I", msg.Properties.ReadAsString("Sequence"));

                double pickedQuantity  = msg.Properties.ReadAsDouble("QuantityPicked");
                string discrepancyCode = msg.Properties.ReadAsString("DiscrepancyCode");

                #region Discrepancy code logic for strike through

                if (discrepancyCode == "00")
                {
                    discrepancyCode = "";
                }

                if ((pickedQuantity == 0) &&
                    (msg.Properties.ReadAsString("LocationId") == session.ReadAsString("PREV_PPKEY")) &&
                    (string.IsNullOrEmpty(discrepancyCode)))
                {
                    discrepancyCode = session.ReadAsString("RESTCOD");
                }

                #endregion

                #region Catch Measure logic

                double measQty = 0;

                if (session.CatchMeasureEntries.Count > 0)
                {
                    for (int i = 0; i < pickedQuantity; i++)
                    {
                        measQty += session.CatchMeasureEntries[session.CatchMeasureEntries.Count - 1 - i].Measurement;
                    }
                }

                #endregion

                whMsg.Properties.Write("PICKQTY_I", pickedQuantity);
                whMsg.Properties.Write("RESTCOD_I", discrepancyCode);
                whMsg.Properties.Write("MEASQTY_I", measQty);
                whMsg.Properties.Write("PRODLOT_I", session.ReadAsString("PRODLOT"));
                whMsg.Properties.Write("PRODLOTQTY_I", session.ReadAsDouble("PRODLOTQTY"));
                whMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                whMsg.Properties.Write("Acknowledge_I", msg.Properties.ReadAsString("PickedStatus"));
                whMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                transactionScope.Complete();

                /* Save data in session about current pick */
                session.Write("PREV_PPKEY", msg.Properties.ReadAsString("LocationId"));
                session.Write("RESTCOD", discrepancyCode);
                session.Write("PBROWID", msg.Properties.ReadAsString("Sequence"));
                session.Write("PRODLOT", "");
                session.Write("PRODLOTQTY", 0d);

                if (session.CatchMeasureEntries.Count > 0)
                {
                    for (int i = 0; i < pickedQuantity; i++)
                    {
                        session.CatchMeasureEntries.RemoveAt(session.CatchMeasureEntries.Count - 1);
                    }
                }
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("Interleave", 0);
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    /* Fetch user's language code */
                    MultiPartMessage langMsg = CreateRequestMessage("wlvoicepick", "get_user_languagecode", session);
                    langMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    langMsg.Properties.Write("NLANGCOD_O", "");

                    CorrelationContext context;

                    MessageEngine.Instance.TransmitRequestMessage(langMsg, langMsg.MessageId, out context);

                    string languageCode = context.ResponseMessages[0].Properties.ReadAsString("NLANGCOD_O");

                    AuthenticationProvider provider = new AuthenticationProvider();
                    provider.Initialize(msg.Properties.ReadAsString("Password"));

                    MultiPartMessage authMsg = CreateRequestMessage("wlvoicepick", "authenticate", session);
                    authMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    authMsg.Properties.Write("SALT_I", provider.Salt);
                    authMsg.Properties.Write("DATA_I", provider.SessionData);
                    authMsg.Properties.Write("WHID_I", "");
                    authMsg.Properties.Write("COMPANY_ID_I", "");
                    authMsg.Properties.Write("PRODUCT_I", "VOICE");
                    authMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                    authMsg.Properties.Write("SESSION_DATA_O", "");
                    authMsg.Properties.Write("ALMID_O", "");
                    authMsg.Properties.Write("ALMTXT1_O", "");
                    authMsg.Properties.Write("ALMTXT2_O", "");
                    authMsg.Properties.Write("ALMTXT3_O", "");

                    /* Set language code since we do not yet have a session */
                    authMsg.Metadata.Write("LanguageCode", languageCode);

                    MessageEngine.Instance.TransmitRequestMessage(authMsg, authMsg.MessageId, out context);

                    string sessionData = context.ResponseMessages[0].Properties.ReadAsString("SESSION_DATA_O");

                    AuthenticationSession authenticationSession = provider.DecryptSession(sessionData);

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "logon", session);
                    whMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                    whMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    whMsg.Properties.Write("SESSIONID_I", authenticationSession.SessionId);
                    whMsg.Properties.Write("WHID_O", "");
                    whMsg.Properties.Write("NLANGCOD_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

                    /* Set language code since we do not yet have a session */
                    whMsg.Metadata.Write("LanguageCode", languageCode);

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    //Create session object
                    session = SessionManager.Instance.CreateSession(msg.Properties.ReadAsString("SerialNumber"));

                    /* Clear session if already exists */
                    session.Clear();

                    //Set session variables
                    session.Write("TERID", msg.Properties.ReadAsString("SerialNumber"));
                    session.Write("WHID", context.ResponseMessages[0].Properties.Read("WHID_O"));
                    session.Write("NLANGCOD", context.ResponseMessages[0].Properties.Read("NLANGCOD_O"));
                    session.Write("EMPID", msg.Properties.ReadAsString("Operator"));
                    session.Write("TUID", "");
                    session.Write("PBHEADID", "");
                    session.Write("PZID", "");
                    session.Write("PZGRPID", "");
                    session.Write("ITEID", "");

                    try
                    {
                        //Check if there is a temporarily stopped pick order available
                        PrTaskLUTGetAssignment.RequestPickOrder(PickOrderHoldType.Temporarily, session);

                        responseMsg.Properties.Write("ErrorCode", ErrorTempInterruptedPickOrderFound);
                    }
                    catch (WarehouseAdapterException ex)
                    {
                        if (ex.AlarmId != "PBHEAD030" && ex.AlarmId != "PBHEAD057")
                        {
                            throw;
                        }
                    }

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("DeliveryLocation", "");
            responseMsg.Properties.Write("DeliveryLocationCheckDigits", 0);
            responseMsg.Properties.Write("ContainerId", 0);
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    /* Execute drop of previous container if not already dropped using the alternate delivery command */
                    if (!string.IsNullOrEmpty(session.ReadAsString("DROPSEQNUM")))
                    {
                        PrTaskLUTAltDeliveryLocations.DropLoadCarrier(session.ReadAsString("DROPSEQNUM"), session.ReadAsString("DROPWSID"), session.ReadAsString("DROPWPADR"), session);
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_drop_location", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    whMsg.Properties.Write("DROPWSID_O", "");
                    whMsg.Properties.Write("DROPWPADR_O", "");
                    whMsg.Properties.Write("WPCOD_O", "");
                    whMsg.Properties.Write("SLOT_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

                    CorrelationContext context;

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    PropertyCollection properties = context.ResponseMessages[0].Properties;

                    if (!string.IsNullOrEmpty(properties.ReadAsString("SLOT_O")))
                    {
                        /* VOICEPICK015 = 'slot' */
                        string slot = GetCachedAlarmText("VOICEPICK015", session);

                        responseMsg.Properties.Write("DeliveryLocation", properties.Read("DROPWSID_O") + " , " + properties.Read("DROPWPADR_O") + " , " + slot + " , " + properties.Read("SLOT_O"));
                    }
                    else
                    {
                        responseMsg.Properties.Write("DeliveryLocation", properties.Read("DROPWSID_O") + " , " + properties.Read("DROPWPADR_O"));
                    }

                    if (session.ReadAsString("VERIFY_DROPWPADR") == "1")
                    {
                        string checkDigits = properties.ReadAsString("WPCOD_O");

                        if (!string.IsNullOrEmpty(checkDigits))
                        {
                            long temp;

                            if (!long.TryParse(checkDigits, out temp))
                            {
                                checkDigits = "";
                            }

                            if (checkDigits.Length > session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"))
                            {
                                checkDigits = checkDigits.Substring(checkDigits.Length - session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"));
                            }
                        }

                        responseMsg.Properties.Write("DeliveryLocationCheckDigits", checkDigits);
                    }
                    else
                    {
                        responseMsg.Properties.Write("DeliveryLocationCheckDigits", "");
                    }

                    responseMsg.Properties.Write("ContainerId", msg.Properties.ReadAsString("ContainerId"));

                    session.Write("DROPSEQNUM", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    session.Write("DROPWSID", properties.Read("DROPWSID_O"));
                    session.Write("DROPWPADR", properties.Read("DROPWPADR_O"));

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    CorrelationContext context;

                    if (!string.IsNullOrEmpty(session.ReadAsString("TUID")))
                    {
                        MultiPartMessage tuMsg = CreateRequestMessage("wlvoicepick", "disconnect_ter_from_pt", session);
                        tuMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                        tuMsg.Properties.Write("TUID_I", session.ReadAsString("TUID"));
                        tuMsg.Properties.Write("KEEP_ONLINE_I", "0");
                        tuMsg.Properties.Write("ALMID_O", "");

                        MessageEngine.Instance.TransmitRequestMessage(tuMsg, tuMsg.MessageId, out context);
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "connect_ter_to_pt", session);
                    whMsg.Properties.Write("TUID_I", msg.Properties.ReadAsString("VehicleId"));
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("TUID_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    MessagePart responsePart = new VocollectMessagePart();

                    responsePart.Properties.Write("SafetyCheck", "");
                    responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                    responsePart.Properties.Write("Message", "");

                    responseMsg.Parts.Add(responsePart);

                    session.Write("TUID", context.ResponseMessages[0].Properties.ReadAsString("TUID_O"));
                    session.Write("UPDATE_PBCAR", "1");

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(3);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(3);
                part.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                part.Properties.Write("Message", GetCriticalErrorMessageText(msg));
                responseMsg.Parts.Add(part);

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            try
            {
                CorrelationContext context;

                if (!string.IsNullOrEmpty(session.ReadAsString("PBROWID")))
                {
                    /* Refresh rows in status Registrated before the shorts pass */
                    MultiPartMessage refreshMsg = CreateRequestMessage("wlvoicepick", "refresh_pickorderrows", session);
                    refreshMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    refreshMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    refreshMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                    refreshMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(refreshMsg, refreshMsg.MessageId, out context);
                }

                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbrow", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                whMsg.Properties.Write("NLANGCOD_I", session.ReadAsString("NLANGCOD"));
                whMsg.Properties.Write("PBROW_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                PropertyCollection properties = context.ResponseMessages[0].Parts[0].Properties;

                string prevContainer = "";
                string prevLocation  = "";
                int    rowCount      = 0;

                foreach (MessagePart part in context.ResponseMessages[0].Parts)
                {
                    string status  = null;
                    double pickQty = 0;

                    if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Finished) &&
                        (part.Properties.ReadAsDouble("PICKQTY") < part.Properties.ReadAsDouble("ORDQTY")))
                    {
                        rowCount++;
                        status  = "G"; //Go back  for shortage
                        pickQty = part.Properties.ReadAsDouble("ORDQTY") - part.Properties.ReadAsDouble("PICKQTY");
                    }
                    else if (((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Started) ||
                              (part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated)) &&
                             (!string.IsNullOrEmpty(session.ReadAsString("PBROWID"))))
                    {
                        rowCount++;
                        status  = "S"; //Skipped
                        pickQty = part.Properties.ReadAsDouble("ORDQTY");
                    }
                    else if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Started) ||
                             (part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated))
                    {
                        rowCount++;
                        status  = "N"; //Not picked
                        pickQty = part.Properties.ReadAsDouble("ORDQTY");
                    }
                    else
                    {
                        status = "P"; //Picked
                    }
                    MessagePart responsePart = new VocollectMessagePart();

                    responsePart.Properties.Write("Status", status);
                    responsePart.Properties.Write("BaseItem", "0");
                    responsePart.Properties.Write("Sequence", part.Properties.Read("PBROWID"));

                    /* Check if multiple picks for same location and pick load carrier */
                    if ((prevLocation == part.Properties.ReadAsString("PPKEY")) &&
                        (prevContainer == part.Properties.ReadAsString("SEQNUM")) &&
                        (session.ReadAsInt("NOCARS") == 1))
                    {
                        /* Append PBROWID to make location unique to prevent terminal from merging the lines */
                        responsePart.Properties.Write("LocationId", string.Format("{0}|{1}|{2}", part.Properties.Read("PPKEY"), part.Properties.ReadAsString("ITEID"), part.Properties.Read("PBROWID")));
                    }
                    else
                    {
                        /*Append PAKID to make location unique for each pick package. Will prevent terminal from merging different pick packages*/
                        responsePart.Properties.Write("LocationId", string.Format("{0}|{1}|{2}", part.Properties.Read("PPKEY"), part.Properties.ReadAsString("ITEID"), part.Properties.Read("PAKID")));
                    }

                    responsePart.Properties.Write("Region", "0");

                    /* VOICEPICK013 = 'Go to area {0}' */
                    string preAisle = GetCachedAlarmText("VOICEPICK013", session);
                    preAisle = string.Format(preAisle, part.Properties.ReadAsString("WSNAME").PadRight(35, ' '));
                    responsePart.Properties.Write("PreAisleDirection", preAisle);

                    responsePart.Properties.Write("Aisle", part.Properties.ReadAsString("AISLE").PadRight(3, ' '));
                    responsePart.Properties.Write("PostAisleDirection", "");

                    string slot = part.Properties.ReadAsString("WPADR");

                    string itemLoadId = part.Properties.ReadAsString("ITEID");

                    if (!string.IsNullOrEmpty(itemLoadId))
                    {
                        if (itemLoadId.Length > session.ReadAsInt("VOICE_DIGITS_ITEID"))
                        {
                            itemLoadId = itemLoadId.Substring(itemLoadId.Length - session.ReadAsInt("VOICE_DIGITS_ITEID"), session.ReadAsInt("VOICE_DIGITS_ITEID"));
                        }
                    }

                    if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) ||
                        (((part.Properties.ReadAsString("ITEVERIFY") == "1") || (part.Properties.ReadAsString("ITETRACE") == "1")) &&
                         (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))))
                    {
                        /* No item load found */
                        slot += "," + GetCachedAlarmText("VOICEPICK010", session);
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "1")
                    {
                        /* Append verify item load id to slot */
                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK008", session), itemLoadId);
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "2")
                    {
                        /* Append verify lot to slot */
                        string lot = part.Properties.ReadAsString("PRODLOT");

                        if (!string.IsNullOrEmpty(lot))
                        {
                            if (lot.Length > session.ReadAsInt("VOICE_CHARS_PRODLOT"))
                            {
                                lot = lot.Substring(lot.Length - session.ReadAsInt("VOICE_CHARS_PRODLOT"), session.ReadAsInt("VOICE_CHARS_PRODLOT"));
                            }
                        }

                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK017", session), lot);
                    }
                    else if (!string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))
                    {
                        /* Append item load id to slot */
                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK009", session), itemLoadId);
                    }

                    responsePart.Properties.Write("Slot", slot.PadRight(64, ' '));

                    responsePart.Properties.Write("QuantityToPick", pickQty);
                    responsePart.Properties.Write("UnitOfMeasure", part.Properties.ReadAsString("PAKNAME").Replace('"', ' '));
                    responsePart.Properties.Write("ItemNumber", part.Properties.Read("ARTID"));
                    responsePart.Properties.Write("VariableWeight", part.Properties.Read("MEASURE"));

                    /* Convert weight tolerances from per LUM to per package */
                    double baseQty = part.Properties.ReadAsDouble("BASEQTY");

                    if (string.IsNullOrEmpty(part.Properties.ReadAsString("MEASQTYLOTOL")))
                    {
                        responsePart.Properties.Write("VariableWeightMinimum", "000000.0000");
                    }
                    else
                    {
                        double weightMinimum = part.Properties.ReadAsDouble("MEASQTYLOTOL") * baseQty;
                        responsePart.Properties.Write("VariableWeightMinimum", weightMinimum);
                    }

                    if (string.IsNullOrEmpty(part.Properties.ReadAsString("MEASQTYUPTOL")))
                    {
                        responsePart.Properties.Write("VariableWeightMaximum", "999999.0000");
                    }
                    else
                    {
                        double weightMaximum = part.Properties.ReadAsDouble("MEASQTYUPTOL") * baseQty;
                        responsePart.Properties.Write("VariableWeightMaximum", weightMaximum);
                    }

                    responsePart.Properties.Write("QuantityPicked", "".PadLeft(5, '0'));

                    #region Check digits, product verification id and item load id

                    string checkDigits = part.Properties.ReadAsString("PPCODE");

                    if (part.Properties.ReadAsString("ITEVERIFY") == "1")
                    {
                        /* Verify pick location by item load id */

                        string verifyItemLoadId = part.Properties.ReadAsString("ITEID");

                        if (!string.IsNullOrEmpty(verifyItemLoadId))
                        {
                            if (verifyItemLoadId.Length > session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"))
                            {
                                verifyItemLoadId = verifyItemLoadId.Substring(verifyItemLoadId.Length - session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"), session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"));
                            }
                        }

                        if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) ||
                            ((part.Properties.ReadAsString("ITEVERIFY") == "1") &&
                             (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", "00000");
                        }
                        else
                        {
                            responsePart.Properties.Write("CheckDigits", "0");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", verifyItemLoadId);
                        }
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "2")
                    {
                        /* Verify pick location by lot */

                        string verifyLot = part.Properties.ReadAsString("PRODLOT");

                        if (!string.IsNullOrEmpty(verifyLot))
                        {
                            if (verifyLot.Length > session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"))
                            {
                                verifyLot = verifyLot.Substring(verifyLot.Length - session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"), session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"));
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", "0");
                        responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("PRODLOT"));
                        responsePart.Properties.Write("SpokenProductId", verifyLot);
                    }
                    else if ((part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_ARTID) ||
                             (part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_EANDUN))
                    {
                        /* Verify pick location by ARTID or EANDUN */

                        if (!string.IsNullOrEmpty(checkDigits))
                        {
                            if (checkDigits.Length > session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"))
                            {
                                checkDigits = checkDigits.Substring(checkDigits.Length - session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"));
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", "0");

                        /* If the system hasn't found any item load dont verify anything */
                        if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) &&
                            (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID"))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                        }

                        responsePart.Properties.Write("ScanProductId", checkDigits);
                        responsePart.Properties.Write("SpokenProductId", checkDigits);
                    }
                    else
                    {
                        /* Verify pick location by pick location code */

                        if (!string.IsNullOrEmpty(checkDigits))
                        {
                            if (checkDigits.Length > session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"))
                            {
                                checkDigits = checkDigits.Substring(checkDigits.Length - session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"));
                            }

                            long temp;

                            if (!long.TryParse(checkDigits, out temp))
                            {
                                checkDigits = "";
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", checkDigits);
                        responsePart.Properties.Write("ScanProductId", "");
                        responsePart.Properties.Write("SpokenProductId", "");

                        /* If the system hasn't found any item load dont verify anything */
                        if (((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) || (part.Properties.ReadAsString("ITETRACE") == "1")) &&
                            (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID"))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", "00000");
                        }
                    }

                    #endregion

                    responsePart.Properties.Write("Description", part.Properties.ReadAsString("ARTNAME1").Replace('"', ' '));
                    responsePart.Properties.Write("Size", "");

                    if (part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_EANDUN)
                    {
                        responsePart.Properties.Write("UniversalProductCode", part.Properties.Read("PPCODE"));
                    }
                    else
                    {
                        responsePart.Properties.Write("UniversalProductCode", "");
                    }

                    responsePart.Properties.Write("WorkId", "1");
                    responsePart.Properties.Write("DeliveryLocation", "");
                    responsePart.Properties.Write("Dummy", "");
                    responsePart.Properties.Write("Store", "");
                    responsePart.Properties.Write("CaseLabelCheckDigit", "");

                    responsePart.Properties.Write("TargetContainer", part.Properties.ReadAsString("SEQNUM").PadLeft(session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"), '0'));

                    if (part.Properties.ReadAsString("SERIAL") == "1")
                    {
                        responsePart.Properties.Write("CaptureLot", "1");
                        responsePart.Properties.Write("LotText", GetCachedAlarmText("VOICEPICK006", session));
                    }
                    else if ((part.Properties.ReadAsString("PRODLOT_VER") == "1") &&
                             (string.IsNullOrEmpty(part.Properties.ReadAsString("PRODLOTREQ"))))
                    {
                        responsePart.Properties.Write("CaptureLot", "1");
                        responsePart.Properties.Write("LotText", GetCachedAlarmText("VOICEPICK004", session));
                    }
                    else
                    {
                        responsePart.Properties.Write("CaptureLot", "0");
                        responsePart.Properties.Write("LotText", "");
                    }

                    responsePart.Properties.Write("PickMessage", part.Properties.ReadAsString("INSTRUCTIONS"));

                    string verifyLocation = "0";

                    if (session.ReadAsString("VOICE_VERIFY_PP_BALANCE") == "1")
                    {
                        verifyLocation = "1";
                    }
                    else if ((session.ReadAsString("VOICE_VERIFY_PP_BALANCE") == "2") &&
                             (status == "G"))
                    {
                        verifyLocation = "1";
                    }

                    responsePart.Properties.Write("VerifyLocation", verifyLocation);

                    responsePart.Properties.Write("CycleCount", "0");
                    responsePart.Properties.Write("CustomerId", PrTaskLUTContainer.GetCotainerHashCode(part));

                    if (part.Properties.ReadAsString("SERIAL") == "1")
                    {
                        responsePart.Properties.Write("PutLotPrompt", GetCachedAlarmText("VOICEPICK005", session));
                    }
                    else if (part.Properties.ReadAsString("PRODLOT_VER") == "1")
                    {
                        responsePart.Properties.Write("PutLotPrompt", GetCachedAlarmText("VOICEPICK003", session));
                    }
                    else
                    {
                        responsePart.Properties.Write("PutLotPrompt", "");
                    }

                    responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                    responsePart.Properties.Write("Message", "");

                    responseMsg.Parts.Add(responsePart);

                    prevLocation  = part.Properties.ReadAsString("PPKEY");
                    prevContainer = part.Properties.ReadAsString("SEQNUM");
                }

                //Reset session values
                session.Write("PBROW_COUNT", rowCount);
                session.Write("SPLIT_PBROWID", "");
                session.Write("SPLIT_STATUS", "0");
                session.Write("PREV_PPKEY", "");
                session.Write("RESTCOD", "");
                session.Write("PRODLOT", "");
                session.Write("PRODLOTQTY", 0d);
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(35);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(35);
                part.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                part.Properties.Write("Message", GetCriticalErrorMessageText(msg));
                responseMsg.Parts.Add(part);

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("RegionNumber", 0);
            responseMsg.Properties.Write("Description", "");
            responseMsg.Properties.Write("AutoAssign", 1);
            responseMsg.Properties.Write("NumberAssignmentsAllowed", 1);
            responseMsg.Properties.Write("SkipAisleAllowed", 0);
            responseMsg.Properties.Write("SkipSlotAllowed", 0);
            responseMsg.Properties.Write("RepickSkips", 0);
            responseMsg.Properties.Write("CpSpeakWorkIdentifier", 0);
            responseMsg.Properties.Write("PrintLabels", 0);
            responseMsg.Properties.Write("PrintChaseLabels", 0);
            responseMsg.Properties.Write("SpeakSlotDescription", 0);
            responseMsg.Properties.Write("PickPrompt", 2);
            responseMsg.Properties.Write("SpeakWorkId", 0);
            responseMsg.Properties.Write("SignOffAllowed", 0);
            responseMsg.Properties.Write("ContainerType", 1);
            responseMsg.Properties.Write("DeliverContainerAtClose", 0);
            responseMsg.Properties.Write("PassAssignment", 0);
            responseMsg.Properties.Write("Delivery", 1);
            responseMsg.Properties.Write("QuantityVerification", 1);
            responseMsg.Properties.Write("WorkIdLength", 0);
            responseMsg.Properties.Write("GoBackForShorts", 0);
            responseMsg.Properties.Write("AllowReversePicking", 0);
            responseMsg.Properties.Write("UseLut", 2);
            responseMsg.Properties.Write("CurrentPreAisle", "".PadRight(string.Format(GetCachedAlarmText("VOICEPICK013", session), "").Length + 35, 'X'));
            responseMsg.Properties.Write("CurrentAisle", "".PadRight(3, 'X'));
            responseMsg.Properties.Write("CurrentPostAisle", "");
            responseMsg.Properties.Write("CurrentSlot", "".PadRight(64, 'X'));
            responseMsg.Properties.Write("PrintMultipleLabels", 0);
            responseMsg.Properties.Write("PromptOperatorForContainerId", 0);
            responseMsg.Properties.Write("AllowMultipleOpenContainersPerWorkId", 1);
            responseMsg.Properties.Write("SpokenContainerValidationLength", 1);
            responseMsg.Properties.Write("StopLineNumber", 0);
            responseMsg.Properties.Write("AllowAlternateDelivery", 0);
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pz", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                whMsg.Properties.Write("PZID_I", session.ReadAsString("PZID"));
                whMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                whMsg.Properties.Write("PZ_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

                CorrelationContext context;

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                PropertyCollection properties = context.ResponseMessages[0].Parts[0].Properties;

                responseMsg.Properties.Write("RegionNumber", msg.Properties.Read("RegionNumber"));
                responseMsg.Properties.Write("Description", properties.Read("PZNAME"));
                responseMsg.Properties.Write("SkipAisleAllowed", properties.Read("VOICE_ALLOW_SKIP_AISLE"));
                responseMsg.Properties.Write("SkipSlotAllowed", properties.Read("VOICE_ALLOW_SKIP_PP"));
                responseMsg.Properties.Write("RepickSkips", properties.Read("VOICE_ALLOW_REPICK_PP"));
                responseMsg.Properties.Write("QuantityVerification", properties.Read("VOICE_VERIFY_QTY"));
                responseMsg.Properties.Write("GoBackForShorts", properties.Read("VOICE_REPICK_SHORTED_PBROW"));
                responseMsg.Properties.Write("SpokenContainerValidationLength", properties.Read("VOICE_MIN_DIGITS_CARCODE"));

                #region Print Label Config

                PrintLabelConfig labelConfig = PrintLabelConfig.Never;

                string CPL_PRINTCOD  = properties.ReadAsString("CPL_PRINTCOD");
                string PLCP_PRINTCOD = properties.ReadAsString("PLCP_PRINTCOD");

                if ((CPL_PRINTCOD == "AP") || (PLCP_PRINTCOD == "AP"))
                {
                    labelConfig = PrintLabelConfig.AfterPick;
                }

                if ((CPL_PRINTCOD == "BP") || (PLCP_PRINTCOD == "BP"))
                {
                    if (labelConfig == PrintLabelConfig.AfterPick)
                    {
                        labelConfig = PrintLabelConfig.BeforeAndAfterPick;
                    }
                    else
                    {
                        labelConfig = PrintLabelConfig.BeforePick;
                    }
                }

                responseMsg.Properties.Write("PrintLabels", (int)labelConfig);

                #endregion

                if (string.IsNullOrEmpty(properties.ReadAsString("NO_OF_PBROWS")))
                {
                    responseMsg.Properties.Write("StopLineNumber", 0);
                }
                else
                {
                    responseMsg.Properties.Write("StopLineNumber", properties.Read("NO_OF_PBROWS"));
                }

                responseMsg.Properties.Write("AllowAlternateDelivery", properties.Read("ALLOW_CHANGE_ON_DROPWPADR"));
                responseMsg.Properties.Write("PickPrompt", properties.Read("VOICE_PICK_PROMPT"));
                responseMsg.Properties.Write("Delivery", properties.Read("VERIFY_DROPWPADR"));

                session.Write("VOICE_VERIFY_PP_BALANCE", properties.Read("VOICE_VERIFY_PP_BALANCE"));
                session.Write("VERIFY_DROPWPADR", properties.Read("VERIFY_DROPWPADR"));
                session.Write("VOICE_MIN_DIGITS_PPCODE", properties.Read("VOICE_MIN_DIGITS_PPCODE"));
                session.Write("VOICE_MIN_DIGITS_CARCODE", properties.Read("VOICE_MIN_DIGITS_CARCODE"));
                session.Write("VOICE_DIGITS_ITEID", properties.Read("VOICE_DIGITS_ITEID"));
                session.Write("VOICE_MIN_DIGITS_ITEVERIFY", properties.Read("VOICE_MIN_DIGITS_ITEVERIFY"));
                session.Write("VOICE_CHARS_PRODLOT", properties.Read("VOICE_CHARS_PRODLOT"));
                session.Write("VOICE_MIN_CHARS_PRODLOTVERIFY", properties.Read("VOICE_MIN_CHARS_PRODLOTVERIFY"));
                session.Write("ITESWAP", properties.Read("ITESWAP"));
                session.Write("CPL_PRINTCOD", properties.ReadAsString("CPL_PRINTCOD"));
                session.Write("PLCP_PRINTCOD", properties.ReadAsString("PLCP_PRINTCOD"));
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                /* Check if production lots should be registered */
                if ((msg.Properties.ReadAsString("PickedStatus") == "1") && (session.ProductionLots.Count > 0))
                {
                    double pickedQty = msg.Properties.ReadAsDouble("QuantityPicked");

                    foreach (ProductionLot lot in session.ProductionLots)
                    {
                        session.Write("PRODLOT", lot.LotId);
                        session.Write("PRODLOTQTY", lot.Quantity);

                        msg.Properties.Write("QuantityPicked", pickedQty);

                        /* Register production lot and acknowledge the line */
                        ProcessPickedMessage(msg, session);

                        /* Decrease picked quantity with registered lot qty */
                        pickedQty -= lot.Quantity;
                    }

                    session.ProductionLots.Clear();
                }
                else
                {
                    ProcessPickedMessage(msg, session);
                }
            }
            catch (WarehouseAdapterException ex)
            {
                if (ex.AlarmId == "PBROW038")
                {
                    responseMsg.Properties.Write("ErrorCode", ErrorEnterDiscrepancyCode);
                    responseMsg.Properties.Write("Message", ex.Message);
                }
                else if ((ex.AlarmId == "PBCAR012") ||
                         (ex.AlarmId == "PBCAR048") ||
                         (ex.AlarmId == "PBROW011") ||
                         (ex.AlarmId == "PBROW013"))
                {
                    responseMsg.Properties.Write("ErrorCode", ErrorSplitExchangeNotAllowed);
                    responseMsg.Properties.Write("Message", ex.Message);
                }
                else if (ex.AlarmId == "VOICEPICK011")
                {
                    /* Error meassage plus re-enter quantity */
                    responseMsg.Properties.Write("ErrorCode", ErrorEnterQuantity);
                    responseMsg.Properties.Write("Message", ex.Message + "," + GetCachedAlarmText("VOICEPICK007", session));
                }
                else
                {
                    responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                    responseMsg.Properties.Write("Message", ex.Message);

                    throw;
                }
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    CorrelationContext context;

                    if (!string.IsNullOrEmpty(msg.Properties.ReadAsString("RegionNumber")))
                    {
                        //Check if region is a pick zone or a pick zone group
                        MultiPartMessage pzMsg = CreateRequestMessage("wlvoicepick", "select_zone_or_group", session);
                        pzMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                        pzMsg.Properties.Write("PZID_I", msg.Properties.ReadAsString("RegionNumber"));
                        pzMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                        pzMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                        pzMsg.Properties.Write("TYPE_O", "");
                        pzMsg.Properties.Write("ALMID_O", "");

                        MessageEngine.Instance.TransmitRequestMessage(pzMsg, pzMsg.MessageId, out context);

                        if (context.ResponseMessages[0].Properties.ReadAsString("TYPE_O") == "PZ")
                        {
                            session.Write("PZID", msg.Properties.ReadAsString("RegionNumber"));
                            session.Write("PZGRPID", "");
                        }
                        else
                        {
                            session.Write("PZID", "");
                            session.Write("PZGRPID", msg.Properties.ReadAsString("RegionNumber"));
                        }
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_restcod", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("NLANGCOD_I", session.ReadAsString("NLANGCOD"));
                    whMsg.Properties.Write("RESTCOD_Cur_O", new object());
                    whMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                    whMsg.Properties.Write("PZID_I", session.ReadAsString("PZID"));

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    foreach (MessagePart part in context.ResponseMessages[0].Parts)
                    {
                        int temp;

                        /* Code must be numeric in order to be valid */
                        if (!int.TryParse(part.Properties.ReadAsString("OLACOD"), out temp))
                        {
                            continue;
                        }

                        MessagePart responsePart = new VocollectMessagePart();

                        responsePart.Properties.Write("DiscrepancyCode", part.Properties.Read("OLACOD"));
                        responsePart.Properties.Write("DiscrepancyCodeDescription", part.Properties.Read("RESTCODTXT"));

                        if (part.Properties.ReadAsString("AQTYDISC") == AqtyDiscPositive)
                        {
                            responsePart.Properties.Write("AllowOverpick", 1);
                        }
                        else if (part.Properties.ReadAsString("AQTYDISC") == AqtyDiscNegative)
                        {
                            responsePart.Properties.Write("AllowOverpick", 0);
                        }
                        else
                        {
                            continue;
                        }

                        responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                        responsePart.Properties.Write("Message", "");

                        responseMsg.Parts.Add(responsePart);
                    }

                    if (string.IsNullOrEmpty(session.ReadAsString("PBHEADID")))
                    {
                        try
                        {
                            PrTaskLUTGetAssignment.RequestPickOrder(PickOrderHoldType.Definitely, session);

                            if (responseMsg.Parts.Count == 0)
                            {
                                MessagePart part = CreateEmptyMessagePart(5);
                                responseMsg.Parts.Add(part);
                            }

                            responseMsg.Parts[0].Properties.Write("ErrorCode", ErrorDefinitelyStoppedPickOrderFound);
                        }
                        catch (WarehouseAdapterException ex)
                        {
                            if (ex.AlarmId != "PBHEAD030" && ex.AlarmId != "PBHEAD057")
                            {
                                throw;
                            }
                        }
                    }

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(5);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(5);
                part.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                part.Properties.Write("Message", GetCriticalErrorMessageText(msg));
                responseMsg.Parts.Add(part);

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
Exemple #17
0
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage          responseMsg    = CreateResponseMessage(msg);
            WarehouseAdapterException printException = null;

            try
            {
                CorrelationContext context;

                MultiPartMessage whMsg;

                switch (msg.Properties.ReadAsInt("Operation"))
                {
                case 0:
                    break;

                case 4:
                    break;

                case 2:
                    //Operatoion = Create new container

                    whMsg = CreateRequestMessage("wlvoicepick", "new_loadcarrier", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                    whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("TargetContainer")));
                    whMsg.Properties.Write("SEQNUM_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    try
                    {
                        /* Automatically print label on default printer */
                        if ((session.ReadAsString("CPL_PRINTCOD") == "BP") || (session.ReadAsString("PLCP_PRINTCOD") == "BP"))
                        {
                            PrTaskLUTPrint.Print(null, context.ResponseMessages[0].Properties.ReadAsString("SEQNUM_O"), session);
                        }
                    }
                    catch (WarehouseAdapterException ex)
                    {
                        printException = ex;
                    }

                    break;
                }

                whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbcar", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                whMsg.Properties.Write("PBCAR_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

                MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                if ((msg.Properties.ReadAsString("Operation") == "4") || (msg.Properties.ReadAsString("Operation") == "2"))
                {
                    /* Send container list in reverse order when dropping or when a new container has been created */
                    for (int i = context.ResponseMessages[0].Parts.Count - 1; i >= 0; i--)
                    {
                        /* Do not send empty load carriers when dropping */
                        if ((context.ResponseMessages[0].Parts[i].Properties.ReadAsDouble("PIKNOPAKS") > 0) ||
                            (msg.Properties.ReadAsString("Operation") == "2") ||
                            (session.ReadAsString("UPDATE_PBCAR") == "1"))
                        {
                            responseMsg.Parts.Add(CreateResponsePart(context.ResponseMessages[0].Parts[i], session));
                        }
                    }
                }
                else
                {
                    /* Send container list in default order */
                    for (int i = 0; i < context.ResponseMessages[0].Parts.Count; i++)
                    {
                        responseMsg.Parts.Add(CreateResponsePart(context.ResponseMessages[0].Parts[i], session));
                    }
                }

                if (printException != null)
                {
                    if (responseMsg.Parts.Count > 0)
                    {
                        /* Report print error as information, user may continue */
                        responseMsg.Parts[responseMsg.Parts.Count - 1].Properties.Write("ErrorCode", VocollectErrorCodeInformationalError);
                        responseMsg.Parts[responseMsg.Parts.Count - 1].Properties.Write("Message", printException.Message);
                    }
                }

                session.Write("NOCARS", context.ResponseMessages[0].Parts.Count);
                session.Write("UPDATE_PBCAR", "0");
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(13);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(13);
                part.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                part.Properties.Write("Message", GetCriticalErrorMessageText(msg));
                responseMsg.Parts.Add(part);

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Requests a pick order from the WMS.
        /// </summary>
        /// <param name="holdType">The desired hold type of the pick order.</param>
        /// <param name="session">The current session.</param>
        /// <returns></returns>
        public static CorrelationContext RequestPickOrder(PickOrderHoldType holdType, VocollectSession session)
        {
            MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbhead", session);

            whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
            whMsg.Properties.Write("TUID_I", session.ReadAsString("TUID"));
            whMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));

            if (holdType == PickOrderHoldType.Temporarily)
            {
                whMsg.Properties.Write("PZID_I", "");
                whMsg.Properties.Write("PZGRPID_I", "");
            }
            else
            {
                whMsg.Properties.Write("PZID_I", session.ReadAsString("PZID"));
                whMsg.Properties.Write("PZGRPID_I", session.ReadAsString("PZGRPID"));
            }

            whMsg.Properties.Write("NLANGCOD_I", session.ReadAsString("NLANGCOD"));
            whMsg.Properties.Write("PBHEAD_Cur_O", new object());
            whMsg.Properties.Write("HOLD_TYPE_O", "");
            whMsg.Properties.Write("LOCATION_O", "");
            whMsg.Properties.Write("ALMID_O", "");

            if (holdType == PickOrderHoldType.Definitely)
            {
                whMsg.Properties.Write("DEF_ON_HOLD_I", "1");
            }
            else
            {
                whMsg.Properties.Write("DEF_ON_HOLD_I", "0");
            }

            CorrelationContext context;

            MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

            //Get properties from cursor
            PropertyCollection properties = context.ResponseMessages[0].Parts[0].Properties;

            if ((!string.IsNullOrEmpty(context.ResponseMessages[0].Properties.ReadAsString("HOLD_TYPE_O"))) &&
                (!string.IsNullOrEmpty(properties.ReadAsString("TUID"))))
            {
                VerifyAndConnectPickTruck(session, properties.ReadAsString("PBHEADID"), session.ReadAsString("TUID"), properties.ReadAsString("TUID"));
            }

            //Write data to session
            session.Write("PBHEADID", properties.ReadAsString("PBHEADID"));
            session.Write("PZID", properties.ReadAsString("PZID"));
            session.Write("HOLD_TYPE", context.ResponseMessages[0].Properties.ReadAsString("HOLD_TYPE_O"));
            session.Write("CARCODE_TYPE", properties.ReadAsString("CARCODE_TYPE"));
            session.Write("PBROWID", "");
            session.Write("DROPSEQNUM", "");
            session.Write("DROPWSID", "");
            session.Write("DROPWPADR", "");
            session.Write("UPDATE_PBCAR", "0");
            session.Write("NOCARS", properties.ReadAsInt("NOCARS"));
            session.Write("PRINTED", "0");
            session.Write("PRINTERNUMBER", "");
            session.CurrentAssignmentData = properties;

            TimeSpan pickTime = new TimeSpan(0, 0,
                                             Convert.ToInt32(properties.ReadAsInt("ESTPICKTME")
                                                             + properties.ReadAsInt("ESTMOVTIMEPICK")
                                                             + properties.ReadAsInt("ESTDRVTME")
                                                             + properties.ReadAsInt("ESTPACKTME")));

            session.Write("PICKTIME", pickTime);
            session.Write("LPDTM_SHIPWS", properties.Read("LPDTM_SHIPWS"));

            return(context);
        }