/// <summary>
            /// Activates the device.
            /// </summary>
            /// <param name="request">The device activation request.</param>
            /// <returns>The device activation response.</returns>
            private static ActivateDeviceRealtimeResponse ActivateDevice(ActivateDeviceRealtimeRequest request)
            {
                var    getDeviceRequest = new GetDeviceDataRequest(request.DeviceNumber, isActivatedOnly: false);
                Device device           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity;

                device.ActivatedDateTime   = device.ActivatedDateTime ?? DateTimeOffset.UtcNow;
                device.DeactivateComments  = device.DeactivateComments ?? string.Empty;
                device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue;
                device.TokenIssueTime      = device.TokenIssueTime ?? DateTimeOffset.UtcNow;

                var result = new DeviceActivationResult();

                if (device == null)
                {
                    // Device is not found, throws exception.
                    string message = string.Format("The input device number '{0}' does not exist in demo database.", request.DeviceNumber);
                    throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message);
                }
                else if (string.IsNullOrWhiteSpace(device.TerminalId))
                {
                    // If device is found but the terminal associated with the device is not found, try to find the terminal using input terminal id.
                    var      columnSet          = new ColumnSet(Terminal.RecordIdColumn, Terminal.TerminalIdColumn, Terminal.ChannelIdColumn);
                    var      settings           = new QueryResultSettings(columnSet, PagingInfo.AllRecords);
                    var      getTerminalRequest = new GetTerminalDataRequest(request.TerminalId, settings);
                    Terminal terminal           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Terminal> >(getTerminalRequest, request.RequestContext).Entity;

                    if (terminal == null)
                    {
                        string message = string.Format("The input device number '{0}' and terminal identifier '{1}' do not exist in demo database.", request.DeviceNumber, request.TerminalId);
                        throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message);
                    }

                    result.Device = new Device
                    {
                        DeviceId            = request.DeviceId,
                        DeviceNumber        = request.DeviceNumber,
                        TerminalRecordId    = terminal.RecordId,
                        TerminalId          = terminal.TerminalId,
                        ChannelId           = terminal.ChannelId,
                        DeviceTypeRecordId  = device.DeviceTypeRecordId,
                        ActivatedDateTime   = device.ActivatedDateTime,
                        TokenIssueTime      = device.TokenIssueTime,
                        DeactivatedDateTime = device.DeactivatedDateTime,
                        DeactivateComments  = device.DeactivateComments,
                        TokenData           = device.TokenData,
                        TokenSalt           = device.TokenSalt
                    };
                }
                else
                {
                    // Both the device and associated terminal are found.
                    device.DeviceNumber = request.DeviceNumber;
                    device.DeviceId     = request.DeviceId;
                    result.Device       = device;
                }

                var response = new ActivateDeviceRealtimeResponse(result);

                return(response);
            }
Example #2
0
            /// <summary>
            /// Gets terminal entity by record identifier or terminal identifier.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <Terminal> GetTerminalByCriteria(GetTerminalDataRequest request)
            {
                TerminalDataManager terminalDataManager = this.GetDataManagerInstance(request.RequestContext);

                Terminal terminal = null;

                if (string.IsNullOrWhiteSpace(request.TerminalId))
                {
                    // Retrieves the terminal by record identifier
                    terminal = terminalDataManager.GetTerminalByRecordId(request.TerminalRecordId, request.QueryResultSettings);
                }
                else
                {
                    terminal = this.GetTerminalById(request.RequestContext, request.TerminalId, request.QueryResultSettings);
                }

                return(new SingleEntityDataServiceResponse <Terminal>(terminal));
            }
            /// <summary>
            /// Gets the terminal by identifier and sets it on the context.
            /// </summary>
            /// <param name="context">The context.</param>
            private static void PopulateContextWithTerminal(RequestContext context)
            {
                long terminalId = context.GetPrincipal().TerminalId;

                GetTerminalDataRequest getTerminalDataRequest = new GetTerminalDataRequest(terminalId, QueryResultSettings.AllRecords);
                Terminal terminal = context.Runtime.Execute <SingleEntityDataServiceResponse <Terminal> >(getTerminalDataRequest, context, skipRequestTriggers: true).Entity;

                if (terminal == null)
                {
                    RetailLogger.Instance.CrtWorkflowPipelineRequestHandlerPopulateTerminalOnContextTerminalNotFound(terminalId);
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_TerminalNotFound, "Could not find the terminal associated with the request context.");
                }

                if (terminal.ChannelId != context.GetPrincipal().ChannelId)
                {
                    RetailLogger.Instance.CrtWorkflowPipelineRequestHandlerPopulateTerminalOnContextChannelMismatch(terminalId, terminal.ChannelId, context.GetPrincipal().ChannelId);
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_TerminalNotFound, "The provided terminal record identifier does not belong to the channel associated to the principal.");
                }

                context.SetTerminal(terminal);
            }