/// <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("AssignmentId", 0);
            responseMsg.Properties.Write("IsChase", 0);
            responseMsg.Properties.Write("WorkId", "1");
            responseMsg.Properties.Write("Position", "1");
            responseMsg.Properties.Write("TotalItems", 0);
            responseMsg.Properties.Write("ItemsNotPicked", 0);
            responseMsg.Properties.Write("BaseItemsNotPicked", 0);
            responseMsg.Properties.Write("Cube", 0);
            responseMsg.Properties.Write("GoalTime", 0);
            responseMsg.Properties.Write("Route", "");
            responseMsg.Properties.Write("ActiveContainer", "00");
            responseMsg.Properties.Write("PassAssignment", "0");
            responseMsg.Properties.Write("PreviousWork", "0");
            responseMsg.Properties.Write("PickLines", 0);
            responseMsg.Properties.Write("PickedLines", 0);
            responseMsg.Properties.Write("CustomerNumber", "");
            responseMsg.Properties.Write("PreviousWorkVehicle", "");
            responseMsg.Properties.Write("AllowPackaging", "1");
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    PropertyCollection properties = null;

                    /* Check if pick order is already fetched */
                    if (session.ReadAsString("PBHEADID").Length == 0)
                    {
                        CorrelationContext context = RequestPickOrder(PickOrderHoldType.None, session);
                        properties = context.ResponseMessages[0].Parts[0].Properties;
                    }
                    else /* Use data from session */
                    {
                        properties = session.CurrentAssignmentData;
                    }


                    responseMsg.Properties.Write("AssignmentId", session.ReadAsString("PBHEADID"));
                    responseMsg.Properties.Write("TotalItems", 0);
                    responseMsg.Properties.Write("ItemsNotPicked", properties.ReadAsDouble("TOTQTY") - properties.ReadAsDouble("PIKQTY"));

                    responseMsg.Properties.Write("GoalTime", ((TimeSpan)session.Read("PICKTIME")).Minutes);

                    if (string.IsNullOrEmpty(session.ReadAsString("HOLD_TYPE")))
                    {
                        responseMsg.Properties.Write("PreviousWork", 0);
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(properties.ReadAsString("TUID")))
                        {
                            responseMsg.Properties.Write("PreviousWork", 1);
                        }
                        else
                        {
                            responseMsg.Properties.Write("PreviousWork", 2);
                        }
                    }

                    responseMsg.Properties.Write("PickLines", properties.Read("NOROWS"));
                    responseMsg.Properties.Write("PickedLines", properties.Read("NOPIKROW"));


                    //responseMsg.Properties.Write("AllowPackaging", properties.Read("CONFIRM_PM"));
                    responseMsg.Properties.Write("PreviousWorkVehicle", properties.Read("TUID"));

                    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);
            }
        }